(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 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                  

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2