1 karl 1.76 //%2006////////////////////////////////////////////////////////////////////////
|
2 brian.campbell 1.67 //
3 // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
4 // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
5 // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
6 // IBM Corp.; EMC Corporation, The Open Group.
7 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
8 // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
|
9 karl 1.70 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
10 // EMC Corporation; VERITAS Software Corporation; The Open Group.
|
11 karl 1.76 // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
12 // EMC Corporation; Symantec Corporation; The Open Group.
|
13 brian.campbell 1.67 //
14 // Permission is hereby granted, free of charge, to any person obtaining a copy
15 // of this software and associated documentation files (the "Software"), to
16 // deal in the Software without restriction, including without limitation the
17 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
18 // sell copies of the Software, and to permit persons to whom the Software is
19 // furnished to do so, subject to the following conditions:
|
20 karl 1.76 //
|
21 brian.campbell 1.67 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
22 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
23 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
24 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
25 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
26 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
27 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 //
30 //==============================================================================
31 //
32 //%/////////////////////////////////////////////////////////////////////////////
33
34 #ifndef PegasusDispatcher_Dispatcher_h
35 #define PegasusDispatcher_Dispatcher_h
36
37 #include <Pegasus/Common/Config.h>
38 #include <Pegasus/Common/Thread.h>
39 #include <Pegasus/Common/MessageQueue.h>
40 #include <Pegasus/Common/CIMMessage.h>
41 #include <Pegasus/Common/CIMObject.h>
42 brian.campbell 1.67 #include <Pegasus/Common/OperationContextInternal.h>
43 #include <Pegasus/Common/QueryExpressionRep.h>
44 #include <Pegasus/Common/AutoPtr.h>
45
46 #include <Pegasus/Repository/CIMRepository.h>
47
48 #include <Pegasus/Server/CIMServer.h>
|
49 kumpf 1.82 #include \
50 <Pegasus/Server/ProviderRegistrationManager/ProviderRegistrationManager.h>
|
51 brian.campbell 1.67 #include <Pegasus/Server/Linkage.h>
52
53 #include <Pegasus/Common/QueryExpressionRep.h>
54
55 PEGASUS_NAMESPACE_BEGIN
56
57 // Class to aggregate and manage the information about classes and providers
58 // this simply masks some of the confusion of control providers, etc. today.
59
60 class PEGASUS_SERVER_LINKAGE ProviderInfo
61 {
62 public:
|
63 kumpf 1.82 ProviderInfo(const CIMName& className)
|
64 chip 1.72 : className(className),
|
65 kumpf 1.82 hasProvider(false),
66 hasProviderNormalization(false),
67 hasNoQuery(true)
|
68 brian.campbell 1.67 {
69 }
|
70 chip 1.72
71 ProviderInfo(
|
72 kumpf 1.82 const CIMName& className,
73 const String& serviceName,
74 const String& controlProviderName)
|
75 chip 1.72 : className(className),
|
76 kumpf 1.82 serviceName(serviceName),
77 controlProviderName(controlProviderName),
78 hasProvider(false),
79 hasProviderNormalization(false),
80 hasNoQuery(true)
|
81 brian.campbell 1.67 {
82 }
|
83 chip 1.72
|
84 kumpf 1.82 ProviderInfo(const ProviderInfo& providerInfo)
|
85 chip 1.72 : className(providerInfo.className),
|
86 kumpf 1.82 serviceName(providerInfo.serviceName),
87 controlProviderName(providerInfo.controlProviderName),
88 hasProvider(providerInfo.hasProvider),
89 hasProviderNormalization(false),
90 hasNoQuery(providerInfo.hasNoQuery)
|
91 brian.campbell 1.67 {
92 if (providerInfo.providerIdContainer.get() != 0)
93 {
94 providerIdContainer.reset(
95 new ProviderIdContainer(*providerInfo.providerIdContainer));
96 }
97 }
98
|
99 kumpf 1.82 ProviderInfo& operator=(const ProviderInfo& providerInfo)
|
100 brian.campbell 1.67 {
101 if (&providerInfo != this)
102 {
103 className = providerInfo.className;
104 serviceName = providerInfo.serviceName;
105 controlProviderName = providerInfo.controlProviderName;
106 hasProvider = providerInfo.hasProvider;
|
107 chip 1.72 hasProviderNormalization = providerInfo.hasProviderNormalization;
|
108 brian.campbell 1.67 hasNoQuery = providerInfo.hasNoQuery;
|
109 chip 1.72
|
110 brian.campbell 1.67 providerIdContainer.reset();
|
111 chip 1.72
|
112 brian.campbell 1.67 if (providerInfo.providerIdContainer.get() != 0)
113 {
|
114 kumpf 1.82 providerIdContainer.reset(new ProviderIdContainer(
115 *providerInfo.providerIdContainer.get()));
|
116 brian.campbell 1.67 }
117 }
|
118 chip 1.72
|
119 kumpf 1.82 return *this;
|
120 brian.campbell 1.67 }
121
|
122 chip 1.72 CIMName className;
123 String serviceName;
124 String controlProviderName;
125 Boolean hasProvider;
126 Boolean hasProviderNormalization;
127 Boolean hasNoQuery;
|
128 brian.campbell 1.67 AutoPtr<ProviderIdContainer> providerIdContainer;
129
130 private:
|
131 kumpf 1.82 ProviderInfo()
|
132 chip 1.72 {
133 }
|
134 brian.campbell 1.67 };
135
136 /* Class to manage the aggregation of data required by post processors. This
137 class is private to the dispatcher. An instance is created by the operation
138 dispatcher to aggregate request and response information and used by the
139 post processor to aggregate responses together.
140 */
141 class PEGASUS_SERVER_LINKAGE OperationAggregate
142 {
|
143 dave.sudlik 1.78 friend class CIMOperationRequestDispatcher;
|
144 brian.campbell 1.67 public:
|
145 kumpf 1.82 /** Operation Aggregate constructor. Builds an aggregate
|
146 brian.campbell 1.67 object.
147 @param request
148 @param msgRequestType
149 @param messageId
150 @param dest
|
151 kumpf 1.82 @param className
|
152 brian.campbell 1.67 */
153 OperationAggregate(CIMRequestMessage* request,
|
154 kumpf 1.82 Uint32 msgRequestType,
155 String messageId,
156 Uint32 dest,
157 CIMName className,
158 CIMNamespaceName nameSpace = CIMNamespaceName(),
159 QueryExpressionRep* query = 0,
160 String queryLanguage = String::EMPTY);
|
161 brian.campbell 1.67
162 virtual ~OperationAggregate();
|
163 chip 1.69
|
164 brian.campbell 1.67 // Tests validity by checking the magic number we put into the
165 // packet.
166
167 Boolean valid() const;
168
|
169 kumpf 1.82 // Sets the total issued to the input parameter
|
170 brian.campbell 1.67
171 void setTotalIssued(Uint32 i);
172
173 // Append a new entry to the response list. Return value indicates
174 // whether this response is the last one expected
175
176 Boolean appendResponse(CIMResponseMessage* response);
|
177 chip 1.69
|
178 brian.campbell 1.67 Uint32 numberResponses() const;
179
180 CIMRequestMessage* getRequest();
181
182 CIMResponseMessage* getResponse(const Uint32& pos);
183
184 // allow dispatcher to remove the response so it doesn't become
185 // destroyed when the poA is destroyed.
186
187 CIMResponseMessage* removeResponse(const Uint32& pos);
188
189 void deleteResponse(const Uint32&pos);
190
191 Uint32 getRequestType() const;
192
|
193 kumpf 1.82 void resequenceResponse(CIMResponseMessage& response);
|
194 brian.campbell 1.67
195 String _messageId;
196 Uint32 _msgRequestType;
197 Uint32 _dest;
198 CIMNamespaceName _nameSpace;
199 CIMName _className;
200 Array<String> propertyList;
201 Uint64 _aggregationSN;
202 QueryExpressionRep* _query;
203 String _queryLanguage;
204
205 private:
206 /** Hidden (unimplemented) copy constructor */
|
207 kumpf 1.77 OperationAggregate(const OperationAggregate& x);
|
208 brian.campbell 1.67
209 Array<CIMResponseMessage*> _responseList;
210 Mutex _appendResponseMutex;
|
211 dave.sudlik 1.78 Mutex _enqueueResponseMutex;
|
212 brian.campbell 1.67 CIMRequestMessage* _request;
213 Uint32 _totalIssued;
214 Uint32 _magicNumber;
|
215 kumpf 1.82 Uint32 _totalReceived;
216 Uint32 _totalReceivedComplete;
217 Uint32 _totalReceivedExpected;
218 Uint32 _totalReceivedErrors;
|
219 a.dunfey 1.75 Uint32 _totalReceivedNotSupported;
|
220 brian.campbell 1.67 };
221
|
222 kumpf 1.82 class PEGASUS_SERVER_LINKAGE CIMOperationRequestDispatcher :
223 public MessageQueueService
|
224 brian.campbell 1.67 {
|
225 kumpf 1.82 friend class QuerySupportRouter;
226 public:
|
227 brian.campbell 1.67
|
228 kumpf 1.82 typedef MessageQueueService Base;
|
229 brian.campbell 1.67
|
230 kumpf 1.82 CIMOperationRequestDispatcher(
231 CIMRepository* repository,
232 ProviderRegistrationManager* providerRegistrationManager);
|
233 brian.campbell 1.67
|
234 kumpf 1.82 virtual ~CIMOperationRequestDispatcher();
|
235 brian.campbell 1.67
|
236 kumpf 1.82 virtual void handleEnqueue(Message*);
|
237 brian.campbell 1.67
|
238 kumpf 1.82 virtual void handleEnqueue();
|
239 brian.campbell 1.67
|
240 kumpf 1.82 void handleGetClassRequest(
241 CIMGetClassRequestMessage* request);
|
242 brian.campbell 1.67
|
243 kumpf 1.82 void handleGetInstanceRequest(
244 CIMGetInstanceRequestMessage* request);
|
245 brian.campbell 1.67
|
246 kumpf 1.82 void handleDeleteClassRequest(
247 CIMDeleteClassRequestMessage* request);
|
248 brian.campbell 1.67
|
249 kumpf 1.82 void handleDeleteInstanceRequest(
250 CIMDeleteInstanceRequestMessage* request);
|
251 brian.campbell 1.67
|
252 kumpf 1.82 void handleCreateClassRequest(
253 CIMCreateClassRequestMessage* request);
|
254 brian.campbell 1.67
|
255 kumpf 1.82 void handleCreateInstanceRequest(
256 CIMCreateInstanceRequestMessage* request);
|
257 brian.campbell 1.67
|
258 kumpf 1.82 void handleModifyClassRequest(
259 CIMModifyClassRequestMessage* request);
|
260 brian.campbell 1.67
|
261 kumpf 1.82 void handleModifyInstanceRequest(
262 CIMModifyInstanceRequestMessage* request);
|
263 brian.campbell 1.67
|
264 kumpf 1.82 void handleEnumerateClassesRequest(
265 CIMEnumerateClassesRequestMessage* request);
|
266 brian.campbell 1.67
|
267 kumpf 1.82 void handleEnumerateClassNamesRequest(
268 CIMEnumerateClassNamesRequestMessage* request);
|
269 brian.campbell 1.67
|
270 kumpf 1.82 void handleEnumerateInstancesRequest(
271 CIMEnumerateInstancesRequestMessage* request);
|
272 brian.campbell 1.67
|
273 kumpf 1.82 void handleEnumerateInstanceNamesRequest(
274 CIMEnumerateInstanceNamesRequestMessage* request);
|
275 brian.campbell 1.67
|
276 kumpf 1.82 void handleAssociatorsRequest(
277 CIMAssociatorsRequestMessage* request);
|
278 brian.campbell 1.67
|
279 kumpf 1.82 void handleAssociatorNamesRequest(
280 CIMAssociatorNamesRequestMessage* request);
|
281 brian.campbell 1.67
|
282 kumpf 1.82 void handleReferencesRequest(
283 CIMReferencesRequestMessage* request);
|
284 brian.campbell 1.67
|
285 kumpf 1.82 void handleReferenceNamesRequest(
286 CIMReferenceNamesRequestMessage* request);
|
287 brian.campbell 1.67
|
288 kumpf 1.82 void handleGetPropertyRequest(
289 CIMGetPropertyRequestMessage* request);
|
290 brian.campbell 1.67
|
291 kumpf 1.82 void handleSetPropertyRequest(
292 CIMSetPropertyRequestMessage* request);
|
293 brian.campbell 1.67
|
294 kumpf 1.82 void handleGetQualifierRequest(
295 CIMGetQualifierRequestMessage* request);
|
296 brian.campbell 1.67
|
297 kumpf 1.82 void handleSetQualifierRequest(
298 CIMSetQualifierRequestMessage* request);
|
299 brian.campbell 1.67
|
300 kumpf 1.82 void handleDeleteQualifierRequest(
301 CIMDeleteQualifierRequestMessage* request);
|
302 brian.campbell 1.67
|
303 kumpf 1.82 void handleEnumerateQualifiersRequest(
304 CIMEnumerateQualifiersRequestMessage* request);
|
305 brian.campbell 1.67
|
306 kumpf 1.82 void handleExecQueryRequest(
307 CIMExecQueryRequestMessage* request);
|
308 brian.campbell 1.67
|
309 kumpf 1.82 void handleInvokeMethodRequest(
310 CIMInvokeMethodRequestMessage* request);
|
311 brian.campbell 1.67
|
312 kumpf 1.82 static void _forwardForAggregationCallback(
313 AsyncOpNode*,
314 MessageQueue*,
315 void*);
|
316 brian.campbell 1.67
|
317 kumpf 1.82 static void _forwardRequestCallback(
318 AsyncOpNode*,
319 MessageQueue*,
320 void*);
|
321 brian.campbell 1.67
|
322 kumpf 1.82 // Response Handler functions
|
323 brian.campbell 1.67
|
324 kumpf 1.82 void handleOperationResponseAggregation(OperationAggregate* poA);
|
325 brian.campbell 1.67
|
326 kumpf 1.82 void handleReferencesResponseAggregation(OperationAggregate* poA);
|
327 brian.campbell 1.67
|
328 kumpf 1.82 void handleReferenceNamesResponseAggregation(OperationAggregate* poA);
|
329 brian.campbell 1.67
|
330 kumpf 1.82 void handleAssociatorsResponseAggregation(OperationAggregate* poA);
|
331 brian.campbell 1.67
|
332 kumpf 1.82 void handleAssociatorNamesResponseAggregation(OperationAggregate* poA);
|
333 brian.campbell 1.67
|
334 kumpf 1.82 void handleEnumerateInstancesResponseAggregation(OperationAggregate* poA);
|
335 brian.campbell 1.67
|
336 kumpf 1.82 void handleEnumerateInstanceNamesResponseAggregation(
337 OperationAggregate* poA);
|
338 brian.campbell 1.67
|
339 kumpf 1.82 void handleExecQueryResponseAggregation(OperationAggregate* poA);
|
340 brian.campbell 1.67
|
341 kumpf 1.82 protected:
342
343 /** _getSubClassNames - Gets the names of all subclasses of the defined
344 class (including the class) and returns it in an array of strings. Uses
345 a similar function in the repository class to get the names.
346 @param namespace
347 @param className
348 @return Array of strings with class names. Note that there should be
349 at least one classname in the array (the input name)
350 Note that there is a special exception to this function, the __namespace
351 class which does not have any representation in the class repository.
352 @exception CIMException(CIM_ERR_INVALID_CLASS)
353 */
|
354 brian.campbell 1.67 Array<CIMName> _getSubClassNames(
355 const CIMNamespaceName& nameSpace,
|
356 david.dillard 1.73 const CIMName& className);
|
357 brian.campbell 1.67
358 Boolean _lookupInternalProvider(
359 const CIMNamespaceName& nameSpace,
360 const CIMName& className,
361 String& service,
362 String& provider);
363
|
364 kumpf 1.82 /* Boolean _lookupNewQueryProvider(
|
365 brian.campbell 1.67 const CIMNamespaceName& nameSpace,
366 const CIMName& className,
367 String& serviceName,
368 String& controlProviderName,
|
369 kumpf 1.82 Boolean* notQueryProvider); */
|
370 brian.campbell 1.67
|
371 chip 1.72 ProviderInfo _lookupNewInstanceProvider(
|
372 brian.campbell 1.67 const CIMNamespaceName& nameSpace,
|
373 chip 1.72 const CIMName& className);
|
374 brian.campbell 1.67
|
375 kumpf 1.82 /* String _lookupQueryProvider(
|
376 brian.campbell 1.67 const CIMNamespaceName& nameSpace,
377 const CIMName& className,
|
378 kumpf 1.82 Boolean* notQueryProvider); */
|
379 brian.campbell 1.67
|
380 chip 1.72 ProviderInfo _lookupInstanceProvider(
|
381 brian.campbell 1.67 const CIMNamespaceName& nameSpace,
|
382 chip 1.72 const CIMName& className);
|
383 brian.campbell 1.67
|
384 kumpf 1.82 /* Array<ProviderInfo> _lookupAllQueryProviders(
|
385 brian.campbell 1.67 const CIMNamespaceName& nameSpace,
386 const CIMName& className,
|
387 david.dillard 1.73 Uint32& providerCount); */
|
388 brian.campbell 1.67
|
389 david.dillard 1.73 // @exception CIMException
|
390 brian.campbell 1.67 Array<ProviderInfo> _lookupAllInstanceProviders(
391 const CIMNamespaceName& nameSpace,
392 const CIMName& className,
|
393 david.dillard 1.73 Uint32& providerCount);
|
394 brian.campbell 1.67
395 Array<ProviderInfo> _lookupAllAssociationProviders(
396 const CIMNamespaceName& nameSpace,
397 const CIMObjectPath& objectName,
398 const CIMName& assocClass,
399 const String& role,
400 Uint32& providerCount);
401
402 Boolean _lookupNewAssociationProvider(
403 const CIMNamespaceName& nameSpace,
404 const CIMName& assocClass,
405 String& serviceName,
406 String& controlProviderName,
|
407 kumpf 1.82 ProviderIdContainer** container);
|
408 brian.campbell 1.67
409 Array<String> _lookupAssociationProvider(
410 const CIMNamespaceName& nameSpace,
411 const CIMName& assocClass,
|
412 kumpf 1.82 ProviderIdContainer** container);
|
413 brian.campbell 1.67
|
414 kumpf 1.82 String _lookupMethodProvider(
415 const CIMNamespaceName& nameSpace,
416 const CIMName& className,
417 const CIMName& methodName,
418 ProviderIdContainer** providerIdContainer);
|
419 brian.campbell 1.67
|
420 kumpf 1.82 void _forwardRequestToService(
|
421 brian.campbell 1.67 const String& serviceName,
422 CIMRequestMessage* request,
|
423 kumpf 1.81 CIMRequestMessage* requestCopy);
|
424 brian.campbell 1.67
|
425 kumpf 1.82 void _forwardRequestForAggregation(
|
426 brian.campbell 1.67 const String& serviceName,
427 const String& controlProviderName,
428 CIMRequestMessage* request,
429 OperationAggregate* poA,
|
430 kumpf 1.82 CIMResponseMessage* response = 0);
|
431 brian.campbell 1.67
|
432 kumpf 1.82 void _forwardRequestToProviderManager(
|
433 brian.campbell 1.67 const CIMName& className,
434 const String& serviceName,
435 const String& controlProviderName,
|
436 kumpf 1.81 CIMRequestMessage* request,
437 CIMRequestMessage* requestCopy);
|
438 brian.campbell 1.67
|
439 kumpf 1.82 void _getProviderName(
|
440 kumpf 1.81 const OperationContext& context,
441 String& moduleName,
442 String& providerName);
443
|
444 kumpf 1.82 void _logOperation(
445 const CIMRequestMessage* request,
446 const CIMResponseMessage* response);
447
448 Boolean _enqueueResponse(
449 OperationAggregate*& poA,
450 CIMResponseMessage*& response);
|
451 kumpf 1.81
|
452 kumpf 1.82 void _enqueueResponse(
453 CIMRequestMessage* request,
454 CIMResponseMessage* response);
|
455 brian.campbell 1.67
|
456 kumpf 1.82 CIMValue _convertValueType(const CIMValue& value, CIMType type);
|
457 brian.campbell 1.67
|
458 kumpf 1.82 void _fixInvokeMethodParameterTypes(CIMInvokeMethodRequestMessage* request);
|
459 brian.campbell 1.67
|
460 kumpf 1.82 void _fixSetPropertyValueType(CIMSetPropertyRequestMessage* request);
|
461 brian.campbell 1.67
|
462 kumpf 1.82 void _checkExistenceOfClass(
463 const CIMNamespaceName& nameSpace,
464 const CIMName& className,
465 CIMException& cimException);
|
466 brian.campbell 1.67
|
467 kumpf 1.82 CIMClass _getClass(
468 const CIMNamespaceName& nameSpace,
469 const CIMName& className,
470 CIMException& cimException);
|
471 chip 1.69
|
472 kumpf 1.82 CIMRepository* _repository;
|
473 brian.campbell 1.67
|
474 kumpf 1.82 ProviderRegistrationManager* _providerRegistrationManager;
|
475 brian.campbell 1.67
|
476 kumpf 1.82 Boolean _enableAssociationTraversal;
477 Boolean _enableIndicationService;
478 Uint32 _maximumEnumerateBreadth;
479 static Uint64 cimOperationAggregationSN;
|
480 brian.campbell 1.67
|
481 kumpf 1.82 #ifdef PEGASUS_ENABLE_OBJECT_NORMALIZATION
482 Boolean _enableNormalization;
483 Array<String> _excludeModulesFromNormalization;
484 #endif
|
485 brian.campbell 1.67
|
486 kumpf 1.82 // << Tue Feb 12 08:48:09 2002 mdd >> meta dispatcher integration
487 virtual void _handle_async_request(AsyncRequest* req);
|
488 brian.campbell 1.67
|
489 kumpf 1.82 // the following two methods enable specific query language implementations
|
490 brian.campbell 1.67
|
491 kumpf 1.82 /* void handleQueryRequest(
492 CIMExecQueryRequestMessage* request);
|
493 chip 1.71
|
494 kumpf 1.82 void handleQueryResponseAggregation(
495 OperationAggregate* poA);
|
496 brian.campbell 1.67
|
497 kumpf 1.82 void applyQueryToEnumeration(CIMResponseMessage* msg,
498 QueryExpressionRep* query);
499 */
|
500 brian.campbell 1.67
|
501 kumpf 1.82 private:
502 static void _handle_enqueue_callback(AsyncOpNode*, MessageQueue*, void*);
|
503 brian.campbell 1.67
504 };
505
506 PEGASUS_NAMESPACE_END
507
508 #endif /* PegasusDispatcher_Dispatcher_h */
|