Library of Assembled Shared Sources
callback_python.cpp
Go to the documentation of this file.
1/** @file
2* @author Bram de Greve (bram@cocamware.com)
3* @author Tom De Muer (tom@cocamware.com)
4*
5* *** BEGIN LICENSE INFORMATION ***
6*
7* The contents of this file are subject to the Common Public Attribution License
8* Version 1.0 (the "License"); you may not use this file except in compliance with
9* the License. You may obtain a copy of the License at
10* http://lass.sourceforge.net/cpal-license. The License is based on the
11* Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover
12* use of software over a computer network and provide for limited attribution for
13* the Original Developer. In addition, Exhibit A has been modified to be consistent
14* with Exhibit B.
15*
16* Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
17* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
18* language governing rights and limitations under the License.
19*
20* The Original Code is LASS - Library of Assembled Shared Sources.
21*
22* The Initial Developer of the Original Code is Bram de Greve and Tom De Muer.
23* The Original Developer is the Initial Developer.
24*
25* All portions of the code written by the Initial Developer are:
26* Copyright (C) 2025 the Initial Developer.
27* All Rights Reserved.
28*
29* Contributor(s):
30*
31* Alternatively, the contents of this file may be used under the terms of the
32* GNU General Public License Version 2 or later (the GPL), in which case the
33* provisions of GPL are applicable instead of those above. If you wish to allow use
34* of your version of this file only under the terms of the GPL and not to allow
35* others to use your version of this file under the CPAL, indicate your decision by
36* deleting the provisions above and replace them with the notice and other
37* provisions required by the GPL License. If you do not delete the provisions above,
38* a recipient may use your version of this file under either the CPAL or the GPL.
39*
40* *** END LICENSE INFORMATION ***
41*/
42
43#include "python_common.h"
44#include "callback_python.h"
45#include "pyobject_macros.h"
46#include "_lass_module.h"
47
48namespace lass::python::impl
49{
50
51PY_DECLARE_CLASS(PyCallback)
52LASS_EXECUTE_BEFORE_MAIN_EX(Function_executeBeforeMain,
53 PyCallback::_lassPyClassDef.setSlot(Py_tp_call, &PyCallback::_tp_call);
54)
55
56PyCallback::PyCallback(TPimpl pimpl)
57{
58 impl::initLassModule();
59 impl::fixObjectType(this);
60 pimpl_ = std::move(pimpl);
61}
62
63PyObject* PyCallback::_tp_call(PyObject* self, PyObject* args, PyObject* kwargs)
64{
65 if (!PyType_IsSubtype(self->ob_type, PyCallback::_lassPyClassDef.type()))
66 {
67 PyErr_SetString(PyExc_TypeError, "Not a _lass.PyCallback");
68 return 0;
69 }
70 if (kwargs)
71 {
72 if (!PyDict_CheckExact(kwargs))
73 {
74 PyErr_BadInternalCall();
75 return 0;
76 }
77 if (PyDict_Size(kwargs) != 0)
78 {
79 PyErr_SetString(PyExc_TypeError, "function takes no keyword arguments");
80 return 0;
81 }
82 }
83 return static_cast<PyCallback*>(self)->pimpl_->call(args);
84}
85
86}
#define PY_DECLARE_CLASS(i_cppClass)
Declare a Python class with automatic name and no documentation.