merging trunk 17221:17300
[blender-staging.git] / source / gameengine / VideoTexture / BlendType.h
1 /* $Id$
2 -----------------------------------------------------------------------------
3 This source file is part of VideoTexture library
4
5 Copyright (c) 2006 The Zdeno Ash Miklas
6
7 This program is free software; you can redistribute it and/or modify it under
8 the terms of the GNU Lesser General Public License as published by the Free Software
9 Foundation; either version 2 of the License, or (at your option) any later
10 version.
11
12 This program is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public License along with
17 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
18 Place - Suite 330, Boston, MA 02111-1307, USA, or go to
19 http://www.gnu.org/copyleft/lesser.txt.
20 -----------------------------------------------------------------------------
21 */
22
23 #if !defined BLENDTYPE_H
24 #define BLENDTYPE_H
25
26
27 /// class allows check type of blender python object and access its contained object
28 template <class PyObj> class BlendType
29 {
30 public:
31         /// constructor
32         BlendType (char * name) : m_name(name) {}
33
34         /// check blender type and return pointer to contained object or NULL (if type is not valid)
35         PyObj * checkType (PyObject * obj)
36         {
37                 // if pointer to type isn't set 
38                 if (m_objType == NULL)
39                 {
40                         // compare names of type
41                         if (strcmp(obj->ob_type->tp_name, m_name) == 0)
42                                 // if name of type match, save pointer to type
43                                 m_objType = obj->ob_type;
44                         else
45                                 // if names of type don't match, return NULL
46                                 return NULL;
47                 }
48                 // if pointer to type is set and don't match to type of provided object, return NULL
49                 else if (obj->ob_type != m_objType) 
50                         return NULL;
51                 // return pointer to object
52                 return (PyObj*)obj;
53         }
54
55         /// parse arguments to get object
56         PyObj * parseArg (PyObject * args)
57         {
58                 // parse arguments
59                 PyObject * obj;
60                 if (PyArg_ParseTuple(args, "O", &obj))
61                         // if successfully parsed, return pointer to object
62                         return checkType(obj);
63                 // otherwise return NULL
64                 return NULL;
65         }
66
67 protected:
68         /// name of Python type
69         char * m_name;
70         /// pointer to Python type
71         PyTypeObject * m_objType;
72 };
73
74
75 #endif