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