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,¶meterSet);
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 }
|