1 karl 1.8 //%2004////////////////////////////////////////////////////////////////////////
|
2 schuur 1.1 //
|
3 karl 1.8 // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
4 // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
5 // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
|
6 schuur 1.1 // IBM Corp.; EMC Corporation, The Open Group.
|
7 karl 1.8 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
8 // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
|
9 schuur 1.1 //
10 // Permission is hereby granted, free of charge, to any person obtaining a copy
11 // of this software and associated documentation files (the "Software"), to
12 // deal in the Software without restriction, including without limitation the
13 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
14 // sell copies of the Software, and to permit persons to whom the Software is
15 // furnished to do so, subject to the following conditions:
|
16 chip 1.11 //
|
17 schuur 1.1 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
18 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
19 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
20 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
21 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
22 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
23 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 //
26 //==============================================================================
27 //
28 // Author: Chip Vincent (cvincent@us.ibm.com)
29 //
|
30 chip 1.11 // Modified By:
31 // Carol Ann Krug Graves, Hewlett-Packard Company (carolann_graves@hp.com)
32 // Dave Rosckes (rosckes@us.ibm.com)
33 // Yi Zhou, Hewlett-Packard Company (yi_zhou@hp.com)
34 // Adrian Schuur (schuur@de.ibm.com)
35 // Seema Gupta (gseema@in.ibm.com) for PEP135
36 // Brian G. Campbell, EMC (campbell_brian@emc.com) - PEP140/phase2
|
37 schuur 1.1 //
38 //%/////////////////////////////////////////////////////////////////////////////
39
40 #ifndef Pegasus_OperationResponseHandler_h
41 #define Pegasus_OperationResponseHandler_h
42
43 #include <Pegasus/Common/Config.h>
44 #include <Pegasus/Server/Linkage.h>
45 #include <Pegasus/Common/CIMMessage.h>
46 #include <Pegasus/Common/MessageQueueService.h>
47 #include <Pegasus/Common/Constants.h>
48 #include <Pegasus/Common/ContentLanguages.h> // l10n
49
50 #include <Pegasus/Common/CIMClass.h>
51 #include <Pegasus/Common/CIMInstance.h>
52 #include <Pegasus/Common/CIMIndication.h>
53 #include <Pegasus/Common/CIMValue.h>
54
55 #include <Pegasus/Common/ResponseHandler.h>
56 #include <Pegasus/Common/Logger.h>
|
57 kumpf 1.6 #include <Pegasus/Common/XmlWriter.h>
|
58 schuur 1.1
59 #include <Pegasus/ProviderManager2/SimpleResponseHandler.h>
60 #include <Pegasus/ProviderManager2/Linkage.h>
61
62 PEGASUS_NAMESPACE_BEGIN
63
64 class PEGASUS_PPM_LINKAGE OperationResponseHandler
65 {
|
66 chip 1.11 friend class SimpleResponseHandler;
|
67 brian.campbell 1.9
|
68 schuur 1.1 public:
|
69 chip 1.11 OperationResponseHandler(
70 CIMRequestMessage * request,
71 CIMResponseMessage * response);
|
72 schuur 1.1
|
73 brian.campbell 1.9 virtual ~OperationResponseHandler(void);
|
74 chip 1.11
|
75 schuur 1.1 CIMRequestMessage * getRequest(void) const
76 {
77 return(_request);
78 }
79
80 CIMResponseMessage * getResponse(void) const
81 {
82 return(_response);
83 }
84
|
85 chip 1.11 virtual void setStatus(
86 const Uint32 code,
87 const String & message = String::EMPTY)
|
88 schuur 1.1 {
89 _response->cimException = PEGASUS_CIM_EXCEPTION(CIMStatusCode(code), message);
90 }
91
|
92 chip 1.11 virtual void setStatus(
93 const Uint32 code,
94 const ContentLanguages & langs,
95 const String & message = String::EMPTY)
96 {
97 _response->cimException =
98 PEGASUS_CIM_EXCEPTION_LANG(
99 langs,
100 CIMStatusCode(code),
101 message);
|
102 schuur 1.1 }
103
104 protected:
|
105 brian.campbell 1.9
|
106 chip 1.11 // the default for all derived handlers. Some handlers may not apply
107 // async behavior because their callers cannot handle partial responses.
108 virtual Boolean isAsync(void) const
109 {
110 return(true);
111 }
|
112 brian.campbell 1.9
|
113 chip 1.11 // send (deliver) asynchronously
114 virtual void send(Boolean isComplete);
|
115 brian.campbell 1.9
|
116 chip 1.11 // transfer any objects from handler to response. this does not clear()
117 virtual void transfer(void)
118 {
119 }
|
120 brian.campbell 1.9
|
121 chip 1.11 // validate whatever is necessary before the transfer
122 virtual void validate(void)
123 {
124 }
|
125 brian.campbell 1.9
|
126 chip 1.11 virtual String getClass(void) const
127 {
128 return(String("OperationResponseHandler"));
129 }
|
130 brian.campbell 1.9
|
131 chip 1.11 Uint32 getResponseObjectTotal(void) const
132 {
133 return(_responseObjectTotal);
134 }
|
135 brian.campbell 1.9
|
136 chip 1.11 // there can be many objects per message (or none at all - i.e complete())
137 Uint32 getResponseMessageTotal(void) const
138 {
139 return(_responseMessageTotal);
140 }
|
141 brian.campbell 1.9
|
142 chip 1.11 Uint32 getResponseObjectThreshold(void) const
143 {
144 return(_responseObjectThreshold);
145 }
|
146 brian.campbell 1.9
|
147 schuur 1.1 CIMRequestMessage * _request;
148 CIMResponseMessage * _response;
149
|
150 brian.campbell 1.9 private:
|
151 chip 1.11 Uint32 _responseObjectTotal;
152 Uint32 _responseMessageTotal;
153 Uint32 _responseObjectThreshold;
154
|
155 schuur 1.1 };
156
|
157 chip 1.11 class GetInstanceResponseHandler : public OperationResponseHandler, public SimpleInstanceResponseHandler
158 {
159 public:
160 GetInstanceResponseHandler(
161 CIMGetInstanceRequestMessage * request,
162 CIMGetInstanceResponseMessage * response)
163 : OperationResponseHandler(request, response)
164 {
165 }
|
166 schuur 1.1
|
167 chip 1.11 virtual String getClass(void) const
168 {
169 return(String("GetInstanceResponseHandler"));
170 }
171
172 virtual void transfer(void)
173 {
174 if(size() > 0)
175 {
176 CIMGetInstanceResponseMessage & msg =
177 *static_cast<CIMGetInstanceResponseMessage *>(getResponse());
178
179 msg.cimInstance = getObjects()[0];
180 }
181 }
182
183 virtual void validate(void)
184 {
185 if(getResponseObjectTotal() == 0)
186 {
187 // error? provider claims success,
188 chip 1.11 // but did not deliver an instance.
189 setStatus(CIM_ERR_NOT_FOUND);
190 }
191 }
|
192 schuur 1.1 };
193
194 class EnumerateInstancesResponseHandler : public OperationResponseHandler, public SimpleInstanceResponseHandler
195 {
196 public:
|
197 chip 1.11 EnumerateInstancesResponseHandler(
198 CIMEnumerateInstancesRequestMessage * request,
199 CIMEnumerateInstancesResponseMessage * response)
200 : OperationResponseHandler(request, response)
201 {
202 }
|
203 schuur 1.1
|
204 chip 1.11 virtual String getClass(void) const
205 {
206 return(String("EnumerateInstancesResponseHandler"));
207 }
208
209 virtual void transfer(void)
210 {
211 CIMEnumerateInstancesResponseMessage & msg =
212 *static_cast<CIMEnumerateInstancesResponseMessage *>(getResponse());
213
214 msg.cimNamedInstances = getObjects();
215 }
|
216 schuur 1.1 };
217
218 class EnumerateInstanceNamesResponseHandler : public OperationResponseHandler, public SimpleObjectPathResponseHandler
219 {
220 public:
|
221 chip 1.11 EnumerateInstanceNamesResponseHandler(
222 CIMEnumerateInstanceNamesRequestMessage * request,
223 CIMEnumerateInstanceNamesResponseMessage * response)
224 : OperationResponseHandler(request, response)
225 {
226 }
227
228 virtual String getClass(void) const
229 {
230 return(String("EnumerateInstanceNamesResponseHandler"));
231 }
232
233 virtual void transfer(void)
234 {
235 CIMEnumerateInstanceNamesResponseMessage & msg =
236 *static_cast<CIMEnumerateInstanceNamesResponseMessage *>(getResponse());
237
238 msg.instanceNames = getObjects();
239 }
|
240 schuur 1.1 };
241
242 class CreateInstanceResponseHandler : public OperationResponseHandler, public SimpleObjectPathResponseHandler
243 {
244 public:
|
245 chip 1.11 CreateInstanceResponseHandler(
246 CIMCreateInstanceRequestMessage * request,
247 CIMCreateInstanceResponseMessage * response)
248 : OperationResponseHandler(request, response)
249 {
250 }
251
252 virtual String getClass(void) const
253 {
254 return(String("CreateInstanceResponseHandler"));
255 }
256
|
257 brian.campbell 1.9 #if 0
|
258 chip 1.11 // ATTN: is it an error to not return instance name?
259 virtual void validate(void)
260 {
261 if(getResponseObjectTotal() == 0)
262 {
263 setStatus(CIM_ERR_NOT_FOUND);
264 }
265 }
|
266 brian.campbell 1.9 #endif
|
267 schuur 1.1
|
268 chip 1.11 virtual void transfer(void)
269 {
270 if(size() > 0)
271 {
272 CIMCreateInstanceResponseMessage & msg =
273 *static_cast<CIMCreateInstanceResponseMessage *>(getResponse());
274
275 msg.instanceName = getObjects()[0];
276 }
277 }
|
278 schuur 1.1 };
279
280 class ModifyInstanceResponseHandler : public OperationResponseHandler, public SimpleResponseHandler
281 {
282 public:
|
283 chip 1.11 ModifyInstanceResponseHandler(
284 CIMModifyInstanceRequestMessage * request,
285 CIMModifyInstanceResponseMessage * response)
286 : OperationResponseHandler(request, response)
287 {
288 }
289
290 virtual String getClass(void) const
291 {
292 return(String("ModifyInstanceResponseHandler"));
293 }
294
|
295 schuur 1.1 };
296
297 class DeleteInstanceResponseHandler : public OperationResponseHandler, public SimpleResponseHandler
298 {
299 public:
|
300 chip 1.11 DeleteInstanceResponseHandler(
301 CIMDeleteInstanceRequestMessage * request,
302 CIMDeleteInstanceResponseMessage * response)
303 : OperationResponseHandler(request, response)
304 {
305 }
306
307 virtual String getClass(void) const
308 {
309 return(String("DeleteInstanceResponseHandler"));
310 }
311
|
312 schuur 1.1 };
313
314 class GetPropertyResponseHandler : public OperationResponseHandler, public SimpleValueResponseHandler
315 {
316 public:
|
317 chip 1.11 GetPropertyResponseHandler(
318 CIMGetPropertyRequestMessage * request,
319 CIMGetPropertyResponseMessage * response)
320 : OperationResponseHandler(request, response)
321 {
322 }
323
324 virtual String getClass(void) const
325 {
326 return(String("GetPropertyResponseHandler"));
327 }
|
328 schuur 1.1
|
329 chip 1.11 virtual void transfer(void)
330 {
331 if(size() > 0)
332 {
333 CIMGetPropertyResponseMessage & msg =
334 *static_cast<CIMGetPropertyResponseMessage *>(getResponse());
335
336 msg.value = getObjects()[0];
337 }
338 }
339
340 virtual void validate(void)
341 {
342 // error? provider claims success,
343 // but did not deliver an instance.
344 if(getResponseObjectTotal() == 0)
345 {
346 setStatus(CIM_ERR_NOT_FOUND);
347 }
348 }
|
349 schuur 1.1 };
350
351 class SetPropertyResponseHandler : public OperationResponseHandler, public SimpleResponseHandler
352 {
353 public:
|
354 chip 1.11 SetPropertyResponseHandler(
355 CIMSetPropertyRequestMessage * request,
356 CIMSetPropertyResponseMessage * response)
357 : OperationResponseHandler(request, response)
358 {
359 }
360
361 virtual String getClass(void) const
362 {
363 return(String("SetPropertyResponseHandler"));
364 }
365
|
366 schuur 1.1 };
367
368 class ExecQueryResponseHandler : public OperationResponseHandler, public SimpleInstance2ObjectResponseHandler
369 {
370 public:
|
371 chip 1.11 ExecQueryResponseHandler(
372 CIMExecQueryRequestMessage * request,
373 CIMExecQueryResponseMessage * response)
374 : OperationResponseHandler(request, response)
375 {
376 }
|
377 schuur 1.1
|
378 chip 1.11 virtual String getClass(void) const
379 {
380 return(String("ExecQueryResponseHandler"));
381 }
|
382 schuur 1.1
|
383 chip 1.11 virtual void transfer(void)
384 {
385 CIMExecQueryResponseMessage & msg =
386 *static_cast<CIMExecQueryResponseMessage *>(getResponse());
387
388 msg.cimObjects = getObjects();
389 }
390
391 // this handler will not send async
392 virtual Boolean isAsync(void) const
393 {
394 return(false);
395 }
|
396 schuur 1.1 };
397
398 class AssociatorsResponseHandler : public OperationResponseHandler, public SimpleObjectResponseHandler
399 {
400 public:
|
401 chip 1.11 AssociatorsResponseHandler(
402 CIMAssociatorsRequestMessage * request,
403 CIMAssociatorsResponseMessage * response)
404 : OperationResponseHandler(request, response)
405 {
406 }
407
408 virtual String getClass(void) const
409 {
410 return(String("AssociatorsResponseHandler"));
411 }
|
412 schuur 1.1
|
413 chip 1.11 virtual void transfer(void)
414 {
415 CIMAssociatorsResponseMessage & msg =
416 *static_cast<CIMAssociatorsResponseMessage *>(getResponse());
417
418 msg.cimObjects = getObjects();
419 }
|
420 schuur 1.1 };
421
422 class AssociatorNamesResponseHandler : public OperationResponseHandler, public SimpleObjectPathResponseHandler
423 {
424 public:
|
425 chip 1.11 AssociatorNamesResponseHandler(
426 CIMAssociatorNamesRequestMessage * request,
427 CIMAssociatorNamesResponseMessage * response)
428 : OperationResponseHandler(request, response)
429 {
430 }
431
432 virtual String getClass(void) const
433 {
434 return(String("AssociatorNamesResponseHandler"));
435 }
436
437 virtual void transfer(void)
438 {
439 CIMAssociatorNamesResponseMessage & msg =
440 *static_cast<CIMAssociatorNamesResponseMessage *>(getResponse());
441
442 msg.objectNames = getObjects();
443 }
|
444 schuur 1.1 };
445
446 class ReferencesResponseHandler : public OperationResponseHandler, public SimpleObjectResponseHandler
447 {
448 public:
|
449 chip 1.11 ReferencesResponseHandler(
450 CIMReferencesRequestMessage * request,
451 CIMReferencesResponseMessage * response)
452 : OperationResponseHandler(request, response)
453 {
454 }
455
456 virtual String getClass(void) const
457 {
458 return(String("ReferencesResponseHandler"));
459 }
460
461 virtual void transfer(void)
462 {
463 CIMReferencesResponseMessage & msg =
464 *static_cast<CIMReferencesResponseMessage *>(getResponse());
465
466 msg.cimObjects = getObjects();
467 }
|
468 schuur 1.1 };
469
470 class ReferenceNamesResponseHandler : public OperationResponseHandler, public SimpleObjectPathResponseHandler
471 {
472 public:
|
473 chip 1.11 ReferenceNamesResponseHandler(
474 CIMReferenceNamesRequestMessage * request,
475 CIMReferenceNamesResponseMessage * response)
476 : OperationResponseHandler(request, response)
477 {
478 }
479
480 virtual String getClass(void) const
481 {
482 return(String("ReferenceNamesResponseHandler"));
483 }
484
485 virtual void transfer(void)
486 {
487 CIMReferenceNamesResponseMessage & msg =
488 *static_cast<CIMReferenceNamesResponseMessage *>(getResponse());
489
490 msg.objectNames = getObjects();
491 }
|
492 schuur 1.1 };
493
494 class InvokeMethodResponseHandler : public OperationResponseHandler, public SimpleMethodResultResponseHandler
495 {
496 public:
|
497 chip 1.11 InvokeMethodResponseHandler(
498 CIMInvokeMethodRequestMessage * request,
499 CIMInvokeMethodResponseMessage * response)
500 : OperationResponseHandler(request, response)
501 {
502 }
503
504 virtual String getClass(void) const
505 {
506 return(String("InvokeMethodResponseHandler"));
507 }
508
509 virtual void transfer(void)
510 {
511 CIMInvokeMethodResponseMessage & msg =
512 *static_cast<CIMInvokeMethodResponseMessage *>(getResponse());
|
513 schuur 1.1
|
514 chip 1.11 msg.outParameters = getParamValues();
515
516 // ATTN-RK-20020903: Is it legal for the return value to be null?
517 // if not, then the check must be done here since deliver() works off the
518 // virtual size, which refers to out parameters!
519 msg.retValue = getReturnValue();
520 }
|
521 schuur 1.1 };
522
|
523 brian.campbell 1.9 typedef void (*PEGASUS_INDICATION_CALLBACK)(CIMProcessIndicationRequestMessage*);
|
524 kumpf 1.2
|
525 schuur 1.1 class EnableIndicationsResponseHandler : public OperationResponseHandler, public SimpleIndicationResponseHandler
526 {
527 public:
|
528 chip 1.11 EnableIndicationsResponseHandler(
529 CIMEnableIndicationsRequestMessage * request,
530 CIMEnableIndicationsResponseMessage * response,
531 CIMInstance & provider,
532 PEGASUS_INDICATION_CALLBACK indicationCallback)
533 : OperationResponseHandler(request, response),
534 _request_copy(*request),
535 _response_copy(*response),
536 _indicationCallback(indicationCallback)
537 {
538 _provider = provider;
539 }
540
541 virtual String getClass(void) const
542 {
543 return(String("EnableIndicationsResponseHandler"));
544 }
545
546 // this handler will not send async
547 virtual Boolean isAsync(void) const
548 {
549 chip 1.11 return(false);
550 }
551
552 virtual void deliver(const CIMIndication & cimIndication)
553 {
554 OperationContext context;
555
556 Array<CIMObjectPath> subscriptionInstanceNames;
557
558 context.insert(SubscriptionInstanceNamesContainer(subscriptionInstanceNames));
559
560 deliver(context, cimIndication);
561 }
562
563 virtual void deliver(const OperationContext & context, const CIMIndication & cimIndication)
564 {
565 // ATTN: temporarily convert indication to instance
566 CIMInstance cimInstance(cimIndication);
567
568 // Get list of subscription instance names from context
569 Array<CIMObjectPath> subscriptionInstanceNames;
570 chip 1.11
571 try
572 {
573 SubscriptionInstanceNamesContainer container =
574 context.get(SubscriptionInstanceNamesContainer::NAME);
575
576 subscriptionInstanceNames = container.getInstanceNames();
577 }
578 catch(Exception &)
579 {
580 subscriptionInstanceNames.clear();
581 }
582
583 // l10n
584 ContentLanguages contentLangs;
585
586 try
587 {
588 // Get the Content-Language for this indication. The provider
589 // does not have to add specify a language for the indication.
590 ContentLanguageListContainer langContainer =
591 chip 1.11 context.get(ContentLanguageListContainer::NAME);
592
593 contentLangs = langContainer.getLanguages();
594 }
595 catch(Exception &)
596 {
597 // The provider did not explicitly set a Content-Language for
598 // the indication. Fall back to the lang set in this object.
599 contentLangs = getLanguages();
600 }
601 // l10n -end
602
603 // create message
604 // l10n
605 CIMProcessIndicationRequestMessage * request =
606 new CIMProcessIndicationRequestMessage(
607 XmlWriter::getNextMessageId(),
608 cimInstance.getPath().getNameSpace(),
609 cimInstance,
610 subscriptionInstanceNames,
611 _provider,
612 chip 1.11 QueueIdStack()); // Must be filled in by the callback function
613
614 request->operationContext = context;
615
616 try
617 {
618 request->operationContext.set(ContentLanguageListContainer(contentLangs));
619 }
620 catch(Exception &)
621 {
622 request->operationContext.insert(ContentLanguageListContainer(contentLangs));
623 }
624
625 _indicationCallback(request);
626 }
627
628 virtual void deliver(const Array<CIMIndication> & cimIndications)
629 {
630 OperationContext context;
631
632 deliver(context, cimIndications);
633 chip 1.11 }
634
635 virtual void deliver(const OperationContext & context, const Array<CIMIndication> & cimIndications)
636 {
637 for(Uint32 i = 0, n = cimIndications.size(); i < n; i++)
638 {
639 deliver(context, cimIndications[i]);
640 }
641 }
|
642 brian.campbell 1.9
643 private:
|
644 chip 1.11 CIMEnableIndicationsRequestMessage _request_copy;
645 CIMEnableIndicationsResponseMessage _response_copy;
646 PEGASUS_INDICATION_CALLBACK _indicationCallback;
|
647 schuur 1.1
|
648 brian.campbell 1.9 };
|
649 schuur 1.1
650 PEGASUS_NAMESPACE_END
651
652 #endif
|