(file) Return to CMPI_Broker.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / ProviderManager2 / CMPI

  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                  

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2