1 kumpf 1.106 //%/////////////////////////////////////////////////////////////////////////////
|
2 mike 1.2 //
|
3 kumpf 1.106 // Copyright (c) 2000, 2001, 2002 BMC Software, Hewlett-Packard Company, IBM,
|
4 mike 1.2 // The Open Group, Tivoli Systems
5 //
6 // Permission is hereby granted, free of charge, to any person obtaining a copy
7 // of this software and associated documentation files (the "Software"), to
8 // deal in the Software without restriction, including without limitation the
9 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 // sell copies of the Software, and to permit persons to whom the Software is
11 // furnished to do so, subject to the following conditions:
|
12 kumpf 1.106 //
|
13 mike 1.2 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
14 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
15 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
16 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
17 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
18 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
19 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21 //
22 //==============================================================================
23 //
24 // Author: Mike Brasher (mbrasher@bmc.com)
25 //
26 // Modified By: Nag Boranna, Hewlett-Packard Company (nagaraja_boranna@hp.com)
27 // Chip Vincent (cvincent@us.ibm.com)
28 // Yi Zhou, Hewlett-Packard Company (yi_zhou@hp.com)
29 // Nitin Upasani, Hewlett-Packard Company (Nitin_Upasani@hp.com)
30 // Roger Kumpf, Hewlett-Packard Company (roger_kumpf@hp.com)
|
31 chip 1.6 // Mike Day (mdday@us.ibm.com)
|
32 mike 1.2 // Carol Ann Krug Graves, Hewlett-Packard Company
33 // (carolann_graves@hp.com)
|
34 sage 1.77 // Arthur Pichlkostner (via Markus: sedgewick_de@yahoo.de)
|
35 kumpf 1.80 // Jenny Yu, Hewlett-Packard Company (jenny_yu@hp.com)
|
36 kumpf 1.105 // Karl Schopmeyer (k.schopmeyer@opengroup.org)
|
37 mike 1.2 //
38 //%/////////////////////////////////////////////////////////////////////////////
39
|
40 chip 1.17 #include "CIMOperationRequestDispatcher.h"
|
41 mday 1.89 #include <Pegasus/suballoc/suballoc.h>
|
42 kumpf 1.66 #include <Pegasus/Common/Constants.h>
|
43 kumpf 1.30 #include <Pegasus/Common/XmlReader.h> // stringToValue(), stringArrayToValue()
|
44 sage 1.77 #include <Pegasus/Common/StatisticalData.h>
|
45 kumpf 1.40 #include <Pegasus/Common/Tracer.h>
|
46 karl 1.97 #include <Pegasus/Common/Formatter.h>
|
47 kumpf 1.30
|
48 mike 1.2 PEGASUS_NAMESPACE_BEGIN
49
|
50 chip 1.14 PEGASUS_USING_STD;
|
51 kumpf 1.109 //#define LIMIT_ENUM_TO_ONE_LEVEL
|
52 karl 1.96
|
53 mday 1.89 namespace
54 {
|
55 kumpf 1.90 static peg_suballocator::SUBALLOC_HANDLE *dq_handle = new peg_suballocator::SUBALLOC_HANDLE();
|
56 mday 1.89 }
57
|
58 chip 1.39 CIMOperationRequestDispatcher::CIMOperationRequestDispatcher(
59 CIMRepository* repository,
|
60 kumpf 1.64 ProviderRegistrationManager* providerRegistrationManager)
|
61 mday 1.36 :
|
62 kumpf 1.74 Base(PEGASUS_QUEUENAME_OPREQDISPATCHER),
|
63 mday 1.36 _repository(repository),
|
64 kumpf 1.64 _providerRegistrationManager(providerRegistrationManager)
|
65 mike 1.2 {
|
66 mday 1.89
|
67 kumpf 1.59 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
68 kumpf 1.104 "CIMOperationRequestDispatcher::CIMOperationRequestDispatcher");
69
70 // Check whether or not AssociationTraversal is supported.
71 //
72 ConfigManager* configManager = ConfigManager::getInstance();
73 _enableAssociationTraversal = String::equal(
74 configManager->getCurrentValue("enableAssociationTraversal"), "true");
|
75 kumpf 1.111 _enableIndicationService = String::equal(
76 configManager->getCurrentValue("enableIndicationService"), "true");
|
77 kumpf 1.104
|
78 kumpf 1.59 PEG_METHOD_EXIT();
|
79 chip 1.39 }
|
80 mike 1.2
|
81 karl 1.81 CIMOperationRequestDispatcher::~CIMOperationRequestDispatcher(void)
|
82 mike 1.2 {
|
83 kumpf 1.59 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
84 kumpf 1.73 "CIMOperationRequestDispatcher::~CIMOperationRequestDispatcher");
|
85 mday 1.36 _dying = 1;
|
86 kumpf 1.59 PEG_METHOD_EXIT();
|
87 mike 1.2 }
88
|
89 mday 1.23 void CIMOperationRequestDispatcher::_handle_async_request(AsyncRequest *req)
90 {
|
91 kumpf 1.59 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
92 kumpf 1.73 "CIMOperationRequestDispatcher::_handle_async_request");
|
93 kumpf 1.59
|
94 chip 1.39 // pass legacy operations to handleEnqueue
95 if(req->getType() == async_messages::ASYNC_LEGACY_OP_START)
96 {
97 req->op->processing();
|
98 kumpf 1.25
|
99 chip 1.39 Message * message = (static_cast<AsyncLegacyOperationStart *>(req)->get_action());
100
101 handleEnqueue(message);
102
|
103 kumpf 1.59 PEG_METHOD_EXIT();
|
104 chip 1.39 return;
105 }
|
106 mday 1.23
|
107 chip 1.39 // pass all other operations to the default handler
108 Base::_handle_async_request(req);
|
109 kumpf 1.59 PEG_METHOD_EXIT();
|
110 mday 1.23 }
111
|
112 kumpf 1.57 Boolean CIMOperationRequestDispatcher::_lookupInternalProvider(
113 const String& nameSpace,
114 const String& className,
115 String& service,
116 String& provider)
117 {
|
118 kumpf 1.59 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
119 kumpf 1.73 "CIMOperationRequestDispatcher::_lookupInternalProvider");
|
120 karl 1.81 // Clear the strings since used as test later. Poor code but true now
121 service = String::EMPTY;
122 provider = String::EMPTY;
|
123 kumpf 1.59
|
124 kumpf 1.107 if (String::equalNoCase(className, PEGASUS_CLASSNAME_CONFIGSETTING) &&
125 String::equalNoCase(nameSpace, PEGASUS_NAMESPACENAME_CONFIG))
|
126 kumpf 1.61 {
|
127 kumpf 1.74 service = PEGASUS_QUEUENAME_CONTROLSERVICE;
|
128 kumpf 1.66 provider = PEGASUS_MODULENAME_CONFIGPROVIDER;
|
129 karl 1.81 PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4,
|
130 kumpf 1.105 "Internal provider Service = " + service + " provider " + provider + " found.");
|
131 kumpf 1.61 PEG_METHOD_EXIT();
132 return true;
133 }
|
134 kumpf 1.107 if ((String::equalNoCase(className, PEGASUS_CLASSNAME_AUTHORIZATION) &&
135 String::equalNoCase(nameSpace, PEGASUS_NAMESPACENAME_AUTHORIZATION)) ||
136 (String::equalNoCase(className, PEGASUS_CLASSNAME_USER) &&
137 String::equalNoCase(nameSpace, PEGASUS_NAMESPACENAME_USER)))
|
138 kumpf 1.63 {
|
139 kumpf 1.74 service = PEGASUS_QUEUENAME_CONTROLSERVICE;
|
140 kumpf 1.66 provider = PEGASUS_MODULENAME_USERAUTHPROVIDER;
|
141 karl 1.81 PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4,
|
142 kumpf 1.105 "Internal provider Service = " + service + " provider " + provider + " found.");
|
143 kumpf 1.80 PEG_METHOD_EXIT();
144 return true;
145 }
|
146 kumpf 1.107 if (String::equalNoCase(className, PEGASUS_CLASSNAME_SHUTDOWN) &&
147 String::equalNoCase(nameSpace, PEGASUS_NAMESPACENAME_SHUTDOWN))
|
148 kumpf 1.80 {
149 service = PEGASUS_QUEUENAME_CONTROLSERVICE;
150 provider = PEGASUS_MODULENAME_SHUTDOWNPROVIDER;
|
151 karl 1.81 PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4,
|
152 kumpf 1.105 "Internal provider Service = " + service + " provider " + provider + " found.");
|
153 kumpf 1.63 PEG_METHOD_EXIT();
154 return true;
155 }
|
156 karl 1.81 if (String::equalNoCase(className, PEGASUS_CLASSNAME___NAMESPACE) ||
157 String::equalNoCase(className, PEGASUS_CLASSNAME_NAMESPACE))
158 {
159 service = PEGASUS_QUEUENAME_CONTROLSERVICE;
160 provider = PEGASUS_MODULENAME_NAMESPACEPROVIDER;
161 PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4,
|
162 kumpf 1.105 "Internal provider Service = " + service + " provider " + provider + " found.");
|
163 karl 1.81 PEG_METHOD_EXIT();
164 return true;
165 }
166
|
167 kumpf 1.107 if ((String::equalNoCase(className, PEGASUS_CLASSNAME_PROVIDERMODULE) ||
168 String::equalNoCase(className, PEGASUS_CLASSNAME_PROVIDER) ||
169 String::equalNoCase(className, PEGASUS_CLASSNAME_PROVIDERCAPABILITIES)) &&
170 String::equalNoCase(nameSpace, PEGASUS_NAMESPACENAME_PROVIDERREG))
|
171 kumpf 1.57 {
|
172 kumpf 1.74 service = PEGASUS_QUEUENAME_CONTROLSERVICE;
|
173 kumpf 1.66 provider = PEGASUS_MODULENAME_PROVREGPROVIDER;
|
174 karl 1.81 PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4,
|
175 kumpf 1.105 "Internal provider Service = " + service + " provider " + provider + " found.");
|
176 kumpf 1.59 PEG_METHOD_EXIT();
|
177 kumpf 1.57 return true;
178 }
|
179 kumpf 1.111 if (_enableIndicationService &&
180 (String::equalNoCase(className, PEGASUS_CLASSNAME_INDSUBSCRIPTION) ||
181 String::equalNoCase(className, PEGASUS_CLASSNAME_INDHANDLER) ||
182 String::equalNoCase(className, PEGASUS_CLASSNAME_INDHANDLER_CIMXML) ||
183 String::equalNoCase(className, PEGASUS_CLASSNAME_INDHANDLER_SNMP) ||
184 String::equalNoCase(className, PEGASUS_CLASSNAME_INDFILTER)))
|
185 kumpf 1.57 {
|
186 kumpf 1.74 service = PEGASUS_QUEUENAME_INDICATIONSERVICE;
|
187 kumpf 1.57 provider = String::EMPTY;
|
188 karl 1.81 PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4,
|
189 kumpf 1.105 "Internal provider Service = "
|
190 karl 1.81 + service + " provider " + provider + " found.");
|
191 kumpf 1.59 PEG_METHOD_EXIT();
|
192 kumpf 1.57 return true;
193 }
|
194 kumpf 1.59 PEG_METHOD_EXIT();
|
195 kumpf 1.57 return false;
196 }
|
197 karl 1.96
198 /* _getSubClassNames - Gets the names of all subclasses of the defined
199 class (including the class) and returns it in an array of strings. Uses a similar
|
200 karl 1.97 function in the repository class to get the names. Note that this prepends
201 the result with the input classname.
|
202 karl 1.96 @param namespace
203 @param className
204 @return Array of strings with class names. Note that there should be at least
205 one classname in the array (the input name)
206 Note that there is a special exception to this function, the __namespace class
207 which does not have any representation in the class repository.
208 @exception CIMException(CIM_ERR_INVALID_CLASS)
209 */
210 Array<String> CIMOperationRequestDispatcher::_getSubClassNames(
211 String& nameSpace,
212 String& className) throw(CIMException)
213 {
214 PEG_METHOD_ENTER(TRC_DISPATCHER,
215 "CIMOperationRequestDispatcher::_getSubClassNames");
|
216 karl 1.97
|
217 karl 1.96 Array<String> subClassNames;
218 //
219 // Get names of descendent classes:
220 //
221 if(!String::equalNoCase(className, PEGASUS_CLASSNAME___NAMESPACE))
222 {
|
223 karl 1.97 try
224 {
225 // Get the complete list of subclass names
226 _repository->getSubClassNames(nameSpace,
227 className, true, subClassNames);
228 }
229 catch(CIMException& e)
230 {
231 // Gets exception back from the getSubClasses if class does not exist
232 PEG_METHOD_EXIT();
233 throw e;
234 }
|
235 karl 1.96 }
|
236 karl 1.97 // Prepend the array with the classname that formed the array.
|
237 karl 1.96 subClassNames.prepend(className);
238 return subClassNames;
239 }
240
241
|
242 karl 1.86 /* _lookupInstanceProvider - Looks up the instance provider for the
243 classname and namespace.
244 Returns the name of the provider.
|
245 karl 1.96 ATTN KS: P0 8 May 2002QUESTION: Why are we getting the name of the provider.
|
246 karl 1.97 ATTN: This needs to be combined with lookupnewinstanceprovider to form a single
247 function
|
248 karl 1.86 be satisfied with the existance and not need the name.
249 Shouldn't we be able to change this to a binary return???
250 */
|
251 kumpf 1.43 String CIMOperationRequestDispatcher::_lookupInstanceProvider(
|
252 mday 1.36 const String& nameSpace,
253 const String& className)
|
254 mike 1.2 {
|
255 kumpf 1.43 CIMInstance pInstance;
256 CIMInstance pmInstance;
257 String providerName;
|
258 chip 1.12
|
259 karl 1.81 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
260 kumpf 1.52 "CIMOperationRequestDispatcher::_lookupInstanceProvider");
|
261 kumpf 1.54 if (_providerRegistrationManager->lookupInstanceProvider(
|
262 sage 1.75 nameSpace, className, pInstance, pmInstance, false))
|
263 kumpf 1.43 {
264 // get the provder name
265 Uint32 pos = pInstance.findProperty("Name");
266
267 if ( pos != PEG_NOT_FOUND )
268 {
269 pInstance.getProperty(pos).getValue().get(providerName);
270
|
271 karl 1.81 PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4,
|
272 kumpf 1.52 "providerName = " + providerName + " found.");
273 PEG_METHOD_EXIT();
|
274 kumpf 1.43 return (providerName);
275 }
276 else
277 {
|
278 karl 1.96 PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4,
279 "providerName = " + providerName + ". Provider name not found.");
|
280 kumpf 1.52 PEG_METHOD_EXIT();
|
281 kumpf 1.43 return(String::EMPTY);
282 }
283 }
284 else
285 {
|
286 karl 1.96 PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4,
|
287 kumpf 1.102 "Provider for " + className + " not found.");
|
288 kumpf 1.52 PEG_METHOD_EXIT();
|
289 kumpf 1.43 return(String::EMPTY);
290 }
291 }
292
|
293 karl 1.86 /* _lookupNewInstanceProvider - Looks up the internal and/or instance provider
294 for the defined namespace and class and returns the serviceName and
295 control provider name if a provider is found
296 @return true if an service, control provider, or instance provider is found
297 for the defined class and namespace.
298 This should be combined with the lookupInstanceProvider code eventually but
299 the goal now was to simplify the handlers.
|
300 karl 1.97 ATTN: KS P3 20 May 2002 Merge this with lookupinstnaceprovider
|
301 karl 1.86 */
302 Boolean CIMOperationRequestDispatcher::_lookupNewInstanceProvider(
303 const String& nameSpace,
304 const String& className,
305 String& serviceName,
306 String& controlProviderName)
307 {
308 PEG_METHOD_ENTER(TRC_DISPATCHER,
309 "CIMOperationRequestDispatcher::_lookupNewInstanceProvider");
310 //cout << "KSTEST lookupnewinstanceprovider "
311 // << " namespace " << nameSpace
312 // << " class " << className << endl;
313 Boolean hasProvider = false;
314 String providerName = String::EMPTY;
315
316 // Check for class provided by an internal provider
317 if (_lookupInternalProvider(nameSpace, className, serviceName,
318 controlProviderName))
319 hasProvider = true;
320 else
321 {
322 karl 1.86 // get provider for class
323 providerName = _lookupInstanceProvider(nameSpace, className);
324 }
325
326 if(providerName != String::EMPTY)
327 {
328
329 serviceName = PEGASUS_QUEUENAME_PROVIDERMANAGER_CPP;
330 hasProvider = true;
331 }
332 PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4,
333 "Lookup Provider = "
334 + serviceName + " provider " + providerName + " found."
335 + " return= " + (hasProvider? "true" : "false"));
336
337 PEG_METHOD_EXIT();
338
339 return hasProvider;
340
341 }
342
|
343 kumpf 1.43 String CIMOperationRequestDispatcher::_lookupMethodProvider(
344 const String& nameSpace,
345 const String& className,
346 const String& methodName)
347 {
|
348 karl 1.81 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
349 kumpf 1.73 "CIMOperationRequestDispatcher::_lookupMethodProvider");
|
350 kumpf 1.59
|
351 kumpf 1.43 CIMInstance pInstance;
352 CIMInstance pmInstance;
353 String providerName;
|
354 chip 1.12
|
355 kumpf 1.54 if (_providerRegistrationManager->lookupMethodProvider(
|
356 kumpf 1.43 nameSpace, className, methodName, pInstance, pmInstance))
357 {
358 // get the provder name
359 Uint32 pos = pInstance.findProperty("Name");
|
360 chip 1.12
|
361 kumpf 1.43 if ( pos != PEG_NOT_FOUND )
362 {
363 pInstance.getProperty(pos).getValue().get(providerName);
364
|
365 kumpf 1.59 PEG_METHOD_EXIT();
|
366 kumpf 1.43 return (providerName);
367 }
368 else
369 {
|
370 kumpf 1.59 PEG_METHOD_EXIT();
|
371 kumpf 1.43 return(String::EMPTY);
372 }
373 }
374 else
375 {
|
376 kumpf 1.59 PEG_METHOD_EXIT();
377 return(String::EMPTY);
|
378 kumpf 1.43 }
379 }
|
380 kumpf 1.16
|
381 chip 1.46 // ATTN-YZ-P1-20020305: Implement this interface
|
382 sage 1.75 //
383 // ATTN Markus:
384 // algorithm: enumerateClassnames, find all association providers
385 // registered for classes and give back this list
386
387 Array<String> CIMOperationRequestDispatcher::_lookupAssociationProvider(
|
388 kumpf 1.43 const String& nameSpace,
|
389 sage 1.75 const String& className,
|
390 kumpf 1.76 const String& assocClassName,
391 const String& resultClassName)
|
392 kumpf 1.43 {
|
393 sage 1.75 Array<CIMInstance> pInstances; // Provider
394 Array<CIMInstance> pmInstances; // ProviderModule
395
396 Array<String> providerNames;
397 String providerName;
398
|
399 karl 1.81 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
400 kumpf 1.73 "CIMOperationRequestDispatcher::_lookupAssociationProvider");
|
401 kumpf 1.59
|
402 sage 1.75 // assume assocClassName is empty
403 // algorithm: enumerateClassnames, find all association providers
404 // registered for classes and give back this list
405
406 if (_providerRegistrationManager->lookupAssociationProvider(
407 nameSpace, className, assocClassName, resultClassName,
408 pInstances, pmInstances))
409 {
410
411 for(Uint32 i=0,n=pInstances.size(); i<n; i++)
412 {
413 // get the provider name
414 Uint32 pos = pInstances[i].findProperty("Name");
415
416 if ( pos != PEG_NOT_FOUND )
417 {
418 pInstances[i].getProperty(pos).getValue().get(providerName);
419
|
420 karl 1.81 PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4,
|
421 sage 1.75 "providerName = " + providerName + " found.");
422 providerNames.append(providerName);
423 }
424 }
425 }
426
|
427 kumpf 1.59 PEG_METHOD_EXIT();
|
428 sage 1.75
429 return providerNames;
|
430 mike 1.2 }
431
|
432 kumpf 1.109 /* Common Dispatcher callback for response aggregation.
433 */
434 void CIMOperationRequestDispatcher::_forwardForAggregationCallback(
435 AsyncOpNode *op,
436 MessageQueue *q,
437 void *parm)
|
438 mday 1.70 {
|
439 karl 1.81 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
440 kumpf 1.109 "CIMOperationRequestDispatcher::_forwardForAggregationCallback");
441
442 CIMOperationRequestDispatcher *service =
443 static_cast<CIMOperationRequestDispatcher *>(q);
444
445 AsyncRequest *asyncRequest = static_cast<AsyncRequest *>(op->get_request());
446 AsyncReply *asyncReply = static_cast<AsyncReply *>(op->get_response());
|
447 kumpf 1.73
|
448 kumpf 1.109 OperationAggregate* poA = reinterpret_cast<OperationAggregate*>(parm);
449 PEGASUS_ASSERT(poA != 0);
|
450 mday 1.70
|
451 kumpf 1.109 // Verify that the aggregator is valid.
452 PEGASUS_ASSERT(poA->valid());
453
454 CIMResponseMessage *response;
455
456 Uint32 msgType = asyncReply->getType();
457
458 if (msgType == async_messages::ASYNC_LEGACY_OP_RESULT)
459 {
460 response = reinterpret_cast<CIMResponseMessage *>
461 ((static_cast<AsyncLegacyOperationResult *>(asyncReply))->get_result());
462 }
463 else if (msgType == async_messages::ASYNC_MODULE_OP_RESULT)
464 {
465 response = reinterpret_cast<CIMResponseMessage *>
466 ((static_cast<AsyncModuleOperationResult *>(asyncReply))->get_result());
467 }
468 else
469 {
470 // Error
471 }
|
472 mday 1.82
|
473 kumpf 1.109 PEGASUS_ASSERT(response != 0);
474 PEGASUS_ASSERT(response->messageId == poA->_messageId);
|
475 karl 1.96
|
476 kumpf 1.109 poA->appendResponse(response);
477 /*cout << "KSTEST counts "
478 << "total issued = " << poA->totalIssued()
479 << "number responses = " << poA->numberResponses()
480 << " Total Operations outstanding = " << size
481 << endl;*/
|
482 karl 1.96
|
483 kumpf 1.109 delete asyncRequest;
484 delete asyncReply;
485 op->release();
486 service->return_op(op);
|
487 karl 1.96
|
488 kumpf 1.109 // If all responses received, call the postProcessor
489 if (poA->totalIssued() == poA->numberResponses())
490 {
491 service->handleOperationResponseAggregation(poA);
492 }
|
493 karl 1.96
|
494 kumpf 1.109 PEG_METHOD_EXIT();
|
495 mday 1.70 }
496
|
497 kumpf 1.109
498 /* Common Dispatcher callback.
|
499 karl 1.97 */
|
500 kumpf 1.109 void CIMOperationRequestDispatcher::_forwardRequestCallback(
501 AsyncOpNode *op,
502 MessageQueue *q,
503 void *parm)
|
504 karl 1.96 {
505 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
506 kumpf 1.109 "CIMOperationRequestDispatcher::_forwardRequestCallback");
|
507 karl 1.96
|
508 kumpf 1.109 CIMOperationRequestDispatcher *service =
509 static_cast<CIMOperationRequestDispatcher *>(q);
|
510 karl 1.96
|
511 kumpf 1.109 AsyncRequest *asyncRequest = static_cast<AsyncRequest *>(op->get_request());
512 AsyncReply *asyncReply = static_cast<AsyncReply *>(op->get_response());
|
513 karl 1.96
|
514 kumpf 1.109 CIMResponseMessage *response;
|
515 karl 1.96
|
516 kumpf 1.109 Uint32 msgType = asyncReply->getType();
|
517 karl 1.96
|
518 kumpf 1.109 if(msgType == async_messages::ASYNC_LEGACY_OP_RESULT)
519 {
520 response = reinterpret_cast<CIMResponseMessage *>
521 ((static_cast<AsyncLegacyOperationResult *>(asyncReply))->get_result());
522 }
523 else if(msgType == async_messages::ASYNC_MODULE_OP_RESULT)
524 {
525 response = reinterpret_cast<CIMResponseMessage *>
526 ((static_cast<AsyncModuleOperationResult *>(asyncReply))->get_result());
527 }
528 else
529 {
530 // Error
531 }
|
532 karl 1.96
|
533 kumpf 1.109 PEGASUS_ASSERT(response != 0);
|
534 karl 1.96
|
535 kumpf 1.109 // ensure that the destination queue is in response->dest
|
536 karl 1.96 #ifdef PEGASUS_ARCHITECTURE_IA64
|
537 kumpf 1.109 response->dest = (Uint64)parm;
|
538 karl 1.96 #else
|
539 kumpf 1.109 response->dest = (Uint32)parm;
|
540 karl 1.96 #endif
541
|
542 kumpf 1.109 PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL3,
543 "Forwarding " + String(MessageTypeToString(response->getType())) +
544 " via Callback to " +
545 ((MessageQueue::lookup(response->dest)) ?
546 String( ((MessageQueue::lookup(response->dest))->getQueueName()) ) :
547 String("BAD queue name")));
548
549 if(parm != 0 )
550 service->SendForget(response);
551 else
552 delete response;
553
554 delete asyncRequest;
555 delete asyncReply;
556 op->release();
557 service->return_op(op);
|
558 karl 1.96
|
559 kumpf 1.109 PEG_METHOD_EXIT();
|
560 karl 1.96 }
561
562
|
563 kumpf 1.61 void CIMOperationRequestDispatcher::_forwardRequestToService(
564 const String& serviceName,
565 CIMRequestMessage* request,
566 CIMResponseMessage*& response)
567 {
568 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
569 kumpf 1.73 "CIMOperationRequestDispatcher::_forwardRequestToService");
|
570 kumpf 1.61
571 Array<Uint32> serviceIds;
572 find_services(serviceName, 0, 0, &serviceIds);
573 PEGASUS_ASSERT(serviceIds.size() != 0);
574
575 AsyncOpNode * op = this->get_op();
576
577 AsyncLegacyOperationStart * asyncRequest =
578 new AsyncLegacyOperationStart(
579 get_next_xid(),
580 op,
581 serviceIds[0],
582 request,
583 this->getQueueId());
|
584 karl 1.96
|
585 mday 1.82 asyncRequest->dest = serviceIds[0];
586
587 PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL3,
|
588 kumpf 1.109 "Forwarding " + String(MessageTypeToString(request->getType())) +
589 " to service " + serviceName + ". Response should go to queue " +
590 ((MessageQueue::lookup(request->queueIds.top())) ?
591 String( ((MessageQueue::lookup(request->queueIds.top()))->getQueueName()) ) :
592 String("BAD queue name")));
593
|
594 mday 1.82 SendAsync(op,
|
595 mday 1.70 serviceIds[0],
|
596 kumpf 1.109 CIMOperationRequestDispatcher::_forwardRequestCallback,
|
597 mday 1.70 this,
598 (void *)request->queueIds.top());
|
599 karl 1.81
|
600 kumpf 1.109 PEG_METHOD_EXIT();
|
601 kumpf 1.61 }
602
|
603 karl 1.84 /* Send a OperationsRequest message to a Control provider - Forwards the message
604 defined in request to the Control Provider defined in controlProviderName.
605 This is an internal function.
606 */
|
607 kumpf 1.61 void CIMOperationRequestDispatcher::_forwardRequestToControlProvider(
608 const String& serviceName,
609 const String& controlProviderName,
610 CIMRequestMessage* request,
611 CIMResponseMessage*& response)
612 {
|
613 kumpf 1.109 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
614 kumpf 1.73 "CIMOperationRequestDispatcher::_forwardRequestToControlProvider");
|
615 kumpf 1.61
616 Array<Uint32> serviceIds;
617 find_services(serviceName, 0, 0, &serviceIds);
618 PEGASUS_ASSERT(serviceIds.size() != 0);
619
620 AsyncOpNode * op = this->get_op();
621
622 AsyncModuleOperationStart * moduleControllerRequest =
623 new AsyncModuleOperationStart(
624 get_next_xid(),
625 op,
626 serviceIds[0],
627 this->getQueueId(),
628 true,
629 controlProviderName,
630 request);
|
631 mday 1.82
632 PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL3,
|
633 kumpf 1.109 "Forwarding " + String(MessageTypeToString(request->getType())) +
634 " to service " + serviceName +
635 ", control provider " + controlProviderName +
636 ". Response should go to queue " +
637 ((MessageQueue::lookup(request->queueIds.top())) ?
638 String( ((MessageQueue::lookup(request->queueIds.top()))->getQueueName()) ) :
639 String("BAD queue name")));
640
641 // Send to the Control provider
|
642 mday 1.82 SendAsync(op,
643 serviceIds[0],
|
644 kumpf 1.109 CIMOperationRequestDispatcher::_forwardRequestCallback,
|
645 mday 1.82 this,
646 (void *)request->queueIds.top());
|
647 kumpf 1.61
648 PEG_METHOD_EXIT();
649 }
|
650 karl 1.96
651
|
652 karl 1.84 /* This function simply decides based on the controlProviderNameField
653 whether to forward to Service or ControlProvider.
|
654 kumpf 1.109 If controlProviderName String empty, ToService, else toControlProvider.
655 This function specifically forwards requests for response aggregation.
656 */
657 void CIMOperationRequestDispatcher::_forwardRequestForAggregation(
658 const String& serviceName,
659 const String& controlProviderName,
660 CIMRequestMessage* request,
661 OperationAggregate* poA)
662 {
663 PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
664 "CIMOperationRequestDispatcher::_forwardRequestForAggregation");
665
666 Array<Uint32> serviceIds;
667 find_services(serviceName, 0, 0, &serviceIds);
668 PEGASUS_ASSERT(serviceIds.size() != 0);
669
670 AsyncOpNode * op = this->get_op();
671
672 // If ControlProviderName empty, forward to service.
673 if (controlProviderName == String::EMPTY)
674 {
675 kumpf 1.109 AsyncLegacyOperationStart * asyncRequest =
676 new AsyncLegacyOperationStart(
677 get_next_xid(),
678 op,
679 serviceIds[0],
680 request,
681 this->getQueueId());
682
683 PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL3,
684 "Forwarding " + String(MessageTypeToString(request->getType())) +
685 " to service " + serviceName + ". Response should go to queue " +
686 ((MessageQueue::lookup(request->queueIds.top())) ?
687 String( ((MessageQueue::lookup(request->queueIds.top()))->getQueueName()) ) :
688 String("BAD queue name")));
689
690 SendAsync(op,
691 serviceIds[0],
692 CIMOperationRequestDispatcher::_forwardForAggregationCallback,
693 this,
694 poA);
695 }
696 kumpf 1.109 else
697 {
698 AsyncModuleOperationStart * moduleControllerRequest =
699 new AsyncModuleOperationStart(
700 get_next_xid(),
701 op,
702 serviceIds[0],
703 this->getQueueId(),
704 true,
705 controlProviderName,
706 request);
707
708 PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL3,
709 "Forwarding " + String(MessageTypeToString(request->getType())) +
710 " to service " + serviceName +
711 ", control provider " + controlProviderName +
712 ". Response should go to queue " +
713 ((MessageQueue::lookup(request->queueIds.top())) ?
714 String( ((MessageQueue::lookup(request->queueIds.top()))->getQueueName()) ) :
715 String("BAD queue name")));
716
717 kumpf 1.109 SendAsync(op,
718 serviceIds[0],
719 CIMOperationRequestDispatcher::_forwardForAggregationCallback,
720 this,
721 poA);
722 }
723
724 PEG_METHOD_EXIT();
725 }
726
727 /* This function simply decides based on the controlProviderNameField
728 whether to forward to Service or ControlProvider.
|
729 karl 1.84 If controlProviderName String empty, ToService, else toControlProvider
|
730 karl 1.97 Convience coding to simply other functions.
731 ATTN: KS 28 MayWe want to move to use this call exclusively but with the other problems
732 I did not make the change universal.
|
733 karl 1.84 */
734 void CIMOperationRequestDispatcher::_forwardRequest(
735 const String& className, // only for diagnostic
736 const String& serviceName,
737 const String& controlProviderName,
|
738 karl 1.96 CIMRequestMessage* request)
|
739 karl 1.84 {
740 PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
741 "CIMOperationRequestDispatcher::_forwardRequest");
|
742 karl 1.96
743 Array<Uint32> serviceIds;
744 find_services(serviceName, 0, 0, &serviceIds);
745 PEGASUS_ASSERT(serviceIds.size() != 0);
746
747 AsyncOpNode * op = this->get_op();
748
749 // If ControlProviderName empty, forward to service.
|
750 karl 1.84 if (controlProviderName == String::EMPTY)
751 {
|
752 karl 1.96 AsyncLegacyOperationStart * asyncRequest =
753 new AsyncLegacyOperationStart(
754 get_next_xid(),
755 op,
756 serviceIds[0],
757 request,
758 this->getQueueId());
759
760 asyncRequest->dest = serviceIds[0];
761
|
762 kumpf 1.109 PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL3,
763 "Forwarding " + String(MessageTypeToString(request->getType())) +
764 " on class " + className + " to service " + serviceName +
765 ". Response should go to queue " +
766 ((MessageQueue::lookup(request->queueIds.top())) ?
767 String( ((MessageQueue::lookup(request->queueIds.top()))->getQueueName()) ) :
768 String("BAD queue name")));
769
|
770 karl 1.96 SendAsync(op,
771 serviceIds[0],
|
772 kumpf 1.109 CIMOperationRequestDispatcher::_forwardRequestCallback,
|
773 karl 1.96 this,
774 (void *)request->queueIds.top());
|
775 karl 1.84 }
776 else
777 {
|
778 karl 1.96 AsyncModuleOperationStart * moduleControllerRequest =
779 new AsyncModuleOperationStart(
780 get_next_xid(),
781 op,
782 serviceIds[0],
783 this->getQueueId(),
784 true,
785 controlProviderName,
786 request);
787
|
788 kumpf 1.109 PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL3,
789 "Forwarding " + String(MessageTypeToString(request->getType())) +
790 " on class " + className + " to service " + serviceName +
791 ", control provider " + controlProviderName +
792 ". Response should go to queue " +
793 ((MessageQueue::lookup(request->queueIds.top())) ?
794 String( ((MessageQueue::lookup(request->queueIds.top()))->getQueueName()) ) :
795 String("BAD queue name")));
|
796 karl 1.96
|
797 kumpf 1.109 // Send to the Control provider
|
798 karl 1.96 SendAsync(op,
799 serviceIds[0],
|
800 kumpf 1.109 CIMOperationRequestDispatcher::_forwardRequestCallback,
|
801 karl 1.96 this,
802 (void *)request->queueIds.top());
|
803 karl 1.84 }
804
805 PEG_METHOD_EXIT();
806 }
807
|
808 karl 1.96 /*********************************************************************/
809 //
810 // Temp hack to get responses back to post processors. KS
|
811 karl 1.97 // ATTN: This was temporary to isolate the aggregation processing.
812 // We need to combine this with the other callbacks to create a single
813 // set of functions
814 //
815 // The aggregator includes an aggregation object that is used to
816 // accumulate responses. It is attached to each request sent and
817 // received back as part of the response call back in the "parm"
818 // Responses are aggregated until the count reaches the sent count and
819 // then the aggregation code is called to create a single response from
820 // the accumulated responses.
|
821 karl 1.96 //
822 /*********************************************************************/
823
|
824 karl 1.97 /* aggregate the responses for enumerateinstancenames into a single response
825 */
|
826 kumpf 1.109 void CIMOperationRequestDispatcher::handleEnumerateInstanceNamesResponse(OperationAggregate* poA)
|
827 karl 1.97 {
828 PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
829 "CIMOperationRequestDispatcher::handleEnumerateInstanceNamesResponse");
830 CIMEnumerateInstanceNamesResponseMessage * toResponse =
|
831 kumpf 1.109 (CIMEnumerateInstanceNamesResponseMessage *) poA->getResponse(0);
832
833 // Work backward and delete each response off the end of the array
834 for(Uint32 i = poA->numberResponses() - 1; i > 0; i--)
|
835 karl 1.97 {
836 CIMEnumerateInstanceNamesResponseMessage *fromResponse =
837 (CIMEnumerateInstanceNamesResponseMessage *)poA->getResponse(i);
|
838 kumpf 1.109
|
839 karl 1.97 for (Uint32 j = 0; j < fromResponse->instanceNames.size(); j++)
840 {
|
841 kumpf 1.109 // Duplicate test goes here.
|
842 karl 1.97 // If the from response already contains the name, do not put it.
843 /* ATTN: KS 28 May 2002 - Temporarily disable the duplicate delete code.
844 if (!Contains( toResponse->instanceNames, fromResponse->instanceNames[j]))
845 {
846 toResponse->instanceNames.append(fromResponse->instanceNames[j]);
847 }
848 */
849 toResponse->instanceNames.append(fromResponse->instanceNames[j]);
850 }
|
851 kumpf 1.109 poA->deleteResponse(i);
|
852 karl 1.97 }
|
853 kumpf 1.109
854 toResponse->dest = poA->dest;
|
855 karl 1.97 PEG_METHOD_EXIT();
856 }
|
857 kumpf 1.109
|
858 karl 1.97 /* The function aggregates individual EnumerateInstance Responses into a single response
859 for return to the client. It simply aggregates the responses into the
860 first response (0).
861 ATTN: KS 28 May 2002 - At this time we do not do the following:
862 1. eliminate duplicates.
863 2. Order so we eliminate duplicates from top down
864 3. prune the properties if localOnly or deepInheritance are set.
865 This function does not send any responses.
866 */
|
867 kumpf 1.109 void CIMOperationRequestDispatcher::handleEnumerateInstancesResponse(OperationAggregate* poA)
|
868 karl 1.97 {
869 PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
870 "CIMOperationRequestDispatcher::handleEnumerateInstancesResponse");
871
872 CIMEnumerateInstancesResponseMessage * toResponse =
|
873 kumpf 1.109 (CIMEnumerateInstancesResponseMessage *) poA->getResponse(0);
874
875 // Work backward and delete each response off the end of the array
876 for(Uint32 i = poA->numberResponses() - 1; i > 0; i--)
|
877 karl 1.97 {
878 CIMEnumerateInstancesResponseMessage *fromResponse =
879 (CIMEnumerateInstancesResponseMessage *)poA->getResponse(i);
880
881 for (Uint32 j = 0; j < fromResponse->cimNamedInstances.size(); j++)
882 {
883 toResponse->cimNamedInstances.append(fromResponse->cimNamedInstances[j]);
884 }
885 poA->deleteResponse(i);
886 }
887 PEG_METHOD_EXIT();
888 }
889
890 /* handleOperationResponseAggregation - handles all of the general functions of
|
891 kumpf 1.109 aggregation including:
|
892 karl 1.97 1. checking for good responses and eliminating any error responses
893 2. issuing an error if all responses are bad.
894 3. calling the proper function for merging
895 4. Issuing the single merged response.
896 */
897 void CIMOperationRequestDispatcher::handleOperationResponseAggregation(
|
898 kumpf 1.109 OperationAggregate* poA)
|
899 karl 1.96 {
900 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
901 karl 1.97 "CIMOperationRequestDispatcher::handleOperationResponseAggregation");
902
903 Uint32 totalResponses = poA->numberResponses();
|
904 karl 1.96
|
905 karl 1.97 PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4,
|
906 kumpf 1.109 Formatter::format(" Response Aggregation type $1 responses $0",
|
907 karl 1.97 totalResponses,
908 String(MessageTypeToString(poA->getRequestType()))));
|
909 karl 1.96
910 /* If there was only one response, simply forward it on.
911 */
|
912 karl 1.97 // Add the destination queue ID to the first response.
913
914 CIMResponseMessage* response = poA->getResponse(0);
915
|
916 kumpf 1.109 response->dest = poA->dest;
917
|
918 karl 1.96 if(totalResponses == 1)
919 {
|
920 karl 1.97 SendForget(poA->getResponse(0));
921
922 delete poA;
923
|
924 karl 1.96 PEG_METHOD_EXIT();
925 return;
926 }
927
928 /* Determine if there any "good" responses. If all responses are error
929 we return CIMException.
930 */
931 Uint32 errorCount = 0;
932 for(Uint32 i = 0; i < totalResponses; i++)
933 {
|
934 karl 1.97 CIMResponseMessage *response = poA->getResponse(i);
|
935 karl 1.96 if (response->cimException.getCode() != CIM_ERR_SUCCESS)
936 errorCount++;
937 }
938
|
939 karl 1.97 PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4,
|
940 kumpf 1.109 Formatter::format("Post Processor $0 total responses $1 errors"
|
941 karl 1.97 , totalResponses, errorCount));
942
943 //cout << "KSTEST error count = " << errorCount
944 // << " total Responses = " << totalResponses << endl;
945
|
946 karl 1.96 // If all responses are in error
947 if(errorCount == totalResponses)
948 {
949 // Here we need to send some other response error message because
950 // which one we pick is a crapshoot. They could all be different
951 // ATTN: For the moment, simply send the first and delete all others.
|
952 kumpf 1.109 SendForget(poA->getResponse(0));
953 for(Uint32 j = totalResponses - 1; j > 0; j--)
954 {
955 poA->deleteResponse(j);
956 }
957 delete poA;
|
958 karl 1.97
|
959 kumpf 1.109 PEG_METHOD_EXIT();
960 return;
|
961 karl 1.96 }
962
963 /* We have at least one good response. Now delete the error responses. We will
964 not pass them back to the client.
965 We remove them from the array. Note that this means that the
966 size must be repeatedly recalculated.
967 */
968 if(errorCount > 0)
969 {
|
970 karl 1.97 for(Uint32 j = 0; j < poA->numberResponses(); j++)
|
971 karl 1.96 {
|
972 karl 1.97 CIMResponseMessage* response = poA->getResponse(j);
973 if (response->cimException.getCode() != CIM_ERR_SUCCESS)
974 {
975 poA->deleteResponse(j);
|
976 kumpf 1.109 j--;
|
977 karl 1.97 }
|
978 karl 1.96 }
979 }
|
980 karl 1.97 /* Merge the responses into a single CIMEnumerateInstanceNamesResponse
981 */
982 //cout << "KSTEST total Responses " << totalResponses
|
983 kumpf 1.109 // << " total Good Responses " << poA->numberResponses()<< endl;
|
984 karl 1.97
985 // If more than one response, go to proper aggregation function
986 if(poA->numberResponses() > 1)
987 {
|
988 karl 1.96 // Multiple responses. Merge them by appending the response components
989 // to the first entry
990
|
991 karl 1.97 // Call the appropriate function for merging.
992 if (poA->getRequestType() == CIM_ENUMERATE_INSTANCE_NAMES_REQUEST_MESSAGE)
993 {
994 handleEnumerateInstanceNamesResponse(poA);
995 }
996 else if (poA->getRequestType() == CIM_ENUMERATE_INSTANCES_REQUEST_MESSAGE)
997 {
998 handleEnumerateInstancesResponse(poA);
999 }
1000 }
1001
1002 // Send the remaining response and delete the aggregator.
1003 SendForget(poA->getResponse(0));
1004 delete poA;
1005
1006 PEG_METHOD_EXIT();
1007 }
1008 /*******End of the functions hacked for aggregation***************************/
|
1009 kumpf 1.61
|
1010 mike 1.2 void CIMOperationRequestDispatcher::_enqueueResponse(
|
1011 mday 1.36 CIMRequestMessage* request,
1012 CIMResponseMessage* response)
|
1013 mike 1.2 {
|
1014 kumpf 1.59 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
1015 kumpf 1.73 "CIMOperationRequestDispatcher::_enqueueResponse");
|
1016 kumpf 1.59
|
1017 mday 1.36 // Use the same key as used in the request:
|
1018 mike 1.2
|
1019 mday 1.36 response->setKey(request->getKey());
|
1020 mday 1.79 response->dest = request->queueIds.top();
|
1021 karl 1.81
|
1022 mday 1.36 if( true == Base::_enqueueResponse(request, response))
|
1023 kumpf 1.59 {
1024 PEG_METHOD_EXIT();
|
1025 mday 1.36 return;
|
1026 kumpf 1.59 }
|
1027 karl 1.81
|
1028 mday 1.36 MessageQueue * queue = MessageQueue::lookup(request->queueIds.top());
1029 PEGASUS_ASSERT(queue != 0 );
|
1030 karl 1.81
|
1031 mday 1.36 queue->enqueue(response);
|
1032 kumpf 1.59
1033 PEG_METHOD_EXIT();
|
1034 mday 1.36 }
|
1035 mday 1.48
|
1036 mday 1.36 void CIMOperationRequestDispatcher::handleEnqueue(Message *request)
1037 {
|
1038 kumpf 1.40 PEG_METHOD_ENTER(TRC_DISPATCHER,
1039 "CIMOperationRequestDispatcher::handleEnqueue(Message *request)");
|
1040 mday 1.89 PEGASUS_START_LEAK_CHECK();
|
1041 mday 1.36 if(!request)
|
1042 kumpf 1.40 {
1043 PEG_METHOD_EXIT();
|
1044 mday 1.36 return;
|
1045 kumpf 1.40 }
|
1046 karl 1.81
|
1047 mday 1.36 switch(request->getType())
1048 {
|
1049 karl 1.81
|
1050 mday 1.36 case CIM_GET_CLASS_REQUEST_MESSAGE:
1051 handleGetClassRequest((CIMGetClassRequestMessage*)request);
1052 break;
1053
1054 case CIM_GET_INSTANCE_REQUEST_MESSAGE:
1055 handleGetInstanceRequest((CIMGetInstanceRequestMessage*)request);
1056 break;
1057
1058 case CIM_DELETE_CLASS_REQUEST_MESSAGE:
1059 handleDeleteClassRequest(
1060 (CIMDeleteClassRequestMessage*)request);
1061 break;
1062
1063 case CIM_DELETE_INSTANCE_REQUEST_MESSAGE:
1064 handleDeleteInstanceRequest(
1065 (CIMDeleteInstanceRequestMessage*)request);
1066 break;
1067
1068 case CIM_CREATE_CLASS_REQUEST_MESSAGE:
1069 handleCreateClassRequest((CIMCreateClassRequestMessage*)request);
1070 break;
1071 mday 1.36
1072 case CIM_CREATE_INSTANCE_REQUEST_MESSAGE:
1073 handleCreateInstanceRequest(
1074 (CIMCreateInstanceRequestMessage*)request);
1075 break;
1076
1077 case CIM_MODIFY_CLASS_REQUEST_MESSAGE:
1078 handleModifyClassRequest((CIMModifyClassRequestMessage*)request);
1079 break;
1080
1081 case CIM_MODIFY_INSTANCE_REQUEST_MESSAGE:
1082 handleModifyInstanceRequest(
1083 (CIMModifyInstanceRequestMessage*)request);
1084 break;
1085
1086 case CIM_ENUMERATE_CLASSES_REQUEST_MESSAGE:
1087 handleEnumerateClassesRequest(
1088 (CIMEnumerateClassesRequestMessage*)request);
1089 break;
1090
1091 case CIM_ENUMERATE_CLASS_NAMES_REQUEST_MESSAGE:
1092 mday 1.36 handleEnumerateClassNamesRequest(
1093 (CIMEnumerateClassNamesRequestMessage*)request);
1094 break;
1095
1096 case CIM_ENUMERATE_INSTANCES_REQUEST_MESSAGE:
1097 handleEnumerateInstancesRequest(
1098 (CIMEnumerateInstancesRequestMessage*)request);
1099 break;
1100
1101 case CIM_ENUMERATE_INSTANCE_NAMES_REQUEST_MESSAGE:
1102 handleEnumerateInstanceNamesRequest(
1103 (CIMEnumerateInstanceNamesRequestMessage*)request);
1104 break;
1105
1106 case CIM_EXEC_QUERY_REQUEST_MESSAGE:
|
1107 kumpf 1.68 handleExecQueryRequest(
1108 (CIMExecQueryRequestMessage*)request);
|
1109 mday 1.36 break;
1110
1111 case CIM_ASSOCIATORS_REQUEST_MESSAGE:
1112 handleAssociatorsRequest((CIMAssociatorsRequestMessage*)request);
1113 break;
1114
1115 case CIM_ASSOCIATOR_NAMES_REQUEST_MESSAGE:
1116 handleAssociatorNamesRequest(
1117 (CIMAssociatorNamesRequestMessage*)request);
1118 break;
1119
1120 case CIM_REFERENCES_REQUEST_MESSAGE:
1121 handleReferencesRequest((CIMReferencesRequestMessage*)request);
1122 break;
1123
1124 case CIM_REFERENCE_NAMES_REQUEST_MESSAGE:
1125 handleReferenceNamesRequest(
1126 (CIMReferenceNamesRequestMessage*)request);
1127 break;
1128
1129 case CIM_GET_PROPERTY_REQUEST_MESSAGE:
1130 mday 1.36 handleGetPropertyRequest(
1131 (CIMGetPropertyRequestMessage*)request);
1132 break;
1133
1134 case CIM_SET_PROPERTY_REQUEST_MESSAGE:
1135 handleSetPropertyRequest(
1136 (CIMSetPropertyRequestMessage*)request);
1137 break;
1138
1139 case CIM_GET_QUALIFIER_REQUEST_MESSAGE:
1140 handleGetQualifierRequest((CIMGetQualifierRequestMessage*)request);
1141 break;
1142
1143 case CIM_SET_QUALIFIER_REQUEST_MESSAGE:
1144 handleSetQualifierRequest((CIMSetQualifierRequestMessage*)request);
1145 break;
1146
1147 case CIM_DELETE_QUALIFIER_REQUEST_MESSAGE:
1148 handleDeleteQualifierRequest(
1149 (CIMDeleteQualifierRequestMessage*)request);
1150 break;
1151 mday 1.36
1152 case CIM_ENUMERATE_QUALIFIERS_REQUEST_MESSAGE:
1153 handleEnumerateQualifiersRequest(
1154 (CIMEnumerateQualifiersRequestMessage*)request);
1155 break;
1156
1157 case CIM_INVOKE_METHOD_REQUEST_MESSAGE:
1158 handleInvokeMethodRequest(
1159 (CIMInvokeMethodRequestMessage*)request);
1160 break;
1161 }
1162
1163 delete request;
|
1164 mday 1.89
|
1165 mike 1.2 }
1166
1167 // allocate a CIM Operation_async, opnode, context, and response handler
1168 // initialize with pointers to async top and async bottom
1169 // link to the waiting q
1170 void CIMOperationRequestDispatcher::handleEnqueue()
1171 {
|
1172 kumpf 1.40 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
1173 kumpf 1.73 "CIMOperationRequestDispatcher::handleEnqueue");
|
1174 kumpf 1.40
|
1175 mday 1.36 Message* request = dequeue();
1176
1177 if(request)
1178 handleEnqueue(request);
|
1179 kumpf 1.40
1180 PEG_METHOD_EXIT();
|
1181 mday 1.36 }
1182
1183 void CIMOperationRequestDispatcher::handleGetClassRequest(
1184 CIMGetClassRequestMessage* request)
1185 {
|
1186 chip 1.46 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
1187 kumpf 1.73 "CIMOperationRequestDispatcher::handleGetClassRequest");
|
1188 kumpf 1.40
|
1189 sage 1.77 STAT_PROVIDERSTART
1190
|
1191 mday 1.36 // ATTN: Need code here to expand partial class!
1192
|
1193 kumpf 1.72 CIMException cimException;
|
1194 mday 1.36 CIMClass cimClass;
|
1195 chip 1.39
|
1196 mday 1.36 _repository->read_lock();
|
1197 chip 1.39
|
1198 mday 1.36 try
1199 {
1200 cimClass = _repository->getClass(
|
1201 karl 1.97 request->nameSpace,
1202 request->className,
1203 request->localOnly,
1204 request->includeQualifiers,
1205 request->includeClassOrigin,
1206 request->propertyList.getPropertyNameArray());
|
1207 mday 1.36 }
1208 catch(CIMException& exception)
1209 {
|
1210 kumpf 1.72 cimException = exception;
|
1211 mday 1.36 }
1212 catch(Exception& exception)
1213 {
|
1214 kumpf 1.72 cimException =
1215 PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
|
1216 mday 1.36 }
1217 catch(...)
1218 {
|
1219 kumpf 1.72 cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
|
1220 mday 1.36 }
1221
1222 _repository->read_unlock();
1223
|
1224 sage 1.77 STAT_PROVIDEREND
1225
|
1226 mday 1.36 CIMGetClassResponseMessage* response = new CIMGetClassResponseMessage(
1227 request->messageId,
|
1228 kumpf 1.72 cimException,
|
1229 mday 1.36 request->queueIds.copyAndPop(),
1230 cimClass);
1231
|
1232 sage 1.77 STAT_COPYDISPATCHER_REP
1233
|
1234 mday 1.36 _enqueueResponse(request, response);
|
1235 kumpf 1.40 PEG_METHOD_EXIT();
|
1236 mday 1.36 }
1237
|
1238 karl 1.86
|
1239 mday 1.36 void CIMOperationRequestDispatcher::handleGetInstanceRequest(
1240 CIMGetInstanceRequestMessage* request)
1241 {
|
1242 kumpf 1.59 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
1243 kumpf 1.73 "CIMOperationRequestDispatcher::handleGetInstanceRequest");
|
1244 kumpf 1.59
|
1245 karl 1.86 // ATTN: Need code here to expand partial instance!
|
1246 mday 1.36
1247 // get the class name
1248 String className = request->instanceName.getClassName();
|
1249 kumpf 1.113
1250 CIMException checkClassException;
1251 _checkExistenceOfClass(request->nameSpace, className, checkClassException);
1252 if (checkClassException.getCode() != CIM_ERR_SUCCESS)
1253 {
1254 CIMGetInstanceResponseMessage* response =
1255 new CIMGetInstanceResponseMessage(
1256 request->messageId,
1257 checkClassException,
1258 request->queueIds.copyAndPop(),
1259 CIMInstance());
1260
1261 _enqueueResponse(request, response);
1262 PEG_METHOD_EXIT();
1263 return;
1264 }
1265
|
1266 karl 1.86 //String NameSpace = request->nameSpace;
|
1267 karl 1.96 // ATTNKSDELETE CIMResponseMessage * response;
|
1268 kumpf 1.61 String serviceName = String::EMPTY;
1269 String controlProviderName = String::EMPTY;
|
1270 karl 1.85 String providerName = String::EMPTY;
|
1271 karl 1.86 // Temp to save old code until we confirm everything runs 7 May ks ATTN P0
1272 #define NEWTEST
1273 #ifdef NEWTEST
1274 if(_lookupNewInstanceProvider(request->nameSpace, className, serviceName,
1275 controlProviderName))
1276 {
1277 CIMGetInstanceRequestMessage* requestCopy =
1278 new CIMGetInstanceRequestMessage(*request);
1279
1280 _forwardRequest(className, serviceName, controlProviderName,
|
1281 karl 1.96 requestCopy);
|
1282 karl 1.86 PEG_METHOD_EXIT();
1283 return;
1284 }
1285 #else
|
1286 mday 1.36
|
1287 kumpf 1.57 // Check for class provided by an internal provider
|
1288 karl 1.86 if (_lookupInternalProvider(request->nameSpace, className, serviceName,
1289 controlProviderName))
1290 hasProvider = true;
1291 else
|
1292 mday 1.36 {
|
1293 karl 1.86 // get provider for class
1294 providerName = _lookupInstanceProvider(request->nameSpace, className);
|
1295 karl 1.85 }
|
1296 karl 1.86
1297 if(providerName != String::EMPTY)
|
1298 karl 1.85 {
|
1299 karl 1.86 serviceName = PEGASUS_QUEUENAME_PROVIDERMANAGER_CPP;
1300 hasProvider = true;
|
1301 mday 1.36 }
|
1302 karl 1.86 if(hasProvider)
|
1303 mday 1.36 {
|
1304 karl 1.86 CIMGetInstanceRequestMessage* requestCopy =
1305 new CIMGetInstanceRequestMessage(*request);
|
1306 chip 1.39
|
1307 karl 1.86 _forwardRequest(className, serviceName, controlProviderName,
1308 requestCopy, response);
|
1309 chip 1.39
|
1310 karl 1.86 PEG_METHOD_EXIT();
1311 return;
|
1312 mday 1.36 }
|
1313 kumpf 1.109 #endif
|
1314 karl 1.86
1315 // not internal or found provider, go to default
|
1316 karl 1.84 if (_repository->isDefaultInstanceProvider())
|
1317 kumpf 1.47 {
|
1318 kumpf 1.72 CIMException cimException;
|
1319 kumpf 1.47 CIMInstance cimInstance;
1320
|
1321 sage 1.77 STAT_PROVIDERSTART
1322
|
1323 kumpf 1.47 _repository->read_lock();
1324
1325 try
1326 {
1327 cimInstance = _repository->getInstance(
|
1328 kumpf 1.109 request->nameSpace,
1329 request->instanceName,
1330 request->localOnly,
1331 request->includeQualifiers,
1332 request->includeClassOrigin,
1333 request->propertyList.getPropertyNameArray());
|
1334 kumpf 1.47 }
1335 catch(CIMException& exception)
1336 {
|
1337 kumpf 1.72 cimException = exception;
|
1338 kumpf 1.47 }
1339 catch(Exception& exception)
1340 {
|
1341 kumpf 1.72 cimException =
1342 PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
|
1343 kumpf 1.47 }
1344 catch(...)
1345 {
|
1346 kumpf 1.72 cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
|
1347 kumpf 1.47 }
|
1348 mday 1.36
|
1349 kumpf 1.47 _repository->read_unlock();
|
1350 mday 1.36
|
1351 sage 1.77 STAT_PROVIDEREND
1352
|
1353 kumpf 1.47 CIMGetInstanceResponseMessage* response =
1354 new CIMGetInstanceResponseMessage(
1355 request->messageId,
|
1356 kumpf 1.72 cimException,
|
1357 kumpf 1.47 request->queueIds.copyAndPop(),
1358 cimInstance);
|
1359 mday 1.36
|
1360 sage 1.77 STAT_COPYDISPATCHER_REP
1361
|
1362 kumpf 1.47 _enqueueResponse(request, response);
|
1363 mday 1.36 }
|
1364 kumpf 1.47 else // No provider is registered and the repository isn't the default
|
1365 mday 1.36 {
|
1366 kumpf 1.47 CIMGetInstanceResponseMessage* response =
1367 new CIMGetInstanceResponseMessage(
1368 request->messageId,
|
1369 kumpf 1.72 PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY),
|
1370 kumpf 1.47 request->queueIds.copyAndPop(),
1371 CIMInstance());
1372
|
1373 sage 1.77 STAT_COPYDISPATCHER
1374
|
1375 kumpf 1.47 _enqueueResponse(request, response);
|
1376 mday 1.36 }
|
1377 kumpf 1.59 PEG_METHOD_EXIT();
|
1378 mday 1.36 }
1379
1380 void CIMOperationRequestDispatcher::handleDeleteClassRequest(
1381 CIMDeleteClassRequestMessage* request)
1382 {
|
1383 kumpf 1.59 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
1384 kumpf 1.73 "CIMOperationRequestDispatcher::handleDeleteClassRequest");
|
1385 kumpf 1.59
|
1386 sage 1.77 STAT_PROVIDERSTART
1387
|
1388 kumpf 1.72 CIMException cimException;
|
1389 mday 1.36
1390 _repository->write_lock();
1391
1392 try
1393 {
1394 _repository->deleteClass(
1395 request->nameSpace,
1396 request->className);
1397 }
1398
1399 catch(CIMException& exception)
1400 {
|
1401 kumpf 1.72 cimException = exception;
|
1402 mday 1.36 }
1403 catch(Exception& exception)
1404 {
|
1405 kumpf 1.72 cimException =
1406 PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
|
1407 mday 1.36 }
1408 catch(...)
1409 {
|
1410 kumpf 1.72 cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
|
1411 mday 1.36 }
1412
1413 _repository->write_unlock();
1414
|
1415 sage 1.77 STAT_PROVIDEREND
1416
|
1417 mday 1.36 CIMDeleteClassResponseMessage* response =
1418 new CIMDeleteClassResponseMessage(
1419 request->messageId,
|
1420 kumpf 1.72 cimException,
|
1421 mday 1.36 request->queueIds.copyAndPop());
1422
|
1423 sage 1.77 STAT_COPYDISPATCHER_REP
1424
|
1425 mday 1.36 _enqueueResponse(request, response);
|
1426 kumpf 1.59
1427 PEG_METHOD_EXIT();
|
1428 mday 1.36 }
1429
1430 void CIMOperationRequestDispatcher::handleDeleteInstanceRequest(
1431 CIMDeleteInstanceRequestMessage* request)
1432 {
|
1433 kumpf 1.59 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
1434 kumpf 1.73 "CIMOperationRequestDispatcher::handleDeleteInstanceRequest");
|
1435 kumpf 1.59
|
1436 mday 1.36 // get the class name
1437 String className = request->instanceName.getClassName();
|
1438 kumpf 1.61 CIMResponseMessage * response;
|
1439 mday 1.82
|
1440 kumpf 1.113 CIMException checkClassException;
1441 _checkExistenceOfClass(request->nameSpace, className, checkClassException);
1442 if (checkClassException.getCode() != CIM_ERR_SUCCESS)
1443 {
1444 CIMDeleteInstanceResponseMessage* response =
1445 new CIMDeleteInstanceResponseMessage(
1446 request->messageId,
1447 checkClassException,
1448 request->queueIds.copyAndPop());
1449
1450 _enqueueResponse(request, response);
1451 PEG_METHOD_EXIT();
1452 return;
1453 }
1454
|
1455 kumpf 1.61 String serviceName = String::EMPTY;
1456 String controlProviderName = String::EMPTY;
|
1457 mday 1.36
|
1458 kumpf 1.57 // Check for class provided by an internal provider
|
1459 kumpf 1.61 if (_lookupInternalProvider(request->nameSpace, className, serviceName,
1460 controlProviderName))
|
1461 mday 1.36 {
|
1462 kumpf 1.61 CIMDeleteInstanceRequestMessage* requestCopy =
1463 new CIMDeleteInstanceRequestMessage(*request);
|
1464 chip 1.53
|
1465 karl 1.84 _forwardRequest(className,serviceName, controlProviderName,
|
1466 karl 1.96 requestCopy);
|
1467 chip 1.53
|
1468 kumpf 1.61 PEG_METHOD_EXIT();
1469 return;
|
1470 mday 1.36 }
1471
|
1472 kumpf 1.43 String providerName = _lookupInstanceProvider(request->nameSpace, className);
|
1473 mday 1.36
1474 if(providerName.size() != 0)
1475 {
|
1476 kumpf 1.61 CIMDeleteInstanceRequestMessage* requestCopy =
1477 new CIMDeleteInstanceRequestMessage(*request);
|
1478 chip 1.53
|
1479 kumpf 1.61 _forwardRequestToService(
|
1480 kumpf 1.74 PEGASUS_QUEUENAME_PROVIDERMANAGER_CPP, requestCopy, response);
|
1481 chip 1.53
1482
|
1483 kumpf 1.61 PEG_METHOD_EXIT();
1484 return;
|
1485 mday 1.36 }
|
1486 kumpf 1.47 else if (_repository->isDefaultInstanceProvider())
1487 {
|
1488 kumpf 1.72 CIMException cimException;
|
1489 kumpf 1.47
|
1490 sage 1.77 STAT_PROVIDERSTART
1491
|
1492 kumpf 1.47 _repository->write_lock();
|
1493 mday 1.36
|
1494 kumpf 1.47 try
1495 {
1496 _repository->deleteInstance(
1497 request->nameSpace,
1498 request->instanceName);
1499 }
1500 catch(CIMException& exception)
1501 {
|
1502 kumpf 1.72 cimException = exception;
|
1503 kumpf 1.47 }
1504 catch(Exception& exception)
1505 {
|
1506 kumpf 1.72 cimException =
1507 PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
|
1508 kumpf 1.47 }
1509 catch(...)
1510 {
|
1511 kumpf 1.72 cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
|
1512 kumpf 1.47 }
1513
1514 _repository->write_unlock();
|
1515 mday 1.36
|
1516 sage 1.77 STAT_PROVIDEREND
1517
|
1518 kumpf 1.47 CIMDeleteInstanceResponseMessage* response =
1519 new CIMDeleteInstanceResponseMessage(
1520 request->messageId,
|
1521 kumpf 1.72 cimException,
|
1522 kumpf 1.47 request->queueIds.copyAndPop());
|
1523 mday 1.36
|
1524 sage 1.77 STAT_COPYDISPATCHER_REP
1525
|
1526 kumpf 1.47 _enqueueResponse(request, response);
|
1527 mday 1.36 }
|
1528 kumpf 1.47 else // No provider is registered and the repository isn't the default
|
1529 mday 1.36 {
|
1530 kumpf 1.47 CIMDeleteInstanceResponseMessage* response =
1531 new CIMDeleteInstanceResponseMessage(
1532 request->messageId,
|
1533 kumpf 1.72 PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY),
|
1534 kumpf 1.47 request->queueIds.copyAndPop());
1535
|
1536 sage 1.77 STAT_COPYDISPATCHER
1537
|
1538 kumpf 1.47 _enqueueResponse(request, response);
|
1539 mday 1.36 }
|
1540 kumpf 1.59
1541 PEG_METHOD_EXIT();
|
1542 mday 1.36 }
1543
1544 void CIMOperationRequestDispatcher::handleCreateClassRequest(
1545 CIMCreateClassRequestMessage* request)
1546 {
|
1547 kumpf 1.59 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
1548 kumpf 1.73 "CIMOperationRequestDispatcher::handleCreateClassRequest");
|
1549 kumpf 1.59
|
1550 kumpf 1.72 CIMException cimException;
|
1551 mday 1.36
|
1552 sage 1.77 STAT_PROVIDERSTART
1553
|
1554 mday 1.36 _repository->write_lock();
1555
1556 try
1557 {
1558 _repository->createClass(
1559 request->nameSpace,
1560 request->newClass);
1561 }
1562
1563 catch(CIMException& exception)
1564 {
|
1565 kumpf 1.72 cimException = exception;
|
1566 mday 1.36 }
1567 catch(Exception& exception)
1568 {
|
1569 kumpf 1.72 cimException =
1570 PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
|
1571 mday 1.36 }
1572 catch(...)
1573 {
|
1574 kumpf 1.72 cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
|
1575 mday 1.36 }
1576
1577 _repository->write_unlock();
1578
|
1579 sage 1.77 STAT_PROVIDERSTART
1580
|
1581 mday 1.36 CIMCreateClassResponseMessage* response =
1582 new CIMCreateClassResponseMessage(
1583 request->messageId,
|
1584 kumpf 1.72 cimException,
|
1585 mday 1.36 request->queueIds.copyAndPop());
1586
|
1587 sage 1.77 STAT_COPYDISPATCHER_REP
1588
|
1589 mday 1.36 _enqueueResponse(request, response);
|
1590 kumpf 1.59
1591 PEG_METHOD_EXIT();
|
1592 mday 1.36 }
1593
1594 void CIMOperationRequestDispatcher::handleCreateInstanceRequest(
1595 CIMCreateInstanceRequestMessage* request)
1596 {
|
1597 kumpf 1.59 PEG_METHOD_ENTER(TRC_DISPATCHER,
1598 "CIMOperationRequestDispatcher::handleCreateInstanceRequest()");
1599
|
1600 mday 1.36 // get the class name
1601 String className = request->newInstance.getClassName();
|
1602 kumpf 1.61 CIMResponseMessage * response;
1603
|
1604 kumpf 1.113 CIMException checkClassException;
1605 _checkExistenceOfClass(request->nameSpace, className, checkClassException);
1606 if (checkClassException.getCode() != CIM_ERR_SUCCESS)
1607 {
1608 CIMCreateInstanceResponseMessage* response =
1609 new CIMCreateInstanceResponseMessage(
1610 request->messageId,
1611 checkClassException,
1612 request->queueIds.copyAndPop(),
1613 CIMObjectPath());
1614
1615 _enqueueResponse(request, response);
1616 PEG_METHOD_EXIT();
1617 return;
1618 }
1619
|
1620 kumpf 1.61 String serviceName = String::EMPTY;
1621 String controlProviderName = String::EMPTY;
|
1622 mday 1.36
|
1623 kumpf 1.57 // Check for class provided by an internal provider
|
1624 kumpf 1.61 if (_lookupInternalProvider(request->nameSpace, className, serviceName,
1625 controlProviderName))
|
1626 mday 1.36 {
|
1627 kumpf 1.61 CIMCreateInstanceRequestMessage* requestCopy =
1628 new CIMCreateInstanceRequestMessage(*request);
|
1629 chip 1.53
|
1630 karl 1.96 _forwardRequest(className,serviceName, controlProviderName, requestCopy);
|
1631 chip 1.53
|
1632 kumpf 1.61 PEG_METHOD_EXIT();
1633 return;
|
1634 mday 1.36 }
1635
|
1636 kumpf 1.43 String providerName = _lookupInstanceProvider(request->nameSpace, className);
|
1637 chip 1.53
|
1638 mday 1.36 if(providerName.size() != 0)
1639 {
|
1640 kumpf 1.61 CIMCreateInstanceRequestMessage* requestCopy =
1641 new CIMCreateInstanceRequestMessage(*request);
|
1642 chip 1.53
|
1643 kumpf 1.61 _forwardRequestToService(
|
1644 kumpf 1.74 PEGASUS_QUEUENAME_PROVIDERMANAGER_CPP, requestCopy, response);
|
1645 chip 1.39
1646
|
1647 kumpf 1.61 PEG_METHOD_EXIT();
1648 return;
|
1649 mday 1.36 }
|
1650 kumpf 1.47 else if (_repository->isDefaultInstanceProvider())
1651 {
|
1652 kumpf 1.72 CIMException cimException;
|
1653 kumpf 1.92 CIMObjectPath instanceName;
|
1654 kumpf 1.47
|
1655 sage 1.77 STAT_PROVIDERSTART
1656
|
1657 kumpf 1.47 _repository->write_lock();
1658
1659 try
1660 {
1661 instanceName = _repository->createInstance(
1662 request->nameSpace,
1663 request->newInstance);
1664 }
1665 catch(CIMException& exception)
1666 {
|
1667 kumpf 1.72 cimException = exception;
|
1668 kumpf 1.47 }
1669 catch(Exception& exception)
1670 {
|
1671 kumpf 1.72 cimException =
1672 PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
|
1673 kumpf 1.47 }
1674 catch(...)
1675 {
|
1676 kumpf 1.72 cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
|
1677 kumpf 1.47 }
|
1678 mday 1.36
|
1679 kumpf 1.47 _repository->write_unlock();
|
1680 mday 1.36
|
1681 sage 1.77 STAT_PROVIDEREND
1682
|
1683 kumpf 1.47 CIMCreateInstanceResponseMessage* response =
1684 new CIMCreateInstanceResponseMessage(
1685 request->messageId,
|
1686 kumpf 1.72 cimException,
|
1687 kumpf 1.47 request->queueIds.copyAndPop(),
1688 instanceName);
|
1689 mday 1.36
|
1690 sage 1.77 STAT_COPYDISPATCHER_REP
1691
|
1692 kumpf 1.47 _enqueueResponse(request, response);
|
1693 mday 1.36 }
|
1694 kumpf 1.47 else // No provider is registered and the repository isn't the default
|
1695 mday 1.36 {
|
1696 kumpf 1.47 CIMCreateInstanceResponseMessage* response =
1697 new CIMCreateInstanceResponseMessage(
1698 request->messageId,
|
1699 kumpf 1.72 PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY),
|
1700 kumpf 1.47 request->queueIds.copyAndPop(),
|
1701 kumpf 1.92 CIMObjectPath());
|
1702 kumpf 1.47
|
1703 sage 1.77 STAT_COPYDISPATCHER
1704
|
1705 kumpf 1.47 _enqueueResponse(request, response);
|
1706 mday 1.36 }
|
1707 kumpf 1.59
1708 PEG_METHOD_EXIT();
|
1709 mike 1.2 }
1710
|
1711 mday 1.36 void CIMOperationRequestDispatcher::handleModifyClassRequest(
1712 CIMModifyClassRequestMessage* request)
1713 {
|
1714 kumpf 1.59 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
1715 kumpf 1.73 "CIMOperationRequestDispatcher::handleModifyClassRequest");
|
1716 kumpf 1.59
|
1717 kumpf 1.72 CIMException cimException;
|
1718 mday 1.36
|
1719 sage 1.77 STAT_PROVIDERSTART
1720
|
1721 mday 1.36 _repository->write_lock();
1722
1723 try
1724 {
1725 _repository->modifyClass(
1726 request->nameSpace,
1727 request->modifiedClass);
1728 }
1729
1730 catch(CIMException& exception)
1731 {
|
1732 kumpf 1.72 cimException = exception;
|
1733 mday 1.36 }
1734 catch(Exception& exception)
1735 {
|
1736 kumpf 1.72 cimException =
1737 PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
|
1738 mday 1.36 }
1739 catch(...)
1740 {
|
1741 kumpf 1.72 cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
|
1742 mday 1.36 }
1743
1744 _repository->write_unlock();
1745
|
1746 sage 1.77 STAT_PROVIDEREND
1747
|
1748 mday 1.36 CIMModifyClassResponseMessage* response =
1749 new CIMModifyClassResponseMessage(
1750 request->messageId,
|
1751 kumpf 1.72 cimException,
|
1752 mday 1.36 request->queueIds.copyAndPop());
1753
|
1754 sage 1.77 STAT_COPYDISPATCHER_REP
1755
|
1756 mday 1.36 _enqueueResponse(request, response);
|
1757 kumpf 1.59
1758 PEG_METHOD_EXIT();
|
1759 mday 1.36 }
1760
1761 void CIMOperationRequestDispatcher::handleModifyInstanceRequest(
1762 CIMModifyInstanceRequestMessage* request)
1763 {
|
1764 kumpf 1.59 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
1765 kumpf 1.73 "CIMOperationRequestDispatcher::handleModifyInstanceRequest");
|
1766 kumpf 1.59
|
1767 mday 1.36 // ATTN: Who makes sure the instance name and the instance match?
|
1768 karl 1.97 // ATTN: KS May 28. Change following to reflect new instancelookup
|
1769 mday 1.36 // get the class name
|
1770 kumpf 1.102 String className = request->modifiedInstance.getClassName();
|
1771 kumpf 1.61 CIMResponseMessage * response;
1772
|
1773 kumpf 1.113 CIMException checkClassException;
1774 _checkExistenceOfClass(request->nameSpace, className, checkClassException);
1775 if (checkClassException.getCode() != CIM_ERR_SUCCESS)
1776 {
1777 CIMModifyInstanceResponseMessage* response =
1778 new CIMModifyInstanceResponseMessage(
1779 request->messageId,
1780 checkClassException,
1781 request->queueIds.copyAndPop());
1782
1783 _enqueueResponse(request, response);
1784 PEG_METHOD_EXIT();
1785 return;
1786 }
1787
|
1788 kumpf 1.61 String serviceName = String::EMPTY;
1789 String controlProviderName = String::EMPTY;
|
1790 mday 1.36
|
1791 kumpf 1.57 // Check for class provided by an internal provider
|
1792 kumpf 1.61 if (_lookupInternalProvider(request->nameSpace, className, serviceName,
1793 controlProviderName))
|
1794 mday 1.36 {
|
1795 kumpf 1.61 CIMModifyInstanceRequestMessage* requestCopy =
1796 new CIMModifyInstanceRequestMessage(*request);
|
1797 chip 1.53
|
1798 karl 1.84 _forwardRequest(className, serviceName, controlProviderName,
|
1799 karl 1.96 requestCopy);
|
1800 chip 1.53
|
1801 kumpf 1.61 PEG_METHOD_EXIT();
1802 return;
|
1803 mday 1.36 }
1804
1805 // check the class name for an "external provider"
|
1806 kumpf 1.43 String providerName = _lookupInstanceProvider(request->nameSpace, className);
|
1807 mday 1.36
1808 if(providerName.size() != 0)
1809 {
|
1810 kumpf 1.61 CIMModifyInstanceRequestMessage* requestCopy =
1811 new CIMModifyInstanceRequestMessage(*request);
|
1812 chip 1.53
|
1813 kumpf 1.61 _forwardRequestToService(
|
1814 kumpf 1.74 PEGASUS_QUEUENAME_PROVIDERMANAGER_CPP, requestCopy, response);
|
1815 chip 1.53
|
1816 kumpf 1.61 PEG_METHOD_EXIT();
1817 return;
|
1818 mday 1.36 }
|
1819 kumpf 1.47 else if (_repository->isDefaultInstanceProvider())
1820 {
1821 // translate and forward request to repository
|
1822 kumpf 1.72 CIMException cimException;
|
1823 kumpf 1.47
|
1824 sage 1.77 STAT_PROVIDERSTART
1825
|
1826 kumpf 1.47 _repository->write_lock();
|
1827 mday 1.36
|
1828 kumpf 1.47 try
1829 {
1830 _repository->modifyInstance(
|
1831 karl 1.97 request->nameSpace,
1832 request->modifiedInstance,
1833 request->includeQualifiers,request->propertyList);
|
1834 kumpf 1.47 }
1835 catch(CIMException& exception)
1836 {
|
1837 kumpf 1.72 cimException = exception;
|
1838 kumpf 1.47 }
1839 catch(Exception& exception)
1840 {
|
1841 kumpf 1.72 cimException =
1842 PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
|
1843 kumpf 1.47 }
1844 catch(...)
1845 {
|
1846 kumpf 1.72 cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
|
1847 kumpf 1.47 }
1848
1849 _repository->write_unlock();
|
1850 mday 1.36
|
1851 sage 1.77 STAT_PROVIDEREND
1852
|
1853 kumpf 1.47 CIMModifyInstanceResponseMessage* response =
1854 new CIMModifyInstanceResponseMessage(
1855 request->messageId,
|
1856 kumpf 1.72 cimException,
|
1857 kumpf 1.47 request->queueIds.copyAndPop());
|
1858 mday 1.36
|
1859 sage 1.77 STAT_COPYDISPATCHER_REP
1860
|
1861 kumpf 1.47 _enqueueResponse(request, response);
|
1862 mday 1.36 }
|
1863 kumpf 1.47 else // No provider is registered and the repository isn't the default
|
1864 mday 1.36 {
|
1865 kumpf 1.47 CIMModifyInstanceResponseMessage* response =
1866 new CIMModifyInstanceResponseMessage(
1867 request->messageId,
|
1868 kumpf 1.72 PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY),
|
1869 kumpf 1.47 request->queueIds.copyAndPop());
1870
|
1871 sage 1.77 STAT_COPYDISPATCHER
1872
|
1873 kumpf 1.47 _enqueueResponse(request, response);
|
1874 mday 1.36 }
|
1875 kumpf 1.59
1876 PEG_METHOD_EXIT();
|
1877 mday 1.36 }
1878
1879 void CIMOperationRequestDispatcher::handleEnumerateClassesRequest(
1880 CIMEnumerateClassesRequestMessage* request)
1881 {
|
1882 kumpf 1.59 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
1883 kumpf 1.73 "CIMOperationRequestDispatcher::handleEnumerateClassesRequest");
|
1884 kumpf 1.59
|
1885 kumpf 1.72 CIMException cimException;
|
1886 sage 1.77
1887 STAT_PROVIDERSTART
1888
|
1889 mday 1.36 Array<CIMClass> cimClasses;
1890
1891 _repository->read_lock();
1892
1893 try
1894 {
1895 cimClasses = _repository->enumerateClasses(
|
1896 karl 1.97 request->nameSpace,
1897 request->className,
1898 request->deepInheritance,
1899 request->localOnly,
1900 request->includeQualifiers,
1901 request->includeClassOrigin);
|
1902 mday 1.36 }
1903
1904 catch(CIMException& exception)
1905 {
|
1906 kumpf 1.72 cimException = exception;
|
1907 mday 1.36 }
1908 catch(Exception& exception)
1909 {
|
1910 kumpf 1.72 cimException =
1911 PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
|
1912 mday 1.36 }
1913 catch(...)
1914 {
|
1915 kumpf 1.72 cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
|
1916 mday 1.36 }
1917
1918 _repository->read_unlock();
1919
|
1920 sage 1.77 STAT_PROVIDEREND
1921
|
1922 mday 1.36 CIMEnumerateClassesResponseMessage* response =
1923 new CIMEnumerateClassesResponseMessage(
1924 request->messageId,
|
1925 kumpf 1.72 cimException,
|
1926 mday 1.36 request->queueIds.copyAndPop(),
1927 cimClasses);
1928
|
1929 sage 1.77 STAT_COPYDISPATCHER_REP
1930
|
1931 mday 1.36 _enqueueResponse(request, response);
|
1932 kumpf 1.59
1933 PEG_METHOD_EXIT();
|
1934 mday 1.36 }
1935
1936 void CIMOperationRequestDispatcher::handleEnumerateClassNamesRequest(
1937 CIMEnumerateClassNamesRequestMessage* request)
1938 {
|
1939 kumpf 1.59 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
1940 kumpf 1.73 "CIMOperationRequestDispatcher::handleEnumerateClassNamesRequest");
|
1941 kumpf 1.59
|
1942 kumpf 1.72 CIMException cimException;
|
1943 sage 1.77
1944 STAT_PROVIDERSTART
1945
|
1946 mday 1.36 Array<String> classNames;
1947
1948 _repository->read_lock();
1949
1950 try
1951 {
1952 classNames = _repository->enumerateClassNames(
1953 request->nameSpace,
1954 request->className,
1955 request->deepInheritance);
1956 }
1957
1958 catch(CIMException& exception)
1959 {
|
1960 kumpf 1.72 cimException = exception;
|
1961 mday 1.36 }
1962 catch(Exception& exception)
1963 {
|
1964 kumpf 1.72 cimException =
1965 PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
|
1966 mday 1.36 }
1967 catch(...)
1968 {
|
1969 kumpf 1.72 cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
|
1970 mday 1.36 }
1971
1972 _repository->read_unlock();
1973
|
1974 sage 1.77 STAT_PROVIDEREND
1975
|
1976 mday 1.36 CIMEnumerateClassNamesResponseMessage* response =
1977 new CIMEnumerateClassNamesResponseMessage(
1978 request->messageId,
|
1979 kumpf 1.72 cimException,
|
1980 mday 1.36 request->queueIds.copyAndPop(),
1981 classNames);
1982
|
1983 sage 1.77 STAT_COPYDISPATCHER_REP
1984
|
1985 mday 1.36 _enqueueResponse(request, response);
|
1986 kumpf 1.59
1987 PEG_METHOD_EXIT();
|
1988 mday 1.36 }
1989
1990 void CIMOperationRequestDispatcher::handleEnumerateInstancesRequest(
1991 CIMEnumerateInstancesRequestMessage* request)
1992 {
|
1993 kumpf 1.59 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
1994 kumpf 1.73 "CIMOperationRequestDispatcher::handleEnumerateInstancesRequest");
|
1995 kumpf 1.59
|
1996 mday 1.36 // get the class name
1997 String className = request->className;
|
1998 kumpf 1.113
1999 CIMException checkClassException;
2000 _checkExistenceOfClass(request->nameSpace, className, checkClassException);
2001 if (checkClassException.getCode() != CIM_ERR_SUCCESS)
2002 {
2003 CIMEnumerateInstancesResponseMessage* response =
2004 new CIMEnumerateInstancesResponseMessage(
2005 request->messageId,
2006 checkClassException,
2007 request->queueIds.copyAndPop(),
2008 Array<CIMInstance>());
2009
2010 _enqueueResponse(request, response);
2011 PEG_METHOD_EXIT();
2012 return;
2013 }
2014
|
2015 karl 1.97 /***** ATTN: KS 28 May 2002 - localonly and deepinheritance processing
2016 temporarily removed until testing complete.
2017 // If localonly or deepinheritance, build propertylist.
2018 // unless there is specific propertylist. Assume that
2019 // specific property list has priority over that generated
2020 // from localOnly
2021 Array<String> classProperties;
2022 if (!request->deepInheritance || request->localOnly)
|
2023 karl 1.86 {
|
2024 karl 1.97 if (request->propertyList.isNull())
2025 {
2026 CIMClass cl;
2027 // add try here
2028 // get the class.
2029 cl = _repository->getClass(
2030 request->nameSpace,
2031 request->className,
2032 true, false, false);
2033 for (Uint32 i = 0; i < cl.getPropertyCount(); i++)
2034 {
2035 CIMProperty p = cl.getProperty(i);
2036 if (request->localOnly)
2037 {
2038 if (!p.getPropagated())
2039 classProperties.append(p.getName());
2040 }
2041 else
2042 classProperties.append(p.getName());
2043 }
2044 // We now have property list and can either send it to
2045 karl 1.97 // the provider or save for review of the responses.
2046 }
2047
|
2048 karl 1.86 }
|
2049 karl 1.97 NOTE: See the piece below that puts it into the PoA
2050 **************************************************/
2051 //
2052 // Get names of descendent classes:
2053 //
2054 Array<String> subClassNames;
2055 CIMException cimException;
2056 try
|
2057 karl 1.86 {
|
2058 karl 1.97 subClassNames = _getSubClassNames(request->nameSpace,className);
|
2059 karl 1.86 }
|
2060 kumpf 1.98 catch(CIMException& cimException)
|
2061 karl 1.86 {
|
2062 karl 1.97 // Return exception response if exception from getSubClasses
|
2063 kumpf 1.98 CIMEnumerateInstancesResponseMessage* response =
2064 new CIMEnumerateInstancesResponseMessage(
2065 request->messageId,
2066 cimException,
2067 request->queueIds.copyAndPop(),
|
2068 kumpf 1.102 Array<CIMInstance>());
|
2069 karl 1.97 _enqueueResponse(request, response);
2070 PEG_METHOD_EXIT();
2071 return;
2072 }
2073 STAT_PROVIDERSTART
2074
2075 //
2076 // Find all providers for these classes and modify the subclass list.
2077 // The following arrays represent the list of subclasses with
2078 // valid providers
2079 Array<String> subClassNameList;
2080 Array<String> serviceNames;
2081 Array<String> controlProviderNames;
|
2082 karl 1.86
|
2083 karl 1.97 for(Uint32 i = 0; i < subClassNames.size(); i++)
|
2084 mday 1.36 {
|
2085 karl 1.97 String serviceName = String::EMPTY;
2086 String controlProviderName = String::EMPTY;
2087
2088 // Lookup any instance providers and add to send list
2089 if(_lookupNewInstanceProvider(request->nameSpace, subClassNames[i],
2090 serviceName, controlProviderName))
|
2091 kumpf 1.109 {
2092 // Append the returned values to the list to send.
2093 subClassNameList.append(subClassNames[i]);
2094 serviceNames.append(serviceName);
2095 controlProviderNames.append(controlProviderName);
2096
|
2097 mday 1.112 // cout << "KSTEST class list Output. Class = " << subClassNames[i]
2098 // << " servicename = " << serviceName
2099 // << " controlProviderName = "
2100 // << ((controlProviderName != String::EMPTY) ? controlProviderName : "None")
2101 // << " i = " << i << endl;
|
2102 karl 1.97
2103 PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4,
|
2104 kumpf 1.109 "Provider found for Class = " + subClassNames[i]
2105 + " servicename = " + serviceName
2106 + " controlProviderName = "
2107 + ((controlProviderName != String::EMPTY) ? controlProviderName : "None"));
2108 }
|
2109 mday 1.36 }
2110
|
2111 karl 1.97 Uint32 ps = serviceNames.size();
|
2112 mday 1.36
|
2113 karl 1.97 // Test for "enumerate to Broad" and if so, execute exception.
2114 // Simply limits the subclass depth to some max, not number
2115 // of instances returned.
2116 // ATTN: KS P3 May 28 2002add size and limit to this message.
2117 if(ps > MAX_ENUMERATE_BREADTH)
|
2118 mday 1.36 {
|
2119 karl 1.97 CIMEnumerateInstancesResponseMessage* response =
2120 new CIMEnumerateInstancesResponseMessage(
2121 request->messageId,
|
2122 kumpf 1.109 PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, "Enumerate request too broad"),
|
2123 karl 1.97 request->queueIds.copyAndPop(),
|
2124 kumpf 1.102 Array<CIMInstance>());
|
2125 chip 1.53
|
2126 karl 1.97 STAT_COPYDISPATCHER
|
2127 chip 1.53
|
2128 karl 1.97 _enqueueResponse(request, response);
|
2129 kumpf 1.61 PEG_METHOD_EXIT();
2130 return;
|
2131 mday 1.36 }
|
2132 karl 1.97 // Set up an aggregate object for the information and save request in it.
2133 // With the original request message.
|
2134 kumpf 1.109 OperationAggregate *poA= new OperationAggregate(
2135 new CIMEnumerateInstancesRequestMessage(*request),
2136 request->getType(),
2137 request->messageId);
2138 poA->dest = request->queueIds.top();
|
2139 karl 1.97
2140 Boolean staticInstancesExist = false;
2141 // ATTN: KS 28 May 2002 P3 - This code to process property lists and
2142 // localonly, etc. has not been tested yet. Temporarily removed.
2143 /************************* Removed along with rest of property list code above
2144 if (classProperties.size() != 0)
2145 {
2146 poA->propertyList = classProperties;
2147 }
2148 **********************************/
|
2149 kumpf 1.102 if ((ps == 0) && (_repository->isDefaultInstanceProvider()))
|
2150 kumpf 1.47 {
|
2151 kumpf 1.102 Tracer::trace(TRC_DISPATCHER, Tracer::LEVEL4,
2152 "Repository being used as THE default instance provider");
|
2153 kumpf 1.72 CIMException cimException;
|
2154 sage 1.77
2155 STAT_PROVIDERSTART
2156
|
2157 kumpf 1.102 Array<CIMInstance> cimNamedInstances;
|
2158 kumpf 1.47
2159 _repository->read_lock();
2160
2161 try
2162 {
|
2163 karl 1.96 cimNamedInstances = _repository->enumerateInstancesForClass(
|
2164 karl 1.97 request->nameSpace,
2165 request->className,
2166 request->deepInheritance,
2167 request->localOnly,
2168 request->includeQualifiers,
2169 request->includeClassOrigin,
2170 true,
2171 request->propertyList.getPropertyNameArray());
|
2172 kumpf 1.47 }
2173 catch(CIMException& exception)
2174 {
|
2175 kumpf 1.72 cimException = exception;
|
2176 kumpf 1.47 }
2177 catch(Exception& exception)
2178 {
|
2179 kumpf 1.72 cimException =
2180 PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
|
2181 kumpf 1.47 }
2182 catch(...)
2183 {
|
2184 kumpf 1.72 cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
|
2185 kumpf 1.47 }
|
2186 mday 1.36
|
2187 kumpf 1.47 _repository->read_unlock();
|
2188 mday 1.36
|
2189 sage 1.77 STAT_PROVIDEREND
2190
|
2191 kumpf 1.47 CIMEnumerateInstancesResponseMessage* response =
|
2192 karl 1.97 new CIMEnumerateInstancesResponseMessage(
2193 request->messageId,
2194 cimException,
2195 request->queueIds.copyAndPop(),
2196 cimNamedInstances);
|
2197 mday 1.36
|
2198 sage 1.77 STAT_COPYDISPATCHER_REP
2199
|
2200 kumpf 1.109 #if 0
2201 // if there will be other responses, put this on the response list.
2202 // else, simply issue it.
2203 if (ps > 0)
2204 {
2205 poA->appendResponse(response);
2206 staticInstancesExist = true;
2207 }
2208 else
2209 {
2210 delete poA;
|
2211 kumpf 1.102 _enqueueResponse(request, response);
2212 PEG_METHOD_EXIT();
2213 return;
|
2214 kumpf 1.109 }
2215 #else
2216 delete poA;
2217 _enqueueResponse(request, response);
2218 PEG_METHOD_EXIT();
2219 return;
2220 #endif
|
2221 mday 1.36 }
|
2222 karl 1.97
2223 if(ps > 0)
|
2224 mday 1.36 {
|
2225 karl 1.97 //************* Limit to one response if we have problems with more.
2226 #ifdef LIMIT_ENUM_TO_ONE_LEVEL
2227 ps = 1;
|
2228 kumpf 1.109 #endif
|
2229 karl 1.97 // Simply takes the top level request and ignores the others.
2230 // decomment the ps = 1 to generate only one request.
2231 //*******************/
2232 poA->setTotalIssued(ps);
2233
2234 for(Uint32 i = 0; i < ps; i++ )
2235 {
2236 poA->classes.append(subClassNameList[i]);
2237 poA->serviceNames.append(serviceNames[i]);
2238 poA->controlProviderNames.append(controlProviderNames[i]);
2239
2240 // Note that current may not be same as i if there is a response
2241 // from the repository.
2242 Uint32 current = poA->classes.size() - 1;
2243
2244 CIMEnumerateInstancesRequestMessage* requestCopy =
2245 new CIMEnumerateInstancesRequestMessage(*request);
2246 requestCopy->className = poA->classes[current];
2247
2248 PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4,
2249 Formatter::format(
2250 karl 1.97 "Enumerate instance Req. class $0 to svc $1 for control provider $2 No $3 of $4",
2251 poA->classes[current], poA->serviceNames[current],
2252 ((poA->controlProviderNames[current] != String::EMPTY) ?
2253 poA->controlProviderNames[current] : "None"),
2254 i, ps));
2255
|
2256 kumpf 1.109 _forwardRequestForAggregation(poA->serviceNames[current],
|
2257 karl 1.97 poA->controlProviderNames[current], requestCopy, poA);
2258 }
2259 PEG_METHOD_EXIT();
2260 return;
2261 }
2262 // No provider is registered and the repository isn't the default. Error response
2263 // ATTN: KS 28 May 2002 - Rethink this error. What if there are simply no instances
2264 // Is this what we generate?
|
2265 kumpf 1.110 if ((ps == 0) && !(_repository->isDefaultInstanceProvider()))
|
2266 karl 1.97 {
2267 PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4,
|
2268 kumpf 1.110 "No provider for " + className + " and subclasses.");
|
2269 karl 1.97
2270 CIMEnumerateInstancesResponseMessage* response =
2271 new CIMEnumerateInstancesResponseMessage(
2272 request->messageId,
2273 PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY),
2274 request->queueIds.copyAndPop(),
|
2275 kumpf 1.102 Array<CIMInstance>());
|
2276 kumpf 1.47
|
2277 sage 1.77 STAT_COPYDISPATCHER
2278
|
2279 kumpf 1.109 delete poA;
|
2280 kumpf 1.47 _enqueueResponse(request, response);
|
2281 mday 1.36 }
|
2282 kumpf 1.59
2283 PEG_METHOD_EXIT();
|
2284 mday 1.36 }
2285
|
2286 karl 1.87
|
2287 mday 1.36 void CIMOperationRequestDispatcher::handleEnumerateInstanceNamesRequest(
2288 CIMEnumerateInstanceNamesRequestMessage* request)
2289 {
|
2290 kumpf 1.59 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
2291 kumpf 1.73 "CIMOperationRequestDispatcher::handleEnumerateInstanceNamesRequest");
|
2292 karl 1.97
|
2293 mday 1.36 // get the class name
2294 String className = request->className;
|
2295 karl 1.97
|
2296 kumpf 1.113 CIMException checkClassException;
2297 _checkExistenceOfClass(request->nameSpace, className, checkClassException);
2298 if (checkClassException.getCode() != CIM_ERR_SUCCESS)
2299 {
2300 CIMEnumerateInstanceNamesResponseMessage* response =
2301 new CIMEnumerateInstanceNamesResponseMessage(
2302 request->messageId,
2303 checkClassException,
2304 request->queueIds.copyAndPop(),
2305 Array<CIMObjectPath>());
2306
2307 _enqueueResponse(request, response);
2308 PEG_METHOD_EXIT();
2309 return;
2310 }
2311
|
2312 karl 1.86 //
2313 // Get names of descendent classes:
2314 //
2315 Array<String> subClassNames;
2316 CIMException cimException;
2317 try
|
2318 mday 1.36 {
|
2319 karl 1.86 subClassNames = _getSubClassNames(request->nameSpace,className);
|
2320 mday 1.36 }
|
2321 karl 1.86 catch(CIMException& exception)
|
2322 mday 1.36 {
|
2323 karl 1.86 // Return exception response if exception from getSubClasses
2324 cimException = exception;
|
2325 kumpf 1.92 Array<CIMObjectPath> instanceNames;
|
2326 karl 1.86 CIMEnumerateInstanceNamesResponseMessage* response =
2327 new CIMEnumerateInstanceNamesResponseMessage(
2328 request->messageId,
2329 cimException,
2330 request->queueIds.copyAndPop(),
2331 instanceNames);
2332 _enqueueResponse(request, response);
2333 PEG_METHOD_EXIT();
2334 return;
2335 }
|
2336 chip 1.53
|
2337 karl 1.86 STAT_PROVIDERSTART
2338
|
2339 karl 1.97 //
2340 //Find all providers for these classes and modify the subclass list.
2341 //
2342 // The following arrays represent the list of subclasses with
2343 // valid providers
2344 Array<String> subClassNameList;
|
2345 karl 1.86 Array<String> serviceNames;
2346 Array<String> controlProviderNames;
2347
2348 for(Uint32 i = 0; i < subClassNames.size(); i++)
2349 {
2350 String serviceName = String::EMPTY;
2351 String controlProviderName = String::EMPTY;
2352
2353 // Lookup any instance providers and add to send list
2354 if(_lookupNewInstanceProvider(request->nameSpace, subClassNames[i],
|
2355 karl 1.97 serviceName, controlProviderName))
2356 {
2357 // Append the returned values to the list to send.
2358 subClassNameList.append(subClassNames[i]);
2359 serviceNames.append(serviceName);
2360 controlProviderNames.append(controlProviderName);
2361
2362 PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4,
2363 "Provider found for Class = " + subClassNames[i]
2364 + " servicename = " + serviceName
2365 + " controlProviderName = "
2366 + ((controlProviderName != String::EMPTY) ? controlProviderName : "None"));
2367 }
|
2368 karl 1.86 }
|
2369 chip 1.39
|
2370 karl 1.86 Uint32 ps = serviceNames.size();
|
2371 karl 1.87
2372 // Test for "enumerate to Broad" and if so, execute exception.
|
2373 karl 1.97 // Simply limits the subclass depth to some max, not number
2374 // of instances returned.
|
2375 karl 1.96 // ATTN: add size and limit to the message.
|
2376 kumpf 1.88 if(ps > MAX_ENUMERATE_BREADTH)
|
2377 karl 1.87 {
2378 CIMEnumerateInstanceNamesResponseMessage* response =
2379 new CIMEnumerateInstanceNamesResponseMessage(
2380 request->messageId,
|
2381 kumpf 1.109 PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, "Enumerate request too Broad"),
|
2382 karl 1.87 request->queueIds.copyAndPop(),
|
2383 kumpf 1.92 Array<CIMObjectPath>());
|
2384 karl 1.87
2385 STAT_COPYDISPATCHER
2386
2387 _enqueueResponse(request, response);
|
2388 karl 1.96 PEG_METHOD_EXIT();
2389 return;
|
2390 karl 1.87
2391 }
|
2392 karl 1.97 // Set up an aggregate object for the information and save request in it.
2393 // With the original request message.
2394
|
2395 kumpf 1.109 OperationAggregate *poA= new OperationAggregate(
2396 new CIMEnumerateInstanceNamesRequestMessage(*request),
2397 request->getType(),
2398 request->messageId);
2399 poA->dest = request->queueIds.top();
|
2400 karl 1.97
2401 Boolean staticInstancesExist = false;
|
2402 karl 1.86
|
2403 kumpf 1.102 if ((ps == 0) && (_repository->isDefaultInstanceProvider()))
|
2404 kumpf 1.47 {
|
2405 kumpf 1.102 Tracer::trace(TRC_DISPATCHER, Tracer::LEVEL4,
2406 "Repository being used as THE default instance provider");
|
2407 kumpf 1.72 CIMException cimException;
|
2408 sage 1.77 STAT_PROVIDERSTART
|
2409 kumpf 1.92 Array<CIMObjectPath> instanceNames;
|
2410 kumpf 1.47 _repository->read_lock();
2411 try
2412 {
|
2413 karl 1.96 instanceNames = _repository->enumerateInstanceNamesForClass(
|
2414 karl 1.97 request->nameSpace,
2415 request->className,
2416 true);
|
2417 kumpf 1.47 }
2418 catch(CIMException& exception)
2419 {
|
2420 kumpf 1.72 cimException = exception;
|
2421 kumpf 1.47 }
2422 catch(Exception& exception)
2423 {
|
2424 kumpf 1.72 cimException =
2425 PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
|
2426 kumpf 1.47 }
2427 catch(...)
2428 {
|
2429 kumpf 1.72 cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
|
2430 kumpf 1.47 }
|
2431 karl 1.97 _repository->read_unlock();
|
2432 kumpf 1.47
|
2433 sage 1.77 STAT_PROVIDEREND
2434
|
2435 kumpf 1.47 CIMEnumerateInstanceNamesResponseMessage* response =
|
2436 karl 1.97 new CIMEnumerateInstanceNamesResponseMessage(
2437 request->messageId,
2438 cimException,
2439 request->queueIds.copyAndPop(),
2440 instanceNames);
|
2441 mday 1.36
|
2442 sage 1.77 STAT_COPYDISPATCHER_REP
2443
|
2444 kumpf 1.102 #if 0
2445 //ATTN-DME-P1-20020529: If providers exist then the repository should not
2446 // be called.
|
2447 karl 1.97 // If there will be other responses, put this on the response list.
2448 // else, simply issue it.
2449 if (ps > 0)
2450 {
2451 poA->appendResponse(response);
2452 staticInstancesExist = true;
2453 }
2454 else
2455 {
|
2456 kumpf 1.109 delete poA;
|
2457 karl 1.97 _enqueueResponse(request, response);
2458 PEG_METHOD_EXIT();
2459 return;
2460 }
|
2461 kumpf 1.102 #else
|
2462 kumpf 1.109 delete poA;
|
2463 kumpf 1.102 _enqueueResponse(request, response);
2464 PEG_METHOD_EXIT();
2465 return;
2466 #endif
|
2467 karl 1.97 }
|
2468 karl 1.86
|
2469 karl 1.97 if(ps > 0)
2470 {
2471 //************* Limit to one response if we have problems with more.
2472 #ifdef LIMIT_ENUM_TO_ONE_LEVEL
2473 ps = 1;
|
2474 kumpf 1.109 #endif
|
2475 karl 1.97 // Simply takes the top level request and ignores the others.
2476 //*******************/
2477 poA->setTotalIssued(ps);
2478
2479 for(Uint32 i = 0; i < ps; i++ )
2480 {
2481 poA->classes.append(subClassNameList[i]);
2482 poA->serviceNames.append(serviceNames[i]);
2483 poA->controlProviderNames.append(controlProviderNames[i]);
2484
2485 Uint32 current = poA->classes.size() - 1;
2486 //request->print(cout, true);
2487
2488 CIMEnumerateInstanceNamesRequestMessage* requestCopy =
2489 new CIMEnumerateInstanceNamesRequestMessage(*request);
2490
2491 requestCopy->className = poA->classes[current];
2492
2493 //request->print(cout, true);
2494 //requestCopy->print(cout, true);
2495
2496 karl 1.97 PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4,
2497 Formatter::format(
2498 "EnumerateNames Req. class $0 to svc $1 for control provider $2 No $3 of $4",
2499 poA->classes[current], poA->serviceNames[current],
2500 ((poA->controlProviderNames[current] != String::EMPTY) ?
2501 poA->controlProviderNames[current] : "None"),
2502 i, ps));
2503
|
2504 kumpf 1.109 /*cout << "KSTEST send to provider, Class = " << classes[current]
|
2505 karl 1.97 << " servicename = " << poA->serviceNames[current]
2506 << " control provider name = "
2507 << ((poA->controlProviderNames[current] != String::EMPTY) ?
2508 poA->controlProviderNames[current] : "None")
2509 << " count " << current << endl;
2510
2511 for(Uint32 j = 0; j <= i; j++ )
2512 {
2513 cout << "KSTEST View Class Arrays "
2514 << " Class = " << poA->classes[j]
2515 << " Service Name = " << poA->serviceNames[j]
2516 << " Control Provider = " << ((poA->controlProviderNames[j]
2517 != String::EMPTY) ?
2518 poA->controlProviderNames[j] : "None")
2519 << " count " << j << endl;
|
2520 kumpf 1.109 }*/
|
2521 karl 1.97
|
2522 kumpf 1.109 _forwardRequestForAggregation(poA->serviceNames[current],
|
2523 karl 1.97 poA->controlProviderNames[current], requestCopy, poA);
2524 }
2525 PEG_METHOD_EXIT();
2526 return;
|
2527 mday 1.36 }
|
2528 karl 1.97 // No provider is registered and the repository isn't the default
|
2529 kumpf 1.102 if ((ps == 0) && !(_repository->isDefaultInstanceProvider()))
|
2530 karl 1.97 {
2531 PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4,
|
2532 kumpf 1.110 "No provider for " + className + " and subclasses.");
|
2533 karl 1.86
2534 CIMEnumerateInstanceNamesResponseMessage* response =
|
2535 kumpf 1.47 new CIMEnumerateInstanceNamesResponseMessage(
2536 request->messageId,
|
2537 kumpf 1.72 PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY),
|
2538 kumpf 1.47 request->queueIds.copyAndPop(),
|
2539 kumpf 1.92 Array<CIMObjectPath>());
|
2540 kumpf 1.47
|
2541 sage 1.77 STAT_COPYDISPATCHER
2542
|
2543 kumpf 1.109 delete poA;
|
2544 kumpf 1.47 _enqueueResponse(request, response);
|
2545 mday 1.36 }
|
2546 kumpf 1.59
2547 PEG_METHOD_EXIT();
|
2548 mike 1.2 }
2549
|
2550 mday 1.36 void CIMOperationRequestDispatcher::handleAssociatorsRequest(
2551 CIMAssociatorsRequestMessage* request)
|
2552 mike 1.2 {
|
2553 kumpf 1.59 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
2554 kumpf 1.73 "CIMOperationRequestDispatcher::handleAssociatorsRequest");
|
2555 kumpf 1.59
|
2556 kumpf 1.104 if (!_enableAssociationTraversal)
2557 {
2558 CIMException cimException =
2559 PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, "Associators");
2560 Array<CIMObject> cimObjects;
2561
2562 CIMAssociatorsResponseMessage* response =
2563 new CIMAssociatorsResponseMessage(
2564 request->messageId,
2565 cimException,
2566 request->queueIds.copyAndPop(),
2567 cimObjects);
2568
2569 STAT_COPYDISPATCHER
2570
2571 _enqueueResponse(request, response);
2572
2573 PEG_METHOD_EXIT();
|
2574 kumpf 1.113 return;
|
2575 kumpf 1.104 }
2576
|
2577 mday 1.36 String className = request->objectName.getClassName();
|
2578 sage 1.75 String assocClassName = request->assocClass;
2579 String resultClassName = request->resultClass;
2580
|
2581 kumpf 1.61 CIMResponseMessage * response;
|
2582 karl 1.81
|
2583 mday 1.36 // check the class name for an "external provider"
|
2584 sage 1.75 Array<String> providerNames = _lookupAssociationProvider(request->nameSpace, className);
|
2585 chip 1.12
|
2586 sage 1.75 if(providerNames.size() != 0)
|
2587 mday 1.36 {
|
2588 kumpf 1.61 CIMAssociatorsRequestMessage* requestCopy =
2589 new CIMAssociatorsRequestMessage(*request);
|
2590 chip 1.12
|
2591 kumpf 1.61 _forwardRequestToService(
|
2592 kumpf 1.74 PEGASUS_QUEUENAME_PROVIDERMANAGER_CPP, requestCopy, response);
|
2593 chip 1.39
|
2594 kumpf 1.61 PEG_METHOD_EXIT();
2595 return;
|
2596 mday 1.36 }
|
2597 kumpf 1.47 else if (_repository->isDefaultInstanceProvider())
2598 {
|
2599 kumpf 1.72 CIMException cimException;
|
2600 sage 1.77
2601 STAT_PROVIDERSTART
2602
|
2603 kumpf 1.103 Array<CIMObject> cimObjects;
|
2604 kumpf 1.47
2605 _repository->read_lock();
|
2606 chip 1.12
|
2607 kumpf 1.47 try
2608 {
2609 cimObjects = _repository->associators(
|
2610 karl 1.97 request->nameSpace,
2611 request->objectName,
2612 request->assocClass,
2613 request->resultClass,
2614 request->role,
2615 request->resultRole,
2616 request->includeQualifiers,
2617 request->includeClassOrigin,
2618 request->propertyList.getPropertyNameArray());
|
2619 kumpf 1.47 }
2620 catch(CIMException& exception)
2621 {
|
2622 kumpf 1.72 cimException = exception;
|
2623 kumpf 1.47 }
2624 catch(Exception& exception)
2625 {
|
2626 kumpf 1.72 cimException =
2627 PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
|
2628 kumpf 1.47 }
2629 catch(...)
2630 {
|
2631 kumpf 1.72 cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
|
2632 kumpf 1.47 }
2633
2634 _repository->read_unlock();
|
2635 chip 1.12
|
2636 sage 1.77 STAT_PROVIDEREND
2637
|
2638 kumpf 1.47 CIMAssociatorsResponseMessage* response =
2639 new CIMAssociatorsResponseMessage(
2640 request->messageId,
|
2641 kumpf 1.72 cimException,
|
2642 kumpf 1.47 request->queueIds.copyAndPop(),
2643 cimObjects);
|
2644 mike 1.2
|
2645 sage 1.77 STAT_COPYDISPATCHER_REP
2646
|
2647 kumpf 1.47 _enqueueResponse(request, response);
|
2648 mday 1.36 }
|
2649 kumpf 1.47 else // No provider is registered and the repository isn't the default
|
2650 mday 1.36 {
|
2651 kumpf 1.47 CIMAssociatorsResponseMessage* response =
2652 new CIMAssociatorsResponseMessage(
2653 request->messageId,
|
2654 kumpf 1.72 PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY),
|
2655 kumpf 1.47 request->queueIds.copyAndPop(),
|
2656 kumpf 1.103 Array<CIMObject>());
|
2657 kumpf 1.47
|
2658 sage 1.77 STAT_COPYDISPATCHER
2659
|
2660 kumpf 1.47 _enqueueResponse(request, response);
|
2661 mday 1.36 }
|
2662 kumpf 1.59
2663 PEG_METHOD_EXIT();
|
2664 mike 1.2 }
2665
|
2666 mday 1.36 void CIMOperationRequestDispatcher::handleAssociatorNamesRequest(
2667 CIMAssociatorNamesRequestMessage* request)
|
2668 mike 1.2 {
|
2669 kumpf 1.59 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
2670 kumpf 1.73 "CIMOperationRequestDispatcher::handleAssociatorNamesRequest");
|
2671 kumpf 1.59
|
2672 kumpf 1.104 if (!_enableAssociationTraversal)
2673 {
2674 CIMException cimException =
2675 PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, "AssociatorNames");
2676 Array<CIMObjectPath> cimObjects;
2677
2678 CIMAssociatorNamesResponseMessage* response =
2679 new CIMAssociatorNamesResponseMessage(
2680 request->messageId,
2681 cimException,
2682 request->queueIds.copyAndPop(),
2683 cimObjects);
2684
2685 STAT_COPYDISPATCHER
2686
2687 _enqueueResponse(request, response);
2688
2689 PEG_METHOD_EXIT();
|
2690 kumpf 1.113 return;
|
2691 kumpf 1.104 }
2692
|
2693 mday 1.36 String className = request->objectName.getClassName();
|
2694 sage 1.75 String resultClassName = request->resultClass;
|
2695 kumpf 1.61 CIMResponseMessage * response;
|
2696 karl 1.81
|
2697 mday 1.36 // check the class name for an "external provider"
|
2698 sage 1.75 Array<String> providerNames = _lookupAssociationProvider(request->nameSpace, className);
|
2699 mike 1.2
|
2700 sage 1.75 if(providerNames.size() != 0)
|
2701 mday 1.36 {
|
2702 kumpf 1.61 CIMAssociatorNamesRequestMessage* requestCopy =
2703 new CIMAssociatorNamesRequestMessage(*request);
|
2704 chip 1.53
|
2705 kumpf 1.61 _forwardRequestToService(
|
2706 kumpf 1.74 PEGASUS_QUEUENAME_PROVIDERMANAGER_CPP, requestCopy, response);
|
2707 chip 1.53
|
2708 kumpf 1.61 PEG_METHOD_EXIT();
2709 return;
|
2710 mday 1.36 }
|
2711 kumpf 1.47 else if (_repository->isDefaultInstanceProvider())
2712 {
|
2713 kumpf 1.72 CIMException cimException;
|
2714 sage 1.77
2715 STAT_PROVIDERSTART
2716
|
2717 kumpf 1.92 Array<CIMObjectPath> objectNames;
|
2718 chip 1.12
|
2719 kumpf 1.47 _repository->read_lock();
2720
2721 try
2722 {
2723 objectNames = _repository->associatorNames(
2724 request->nameSpace,
2725 request->objectName,
2726 request->assocClass,
2727 request->resultClass,
2728 request->role,
2729 request->resultRole);
2730 }
2731 catch(CIMException& exception)
2732 {
|
2733 kumpf 1.72 cimException = exception;
|
2734 kumpf 1.47 }
2735 catch(Exception& exception)
2736 {
|
2737 kumpf 1.72 cimException =
2738 PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
|
2739 kumpf 1.47 }
2740 catch(...)
2741 {
|
2742 kumpf 1.72 cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
|
2743 kumpf 1.47 }
2744
2745 _repository->read_unlock();
|
2746 kumpf 1.26
|
2747 sage 1.77 STAT_PROVIDEREND
2748
|
2749 kumpf 1.47 CIMAssociatorNamesResponseMessage* response =
2750 new CIMAssociatorNamesResponseMessage(
2751 request->messageId,
|
2752 kumpf 1.72 cimException,
|
2753 kumpf 1.47 request->queueIds.copyAndPop(),
2754 objectNames);
|
2755 kumpf 1.25
|
2756 sage 1.77 STAT_COPYDISPATCHER_REP
2757
|
2758 kumpf 1.47 _enqueueResponse(request, response);
|
2759 mday 1.36 }
|
2760 kumpf 1.47 else // No provider is registered and the repository isn't the default
|
2761 mday 1.36 {
|
2762 kumpf 1.47 CIMAssociatorNamesResponseMessage* response =
2763 new CIMAssociatorNamesResponseMessage(
2764 request->messageId,
|
2765 kumpf 1.72 PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY),
|
2766 kumpf 1.47 request->queueIds.copyAndPop(),
|
2767 kumpf 1.92 Array<CIMObjectPath>());
|
2768 kumpf 1.47
|
2769 sage 1.77 STAT_COPYDISPATCHER
2770
|
2771 kumpf 1.47 _enqueueResponse(request, response);
|
2772 mday 1.36 }
|
2773 kumpf 1.59
2774 PEG_METHOD_EXIT();
|
2775 mday 1.36 }
|
2776 kumpf 1.25
|
2777 mday 1.36 void CIMOperationRequestDispatcher::handleReferencesRequest(
2778 CIMReferencesRequestMessage* request)
2779 {
|
2780 kumpf 1.59 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
2781 kumpf 1.73 "CIMOperationRequestDispatcher::handleReferencesRequest");
|
2782 kumpf 1.59
|
2783 kumpf 1.104 if (!_enableAssociationTraversal)
2784 {
2785 CIMException cimException =
2786 PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, "References");
2787 Array<CIMObject> cimObjects;
2788
2789 CIMReferencesResponseMessage* response =
2790 new CIMReferencesResponseMessage(
2791 request->messageId,
2792 cimException,
2793 request->queueIds.copyAndPop(),
2794 cimObjects);
2795
2796 STAT_COPYDISPATCHER
2797
2798 _enqueueResponse(request, response);
2799
2800 PEG_METHOD_EXIT();
|
2801 kumpf 1.113 return;
|
2802 kumpf 1.104 }
2803
|
2804 mday 1.36 String className = request->objectName.getClassName();
|
2805 kumpf 1.61 CIMResponseMessage * response;
|
2806 karl 1.81
|
2807 mday 1.36 // check the class name for an "external provider"
|
2808 sage 1.75 Array<String> providerNames = _lookupAssociationProvider(request->nameSpace, className);
|
2809 mike 1.2
|
2810 sage 1.75 if(providerNames.size() != 0)
|
2811 mday 1.36 {
|
2812 kumpf 1.61 CIMReferencesRequestMessage* requestCopy =
2813 new CIMReferencesRequestMessage(*request);
|
2814 chip 1.53
|
2815 kumpf 1.61 _forwardRequestToService(
|
2816 kumpf 1.74 PEGASUS_QUEUENAME_PROVIDERMANAGER_CPP, requestCopy, response);
|
2817 chip 1.53
|
2818 kumpf 1.61 PEG_METHOD_EXIT();
2819 return;
|
2820 mday 1.36 }
|
2821 kumpf 1.47 else if (_repository->isDefaultInstanceProvider())
2822 {
|
2823 kumpf 1.72 CIMException cimException;
|
2824 sage 1.77
2825 STAT_PROVIDERSTART
2826
|
2827 kumpf 1.103 Array<CIMObject> cimObjects;
|
2828 kumpf 1.47
2829 _repository->read_lock();
2830
2831 try
2832 {
2833 cimObjects = _repository->references(
2834 request->nameSpace,
2835 request->objectName,
2836 request->resultClass,
2837 request->role,
2838 request->includeQualifiers,
2839 request->includeClassOrigin,
2840 request->propertyList.getPropertyNameArray());
2841 }
2842 catch(CIMException& exception)
2843 {
|
2844 kumpf 1.72 cimException = exception;
|
2845 kumpf 1.47 }
2846 catch(Exception& exception)
2847 {
|
2848 kumpf 1.72 cimException =
2849 PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
|
2850 kumpf 1.47 }
2851 catch(...)
2852 {
|
2853 kumpf 1.72 cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
|
2854 kumpf 1.47 }
|
2855 chip 1.6
|
2856 kumpf 1.47 _repository->read_unlock();
|
2857 mike 1.2
|
2858 sage 1.77 STAT_PROVIDEREND
2859
|
2860 kumpf 1.47 CIMReferencesResponseMessage* response =
2861 new CIMReferencesResponseMessage(
2862 request->messageId,
|
2863 kumpf 1.72 cimException,
|
2864 kumpf 1.47 request->queueIds.copyAndPop(),
2865 cimObjects);
|
2866 mike 1.2
|
2867 sage 1.77 STAT_COPYDISPATCHER_REP
2868
|
2869 kumpf 1.47 _enqueueResponse(request, response);
|
2870 mday 1.36 }
|
2871 kumpf 1.47 else // No provider is registered and the repository isn't the default
|
2872 mday 1.36 {
|
2873 kumpf 1.47 CIMReferencesResponseMessage* response =
2874 new CIMReferencesResponseMessage(
2875 request->messageId,
|
2876 kumpf 1.72 PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY),
|
2877 kumpf 1.47 request->queueIds.copyAndPop(),
|
2878 kumpf 1.103 Array<CIMObject>());
|
2879 kumpf 1.47
|
2880 sage 1.77 STAT_COPYDISPATCHER
2881
|
2882 kumpf 1.47 _enqueueResponse(request, response);
|
2883 mday 1.36 }
|
2884 kumpf 1.59
2885 PEG_METHOD_EXIT();
|
2886 mike 1.2 }
2887
|
2888 mday 1.36 void CIMOperationRequestDispatcher::handleReferenceNamesRequest(
2889 CIMReferenceNamesRequestMessage* request)
|
2890 mike 1.2 {
|
2891 kumpf 1.59 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
2892 kumpf 1.73 "CIMOperationRequestDispatcher::handleReferenceNamesRequest");
|
2893 kumpf 1.104
2894 if (!_enableAssociationTraversal)
2895 {
2896 CIMException cimException =
2897 PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, "ReferenceNames");
2898 Array<CIMObjectPath> cimObjects;
2899
2900 CIMReferenceNamesResponseMessage* response =
2901 new CIMReferenceNamesResponseMessage(
2902 request->messageId,
2903 cimException,
2904 request->queueIds.copyAndPop(),
2905 cimObjects);
2906
2907 STAT_COPYDISPATCHER
2908
2909 _enqueueResponse(request, response);
2910
2911 PEG_METHOD_EXIT();
|
2912 kumpf 1.113 return;
|
2913 kumpf 1.104 }
|
2914 kumpf 1.59
|
2915 mday 1.36 String className = request->objectName.getClassName();
|
2916 kumpf 1.61 CIMResponseMessage * response;
|
2917 karl 1.81
|
2918 mday 1.36 // check the class name for an "external provider"
|
2919 sage 1.75 Array<String> providerNames = _lookupAssociationProvider(request->nameSpace, className);
|
2920 mday 1.36
|
2921 sage 1.75 if(providerNames.size() != 0)
|
2922 mday 1.36 {
|
2923 kumpf 1.61 CIMReferenceNamesRequestMessage* requestCopy =
2924 new CIMReferenceNamesRequestMessage(*request);
|
2925 chip 1.53
|
2926 kumpf 1.61 _forwardRequestToService(
|
2927 kumpf 1.74 PEGASUS_QUEUENAME_PROVIDERMANAGER_CPP, requestCopy, response);
|
2928 chip 1.53
|
2929 kumpf 1.61 PEG_METHOD_EXIT();
2930 return;
|
2931 mday 1.36 }
|
2932 kumpf 1.47 else if (_repository->isDefaultInstanceProvider())
2933 {
|
2934 kumpf 1.72 CIMException cimException;
|
2935 sage 1.77
2936 STAT_PROVIDERSTART
2937
|
2938 kumpf 1.92 Array<CIMObjectPath> objectNames;
|
2939 kumpf 1.47
2940 _repository->read_lock();
2941
2942 try
2943 {
2944 objectNames = _repository->referenceNames(
2945 request->nameSpace,
2946 request->objectName,
2947 request->resultClass,
2948 request->role);
2949 }
2950 catch(CIMException& exception)
2951 {
|
2952 kumpf 1.72 cimException = exception;
|
2953 kumpf 1.47 }
2954 catch(Exception& exception)
2955 {
|
2956 kumpf 1.72 cimException =
2957 PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
|
2958 kumpf 1.47 }
2959 catch(...)
2960 {
|
2961 kumpf 1.72 cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
|
2962 kumpf 1.47 }
|
2963 mike 1.2
|
2964 kumpf 1.47 _repository->read_unlock();
|
2965 mike 1.2
|
2966 sage 1.77 STAT_PROVIDEREND
2967
|
2968 kumpf 1.47 CIMReferenceNamesResponseMessage* response =
2969 new CIMReferenceNamesResponseMessage(
2970 request->messageId,
|
2971 kumpf 1.72 cimException,
|
2972 kumpf 1.47 request->queueIds.copyAndPop(),
2973 objectNames);
|
2974 mike 1.2
|
2975 sage 1.77 STAT_COPYDISPATCHER_REP
2976
|
2977 kumpf 1.47 _enqueueResponse(request, response);
|
2978 mday 1.36 }
|
2979 kumpf 1.47 else // No provider is registered and the repository isn't the default
|
2980 mday 1.36 {
|
2981 kumpf 1.47 CIMReferenceNamesResponseMessage* response =
2982 new CIMReferenceNamesResponseMessage(
2983 request->messageId,
|
2984 kumpf 1.72 PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY),
|
2985 kumpf 1.47 request->queueIds.copyAndPop(),
|
2986 kumpf 1.92 Array<CIMObjectPath>());
|
2987 kumpf 1.47
|
2988 sage 1.77 STAT_COPYDISPATCHER
2989
|
2990 kumpf 1.47 _enqueueResponse(request, response);
|
2991 mday 1.36 }
|
2992 kumpf 1.59 PEG_METHOD_EXIT();
|
2993 mike 1.2 }
2994
|
2995 mday 1.36 void CIMOperationRequestDispatcher::handleGetPropertyRequest(
2996 CIMGetPropertyRequestMessage* request)
|
2997 mike 1.2 {
|
2998 kumpf 1.59 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
2999 kumpf 1.73 "CIMOperationRequestDispatcher::handleGetPropertyRequest");
|
3000 kumpf 1.59
|
3001 mday 1.36 String className = request->instanceName.getClassName();
|
3002 kumpf 1.61 CIMResponseMessage * response;
|
3003 karl 1.81
|
3004 mday 1.36 // check the class name for an "external provider"
|
3005 kumpf 1.43 String providerName = _lookupInstanceProvider(request->nameSpace, className);
|
3006 mike 1.2
|
3007 mday 1.36 if(providerName.size() != 0)
3008 {
|
3009 kumpf 1.61 CIMGetPropertyRequestMessage* requestCopy =
3010 new CIMGetPropertyRequestMessage(*request);
|
3011 chip 1.53
|
3012 kumpf 1.61 _forwardRequestToService(
|
3013 kumpf 1.74 PEGASUS_QUEUENAME_PROVIDERMANAGER_CPP, requestCopy, response);
|
3014 mday 1.36
|
3015 kumpf 1.61 PEG_METHOD_EXIT();
3016 return;
|
3017 mday 1.36 }
|
3018 kumpf 1.47 else if (_repository->isDefaultInstanceProvider())
3019 {
|
3020 kumpf 1.72 CIMException cimException;
|
3021 sage 1.77
3022 STAT_PROVIDERSTART
|
3023 karl 1.81
|
3024 kumpf 1.47 CIMValue value;
3025
3026 _repository->read_lock();
|
3027 karl 1.81
|
3028 kumpf 1.47 try
3029 {
3030 value = _repository->getProperty(
3031 request->nameSpace,
3032 request->instanceName,
3033 request->propertyName);
3034 }
3035 catch(CIMException& exception)
3036 {
|
3037 kumpf 1.72 cimException = exception;
|
3038 kumpf 1.47 }
3039 catch(Exception& exception)
3040 {
|
3041 kumpf 1.72 cimException =
3042 PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
|
3043 kumpf 1.47 }
3044 catch(...)
3045 {
|
3046 kumpf 1.72 cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
|
3047 kumpf 1.47 }
|
3048 mike 1.2
|
3049 kumpf 1.47 _repository->read_unlock();
|
3050 sage 1.77
3051 STAT_PROVIDEREND
|
3052 karl 1.81
|
3053 kumpf 1.47 CIMGetPropertyResponseMessage* response =
3054 new CIMGetPropertyResponseMessage(
3055 request->messageId,
|
3056 kumpf 1.72 cimException,
|
3057 kumpf 1.47 request->queueIds.copyAndPop(),
3058 value);
3059
|
3060 sage 1.77 STAT_COPYDISPATCHER_REP
3061
|
3062 kumpf 1.47 _enqueueResponse(request, response);
|
3063 mday 1.36 }
|
3064 kumpf 1.47 else // No provider is registered and the repository isn't the default
|
3065 mday 1.36 {
|
3066 kumpf 1.47 CIMGetPropertyResponseMessage* response =
3067 new CIMGetPropertyResponseMessage(
3068 request->messageId,
|
3069 kumpf 1.72 PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY),
|
3070 kumpf 1.47 request->queueIds.copyAndPop(),
3071 CIMValue());
3072
|
3073 sage 1.77 STAT_COPYDISPATCHER
3074
|
3075 kumpf 1.47 _enqueueResponse(request, response);
|
3076 mday 1.36 }
|
3077 kumpf 1.59 PEG_METHOD_EXIT();
|
3078 mike 1.2 }
3079
|
3080 mday 1.36 void CIMOperationRequestDispatcher::handleSetPropertyRequest(
3081 CIMSetPropertyRequestMessage* request)
|
3082 mike 1.2 {
|
3083 kumpf 1.59 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
3084 kumpf 1.73 "CIMOperationRequestDispatcher::handleSetPropertyRequest");
|
3085 kumpf 1.59
|
3086 kumpf 1.47 {
|
3087 kumpf 1.72 CIMException cimException;
|
3088 kumpf 1.47 try
3089 {
3090 _fixSetPropertyValueType(request);
3091 }
3092 catch (CIMException& exception)
3093 {
|
3094 kumpf 1.72 cimException = exception;
|
3095 kumpf 1.47 }
3096 catch(Exception& exception)
3097 {
|
3098 kumpf 1.72 cimException =
3099 PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
|
3100 kumpf 1.47 }
3101 catch(...)
3102 {
|
3103 kumpf 1.72 cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
|
3104 kumpf 1.47 }
3105
|
3106 kumpf 1.72 if (cimException.getCode() != CIM_ERR_SUCCESS)
|
3107 kumpf 1.47 {
3108 CIMSetPropertyResponseMessage* response =
3109 new CIMSetPropertyResponseMessage(
3110 request->messageId,
|
3111 kumpf 1.72 cimException,
|
3112 kumpf 1.47 request->queueIds.copyAndPop());
3113
|
3114 sage 1.77 STAT_COPYDISPATCHER
3115
|
3116 kumpf 1.47 _enqueueResponse(request, response);
|
3117 kumpf 1.59
3118 PEG_METHOD_EXIT();
3119 return;
|
3120 kumpf 1.47 }
3121 }
|
3122 mday 1.36
3123 String className = request->instanceName.getClassName();
|
3124 kumpf 1.61 CIMResponseMessage * response;
|
3125 karl 1.81
|
3126 mday 1.36 // check the class name for an "external provider"
|
3127 kumpf 1.43 String providerName = _lookupInstanceProvider(request->nameSpace, className);
|
3128 mike 1.2
|
3129 mday 1.36 if(providerName.size() != 0)
3130 {
|
3131 kumpf 1.61 CIMSetPropertyRequestMessage* requestCopy =
3132 new CIMSetPropertyRequestMessage(*request);
|
3133 chip 1.39
|
3134 kumpf 1.61 _forwardRequestToService(
|
3135 kumpf 1.74 PEGASUS_QUEUENAME_PROVIDERMANAGER_CPP, requestCopy, response);
|
3136 chip 1.39
|
3137 kumpf 1.61 PEG_METHOD_EXIT();
3138 return;
|
3139 mday 1.36 }
|
3140 kumpf 1.47 else if (_repository->isDefaultInstanceProvider())
3141 {
|
3142 kumpf 1.72 CIMException cimException;
|
3143 kumpf 1.47
|
3144 sage 1.77 STAT_PROVIDERSTART
3145
|
3146 kumpf 1.47 _repository->write_lock();
3147
3148 try
3149 {
3150 _repository->setProperty(
3151 request->nameSpace,
3152 request->instanceName,
3153 request->propertyName,
3154 request->newValue);
3155 }
3156 catch(CIMException& exception)
3157 {
|
3158 kumpf 1.72 cimException = exception;
|
3159 kumpf 1.47 }
3160 catch(Exception& exception)
3161 {
|
3162 kumpf 1.72 cimException =
3163 PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
|
3164 kumpf 1.47 }
3165 catch(...)
3166 {
|
3167 kumpf 1.72 cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
|
3168 kumpf 1.47 }
3169
3170 _repository->write_unlock();
|
3171 mike 1.2
|
3172 sage 1.77 STAT_PROVIDEREND
3173
|
3174 kumpf 1.47 CIMSetPropertyResponseMessage* response =
3175 new CIMSetPropertyResponseMessage(
3176 request->messageId,
|
3177 kumpf 1.72 cimException,
|
3178 kumpf 1.47 request->queueIds.copyAndPop());
|
3179 mike 1.2
|
3180 sage 1.77 STAT_COPYDISPATCHER_REP
3181
|
3182 kumpf 1.47 _enqueueResponse(request, response);
|
3183 mday 1.36 }
|
3184 kumpf 1.47 else // No provider is registered and the repository isn't the default
|
3185 mday 1.36 {
|
3186 kumpf 1.47 CIMSetPropertyResponseMessage* response =
3187 new CIMSetPropertyResponseMessage(
3188 request->messageId,
|
3189 kumpf 1.72 PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY),
|
3190 kumpf 1.47 request->queueIds.copyAndPop());
3191
|
3192 sage 1.77 STAT_COPYDISPATCHER
3193
|
3194 kumpf 1.47 _enqueueResponse(request, response);
|
3195 mday 1.36 }
|
3196 kumpf 1.59
3197 PEG_METHOD_EXIT();
|
3198 mike 1.2 }
3199
|
3200 mday 1.36 void CIMOperationRequestDispatcher::handleGetQualifierRequest(
3201 CIMGetQualifierRequestMessage* request)
|
3202 mike 1.2 {
|
3203 kumpf 1.59 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
3204 kumpf 1.73 "CIMOperationRequestDispatcher::handleGetQualifierRequest");
|
3205 kumpf 1.59
|
3206 sage 1.77 STAT_PROVIDERSTART
3207
|
3208 kumpf 1.72 CIMException cimException;
|
3209 mday 1.36 CIMQualifierDecl cimQualifierDecl;
|
3210 kumpf 1.30
|
3211 mday 1.36 _repository->read_lock();
|
3212 karl 1.81
|
3213 mday 1.36 try
3214 {
3215 cimQualifierDecl = _repository->getQualifier(
3216 request->nameSpace,
3217 request->qualifierName);
3218 }
3219 catch(CIMException& exception)
3220 {
|
3221 kumpf 1.72 cimException = exception;
|
3222 mday 1.36 }
3223 catch(Exception& exception)
3224 {
|
3225 kumpf 1.72 cimException =
3226 PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
|
3227 mday 1.36 }
3228 catch(...)
3229 {
|
3230 kumpf 1.72 cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
|
3231 mday 1.36 }
|
3232 mike 1.2
|
3233 mday 1.36 _repository->read_unlock();
|
3234 mike 1.2
|
3235 sage 1.77 STAT_PROVIDEREND
3236
|
3237 mday 1.36 CIMGetQualifierResponseMessage* response =
3238 new CIMGetQualifierResponseMessage(
3239 request->messageId,
|
3240 kumpf 1.72 cimException,
|
3241 mday 1.36 request->queueIds.copyAndPop(),
3242 cimQualifierDecl);
|
3243 mike 1.2
|
3244 sage 1.77 STAT_COPYDISPATCHER_REP
3245
|
3246 mday 1.36 _enqueueResponse(request, response);
|
3247 kumpf 1.59
3248 PEG_METHOD_EXIT();
|
3249 mike 1.2 }
3250
3251 void CIMOperationRequestDispatcher::handleSetQualifierRequest(
|
3252 mday 1.36 CIMSetQualifierRequestMessage* request)
|
3253 mike 1.2 {
|
3254 kumpf 1.59 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
3255 kumpf 1.73 "CIMOperationRequestDispatcher::handleSetQualifierRequest");
|
3256 kumpf 1.59
|
3257 sage 1.77 STAT_PROVIDERSTART
3258
|
3259 kumpf 1.72 CIMException cimException;
|
3260 mike 1.2
|
3261 mday 1.36 _repository->write_lock();
|
3262 karl 1.81
|
3263 mday 1.36 try
3264 {
3265 _repository->setQualifier(
3266 request->nameSpace,
3267 request->qualifierDeclaration);
3268 }
3269 catch(CIMException& exception)
3270 {
|
3271 kumpf 1.72 cimException = exception;
|
3272 mday 1.36 }
3273 catch(Exception& exception)
3274 {
|
3275 kumpf 1.72 cimException =
3276 PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
|
3277 mday 1.36 }
3278 catch(...)
3279 {
|
3280 kumpf 1.72 cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
|
3281 mday 1.36 }
3282
3283 _repository->write_unlock();
3284
|
3285 sage 1.77 STAT_PROVIDEREND
3286
|
3287 mday 1.36 CIMSetQualifierResponseMessage* response =
3288 new CIMSetQualifierResponseMessage(
3289 request->messageId,
|
3290 kumpf 1.72 cimException,
|
3291 mday 1.36 request->queueIds.copyAndPop());
|
3292 mike 1.2
|
3293 sage 1.77 STAT_COPYDISPATCHER_REP
3294
|
3295 mday 1.36 _enqueueResponse(request, response);
|
3296 kumpf 1.59
3297 PEG_METHOD_EXIT();
|
3298 mike 1.2 }
3299
3300 void CIMOperationRequestDispatcher::handleDeleteQualifierRequest(
|
3301 mday 1.36 CIMDeleteQualifierRequestMessage* request)
|
3302 mike 1.2 {
|
3303 kumpf 1.59 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
3304 kumpf 1.73 "CIMOperationRequestDispatcher::handleDeleteQualifierRequest");
|
3305 kumpf 1.59
|
3306 sage 1.77 STAT_PROVIDERSTART
3307
|
3308 kumpf 1.72 CIMException cimException;
|
3309 mday 1.36
3310 _repository->write_lock();
3311
3312 try
3313 {
3314 _repository->deleteQualifier(
3315 request->nameSpace,
3316 request->qualifierName);
3317 }
3318
3319 catch(CIMException& exception)
3320 {
|
3321 kumpf 1.72 cimException = exception;
|
3322 mday 1.36 }
3323 catch(Exception& exception)
3324 {
|
3325 kumpf 1.72 cimException =
3326 PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
|
3327 mday 1.36 }
3328 catch(...)
3329 {
|
3330 kumpf 1.72 cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
|
3331 mday 1.36 }
|
3332 mike 1.2
|
3333 mday 1.36 _repository->write_unlock();
|
3334 mike 1.2
|
3335 sage 1.77 STAT_PROVIDEREND
3336
|
3337 mday 1.36 CIMDeleteQualifierResponseMessage* response =
3338 new CIMDeleteQualifierResponseMessage(
3339 request->messageId,
|
3340 kumpf 1.72 cimException,
|
3341 mday 1.36 request->queueIds.copyAndPop());
|
3342 mike 1.2
|
3343 sage 1.77 STAT_COPYDISPATCHER_REP
3344
|
3345 mday 1.36 _enqueueResponse(request, response);
|
3346 kumpf 1.59
3347 PEG_METHOD_EXIT();
|
3348 mike 1.2 }
3349
3350 void CIMOperationRequestDispatcher::handleEnumerateQualifiersRequest(
|
3351 mday 1.36 CIMEnumerateQualifiersRequestMessage* request)
|
3352 mike 1.2 {
|
3353 kumpf 1.59 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
3354 kumpf 1.73 "CIMOperationRequestDispatcher::handleEnumerateQualifiersRequest");
|
3355 kumpf 1.59
|
3356 kumpf 1.72 CIMException cimException;
|
3357 sage 1.77
3358 STAT_PROVIDERSTART
3359
|
3360 mday 1.36 Array<CIMQualifierDecl> qualifierDeclarations;
3361
3362 _repository->read_lock();
3363
3364 try
3365 {
3366 qualifierDeclarations = _repository->enumerateQualifiers(
3367 request->nameSpace);
3368 }
3369
3370 catch(CIMException& exception)
3371 {
|
3372 kumpf 1.72 cimException = exception;
|
3373 mday 1.36 }
3374 catch(Exception& exception)
3375 {
|
3376 kumpf 1.72 cimException =
3377 PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
|
3378 mday 1.36 }
3379 catch(...)
3380 {
|
3381 kumpf 1.72 cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
|
3382 mday 1.36 }
3383
3384 _repository->read_unlock();
3385
|
3386 sage 1.77 STAT_PROVIDEREND
3387
|
3388 mday 1.36 CIMEnumerateQualifiersResponseMessage* response =
3389 new CIMEnumerateQualifiersResponseMessage(
3390 request->messageId,
|
3391 kumpf 1.72 cimException,
|
3392 mday 1.36 request->queueIds.copyAndPop(),
3393 qualifierDeclarations);
|
3394 kumpf 1.68
3395 _enqueueResponse(request, response);
3396
|
3397 sage 1.77 STAT_COPYDISPATCHER_REP
3398
|
3399 kumpf 1.68 PEG_METHOD_EXIT();
3400 }
3401
3402 void CIMOperationRequestDispatcher::handleExecQueryRequest(
3403 CIMExecQueryRequestMessage* request)
3404 {
3405 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
3406 kumpf 1.73 "CIMOperationRequestDispatcher::handleExecQueryRequest");
|
3407 kumpf 1.68
|
3408 kumpf 1.72 CIMException cimException =
3409 PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, "ExecQuery");
|
3410 kumpf 1.103 Array<CIMObject> cimObjects;
|
3411 kumpf 1.68
3412 CIMExecQueryResponseMessage* response =
3413 new CIMExecQueryResponseMessage(
3414 request->messageId,
|
3415 kumpf 1.72 cimException,
|
3416 kumpf 1.68 request->queueIds.copyAndPop(),
|
3417 kumpf 1.69 cimObjects);
|
3418 mike 1.2
|
3419 sage 1.77 STAT_COPYDISPATCHER
3420
|
3421 mday 1.36 _enqueueResponse(request, response);
|
3422 kumpf 1.59
3423 PEG_METHOD_EXIT();
|
3424 mike 1.2 }
3425
3426 void CIMOperationRequestDispatcher::handleInvokeMethodRequest(
|
3427 mday 1.36 CIMInvokeMethodRequestMessage* request)
|
3428 mike 1.2 {
|
3429 kumpf 1.59 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
3430 kumpf 1.73 "CIMOperationRequestDispatcher::handleInvokeMethodRequest");
|
3431 kumpf 1.59
|
3432 kumpf 1.61 CIMResponseMessage * response;
3433
|
3434 kumpf 1.47 {
|
3435 kumpf 1.72 CIMException cimException;
|
3436 kumpf 1.47 try
3437 {
3438 _fixInvokeMethodParameterTypes(request);
3439 }
3440 catch (CIMException& exception)
3441 {
|
3442 kumpf 1.72 cimException = exception;
|
3443 kumpf 1.47 }
3444 catch(Exception& exception)
3445 {
|
3446 kumpf 1.72 cimException =
3447 PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
|
3448 kumpf 1.47 }
3449 catch(...)
3450 {
|
3451 kumpf 1.72 cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
|
3452 kumpf 1.47 }
3453
|
3454 kumpf 1.72 if (cimException.getCode() != CIM_ERR_SUCCESS)
|
3455 kumpf 1.47 {
|
3456 kumpf 1.61 response =
|
3457 kumpf 1.47 new CIMInvokeMethodResponseMessage(
3458 request->messageId,
|
3459 kumpf 1.72 cimException,
|
3460 kumpf 1.47 request->queueIds.copyAndPop(),
3461 CIMValue(),
3462 Array<CIMParamValue>(),
3463 request->methodName);
3464
|
3465 sage 1.77 STAT_COPYDISPATCHER
3466
|
3467 kumpf 1.47 _enqueueResponse(request, response);
|
3468 kumpf 1.59
3469 PEG_METHOD_EXIT();
3470 return;
|
3471 kumpf 1.47 }
3472 }
3473
|
3474 kumpf 1.30
|
3475 mday 1.36 String className = request->instanceName.getClassName();
|
3476 kumpf 1.65
|
3477 kumpf 1.113 CIMException checkClassException;
3478 _checkExistenceOfClass(request->nameSpace, className, checkClassException);
3479 if (checkClassException.getCode() != CIM_ERR_SUCCESS)
3480 {
3481 CIMInvokeMethodResponseMessage* response =
3482 new CIMInvokeMethodResponseMessage(
3483 request->messageId,
3484 checkClassException,
3485 request->queueIds.copyAndPop(),
3486 CIMValue(),
3487 Array<CIMParamValue>(),
3488 request->methodName);
3489
3490 _enqueueResponse(request, response);
3491 PEG_METHOD_EXIT();
3492 return;
3493 }
3494
|
3495 kumpf 1.65 String serviceName = String::EMPTY;
3496 String controlProviderName = String::EMPTY;
3497
3498 // Check for class provided by an internal provider
3499 if (_lookupInternalProvider(request->nameSpace, className, serviceName,
3500 controlProviderName))
3501 {
3502 CIMInvokeMethodRequestMessage* requestCopy =
3503 new CIMInvokeMethodRequestMessage(*request);
3504
|
3505 karl 1.84 _forwardRequest(className, serviceName, controlProviderName,
|
3506 karl 1.96 requestCopy);
|
3507 kumpf 1.65
3508 PEG_METHOD_EXIT();
3509 return;
3510 }
3511
|
3512 mday 1.36 // check the class name for an "external provider"
|
3513 chip 1.46 String providerName = _lookupMethodProvider(request->nameSpace,
|
3514 kumpf 1.43 className, request->methodName);
|
3515 mike 1.2
|
3516 mday 1.36 if(providerName.size() != 0)
3517 {
|
3518 kumpf 1.61 CIMInvokeMethodRequestMessage* requestCopy =
3519 new CIMInvokeMethodRequestMessage(*request);
|
3520 chip 1.53
|
3521 kumpf 1.61 _forwardRequestToService(
|
3522 kumpf 1.74 PEGASUS_QUEUENAME_PROVIDERMANAGER_CPP, requestCopy, response);
|
3523 chip 1.39
|
3524 kumpf 1.61 PEG_METHOD_EXIT();
3525 return;
|
3526 mday 1.36 }
|
3527 karl 1.81
|
3528 kumpf 1.72 CIMException cimException =
3529 PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, "Provider not available");
|
3530 mday 1.36 CIMValue retValue(1);
3531 Array<CIMParamValue> outParameters;
3532
|
3533 kumpf 1.61 response =
|
3534 mday 1.36 new CIMInvokeMethodResponseMessage(
3535 request->messageId,
|
3536 kumpf 1.72 cimException,
|
3537 mday 1.36 request->queueIds.copyAndPop(),
3538 retValue,
3539 outParameters,
3540 request->methodName);
|
3541 sage 1.77
3542 STAT_COPYDISPATCHER
|
3543 chip 1.12
|
3544 mday 1.36 _enqueueResponse(request, response);
|
3545 kumpf 1.59
3546 PEG_METHOD_EXIT();
|
3547 kumpf 1.16 }
|
3548 kumpf 1.30
3549 /**
|
3550 mday 1.36 Convert the specified CIMValue to the specified type, and return it in
3551 a new CIMValue.
|
3552 kumpf 1.30 */
3553 CIMValue CIMOperationRequestDispatcher::_convertValueType(
|
3554 mday 1.36 const CIMValue& value,
3555 CIMType type)
|
3556 kumpf 1.30 {
|
3557 kumpf 1.59 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
3558 kumpf 1.73 "CIMOperationRequestDispatcher::_convertValueType");
|
3559 kumpf 1.59
|
3560 mday 1.36 CIMValue newValue;
|
3561 kumpf 1.30
|
3562 mday 1.36 if (value.isArray())
3563 {
3564 Array<String> stringArray;
3565 Array<char*> charPtrArray;
3566 Array<const char*> constCharPtrArray;
3567
3568 //
3569 // Convert the value to Array<const char*> to send to conversion method
3570 //
3571 // ATTN-RK-P3-20020221: Deal with TypeMismatch exception
3572 // (Shouldn't really ever get that exception)
3573 value.get(stringArray);
3574
3575 for (Uint32 k=0; k<stringArray.size(); k++)
3576 {
3577 // Need to build an Array<const char*> to send to the conversion
3578 // routine, but also need to keep track of them pointers as char*
3579 // because Windows won't let me delete a const char*.
3580 char* charPtr = stringArray[k].allocateCString();
3581 charPtrArray.append(charPtr);
3582 constCharPtrArray.append(charPtr);
3583 mday 1.36 }
3584
3585 //
3586 // Convert the value to the specified type
3587 //
3588 try
3589 {
3590 newValue = XmlReader::stringArrayToValue(0, constCharPtrArray, type);
3591 }
3592 catch (XmlSemanticError e)
3593 {
|
3594 kumpf 1.59 PEG_METHOD_EXIT();
|
3595 mday 1.36 throw PEGASUS_CIM_EXCEPTION(
3596 CIM_ERR_INVALID_PARAMETER,
|
3597 kumpf 1.91 String("Malformed ") + type.toString() + " value");
|
3598 mday 1.36 }
3599
3600 for (Uint32 k=0; k<charPtrArray.size(); k++)
3601 {
3602 delete charPtrArray[k];
3603 }
3604 }
3605 else
3606 {
3607 String stringValue;
|
3608 kumpf 1.30
|
3609 mday 1.36 // ATTN-RK-P3-20020221: Deal with TypeMismatch exception
3610 // (Shouldn't really ever get that exception)
3611 value.get(stringValue);
3612
3613 try
3614 {
3615 newValue = XmlReader::stringToValue(0, _CString(stringValue), type);
3616 }
3617 catch (XmlSemanticError e)
3618 {
|
3619 kumpf 1.59 PEG_METHOD_EXIT();
|
3620 mday 1.36 throw PEGASUS_CIM_EXCEPTION(
3621 CIM_ERR_INVALID_PARAMETER,
|
3622 kumpf 1.91 String("Malformed ") + type.toString() + " value");
|
3623 mday 1.36 }
3624 }
|
3625 kumpf 1.30
|
3626 kumpf 1.59 PEG_METHOD_EXIT();
|
3627 mday 1.36 return newValue;
|
3628 kumpf 1.30 }
3629
3630 /**
|
3631 mday 1.36 Find the CIMParamValues in the InvokeMethod request whose types were
3632 not specified in the XML encoding, and convert them to the types
3633 specified in the method schema.
|
3634 kumpf 1.47 */
|
3635 kumpf 1.30 void CIMOperationRequestDispatcher::_fixInvokeMethodParameterTypes(
|
3636 mday 1.36 CIMInvokeMethodRequestMessage* request)
|
3637 kumpf 1.30 {
|
3638 kumpf 1.59 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
3639 kumpf 1.73 "CIMOperationRequestDispatcher::_fixInvokeMethodParameterTypes");
|
3640 kumpf 1.59
|
3641 mday 1.36 Boolean gotMethodDefinition = false;
3642 CIMMethod method;
|
3643 kumpf 1.30
3644 //
3645 // Cycle through the input parameters, converting the untyped ones.
3646 //
3647 Array<CIMParamValue> inParameters = request->inParameters;
3648 Uint32 numInParamValues = inParameters.size();
3649 for (Uint32 i=0; i<numInParamValues; i++)
3650 {
|
3651 kumpf 1.33 if (!inParameters[i].isTyped())
|
3652 kumpf 1.30 {
3653 //
3654 // Retrieve the method definition, if we haven't already done so
3655 // (only look up the method if we have an untyped parameter value)
3656 //
3657 if (!gotMethodDefinition)
3658 {
3659 //
3660 // Get the class definition for this method
3661 //
3662 CIMClass cimClass;
3663 _repository->read_lock();
|
3664 kumpf 1.47 try
3665 {
3666 cimClass = _repository->getClass(
3667 request->nameSpace,
3668 request->instanceName.getClassName(),
3669 false, //localOnly,
3670 false, //includeQualifiers,
3671 false, //includeClassOrigin,
3672 CIMPropertyList());
3673 }
3674 catch (CIMException& exception)
3675 {
3676 _repository->read_unlock();
|
3677 kumpf 1.59 PEG_METHOD_EXIT();
|
3678 kumpf 1.47 throw exception;
3679 }
3680 catch (Exception& exception)
3681 {
3682 _repository->read_unlock();
|
3683 kumpf 1.59 PEG_METHOD_EXIT();
|
3684 kumpf 1.47 throw exception;
3685 }
3686 catch (...)
3687 {
3688 _repository->read_unlock();
|
3689 kumpf 1.59 PEG_METHOD_EXIT();
|
3690 kumpf 1.47 throw CIMException(CIM_ERR_FAILED);
3691 }
|
3692 kumpf 1.30 _repository->read_unlock();
3693
3694 //
3695 // Get the method definition from the class
3696 //
3697 Uint32 methodPos = cimClass.findMethod(request->methodName);
3698 if (methodPos == PEG_NOT_FOUND)
3699 {
|
3700 kumpf 1.34 throw CIMException(CIM_ERR_METHOD_NOT_FOUND);
|
3701 kumpf 1.30 }
3702 method = cimClass.getMethod(methodPos);
3703
3704 gotMethodDefinition = true;
3705 }
3706
3707 //
3708 // Find the parameter definition for this input parameter
3709 //
|
3710 kumpf 1.33 String paramName = inParameters[i].getParameterName();
|
3711 kumpf 1.30 Uint32 numParams = method.getParameterCount();
3712 for (Uint32 j=0; j<numParams; j++)
3713 {
3714 CIMParameter param = method.getParameter(j);
3715 if (paramName == param.getName())
3716 {
3717 //
3718 // Retype the input parameter value according to the
3719 // type defined in the class/method schema
3720 //
3721 CIMType paramType = param.getType();
3722 CIMValue newValue;
3723
3724 if (inParameters[i].getValue().isNull())
3725 {
3726 newValue.setNullValue(param.getType(), param.isArray());
3727 }
3728 else if (inParameters[i].getValue().isArray() !=
3729 param.isArray())
3730 {
3731 // ATTN-RK-P1-20020222: Who catches this? They aren't.
|
3732 kumpf 1.59 PEG_METHOD_EXIT();
|
3733 kumpf 1.34 throw CIMException(CIM_ERR_TYPE_MISMATCH);
|
3734 kumpf 1.30 }
3735 else
3736 {
3737 newValue = _convertValueType(inParameters[i].getValue(),
3738 paramType);
3739 }
3740
|
3741 kumpf 1.35 inParameters[i].setValue(newValue);
3742 inParameters[i].setIsTyped(true);
|
3743 kumpf 1.30 break;
3744 }
3745 }
3746 }
3747 }
|
3748 kumpf 1.59
3749 PEG_METHOD_EXIT();
|
3750 kumpf 1.30 }
3751
3752 /**
|
3753 mday 1.36 Convert the CIMValue given in a SetProperty request to the correct
3754 type according to the schema, because it is not possible to specify
3755 the property type in the XML encoding.
|
3756 kumpf 1.30 */
3757 void CIMOperationRequestDispatcher::_fixSetPropertyValueType(
|
3758 mday 1.36 CIMSetPropertyRequestMessage* request)
|
3759 kumpf 1.30 {
|
3760 kumpf 1.59 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
3761 kumpf 1.73 "CIMOperationRequestDispatcher::_fixSetPropertyValueType");
|
3762 kumpf 1.59
|
3763 mday 1.36 CIMValue inValue = request->newValue;
|
3764 kumpf 1.30
|
3765 mday 1.36 //
3766 // Only do the conversion if the type is not already set
3767 //
3768 if ((inValue.getType() != CIMType::STRING) &&
3769 (inValue.getType() != CIMType::NONE))
3770 {
|
3771 kumpf 1.59 PEG_METHOD_EXIT();
|
3772 mday 1.36 return;
3773 }
|
3774 kumpf 1.30
|
3775 mday 1.36 //
3776 // Get the class definition for this property
3777 //
3778 CIMClass cimClass;
3779 _repository->read_lock();
|
3780 kumpf 1.47 try
3781 {
3782 cimClass = _repository->getClass(
3783 request->nameSpace,
3784 request->instanceName.getClassName(),
3785 false, //localOnly,
3786 false, //includeQualifiers,
3787 false, //includeClassOrigin,
3788 CIMPropertyList());
3789 }
3790 catch (CIMException& exception)
3791 {
3792 _repository->read_unlock();
|
3793 kumpf 1.59 PEG_METHOD_EXIT();
|
3794 kumpf 1.47 throw exception;
3795 }
3796 catch (Exception& exception)
3797 {
3798 _repository->read_unlock();
|
3799 kumpf 1.59 PEG_METHOD_EXIT();
|
3800 kumpf 1.47 throw exception;
3801 }
3802 catch (...)
3803 {
3804 _repository->read_unlock();
|
3805 kumpf 1.59 PEG_METHOD_EXIT();
|
3806 kumpf 1.47 throw CIMException(CIM_ERR_FAILED);
3807 }
|
3808 mday 1.36 _repository->read_unlock();
3809
3810 //
3811 // Get the property definition from the class
3812 //
3813 Uint32 propertyPos = cimClass.findProperty(request->propertyName);
3814 if (propertyPos == PEG_NOT_FOUND)
3815 {
|
3816 kumpf 1.59 PEG_METHOD_EXIT();
|
3817 mday 1.36 throw CIMException(CIM_ERR_NO_SUCH_PROPERTY);
3818 }
3819 CIMProperty property = cimClass.getProperty(propertyPos);
|
3820 kumpf 1.30
|
3821 mday 1.36 //
3822 // Retype the input property value according to the
3823 // type defined in the schema
3824 //
3825 CIMValue newValue;
|
3826 kumpf 1.30
|
3827 mday 1.36 if (inValue.isNull())
3828 {
3829 newValue.setNullValue(property.getType(), property.isArray());
3830 }
3831 else if (inValue.isArray() != property.isArray())
3832 {
3833 // ATTN-RK-P1-20020222: Who catches this? They aren't.
|
3834 kumpf 1.59 PEG_METHOD_EXIT();
|
3835 mday 1.36 throw CIMException(CIM_ERR_TYPE_MISMATCH);
3836 }
3837 else
3838 {
3839 newValue = _convertValueType(inValue, property.getType());
3840 }
|
3841 kumpf 1.30
|
3842 mday 1.36 //
3843 // Put the retyped value back into the message
3844 //
3845 request->newValue = newValue;
|
3846 kumpf 1.59
3847 PEG_METHOD_EXIT();
|
3848 kumpf 1.113 }
3849
3850 void CIMOperationRequestDispatcher::_checkExistenceOfClass(
3851 const String& nameSpace,
3852 const String& className,
3853 CIMException& cimException)
3854 {
3855 if (String::equalNoCase(className,"__Namespace"))
3856 {
3857 return;
3858 }
3859
3860 CIMClass cimClass;
3861
3862 _repository->read_lock();
3863
3864 try
3865 {
3866 cimClass = _repository->getClass(
3867 nameSpace,
3868 className,
3869 kumpf 1.113 true,
3870 false,
3871 false,
3872 CIMPropertyList());
3873 }
3874 catch(CIMException& exception)
3875 {
3876 cimException = exception;
3877 }
3878 catch(Exception& exception)
3879 {
3880 cimException =
3881 PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
3882 }
3883 catch(...)
3884 {
3885 cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
3886 }
3887
3888 _repository->read_unlock();
|
3889 kumpf 1.30 }
|
3890 mike 1.2
3891 PEGASUS_NAMESPACE_END
|