Trying to keep things compiling on my imac (10.4.11)
[blender.git] / source / gameengine / Expressions / PyObjectPlus.cpp
1 /**
2  * $Id$
3  * ***** BEGIN GPL LICENSE BLOCK *****
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software Foundation,
17  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18  *
19  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
20  * All rights reserved.
21  *
22  * The Original Code is: all of this file.
23  *
24  * Contributor(s): none yet.
25  *
26  * ***** END GPL LICENSE BLOCK *****
27  */
28
29 #ifdef HAVE_CONFIG_H
30 #include <config.h>
31 #endif
32
33 #ifndef NO_EXP_PYTHON_EMBEDDING
34
35 /*------------------------------
36  * PyObjectPlus cpp
37  *
38  * C++ library routines for Crawl 3.2
39  *
40  * Derived from work by
41  * David Redish
42  * graduate student
43  * Computer Science Department 
44  * Carnegie Mellon University (CMU)
45  * Center for the Neural Basis of Cognition (CNBC) 
46  * http://www.python.org/doc/PyCPP.html
47  *
48 ------------------------------*/
49 #include <MT_assert.h>
50 #include "stdlib.h"
51 #include "PyObjectPlus.h"
52 #include "STR_String.h"
53 #include "gen_utils.h"
54 /*------------------------------
55  * PyObjectPlus Type            -- Every class, even the abstract one should have a Type
56 ------------------------------*/
57
58 PyTypeObject PyObjectPlus::Type = {
59         PyObject_HEAD_INIT(&PyType_Type)
60         0,                              /*ob_size*/
61         "PyObjectPlus",                 /*tp_name*/
62         sizeof(PyObjectPlus),           /*tp_basicsize*/
63         0,                              /*tp_itemsize*/
64         /* methods */
65         PyDestructor,                   /*tp_dealloc*/
66         0,                              /*tp_print*/
67         __getattr,                      /*tp_getattr*/
68         __setattr,                      /*tp_setattr*/
69         0,                              /*tp_compare*/
70         __repr,                         /*tp_repr*/
71         0,                              /*tp_as_number*/
72         0,                              /*tp_as_sequence*/
73         0,                              /*tp_as_mapping*/
74         0,                              /*tp_hash*/
75         0,                              /*tp_call */
76 };
77
78 PyObjectPlus::~PyObjectPlus()
79 {
80         if (ob_refcnt)
81         {
82                 _Py_ForgetReference(this);
83         }
84 //      assert(ob_refcnt==0);
85 }
86
87 PyObjectPlus::PyObjectPlus(PyTypeObject *T)                             // constructor
88 {
89         MT_assert(T != NULL);
90         this->ob_type = T; 
91         _Py_NewReference(this);
92 };
93   
94 /*------------------------------
95  * PyObjectPlus Methods         -- Every class, even the abstract one should have a Methods
96 ------------------------------*/
97 PyMethodDef PyObjectPlus::Methods[] = {
98   {"isA",                (PyCFunction) sPy_isA,                 METH_VARARGS},
99   {NULL, NULL}          /* Sentinel */
100 };
101
102 /*------------------------------
103  * PyObjectPlus Parents         -- Every class, even the abstract one should have parents
104 ------------------------------*/
105 PyParentObject PyObjectPlus::Parents[] = {&PyObjectPlus::Type, NULL};
106
107 /*------------------------------
108  * PyObjectPlus attributes      -- attributes
109 ------------------------------*/
110 PyObject *PyObjectPlus::_getattr(const STR_String& attr)
111 {
112         if (attr == "__doc__" && GetType()->tp_doc)
113                 return PyString_FromString(GetType()->tp_doc);
114
115   //if (streq(attr, "type"))
116   //  return Py_BuildValue("s", (*(GetParents()))->tp_name);
117
118   return Py_FindMethod(Methods, this, const_cast<char *>(attr.ReadPtr()));
119 }
120
121 int PyObjectPlus::_delattr(const STR_String& attr)
122 {
123         PyErr_SetString(PyExc_AttributeError, "attribute cant be deleted");
124         return 1;
125 }
126
127 int PyObjectPlus::_setattr(const STR_String& attr, PyObject *value)
128 {
129         //return PyObject::_setattr(attr,value);
130         //cerr << "Unknown attribute" << endl;
131         PyErr_SetString(PyExc_AttributeError, "attribute cant be set");
132         return 1;
133 }
134
135 /*------------------------------
136  * PyObjectPlus repr            -- representations
137 ------------------------------*/
138 PyObject *PyObjectPlus::_repr(void)
139 {
140         PyErr_SetString(PyExc_SystemError, "Representation not overridden by object.");  
141         return NULL;
142 }
143
144 /*------------------------------
145  * PyObjectPlus isA             -- the isA functions
146 ------------------------------*/
147 bool PyObjectPlus::isA(PyTypeObject *T)         // if called with a Type, use "typename"
148 {
149   return isA(T->tp_name);
150 }
151
152
153 bool PyObjectPlus::isA(const char *mytypename)          // check typename of each parent
154 {
155   int i;
156   PyParentObject  P;
157   PyParentObject *Ps = GetParents();
158   
159   for (P = Ps[i=0]; P != NULL; P = Ps[i++])
160   {
161       if (STR_String(P->tp_name) == STR_String(mytypename)      )
162                   return true;
163   }
164         
165   return false;
166 }
167
168 PyObject *PyObjectPlus::Py_isA(PyObject *args)          // Python wrapper for isA
169 {
170   char *mytypename;
171   if (!PyArg_ParseTuple(args, "s", &mytypename))
172     return NULL;
173   if(isA(mytypename))
174     Py_RETURN_TRUE;
175   else
176     Py_RETURN_FALSE;
177 }
178
179 #endif //NO_EXP_PYTHON_EMBEDDING
180