Callback: Add callback interfaces for python.
[gemrb.git] / gemrb / plugins / GUIScript / PythonHelpers.cpp
blob9da1e5b1686b6f092e8fd8f2c167aefbbd14a564
1 /* GemRB - Infinity Engine Emulator
2 * Copyright (C) 2003 The GemRB Project
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21 #include "PythonHelpers.h"
23 StringCallback::StringCallback(const char *str)
24 : Name(PyString_FromString(const_cast<char*>(str)))
28 StringCallback::StringCallback(PyObject *Name)
29 : Name(Name)
31 Py_INCREF(Name);
34 StringCallback::~StringCallback()
36 Py_DECREF(Name);
39 bool StringCallback::call()
41 if (!Name || !Py_IsInitialized()) {
42 return false;
44 /* Borrowed reference */
45 PyObject *Function = PyDict_GetItem(gs->pDict, Name);
46 if (!Function || !PyCallable_Check(Function)) {
47 printMessage("GUIScript", "Missing function:", LIGHT_RED);
48 printf("%s\n", PyString_AsString(Name));
49 return false;
51 PyObject *ret = PyObject_CallObject(Function, NULL);
52 if (ret == NULL) {
53 if (PyErr_Occurred()) {
54 PyErr_Print();
56 return false;
58 Py_DECREF(ret);
59 return true;
62 PythonCallback::PythonCallback(PyObject *Function)
63 : Function(Function)
65 if (Function && PyCallable_Check(Function)) {
66 Py_INCREF(Function);
67 } else {
68 Function = NULL;
72 PythonCallback::~PythonCallback()
74 if (Py_IsInitialized()) {
75 Py_DECREF(Function);
79 bool PythonCallback::call ()
81 if (!Function || !Py_IsInitialized()) {
82 return false;
84 PyObject *ret = PyObject_CallObject(Function, NULL);
85 if (ret == NULL) {
86 if (PyErr_Occurred()) {
87 PyErr_Print();
89 return false;
91 Py_DECREF(ret);
92 return true;