1 karl 1.27 //%2006////////////////////////////////////////////////////////////////////////
|
2 schuur 1.1 //
|
3 karl 1.12 // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
4 // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
5 // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
|
6 schuur 1.1 // IBM Corp.; EMC Corporation, The Open Group.
|
7 karl 1.12 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
8 // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
|
9 karl 1.15 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
10 // EMC Corporation; VERITAS Software Corporation; The Open Group.
|
11 karl 1.27 // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
12 // EMC Corporation; Symantec Corporation; The Open Group.
|
13 schuur 1.1 //
14 // Permission is hereby granted, free of charge, to any person obtaining a copy
15 // of this software and associated documentation files (the "Software"), to
16 // deal in the Software without restriction, including without limitation the
17 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
18 // sell copies of the Software, and to permit persons to whom the Software is
19 // furnished to do so, subject to the following conditions:
|
20 r.kieninger 1.29 //
|
21 schuur 1.1 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
22 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
23 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
24 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
25 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
26 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
27 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 //
30 //==============================================================================
31 //
32 // Author: Adrian Schuur, schuur@de.ibm.com
33 //
|
34 r.kieninger 1.16 // Modified By: Robert Kieninger, kieningr@de.ibm.com, for bug#2642
|
35 schuur 1.1 //
36 //%/////////////////////////////////////////////////////////////////////////////
37
|
38 schuur 1.6 #include "CMPI_Version.h"
|
39 schuur 1.3
|
40 schuur 1.1 #include "CMPI_Broker.h"
41 #include "CMPI_Object.h"
42 #include "CMPI_ContextArgs.h"
43 #include "CMPI_Enumeration.h"
44 #include "CMPI_Value.h"
45 #include "CMPIProviderManager.h"
|
46 schuur 1.9 #include "CMPI_String.h"
|
47 schuur 1.1
48 #include <Pegasus/Common/CIMName.h>
49 #include <Pegasus/Common/CIMPropertyList.h>
50 #include <Pegasus/Provider/CIMOMHandle.h>
51 #include <Pegasus/Common/CIMValue.h>
52 #include <Pegasus/Common/CIMType.h>
53
54
55 PEGASUS_USING_STD;
56 PEGASUS_NAMESPACE_BEGIN
57
58 #define DDD(X) if (_cmpi_trace) X;
59
60 extern int _cmpi_trace;
61
|
62 konrad.r 1.20 static CIMPropertyList getList(const char** l) {
|
63 schuur 1.10 CIMPropertyList pl;
64 if (l) {
65 Array<CIMName> n;
66 while (*l) {
67 n.append(*l++);
68 }
69 pl.set(n);
70 }
71 return pl;
|
72 schuur 1.1 }
73
|
74 konrad.r 1.20 CIMClass* mbGetClass(const CMPIBroker *mb, const CIMObjectPath &cop) {
|
75 schuur 1.4 DDD(cout<<"--- mbGetClass()"<<endl);
|
76 schuur 1.10 mb=CM_BROKER;
|
77 schuur 1.1 CMPI_Broker *xBroker=(CMPI_Broker*)mb;
|
78 schuur 1.3 String clsId=cop.getNameSpace().getString()+":"+cop.getClassName().getString();
|
79 schuur 1.1 CIMClass *ccp;
80
|
81 mark.hamzy 1.26 {
82 ReadLock readLock (xBroker->rwsemClassCache);
83
|
84 schuur 1.1 if (xBroker->clsCache->lookup(clsId,ccp)) return ccp;
85 }
86
87 try {
|
88 mark.hamzy 1.26 WriteLock writeLock (xBroker->rwsemClassCache);
89
90 if (xBroker->clsCache->lookup(clsId,ccp)) return ccp;
91
|
92 schuur 1.1 CIMClass cc=CM_CIMOM(mb)->getClass(
93 OperationContext(),
94 cop.getNameSpace(),
95 cop.getClassName(),
96 (bool)0,
97 (bool)1,
98 (bool)0,
99 CIMPropertyList());
100 ccp=new CIMClass(cc);
101 xBroker->clsCache->insert(clsId,ccp);
102 return ccp;
103 }
|
104 konrad.r 1.20 catch (const CIMException &e) {
|
105 schuur 1.4 DDD(cout<<"### exception: mbGetClass - code: "<<e.getCode()<<" msg: "<<e.getMessage()<<endl);
|
106 schuur 1.1 }
|
107 mark.hamzy 1.26
|
108 schuur 1.1 return NULL;
109 }
110
|
111 schuur 1.11 extern "C" {
|
112 schuur 1.1
|
113 konrad.r 1.20 static CMPIInstance* mbGetInstance(const CMPIBroker *mb, const CMPIContext *ctx,
114 const CMPIObjectPath *cop, const char **properties, CMPIStatus *rc) {
|
115 schuur 1.11 DDD(cout<<"--- mbGetInstance()"<<endl);
116 mb=CM_BROKER;
117 CMPIFlags flgs=ctx->ft->getEntry(ctx,CMPIInvocationFlags,NULL).value.uint32;
|
118 konrad.r 1.20 const CIMPropertyList props=getList(properties);
|
119 schuur 1.11 CIMObjectPath qop(String::EMPTY,CIMNamespaceName(),
120 CM_ObjectPath(cop)->getClassName(),
121 CM_ObjectPath(cop)->getKeyBindings());
122
123 AutoMutex mtx(((CMPI_Broker*)mb)->mtx);
124 try {
125 CIMInstance ci=CM_CIMOM(mb)->getInstance(
126 OperationContext(*CM_Context(ctx)),
127 CM_ObjectPath(cop)->getNameSpace(),
128 qop, //*CM_ObjectPath(cop),
129 CM_LocalOnly(flgs),
130 CM_IncludeQualifiers(flgs),
131 CM_ClassOrigin(flgs),
132 props);
|
133 r.kieninger 1.18 ci.setPath(*CM_ObjectPath(cop));
|
134 schuur 1.11 if (rc) CMSetStatus(rc,CMPI_RC_OK);
135 return (CMPIInstance*)new CMPI_Object(new CIMInstance(ci));
136 }
|
137 konrad.r 1.20 catch (const CIMException &e) {
|
138 schuur 1.11 DDD(cout<<"### exception: mbGetInstance - code: "<<e.getCode()<<" msg: "<<e.getMessage()<<endl);
139 if (rc) CMSetStatusWithString(rc,(CMPIrc)e.getCode(),
140 (CMPIString*)string2CMPIString(e.getMessage()));
141 return NULL;
142 }
143 if (rc) CMSetStatusWithChars(mb,rc,CMPI_RC_ERROR,"Internal error - CMPIBoker.cpp-0");
144 return NULL;
|
145 schuur 1.1 }
|
146 schuur 1.11
|
147 konrad.r 1.20 static CMPIObjectPath* mbCreateInstance(const CMPIBroker *mb, const CMPIContext *ctx,
148 const CMPIObjectPath *cop, const CMPIInstance *ci, CMPIStatus *rc) {
|
149 schuur 1.11 DDD(cout<<"--- mbCreateInstance()"<<endl);
150 mb=CM_BROKER;
151
152 AutoMutex mtx(((CMPI_Broker*)mb)->mtx);
153 try {
154 CIMObjectPath ncop=CM_CIMOM(mb)->createInstance(
155 OperationContext(*CM_Context(ctx)),
156 CM_ObjectPath(cop)->getNameSpace(),
157 *CM_Instance(ci));
158 if (rc) CMSetStatus(rc,CMPI_RC_OK);
159 return (CMPIObjectPath*)new CMPI_Object(new CIMObjectPath(ncop));
160 }
|
161 konrad.r 1.20 catch (const CIMException &e) {
|
162 schuur 1.11 DDD(cout<<"### exception: mbCreateInstance - code: "<<e.getCode()<<" msg: "<<e.getMessage()<<endl);
163 if (rc) CMSetStatusWithString(rc,(CMPIrc)e.getCode(),
164 (CMPIString*)string2CMPIString(e.getMessage()));
165 return NULL;
166 }
167 if (rc) CMSetStatusWithChars(mb,rc,CMPI_RC_ERROR,"Internal error - CMPIBoker.cpp-1");
|
168 schuur 1.9 return NULL;
|
169 schuur 1.1 }
170
|
171 konrad.r 1.20 static CMPIStatus mbModifyInstance(const CMPIBroker *mb, const CMPIContext *ctx,
172 const CMPIObjectPath *cop, const CMPIInstance *ci,const char ** properties) {
|
173 schuur 1.11 DDD(cout<<"--- mbSetInstance()"<<endl);
174 mb=CM_BROKER;
175 CMPIFlags flgs=ctx->ft->getEntry(ctx,CMPIInvocationFlags,NULL).value.uint32;
|
176 konrad.r 1.20 const CIMPropertyList props=getList(properties);
|
177 schuur 1.11
178 AutoMutex mtx(((CMPI_Broker*)mb)->mtx);
179 try {
|
180 marek 1.14 CIMInstance cmi(*CM_Instance(ci));
181 cmi.setPath(*CM_ObjectPath(cop));
|
182 schuur 1.11 CM_CIMOM(mb)->modifyInstance(
183 OperationContext(*CM_Context(ctx)),
|
184 marek 1.14 CM_ObjectPath(cop)->getNameSpace(),
185 cmi,
|
186 schuur 1.11 CM_IncludeQualifiers(flgs),
187 props);
188 CMReturn(CMPI_RC_OK);
189 }
|
190 konrad.r 1.20 catch (const CIMException &e) {
|
191 schuur 1.11 DDD(cout<<"### exception: mbSetInstance - code: "<<e.getCode()<<" msg: "<<e.getMessage()<<endl);
192 CMReturnWithString((CMPIrc)e.getCode(),
193 (CMPIString*)string2CMPIString(e.getMessage()));
194 }
195 CMReturnWithChars(mb,CMPI_RC_ERROR,"Internal error - CMPIBoker.cpp-2");
|
196 schuur 1.1 }
197
|
198 konrad.r 1.20 static CMPIStatus mbDeleteInstance (const CMPIBroker *mb, const CMPIContext *ctx,
199 const CMPIObjectPath *cop) {
|
200 schuur 1.11 DDD(cout<<"--- mbDeleteInstance()"<<endl);
201 mb=CM_BROKER;
202 CIMObjectPath qop(String::EMPTY,CIMNamespaceName(),
203 CM_ObjectPath(cop)->getClassName(),
204 CM_ObjectPath(cop)->getKeyBindings());
205
206 AutoMutex mtx(((CMPI_Broker*)mb)->mtx);
207 try {
208 CM_CIMOM(mb)->deleteInstance(
209 OperationContext(*CM_Context(ctx)),
210 CM_ObjectPath(cop)->getNameSpace(),
211 qop); //*CM_ObjectPath(cop));
212 CMReturn(CMPI_RC_OK);
213 }
|
214 konrad.r 1.20 catch (const CIMException &e) {
|
215 schuur 1.11 DDD(cout<<"### exception: mbDeleteInstance - code: "<<e.getCode()<<" msg: "<<e.getMessage()<<endl);
216 CMReturnWithString((CMPIrc)e.getCode(),
217 (CMPIString*)string2CMPIString(e.getMessage()));
218 }
219 CMReturnWithChars(mb,CMPI_RC_ERROR,"Internal error - CMPIBoker.cpp-3");
|
220 schuur 1.1 }
221
|
222 r.kieninger 1.29 static CMPIEnumeration* mbExecQuery(const CMPIBroker *mb,
|
223 konrad.r 1.20 const CMPIContext *ctx,
|
224 r.kieninger 1.29 const CMPIObjectPath *cop,
|
225 konrad.r 1.20 const char *query, const char *lang, CMPIStatus *rc) {
|
226 schuur 1.11 DDD(cout<<"--- mbExecQuery()"<<endl);
227 mb=CM_BROKER;
228
229 AutoMutex mtx(((CMPI_Broker*)mb)->mtx);
230 try {
231 Array<CIMObject> const &en=CM_CIMOM(mb)->execQuery(
232 OperationContext(*CM_Context(ctx)),
233 CM_ObjectPath(cop)->getNameSpace(),
234 String(query),
235 String(lang));
236 if (rc) CMSetStatus(rc,CMPI_RC_OK);
|
237 r.kieninger 1.19 CMPI_Object *obj =
238 new CMPI_Object(new CMPI_ObjEnumeration(new Array<CIMObject>(en)));
239 return (CMPI_ObjEnumeration *)obj->getHdl();
240
|
241 schuur 1.11 }
|
242 konrad.r 1.20 catch (const CIMException &e) {
|
243 schuur 1.11 DDD(cout<<"### exception: mbExecQuery - code: "<<e.getCode()<<" msg: "<<e.getMessage()<<endl);
244 if (rc) CMSetStatusWithString(rc,(CMPIrc)e.getCode(),
245 (CMPIString*)string2CMPIString(e.getMessage()));
246 }
247 if (rc) CMSetStatusWithChars(mb,rc,CMPI_RC_ERR_FAILED,"Internal error - CMPIBoker.cpp-4");
248 return NULL;
|
249 schuur 1.1 }
250
|
251 konrad.r 1.20 static CMPIEnumeration* mbEnumInstances(const CMPIBroker *mb, const CMPIContext *ctx,
252 const CMPIObjectPath *cop, const char **properties, CMPIStatus *rc) {
|
253 schuur 1.11 DDD(cout<<"--- mbEnumInstances()"<<endl);
254 mb=CM_BROKER;
255
256 CMPIFlags flgs=ctx->ft->getEntry(ctx,CMPIInvocationFlags,NULL).value.uint32;
|
257 konrad.r 1.20 const CIMPropertyList props=getList(properties);
|
258 schuur 1.11
259 AutoMutex mtx(((CMPI_Broker*)mb)->mtx);
260 try {
261 Array<CIMInstance> const &en=CM_CIMOM(mb)->enumerateInstances(
262 OperationContext(*CM_Context(ctx)),
263 CM_ObjectPath(cop)->getNameSpace(),
264 CM_ObjectPath(cop)->getClassName(),
265 CM_DeepInheritance(flgs),
266 CM_LocalOnly(flgs),
267 CM_IncludeQualifiers(flgs),
268 CM_ClassOrigin(flgs),
269 props);
270 if (rc) CMSetStatus(rc,CMPI_RC_OK);
|
271 r.kieninger 1.28
272 // Workaround for bugzilla 4677
273 // When running out of process the returned instances don't contain
274 // a name space. Create a writable copy of the array and add the
275 // namespace from the input parameters.
276 Array<CIMInstance> * aInst = new Array<CIMInstance>(en);
277 for (unsigned int index=0;index < aInst->size(); index++)
278 {
279 CIMInstance& myInst = (*aInst)[index];
280 CIMObjectPath orgCop = myInst.getPath();
281 orgCop.setNameSpace(CM_ObjectPath(cop)->getNameSpace());
282 (*aInst)[index].setPath(orgCop);
283 }
284
285 CMPI_Object *obj = new CMPI_Object(new CMPI_InstEnumeration(aInst));
286
287 /*CMPI_Object *obj =
288 new CMPI_Object(new CMPI_InstEnumeration(new Array<CIMInstance>(en)));*/
289 // End of workaround for bugzilla 4677
290
|
291 r.kieninger 1.19 return (CMPI_InstEnumeration*)obj->getHdl();
292
|
293 schuur 1.11 }
|
294 konrad.r 1.20 catch (const CIMException &e) {
|
295 schuur 1.11 DDD(cout<<"### exception: mbEnumInstances - code: "<<e.getCode()<<" msg: "<<e.getMessage()<<endl);
296 if (rc) CMSetStatusWithString(rc,(CMPIrc)e.getCode(),
297 (CMPIString*)string2CMPIString(e.getMessage()));
298 return NULL;
299 }
300 if (rc) CMSetStatusWithChars(mb,rc,CMPI_RC_ERROR,"Internal error - CMPIBoker.cpp-5");
301 return NULL;
|
302 schuur 1.1 }
303
|
304 konrad.r 1.20 static CMPIEnumeration* mbEnumInstanceNames(const CMPIBroker *mb, const CMPIContext *ctx,
305 const CMPIObjectPath *cop, CMPIStatus *rc) {
|
306 schuur 1.11 DDD(cout<<"--- mbEnumInstanceNames()"<<endl);
307 mb=CM_BROKER;
308
309 AutoMutex mtx(((CMPI_Broker*)mb)->mtx);
310 try {
311 Array<CIMObjectPath> const &en=CM_CIMOM(mb)->enumerateInstanceNames(
312 OperationContext(*CM_Context(ctx)),
313 CM_ObjectPath(cop)->getNameSpace(),
314 CM_ObjectPath(cop)->getClassName());
315 if (rc) CMSetStatus(rc,CMPI_RC_OK);
|
316 r.kieninger 1.19 CMPI_Object *obj =
317 new CMPI_Object(new CMPI_OpEnumeration(new Array<CIMObjectPath>(en)));
318 return (CMPI_OpEnumeration *)obj->getHdl();
319
|
320 schuur 1.11 }
|
321 konrad.r 1.20 catch (const CIMException &e) {
|
322 schuur 1.11 DDD(cout<<"### exception: mbEnumInstances - code: "<<e.getCode()<<" msg: "<<e.getMessage()<<endl);
323 if (rc) CMSetStatusWithString(rc,(CMPIrc)e.getCode(),
324 (CMPIString*)string2CMPIString(e.getMessage()));
325 }
326 if (rc) CMSetStatusWithChars(mb,rc,CMPI_RC_ERROR,"Internal error - CMPIBoker.cpp-6");
|
327 schuur 1.9 return NULL;
|
328 schuur 1.1 }
329
|
330 konrad.r 1.20 static CMPIEnumeration* mbAssociators(const CMPIBroker *mb, const CMPIContext *ctx,
331 const CMPIObjectPath *cop, const char *assocClass, const char *resultClass,
332 const char *role, const char *resultRole, const char **properties, CMPIStatus *rc) {
|
333 schuur 1.11 DDD(cout<<"--- mbAssociators()"<<endl);
334 mb=CM_BROKER;
335 CMPIFlags flgs=ctx->ft->getEntry(ctx,CMPIInvocationFlags,NULL).value.uint32;
|
336 konrad.r 1.20 const CIMPropertyList props=getList(properties);
|
337 schuur 1.11 CIMObjectPath qop(String::EMPTY,CIMNamespaceName(),
338 CM_ObjectPath(cop)->getClassName(),
339 CM_ObjectPath(cop)->getKeyBindings());
340
341 AutoMutex mtx(((CMPI_Broker*)mb)->mtx);
342 try {
343 Array<CIMObject> const &en=CM_CIMOM(mb)->associators(
344 OperationContext(*CM_Context(ctx)),
345 CM_ObjectPath(cop)->getNameSpace(),
|
346 r.kieninger 1.16 qop,
|
347 schuur 1.11 assocClass ? CIMName(assocClass) : CIMName(),
348 resultClass ? CIMName(resultClass) : CIMName(),
349 role ? String(role) : String::EMPTY,
350 resultRole ? String(resultRole) : String::EMPTY,
351 CM_IncludeQualifiers(flgs),
352 CM_ClassOrigin(flgs),
353 props);
354 if (rc) CMSetStatus(rc,CMPI_RC_OK);
|
355 r.kieninger 1.28
356 // Workaround for bugzilla 4677
357 // When running out of process the returned instances don't contain
358 // a name space. Create a writable copy of the array and add the
359 // namespace from the input parameters.
360 Array<CIMObject> * aInst = new Array<CIMObject>(en);
361 for (unsigned int index=0;index < aInst->size(); index++)
362 {
363 CIMObject& myInst = (*aInst)[index];
364 CIMObjectPath orgCop = myInst.getPath();
365 orgCop.setNameSpace(CM_ObjectPath(cop)->getNameSpace());
366 (*aInst)[index].setPath(orgCop);
367 }
368
369 CMPI_Object *obj = new CMPI_Object(new CMPI_ObjEnumeration(aInst));
370
371 /*CMPI_Object *obj =
372 new CMPI_Object(new CMPI_ObjEnumeration(new Array<CIMObject>(en)));*/
373 // End of workaround for bugzilla 4677
374
|
375 r.kieninger 1.19 return (CMPI_ObjEnumeration *)obj->getHdl();
376
|
377 schuur 1.11 }
|
378 konrad.r 1.20 catch (const CIMException &e) {
|
379 schuur 1.11 DDD(cout<<"### exception: mbAssociators - code: "<<e.getCode()<<" msg: "<<e.getMessage()<<endl);
380 if (rc) CMSetStatusWithString(rc,(CMPIrc)e.getCode(),
381 (CMPIString*)string2CMPIString(e.getMessage()));
382 return NULL;
383 }
384 if (rc) CMSetStatusWithChars(mb,rc,CMPI_RC_ERROR,"Internal error - CMPIBoker.cpp-7");
385 return NULL;
|
386 schuur 1.1 }
387
|
388 r.kieninger 1.29 static CMPIEnumeration* mbAssociatorNames(const CMPIBroker *mb,
|
389 konrad.r 1.20 const CMPIContext *ctx,
|
390 r.kieninger 1.29 const CMPIObjectPath *cop,
391 const char *assocClass,
|
392 konrad.r 1.20 const char *resultClass,
|
393 schuur 1.11 const char *role, const char *resultRole, CMPIStatus *rc) {
394 DDD(cout<<"--- mbAssociatorsNames()"<<endl);
395 mb=CM_BROKER;
396 CIMObjectPath qop(String::EMPTY,CIMNamespaceName(),
397 CM_ObjectPath(cop)->getClassName(),
398 CM_ObjectPath(cop)->getKeyBindings());
399
400 AutoMutex mtx(((CMPI_Broker*)mb)->mtx);
401 try {
402 Array<CIMObjectPath> const &en=CM_CIMOM(mb)->associatorNames(
403 OperationContext(*CM_Context(ctx)),
404 CM_ObjectPath(cop)->getNameSpace(),
|
405 r.kieninger 1.16 qop,
|
406 schuur 1.11 assocClass ? CIMName(assocClass) : CIMName(),
407 resultClass ? CIMName(resultClass) : CIMName(),
408 role ? String(role) : String::EMPTY,
409 resultRole ? String(resultRole) : String::EMPTY);
410 if (rc) CMSetStatus(rc,CMPI_RC_OK);
|
411 r.kieninger 1.19 CMPI_Object *obj =
412 new CMPI_Object(new CMPI_OpEnumeration(new Array<CIMObjectPath>(en)));
413 return (CMPI_OpEnumeration *)obj->getHdl();
|
414 schuur 1.11 }
|
415 konrad.r 1.20 catch (const CIMException &e) {
|
416 schuur 1.11 DDD(cout<<"### exception: mbAssociatorsNames - code: "<<e.getCode()<<" msg: "<<e.getMessage()<<endl);
417 if (rc) CMSetStatusWithString(rc,(CMPIrc)e.getCode(),
418 (CMPIString*)string2CMPIString(e.getMessage()));
419 }
420 if (rc) CMSetStatusWithChars(mb,rc,CMPI_RC_ERROR,"Internal error - CMPIBoker.cpp-8");
|
421 schuur 1.9 return NULL;
|
422 schuur 1.1 }
423
|
424 konrad.r 1.20 static CMPIEnumeration* mbReferences(const CMPIBroker *mb, const CMPIContext *ctx,
425 const CMPIObjectPath *cop, const char *resultClass, const char *role ,
426 const char **properties, CMPIStatus *rc) {
|
427 schuur 1.11 DDD(cout<<"--- mbReferences()"<<endl);
428 mb=CM_BROKER;
429 CMPIFlags flgs=ctx->ft->getEntry(ctx,CMPIInvocationFlags,NULL).value.uint32;
430 CIMPropertyList props=getList(properties);
431 CIMObjectPath qop(String::EMPTY,CIMNamespaceName(),
432 CM_ObjectPath(cop)->getClassName(),
433 CM_ObjectPath(cop)->getKeyBindings());
434
435 AutoMutex mtx(((CMPI_Broker*)mb)->mtx);
436 try {
437 Array<CIMObject> const &en=CM_CIMOM(mb)->references(
438 OperationContext(*CM_Context(ctx)),
439 CM_ObjectPath(cop)->getNameSpace(),
440 qop,
441 resultClass ? CIMName(resultClass) : CIMName(),
442 role ? String(role) : String::EMPTY,
443 CM_IncludeQualifiers(flgs),
444 CM_ClassOrigin(flgs),
445 props);
446 if (rc) CMSetStatus(rc,CMPI_RC_OK);
|
447 r.kieninger 1.28 // Workaround for bugzilla 4677
448 // When running out of process the returned instances don't contain
449 // a name space. Create a writable copy of the array and add the
450 // namespace from the input parameters.
451 Array<CIMObject> * aInst = new Array<CIMObject>(en);
452 for (unsigned int index=0;index < aInst->size(); index++)
453 {
454 CIMObject& myInst = (*aInst)[index];
455 CIMObjectPath orgCop = myInst.getPath();
456 orgCop.setNameSpace(CM_ObjectPath(cop)->getNameSpace());
457 (*aInst)[index].setPath(orgCop);
458 }
459
460 CMPI_Object *obj = new CMPI_Object(new CMPI_ObjEnumeration(aInst));
461
462 /*CMPI_Object *obj =
463 new CMPI_Object(new CMPI_ObjEnumeration(new Array<CIMObject>(en)));*/
464 // End of workaround for bugzilla 4677
465
|
466 r.kieninger 1.19 return (CMPI_ObjEnumeration *)obj->getHdl();
|
467 schuur 1.11 }
|
468 konrad.r 1.20 catch (const CIMException &e) {
|
469 schuur 1.11 DDD(cout<<"### exception: mbReferences - code: "<<e.getCode()<<" msg: "<<e.getMessage()<<endl);
470 if (rc) CMSetStatusWithString(rc,(CMPIrc)e.getCode(),
471 (CMPIString*)string2CMPIString(e.getMessage()));
472 return NULL;
473 }
474 if (rc) CMSetStatusWithChars(mb,rc,CMPI_RC_ERROR,"Internal error - CMPIBoker.cpp-10");
475 return NULL;
|
476 schuur 1.1 }
477
|
478 konrad.r 1.20 static CMPIEnumeration* mbReferenceNames(const CMPIBroker *mb, const CMPIContext *ctx,
479 const CMPIObjectPath *cop, const char *resultClass, const char *role,
|
480 schuur 1.11 CMPIStatus *rc) {
481 DDD(cout<<"--- mbReferencesNames()"<<endl);
482 mb=CM_BROKER;
483 CIMObjectPath qop(String::EMPTY,CIMNamespaceName(),
484 CM_ObjectPath(cop)->getClassName(),
485 CM_ObjectPath(cop)->getKeyBindings());
486
487 AutoMutex mtx(((CMPI_Broker*)mb)->mtx);
488 try {
489 Array<CIMObjectPath> const &en=CM_CIMOM(mb)->referenceNames(
490 OperationContext(*CM_Context(ctx)),
491 CM_ObjectPath(cop)->getNameSpace(),
|
492 r.kieninger 1.16 qop,
|
493 schuur 1.11 resultClass ? CIMName(resultClass) : CIMName(),
494 role ? String(role) : String::EMPTY);
495 if (rc) CMSetStatus(rc,CMPI_RC_OK);
|
496 r.kieninger 1.19 CMPI_Object *obj =
497 new CMPI_Object(new CMPI_OpEnumeration(new Array<CIMObjectPath>(en)));
498 return (CMPI_OpEnumeration *)obj->getHdl();
|
499 schuur 1.11 }
|
500 konrad.r 1.20 catch (const CIMException &e) {
|
501 schuur 1.11 DDD(cout<<"### exception: mbReferencesNames - code: "<<e.getCode()<<" msg: "<<e.getMessage()<<endl);
502 if (rc) CMSetStatusWithString(rc,(CMPIrc)e.getCode(),
503 (CMPIString*)string2CMPIString(e.getMessage()));
504 }
505 if (rc) CMSetStatusWithChars(mb,rc,CMPI_RC_ERROR,"Internal error - CMPIBoker.cpp-11");
|
506 schuur 1.9 return NULL;
|
507 schuur 1.1 }
508
|
509 r.kieninger 1.29 #define CM_Args(args) ((Array<CIMParamValue>*)args->hdl)
510
511 static CMPIData mbInvokeMethod(const CMPIBroker *mb,
512 const CMPIContext *ctx,
513 const CMPIObjectPath *cop,
514 const char *method,
515 const CMPIArgs *in,
516 CMPIArgs *out,
517 CMPIStatus *rc)
518 {
519 DDD(cout<<"--- mbInvokeMethod()"<<endl);
|
520 konrad.r 1.13 CMPIData data={0,CMPI_nullValue,{0}};
|
521 schuur 1.11 mb=CM_BROKER;
|
522 r.kieninger 1.29 CIMObjectPath qop(String::EMPTY,CIMNamespaceName(),
523 CM_ObjectPath(cop)->getClassName(),
524 CM_ObjectPath(cop)->getKeyBindings());
525
526 AutoMutex mtx(((CMPI_Broker*)mb)->mtx);
527 try {
528 CIMValue v=CM_CIMOM(mb)->invokeMethod(
529 OperationContext(*CM_Context(ctx)),
530 CM_ObjectPath(cop)->getNameSpace(),
531 qop,
532 method ? String(method) : String::EMPTY,
533 *CM_Args(in),
534 *CM_Args(out));
535 CIMType vType=v.getType();
536 CMPIType t=type2CMPIType(vType,v.isArray());
537 value2CMPIData(v,t,&data);
538 if (rc)
539 {
540 CMSetStatus(rc,CMPI_RC_OK);
541 }
542 return data;
543 r.kieninger 1.29 }
544 catch (const CIMException &e) {
545 DDD(cout<<"### exception: mbInvokeMethod - code: "<<e.getCode()<<" msg: "<<e.getMessage()<<endl);
546 if (rc)
547 {
548 CMSetStatusWithString(rc,(CMPIrc)e.getCode(),
549 (CMPIString*)string2CMPIString(e.getMessage()));
550 }
551 }
552 if (rc)
553 {
554 CMSetStatusWithChars(mb,rc,CMPI_RC_ERROR,"Internal error - CMPIBroker.cpp-11.1");
555 }
|
556 schuur 1.11 return data;
|
557 schuur 1.1 }
558
|
559 konrad.r 1.20 static CMPIStatus mbSetProperty(const CMPIBroker *mb, const CMPIContext *ctx,
560 const CMPIObjectPath *cop, const char *name, const CMPIValue *val,
|
561 konrad.r 1.24 CMPIType type) {
|
562 schuur 1.11 DDD(cout<<"--- mbSetProperty()"<<endl);
563 mb=CM_BROKER;
564 CMPIrc rc;
565 CIMValue v=value2CIMValue(val,type,&rc);
566
567 AutoMutex mtx(((CMPI_Broker*)mb)->mtx);
568 try {
569 CM_CIMOM(mb)->setProperty(
570 OperationContext(*CM_Context(ctx)),
571 CM_ObjectPath(cop)->getNameSpace(),
572 *CM_ObjectPath(cop),
573 String(name),
574 v);
575 CMReturn(CMPI_RC_OK);
576 }
|
577 konrad.r 1.20 catch (const CIMException &e) {
|
578 schuur 1.11 DDD(cout<<"### exception: mbSetProperty - code: "<<e.getCode()<<" msg: "<<e.getMessage()<<endl);
579 CMReturnWithString((CMPIrc)e.getCode(),
580 (CMPIString*)string2CMPIString(e.getMessage()));
581 }
582 CMReturnWithChars(mb,CMPI_RC_ERROR,"Internal error - CMPIBoker.cpp-12");
|
583 schuur 1.1 }
584
|
585 konrad.r 1.20 static CMPIData mbGetProperty(const CMPIBroker *mb, const CMPIContext *ctx,
586 const CMPIObjectPath *cop, const char *name, CMPIStatus *rc) {
|
587 schuur 1.11 DDD(cout<<"--- mbGetProperty()"<<endl);
588 mb=CM_BROKER;
|
589 konrad.r 1.13 CMPIData data={0,CMPI_nullValue,{0}};
|
590 schuur 1.11
591 AutoMutex mtx(((CMPI_Broker*)mb)->mtx);
592 try {
593 CIMValue v=CM_CIMOM(mb)->getProperty(
594 OperationContext(*CM_Context(ctx)),
595 CM_ObjectPath(cop)->getNameSpace(),
596 *CM_ObjectPath(cop),
597 String(name));
598 CIMType vType=v.getType();
599 CMPIType t=type2CMPIType(vType,v.isArray());
600 value2CMPIData(v,t,&data);
601 if (rc) CMSetStatus(rc,CMPI_RC_OK);
602 return data;
603 }
|
604 konrad.r 1.20 catch (const CIMException &e) {
|
605 schuur 1.11 DDD(cout<<"### exception: mbGetProperty - code: "<<e.getCode()<<" msg: "<<e.getMessage()<<endl);
606 if (rc) CMSetStatus(rc,(CMPIrc)e.getCode());
607 }
608 if (rc) CMSetStatus(rc,CMPI_RC_ERR_FAILED);
|
609 schuur 1.1 return data;
610 }
|
611 schuur 1.11
|
612 konrad.r 1.20 static CMPIContext* mbPrepareAttachThread(const CMPIBroker* mb, const CMPIContext* eCtx) {
|
613 schuur 1.11 DDD(cout<<"--- mbPrepareAttachThread()"<<endl);
614 mb=CM_BROKER;
615 OperationContext *ctx=(OperationContext*)((CMPI_Context*)eCtx)->ctx;
616 OperationContext nctx=*ctx;
617 CMPIContext* neCtx=new CMPI_Context(*(new OperationContext(nctx)));
618 CMPIString *name;
619 for (int i=0,s=CMPI_Args_Ftab->getArgCount((CMPIArgs*)eCtx,NULL); i<s; i++) {
620 CMPIData data=CMPI_Args_Ftab->getArgAt((CMPIArgs*)eCtx,i,&name,NULL);
621 CMPI_Args_Ftab->addArg((CMPIArgs*)neCtx,CMGetCharPtr(name),&data.value,data.type);
622 }
623 return neCtx;
|
624 schuur 1.1 }
625
|
626 konrad.r 1.20 static CMPIStatus mbAttachThread(const CMPIBroker* mb, const CMPIContext* eCtx) {
|
627 schuur 1.11 DDD(cout<<"--- mbAttachThread()"<<endl);
628 ((CMPI_Context*)eCtx)->thr=new CMPI_ThreadContext(mb,eCtx);
629 CMReturn(CMPI_RC_OK);
|
630 schuur 1.1 }
631
|
632 konrad.r 1.20 static CMPIStatus mbDetachThread(const CMPIBroker* mb, const CMPIContext* eCtx) {
|
633 schuur 1.11 DDD(cout<<"--- mbDetachThread()"<<endl);
|
634 r.kieninger 1.29 mb=CM_BROKER;
|
635 konrad.r 1.25 CMPI_Context *neCtx = (CMPI_Context *)eCtx;
636 delete neCtx->thr;
637 // Delete also CMPIContext
|
638 r.kieninger 1.29 delete neCtx;
|
639 schuur 1.11 CMReturn(CMPI_RC_OK);
640 }
|
641 schuur 1.1
|
642 konrad.r 1.20 static CMPIStatus mbDeliverIndication(const CMPIBroker* eMb, const CMPIContext* ctx,
643 const char *ns, const CMPIInstance* ind) {
|
644 schuur 1.11 DDD(cout<<"--- mbDeliverIndication()"<<endl);
645 eMb=CM_BROKER;
646 CMPI_Broker *mb=(CMPI_Broker*)eMb;
647 CMPIProviderManager::indProvRecord *prec;
648 OperationContext* context=CM_Context(ctx);
649
650 if (CMPIProviderManager::provTab.lookup(mb->name,prec)) {
651 if (prec->enabled) {
652 try {
653 context->get(SubscriptionInstanceNamesContainer::NAME);
654 }
|
655 konrad.r 1.21 catch (const Exception &) {
|
656 schuur 1.11 Array<CIMObjectPath> subscriptionInstanceNames;
657 context->insert(SubscriptionInstanceNamesContainer(subscriptionInstanceNames));
658 }
659 CIMIndication cimIndication(*CM_Instance(ind));
660 AutoMutex mtx(((CMPI_Broker*)mb)->mtx);
661 try {
662 prec->handler->deliver(
663 *context,
664 // OperationContext(*CM_Context(ctx)),
665 cimIndication);
666 CMReturn(CMPI_RC_OK);
667 }
|
668 konrad.r 1.20 catch (const CIMException &e) {
|
669 schuur 1.11 DDD(cout<<"### exception: mbSetProperty - code: "<<e.getCode()<<" msg: "<<e.getMessage()<<endl);
670 CMReturn((CMPIrc)e.getCode());
671 }
|
672 schuur 1.7 }
673 }
|
674 schuur 1.11 CMReturn(CMPI_RC_ERR_FAILED);
|
675 schuur 1.1 }
|
676 schuur 1.11
677 }
|
678 schuur 1.1
679 static CMPIBrokerFT broker_FT={
680 0, // brokerClassification;
681 CMPICurrentVersion,
682 "Pegasus",
683 mbPrepareAttachThread,
684 mbAttachThread,
685 mbDetachThread,
686 mbDeliverIndication,
687 mbEnumInstanceNames,
688 mbGetInstance,
689 mbCreateInstance,
|
690 konrad.r 1.20 mbModifyInstance,
|
691 schuur 1.1 mbDeleteInstance,
692 mbExecQuery,
693 mbEnumInstances,
694 mbAssociators,
695 mbAssociatorNames,
696 mbReferences,
697 mbReferenceNames,
698 mbInvokeMethod,
699 mbSetProperty,
700 mbGetProperty,
701 };
702
703 CMPIBrokerFT *CMPI_Broker_Ftab=& broker_FT;
704
705 PEGASUS_NAMESPACE_END
706
707
|