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 karl 1.27 //
|
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 konrad.r 1.20 static CMPIEnumeration* mbExecQuery(const CMPIBroker *mb,
223 const CMPIContext *ctx,
224 const CMPIObjectPath *cop,
225 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 konrad.r 1.20 static CMPIEnumeration* mbAssociatorNames(const CMPIBroker *mb,
389 const CMPIContext *ctx,
390 const CMPIObjectPath *cop,
391 const char *assocClass,
392 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 konrad.r 1.20 static CMPIData mbInvokeMethod(const CMPIBroker *mb, const CMPIContext *ctx,
510 const CMPIObjectPath *cop, const char *method, const CMPIArgs *in, CMPIArgs *out,
|
511 schuur 1.11 CMPIStatus *rc) {
|
512 konrad.r 1.13 CMPIData data={0,CMPI_nullValue,{0}};
|
513 schuur 1.11 mb=CM_BROKER;
514 if (rc) CMSetStatus(rc,CMPI_RC_ERR_NOT_SUPPORTED);
515 return data;
|
516 schuur 1.1 }
517
|
518 konrad.r 1.20 static CMPIStatus mbSetProperty(const CMPIBroker *mb, const CMPIContext *ctx,
519 const CMPIObjectPath *cop, const char *name, const CMPIValue *val,
|
520 konrad.r 1.24 CMPIType type) {
|
521 schuur 1.11 DDD(cout<<"--- mbSetProperty()"<<endl);
522 mb=CM_BROKER;
523 CMPIrc rc;
524 CIMValue v=value2CIMValue(val,type,&rc);
525
526 AutoMutex mtx(((CMPI_Broker*)mb)->mtx);
527 try {
528 CM_CIMOM(mb)->setProperty(
529 OperationContext(*CM_Context(ctx)),
530 CM_ObjectPath(cop)->getNameSpace(),
531 *CM_ObjectPath(cop),
532 String(name),
533 v);
534 CMReturn(CMPI_RC_OK);
535 }
|
536 konrad.r 1.20 catch (const CIMException &e) {
|
537 schuur 1.11 DDD(cout<<"### exception: mbSetProperty - code: "<<e.getCode()<<" msg: "<<e.getMessage()<<endl);
538 CMReturnWithString((CMPIrc)e.getCode(),
539 (CMPIString*)string2CMPIString(e.getMessage()));
540 }
541 CMReturnWithChars(mb,CMPI_RC_ERROR,"Internal error - CMPIBoker.cpp-12");
|
542 schuur 1.1 }
543
|
544 konrad.r 1.20 static CMPIData mbGetProperty(const CMPIBroker *mb, const CMPIContext *ctx,
545 const CMPIObjectPath *cop, const char *name, CMPIStatus *rc) {
|
546 schuur 1.11 DDD(cout<<"--- mbGetProperty()"<<endl);
547 mb=CM_BROKER;
|
548 konrad.r 1.13 CMPIData data={0,CMPI_nullValue,{0}};
|
549 schuur 1.11
550 AutoMutex mtx(((CMPI_Broker*)mb)->mtx);
551 try {
552 CIMValue v=CM_CIMOM(mb)->getProperty(
553 OperationContext(*CM_Context(ctx)),
554 CM_ObjectPath(cop)->getNameSpace(),
555 *CM_ObjectPath(cop),
556 String(name));
557 CIMType vType=v.getType();
558 CMPIType t=type2CMPIType(vType,v.isArray());
559 value2CMPIData(v,t,&data);
560 if (rc) CMSetStatus(rc,CMPI_RC_OK);
561 return data;
562 }
|
563 konrad.r 1.20 catch (const CIMException &e) {
|
564 schuur 1.11 DDD(cout<<"### exception: mbGetProperty - code: "<<e.getCode()<<" msg: "<<e.getMessage()<<endl);
565 if (rc) CMSetStatus(rc,(CMPIrc)e.getCode());
566 }
567 if (rc) CMSetStatus(rc,CMPI_RC_ERR_FAILED);
|
568 schuur 1.1 return data;
569 }
|
570 schuur 1.11
|
571 konrad.r 1.20 static CMPIContext* mbPrepareAttachThread(const CMPIBroker* mb, const CMPIContext* eCtx) {
|
572 schuur 1.11 DDD(cout<<"--- mbPrepareAttachThread()"<<endl);
573 mb=CM_BROKER;
574 OperationContext *ctx=(OperationContext*)((CMPI_Context*)eCtx)->ctx;
575 OperationContext nctx=*ctx;
576 CMPIContext* neCtx=new CMPI_Context(*(new OperationContext(nctx)));
577 CMPIString *name;
578 for (int i=0,s=CMPI_Args_Ftab->getArgCount((CMPIArgs*)eCtx,NULL); i<s; i++) {
579 CMPIData data=CMPI_Args_Ftab->getArgAt((CMPIArgs*)eCtx,i,&name,NULL);
580 CMPI_Args_Ftab->addArg((CMPIArgs*)neCtx,CMGetCharPtr(name),&data.value,data.type);
581 }
582 return neCtx;
|
583 schuur 1.1 }
584
|
585 konrad.r 1.20 static CMPIStatus mbAttachThread(const CMPIBroker* mb, const CMPIContext* eCtx) {
|
586 schuur 1.11 DDD(cout<<"--- mbAttachThread()"<<endl);
587 ((CMPI_Context*)eCtx)->thr=new CMPI_ThreadContext(mb,eCtx);
588 CMReturn(CMPI_RC_OK);
|
589 schuur 1.1 }
590
|
591 konrad.r 1.20 static CMPIStatus mbDetachThread(const CMPIBroker* mb, const CMPIContext* eCtx) {
|
592 schuur 1.11 DDD(cout<<"--- mbDetachThread()"<<endl);
|
593 konrad.r 1.25 mb=CM_BROKER;
594 CMPI_Context *neCtx = (CMPI_Context *)eCtx;
595 delete neCtx->thr;
596 // Delete also CMPIContext
597 delete neCtx;
|
598 schuur 1.11 CMReturn(CMPI_RC_OK);
599 }
|
600 schuur 1.1
|
601 konrad.r 1.20 static CMPIStatus mbDeliverIndication(const CMPIBroker* eMb, const CMPIContext* ctx,
602 const char *ns, const CMPIInstance* ind) {
|
603 schuur 1.11 DDD(cout<<"--- mbDeliverIndication()"<<endl);
604 eMb=CM_BROKER;
605 CMPI_Broker *mb=(CMPI_Broker*)eMb;
606 CMPIProviderManager::indProvRecord *prec;
607 OperationContext* context=CM_Context(ctx);
608
609 if (CMPIProviderManager::provTab.lookup(mb->name,prec)) {
610 if (prec->enabled) {
611 try {
612 context->get(SubscriptionInstanceNamesContainer::NAME);
613 }
|
614 konrad.r 1.21 catch (const Exception &) {
|
615 schuur 1.11 Array<CIMObjectPath> subscriptionInstanceNames;
616 context->insert(SubscriptionInstanceNamesContainer(subscriptionInstanceNames));
617 }
618 CIMIndication cimIndication(*CM_Instance(ind));
619 AutoMutex mtx(((CMPI_Broker*)mb)->mtx);
620 try {
621 prec->handler->deliver(
622 *context,
623 // OperationContext(*CM_Context(ctx)),
624 cimIndication);
625 CMReturn(CMPI_RC_OK);
626 }
|
627 konrad.r 1.20 catch (const CIMException &e) {
|
628 schuur 1.11 DDD(cout<<"### exception: mbSetProperty - code: "<<e.getCode()<<" msg: "<<e.getMessage()<<endl);
629 CMReturn((CMPIrc)e.getCode());
630 }
|
631 schuur 1.7 }
632 }
|
633 schuur 1.11 CMReturn(CMPI_RC_ERR_FAILED);
|
634 schuur 1.1 }
|
635 schuur 1.11
636 }
|
637 schuur 1.1
638 static CMPIBrokerFT broker_FT={
639 0, // brokerClassification;
640 CMPICurrentVersion,
641 "Pegasus",
642 mbPrepareAttachThread,
643 mbAttachThread,
644 mbDetachThread,
645 mbDeliverIndication,
646 mbEnumInstanceNames,
647 mbGetInstance,
648 mbCreateInstance,
|
649 konrad.r 1.20 mbModifyInstance,
|
650 schuur 1.1 mbDeleteInstance,
651 mbExecQuery,
652 mbEnumInstances,
653 mbAssociators,
654 mbAssociatorNames,
655 mbReferences,
656 mbReferenceNames,
657 mbInvokeMethod,
658 mbSetProperty,
659 mbGetProperty,
660 };
661
662 CMPIBrokerFT *CMPI_Broker_Ftab=& broker_FT;
663
664 PEGASUS_NAMESPACE_END
665
666
|