(file) Return to PMI_Class.c CVS log (file) (dir) Up to [OMI] / omi / scriptext / py

  1 krisbash 1.1 #include "/usr/include/python2.6/Python.h"
  2              #include "structmember.h"
  3              #include "MI.h"
  4              
  5              /*Defines a PMI_Class Type Object which is a Python Object that contains a reference to an intance of MI_Class */
  6              typedef struct{
  7                  PyObject_HEAD
  8                  const MI_Class *miClass;
  9              	PyObject *methods; /*only a list of method names. Will expand to include method signatures */ 
 10              	PyObject *propertyValues; /*dictionary of key value pairs */
 11              	PyObject *propertyTypes;
 12              
 13              } PMI_Class;
 14              
 15              /*Destructor of the PMI_Class Type Object*/
 16              static void PMI_Class_dealloc(PMI_Class *self)
 17              {
 18              	Py_XDECREF(self->miClass);
 19              	Py_XDECREF(self->methods);
 20              	Py_XDECREF(self->propertyValues); 
 21              	Py_XDECREF(self->propertyTypes);
 22 krisbash 1.1 	/* Free the memory of the type object */
 23              	self->ob_type->tp_free((PyObject*) self); 
 24              }
 25              
 26              static PyObject* PMI_Class_new(PyTypeObject *type)
 27              {
 28                  PMI_Class *self;
 29                  self = (PMI_Class *)type->tp_alloc(type,0);
 30                  if(self != NULL)
 31              	{
 32              		self->miClass = NULL;
 33              		self->methods = NULL;
 34              		self->propertyValues = NULL;
 35              		self->propertyTypes = NULL;    
 36              	}
 37                  return (PyObject *)self;
 38              }
 39              
 40              static PyTypeObject PMI_ClassType ;
 41              
 42              static PyObject* init_PMI_Class()
 43 krisbash 1.1 {
 44                  return PyObject_CallObject((PyObject*) &PMI_ClassType, NULL);
 45              }
 46              
 47              static int PMI_Class_init(PMI_Class *self)
 48              {
 49                  self-> miClass = NULL;
 50                  return 0;
 51              
 52              }
 53              
 54              static PyMethodDef PMI_Class_methods [] = {
 55                  {NULL}
 56              };
 57              
 58              static PyObject *MakeMethodsDict(PMI_Class *pmiClass)
 59              {
 60              	MI_Uint32 elementCount;
 61                  MI_Result miResult;
 62                  MI_Uint32 elementIndex;
 63              	const MI_Class *miClass = pmiClass->miClass;
 64 krisbash 1.1 
 65                  miResult = MI_Class_GetMethodCount(miClass, &elementCount);
 66                  if(miResult != MI_RESULT_OK)
 67                  {
 68              		PyErr_SetString(PyExc_Exception,"MI_Class_GetMethodCount failed");
 69              		return NULL;
 70                  }
 71              
 72              	PyObject *methodsList = PyList_New(0);
 73              	
 74                  for(elementIndex = 0; elementIndex != elementCount; elementIndex++)
 75                  {
 76              		const MI_Char *elementName;
 77              		MI_QualifierSet qualifierSet;
 78              		MI_ParameterSet parameterSet;
 79              
 80              		miResult = MI_Class_GetMethodAt(miClass,elementIndex,&elementName,&qualifierSet,&parameterSet);
 81              		if(miResult != MI_RESULT_OK)
 82              		{
 83              			PyErr_SetString(PyExc_Exception,"MI_Class_GetMethod failed");
 84              			return NULL;
 85 krisbash 1.1 		}
 86              		PyList_Append(methodsList,Py_BuildValue("s",elementName));
 87                  }
 88              	pmiClass->methods = methodsList;
 89              	Py_INCREF(Py_None);
 90              	return Py_None;
 91              
 92              }
 93              
 94              static PyObject *MakePropertyValueAndTypeDict(PMI_Class *pmiClass)
 95              {
 96              	MI_Uint32 elementCount;
 97                  MI_Result miResult;
 98                  MI_Uint32 elementIndex;
 99              	const MI_Class *miClass = pmiClass->miClass;
100              
101                  miResult = MI_Class_GetElementCount(miClass, &elementCount);
102                  if(miResult != MI_RESULT_OK)
103                  {
104              		PyErr_SetString(PyExc_Exception,"MI_Class_GetElementCount failed");
105              		return NULL;
106 krisbash 1.1     }
107              
108              	PyObject *propertyValues = PyDict_New();
109              	PyObject *propertyTypes = PyDict_New();
110                  for(elementIndex = 0; elementIndex != elementCount; elementIndex++)
111                  {
112              		const MI_Char *elementName;
113              		MI_Value elementValue;
114              		MI_Type elementType;
115              		MI_Uint32 elementFlags;
116              		MI_Boolean exists;
117              		MI_Char *referenceClass; /* This piece of memory is handled by MI client API */
118              		MI_QualifierSet qualifierSet;
119              		miResult = MI_Class_GetElementAt(miClass,elementIndex,&elementName,&elementValue,&exists,&elementType,&referenceClass,&qualifierSet,&elementFlags);
120              		if(miResult != MI_RESULT_OK)
121              		{
122              	  		PyErr_SetString(PyExc_Exception,"MI_Class_GetElement failed");
123              			return NULL;
124              		}
125              
126              		char *key = (char *)elementName;
127 krisbash 1.1 		PyObject *value = Get_Element_Value(&elementValue,elementType);
128              		if(PyDict_SetItemString(propertyValues,key,value))
129              		{
130              			PyErr_SetString(PyExc_Exception,"Property dictionary insert item failed");
131              			return NULL;
132              		}
133              
134              		PyObject *typeValue =PyInt_FromLong(elementType); 
135              		if(PyDict_SetItemString(propertyTypes,key,typeValue))
136              		{
137              			PyErr_SetString(PyExc_Exception,"PropertyType dictionary insert item failed");
138              			return NULL;
139              		}
140                  }
141              
142              	pmiClass->propertyValues = propertyValues;
143              	pmiClass->propertyTypes = propertyTypes;
144              	Py_INCREF(Py_None);
145              	return Py_None;
146              }
147              
148 krisbash 1.1 
149              static PyObject *EnumerateClassMethods(PMI_Class *pmiClass)
150              {
151              	PyObject *methods = pmiClass->methods;
152              	if(methods != NULL)
153              	{
154              		return methods;
155              	}
156              	else
157              	{
158              		PyErr_SetString(PyExc_Exception,"Class doesn't have any methods");
159              		return NULL;
160              	}
161              }
162              
163              static PyObject *EnumerateClassProperties(PMI_Class *pmiClass)
164              {
165              	PyObject *properties = pmiClass->propertyValues;
166              	if(properties != NULL)
167              	{
168              		return properties;
169 krisbash 1.1 	}
170              	else
171              	{
172              		PyErr_SetString(PyExc_Exception,"Class doesn't have any properties");
173              		return NULL;
174              	}
175              }
176              
177              static PyObject *EnumerateClassPropertyTypes(PMI_Class *pmiClass)
178              {
179              	PyObject *propertyTypes = pmiClass->propertyTypes;
180              	if(propertyTypes != NULL)
181              	{
182              		return propertyTypes;
183              	}
184              	else
185              	{
186              		PyErr_SetString(PyExc_Exception,"Class doesn't have any propertyTypes");
187              		return NULL;
188              	}
189              }
190 krisbash 1.1 static PyObject* PMI_Class_getattr(PMI_Class* self, char* propertyName)
191              {
192                  PMI_Class *pmiClass = (PMI_Class *)self;
193                  const MI_Class* class = pmiClass-> miClass;
194                  if(class == NULL)
195                  {
196              		PyErr_SetString(PyExc_Exception,"MI_Class GetProperty failed due to a null MI_Instance");
197              		return NULL;
198                  }
199              	if(!strcmp(propertyName,"methods"))
200              	{
201              		return EnumerateClassMethods(self);
202              	}
203              	else if(!strcmp(propertyName,"properties"))
204              	{
205              		return EnumerateClassProperties(self);
206              	}
207              	else if(!strcmp(propertyName,"className"))
208              	{
209              		const MI_Char *className;
210              		MI_Class_GetClassName(class,&className);
211 krisbash 1.1 		return Py_BuildValue("s",className);
212              	}
213              	else if(!strcmp(propertyName,"nameSpace"))
214              	{
215              		const MI_Char *nameSpace;
216              		MI_Class_GetNameSpace(class,&nameSpace);
217              		return Py_BuildValue("s",nameSpace);
218              	}
219              	else if(!strcmp(propertyName,"propertyTypes"))
220              	{
221              		return EnumerateClassPropertyTypes(self);
222              	}
223              	else
224              	{
225              		PyErr_SetString(PyExc_Exception,"MI_class don't have the property");
226              		return NULL;
227              	}
228              }
229              
230              
231              static PyTypeObject PMI_ClassType = {
232 krisbash 1.1     PyVarObject_HEAD_INIT(NULL, 0)
233                  "PMI_Class.PMI_Class",             /* tp_name */
234                  sizeof(PMI_Class), /* tp_basicsize */
235                  0,                         /* tp_itemsize */
236                  (destructor)PMI_Class_dealloc,     /* tp_dealloc */
237                  0,                         /* tp_print */
238                  (getattrfunc)PMI_Class_getattr,                         /* tp_getattr */
239                  0,                         /* tp_setattr */
240                  0,                         /* tp_reserved */
241                  0,                         /* tp_repr */
242                  0,                         /* tp_as_number */
243                  0,                         /* tp_as_sequence */
244                  0,                         /* tp_as_mapping */
245                  0,                         /* tp_hash  */
246                  0,                         /* tp_call */
247                  0,                         /* tp_str */
248                  0,                         /* tp_getattro */
249                  0,                         /* tp_setattro */
250                  0,                         /* tp_as_buffer */
251                  Py_TPFLAGS_DEFAULT,        /* tp_flags */
252                  "MI_Class objects",           /* tp_doc */
253 krisbash 1.1     0,			       /* tp_traverse */
254                  0,		               /* tp_clear */
255                  0,                         /* tp_richcompare */
256                  0,                         /* tp_weaklistoffset */
257                  0,                         /* tp_iter */
258                  0,                         /* tp_iternext */
259                  PMI_Class_methods,             /* tp_methods */
260                  0,		               /* tp_members */
261                  0,    /* tp_getset */
262                  0,                         /* tp_base */
263                  0,                         /* tp_dict */
264                  0,                         /* tp_descr_get */
265                  0,                         /* tp_descr_set */
266                  0,                         /* tp_dictoffset */
267                  (initproc)PMI_Class_init,      /* tp_init */
268                  0,                         /* tp_alloc */
269                  (newfunc)PMI_Class_new,                 /* tp_new */
270              };	    
271              
272              
273              #define PyMODINIT_FUNC void
274 krisbash 1.1 #ifndef PyMODINIT_FUNC
275              #endif
276              PyMODINIT_FUNC
277              initPMI_Class(void)
278              { 
279                  PyObject *m;
280                  PMI_ClassType.tp_new = PyType_GenericNew;
281                  /*Make sure the new type object is initialized properly*/
282                  if (PyType_Ready(&PMI_ClassType) <0)
283              	return;
284                  /*New type objects are all exported into mi module*/
285                  m = Py_InitModule3("mi",PMI_Class_methods, "MI_Class object");
286                  Py_INCREF(&PMI_ClassType);
287                  PyModule_AddObject(m, "PMI_Class", (PyObject *)&PMI_ClassType);
288              }

ViewCVS 0.9.2