1 karl 1.82 //%2006////////////////////////////////////////////////////////////////////////
|
2 marek 1.63 //
3 // 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 // IBM Corp.; EMC Corporation, The Open Group.
7 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
8 // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
9 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
10 // EMC Corporation; VERITAS Software Corporation; The Open Group.
|
11 karl 1.82 // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
12 // EMC Corporation; Symantec Corporation; The Open Group.
|
13 marek 1.63 //
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.82 //
|
21 marek 1.63 // 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 //%/////////////////////////////////////////////////////////////////////////////
33
34 #include "CMPI_Version.h"
35
36 #include "CMPIProviderManager.h"
37
38 #include "CMPI_Object.h"
39 #include "CMPI_Instance.h"
40 #include "CMPI_ObjectPath.h"
41 #include "CMPI_Result.h"
42 marek 1.63 #include "CMPI_SelectExp.h"
43
44 #include <Pegasus/Common/CIMMessage.h>
45 #include <Pegasus/Common/OperationContext.h>
|
46 a.dunfey 1.85 #include <Pegasus/Common/OperationContextInternal.h>
|
47 marek 1.63 #include <Pegasus/Common/Tracer.h>
48 #include <Pegasus/Common/StatisticalData.h>
49 #include <Pegasus/Common/Logger.h>
|
50 kumpf 1.79 #include <Pegasus/Common/LanguageParser.h>
|
51 marek 1.63 #include <Pegasus/Common/MessageLoader.h> //l10n
52 #include <Pegasus/Common/Constants.h>
|
53 thilo.boehm 1.89 #include <Pegasus/Common/FileSystem.h>
|
54 marek 1.63
55 #include <Pegasus/Config/ConfigManager.h>
56
57 #include <Pegasus/Provider/CIMOMHandleQueryContext.h>
|
58 a.dunfey 1.85 #include <Pegasus/ProviderManager2/CIMOMHandleContext.h>
|
59 marek 1.63 #include <Pegasus/ProviderManager2/ProviderName.h>
|
60 kumpf 1.93 #include <Pegasus/ProviderManager2/AutoPThreadSecurity.h>
|
61 marek 1.63 #include <Pegasus/ProviderManager2/CMPI/CMPIProviderModule.h>
62 #include <Pegasus/ProviderManager2/CMPI/CMPIProvider.h>
63
|
64 kumpf 1.93 PEGASUS_USING_STD;
|
65 marek 1.63
66 PEGASUS_NAMESPACE_BEGIN
67
|
68 dave.sudlik 1.96
|
69 marek 1.95 ReadWriteSem CMPIProviderManager::rwSemProvTab;
70 ReadWriteSem CMPIProviderManager::rwSemSelxTab;
|
71 marek 1.63 CMPIProviderManager::IndProvTab CMPIProviderManager::provTab;
72 CMPIProviderManager::IndSelectTab CMPIProviderManager::selxTab;
|
73 marek 1.95
|
74 venkat.puvvada 1.108 class CMPIPropertyList
75 {
76 char **props;
77 int pCount;
78 public:
79 CMPIPropertyList(CIMPropertyList &propertyList) : props(0), pCount(0)
80 {
|
81 ms.aruran 1.115 PEG_METHOD_ENTER(
82 TRC_PROVIDERMANAGER,
83 "CMPIPropertyList::CMPIPropertyList()");
|
84 venkat.puvvada 1.108 if (!propertyList.isNull())
85 {
86 Array<CIMName> p=propertyList.getPropertyNameArray();
87 pCount=p.size();
88 props = new char*[1+pCount];
89 for (int i=0; i<pCount; i++)
90 {
91 props[i]=strdup(p[i].getString().getCString());
92 }
93 props[pCount]=NULL;
94 }
95 else props=NULL;
|
96 ms.aruran 1.115 PEG_METHOD_EXIT();
|
97 venkat.puvvada 1.108 }
98 ~CMPIPropertyList()
99 {
|
100 ms.aruran 1.115 PEG_METHOD_ENTER(
101 TRC_PROVIDERMANAGER,
102 "CMPIPropertyList::~CMPIPropertyList()");
|
103 venkat.puvvada 1.108 if (props)
104 {
105 for (int i=0; i<pCount; i++)
106 free(props[i]);
107 delete [] props;
108 }
|
109 ms.aruran 1.115 PEG_METHOD_EXIT();
|
110 venkat.puvvada 1.108 }
111 char **getList()
112 {
113 return props;
114 }
|
115 marek 1.63 };
116
|
117 marek 1.127 CMPIProviderManager::CMPIProviderManager()
|
118 marek 1.63 {
|
119 ms.aruran 1.115 PEG_METHOD_ENTER(
120 TRC_PROVIDERMANAGER,
121 "CMPIProviderManager::CMPIProviderManager()");
122
|
123 venkat.puvvada 1.108 _subscriptionInitComplete = false;
|
124 ms.aruran 1.115 PEG_TRACE_CSTRING (
125 TRC_PROVIDERMANAGER,
126 Tracer::LEVEL2,
127 "-- CMPI Provider Manager activated");
128 PEG_METHOD_EXIT();
|
129 marek 1.63 }
130
|
131 venkat.puvvada 1.108 CMPIProviderManager::~CMPIProviderManager()
|
132 marek 1.63 {
|
133 ms.aruran 1.115 PEG_METHOD_ENTER(
134 TRC_PROVIDERMANAGER,
135 "CMPIProviderManager::~CMPIProviderManager()");
|
136 venkat.puvvada 1.108 /* Clean up the hash-tables */
|
137 marek 1.63 indProvRecord *prec=NULL;
|
138 marek 1.95 {
139 WriteLock writeLock(rwSemProvTab);
|
140 venkat.puvvada 1.108 for (IndProvTab::Iterator i = provTab.start(); i; i++)
141 {
142 provTab.lookup(i.key(),prec);
143 if (prec->handler)
144 delete prec->handler;
145 delete prec;
146 //Remove is not neccessary, since the hashtable destructor takes
147 //care of this already. But instead removing entries while
148 //iterating the hashtable sometimes causes a segmentation fault!!!
149 //provTab.remove(i.key());
150 prec=NULL;
151 }
|
152 marek 1.95 }
153
|
154 venkat.puvvada 1.108 indSelectRecord *selx=NULL;
|
155 marek 1.95 {
156 WriteLock writeLock(rwSemSelxTab);
|
157 venkat.puvvada 1.108 for (IndSelectTab::Iterator i = selxTab.start(); i; i++)
158 {
159 selxTab.lookup(i.key(), selx);
160 if (selx->eSelx)
161 delete selx->eSelx;
162 if (selx->qContext)
163 delete selx->qContext;
164 delete selx;
165 //Same as above!
166 //selxTab.remove(i.key());
167 selx=NULL;
168 }
|
169 marek 1.95 }
|
170 ms.aruran 1.115 PEG_METHOD_EXIT();
|
171 marek 1.63 }
172
173 Message * CMPIProviderManager::processMessage(Message * request)
174 {
|
175 ms.aruran 1.115 PEG_METHOD_ENTER(
176 TRC_PROVIDERMANAGER,
|
177 marek 1.63 "CMPIProviderManager::processMessage()");
178
179 Message * response = 0;
180
181 // pass the request message to a handler method based on message type
|
182 venkat.puvvada 1.108 switch (request->getType())
|
183 marek 1.63 {
|
184 venkat.puvvada 1.108 case CIM_GET_INSTANCE_REQUEST_MESSAGE:
185 response = handleGetInstanceRequest(request);
|
186 marek 1.63
|
187 venkat.puvvada 1.108 break;
188 case CIM_ENUMERATE_INSTANCES_REQUEST_MESSAGE:
189 response = handleEnumerateInstancesRequest(request);
190
191 break;
192 case CIM_ENUMERATE_INSTANCE_NAMES_REQUEST_MESSAGE:
193 response = handleEnumerateInstanceNamesRequest(request);
194
195 break;
196 case CIM_CREATE_INSTANCE_REQUEST_MESSAGE:
197 response = handleCreateInstanceRequest(request);
198
199 break;
200 case CIM_MODIFY_INSTANCE_REQUEST_MESSAGE:
201 response = handleModifyInstanceRequest(request);
202
203 break;
204 case CIM_DELETE_INSTANCE_REQUEST_MESSAGE:
205 response = handleDeleteInstanceRequest(request);
206
207 break;
208 venkat.puvvada 1.108 case CIM_EXEC_QUERY_REQUEST_MESSAGE:
209 response = handleExecQueryRequest(request);
210
211 break;
212 case CIM_ASSOCIATORS_REQUEST_MESSAGE:
213 response = handleAssociatorsRequest(request);
214
215 break;
216 case CIM_ASSOCIATOR_NAMES_REQUEST_MESSAGE:
217 response = handleAssociatorNamesRequest(request);
218
219 break;
220 case CIM_REFERENCES_REQUEST_MESSAGE:
221 response = handleReferencesRequest(request);
222
223 break;
224 case CIM_REFERENCE_NAMES_REQUEST_MESSAGE:
225 response = handleReferenceNamesRequest(request);
226
227 break;
228 case CIM_INVOKE_METHOD_REQUEST_MESSAGE:
229 venkat.puvvada 1.108 response = handleInvokeMethodRequest(request);
230
231 break;
232 case CIM_CREATE_SUBSCRIPTION_REQUEST_MESSAGE:
233 response = handleCreateSubscriptionRequest(request);
|
234 marek 1.63
|
235 venkat.puvvada 1.108 break;
|
236 marek 1.63 /* case CIM_MODIFY_SUBSCRIPTION_REQUEST_MESSAGE:
237 response = handleModifySubscriptionRequest(request);
238
239 break;
|
240 venkat.puvvada 1.108 */
241 case CIM_DELETE_SUBSCRIPTION_REQUEST_MESSAGE:
242 response = handleDeleteSubscriptionRequest(request);
|
243 marek 1.63
|
244 venkat.puvvada 1.108 break;
|
245 marek 1.63 /* case CIM_EXPORT_INDICATION_REQUEST_MESSAGE:
246 response = handleExportIndicationRequest(request);
247 break;
248 */
|
249 venkat.puvvada 1.108 case CIM_DISABLE_MODULE_REQUEST_MESSAGE:
250 response = handleDisableModuleRequest(request);
|
251 marek 1.63
|
252 venkat.puvvada 1.108 break;
253 case CIM_ENABLE_MODULE_REQUEST_MESSAGE:
254 response = handleEnableModuleRequest(request);
255
256 break;
257 case CIM_STOP_ALL_PROVIDERS_REQUEST_MESSAGE:
258 response = handleStopAllProvidersRequest(request);
259
260 break;
261 case CIM_SUBSCRIPTION_INIT_COMPLETE_REQUEST_MESSAGE:
262 response = handleSubscriptionInitCompleteRequest (request);
263
264 break;
265 case CIM_GET_PROPERTY_REQUEST_MESSAGE:
266 response = handleGetPropertyRequest(request);
267
268 break;
269 case CIM_SET_PROPERTY_REQUEST_MESSAGE:
270 response = handleSetPropertyRequest(request);
271
272 break;
273 venkat.puvvada 1.108 default:
274 response = handleUnsupportedRequest(request);
|
275 marek 1.63
|
276 venkat.puvvada 1.108 break;
|
277 marek 1.63 }
278
279 PEG_METHOD_EXIT();
280
281 return(response);
282 }
283
284 Boolean CMPIProviderManager::hasActiveProviders()
285 {
|
286 venkat.puvvada 1.108 return providerManager.hasActiveProviders();
|
287 marek 1.63 }
288
289 void CMPIProviderManager::unloadIdleProviders()
290 {
|
291 venkat.puvvada 1.108 providerManager.unloadIdleProviders();
|
292 marek 1.63 }
293
|
294 venkat.puvvada 1.140 CIMObjectPath CMPIProviderManager::_getFilterPath(
295 const CIMInstance &instance)
296 {
297 CIMConstProperty filterProperty = instance.getProperty(
298 instance.findProperty (PEGASUS_PROPERTYNAME_FILTER));
299 CIMValue filterValue = filterProperty.getValue();
300 CIMObjectPath filterPath;
301 filterValue.get(filterPath);
302 // Remove host tag
303 filterPath.setHost(String::EMPTY);
304 // Set subscription's namespace if namespace is not found in filter path.
305 if (filterPath.getNameSpace().equal(CIMNamespaceName()))
306 {
307 filterPath.setNameSpace(instance.getPath().getNameSpace());
308 }
309
310 return filterPath;
311 }
|
312 marek 1.63
313 #define CHARS(cstring) (char*)(strlen(cstring)?(const char*)cstring:NULL)
314
315
|
316 kumpf 1.92 #define HandlerIntroBase(type,type1,message,request,response,handler) \
|
317 marek 1.63 CIM##type##RequestMessage * request = \
|
318 venkat.puvvada 1.108 dynamic_cast<CIM##type##RequestMessage *>(const_cast<Message *> \
319 (message)); \
|
320 marek 1.63 PEGASUS_ASSERT(request != 0); \
321 CIM##type##ResponseMessage * response = \
|
322 kumpf 1.92 dynamic_cast<CIM##type##ResponseMessage*>(request->buildResponse()); \
|
323 marek 1.63 PEGASUS_ASSERT(response != 0); \
|
324 kumpf 1.84 type1##ResponseHandler handler(request, response, _responseChunkCallback);
|
325 marek 1.63
326 #define HandlerIntroInd(type,message,request,response,handler) \
|
327 kumpf 1.92 HandlerIntroBase(type,Operation,message,request,response,handler)
|
328 marek 1.63
329 #define HandlerIntroInit(type,message,request,response,handler) \
|
330 kumpf 1.92 HandlerIntroBase(type,Operation,message,request,response,handler)
|
331 marek 1.63
|
332 kumpf 1.92 #define HandlerIntro(type,message,request,response,handler) \
333 HandlerIntroBase(type,type,message,request,response,handler)
|
334 marek 1.63
335 #define HandlerCatch(handler) \
|
336 konrad.r 1.64 catch(const CIMException & e) \
|
337 thilo.boehm 1.138 { PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL1, \
338 "CIMException: %s",(const char*)e.getMessage().getCString())); \
|
339 dave.sudlik 1.103 handler.setCIMException(e); \
|
340 marek 1.63 } \
|
341 konrad.r 1.64 catch(const Exception & e) \
|
342 thilo.boehm 1.138 { PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL1, \
343 "Exception: %s",(const char*)e.getMessage().getCString())); \
|
344 venkat.puvvada 1.108 handler.setStatus(CIM_ERR_FAILED, e.getContentLanguages(), \
345 e.getMessage()); \
|
346 marek 1.63 } \
347 catch(...) \
|
348 marek 1.131 { PEG_TRACE_CSTRING(TRC_PROVIDERMANAGER, Tracer::LEVEL1, \
|
349 marek 1.63 "Exception: Unknown"); \
350 handler.setStatus(CIM_ERR_FAILED, "Unknown error."); \
351 }
352
|
353 marek 1.124 void CMPIProviderManager::_setupCMPIContexts(
354 CMPI_ContextOnStack * eCtx,
355 OperationContext * context,
356 ProviderIdContainer * pidc,
357 const String &nameSpace,
358 Boolean remote,
359 Boolean includeQualifiers,
360 Boolean includeClassOrigin,
361 Boolean setFlags)
362 {
363 if (setFlags)
364 {
365 // set CMPI invocation flags
|
366 kumpf 1.125 CMPIValue value;
367 value.uint32 = 0;
368 if (includeQualifiers) value.uint32 |= CMPI_FLAG_IncludeQualifiers;
369 if (includeClassOrigin) value.uint32 |= CMPI_FLAG_IncludeClassOrigin;
|
370 marek 1.124 eCtx->ft->addEntry(
371 eCtx,
372 CMPIInvocationFlags,
|
373 kumpf 1.125 &value,
|
374 marek 1.124 CMPI_uint32);
375 }
376
377 // add identity context
378 const IdentityContainer container =
379 context->get(IdentityContainer::NAME);
380 eCtx->ft->addEntry(
381 eCtx,
382 CMPIPrincipal,
383 (CMPIValue*)(const char*)container.getUserName().getCString(),
384 CMPI_chars);
385
386 // add AcceptLanguages to CMPI context
387 const AcceptLanguageListContainer accept_language=
388 context->get(AcceptLanguageListContainer::NAME);
389 const AcceptLanguageList acceptLangs = accept_language.getLanguages();
390
391 eCtx->ft->addEntry(
392 eCtx,
393 CMPIAcceptLanguage,
394 (CMPIValue*)(const char*)
395 marek 1.124 LanguageParser::buildAcceptLanguageHeader(acceptLangs).getCString(),
396 CMPI_chars);
397
398 // add initial namespace to context
399 eCtx->ft->addEntry(
400 eCtx,
401 CMPIInitNameSpace,
402 (CMPIValue*)(const char*)nameSpace.getCString(),
403 CMPI_chars);
404
405 // add remote info to context
406 if (remote)
407 {
408 CString info=pidc->getRemoteInfo().getCString();
409 eCtx->ft->addEntry(
410 eCtx,
411 "CMPIRRemoteInfo",(CMPIValue*)(const char*)info,
412 CMPI_chars);
413 }
414 }
415
|
416 venkat.puvvada 1.108 Message * CMPIProviderManager::handleGetInstanceRequest(
417 const Message * message)
|
418 marek 1.63 {
|
419 ms.aruran 1.115 PEG_METHOD_ENTER(
420 TRC_PROVIDERMANAGER,
421 "CMPIProviderManager::handleGetInstanceRequest()");
|
422 marek 1.63
|
423 kumpf 1.92 HandlerIntro(GetInstance,message,request,response,handler);
|
424 marek 1.63
|
425 venkat.puvvada 1.108 try
426 {
|
427 thilo.boehm 1.138 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL3,
|
428 marek 1.129 "CMPIProviderManager::handleGetInstanceRequest - Host name:"
429 " %s Name space: %s Class name: %s",
430 (const char*) System::getHostName().getCString(),
431 (const char*) request->nameSpace.getString().getCString(),
432 (const char*)
433 request->instanceName.getClassName().getString().getCString()));
434
|
435 marek 1.63 // make target object path
436 CIMObjectPath objectPath(
437 System::getHostName(),
438 request->nameSpace,
439 request->instanceName.getClassName(),
440 request->instanceName.getKeyBindings());
441
442 Boolean remote=false;
|
443 venkat.puvvada 1.132 OpProviderHolder ph;
|
444 marek 1.63
445 // resolve provider name
|
446 venkat.puvvada 1.108 ProviderIdContainer pidc =
447 request->operationContext.get(ProviderIdContainer::NAME);
448
|
449 marek 1.63 ProviderName name = _resolveProviderName(pidc);
450
|
451 venkat.puvvada 1.108 if ((remote=pidc.isRemoteNameSpace()))
452 {
453 ph = providerManager.getRemoteProvider(
454 name.getLocation(), name.getLogicalName());
|
455 a.dunfey 1.85 }
|
456 venkat.puvvada 1.108 else
457 {
|
458 a.dunfey 1.85 // get cached or load new provider module
|
459 venkat.puvvada 1.108 ph = providerManager.getProvider(
460 name.getPhysicalName(), name.getLogicalName());
|
461 marek 1.63 }
462
463 // convert arguments
464 OperationContext context;
465
466 context.insert(request->operationContext.get(IdentityContainer::NAME));
|
467 venkat.puvvada 1.108 context.insert(
468 request->operationContext.get(AcceptLanguageListContainer::NAME));
469 context.insert(
470 request->operationContext.get(ContentLanguageListContainer::NAME));
|
471 marek 1.63 // forward request
472 CMPIProvider & pr=ph.GetProvider();
473
|
474 a.dunfey 1.85 #ifdef PEGASUS_EMBEDDED_INSTANCE_SUPPORT
|
475 venkat.puvvada 1.121 AutoPtr<NormalizerContext> tmpNormalizerContext(
|
476 venkat.puvvada 1.132 new CIMOMHandleContext(*pr.getCIMOMHandle()));
|
477 venkat.puvvada 1.121 request->operationContext.insert(
478 NormalizerContextContainer(tmpNormalizerContext));
479 #endif
|
480 a.dunfey 1.85
|
481 thilo.boehm 1.138 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL4,
482 "Calling provider.getInstance: %s",
483 (const char*)pr.getName().getCString()));
|
484 marek 1.63
485 CMPIStatus rc={CMPI_RC_OK,NULL};
486 CMPI_ContextOnStack eCtx(context);
487 CMPI_ObjectPathOnStack eRef(objectPath);
|
488 venkat.puvvada 1.132 CMPI_ResultOnStack eRes(handler,pr.getBroker());
489 CMPI_ThreadContext thr(pr.getBroker(),&eCtx);
|
490 marek 1.63
491 CMPIPropertyList props(request->propertyList);
|
492 marek 1.124
493 _setupCMPIContexts(
|
494 venkat.puvvada 1.108 &eCtx,
|
495 marek 1.124 &context,
496 &pidc,
497 request->nameSpace.getString(),
498 remote,
499 request->includeQualifiers,
500 request->includeClassOrigin,
501 true);
|
502 marek 1.63
503 CMPIProvider::pm_service_op_lock op_lock(&pr);
504
|
505 r.kieninger 1.119 AutoPThreadSecurity threadLevelSecurity(request->operationContext);
|
506 marek 1.63
|
507 kumpf 1.92 {
508 StatProviderTimeMeasurement providerTime(response);
|
509 marek 1.63
|
510 venkat.puvvada 1.132 rc = pr.getInstMI()->ft->getInstance(
511 pr.getInstMI(),
|
512 venkat.puvvada 1.108 &eCtx,
513 &eRes,
514 &eRef,
|
515 kumpf 1.92 (const char **)props.getList());
516 }
|
517 marek 1.63
|
518 dave.sudlik 1.99 // Need to save ContentLanguage value into operation context of response
519 // Do this before checking rc from provider to throw exception in case
520 // rc.msg is also localized.
521 CMPIStatus tmprc={CMPI_RC_OK,NULL};
|
522 venkat.puvvada 1.108 CMPIData cldata =
523 eCtx.ft->getEntry (&eCtx, CMPIContentLanguage, &tmprc);
|
524 dave.sudlik 1.99 if (tmprc.rc == CMPI_RC_OK)
525 {
526 response->operationContext.set(
527 ContentLanguageListContainer(
|
528 venkat.puvvada 1.108 ContentLanguageList(
529 LanguageParser::parseContentLanguageHeader(
|
530 s.kodali 1.137 CMGetCharsPtr(cldata.value.string, NULL)))));
|
531 dave.sudlik 1.103 handler.setContext(response->operationContext);
|
532 dave.sudlik 1.99 }
533
|
534 marek 1.63 if (rc.rc!=CMPI_RC_OK)
|
535 dave.sudlik 1.102 {
|
536 venkat.puvvada 1.108 CIMException cimException(
537 (CIMStatusCode)rc.rc,
|
538 s.kodali 1.137 rc.msg ? CMGetCharsPtr(rc.msg, NULL) : String::EMPTY);
|
539 venkat.puvvada 1.108
540 if (eRes.resError)
541 {
542 for (CMPI_Error* currErr=eRes.resError;
|
543 dave.sudlik 1.102 currErr!=NULL;
544 currErr=currErr->nextError)
|
545 venkat.puvvada 1.108 {
546 cimException.addError(
547 ((CIMError*)currErr->hdl)->getInstance());
548 }
549 }
550 throw cimException;
|
551 dave.sudlik 1.102 }
|
552 marek 1.63 }
553 HandlerCatch(handler);
554
555 PEG_METHOD_EXIT();
556
557 return(response);
558 }
559
|
560 venkat.puvvada 1.108 Message * CMPIProviderManager::handleEnumerateInstancesRequest(
561 const Message * message)
|
562 marek 1.63 {
|
563 ms.aruran 1.115 PEG_METHOD_ENTER(
564 TRC_PROVIDERMANAGER,
565 "CMPIProviderManager::handleEnumerateInstanceRequest()");
|
566 marek 1.63
|
567 kumpf 1.92 HandlerIntro(EnumerateInstances,message,request,response,handler);
|
568 venkat.puvvada 1.108 try
569 {
|
570 thilo.boehm 1.138 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL3,
|
571 venkat.puvvada 1.108 "CMPIProviderManager::handleEnumerateInstancesRequest - Host name:"
|
572 marek 1.129 " %s Name space: %s Class name: %s",
573 (const char*) System::getHostName().getCString(),
574 (const char*) request->nameSpace.getString().getCString(),
575 (const char*) request->className.getString().getCString()));
|
576 marek 1.63
577 // make target object path
578 CIMObjectPath objectPath(
579 System::getHostName(),
580 request->nameSpace,
581 request->className);
582
583 Boolean remote=false;
|
584 venkat.puvvada 1.132 OpProviderHolder ph;
|
585 marek 1.63
586 // resolve provider name
|
587 venkat.puvvada 1.108 ProviderIdContainer pidc =
588 request->operationContext.get(ProviderIdContainer::NAME);
|
589 marek 1.63 ProviderName name = _resolveProviderName(pidc);
590
|
591 venkat.puvvada 1.108 if ((remote=pidc.isRemoteNameSpace()))
592 {
593 ph = providerManager.getRemoteProvider(
594 name.getLocation(), name.getLogicalName());
595 }
596 else
597 {
598 // get cached or load new provider module
599 ph = providerManager.getProvider(
600 name.getPhysicalName(), name.getLogicalName());
|
601 marek 1.63 }
602
603 // convert arguments
604 OperationContext context;
605
606 context.insert(request->operationContext.get(IdentityContainer::NAME));
|
607 venkat.puvvada 1.108 context.insert(
608 request->operationContext.get(AcceptLanguageListContainer::NAME));
609 context.insert(
610 request->operationContext.get(ContentLanguageListContainer::NAME));
|
611 marek 1.63
612 CIMPropertyList propertyList(request->propertyList);
613
614 // forward request
615 CMPIProvider & pr=ph.GetProvider();
616
|
617 a.dunfey 1.85 #ifdef PEGASUS_EMBEDDED_INSTANCE_SUPPORT
|
618 venkat.puvvada 1.121 AutoPtr<NormalizerContext> tmpNormalizerContext(
|
619 venkat.puvvada 1.132 new CIMOMHandleContext(*pr.getCIMOMHandle()));
|
620 venkat.puvvada 1.121 request->operationContext.insert(
621 NormalizerContextContainer(tmpNormalizerContext));
622 #endif
|
623 a.dunfey 1.85
|
624 thilo.boehm 1.138 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL4,
625 "Calling provider.enumerateInstances: %s",
626 (const char*)pr.getName().getCString()));
|
627 marek 1.63
628 CMPIStatus rc={CMPI_RC_OK,NULL};
629 CMPI_ContextOnStack eCtx(context);
630 CMPI_ObjectPathOnStack eRef(objectPath);
|
631 venkat.puvvada 1.132 CMPI_ResultOnStack eRes(handler,pr.getBroker());
632 CMPI_ThreadContext thr(pr.getBroker(),&eCtx);
|
633 marek 1.63
634 CMPIPropertyList props(propertyList);
635
|
636 marek 1.124 _setupCMPIContexts(
|
637 venkat.puvvada 1.108 &eCtx,
|
638 marek 1.124 &context,
639 &pidc,
640 request->nameSpace.getString(),
641 remote,
642 request->includeQualifiers,
643 request->includeClassOrigin,
644 true);
|
645 marek 1.63
646 CMPIProvider::pm_service_op_lock op_lock(&pr);
647
|
648 r.kieninger 1.119 AutoPThreadSecurity threadLevelSecurity(request->operationContext);
|
649 marek 1.63
|
650 kumpf 1.92 {
651 StatProviderTimeMeasurement providerTime(response);
|
652 marek 1.63
|
653 venkat.puvvada 1.132 rc = pr.getInstMI()->ft->enumerateInstances(
654 pr.getInstMI(),
|
655 venkat.puvvada 1.108 &eCtx,
656 &eRes,
657 &eRef,
|
658 kumpf 1.92 (const char **)props.getList());
659 }
|
660 marek 1.63
|
661 dave.sudlik 1.99 // Need to save ContentLanguage value into operation context of response
662 // Do this before checking rc from provider to throw exception in case
663 // rc.msg is also localized.
664 CMPIStatus tmprc={CMPI_RC_OK,NULL};
|
665 venkat.puvvada 1.108 CMPIData cldata =
666 eCtx.ft->getEntry(&eCtx, CMPIContentLanguage, &tmprc);
|
667 dave.sudlik 1.99 if (tmprc.rc == CMPI_RC_OK)
668 {
669 response->operationContext.set(
670 ContentLanguageListContainer(
|
671 venkat.puvvada 1.108 ContentLanguageList(
672 LanguageParser::parseContentLanguageHeader(
|
673 s.kodali 1.137 CMGetCharsPtr(cldata.value.string, NULL)))));
|
674 dave.sudlik 1.103 handler.setContext(response->operationContext);
|
675 dave.sudlik 1.99 }
676
|
677 marek 1.63 if (rc.rc!=CMPI_RC_OK)
|
678 dave.sudlik 1.102 {
|
679 venkat.puvvada 1.108 CIMException cimException(
680 (CIMStatusCode)rc.rc,
|
681 s.kodali 1.137 rc.msg ? CMGetCharsPtr(rc.msg, NULL) : String::EMPTY);
|
682 venkat.puvvada 1.108
683 if (eRes.resError)
684 {
685 for (CMPI_Error* currErr=eRes.resError;
|
686 dave.sudlik 1.102 currErr!=NULL;
687 currErr=currErr->nextError)
|
688 venkat.puvvada 1.108 {
689 cimException.addError(
690 ((CIMError*)currErr->hdl)->getInstance());
691 }
692 }
693 throw cimException;
|
694 dave.sudlik 1.102 }
695
|
696 marek 1.63 }
697 HandlerCatch(handler);
698
699 PEG_METHOD_EXIT();
700
701 return(response);
702 }
703
|
704 venkat.puvvada 1.108 Message * CMPIProviderManager::handleEnumerateInstanceNamesRequest(
705 const Message * message)
|
706 marek 1.63 {
|
707 ms.aruran 1.115 PEG_METHOD_ENTER(
708 TRC_PROVIDERMANAGER,
709 "CMPIProviderManager::handleEnumerateInstanceNamesRequest()");
|
710 marek 1.63
|
711 kumpf 1.92 HandlerIntro(EnumerateInstanceNames,message,request,response,handler);
|
712 venkat.puvvada 1.108 try
713 {
|
714 thilo.boehm 1.138 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL3,
|
715 marek 1.129 "CMPIProviderManager::handleEnumerateInstanceNamesRequest"
716 " - Host name: %s Name space: %s Class name: %s",
717 (const char*) System::getHostName().getCString(),
718 (const char*) request->nameSpace.getString().getCString(),
719 (const char*) request->className.getString().getCString()));
|
720 marek 1.63
|
721 venkat.puvvada 1.108 // make target object path
|
722 marek 1.63 CIMObjectPath objectPath(
723 System::getHostName(),
724 request->nameSpace,
725 request->className);
726
727 Boolean remote=false;
|
728 venkat.puvvada 1.132 OpProviderHolder ph;
|
729 marek 1.63
730 // resolve provider name
|
731 venkat.puvvada 1.108 ProviderIdContainer pidc =
732 request->operationContext.get(ProviderIdContainer::NAME);
|
733 marek 1.63 ProviderName name = _resolveProviderName(pidc);
734
|
735 venkat.puvvada 1.108 if ((remote=pidc.isRemoteNameSpace()))
736 {
737 ph = providerManager.getRemoteProvider(
738 name.getLocation(), name.getLogicalName());
|
739 marek 1.63 }
|
740 venkat.puvvada 1.108 else
741 {
742 // get cached or load new provider module
743 ph = providerManager.getProvider(
744 name.getPhysicalName(), name.getLogicalName());
|
745 marek 1.63 }
746
747 // convert arguments
748 OperationContext context;
749
750 context.insert(request->operationContext.get(IdentityContainer::NAME));
|
751 venkat.puvvada 1.108 context.insert(
752 request->operationContext.get(AcceptLanguageListContainer::NAME));
753 context.insert(
754 request->operationContext.get(ContentLanguageListContainer::NAME));
|
755 marek 1.63 CMPIProvider & pr=ph.GetProvider();
756
|
757 thilo.boehm 1.138 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL4,
758 "Calling provider.enumerateInstanceNames: %s",
759 (const char*)pr.getName().getCString()));
|
760 marek 1.63
761 CMPIStatus rc={CMPI_RC_OK,NULL};
762 CMPI_ContextOnStack eCtx(context);
763 CMPI_ObjectPathOnStack eRef(objectPath);
|
764 venkat.puvvada 1.132 CMPI_ResultOnStack eRes(handler,pr.getBroker());
765 CMPI_ThreadContext thr(pr.getBroker(),&eCtx);
|
766 marek 1.63
|
767 marek 1.124 _setupCMPIContexts(
|
768 venkat.puvvada 1.108 &eCtx,
|
769 marek 1.124 &context,
770 &pidc,
771 request->nameSpace.getString(),
772 remote,
773 false,
774 false,
775 true);
|
776 marek 1.63
777 CMPIProvider::pm_service_op_lock op_lock(&pr);
778
|
779 r.kieninger 1.119 AutoPThreadSecurity threadLevelSecurity(request->operationContext);
|
780 venkat.puvvada 1.108
|
781 kumpf 1.92 {
782 StatProviderTimeMeasurement providerTime(response);
|
783 marek 1.63
|
784 venkat.puvvada 1.132 rc = pr.getInstMI()->ft->enumerateInstanceNames(
785 pr.getInstMI(),
786 &eCtx,
787 &eRes,
788 &eRef);
|
789 kumpf 1.92 }
|
790 marek 1.63
|
791 dave.sudlik 1.99 // Need to save ContentLanguage value into operation context of response
792 // Do this before checking rc from provider to throw exception in case
793 // rc.msg is also localized.
794 CMPIStatus tmprc={CMPI_RC_OK,NULL};
|
795 venkat.puvvada 1.108 CMPIData cldata =
796 eCtx.ft->getEntry (&eCtx, CMPIContentLanguage, &tmprc);
|
797 dave.sudlik 1.99 if (tmprc.rc == CMPI_RC_OK)
798 {
799 response->operationContext.set(
800 ContentLanguageListContainer(
|
801 venkat.puvvada 1.108 ContentLanguageList(
802 LanguageParser::parseContentLanguageHeader(
|
803 s.kodali 1.137 CMGetCharsPtr(cldata.value.string, NULL)))));
|
804 dave.sudlik 1.103 handler.setContext(response->operationContext);
|
805 dave.sudlik 1.99 }
806
|
807 marek 1.63 if (rc.rc!=CMPI_RC_OK)
|
808 dave.sudlik 1.102 {
|
809 venkat.puvvada 1.108 CIMException cimException(
810 (CIMStatusCode)rc.rc,
|
811 s.kodali 1.137 rc.msg ? CMGetCharsPtr(rc.msg, NULL) : String::EMPTY);
|
812 venkat.puvvada 1.108
813 if (eRes.resError)
814 {
815 for (CMPI_Error* currErr=eRes.resError;
|
816 dave.sudlik 1.102 currErr!=NULL;
817 currErr=currErr->nextError)
|
818 venkat.puvvada 1.108 {
819 cimException.addError(
820 ((CIMError*)currErr->hdl)->getInstance());
821 }
822 }
823 throw cimException;
|
824 dave.sudlik 1.102 }
|
825 marek 1.63 }
826 HandlerCatch(handler);
827
828 PEG_METHOD_EXIT();
829
830 return(response);
831 }
832
|
833 venkat.puvvada 1.108 Message * CMPIProviderManager::handleCreateInstanceRequest(
834 const Message * message)
|
835 marek 1.63 {
|
836 ms.aruran 1.115 PEG_METHOD_ENTER(
837 TRC_PROVIDERMANAGER,
838 "CMPIProviderManager::handleCreateInstanceRequest()");
|
839 marek 1.63
|
840 kumpf 1.92 HandlerIntro(CreateInstance,message,request,response,handler);
|
841 venkat.puvvada 1.108 try
842 {
|
843 thilo.boehm 1.138 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL3,
|
844 marek 1.129 "CMPIProviderManager::handleCreateInstanceRequest"
845 " - Host name: %s Name space: %s Class name: %s",
846 (const char*) System::getHostName().getCString(),
847 (const char*) request->nameSpace.getString().getCString(),
848 (const char*)
849 request->newInstance.getPath().getClassName().getString().getCString()
850 ));
|
851 marek 1.63
852 // make target object path
853 CIMObjectPath objectPath(
854 System::getHostName(),
855 request->nameSpace,
856 request->newInstance.getPath().getClassName(),
857 request->newInstance.getPath().getKeyBindings());
|
858 venkat.puvvada 1.108 request->newInstance.setPath(objectPath);
|
859 marek 1.63
860 Boolean remote=false;
|
861 venkat.puvvada 1.132 OpProviderHolder ph;
|
862 marek 1.63
863 // resolve provider name
|
864 venkat.puvvada 1.108 ProviderIdContainer pidc =
865 request->operationContext.get(ProviderIdContainer::NAME);
|
866 marek 1.63 ProviderName name = _resolveProviderName(pidc);
867
|
868 venkat.puvvada 1.108 if ((remote=pidc.isRemoteNameSpace()))
869 {
870 ph = providerManager.getRemoteProvider(
871 name.getLocation(), name.getLogicalName());
872 }
873 else
874 {
875 // get cached or load new provider module
876 ph = providerManager.getProvider(
877 name.getPhysicalName(), name.getLogicalName());
|
878 marek 1.63 }
879
880 // convert arguments
881 OperationContext context;
882
883 context.insert(request->operationContext.get(IdentityContainer::NAME));
|
884 venkat.puvvada 1.108 context.insert(
885 request->operationContext.get(AcceptLanguageListContainer::NAME));
886 context.insert(
887 request->operationContext.get(ContentLanguageListContainer::NAME));
|
888 marek 1.63 // forward request
889 CMPIProvider & pr=ph.GetProvider();
890
|
891 thilo.boehm 1.138 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL4,
892 "Calling provider.createInstance: %s",
893 (const char*)ph.GetProvider().getName().getCString()));
|
894 marek 1.63
895 CMPIStatus rc={CMPI_RC_OK,NULL};
896 CMPI_ContextOnStack eCtx(context);
897 CMPI_ObjectPathOnStack eRef(objectPath);
|
898 venkat.puvvada 1.132 CMPI_ResultOnStack eRes(handler,pr.getBroker());
|
899 marek 1.63 CMPI_InstanceOnStack eInst(request->newInstance);
|
900 venkat.puvvada 1.132 CMPI_ThreadContext thr(pr.getBroker(),&eCtx);
|
901 marek 1.63
|
902 marek 1.124 _setupCMPIContexts(
|
903 venkat.puvvada 1.108 &eCtx,
|
904 marek 1.124 &context,
905 &pidc,
906 request->nameSpace.getString(),
907 remote,
908 false,
909 false,
910 true);
|
911 marek 1.63
912 CMPIProvider::pm_service_op_lock op_lock(&pr);
913
|
914 r.kieninger 1.119 AutoPThreadSecurity threadLevelSecurity(request->operationContext);
|
915 marek 1.63
|
916 kumpf 1.92 {
917 StatProviderTimeMeasurement providerTime(response);
|
918 marek 1.63
|
919 venkat.puvvada 1.132 rc = pr.getInstMI()->ft->createInstance(
920 pr.getInstMI(),
921 &eCtx,
922 &eRes,
923 &eRef,
924 &eInst);
|
925 kumpf 1.92 }
|
926 marek 1.63
|
927 dave.sudlik 1.99 // Need to save ContentLanguage value into operation context of response
928 // Do this before checking rc from provider to throw exception in case
929 // rc.msg is also localized.
930 CMPIStatus tmprc={CMPI_RC_OK,NULL};
|
931 venkat.puvvada 1.108 CMPIData cldata =
932 eCtx.ft->getEntry (&eCtx, CMPIContentLanguage, &tmprc);
|
933 dave.sudlik 1.99 if (tmprc.rc == CMPI_RC_OK)
934 {
935 response->operationContext.set(
936 ContentLanguageListContainer(
|
937 venkat.puvvada 1.108 ContentLanguageList(
938 LanguageParser::parseContentLanguageHeader(
|
939 s.kodali 1.137 CMGetCharsPtr(cldata.value.string, NULL)))));
|
940 dave.sudlik 1.103 handler.setContext(response->operationContext);
|
941 dave.sudlik 1.99 }
942
|
943 marek 1.63 if (rc.rc!=CMPI_RC_OK)
|
944 dave.sudlik 1.102 {
|
945 venkat.puvvada 1.108 CIMException cimException(
946 (CIMStatusCode)rc.rc,
|
947 s.kodali 1.137 rc.msg ? CMGetCharsPtr(rc.msg, NULL) : String::EMPTY);
|
948 venkat.puvvada 1.108
949 if (eRes.resError)
950 {
951 for (CMPI_Error* currErr=eRes.resError;
|
952 dave.sudlik 1.102 currErr!=NULL;
953 currErr=currErr->nextError)
|
954 venkat.puvvada 1.108 {
955 cimException.addError(
956 ((CIMError*)currErr->hdl)->getInstance());
957 }
958 }
959 throw cimException;
|
960 dave.sudlik 1.102 }
|
961 marek 1.63 }
962 HandlerCatch(handler);
963
964 PEG_METHOD_EXIT();
965
966 return(response);
967 }
968
|
969 venkat.puvvada 1.108 Message * CMPIProviderManager::handleModifyInstanceRequest(
970 const Message * message)
|
971 marek 1.63 {
|
972 ms.aruran 1.115 PEG_METHOD_ENTER(
973 TRC_PROVIDERMANAGER,
974 "CMPIProviderManager::handleModifyInstanceRequest()");
|
975 marek 1.63
|
976 kumpf 1.92 HandlerIntro(ModifyInstance,message,request,response,handler);
|
977 venkat.puvvada 1.108 try
978 {
|
979 thilo.boehm 1.138 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL3,
|
980 marek 1.129 "CMPIProviderManager::handleModifyInstanceRequest"
981 " - Host name: %s Name space: %s Class name: %s",
982 (const char*) System::getHostName().getCString(),
983 (const char*) request->nameSpace.getString().getCString(),
984 (const char*) request->modifiedInstance.\
985 getPath().getClassName().getString().getCString()));
|
986 marek 1.63
987 // make target object path
988 CIMObjectPath objectPath(
989 System::getHostName(),
990 request->nameSpace,
991 request->modifiedInstance.getPath ().getClassName(),
992 request->modifiedInstance.getPath ().getKeyBindings());
993
994 Boolean remote=false;
|
995 venkat.puvvada 1.132 OpProviderHolder ph;
|
996 marek 1.63
997 // resolve provider name
|
998 venkat.puvvada 1.108 ProviderIdContainer pidc =
999 request->operationContext.get(ProviderIdContainer::NAME);
|
1000 marek 1.63 ProviderName name = _resolveProviderName(pidc);
1001
|
1002 venkat.puvvada 1.108 if ((remote=pidc.isRemoteNameSpace()))
1003 {
1004 ph = providerManager.getRemoteProvider(
1005 name.getLocation(), name.getLogicalName());
|
1006 marek 1.63 }
|
1007 venkat.puvvada 1.108 else
1008 {
1009 // get cached or load new provider module
1010 ph = providerManager.getProvider(
1011 name.getPhysicalName(), name.getLogicalName());
|
1012 marek 1.63 }
1013
1014 // convert arguments
1015 OperationContext context;
1016
1017 context.insert(request->operationContext.get(IdentityContainer::NAME));
|
1018 venkat.puvvada 1.108 context.insert(
1019 request->operationContext.get(AcceptLanguageListContainer::NAME));
1020 context.insert(
1021 request->operationContext.get(ContentLanguageListContainer::NAME));
|
1022 marek 1.63 // forward request
1023 CMPIProvider & pr=ph.GetProvider();
1024
|
1025 thilo.boehm 1.138 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL4,
1026 "Calling provider.modifyInstance: %s",
1027 (const char*)pr.getName().getCString()));
|
1028 marek 1.63
1029 CMPIStatus rc={CMPI_RC_OK,NULL};
1030 CMPI_ContextOnStack eCtx(context);
1031 CMPI_ObjectPathOnStack eRef(objectPath);
|
1032 venkat.puvvada 1.132 CMPI_ResultOnStack eRes(handler,pr.getBroker());
|
1033 marek 1.63 CMPI_InstanceOnStack eInst(request->modifiedInstance);
|
1034 venkat.puvvada 1.132 CMPI_ThreadContext thr(pr.getBroker(),&eCtx);
|
1035 marek 1.63
1036 CMPIPropertyList props(request->propertyList);
1037
|
1038 marek 1.124 _setupCMPIContexts(
|
1039 venkat.puvvada 1.108 &eCtx,
|
1040 marek 1.124 &context,
1041 &pidc,
1042 request->nameSpace.getString(),
1043 remote,
1044 request->includeQualifiers,
1045 false,
1046 true);
|
1047 marek 1.63
1048 CMPIProvider::pm_service_op_lock op_lock(&pr);
1049
|
1050 r.kieninger 1.119 AutoPThreadSecurity threadLevelSecurity(request->operationContext);
|
1051 marek 1.63
|
1052 kumpf 1.92 {
1053 StatProviderTimeMeasurement providerTime(response);
|
1054 marek 1.63
|
1055 venkat.puvvada 1.132 rc = pr.getInstMI()->ft->modifyInstance(
1056 pr.getInstMI(),
1057 &eCtx,
1058 &eRes,
1059 &eRef,
1060 &eInst,
|
1061 kumpf 1.92 (const char **)props.getList());
1062 }
|
1063 marek 1.63
|
1064 dave.sudlik 1.99 // Need to save ContentLanguage value into operation context of response
1065 // Do this before checking rc from provider to throw exception in case
1066 // rc.msg is also localized.
1067 CMPIStatus tmprc={CMPI_RC_OK,NULL};
|
1068 venkat.puvvada 1.108 CMPIData cldata =
1069 eCtx.ft->getEntry (&eCtx, CMPIContentLanguage, &tmprc);
|
1070 dave.sudlik 1.99 if (tmprc.rc == CMPI_RC_OK)
1071 {
1072 response->operationContext.set(
1073 ContentLanguageListContainer(
|
1074 venkat.puvvada 1.108 ContentLanguageList(
1075 LanguageParser::parseContentLanguageHeader(
|
1076 s.kodali 1.137 CMGetCharsPtr(cldata.value.string, NULL)))));
|
1077 dave.sudlik 1.103 handler.setContext(response->operationContext);
|
1078 dave.sudlik 1.99 }
1079
|
1080 marek 1.63 if (rc.rc!=CMPI_RC_OK)
|
1081 dave.sudlik 1.102 {
|
1082 venkat.puvvada 1.108 CIMException cimException(
1083 (CIMStatusCode)rc.rc,
|
1084 s.kodali 1.137 rc.msg ? CMGetCharsPtr(rc.msg, NULL) : String::EMPTY);
|
1085 venkat.puvvada 1.108
1086 if (eRes.resError)
1087 {
1088 for (CMPI_Error* currErr=eRes.resError;
|
1089 dave.sudlik 1.102 currErr!=NULL;
1090 currErr=currErr->nextError)
|
1091 venkat.puvvada 1.108 {
1092 cimException.addError(
1093 ((CIMError*)currErr->hdl)->getInstance());
1094 }
1095 }
1096 throw cimException;
|
1097 dave.sudlik 1.102 }
|
1098 marek 1.63 }
1099 HandlerCatch(handler);
1100
1101 PEG_METHOD_EXIT();
1102
1103 return(response);
1104 }
1105
|
1106 venkat.puvvada 1.108 Message * CMPIProviderManager::handleDeleteInstanceRequest(
1107 const Message * message)
|
1108 marek 1.63 {
|
1109 ms.aruran 1.115 PEG_METHOD_ENTER(
1110 TRC_PROVIDERMANAGER,
1111 "CMPIProviderManager::handleDeleteInstanceRequest()");
|
1112 marek 1.63
|
1113 kumpf 1.92 HandlerIntro(DeleteInstance,message,request,response,handler);
|
1114 venkat.puvvada 1.108 try
1115 {
|
1116 thilo.boehm 1.138 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL3,
|
1117 marek 1.129 "CMPIProviderManager::handleDeleteInstanceRequest"
1118 " - Host name: %s Name space: %s Class name: %s",
1119 (const char*) System::getHostName().getCString(),
1120 (const char*) request->nameSpace.getString().getCString(),
1121 (const char*)
1122 request->instanceName.getClassName().getString().getCString()));
1123
|
1124 marek 1.63 // make target object path
1125 CIMObjectPath objectPath(
1126 System::getHostName(),
1127 request->nameSpace,
1128 request->instanceName.getClassName(),
1129 request->instanceName.getKeyBindings());
1130
1131 Boolean remote=false;
|
1132 venkat.puvvada 1.132 OpProviderHolder ph;
|
1133 marek 1.63
1134 // resolve provider name
|
1135 venkat.puvvada 1.108 ProviderIdContainer pidc =
1136 request->operationContext.get(ProviderIdContainer::NAME);
|
1137 marek 1.63 ProviderName name = _resolveProviderName(pidc);
1138
|
1139 venkat.puvvada 1.108 if ((remote=pidc.isRemoteNameSpace()))
1140 {
1141 ph = providerManager.getRemoteProvider(
1142 name.getLocation(), name.getLogicalName());
|
1143 marek 1.63 }
|
1144 venkat.puvvada 1.108 else
1145 {
1146 // get cached or load new provider module
1147 ph = providerManager.getProvider(
1148 name.getPhysicalName(), name.getLogicalName());
|
1149 marek 1.63 }
1150
1151 // convert arguments
1152 OperationContext context;
1153
1154 context.insert(request->operationContext.get(IdentityContainer::NAME));
|
1155 venkat.puvvada 1.108 context.insert(
1156 request->operationContext.get(AcceptLanguageListContainer::NAME));
1157 context.insert(
1158 request->operationContext.get(ContentLanguageListContainer::NAME));
|
1159 marek 1.63 // forward request
1160 CMPIProvider & pr=ph.GetProvider();
1161
|
1162 thilo.boehm 1.138 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL4,
1163 "Calling provider.deleteInstance: %s",
1164 (const char*)pr.getName().getCString()));
|
1165 marek 1.63
1166 CMPIStatus rc={CMPI_RC_OK,NULL};
1167 CMPI_ContextOnStack eCtx(context);
1168 CMPI_ObjectPathOnStack eRef(objectPath);
|
1169 venkat.puvvada 1.132 CMPI_ResultOnStack eRes(handler,pr.getBroker());
1170 CMPI_ThreadContext thr(pr.getBroker(),&eCtx);
|
1171 marek 1.63
|
1172 marek 1.124 _setupCMPIContexts(
|
1173 venkat.puvvada 1.108 &eCtx,
|
1174 marek 1.124 &context,
1175 &pidc,
1176 request->nameSpace.getString(),
1177 remote,
1178 false,
1179 false,
1180 true);
|
1181 marek 1.63
1182 CMPIProvider::pm_service_op_lock op_lock(&pr);
1183
|
1184 r.kieninger 1.119 AutoPThreadSecurity threadLevelSecurity(request->operationContext);
|
1185 marek 1.63
|
1186 kumpf 1.92 {
1187 StatProviderTimeMeasurement providerTime(response);
|
1188 marek 1.63
|
1189 venkat.puvvada 1.132 rc = pr.getInstMI()->ft->deleteInstance(
1190 pr.getInstMI(),
1191 &eCtx,
1192 &eRes,
1193 &eRef);
|
1194 kumpf 1.92 }
|
1195 marek 1.63
|
1196 dave.sudlik 1.99 // Need to save ContentLanguage value into operation context of response
1197 // Do this before checking rc from provider to throw exception in case
1198 // rc.msg is also localized.
1199 CMPIStatus tmprc={CMPI_RC_OK,NULL};
|
1200 venkat.puvvada 1.108 CMPIData cldata =
1201 eCtx.ft->getEntry (&eCtx, CMPIContentLanguage, &tmprc);
|
1202 dave.sudlik 1.99 if (tmprc.rc == CMPI_RC_OK)
1203 {
1204 response->operationContext.set(
1205 ContentLanguageListContainer(
|
1206 venkat.puvvada 1.108 ContentLanguageList(
1207 LanguageParser::parseContentLanguageHeader(
|
1208 s.kodali 1.137 CMGetCharsPtr(cldata.value.string, NULL)))));
|
1209 dave.sudlik 1.103 handler.setContext(response->operationContext);
|
1210 dave.sudlik 1.99 }
1211
|
1212 marek 1.63 if (rc.rc!=CMPI_RC_OK)
|
1213 dave.sudlik 1.102 {
|
1214 venkat.puvvada 1.108 CIMException cimException(
1215 (CIMStatusCode)rc.rc,
|
1216 s.kodali 1.137 rc.msg ? CMGetCharsPtr(rc.msg, NULL) : String::EMPTY);
|
1217 venkat.puvvada 1.108
1218 if (eRes.resError)
1219 {
1220 for (CMPI_Error* currErr=eRes.resError;
|
1221 dave.sudlik 1.102 currErr!=NULL;
1222 currErr=currErr->nextError)
|
1223 venkat.puvvada 1.108 {
1224 cimException.addError(
1225 ((CIMError*)currErr->hdl)->getInstance());
1226 }
1227 }
1228 throw cimException;
|
1229 dave.sudlik 1.102 }
|
1230 marek 1.63 }
1231 HandlerCatch(handler);
1232
1233 PEG_METHOD_EXIT();
1234
1235 return(response);
1236 }
1237
1238 Message * CMPIProviderManager::handleExecQueryRequest(const Message * message)
1239 {
|
1240 ms.aruran 1.115 PEG_METHOD_ENTER(
1241 TRC_PROVIDERMANAGER,
1242 "CMPIProviderManager::handleExecQueryRequest()");
|
1243 marek 1.63
|
1244 kumpf 1.92 HandlerIntro(ExecQuery,message,request,response,handler);
|
1245 marek 1.63
|
1246 venkat.puvvada 1.108 try
1247 {
|
1248 thilo.boehm 1.138 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL3,
|
1249 marek 1.129 "CMPIProviderManager::ExecQueryRequest"
1250 " - Host name: %s Name space: %s Class name: %s",
1251 (const char*) System::getHostName().getCString(),
1252 (const char*) request->nameSpace.getString().getCString(),
1253 (const char*) request->className.getString().getCString()));
|
1254 marek 1.63
1255 // make target object path
1256 CIMObjectPath objectPath(
1257 System::getHostName(),
1258 request->nameSpace,
1259 request->className);
1260
1261 Boolean remote=false;
1262
|
1263 venkat.puvvada 1.132 OpProviderHolder ph;
|
1264 marek 1.63
1265 // resolve provider name
|
1266 venkat.puvvada 1.108 ProviderIdContainer pidc =
1267 request->operationContext.get(ProviderIdContainer::NAME);
|
1268 marek 1.63 ProviderName name = _resolveProviderName(pidc);
1269
|
1270 venkat.puvvada 1.108 if ((remote=pidc.isRemoteNameSpace()))
1271 {
1272 ph = providerManager.getRemoteProvider(
1273 name.getLocation(), name.getLogicalName());
|
1274 marek 1.63 }
|
1275 venkat.puvvada 1.108 else
1276 {
1277 // get cached or load new provider module
1278 ph = providerManager.getProvider(
1279 name.getPhysicalName(), name.getLogicalName());
|
1280 marek 1.63 }
1281
1282 // convert arguments
1283 OperationContext context;
1284
1285 context.insert(request->operationContext.get(IdentityContainer::NAME));
|
1286 venkat.puvvada 1.108 context.insert(
1287 request->operationContext.get(AcceptLanguageListContainer::NAME));
1288 context.insert(
1289 request->operationContext.get(ContentLanguageListContainer::NAME));
|
1290 marek 1.63
1291 // forward request
1292 CMPIProvider & pr=ph.GetProvider();
1293
|
1294 thilo.boehm 1.138 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL4,
1295 "Calling provider.execQuery: %s",
1296 (const char*)pr.getName().getCString()));
|
1297 marek 1.63
1298 const char **props=NULL;
1299
1300 CMPIStatus rc={CMPI_RC_OK,NULL};
1301 CMPI_ContextOnStack eCtx(context);
1302 CMPI_ObjectPathOnStack eRef(objectPath);
|
1303 venkat.puvvada 1.132 CMPI_ResultOnStack eRes(handler,pr.getBroker());
1304 CMPI_ThreadContext thr(pr.getBroker(),&eCtx);
|
1305 marek 1.63
1306 const CString queryLan=request->queryLanguage.getCString();
1307 const CString query=request->query.getCString();
1308
|
1309 marek 1.124 _setupCMPIContexts(
|
1310 venkat.puvvada 1.108 &eCtx,
|
1311 marek 1.124 &context,
1312 &pidc,
1313 request->nameSpace.getString(),
1314 remote,
1315 false,
1316 false,
1317 true);
|
1318 marek 1.63
1319 CMPIProvider::pm_service_op_lock op_lock(&pr);
1320
|
1321 r.kieninger 1.119 AutoPThreadSecurity threadLevelSecurity(request->operationContext);
|
1322 marek 1.63
|
1323 kumpf 1.92 {
1324 StatProviderTimeMeasurement providerTime(response);
|
1325 marek 1.63
|
1326 venkat.puvvada 1.132 rc = pr.getInstMI()->ft->execQuery(
1327 pr.getInstMI(),
1328 &eCtx,
1329 &eRes,
1330 &eRef,
1331 CHARS(queryLan),
1332 CHARS(query));
|
1333 kumpf 1.92 }
|
1334 marek 1.63
|
1335 dave.sudlik 1.99 // Need to save ContentLanguage value into operation context of response
1336 // Do this before checking rc from provider to throw exception in case
1337 // rc.msg is also localized.
1338 CMPIStatus tmprc={CMPI_RC_OK,NULL};
|
1339 venkat.puvvada 1.108 CMPIData cldata =
1340 eCtx.ft->getEntry (&eCtx, CMPIContentLanguage, &tmprc);
|
1341 dave.sudlik 1.99 if (tmprc.rc == CMPI_RC_OK)
1342 {
1343 response->operationContext.set(
1344 ContentLanguageListContainer(
|
1345 venkat.puvvada 1.108 ContentLanguageList(
1346 LanguageParser::parseContentLanguageHeader(
|
1347 s.kodali 1.137 CMGetCharsPtr(cldata.value.string, NULL)))));
|
1348 dave.sudlik 1.103 handler.setContext(response->operationContext);
|
1349 dave.sudlik 1.99 }
1350
|
1351 marek 1.63 if (rc.rc!=CMPI_RC_OK)
|
1352 dave.sudlik 1.102 {
|
1353 venkat.puvvada 1.108 CIMException cimException(
1354 (CIMStatusCode)rc.rc,
|
1355 s.kodali 1.137 rc.msg ? CMGetCharsPtr(rc.msg, NULL) : String::EMPTY);
|
1356 venkat.puvvada 1.108
1357 if (eRes.resError)
1358 {
1359 for (CMPI_Error* currErr=eRes.resError;
|
1360 dave.sudlik 1.102 currErr!=NULL;
1361 currErr=currErr->nextError)
|
1362 venkat.puvvada 1.108 {
1363 cimException.addError(
1364 ((CIMError*)currErr->hdl)->getInstance());
1365 }
1366 }
1367 throw cimException;
|
1368 dave.sudlik 1.102 }
1369
|
1370 marek 1.63 }
1371 HandlerCatch(handler);
1372
1373 PEG_METHOD_EXIT();
1374
1375 return(response);
1376 }
1377
1378 Message * CMPIProviderManager::handleAssociatorsRequest(const Message * message)
1379 {
|
1380 ms.aruran 1.115 PEG_METHOD_ENTER(
1381 TRC_PROVIDERMANAGER,
1382 "CMPIProviderManager::handleAssociatorsRequest()");
|
1383 marek 1.63
|
1384 kumpf 1.92 HandlerIntro(Associators,message,request,response,handler);
|
1385 venkat.puvvada 1.108 try
1386 {
|
1387 thilo.boehm 1.138 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL3,
|
1388 marek 1.129 "CMPIProviderManager::handleAssociatorsRequest"
1389 " - Host name: %s Name space: %s Class name: %s",
1390 (const char*) System::getHostName().getCString(),
1391 (const char*) request->nameSpace.getString().getCString(),
1392 (const char*)
1393 request->objectName.getClassName().getString().getCString()));
|
1394 marek 1.63
1395 // make target object path
1396 CIMObjectPath objectPath(
1397 System::getHostName(),
1398 request->nameSpace,
1399 request->objectName.getClassName());
1400
1401 objectPath.setKeyBindings(request->objectName.getKeyBindings());
1402
1403 CIMObjectPath assocPath(
1404 System::getHostName(),
1405 request->nameSpace,
1406 request->assocClass.getString());
1407
1408 Boolean remote=false;
1409
|
1410 venkat.puvvada 1.132 OpProviderHolder ph;
|
1411 marek 1.63
1412 // resolve provider name
|
1413 venkat.puvvada 1.108 ProviderIdContainer pidc =
1414 request->operationContext.get(ProviderIdContainer::NAME);
|
1415 marek 1.63 ProviderName name = _resolveProviderName(pidc);
1416
|
1417 venkat.puvvada 1.108 if ((remote=pidc.isRemoteNameSpace()))
1418 {
1419 ph = providerManager.getRemoteProvider(
1420 name.getLocation(), name.getLogicalName());
|
1421 marek 1.63 }
|
1422 venkat.puvvada 1.108 else
1423 {
1424 // get cached or load new provider module
1425 ph = providerManager.getProvider(
1426 name.getPhysicalName(), name.getLogicalName());
|
1427 marek 1.63 }
1428
|
1429 venkat.puvvada 1.108 // convert arguments
|
1430 marek 1.63 OperationContext context;
1431
1432 context.insert(request->operationContext.get(IdentityContainer::NAME));
|
1433 venkat.puvvada 1.108 context.insert(
1434 request->operationContext.get(AcceptLanguageListContainer::NAME));
1435 context.insert(
1436 request->operationContext.get(ContentLanguageListContainer::NAME));
|
1437 marek 1.63
1438 // forward request
1439 CMPIProvider & pr=ph.GetProvider();
1440
|
1441 a.dunfey 1.85 #ifdef PEGASUS_EMBEDDED_INSTANCE_SUPPORT
|
1442 venkat.puvvada 1.121 AutoPtr<NormalizerContext> tmpNormalizerContext(
|
1443 venkat.puvvada 1.132 new CIMOMHandleContext(*pr.getCIMOMHandle()));
|
1444 venkat.puvvada 1.121 request->operationContext.insert(
1445 NormalizerContextContainer(tmpNormalizerContext));
1446 #endif
|
1447 a.dunfey 1.85
|
1448 thilo.boehm 1.138 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL4,
1449 "Calling provider.associators: %s",
1450 (const char*)pr.getName().getCString()));
1451
1452 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL4,
1453 "--- CMPIProviderManager::associators < role: > %s%s",
1454 (const char*)request->role.getCString(),
1455 (const char*)request->assocClass.getString().getCString()));
|
1456 marek 1.63
1457 CMPIStatus rc={CMPI_RC_OK,NULL};
1458 CMPI_ContextOnStack eCtx(context);
1459 CMPI_ObjectPathOnStack eRef(objectPath);
|
1460 venkat.puvvada 1.132 CMPI_ResultOnStack eRes(handler,pr.getBroker());
1461 CMPI_ThreadContext thr(pr.getBroker(),&eCtx);
|
1462 marek 1.63 const CString aClass=request->assocClass.getString().getCString();
1463 const CString rClass=request->resultClass.getString().getCString();
1464 const CString rRole=request->role.getCString();
1465 const CString resRole=request->resultRole.getCString();
1466
1467 CMPIPropertyList props(request->propertyList);
1468
|
1469 marek 1.124 _setupCMPIContexts(
|
1470 venkat.puvvada 1.108 &eCtx,
|
1471 marek 1.124 &context,
1472 &pidc,
1473 request->nameSpace.getString(),
1474 remote,
1475 request->includeQualifiers,
1476 request->includeClassOrigin,
1477 true);
|
1478 marek 1.63
1479 CMPIProvider::pm_service_op_lock op_lock(&pr);
1480
|
1481 r.kieninger 1.119 AutoPThreadSecurity threadLevelSecurity(request->operationContext);
|
1482 marek 1.63
|
1483 kumpf 1.92 {
1484 StatProviderTimeMeasurement providerTime(response);
|
1485 marek 1.63
|
1486 venkat.puvvada 1.132 rc = pr.getAssocMI()->ft->associators(
1487 pr.getAssocMI(),
1488 &eCtx,
1489 &eRes,
1490 &eRef,
1491 CHARS(aClass),
1492 CHARS(rClass),
1493 CHARS(rRole),
1494 CHARS(resRole),
|
1495 kumpf 1.92 (const char **)props.getList());
1496 }
|
1497 marek 1.63
|
1498 dave.sudlik 1.99 // Need to save ContentLanguage value into operation context of response
1499 // Do this before checking rc from provider to throw exception in case
1500 // rc.msg is also localized.
1501 CMPIStatus tmprc={CMPI_RC_OK,NULL};
|
1502 venkat.puvvada 1.108 CMPIData cldata = eCtx.ft->getEntry (
1503 &eCtx,
1504 CMPIContentLanguage,
1505 &tmprc);
|
1506 dave.sudlik 1.99 if (tmprc.rc == CMPI_RC_OK)
1507 {
1508 response->operationContext.set(
1509 ContentLanguageListContainer(
|
1510 venkat.puvvada 1.108 ContentLanguageList(
1511 LanguageParser::parseContentLanguageHeader(
|
1512 s.kodali 1.137 CMGetCharsPtr(cldata.value.string, NULL)))));
|
1513 dave.sudlik 1.103 handler.setContext(response->operationContext);
|
1514 dave.sudlik 1.99 }
1515
|
1516 marek 1.63 if (rc.rc!=CMPI_RC_OK)
|
1517 dave.sudlik 1.102 {
|
1518 venkat.puvvada 1.108 CIMException cimException(
1519 (CIMStatusCode)rc.rc,
|
1520 s.kodali 1.137 rc.msg ? CMGetCharsPtr(rc.msg, NULL) : String::EMPTY);
|
1521 venkat.puvvada 1.108
1522 if (eRes.resError)
1523 {
1524 for (CMPI_Error* currErr=eRes.resError;
|
1525 dave.sudlik 1.102 currErr!=NULL;
1526 currErr=currErr->nextError)
|
1527 venkat.puvvada 1.108 {
1528 cimException.addError(
1529 ((CIMError*)currErr->hdl)->getInstance());
1530 }
1531 }
1532 throw cimException;
|
1533 dave.sudlik 1.102 }
|
1534 marek 1.63 }
1535 HandlerCatch(handler);
1536
1537 PEG_METHOD_EXIT();
1538
1539 return(response);
1540 }
1541
|
1542 venkat.puvvada 1.108 Message * CMPIProviderManager::handleAssociatorNamesRequest(
1543 const Message * message)
|
1544 marek 1.63 {
|
1545 ms.aruran 1.115 PEG_METHOD_ENTER(
1546 TRC_PROVIDERMANAGER,
1547 "CMPIProviderManager::handleAssociatorNamesRequest()");
|
1548 marek 1.63
|
1549 kumpf 1.92 HandlerIntro(AssociatorNames,message,request,response,handler);
|
1550 venkat.puvvada 1.108 try
1551 {
|
1552 thilo.boehm 1.138 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL3,
|
1553 marek 1.129 "CMPIProviderManager::handleAssociatorNamesRequest"
1554 " - Host name: %s Name space: %s Class name: %s",
1555 (const char*) System::getHostName().getCString(),
1556 (const char*) request->nameSpace.getString().getCString(),
1557 (const char*)
1558 request->objectName.getClassName().getString().getCString()));
|
1559 marek 1.63
1560 // make target object path
1561 CIMObjectPath objectPath(
1562 System::getHostName(),
1563 request->nameSpace,
1564 request->objectName.getClassName());
1565
1566 objectPath.setKeyBindings(request->objectName.getKeyBindings());
1567
1568 CIMObjectPath assocPath(
1569 System::getHostName(),
1570 request->nameSpace,
1571 request->assocClass.getString());
1572
1573 Boolean remote=false;
|
1574 venkat.puvvada 1.132 OpProviderHolder ph;
|
1575 marek 1.63
1576 // resolve provider name
|
1577 venkat.puvvada 1.108 ProviderIdContainer pidc =
1578 request->operationContext.get(ProviderIdContainer::NAME);
|
1579 marek 1.63 ProviderName name = _resolveProviderName(pidc);
1580
|
1581 venkat.puvvada 1.108 if ((remote=pidc.isRemoteNameSpace()))
1582 {
1583 ph = providerManager.getRemoteProvider(
1584 name.getLocation(), name.getLogicalName());
|
1585 marek 1.63 }
|
1586 venkat.puvvada 1.108 else
1587 {
1588 // get cached or load new provider module
1589 ph = providerManager.getProvider(
1590 name.getPhysicalName(), name.getLogicalName());
|
1591 marek 1.63 }
1592
1593 // convert arguments
1594 OperationContext context;
1595
1596 context.insert(request->operationContext.get(IdentityContainer::NAME));
|
1597 venkat.puvvada 1.108 context.insert(
1598 request->operationContext.get(AcceptLanguageListContainer::NAME));
1599 context.insert(
1600 request->operationContext.get(ContentLanguageListContainer::NAME));
|
1601 marek 1.63
1602 // forward request
1603 CMPIProvider & pr=ph.GetProvider();
1604
|
1605 thilo.boehm 1.138 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL4,
1606 "Calling provider.associatorNames: %s",
1607 (const char*)pr.getName().getCString()));
1608
1609 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL4,
1610 "--- CMPIProviderManager::associatorNames -- role: %s< aCls %s",
1611 (const char*)request->role.getCString(),
1612 (const char*)request->assocClass.getString().getCString()));
|
1613 marek 1.63
1614 CMPIStatus rc={CMPI_RC_OK,NULL};
1615 CMPI_ContextOnStack eCtx(context);
1616 CMPI_ObjectPathOnStack eRef(objectPath);
|
1617 venkat.puvvada 1.132 CMPI_ResultOnStack eRes(handler,pr.getBroker());
1618 CMPI_ThreadContext thr(pr.getBroker(),&eCtx);
|
1619 marek 1.63 const CString aClass=request->assocClass.getString().getCString();
1620 const CString rClass=request->resultClass.getString().getCString();
1621 const CString rRole=request->role.getCString();
1622 const CString resRole=request->resultRole.getCString();
1623
|
1624 marek 1.124 _setupCMPIContexts(
|
1625 venkat.puvvada 1.108 &eCtx,
|
1626 marek 1.124 &context,
1627 &pidc,
1628 request->nameSpace.getString(),
1629 remote,
1630 false,
1631 false,
1632 true);
|
1633 marek 1.63
1634 CMPIProvider::pm_service_op_lock op_lock(&pr);
1635
|
1636 r.kieninger 1.119 AutoPThreadSecurity threadLevelSecurity(request->operationContext);
|
1637 marek 1.63
|
1638 kumpf 1.92 {
1639 StatProviderTimeMeasurement providerTime(response);
|
1640 marek 1.63
|
1641 venkat.puvvada 1.132 rc = pr.getAssocMI()->ft->associatorNames(
1642 pr.getAssocMI(),
1643 &eCtx,
1644 &eRes,
1645 &eRef,
1646 CHARS(aClass),
1647 CHARS(rClass),
1648 CHARS(rRole),
1649 CHARS(resRole));
|
1650 kumpf 1.92 }
|
1651 marek 1.63
|
1652 dave.sudlik 1.99 // Need to save ContentLanguage value into operation context of response
1653 // Do this before checking rc from provider to throw exception in case
1654 // rc.msg is also localized.
1655 CMPIStatus tmprc={CMPI_RC_OK,NULL};
|
1656 venkat.puvvada 1.108 CMPIData cldata =
1657 eCtx.ft->getEntry (&eCtx, CMPIContentLanguage, &tmprc);
|
1658 dave.sudlik 1.99 if (tmprc.rc == CMPI_RC_OK)
1659 {
1660 response->operationContext.set(
1661 ContentLanguageListContainer(
|
1662 venkat.puvvada 1.108 ContentLanguageList(
1663 LanguageParser::parseContentLanguageHeader(
|
1664 s.kodali 1.137 CMGetCharsPtr(cldata.value.string, NULL)))));
|
1665 dave.sudlik 1.103 handler.setContext(response->operationContext);
|
1666 dave.sudlik 1.99 }
1667
|
1668 marek 1.63 if (rc.rc!=CMPI_RC_OK)
|
1669 dave.sudlik 1.102 {
|
1670 venkat.puvvada 1.108 CIMException cimException(
1671 (CIMStatusCode)rc.rc,
|
1672 s.kodali 1.137 rc.msg ? CMGetCharsPtr(rc.msg, NULL) : String::EMPTY);
|
1673 venkat.puvvada 1.108
1674 if (eRes.resError)
1675 {
1676 for (CMPI_Error* currErr=eRes.resError;
|
1677 dave.sudlik 1.102 currErr!=NULL;
1678 currErr=currErr->nextError)
|
1679 venkat.puvvada 1.108 {
1680 cimException.addError(
1681 ((CIMError*)currErr->hdl)->getInstance());
1682 }
1683 }
1684 throw cimException;
|
1685 dave.sudlik 1.102 }
|
1686 marek 1.63 }
1687 HandlerCatch(handler);
1688
1689 PEG_METHOD_EXIT();
1690
1691 return(response);
1692 }
1693
1694 Message * CMPIProviderManager::handleReferencesRequest(const Message * message)
1695 {
|
1696 ms.aruran 1.115 PEG_METHOD_ENTER(
1697 TRC_PROVIDERMANAGER,
1698 "CMPIProviderManager::handleReferencesRequest()");
|
1699 marek 1.63
|
1700 kumpf 1.92 HandlerIntro(References,message,request,response,handler);
|
1701 venkat.puvvada 1.108 try
1702 {
|
1703 thilo.boehm 1.138 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL3,
|
1704 marek 1.129 "CMPIProviderManager::handleReferencesRequest"
1705 " - Host name: %s Name space: %s Class name: %s",
1706 (const char*) System::getHostName().getCString(),
1707 (const char*) request->nameSpace.getString().getCString(),
1708 (const char*)
1709 request->objectName.getClassName().getString().getCString()));
|
1710 marek 1.63
1711 // make target object path
1712 CIMObjectPath objectPath(
1713 System::getHostName(),
1714 request->nameSpace,
1715 request->objectName.getClassName());
1716
1717 objectPath.setKeyBindings(request->objectName.getKeyBindings());
1718
1719 CIMObjectPath resultPath(
1720 System::getHostName(),
1721 request->nameSpace,
1722 request->resultClass.getString());
1723
1724 Boolean remote=false;
|
1725 venkat.puvvada 1.132 OpProviderHolder ph;
|
1726 marek 1.63
1727 // resolve provider name
|
1728 venkat.puvvada 1.108 ProviderIdContainer pidc =
1729 request->operationContext.get(ProviderIdContainer::NAME);
|
1730 marek 1.63 ProviderName name = _resolveProviderName(pidc);
1731
|
1732 venkat.puvvada 1.108 if ((remote=pidc.isRemoteNameSpace()))
1733 {
1734 ph = providerManager.getRemoteProvider(
1735 name.getLocation(), name.getLogicalName());
|
1736 marek 1.63 }
|
1737 venkat.puvvada 1.108 else
1738 {
1739 // get cached or load new provider module
1740 ph = providerManager.getProvider(
1741 name.getPhysicalName(), name.getLogicalName());
|
1742 marek 1.63 }
1743
1744 // convert arguments
1745 OperationContext context;
1746
1747 context.insert(request->operationContext.get(IdentityContainer::NAME));
|
1748 venkat.puvvada 1.108 context.insert(
1749 request->operationContext.get(AcceptLanguageListContainer::NAME));
1750 context.insert(
1751 request->operationContext.get(ContentLanguageListContainer::NAME));
|
1752 marek 1.63 // forward request
1753 CMPIProvider & pr=ph.GetProvider();
1754
|
1755 a.dunfey 1.85 #ifdef PEGASUS_EMBEDDED_INSTANCE_SUPPORT
|
1756 venkat.puvvada 1.121 AutoPtr<NormalizerContext> tmpNormalizerContext(
|
1757 venkat.puvvada 1.132 new CIMOMHandleContext(*pr.getCIMOMHandle()));
|
1758 venkat.puvvada 1.121 request->operationContext.insert(
1759 NormalizerContextContainer(tmpNormalizerContext));
1760 #endif
|
1761 a.dunfey 1.85
|
1762 thilo.boehm 1.138 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL4,
1763 "Calling provider.references: %s",
1764 (const char*)pr.getName().getCString()));
1765
1766 PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL4,
1767 "--- CMPIProviderManager::references -- role:%s< aCls %s",
1768 (const char*)request->role.getCString(),
1769 (const char*)request->resultClass.getString().getCString()));
|
1770 marek 1.63
1771 CMPIStatus rc={CMPI_RC_OK,NULL};
1772 CMPI_ContextOnStack eCtx(context);
1773 CMPI_ObjectPathOnStack eRef(objectPath);
|
1774 venkat.puvvada 1.132 CMPI_ResultOnStack eRes(handler,pr.getBroker());
1775 CMPI_ThreadContext thr(pr.getBroker(),&eCtx);
|
1776 marek 1.63 const CString rClass=request->resultClass.getString().getCString();
1777 const CString rRole=request->role.getCString();
1778
1779 CMPIPropertyList props(request->propertyList);
1780
|
1781 marek 1.124 _setupCMPIContexts(
|
1782 venkat.puvvada 1.108 &eCtx,
|
1783 marek 1.124 &context,
1784 &pidc,
1785 request->nameSpace.getString(),
1786 remote,
1787 request->includeQualifiers,
1788 request->includeClassOrigin,
1789 true);
|
1790 marek 1.63
1791 CMPIProvider::pm_service_op_lock op_lock(&pr);
1792
|
1793 r.kieninger 1.119 AutoPThreadSecurity threadLevelSecurity(request->operationContext);
|
1794 marek 1.63
|
1795 kumpf 1.92 {
1796 StatProviderTimeMeasurement providerTime(response);
|
1797 marek 1.63
|
1798 venkat.puvvada 1.132 rc = pr.getAssocMI()->ft->references(
1799 pr.getAssocMI(),
1800 &eCtx,
1801 &eRes,
1802 &eRef,
1803 CHARS(rClass),
1804 CHARS(rRole),
1805 (const char **)props.getList());
|
1806 kumpf 1.92 }
|
1807 marek 1.63
|
1808 dave.sudlik 1.99 // Need to save ContentLanguage value into operation context of response
1809 // Do this before checking rc from provider to throw exception in case
1810 // rc.msg is also localized.
1811 CMPIStatus tmprc={CMPI_RC_OK,NULL};
|
1812 venkat.puvvada 1.108 CMPIData cldata =
1813 eCtx.ft->getEntry (&eCtx, CMPIContentLanguage, &tmprc);
|
1814 dave.sudlik 1.99 if (tmprc.rc == CMPI_RC_OK)
1815 {
1816 response->operationContext.set(
1817 ContentLanguageListContainer(
|
1818 venkat.puvvada 1.108 ContentLanguageList(
1819 LanguageParser::parseContentLanguageHeader(
|
1820 s.kodali 1.137 CMGetCharsPtr(cldata.value.string, NULL)))));
|
1821 dave.sudlik 1.103 handler.setContext(response->operationContext);
|
1822 dave.sudlik 1.99 }
1823
|
1824 marek 1.63 if (rc.rc!=CMPI_RC_OK)
|
1825 dave.sudlik 1.102 {
|
1826 venkat.puvvada 1.108 CIMException cimException(
1827 (CIMStatusCode)rc.rc,
|
1828 s.kodali 1.137 rc.msg ? CMGetCharsPtr(rc.msg, NULL) : String::EMPTY);
|
1829 venkat.puvvada 1.108
1830 if (eRes.resError)
1831 {
1832 for (CMPI_Error* currErr=eRes.resError;
|
1833 dave.sudlik 1.102 currErr!=NULL;
1834 currErr=currErr->nextError)
|
1835 venkat.puvvada 1.108 {
1836 cimException.addError(
1837 ((CIMError*)currErr->hdl)->getInstance());
1838 }
1839 }
1840 throw cimException;
|
1841 dave.sudlik 1.102 }
|
1842 marek 1.63 }
1843 HandlerCatch(handler);
1844
1845 PEG_METHOD_EXIT();
1846
1847 return(response);
1848 }
1849
|
1850 venkat.puvvada 1.108 Message * CMPIProviderManager::handleReferenceNamesRequest(
1851 const Message * message)
|
1852 marek 1.63 {
|
1853 ms.aruran 1.115 PEG_METHOD_ENTER(
1854 TRC_PROVIDERMANAGER,
1855 "CMPIProviderManager::handleReferenceNamesRequest()");
|
1856 marek 1.63
|
1857 kumpf 1.92 HandlerIntro(ReferenceNames,message,request,response,handler);
|
1858 venkat.puvvada 1.108 try
1859 {
|
1860 thilo.boehm 1.138 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL3,
|
1861 marek 1.129 "CMPIProviderManager::handleReferenceNamesRequest"
1862 " - Host name: %s Name space: %s Class name: %s",
1863 (const char*) System::getHostName().getCString(),
1864 (const char*) request->nameSpace.getString().getCString(),
1865 (const char*)
1866 request->objectName.getClassName().getString().getCString()));
1867
|
1868 marek 1.63 // make target object path
1869 CIMObjectPath objectPath(
1870 System::getHostName(),
1871 request->nameSpace,
1872 request->objectName.getClassName());
1873
1874 objectPath.setKeyBindings(request->objectName.getKeyBindings());
1875
1876 CIMObjectPath resultPath(
1877 System::getHostName(),
1878 request->nameSpace,
1879 request->resultClass.getString());
1880
1881 Boolean remote=false;
|
1882 venkat.puvvada 1.132 OpProviderHolder ph;
|
1883 marek 1.63
1884 // resolve provider name
|
1885 venkat.puvvada 1.108 ProviderIdContainer pidc =
1886 request->operationContext.get(ProviderIdContainer::NAME);
|
1887 marek 1.63 ProviderName name = _resolveProviderName(pidc);
1888
|
1889 venkat.puvvada 1.108 if ((remote=pidc.isRemoteNameSpace()))
1890 {
1891 ph = providerManager.getRemoteProvider(
1892 name.getLocation(), name.getLogicalName());
|
1893 marek 1.63 }
|
1894 venkat.puvvada 1.108 else
1895 {
1896 // get cached or load new provider module
1897 ph = providerManager.getProvider(
1898 name.getPhysicalName(), name.getLogicalName());
|
1899 marek 1.63 }
1900
1901 // convert arguments
1902 OperationContext context;
1903
|
1904 venkat.puvvada 1.108 context.insert(request->operationContext.get(IdentityContainer::NAME));
1905 context.insert(
1906 request->operationContext.get(AcceptLanguageListContainer::NAME));
1907 context.insert(
1908 request->operationContext.get(ContentLanguageListContainer::NAME));
|
1909 marek 1.63 CMPIProvider & pr=ph.GetProvider();
1910
|
1911 thilo.boehm 1.138 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL4,
1912 "Calling provider.referenceNames: %s",
1913 (const char*)pr.getName().getCString()));
1914
1915 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL4,
1916 "--- CMPIProviderManager::referenceNames -- role: %s< aCls %s",
1917 (const char*)request->role.getCString(),
1918 (const char*)request->resultClass.getString().getCString()));
|
1919 marek 1.63
1920 CMPIStatus rc={CMPI_RC_OK,NULL};
1921 CMPI_ContextOnStack eCtx(context);
1922 CMPI_ObjectPathOnStack eRef(objectPath);
|
1923 venkat.puvvada 1.132 CMPI_ResultOnStack eRes(handler,pr.getBroker());
1924 CMPI_ThreadContext thr(pr.getBroker(),&eCtx);
|
1925 marek 1.63 const CString rClass=request->resultClass.getString().getCString();
1926 const CString rRole=request->role.getCString();
1927
|
1928 marek 1.124 _setupCMPIContexts(
|
1929 venkat.puvvada 1.108 &eCtx,
|
1930 marek 1.124 &context,
1931 &pidc,
1932 request->nameSpace.getString(),
1933 remote,
1934 false,
1935 false,
1936 true);
|
1937 marek 1.63
1938 CMPIProvider::pm_service_op_lock op_lock(&pr);
1939
|
1940 r.kieninger 1.119 AutoPThreadSecurity threadLevelSecurity(request->operationContext);
|
1941 marek 1.63
|
1942 kumpf 1.92 {
1943 StatProviderTimeMeasurement providerTime(response);
|
1944 marek 1.63
|
1945 venkat.puvvada 1.132 rc = pr.getAssocMI()->ft->referenceNames(
1946 pr.getAssocMI(),
1947 &eCtx,
1948 &eRes,
1949 &eRef,
1950 CHARS(rClass),
1951 CHARS(rRole));
|
1952 kumpf 1.92 }
|
1953 marek 1.63
|
1954 dave.sudlik 1.99 // Need to save ContentLanguage value into operation context of response
1955 // Do this before checking rc from provider to throw exception in case
1956 // rc.msg is also localized.
1957 CMPIStatus tmprc={CMPI_RC_OK,NULL};
|
1958 venkat.puvvada 1.108 CMPIData cldata =
1959 eCtx.ft->getEntry (&eCtx, CMPIContentLanguage, &tmprc);
|
1960 dave.sudlik 1.99 if (tmprc.rc == CMPI_RC_OK)
1961 {
1962 response->operationContext.set(
1963 ContentLanguageListContainer(
|
1964 venkat.puvvada 1.108 ContentLanguageList(
1965 LanguageParser::parseContentLanguageHeader(
|
1966 s.kodali 1.137 CMGetCharsPtr(cldata.value.string, NULL)))));
|
1967 dave.sudlik 1.103 handler.setContext(response->operationContext);
|
1968 dave.sudlik 1.99 }
1969
|
1970 marek 1.63 if (rc.rc!=CMPI_RC_OK)
|
1971 dave.sudlik 1.102 {
|
1972 venkat.puvvada 1.108 CIMException cimException(
1973 (CIMStatusCode)rc.rc,
|
1974 s.kodali 1.137 rc.msg ? CMGetCharsPtr(rc.msg, NULL) : String::EMPTY);
|
1975 venkat.puvvada 1.108
1976 if (eRes.resError)
1977 {
1978 for (CMPI_Error* currErr=eRes.resError;
|
1979 dave.sudlik 1.102 currErr!=NULL;
1980 currErr=currErr->nextError)
|
1981 venkat.puvvada 1.108 {
1982 cimException.addError(
1983 ((CIMError*)currErr->hdl)->getInstance());
1984 }
1985 }
1986 throw cimException;
|
1987 dave.sudlik 1.102 }
|
1988 marek 1.63 }
1989 HandlerCatch(handler);
1990
1991 PEG_METHOD_EXIT();
1992
1993 return(response);
1994 }
1995
|
1996 venkat.puvvada 1.108 Message * CMPIProviderManager::handleInvokeMethodRequest(
1997 const Message * message)
|
1998 marek 1.63 {
|
1999 ms.aruran 1.115 PEG_METHOD_ENTER(
2000 TRC_PROVIDERMANAGER,
2001 "CMPIProviderManager::handleInvokeMethodRequest()");
|
2002 marek 1.63
|
2003 kumpf 1.92 HandlerIntro(InvokeMethod,message,request,response,handler);
|
2004 venkat.puvvada 1.108 try
2005 {
|
2006 thilo.boehm 1.138 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL3,
|
2007 marek 1.129 "CMPIProviderManager::handleInvokeMethodRequest"
2008 " - Host name: %s Name space: %s Class name: %s",
2009 (const char*) System::getHostName().getCString(),
2010 (const char*) request->nameSpace.getString().getCString(),
2011 (const char*)
2012 request->instanceName.getClassName().getString().getCString()));
|
2013 marek 1.63
2014 // make target object path
2015 CIMObjectPath objectPath(
2016 System::getHostName(),
2017 request->nameSpace,
2018 request->instanceName.getClassName(),
2019 request->instanceName.getKeyBindings());
2020
2021 Boolean remote=false;
|
2022 venkat.puvvada 1.132 OpProviderHolder ph;
|
2023 marek 1.63
2024 // resolve provider name
|
2025 venkat.puvvada 1.108 ProviderIdContainer pidc =
2026 request->operationContext.get(ProviderIdContainer::NAME);
|
2027 marek 1.63 ProviderName name = _resolveProviderName(pidc);
2028
|
2029 venkat.puvvada 1.108 if ((remote=pidc.isRemoteNameSpace()))
2030 {
2031 ph = providerManager.getRemoteProvider(
2032 name.getLocation(), name.getLogicalName());
|
2033 marek 1.63 }
|
2034 venkat.puvvada 1.108 else
2035 {
2036 // get cached or load new provider module
2037 ph = providerManager.getProvider(
2038 name.getPhysicalName(), name.getLogicalName());
|
2039 marek 1.63 }
2040
2041 // convert arguments
2042 OperationContext context;
2043
2044 context.insert(request->operationContext.get(IdentityContainer::NAME));
|
2045 venkat.puvvada 1.108 context.insert(
2046 request->operationContext.get(AcceptLanguageListContainer::NAME));
2047 context.insert(
2048 request->operationContext.get(ContentLanguageListContainer::NAME));
|
2049 marek 1.63
2050 CIMObjectPath instanceReference(request->instanceName);
2051
2052 // ATTN: propagate namespace
2053 instanceReference.setNameSpace(request->nameSpace);
2054
2055 // forward request
2056 CMPIProvider & pr=ph.GetProvider();
2057
|
2058 a.dunfey 1.85 #ifdef PEGASUS_EMBEDDED_INSTANCE_SUPPORT
|
2059 venkat.puvvada 1.121 AutoPtr<NormalizerContext> tmpNormalizerContext(
|
2060 venkat.puvvada 1.132 new CIMOMHandleContext(*pr.getCIMOMHandle()));
|
2061 venkat.puvvada 1.121 request->operationContext.insert(
2062 NormalizerContextContainer(tmpNormalizerContext));
2063 #endif
|
2064 a.dunfey 1.85
|
2065 thilo.boehm 1.138 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL4,
2066 "Calling provider.invokeMethod: %s",
2067 (const char*)pr.getName().getCString()));
|
2068 marek 1.63
2069 CMPIStatus rc={CMPI_RC_OK,NULL};
2070 CMPI_ContextOnStack eCtx(context);
2071 CMPI_ObjectPathOnStack eRef(objectPath);
|
2072 venkat.puvvada 1.132 CMPI_ResultOnStack eRes(handler,pr.getBroker());
2073 CMPI_ThreadContext thr(pr.getBroker(),&eCtx);
|
2074 marek 1.63 CMPI_ArgsOnStack eArgsIn(request->inParameters);
2075 Array<CIMParamValue> outArgs;
2076 CMPI_ArgsOnStack eArgsOut(outArgs);
2077 CString mName=request->methodName.getString().getCString();
2078
|
2079 marek 1.124 _setupCMPIContexts(
|
2080 venkat.puvvada 1.108 &eCtx,
|
2081 marek 1.124 &context,
2082 &pidc,
2083 request->nameSpace.getString(),
2084 remote,
2085 false,
2086 false,
2087 true);
|
2088 marek 1.63
2089 CMPIProvider::pm_service_op_lock op_lock(&pr);
2090
|
2091 r.kieninger 1.119 AutoPThreadSecurity threadLevelSecurity(request->operationContext);
|
2092 venkat.puvvada 1.108
|
2093 kumpf 1.92 {
2094 StatProviderTimeMeasurement providerTime(response);
|
2095 marek 1.63
|
2096 venkat.puvvada 1.132 rc = pr.getMethMI()->ft->invokeMethod(
2097 pr.getMethMI(),
2098 &eCtx,
2099 &eRes,
2100 &eRef,
2101 CHARS(mName),
2102 &eArgsIn,
2103 &eArgsOut);
|
2104 kumpf 1.92 }
|
2105 marek 1.63
|
2106 dave.sudlik 1.99 // Need to save ContentLanguage value into operation context of response
2107 // Do this before checking rc from provider to throw exception in case
2108 // rc.msg is also localized.
2109 CMPIStatus tmprc={CMPI_RC_OK,NULL};
|
2110 venkat.puvvada 1.108 CMPIData cldata =
2111 eCtx.ft->getEntry (&eCtx, CMPIContentLanguage, &tmprc);
|
2112 dave.sudlik 1.99 if (tmprc.rc == CMPI_RC_OK)
2113 {
2114 response->operationContext.set(
2115 ContentLanguageListContainer(
|
2116 venkat.puvvada 1.108 ContentLanguageList(
2117 LanguageParser::parseContentLanguageHeader(
|
2118 s.kodali 1.137 CMGetCharsPtr(cldata.value.string, NULL)))));
|
2119 dave.sudlik 1.103 handler.setContext(response->operationContext);
|
2120 dave.sudlik 1.99 }
2121
|
2122 marek 1.63 if (rc.rc!=CMPI_RC_OK)
|
2123 dave.sudlik 1.102 {
|
2124 venkat.puvvada 1.108 CIMException cimException(
2125 (CIMStatusCode)rc.rc,
|
2126 s.kodali 1.137 rc.msg ? CMGetCharsPtr(rc.msg, NULL) : String::EMPTY);
|
2127 venkat.puvvada 1.108
2128 if (eRes.resError)
2129 {
2130 for (CMPI_Error* currErr=eRes.resError;
|
2131 dave.sudlik 1.102 currErr!=NULL;
2132 currErr=currErr->nextError)
|
2133 venkat.puvvada 1.108 {
2134 cimException.addError(
2135 ((CIMError*)currErr->hdl)->getInstance());
2136 }
2137 }
2138 throw cimException;
|
2139 dave.sudlik 1.102 }
2140
|
2141 a.dunfey 1.85 #ifdef PEGASUS_EMBEDDED_INSTANCE_SUPPORT
|
2142 venkat.puvvada 1.121 // Even if external normalization is enabled we don't normalize the
2143 // Embedded instances present in output args. Normalize them here.
|
2144 a.dunfey 1.85 {
2145 // There is no try catch here because if there is no external
2146 // normalization, then these containers were added by this method.
2147 const CachedClassDefinitionContainer * classCont =
2148 dynamic_cast<const CachedClassDefinitionContainer *>(
|
2149 venkat.puvvada 1.108 &request->operationContext.get(
2150 CachedClassDefinitionContainer::NAME));
|
2151 kumpf 1.106 PEGASUS_ASSERT(classCont != 0);
|
2152 a.dunfey 1.85 const NormalizerContextContainer * contextCont =
2153 dynamic_cast<const NormalizerContextContainer*>(
|
2154 venkat.puvvada 1.108 &request->operationContext.get(
2155 NormalizerContextContainer::NAME));
|
2156 kumpf 1.106 PEGASUS_ASSERT(contextCont != 0);
2157
|
2158 a.dunfey 1.85 CIMClass classDef(classCont->getClass());
2159 Uint32 methodIndex = classDef.findMethod(request->methodName);
2160 PEGASUS_ASSERT(methodIndex != PEG_NOT_FOUND);
2161 CIMMethod methodDef(classDef.getMethod(methodIndex));
|
2162 venkat.puvvada 1.108 for (unsigned int i = 0, n = outArgs.size(); i < n; ++i)
|
2163 a.dunfey 1.85 {
2164 CIMParamValue currentParam(outArgs[i]);
2165 CIMValue paramValue(currentParam.getValue());
2166 // If the parameter value is an EmbeddedObject type, we have
2167 // to check against the type of the parameter definition.
2168 // CMPI does not distinguish between EmbeddedObjects and
2169 // EmbeddedInstances, so if the parameter definition has a type
2170 // of EmbeddedInstance, the type of the output parameter must
2171 // be changed.
|
2172 venkat.puvvada 1.108 if (paramValue.getType() == CIMTYPE_OBJECT)
|
2173 a.dunfey 1.85 {
2174 String currentParamName(currentParam.getParameterName());
2175 Uint32 paramIndex = methodDef.findParameter(
2176 CIMName(currentParamName));
|
2177 venkat.puvvada 1.108 if (paramIndex == PEG_NOT_FOUND)
|
2178 a.dunfey 1.85 {
2179 MessageLoaderParms msg("ProviderManager.CMPI."
2180 "CMPIProviderManager.PARAMETER_NOT_FOUND",
|
2181 dave.sudlik 1.117 "Parameter $0 not found in definition for "
2182 "method $1.", currentParamName,
|
2183 a.dunfey 1.85 request->methodName.getString());
|
2184 thilo.boehm 1.138
2185 PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL1,
2186 "Parameter %s not found in definition for "
2187 "method %s.",
2188 (const char*)currentParamName.getCString(),
2189 (const char*)
2190 request->methodName.getString().getCString()));
2191
|
2192 a.dunfey 1.85 handler.setStatus(CIM_ERR_FAILED,
|
2193 dave.sudlik 1.117 MessageLoader::getMessage(msg));
|
2194 a.dunfey 1.85 }
2195 else
2196 {
2197 CIMConstParameter paramDef(
2198 methodDef.getParameter(paramIndex));
|
2199 thilo.boehm 1.135 if (paramDef.findQualifier(
2200 PEGASUS_QUALIFIERNAME_EMBEDDEDINSTANCE)
|
2201 a.dunfey 1.85 != PEG_NOT_FOUND)
2202 {
|
2203 venkat.puvvada 1.126 if (paramValue.isArray())
2204 {
2205 Array<CIMInstance> paramInstArr;
2206 Array<CIMObject> paramObjectArr;
2207 paramValue.get(paramObjectArr);
|
2208 kumpf 1.134 for (Uint32 j = 0 ;
2209 j < paramObjectArr.size() ; ++j)
|
2210 venkat.puvvada 1.126 {
2211 paramInstArr.append(
|
2212 kumpf 1.134 CIMInstance(paramObjectArr[j]));
|
2213 venkat.puvvada 1.126 // resolve each embedded instance.
2214 resolveEmbeddedInstanceTypes(
|
2215 kumpf 1.134 &handler, paramInstArr[j]);
|
2216 venkat.puvvada 1.126 }
2217 currentParam = CIMParamValue(currentParamName,
2218 CIMValue(paramInstArr));
2219 }
2220 else
2221 {
2222 CIMObject paramObject;
2223 paramValue.get(paramObject);
2224 CIMInstance paramInst(paramObject);
2225 resolveEmbeddedInstanceTypes(&handler,
2226 paramInst);
2227 currentParam = CIMParamValue(currentParamName,
2228 CIMValue(paramInst));
2229 }
|
2230 a.dunfey 1.85 }
2231 else
2232 {
2233 currentParam = CIMParamValue(currentParamName,
|
2234 venkat.puvvada 1.126 paramValue);
|
2235 a.dunfey 1.85 }
2236
2237 handler.deliverParamValue(currentParam);
2238 }
2239 }
2240 else
2241 {
2242 handler.deliverParamValue(currentParam);
2243 }
2244 }
2245 }
2246 #else
2247 for (int i=0,s=outArgs.size(); i<s; i++)
2248 {
2249 handler.deliverParamValue(outArgs[i]);
2250 }
2251 #endif // PEGASUS_EMBEDDED_INSTANCE_SUPPORT
|
2252 venkat.puvvada 1.108 handler.complete();
|
2253 marek 1.63 }
2254 HandlerCatch(handler);
2255
2256 PEG_METHOD_EXIT();
2257
2258 return(response);
2259 }
2260
|
2261 venkat.puvvada 1.108 int LocateIndicationProviderNames(
2262 const CIMInstance& pInstance,
2263 const CIMInstance& pmInstance,
2264 String& providerName,
2265 String& location)
|
2266 marek 1.63 {
|
2267 ms.aruran 1.115 PEG_METHOD_ENTER(
2268 TRC_PROVIDERMANAGER,
2269 "CMPIProviderManager:LocateIndicationProviderNames()");
|
2270 marek 1.139 Uint32 pos = pInstance.findProperty(PEGASUS_PROPERTYNAME_NAME);
|
2271 marek 1.63 pInstance.getProperty(pos).getValue().get(providerName);
2272
2273 pos = pmInstance.findProperty(CIMName ("Location"));
2274 pmInstance.getProperty(pos).getValue().get(location);
|
2275 ms.aruran 1.115 PEG_METHOD_EXIT();
|
2276 marek 1.63 return 0;
2277 }
2278
|
2279 venkat.puvvada 1.108 Message * CMPIProviderManager::handleCreateSubscriptionRequest(
2280 const Message * message)
|
2281 marek 1.63 {
|
2282 ms.aruran 1.115 PEG_METHOD_ENTER(
2283 TRC_PROVIDERMANAGER,
2284 "CMPIProviderManager::handleCreateSubscriptionRequest()");
|
2285 marek 1.63
2286 HandlerIntroInd(CreateSubscription,message,request,response,
|
2287 venkat.puvvada 1.108 handler);
2288 try
2289 {
|
2290 marek 1.63 CIMInstance req_provider, req_providerModule;
|
2291 venkat.puvvada 1.108 ProviderIdContainer pidc =
2292 (ProviderIdContainer)request->operationContext.get(
2293 ProviderIdContainer::NAME);
|
2294 marek 1.63 req_provider = pidc.getProvider();
2295 req_providerModule = pidc.getModule();
2296
2297 String providerName,providerLocation;
2298 LocateIndicationProviderNames(req_provider, req_providerModule,
|
2299 venkat.puvvada 1.108 providerName,providerLocation);
|
2300 marek 1.63
|
2301 thilo.boehm 1.138 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL3,
|
2302 marek 1.129 "CMPIProviderManager::handleCreateSubscriptionRequest"
2303 " - Host name: %s Name space: %s Provider name(s): %s",
2304 (const char*) System::getHostName().getCString(),
2305 (const char*) request->nameSpace.getString().getCString(),
2306 (const char*) providerName.getCString()));
|
2307 marek 1.63
2308 Boolean remote=false;
|
2309 venkat.puvvada 1.132 OpProviderHolder ph;
|
2310 marek 1.63
|
2311 venkat.puvvada 1.108 if ((remote=pidc.isRemoteNameSpace()))
2312 {
2313 ph = providerManager.getRemoteProvider(
2314 providerLocation, providerName);
|
2315 marek 1.63 }
|
2316 venkat.puvvada 1.108 else
2317 {
2318 // get cached or load new provider module
2319 ph = providerManager.getProvider(
2320 providerLocation, providerName);
|
2321 marek 1.63 }
2322
2323 indProvRecord *prec=NULL;
|
2324 marek 1.95 {
2325 WriteLock writeLock(rwSemProvTab);
|
2326 venkat.puvvada 1.108 provTab.lookup(ph.GetProvider().getName(),prec);
2327 if (prec) prec->count++;
2328 else
2329 {
2330 prec=new indProvRecord();
|
2331 venkat.puvvada 1.110 #ifdef PEGASUS_ENABLE_REMOTE_CMPI
2332 if (remote)
2333 {
2334 prec->remoteInfo = pidc.getRemoteInfo();
2335 }
2336 #endif
|
2337 venkat.puvvada 1.108 provTab.insert(ph.GetProvider().getName(),prec);
2338 }
|
2339 marek 1.95 }
|
2340 marek 1.63
2341 //
2342 // Save the provider instance from the request
2343 //
2344 ph.GetProvider ().setProviderInstance (req_provider);
2345
|
2346 venkat.puvvada 1.140 const CIMObjectPath &filterPath = _getFilterPath(
2347 request->subscriptionInstance);
|
2348 marek 1.63
|
2349 marek 1.95 indSelectRecord *srec=NULL;
2350
2351 {
2352 WriteLock writeLock(rwSemSelxTab);
|
2353 venkat.puvvada 1.140 selxTab.lookup(filterPath,srec);
|
2354 marek 1.95 if (srec) srec->count++;
|
2355 venkat.puvvada 1.108 else
2356 {
2357 srec=new indSelectRecord();
|
2358 venkat.puvvada 1.140 selxTab.insert(filterPath,srec);
|
2359 marek 1.95 }
2360 }
|
2361 marek 1.63
2362 // convert arguments
2363 OperationContext context;
2364 context.insert(request->operationContext.get(IdentityContainer::NAME));
|
2365 venkat.puvvada 1.108 context.insert(
2366 request->operationContext.get(AcceptLanguageListContainer::NAME));
2367 context.insert(
2368 request->operationContext.get(ContentLanguageListContainer::NAME));
2369 context.insert(
2370 request->operationContext.get(SubscriptionInstanceContainer::NAME));
2371 context.insert(
2372 request->operationContext.get(
2373 SubscriptionFilterConditionContainer::NAME));
|
2374 marek 1.63
|
2375 venkat.puvvada 1.108 CIMObjectPath subscriptionName =
2376 request->subscriptionInstance.getPath();
|
2377 marek 1.63
2378 CMPIProvider & pr=ph.GetProvider();
2379
2380 CMPIStatus rc={CMPI_RC_OK,NULL};
2381 CMPI_ContextOnStack eCtx(context);
|
2382 venkat.puvvada 1.108 SubscriptionFilterConditionContainer sub_cntr =
2383 request->operationContext.get(
2384 SubscriptionFilterConditionContainer::NAME);
2385
2386 CIMOMHandleQueryContext *_context=
2387 new CIMOMHandleQueryContext(
2388 CIMNamespaceName(
2389 request->nameSpace.getString()),
|
2390 venkat.puvvada 1.132 *pr.getCIMOMHandle());
|
2391 venkat.puvvada 1.108
2392 CMPI_SelectExp *eSelx=new CMPI_SelectExp(
2393 context,
2394 _context,
2395 request->query,
2396 sub_cntr.getQueryLanguage());
|
2397 marek 1.63
2398 srec->eSelx=eSelx;
|
2399 venkat.puvvada 1.108 srec->qContext=_context;
|
2400 marek 1.63
|
2401 venkat.puvvada 1.132 CMPI_ThreadContext thr(pr.getBroker(),&eCtx);
|
2402 marek 1.63
|
2403 thilo.boehm 1.138 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL4,
2404 "Calling provider.createSubscriptionRequest: %s",
2405 (const char*)pr.getName().getCString()));
|
2406 marek 1.63
|
2407 venkat.puvvada 1.108 for (Uint32 i = 0, n = request->classNames.size(); i < n; i++)
2408 {
|
2409 marek 1.63 CIMObjectPath className(
2410 System::getHostName(),
2411 request->nameSpace,
2412 request->classNames[i]);
2413 eSelx->classNames.append(className);
2414 }
2415 CMPI_ObjectPathOnStack eRef(eSelx->classNames[0]);
2416
2417 CIMPropertyList propertyList = request->propertyList;
|
2418 venkat.puvvada 1.108 if (!propertyList.isNull())
2419 {
2420 Array<CIMName> p=propertyList.getPropertyNameArray();
2421 int pCount=p.size();
2422 eSelx->props = new const char*[1+pCount];
2423 for (int i=0; i<pCount; i++)
2424 {
2425 eSelx->props[i]=strdup(p[i].getString().getCString());
2426 }
2427 eSelx->props[pCount]=NULL;
|
2428 marek 1.63 }
2429
2430 Uint16 repeatNotificationPolicy = request->repeatNotificationPolicy;
2431
|
2432 marek 1.124 // includeQualifiers and includeClassOrigin not of interest for
2433 // this type of request
2434 _setupCMPIContexts(
|
2435 kumpf 1.79 &eCtx,
|
2436 marek 1.124 &context,
2437 &pidc,
2438 request->nameSpace.getString(),
2439 remote);
|
2440 marek 1.63
2441 CMPIProvider::pm_service_op_lock op_lock(&pr);
2442
|
2443 r.kieninger 1.119 AutoPThreadSecurity threadLevelSecurity(request->operationContext);
|
2444 venkat.puvvada 1.108
|
2445 kumpf 1.92 {
2446 StatProviderTimeMeasurement providerTime(response);
2447
|
2448 venkat.puvvada 1.132 if (pr.getIndMI()->ft->ftVersion >= 100)
|
2449 kumpf 1.92 {
|
2450 venkat.puvvada 1.132 rc = pr.getIndMI()->ft->activateFilter(
2451 pr.getIndMI(),
2452 &eCtx,eSelx,
|
2453 kumpf 1.92 CHARS(eSelx->classNames[0].getClassName().getString().
|
2454 venkat.puvvada 1.132 getCString()),
2455 &eRef,
2456 false);
|
2457 kumpf 1.92 }
2458 else
2459 {
|
2460 venkat.puvvada 1.108 // Older version of (pre 1.00) also pass in a CMPIResult
|
2461 marek 1.63
|
2462 kumpf 1.92 rc = ((CMPIStatus (*)(CMPIIndicationMI*, CMPIContext*,
|
2463 venkat.puvvada 1.108 CMPIResult*, CMPISelectExp*,
2464 const char *, CMPIObjectPath*, CMPIBoolean))
|
2465 venkat.puvvada 1.132 pr.getIndMI()->ft->activateFilter)
2466 (pr.getIndMI(),&eCtx,NULL,eSelx,
|
2467 venkat.puvvada 1.108 CHARS(eSelx->classNames[0].getClassName().getString().
|
2468 dave.sudlik 1.96 getCString()),&eRef,false);
|
2469 kumpf 1.92 }
2470 }
|
2471 marek 1.63
|
2472 dave.sudlik 1.99 // Need to save ContentLanguage value into operation context of response
2473 // Do this before checking rc from provider to throw exception in case
2474 // rc.msg is also localized.
2475 CMPIStatus tmprc={CMPI_RC_OK,NULL};
|
2476 venkat.puvvada 1.108 CMPIData cldata =
2477 eCtx.ft->getEntry (&eCtx, CMPIContentLanguage, &tmprc);
|
2478 dave.sudlik 1.99 if (tmprc.rc == CMPI_RC_OK)
2479 {
2480 response->operationContext.set(
2481 ContentLanguageListContainer(
|
2482 venkat.puvvada 1.108 ContentLanguageList(
2483 LanguageParser::parseContentLanguageHeader(
|
2484 s.kodali 1.137 CMGetCharsPtr(cldata.value.string, NULL)))));
|
2485 dave.sudlik 1.99 }
2486
|
2487 marek 1.63 if (rc.rc!=CMPI_RC_OK)
2488 {
|
2489 marek 1.95 // Removed the select expression from the cache
2490 WriteLock lock(rwSemSelxTab);
2491 if (--srec->count<=0)
2492 {
|
2493 venkat.puvvada 1.140 selxTab.remove(filterPath);
|
2494 marek 1.95 delete _context;
2495 delete eSelx;
2496 delete srec;
2497 }
|
2498 venkat.puvvada 1.108 throw CIMException((CIMStatusCode)rc.rc,
|
2499 s.kodali 1.137 rc.msg ? CMGetCharsPtr(rc.msg, NULL) : String::EMPTY);
|
2500 marek 1.63 }
2501 else
2502 {
2503 //
2504 // Increment count of current subscriptions for this provider
2505 //
2506 if (ph.GetProvider ().testIfZeroAndIncrementSubscriptions ())
2507 {
2508 //
2509 // If there were no current subscriptions before the increment,
2510 // the first subscription has been created
2511 // Call the provider's enableIndications method
2512 //
2513 if (_subscriptionInitComplete)
2514 {
2515 _callEnableIndications (req_provider, _indicationCallback,
|
2516 marek 1.124 ph, (const char*)pidc.getRemoteInfo().getCString());
|
2517 marek 1.63 }
2518 }
2519 }
2520 }
2521 HandlerCatch(handler);
2522
2523 PEG_METHOD_EXIT();
2524
2525 return(response);
2526 }
2527
|
2528 venkat.puvvada 1.108 Message * CMPIProviderManager::handleDeleteSubscriptionRequest(
2529 const Message * message)
|
2530 marek 1.63 {
|
2531 ms.aruran 1.115 PEG_METHOD_ENTER(
2532 TRC_PROVIDERMANAGER,
2533 "CMPIProviderManager::handleDeleteSubscriptionRequest()");
|
2534 marek 1.63
2535 HandlerIntroInd(DeleteSubscription,message,request,response,
|
2536 venkat.puvvada 1.108 handler);
2537 try
2538 {
|
2539 marek 1.63 String providerName,providerLocation;
2540
2541 CIMInstance req_provider, req_providerModule;
|
2542 venkat.puvvada 1.108 ProviderIdContainer pidc =
2543 (ProviderIdContainer)request->operationContext.get(
2544 ProviderIdContainer::NAME);
|
2545 marek 1.63 req_provider = pidc.getProvider();
2546 req_providerModule = pidc.getModule();
2547
2548 LocateIndicationProviderNames(req_provider, req_providerModule,
|
2549 venkat.puvvada 1.108 providerName,providerLocation);
|
2550 marek 1.63
|
2551 thilo.boehm 1.138 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL3,
|
2552 marek 1.129 "CMPIProviderManager::handleDeleteSubscriptionRequest"
2553 " - Host name: %s Name space: %s Provider name(s): %s",
2554 (const char*) System::getHostName().getCString(),
2555 (const char*) request->nameSpace.getString().getCString(),
2556 (const char*) providerName.getCString()));
|
2557 marek 1.63
2558 Boolean remote=false;
|
2559 venkat.puvvada 1.132 OpProviderHolder ph;
|
2560 marek 1.63
|
2561 venkat.puvvada 1.108 if ((remote=pidc.isRemoteNameSpace()))
2562 {
2563 ph = providerManager.getRemoteProvider(
2564 providerLocation, providerName);
|
2565 marek 1.63 }
|
2566 venkat.puvvada 1.108 else
2567 {
2568 // get cached or load new provider module
2569 ph = providerManager.getProvider(
2570 providerLocation, providerName);
|
2571 marek 1.63 }
2572
2573
2574 indProvRecord *prec=NULL;
|
2575 marek 1.95 {
2576 WriteLock writeLock(rwSemProvTab);
|
2577 venkat.puvvada 1.108 provTab.lookup(ph.GetProvider().getName(),prec);
2578 if (--prec->count<=0)
2579 {
2580 if (prec->handler)
2581 delete prec->handler;
2582 delete prec;
2583 provTab.remove(ph.GetProvider().getName());
2584 prec=NULL;
2585 }
|
2586 marek 1.95 }
|
2587 marek 1.63
2588 indSelectRecord *srec=NULL;
|
2589 venkat.puvvada 1.140 const CIMObjectPath &filterPath = _getFilterPath(
2590 request->subscriptionInstance);
|
2591 r.kieninger 1.81
|
2592 marek 1.95 WriteLock writeLock(rwSemSelxTab);
|
2593 venkat.puvvada 1.140 if (!selxTab.lookup(filterPath,srec))
|
2594 venkat.puvvada 1.108 {
|
2595 dave.sudlik 1.117 MessageLoaderParms parms(
2596 "ProviderManager.CMPI.CMPIProviderManager."
2597 "FAILED_LOCATE_SUBSCRIPTION_FILTER",
2598 "Failed to locate the subscription filter.");
|
2599 venkat.puvvada 1.108 // failed to get select expression from hash table
|
2600 dave.sudlik 1.117 throw CIMException(CIM_ERR_FAILED, parms);
|
2601 venkat.puvvada 1.108 };
|
2602 marek 1.63
2603 CMPI_SelectExp *eSelx=srec->eSelx;
|
2604 venkat.puvvada 1.108 CIMOMHandleQueryContext *qContext=srec->qContext;
|
2605 marek 1.63
2606 CMPI_ObjectPathOnStack eRef(eSelx->classNames[0]);
|
2607 marek 1.95 if (--srec->count<=0)
2608 {
|
2609 venkat.puvvada 1.140 selxTab.remove(filterPath);
|
2610 marek 1.95 }
|
2611 marek 1.63
2612 // convert arguments
2613 OperationContext context;
2614 context.insert(request->operationContext.get(IdentityContainer::NAME));
|
2615 venkat.puvvada 1.108 context.insert(
2616 request->operationContext.get(AcceptLanguageListContainer::NAME));
2617 context.insert(
2618 request->operationContext.get(ContentLanguageListContainer::NAME));
2619 context.insert(
2620 request->operationContext.get(SubscriptionInstanceContainer::NAME));
|
2621 marek 1.63
|
2622 venkat.puvvada 1.108 CIMObjectPath subscriptionName =
2623 request->subscriptionInstance.getPath();
|
2624 marek 1.63
2625 CMPIProvider & pr=ph.GetProvider();
2626
2627 CMPIStatus rc={CMPI_RC_OK,NULL};
2628 CMPI_ContextOnStack eCtx(context);
|
2629 venkat.puvvada 1.132 CMPI_ThreadContext thr(pr.getBroker(),&eCtx);
|
2630 marek 1.63
|
2631 thilo.boehm 1.138 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL4,
2632 "Calling provider.deleteSubscriptionRequest: %s",
2633 (const char*)pr.getName().getCString()));
|
2634 marek 1.63
|
2635 marek 1.124 // includeQualifiers and includeClassOrigin not of interest for
2636 // this type of request
2637 _setupCMPIContexts(
|
2638 venkat.puvvada 1.108 &eCtx,
|
2639 marek 1.124 &context,
2640 &pidc,
2641 request->nameSpace.getString(),
2642 remote);
|
2643 marek 1.63
2644 CMPIProvider::pm_service_op_lock op_lock(&pr);
2645
|
2646 r.kieninger 1.119 AutoPThreadSecurity threadLevelSecurity(request->operationContext);
|
2647 venkat.puvvada 1.108
|
2648 kumpf 1.92 {
2649 StatProviderTimeMeasurement providerTime(response);
2650
|
2651 venkat.puvvada 1.132 if (pr.getIndMI()->ft->ftVersion >= 100)
|
2652 kumpf 1.92 {
|
2653 venkat.puvvada 1.132 rc = pr.getIndMI()->ft->deActivateFilter(
2654 pr.getIndMI(),
2655 &eCtx,
2656 eSelx,
|
2657 kumpf 1.92 CHARS(eSelx->classNames[0].getClassName().getString().
|
2658 venkat.puvvada 1.132 getCString()),
2659 &eRef,
2660 prec==NULL);
|
2661 kumpf 1.92 }
2662 else
2663 {
2664 // Older version of (pre 1.00) also pass in a CMPIResult
|
2665 marek 1.63
|
2666 kumpf 1.92 rc = ((CMPIStatus (*)(CMPIIndicationMI*, CMPIContext*,
2667 CMPIResult*, CMPISelectExp*,
|
2668 venkat.puvvada 1.108 const char *, CMPIObjectPath*, CMPIBoolean))
|
2669 venkat.puvvada 1.132 pr.getIndMI()->ft->deActivateFilter)
2670 (pr.getIndMI(),&eCtx,NULL,eSelx,
|
2671 venkat.puvvada 1.108 CHARS(eSelx->classNames[0].getClassName().getString().
|
2672 dave.sudlik 1.96 getCString()),&eRef,prec==NULL);
|
2673 kumpf 1.92 }
2674 }
|
2675 marek 1.63
|
2676 marek 1.95 if (srec->count<=0)
2677 {
|
2678 venkat.puvvada 1.108 delete qContext;
2679 delete eSelx;
2680 delete srec;
|
2681 marek 1.95 }
|
2682 marek 1.63
|
2683 dave.sudlik 1.99 // Need to save ContentLanguage value into operation context of response
2684 // Do this before checking rc from provider to throw exception in case
2685 // rc.msg is also localized.
2686 CMPIStatus tmprc={CMPI_RC_OK,NULL};
|
2687 venkat.puvvada 1.108 CMPIData cldata =
2688 eCtx.ft->getEntry (&eCtx, CMPIContentLanguage, &tmprc);
|
2689 dave.sudlik 1.99 if (tmprc.rc == CMPI_RC_OK)
2690 {
2691 response->operationContext.set(
2692 ContentLanguageListContainer(
|
2693 venkat.puvvada 1.108 ContentLanguageList(
2694 LanguageParser::parseContentLanguageHeader(
|
2695 s.kodali 1.137 CMGetCharsPtr(cldata.value.string, NULL)))));
|
2696 dave.sudlik 1.99 }
2697
|
2698 marek 1.63 if (rc.rc!=CMPI_RC_OK)
2699 {
|
2700 venkat.puvvada 1.108 throw CIMException((CIMStatusCode)rc.rc,
|
2701 s.kodali 1.137 rc.msg ? CMGetCharsPtr(rc.msg, NULL) : String::EMPTY);
|
2702 marek 1.63 }
2703 else
2704 {
2705 //
2706 // Decrement count of current subscriptions for this provider
2707 //
2708 if (ph.GetProvider ().decrementSubscriptionsAndTestIfZero ())
2709 {
2710 //
2711 // If there are no current subscriptions after the decrement,
2712 // the last subscription has been deleted
2713 // Call the provider's disableIndications method
2714 //
2715 if (_subscriptionInitComplete)
2716 {
|
2717 marek 1.124 _callDisableIndications(
2718 ph,
2719 (const char*)pidc.getRemoteInfo().getCString());
|
2720 marek 1.63 }
2721 }
2722 }
2723 }
2724 HandlerCatch(handler);
2725
2726 PEG_METHOD_EXIT();
2727
2728 return(response);
2729 }
2730
|
2731 venkat.puvvada 1.108 Message * CMPIProviderManager::handleDisableModuleRequest(
2732 const Message * message)
|
2733 marek 1.63 {
|
2734 ms.aruran 1.115 PEG_METHOD_ENTER(
2735 TRC_PROVIDERMANAGER,
2736 "CMPIProviderManager::handleDisableModuleRequest()");
|
2737 marek 1.63
2738 CIMDisableModuleRequestMessage * request =
|
2739 venkat.puvvada 1.108 dynamic_cast<CIMDisableModuleRequestMessage *>(
2740 const_cast<Message *>(message));
|
2741 marek 1.63
2742 PEGASUS_ASSERT(request != 0);
2743
|
2744 venkat.puvvada 1.133 //Set to false when provider refused to unload due to pending operations.
2745 Boolean disableModuleOk = true;
2746
|
2747 marek 1.63 // get provider module name
2748 Boolean disableProviderOnly = request->disableProviderOnly;
2749
2750 //
2751 // Unload providers
2752 //
2753 Array<CIMInstance> _pInstances = request->providers;
2754 Array <Boolean> _indicationProviders = request->indicationProviders;
|
2755 venkat.puvvada 1.108 /* The CIMInstances on request->providers array is completly _different_
2756 than the request->providerModule CIMInstance. Hence */
|
2757 marek 1.63
|
2758 konrad.r 1.69 String physicalName=(request->providerModule.getProperty(
|
2759 venkat.puvvada 1.108 request->
2760 providerModule.findProperty("Location")).getValue().toString());
|
2761 marek 1.63
|
2762 venkat.puvvada 1.108 for (Uint32 i = 0, n = _pInstances.size(); i < n; i++)
|
2763 marek 1.63 {
2764 String providerName;
|
2765 marek 1.139 _pInstances[i].getProperty(_pInstances [i].findProperty
2766 (PEGASUS_PROPERTYNAME_NAME)).getValue().get(providerName);
|
2767 marek 1.63
|
2768 marek 1.139 Uint32 pos = _pInstances[i].findProperty(PEGASUS_PROPERTYNAME_NAME);
|
2769 marek 1.63
|
2770 venkat.puvvada 1.128 if (!providerManager.isProviderActive(providerName))
2771 {
2772 continue;
|
2773 venkat.puvvada 1.133 }
2774
2775 Boolean unloadOk = providerManager.unloadProvider(
2776 physicalName,
2777 _pInstances[i].getProperty(
|
2778 marek 1.139 _pInstances[i].findProperty(PEGASUS_PROPERTYNAME_NAME)
|
2779 venkat.puvvada 1.133 ).getValue ().toString ());
2780
2781 if (!unloadOk)
2782 {
2783 disableModuleOk = false;
2784 continue;
2785 }
|
2786 marek 1.63 //
2787 // Reset the indication provider's count of current
2788 // subscriptions since it has been disabled
2789 //
2790 if (_indicationProviders [i])
2791 {
2792 if (physicalName.size () > 0)
2793 {
|
2794 venkat.puvvada 1.108 try
2795 {
|
2796 venkat.puvvada 1.132 OpProviderHolder ph =
|
2797 venkat.puvvada 1.108 providerManager.getProvider(
2798 physicalName,
2799 providerName);
2800 ph.GetProvider ().resetSubscriptions ();
2801 }
2802 catch (const Exception &e)
2803 {
|
2804 thilo.boehm 1.138 PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL1,
2805 "Exception during reset subscriptions on indication "
2806 "provider %s: %s",
2807 (const char*)providerName.getCString(),
2808 (const char*)e.getMessage().getCString()));
|
2809 venkat.puvvada 1.108 }
|
2810 marek 1.63 }
2811 }
2812 }
2813
|
2814 kumpf 1.123 CIMDisableModuleResponseMessage* response =
2815 dynamic_cast<CIMDisableModuleResponseMessage*>(
2816 request->buildResponse());
|
2817 marek 1.63 PEGASUS_ASSERT(response != 0);
|
2818 venkat.puvvada 1.133
2819 if (disableModuleOk)
2820 {
2821 response->operationalStatus.append(
2822 CIM_MSE_OPSTATUS_VALUE_STOPPED);
2823 }
2824 else
2825 {
2826 response->operationalStatus.append(
2827 CIM_MSE_OPSTATUS_VALUE_OK);
2828 }
|
2829 marek 1.63
2830 PEG_METHOD_EXIT();
2831
2832 return(response);
2833 }
2834
|
2835 venkat.puvvada 1.108 Message * CMPIProviderManager::handleEnableModuleRequest(
2836 const Message * message)
|
2837 marek 1.63 {
|
2838 ms.aruran 1.115 PEG_METHOD_ENTER(
2839 TRC_PROVIDERMANAGER,
2840 "CMPIProviderManager::handleEnableModuleRequest()");
|
2841 marek 1.63
2842 CIMEnableModuleRequestMessage * request =
|
2843 venkat.puvvada 1.108 dynamic_cast<CIMEnableModuleRequestMessage *>(
2844 const_cast<Message *>(message));
|
2845 marek 1.63
2846 PEGASUS_ASSERT(request != 0);
2847
2848 Array<Uint16> operationalStatus;
2849 operationalStatus.append(CIM_MSE_OPSTATUS_VALUE_OK);
2850
|
2851 kumpf 1.123 CIMEnableModuleResponseMessage* response =
2852 dynamic_cast<CIMEnableModuleResponseMessage*>(
2853 request->buildResponse());
|
2854 marek 1.63 PEGASUS_ASSERT(response != 0);
|
2855 kumpf 1.123 response->operationalStatus = operationalStatus;
|
2856 marek 1.63
2857 PEG_METHOD_EXIT();
2858
2859 return(response);
2860 }
2861
|
2862 venkat.puvvada 1.108 Message * CMPIProviderManager::handleStopAllProvidersRequest(
2863 const Message * message)
|
2864 marek 1.63 {
|
2865 ms.aruran 1.115 PEG_METHOD_ENTER(
2866 TRC_PROVIDERMANAGER,
2867 "CMPIProviderManager::handleStopAllProvidersRequest()");
|
2868 marek 1.63
2869 CIMStopAllProvidersRequestMessage * request =
|
2870 venkat.puvvada 1.108 dynamic_cast<CIMStopAllProvidersRequestMessage *>(
2871 const_cast<Message *>(message));
|
2872 marek 1.63
2873 PEGASUS_ASSERT(request != 0);
2874
|
2875 kumpf 1.123 CIMStopAllProvidersResponseMessage* response =
2876 dynamic_cast<CIMStopAllProvidersResponseMessage*>(
2877 request->buildResponse());
|
2878 marek 1.63 PEGASUS_ASSERT(response != 0);
2879
2880 // tell the provider manager to shutdown all the providers
2881 providerManager.shutdownAllProviders();
2882
2883 PEG_METHOD_EXIT();
2884
2885 return(response);
2886 }
2887
|
2888 venkat.puvvada 1.108 Message * CMPIProviderManager::handleSubscriptionInitCompleteRequest(
2889 const Message * message)
|
2890 marek 1.63 {
|
2891 ms.aruran 1.115 PEG_METHOD_ENTER(
2892 TRC_PROVIDERMANAGER,
2893 "CMPIProviderManager::handleSubscriptionInitCompleteRequest()");
|
2894 marek 1.63
2895 CIMSubscriptionInitCompleteRequestMessage * request =
2896 dynamic_cast <CIMSubscriptionInitCompleteRequestMessage *>
|
2897 venkat.puvvada 1.108 (const_cast <Message *> (message));
|
2898 marek 1.63
2899 PEGASUS_ASSERT (request != 0);
2900
2901 CIMSubscriptionInitCompleteResponseMessage * response =
2902 dynamic_cast <CIMSubscriptionInitCompleteResponseMessage *>
|
2903 venkat.puvvada 1.108 (request->buildResponse ());
|
2904 marek 1.63
2905 PEGASUS_ASSERT (response != 0);
2906
2907 //
2908 // Set indicator
2909 //
2910 _subscriptionInitComplete = true;
2911
2912 //
2913 // For each provider that has at least one subscription, call
2914 // provider's enableIndications method
2915 //
2916 Array <CMPIProvider *> enableProviders;
2917 enableProviders = providerManager.getIndicationProvidersToEnable ();
2918
2919 Uint32 numProviders = enableProviders.size ();
2920 for (Uint32 i = 0; i < numProviders; i++)
2921 {
2922 try
2923 {
2924 CIMInstance provider;
2925 marek 1.63 provider = enableProviders [i]->getProviderInstance ();
2926
|
2927 venkat.puvvada 1.110 CString info;
2928 #ifdef PEGASUS_ENABLE_REMOTE_CMPI
2929 indProvRecord *provRec = 0;
2930 if (provTab.lookup (enableProviders [i]->getName(), provRec))
2931 {
2932 if (provRec->remoteInfo != String::EMPTY)
2933 {
2934 info = provRec->remoteInfo.getCString();
2935 }
2936 }
2937 #endif
|
2938 marek 1.63 //
2939 // Get cached or load new provider module
2940 //
|
2941 venkat.puvvada 1.132 OpProviderHolder ph;
|
2942 venkat.puvvada 1.110 if ((const char*)info)
2943 {
2944 ph = providerManager.getRemoteProvider
2945 (enableProviders [i]->getModule ()->getFileName (),
2946 enableProviders [i]->getName ());
2947 }
2948 else
2949 {
2950 ph = providerManager.getProvider
2951 (enableProviders [i]->getModule ()->getFileName (),
2952 enableProviders [i]->getName ());
2953 }
|
2954 venkat.puvvada 1.108 _callEnableIndications(
2955 provider,
2956 _indicationCallback,
2957 ph,
2958 (const char*)info);
|
2959 marek 1.63 }
|
2960 konrad.r 1.64 catch (const CIMException & e)
|
2961 marek 1.63 {
|
2962 thilo.boehm 1.138 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL1,
2963 "CIMException: %s",(const char*)e.getMessage().getCString()));
|
2964 marek 1.63 }
|
2965 konrad.r 1.64 catch (const Exception & e)
|
2966 marek 1.63 {
|
2967 thilo.boehm 1.138 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL1,
2968 "Exception: %s",(const char*)e.getMessage().getCString()));
|
2969 marek 1.63 }
|
2970 venkat.puvvada 1.108 catch (...)
|
2971 marek 1.63 {
|
2972 ms.aruran 1.115 PEG_TRACE_CSTRING(
2973 TRC_PROVIDERMANAGER,
|
2974 marek 1.131 Tracer::LEVEL1,
|
2975 marek 1.63 "Unknown error in handleSubscriptionInitCompleteRequest");
2976 }
2977 }
2978
2979 PEG_METHOD_EXIT ();
|
2980 venkat.puvvada 1.108 return(response);
|
2981 marek 1.63 }
2982
|
2983 venkat.puvvada 1.108 Message * CMPIProviderManager::handleGetPropertyRequest(
2984 const Message * message)
|
2985 dave.sudlik 1.98 {
|
2986 ms.aruran 1.115 PEG_METHOD_ENTER(
2987 TRC_PROVIDERMANAGER,
2988 "CMPIProviderManager::handleGetPropertyRequest()");
|
2989 dave.sudlik 1.98
2990 HandlerIntro(GetProperty,message,request,response,handler);
2991
2992 // We're only going to be interested in the specific property from this
2993 // instance.
2994 Array<CIMName> localPropertyListArray;
2995 localPropertyListArray.append(request->propertyName);
2996 CIMPropertyList localPropertyList(localPropertyListArray);
2997
2998 // NOTE: GetProperty will use the CIMInstanceProvider interface, so we
2999 // must manually define a request, response, and handler (emulate
3000 // HandlerIntro macro)
3001 CIMGetInstanceRequestMessage * GI_request =
3002 new CIMGetInstanceRequestMessage(
|
3003 venkat.puvvada 1.108 request->messageId,
3004 request->nameSpace,
3005 request->instanceName,
3006 false,
3007 false,
3008 false,
3009 localPropertyList,
3010 request->queueIds,
3011 request->authType,
3012 request->userName
3013 );
|
3014 dave.sudlik 1.98
3015 PEGASUS_ASSERT(GI_request != 0);
3016
3017 CIMGetInstanceResponseMessage * GI_response =
|
3018 venkat.puvvada 1.108 dynamic_cast<CIMGetInstanceResponseMessage*>
3019 (GI_request->buildResponse());
|
3020 dave.sudlik 1.98
3021 PEGASUS_ASSERT(GI_response != 0);
3022
|
3023 venkat.puvvada 1.108 GetInstanceResponseHandler GI_handler(
3024 GI_request,
3025 GI_response,
3026 _responseChunkCallback);
|
3027 dave.sudlik 1.98
|
3028 venkat.puvvada 1.108 try
|
3029 dave.sudlik 1.98 {
|
3030 thilo.boehm 1.138 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL3,
|
3031 marek 1.129 "CMPIProviderManager::handleGetPropertyRequest"
3032 " - Host name: %s Name space: %s "
3033 "Class name: %s Property name: %s",
3034 (const char*) System::getHostName().getCString(),
3035 (const char*) request->nameSpace.getString().getCString(),
3036 (const char*)
3037 request->instanceName.getClassName().getString().getCString(),
3038 (const char*) request->propertyName.getString().getCString()));
3039
|
3040 dave.sudlik 1.98 // make target object path
3041 CIMObjectPath objectPath(
3042 System::getHostName(),
3043 request->nameSpace,
3044 request->instanceName.getClassName(),
3045 request->instanceName.getKeyBindings());
3046
3047 Boolean remote=false;
|
3048 venkat.puvvada 1.132 OpProviderHolder ph;
|
3049 dave.sudlik 1.98
3050 // resolve provider name
|
3051 venkat.puvvada 1.108 ProviderIdContainer pidc =
3052 request->operationContext.get(ProviderIdContainer::NAME);
|
3053 dave.sudlik 1.98 ProviderName name = _resolveProviderName(pidc);
3054
|
3055 venkat.puvvada 1.108 if ((remote=pidc.isRemoteNameSpace()))
3056 {
3057 ph = providerManager.getRemoteProvider(
3058 name.getLocation(), name.getLogicalName());
|
3059 dave.sudlik 1.98 }
|
3060 venkat.puvvada 1.108 else
3061 {
3062 // get cached or load new provider module
3063 ph = providerManager.getProvider(
3064 name.getPhysicalName(), name.getLogicalName());
|
3065 dave.sudlik 1.98 }
3066
3067 // convert arguments
3068 OperationContext context;
3069
3070 context.insert(request->operationContext.get(IdentityContainer::NAME));
|
3071 venkat.puvvada 1.108 context.insert(
3072 request->operationContext.get(AcceptLanguageListContainer::NAME));
3073 context.insert(
3074 request->operationContext.get(ContentLanguageListContainer::NAME));
|
3075 dave.sudlik 1.98 // forward request
3076 CMPIProvider & pr=ph.GetProvider();
3077
3078 #ifdef PEGASUS_EMBEDDED_INSTANCE_SUPPORT
|
3079 venkat.puvvada 1.121 AutoPtr<NormalizerContext> tmpNormalizerContext(
|
3080 venkat.puvvada 1.132 new CIMOMHandleContext(*pr.getCIMOMHandle()));
|
3081 venkat.puvvada 1.121 request->operationContext.insert(
3082 NormalizerContextContainer(tmpNormalizerContext));
3083 #endif
|
3084 dave.sudlik 1.98
|
3085 thilo.boehm 1.138 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL4,
3086 "Calling provider.getInstance via getProperty: %s",
3087 (const char*)pr.getName().getCString()));
|
3088 dave.sudlik 1.98
3089 CMPIStatus rc={CMPI_RC_OK,NULL};
3090 CMPI_ContextOnStack eCtx(context);
3091 CMPI_ObjectPathOnStack eRef(objectPath);
|
3092 venkat.puvvada 1.132 CMPI_ResultOnStack eRes(GI_handler,pr.getBroker());
3093 CMPI_ThreadContext thr(pr.getBroker(),&eCtx);
|
3094 dave.sudlik 1.98
3095 // For the getInstance provider call, use the property list that we
3096 // created containing the single property from the getProperty call.
3097 CMPIPropertyList props(localPropertyList);
3098
|
3099 venkat.puvvada 1.108 // Leave includeQualifiers and includeClassOrigin as false for this
3100 // call to getInstance
|
3101 marek 1.124 _setupCMPIContexts(
|
3102 venkat.puvvada 1.108 &eCtx,
|
3103 marek 1.124 &context,
3104 &pidc,
3105 request->nameSpace.getString(),
3106 remote,
3107 false,
3108 false,
3109 true);
|
3110 dave.sudlik 1.98
3111 CMPIProvider::pm_service_op_lock op_lock(&pr);
3112
|
3113 r.kieninger 1.119 AutoPThreadSecurity threadLevelSecurity(request->operationContext);
|
3114 dave.sudlik 1.98
3115 {
3116 StatProviderTimeMeasurement providerTime(response);
3117
|
3118 venkat.puvvada 1.132 rc = pr.getInstMI()->ft->getInstance(
3119 pr.getInstMI(),
3120 &eCtx,
3121 &eRes,
3122 &eRef,
|
3123 dave.sudlik 1.98 (const char **)props.getList());
3124 }
3125
|
3126 dave.sudlik 1.99 // Need to save ContentLanguage value into operation context of response
3127 // Do this before checking rc from provider to throw exception in case
3128 // rc.msg is also localized.
3129 CMPIStatus tmprc={CMPI_RC_OK,NULL};
|
3130 venkat.puvvada 1.108 CMPIData cldata =
3131 eCtx.ft->getEntry (&eCtx, CMPIContentLanguage, &tmprc);
|
3132 dave.sudlik 1.99 if (tmprc.rc == CMPI_RC_OK)
3133 {
3134 response->operationContext.set(
3135 ContentLanguageListContainer(
|
3136 venkat.puvvada 1.108 ContentLanguageList(
3137 LanguageParser::parseContentLanguageHeader(
|
3138 s.kodali 1.137 CMGetCharsPtr(cldata.value.string, NULL)))));
|
3139 dave.sudlik 1.103 handler.setContext(response->operationContext);
|
3140 dave.sudlik 1.99 }
3141
|
3142 dave.sudlik 1.98 if (rc.rc!=CMPI_RC_OK)
|
3143 dave.sudlik 1.102 {
|
3144 venkat.puvvada 1.108 CIMException cimException(
3145 (CIMStatusCode)rc.rc,
|
3146 s.kodali 1.137 rc.msg ? CMGetCharsPtr(rc.msg, NULL) : String::EMPTY);
|
3147 venkat.puvvada 1.108
3148 if (eRes.resError)
3149 {
3150 for (CMPI_Error* currErr=eRes.resError;
|
3151 dave.sudlik 1.102 currErr!=NULL;
3152 currErr=currErr->nextError)
|
3153 venkat.puvvada 1.108 {
3154 cimException.addError(
3155 ((CIMError*)currErr->hdl)->getInstance());
3156 }
3157 }
3158 throw cimException;
|
3159 dave.sudlik 1.102 }
|
3160 dave.sudlik 1.98
3161 // Copy property value from instance to getProperty response
|
3162 venkat.puvvada 1.108 if (!(GI_response->cimInstance.isUninitialized()))
|
3163 dave.sudlik 1.98 {
|
3164 venkat.puvvada 1.108 Uint32 pos =
3165 GI_response->cimInstance.findProperty(request->propertyName);
|
3166 dave.sudlik 1.98
|
3167 venkat.puvvada 1.108 if (pos != PEG_NOT_FOUND)
|
3168 dave.sudlik 1.98 {
|
3169 venkat.puvvada 1.108 response->value =
3170 GI_response->cimInstance.getProperty(pos).getValue();
|
3171 dave.sudlik 1.98 }
3172 // Else property not found. Return CIM_ERR_NO_SUCH_PROPERTY.
3173 else
3174 {
3175 throw PEGASUS_CIM_EXCEPTION(
3176 CIM_ERR_NO_SUCH_PROPERTY,
3177 request->propertyName.getString()
3178 );
3179 }
3180 }
3181 }
3182 HandlerCatch(handler);
3183
3184 delete GI_request;
3185 delete GI_response;
3186
3187 PEG_METHOD_EXIT();
3188
3189 return(response);
3190 }
3191
|
3192 venkat.puvvada 1.108 Message * CMPIProviderManager::handleSetPropertyRequest(
3193 const Message * message)
|
3194 dave.sudlik 1.98 {
|
3195 ms.aruran 1.115 PEG_METHOD_ENTER(
3196 TRC_PROVIDERMANAGER,
3197 "CMPIProviderManager::handleSetPropertyRequest()");
|
3198 dave.sudlik 1.98
3199 HandlerIntro(SetProperty,message,request,response,handler);
3200
|
3201 venkat.puvvada 1.108 // We're only going to be interested in the specific property from this
3202 // instance.
|
3203 dave.sudlik 1.98 Array<CIMName> localPropertyListArray;
3204 localPropertyListArray.append(request->propertyName);
3205 CIMPropertyList localPropertyList(localPropertyListArray);
3206
|
3207 venkat.puvvada 1.108 // Build a modified instance with just the specific property and its
3208 // new value.
|
3209 dave.sudlik 1.98 CIMInstance localModifiedInstance(request->instanceName.getClassName());
3210 localModifiedInstance.setPath(request->instanceName);
|
3211 venkat.puvvada 1.108 localModifiedInstance.addProperty(
3212 CIMProperty(request->propertyName, request->newValue));
|
3213 dave.sudlik 1.98
|
3214 venkat.puvvada 1.108 // NOTE: SetProperty will use the CIMInstanceProvider interface, so we must
3215 // manually define a request, response, and handler.
|
3216 dave.sudlik 1.98 CIMModifyInstanceRequestMessage * MI_request =
3217 new CIMModifyInstanceRequestMessage(
|
3218 venkat.puvvada 1.108 request->messageId,
3219 request->nameSpace,
3220 localModifiedInstance,
3221 false,
3222 localPropertyList,
3223 request->queueIds,
3224 request->authType,
3225 request->userName
3226 );
|
3227 dave.sudlik 1.98
3228 PEGASUS_ASSERT(MI_request != 0);
3229
3230 CIMModifyInstanceResponseMessage * MI_response =
|
3231 venkat.puvvada 1.108 dynamic_cast<CIMModifyInstanceResponseMessage*>(
3232 MI_request->buildResponse());
|
3233 dave.sudlik 1.98
3234 PEGASUS_ASSERT(MI_response != 0);
3235
|
3236 venkat.puvvada 1.108 ModifyInstanceResponseHandler MI_handler(
3237 MI_request,
3238 MI_response,
3239 _responseChunkCallback);
|
3240 dave.sudlik 1.98
|
3241 venkat.puvvada 1.108 try
|
3242 dave.sudlik 1.98 {
|
3243 thilo.boehm 1.138 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL3,
|
3244 marek 1.129 "CMPIProviderManager::handleSetPropertyRequest"
3245 " - Host name: %s Name space: %s "
3246 "Class name: %s Property name: %s",
3247 (const char*) System::getHostName().getCString(),
3248 (const char*) request->nameSpace.getString().getCString(),
3249 (const char*)
3250 request->instanceName.getClassName().getString().getCString(),
3251 (const char*) request->propertyName.getString().getCString()));
3252
|
3253 dave.sudlik 1.98 // make target object path
3254 CIMObjectPath objectPath(
3255 System::getHostName(),
3256 request->nameSpace,
3257 request->instanceName.getClassName(),
3258 request->instanceName.getKeyBindings());
3259
3260 Boolean remote=false;
|
3261 venkat.puvvada 1.132 OpProviderHolder ph;
|
3262 dave.sudlik 1.98
3263 // resolve provider name
|
3264 venkat.puvvada 1.108 ProviderIdContainer pidc =
3265 request->operationContext.get(ProviderIdContainer::NAME);
|
3266 dave.sudlik 1.98 ProviderName name = _resolveProviderName(pidc);
3267
|
3268 venkat.puvvada 1.108 if ((remote=pidc.isRemoteNameSpace()))
3269 {
3270 ph = providerManager.getRemoteProvider(
3271 name.getLocation(), name.getLogicalName());
|
3272 dave.sudlik 1.98 }
|
3273 venkat.puvvada 1.108 else
3274 {
3275 // get cached or load new provider module
3276 ph = providerManager.getProvider(
3277 name.getPhysicalName(), name.getLogicalName());
|
3278 dave.sudlik 1.98 }
3279
3280 // convert arguments
3281 OperationContext context;
3282
3283 context.insert(request->operationContext.get(IdentityContainer::NAME));
|
3284 venkat.puvvada 1.108 context.insert(
3285 request->operationContext.get(AcceptLanguageListContainer::NAME));
3286 context.insert(
3287 request->operationContext.get(ContentLanguageListContainer::NAME));
|
3288 dave.sudlik 1.98 // forward request
3289 CMPIProvider & pr=ph.GetProvider();
3290
|
3291 thilo.boehm 1.138 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL4,
3292 "Calling provider.modifyInstance via setProperty: %s",
3293 (const char*)pr.getName().getCString()));
|
3294 dave.sudlik 1.98
3295 CMPIStatus rc={CMPI_RC_OK,NULL};
3296 CMPI_ContextOnStack eCtx(context);
3297 CMPI_ObjectPathOnStack eRef(objectPath);
|
3298 venkat.puvvada 1.132 CMPI_ResultOnStack eRes(MI_handler,pr.getBroker());
|
3299 dave.sudlik 1.98 CMPI_InstanceOnStack eInst(localModifiedInstance);
|
3300 venkat.puvvada 1.132 CMPI_ThreadContext thr(pr.getBroker(),&eCtx);
|
3301 dave.sudlik 1.98
3302 CMPIPropertyList props(localPropertyList);
3303
3304 // Leave includeQualifiers as false for this call to modifyInstance
|
3305 marek 1.124 _setupCMPIContexts(
|
3306 venkat.puvvada 1.108 &eCtx,
|
3307 marek 1.124 &context,
3308 &pidc,
3309 request->nameSpace.getString(),
3310 remote,
3311 false,
3312 false,
3313 true);
|
3314 dave.sudlik 1.98
3315 CMPIProvider::pm_service_op_lock op_lock(&pr);
3316
|
3317 r.kieninger 1.119 AutoPThreadSecurity threadLevelSecurity(request->operationContext);
|
3318 dave.sudlik 1.98
3319 {
3320 StatProviderTimeMeasurement providerTime(response);
3321
|
3322 venkat.puvvada 1.132 rc = pr.getInstMI()->ft->modifyInstance(
3323 pr.getInstMI(),
3324 &eCtx,
3325 &eRes,
3326 &eRef,
3327 &eInst,
|
3328 dave.sudlik 1.98 (const char **)props.getList());
3329 }
3330
|
3331 dave.sudlik 1.99 // Need to save ContentLanguage value into operation context of response
3332 // Do this before checking rc from provider to throw exception in case
3333 // rc.msg is also localized.
3334 CMPIStatus tmprc={CMPI_RC_OK,NULL};
|
3335 venkat.puvvada 1.108 CMPIData cldata =
3336 eCtx.ft->getEntry (&eCtx, CMPIContentLanguage, &tmprc);
|
3337 dave.sudlik 1.99 if (tmprc.rc == CMPI_RC_OK)
3338 {
3339 response->operationContext.set(
3340 ContentLanguageListContainer(
|
3341 venkat.puvvada 1.108 ContentLanguageList(
3342 LanguageParser::parseContentLanguageHeader(
|
3343 s.kodali 1.137 CMGetCharsPtr(cldata.value.string, NULL)))));
|
3344 dave.sudlik 1.103 handler.setContext(response->operationContext);
|
3345 dave.sudlik 1.99 }
3346
|
3347 dave.sudlik 1.98 if (rc.rc!=CMPI_RC_OK)
|
3348 dave.sudlik 1.102 {
|
3349 venkat.puvvada 1.108 CIMException cimException(
3350 (CIMStatusCode)rc.rc,
|
3351 s.kodali 1.137 rc.msg ? CMGetCharsPtr(rc.msg, NULL) : String::EMPTY);
|
3352 venkat.puvvada 1.108
3353 if (eRes.resError)
3354 {
3355 for (CMPI_Error* currErr=eRes.resError;
|
3356 dave.sudlik 1.102 currErr!=NULL;
3357 currErr=currErr->nextError)
|
3358 venkat.puvvada 1.108 {
3359 cimException.addError(
3360 ((CIMError*)currErr->hdl)->getInstance());
3361 }
3362 }
3363 throw cimException;
|
3364 dave.sudlik 1.102 }
|
3365 dave.sudlik 1.98 }
3366 HandlerCatch(handler);
3367
3368 delete MI_request;
3369 delete MI_response;
3370
3371 PEG_METHOD_EXIT();
3372
3373 return(response);
3374 }
3375
|
3376 venkat.puvvada 1.108 Message * CMPIProviderManager::handleUnsupportedRequest(
3377 const Message * message)
|
3378 marek 1.63 {
|
3379 ms.aruran 1.115 PEG_METHOD_ENTER(
3380 TRC_PROVIDERMANAGER,
3381 "CMPIProviderManager::handleUnsupportedRequest()");
|
3382 marek 1.63 CIMRequestMessage* request =
3383 dynamic_cast<CIMRequestMessage *>(const_cast<Message *>(message));
3384 PEGASUS_ASSERT(request != 0 );
3385
3386 CIMResponseMessage* response = request->buildResponse();
3387 response->cimException =
3388 PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
3389
3390 PEG_METHOD_EXIT();
3391 return response;
3392 }
3393
3394 ProviderName CMPIProviderManager::_resolveProviderName(
3395 const ProviderIdContainer & providerId)
3396 {
3397 String providerName;
3398 String fileName;
3399 String location;
|
3400 dmitry.mikulin 1.114 String moduleName;
|
3401 marek 1.63 CIMValue genericValue;
3402
|
3403 ms.aruran 1.115 PEG_METHOD_ENTER(
3404 TRC_PROVIDERMANAGER,
3405 "CMPIProviderManager::_resolveProviderName()");
3406
|
3407 dmitry.mikulin 1.114 genericValue = providerId.getModule().getProperty(
|
3408 marek 1.139 providerId.getModule().findProperty(
3409 PEGASUS_PROPERTYNAME_NAME)).getValue();
|
3410 dmitry.mikulin 1.114 genericValue.get(moduleName);
3411
|
3412 marek 1.63 genericValue = providerId.getProvider().getProperty(
|
3413 marek 1.139 providerId.getProvider().findProperty(
3414 PEGASUS_PROPERTYNAME_NAME)).getValue();
|
3415 marek 1.63 genericValue.get(providerName);
3416
3417 genericValue = providerId.getModule().getProperty(
3418 providerId.getModule().findProperty("Location")).getValue();
3419 genericValue.get(location);
3420 fileName = _resolvePhysicalName(location);
3421
|
3422 thilo.boehm 1.89 // An empty file name is only for interest if we are in the
3423 // local name space. So the message is only issued if not
3424 // in the remote Name Space.
3425 if (fileName == String::EMPTY && (!providerId.isRemoteNameSpace()))
3426 {
|
3427 venkat.puvvada 1.108 genericValue.get(location);
3428 String fullName = FileSystem::buildLibraryFileName(location);
3429 Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
|
3430 kumpf 1.136 MessageLoaderParms(
3431 "ProviderManager.CMPI.CMPIProviderManager.CANNOT_FIND_LIBRARY",
3432 "For provider $0 library $1 was not found.",
3433 providerName, fullName));
|
3434 thilo.boehm 1.89
3435 }
|
3436 dmitry.mikulin 1.114 ProviderName name(moduleName, providerName, fileName);
|
3437 marek 1.63 name.setLocation(location);
|
3438 ms.aruran 1.115 PEG_METHOD_EXIT();
|
3439 marek 1.63 return name;
3440 }
3441
3442 void CMPIProviderManager::_callEnableIndications
3443 (CIMInstance & req_provider,
|
3444 venkat.puvvada 1.108 PEGASUS_INDICATION_CALLBACK_T _indicationCallback,
|
3445 venkat.puvvada 1.132 OpProviderHolder & ph,
|
3446 venkat.puvvada 1.108 const char* remoteInfo)
|
3447 marek 1.63 {
|
3448 ms.aruran 1.115 PEG_METHOD_ENTER(
3449 TRC_PROVIDERMANAGER,
3450 "CMPIProviderManager::_callEnableIndications()");
|
3451 marek 1.63
3452 try
3453 {
|
3454 w.otsuka 1.86 indProvRecord *provRec =0;
|
3455 marek 1.95 {
3456 WriteLock lock(rwSemProvTab);
3457
|
3458 venkat.puvvada 1.108 if (provTab.lookup (ph.GetProvider ().getName (), provRec))
3459 {
3460 provRec->enabled = true;
3461 CIMRequestMessage * request = 0;
3462 CIMResponseMessage * response = 0;
3463 provRec->handler=new EnableIndicationsResponseHandler(
3464 request,
3465 response,
3466 req_provider,
3467 _indicationCallback,
3468 _responseChunkCallback);
3469 }
|
3470 marek 1.95 }
|
3471 marek 1.63
3472 CMPIProvider & pr=ph.GetProvider();
3473
3474 //
3475 // Versions prior to 86 did not include enableIndications routine
3476 //
|
3477 venkat.puvvada 1.132 if (pr.getIndMI()->ft->ftVersion >= 86)
|
3478 marek 1.63 {
3479 OperationContext context;
|
3480 kumpf 1.112 #ifdef PEGASUS_ZOS_THREADLEVEL_SECURITY
|
3481 venkat.puvvada 1.108 // For the z/OS security model we always need an Identity container
3482 // in the operation context. Since we don't have a client request
3483 // ID here we have to use the cim servers identity for the time
3484 // being.
3485 IdentityContainer idContainer(System::getEffectiveUserName());
3486 context.insert(idContainer);
|
3487 kumpf 1.112 #endif
|
3488 marek 1.90
|
3489 marek 1.63 CMPIStatus rc={CMPI_RC_OK,NULL};
3490 CMPI_ContextOnStack eCtx(context);
|
3491 venkat.puvvada 1.132 CMPI_ThreadContext thr(pr.getBroker(),&eCtx);
|
3492 marek 1.63
|
3493 dave.sudlik 1.100 // Add RemoteInformation -V 5245
3494 if (remoteInfo)
3495 {
3496 eCtx.ft->addEntry(&eCtx,"CMPIRRemoteInfo",
|
3497 venkat.puvvada 1.108 (CMPIValue*)(const char*)remoteInfo,CMPI_chars);
|
3498 dave.sudlik 1.100 }
3499
|
3500 thilo.boehm 1.138 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL4,
3501 "Calling provider.enableIndications: %s",
3502 (const char*)pr.getName().getCString()));
|
3503 marek 1.63
|
3504 venkat.puvvada 1.111 pr.protect();
|
3505 marek 1.63
|
3506 dave.sudlik 1.101 // enableIndications() is defined by the CMPI standard as
3507 // returning a CMPIStatus return value. Unfortunately, Pegasus
3508 // originally implemented enableIndications() with a void
3509 // return type, and this incompatibility was not detected for
3510 // some time. Since exceptions thrown from enableIndications()
3511 // are not reported (other than via logging), it was decided to
3512 // discard the returned CMPIStatus here. This will prevent us from
3513 // breaking existing CMPI Indication providers. This is ok since
3514 // there really isn't a user to which the problem should be
3515 // reported.
|
3516 venkat.puvvada 1.132 pr.getIndMI()->ft->enableIndications(pr.getIndMI(),&eCtx);
|
3517 marek 1.63 }
3518 else
3519 {
|
3520 thilo.boehm 1.138 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL4,
3521 "Not calling provider.enableIndications: %s routine as it is "
3522 "an earlier version that does not support this function",
3523 (const char*)pr.getName().getCString()));
|
3524 marek 1.63 }
3525 }
|
3526 konrad.r 1.64 catch (const Exception & e)
|
3527 marek 1.63 {
|
3528 kumpf 1.136 Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::WARNING,
3529 MessageLoaderParms(
3530 "ProviderManager.CMPI.CMPIProviderManager."
3531 "ENABLE_INDICATIONS_FAILED",
3532 "Failed to enable indications for provider $0: $1.",
3533 ph.GetProvider().getName(), e.getMessage()));
|
3534 marek 1.63 }
|
3535 venkat.puvvada 1.108 catch (...)
|
3536 marek 1.63 {
|
3537 kumpf 1.136 Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::WARNING,
3538 MessageLoaderParms(
3539 "ProviderManager.CMPI.CMPIProviderManager."
3540 "ENABLE_INDICATIONS_FAILED_UNKNOWN",
3541 "Failed to enable indications for provider $0.",
3542 ph.GetProvider().getName()));
|
3543 marek 1.63 }
3544
3545 PEG_METHOD_EXIT ();
3546 }
3547
3548 void CMPIProviderManager::_callDisableIndications
|
3549 venkat.puvvada 1.132 (OpProviderHolder & ph, const char *remoteInfo)
|
3550 marek 1.63 {
|
3551 ms.aruran 1.115 PEG_METHOD_ENTER(
3552 TRC_PROVIDERMANAGER,
3553 "CMPIProviderManager::_callDisableIndications()");
|
3554 marek 1.63
|
3555 dave.sudlik 1.101 try
|
3556 marek 1.95 {
|
3557 dave.sudlik 1.101 indProvRecord * provRec = 0;
3558 {
3559 WriteLock writeLock(rwSemProvTab);
|
3560 venkat.puvvada 1.108 if (provTab.lookup (ph.GetProvider ().getName (), provRec))
3561 {
3562 provRec->enabled = false;
3563 if (provRec->handler) delete provRec->handler;
3564 provRec->handler = NULL;
3565 }
|
3566 dave.sudlik 1.101 }
3567
3568 CMPIProvider & pr=ph.GetProvider();
|
3569 marek 1.63
|
3570 dave.sudlik 1.101 //
3571 // Versions prior to 86 did not include disableIndications routine
3572 //
|
3573 venkat.puvvada 1.132 if (pr.getIndMI()->ft->ftVersion >= 86)
|
3574 dave.sudlik 1.101 {
3575 OperationContext context;
3576 CMPIStatus rc={CMPI_RC_OK,NULL};
3577 CMPI_ContextOnStack eCtx(context);
3578
3579 if (remoteInfo)
3580 {
|
3581 venkat.puvvada 1.108 eCtx.ft->addEntry(&eCtx,"CMPIRRemoteInfo",
3582 (CMPIValue*)(const char*)remoteInfo,CMPI_chars);
|
3583 dave.sudlik 1.101 }
|
3584 venkat.puvvada 1.132 CMPI_ThreadContext thr(pr.getBroker(),&eCtx);
|
3585 dave.sudlik 1.96
|
3586 thilo.boehm 1.138 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL4,
3587 "Calling provider.disableIndications: %s",
3588 (const char*)pr.getName().getCString()));
|
3589 dave.sudlik 1.100
|
3590 dave.sudlik 1.101 // disableIndications() is defined by the CMPI standard as
3591 // returning a CMPIStatus return value. Unfortunately, Pegasus
3592 // originally implemented disableIndications() with a void
3593 // return type, and this incompatibility was not detected for
3594 // some time. For consistency with the enableIndications()
3595 // interface, it was decided to discard the returned CMPIStatus
3596 // here. This will prevent us from breaking existing CMPI
3597 // Indication providers. This is ok since there really isn't a
3598 // user to which the problem should be reported.
|
3599 venkat.puvvada 1.132 pr.getIndMI()->ft->disableIndications(
3600 pr.getIndMI(),
|
3601 venkat.puvvada 1.108 &eCtx);
|
3602 marek 1.63
|
3603 venkat.puvvada 1.111 pr.unprotect();
|
3604 dave.sudlik 1.101 }
3605 else
3606 {
|
3607 thilo.boehm 1.138 PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL4,
3608 "Not calling provider.disableIndications: %s routine as it is "
3609 "an earlier version that does not support this function",
3610 (const char*)pr.getName().getCString()));
|
3611 dave.sudlik 1.101 }
3612 }
3613 catch (const Exception & e)
3614 {
|
3615 kumpf 1.136 Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::WARNING,
3616 MessageLoaderParms(
3617 "ProviderManager.CMPI.CMPIProviderManager."
3618 "DISABLE_INDICATIONS_FAILED",
3619 "Failed to disable indications for provider $0: $1.",
3620 ph.GetProvider().getName(), e.getMessage()));
|
3621 marek 1.63 }
|
3622 venkat.puvvada 1.108 catch (...)
|
3623 marek 1.63 {
|
3624 kumpf 1.136 Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::WARNING,
3625 MessageLoaderParms(
3626 "ProviderManager.CMPI.CMPIProviderManager."
3627 "DISABLE_INDICATIONS_FAILED_UNKNOWN",
3628 "Failed to disable indications for provider $0.",
3629 ph.GetProvider().getName()));
|
3630 marek 1.63 }
3631
3632 PEG_METHOD_EXIT ();
3633 }
3634
3635 PEGASUS_NAMESPACE_END
|
3636 venkat.puvvada 1.108
|