1 karl 1.5 //%2005////////////////////////////////////////////////////////////////////////
|
2 schuur 1.1 //
|
3 karl 1.2 // 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.2 // 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.5 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
10 // EMC Corporation; VERITAS Software Corporation; The Open Group.
|
11 schuur 1.1 //
12 // Permission is hereby granted, free of charge, to any person obtaining a copy
13 // of this software and associated documentation files (the "Software"), to
14 // deal in the Software without restriction, including without limitation the
15 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
16 // sell copies of the Software, and to permit persons to whom the Software is
17 // furnished to do so, subject to the following conditions:
|
18 chip 1.7 //
|
19 schuur 1.1 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
20 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
21 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
22 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
23 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
24 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
25 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 //
28 //==============================================================================
29 //
30 // Author: Chip Vincent (cvincent@us.ibm.com)
31 //
32 // Modified By:
|
33 brian.campbell 1.3 // Brian G. Campbell, EMC (campbell_brian@emc.com) - PEP140/phase2
|
34 chip 1.7 //
|
35 schuur 1.1 //%/////////////////////////////////////////////////////////////////////////////
36
37 #include "OperationResponseHandler.h"
|
38 chip 1.7
39 #include <Pegasus/Common/Logger.h>
40
41 #include <Pegasus/ProviderManager2/ProviderManagerService.h>
|
42 schuur 1.1
43 PEGASUS_NAMESPACE_BEGIN
44
|
45 chip 1.7 //
46 // OperationResponseHandler
47 //
48
49 OperationResponseHandler::OperationResponseHandler(
50 CIMRequestMessage *request,
51 CIMResponseMessage *response)
52 : _request(request),
53 _response(response),
|
54 chip 1.8 _responseObjectTotal(0),
|
55 chip 1.7 _responseMessageTotal(0),
56 _responseObjectThreshold(0)
|
57 brian.campbell 1.3 {
58 #ifndef PEGASUS_RESPONSE_OBJECT_COUNT_THRESHOLD
|
59 chip 1.7 #define PEGASUS_RESPONSE_OBJECT_COUNT_THRESHOLD 100
|
60 brian.campbell 1.3 #elif PEGASUS_RESPONSE_OBJECT_COUNT_THRESHOLD == 0
|
61 chip 1.7 #undef PEGASUS_RESPONSE_OBJECT_COUNT_THRESHOLD
62 #define PEGASUS_RESPONSE_OBJECT_COUNT_THRESHOLD ~0
|
63 brian.campbell 1.3 #endif
64
|
65 carolann.graves 1.6 if (!request || (request->requestIsOOP == true))
|
66 a.dunfey 1.4 {
67 _responseObjectThreshold = ~0;
68 }
69 else
70 {
71 _responseObjectThreshold = PEGASUS_RESPONSE_OBJECT_COUNT_THRESHOLD;
|
72 brian.campbell 1.3
73 #ifdef PEGASUS_DEBUG
|
74 chip 1.7 static const char *responseObjectThreshold =
|
75 a.dunfey 1.4 getenv("PEGASUS_RESPONSE_OBJECT_COUNT_THRESHOLD");
|
76 chip 1.7
77 if (responseObjectThreshold)
|
78 a.dunfey 1.4 {
|
79 chip 1.7 Uint32 i = (Uint32)atoi(responseObjectThreshold);
80
81 if (i > 0)
82 {
83 _responseObjectThreshold = i;
84 }
|
85 a.dunfey 1.4 }
|
86 brian.campbell 1.3 #endif
|
87 a.dunfey 1.4 }
|
88 brian.campbell 1.3 }
89
90 OperationResponseHandler::~OperationResponseHandler()
91 {
92 _request = 0;
93 _response = 0;
94 }
95
|
96 chip 1.7 CIMRequestMessage * OperationResponseHandler::getRequest(void) const
97 {
98 return(_request);
99 }
100
101 CIMResponseMessage * OperationResponseHandler::getResponse(void) const
102 {
103 return(_response);
104 }
105
106 void OperationResponseHandler::setStatus(
107 const Uint32 code,
108 const String & message)
109 {
110 _response->cimException = PEGASUS_CIM_EXCEPTION(CIMStatusCode(code), message);
111 }
112
113 void OperationResponseHandler::setStatus(
114 const Uint32 code,
115 const ContentLanguages & langs,
116 const String & message)
117 chip 1.7 {
118 _response->cimException =
119 PEGASUS_CIM_EXCEPTION_LANG(
120 langs,
121 CIMStatusCode(code),
122 message);
123 }
124
125 Boolean OperationResponseHandler::isAsync(void) const
126 {
127 return(true);
128 }
129
|
130 brian.campbell 1.3 // This is only called from SimpleResponseHandler.deliver() but lives in this
131 // class because all asyncronous response must have a "response" pointer
132 // to go through. Only operation classes have a response pointer
133 void OperationResponseHandler::send(Boolean isComplete)
134 {
135 // some handlers do not send async because their callers cannot handle
136 // partial responses. If this is the case, stop here.
137
138 if (isAsync() == false)
139 {
140 // preserve tradional behavior
141 if (isComplete == true)
|
142 chip 1.7 {
143 transfer();
144 }
145
146 return;
|
147 brian.campbell 1.3 }
148
149 SimpleResponseHandler *simpleP = dynamic_cast<SimpleResponseHandler*>(this);
150
151 // It is possible to instantiate this class directly (not derived)
|
152 chip 1.7 // The caller would do this only if the operation does not have any data to
|
153 brian.campbell 1.3 // be returned
154
155 if (! simpleP)
156 {
157 // if there is no data to be returned, then the message should NEVER be
158 // incomplete (even on an error)
159 if (isComplete == false)
|
160 chip 1.7 {
161 PEGASUS_ASSERT(false);
162 }
163
164 return;
|
165 brian.campbell 1.3 }
166
167 SimpleResponseHandler &simple = *simpleP;
168 PEGASUS_ASSERT(_response);
169 Uint32 objectCount = simple.size();
170
171 // have not reached threshold yet
|
172 chip 1.7 if ((isComplete == false) && (objectCount < _responseObjectThreshold))
173 {
174 return;
175 }
|
176 brian.campbell 1.3
177 CIMResponseMessage *response = _response;
178
179 // for complete responses, just use the one handed down from caller
180 // otherwise, create our own that the caller never sees but is
181 // utilized for async responses underneath
182
183 if (isComplete == false)
|
184 chip 1.7 {
185 _response = _request->buildResponse();
186 }
|
187 brian.campbell 1.3
188 _response->setComplete(isComplete);
189 _responseObjectTotal += objectCount;
190
191 // since we are reusing response for every chunk,keep track of original count
192 _response->setIndex(_responseMessageTotal++);
193
194 // set the originally allocated response to one more than the current.
195 // The reason for doing this is proactive in case of an exception. This
196 // allows the last response to be set as it may not re-enter this code.
197
198 if (isComplete == false)
|
199 chip 1.7 {
200 response->setIndex(_responseMessageTotal);
201 }
|
202 brian.campbell 1.3
203 validate();
204
205 if (_response->cimException.getCode() != CIM_ERR_SUCCESS)
|
206 chip 1.7 {
207 simple.clear();
208 }
209
|
210 brian.campbell 1.3 String function = getClass() + "::" + "transfer";
|
211 chip 1.7 Logger::put(
212 Logger::STANDARD_LOG,
213 System::CIMSERVER,
214 Logger::TRACE,
215 function);
216
|
217 brian.campbell 1.3 transfer();
218 simple.clear();
219
220 // l10n
|
221 chip 1.7 _response->operationContext.set(ContentLanguageListContainer(simple.getLanguages()));
|
222 brian.campbell 1.3
223 // call thru ProviderManager to get externally declared entry point
224
225 if (isComplete == false)
226 {
227 ProviderManagerService::handleCimResponse(*_request, *_response);
228 }
229
230 // put caller's allocated response back in place. Note that _response
231 // is INVALID after sending because it has been deleted externally
232
233 _response = response;
234 }
235
|
236 chip 1.7 void OperationResponseHandler::transfer(void)
237 {
238 }
239
240 void OperationResponseHandler::validate(void)
241 {
242 }
243
244 String OperationResponseHandler::getClass(void) const
245 {
246 return(String("OperationResponseHandler"));
247 }
248
249 Uint32 OperationResponseHandler::getResponseObjectTotal(void) const
250 {
251 return(_responseObjectTotal);
252 }
253
254 Uint32 OperationResponseHandler::getResponseMessageTotal(void) const
255 {
256 return(_responseMessageTotal);
257 chip 1.7 }
258
259 Uint32 OperationResponseHandler::getResponseObjectThreshold(void) const
260 {
261 return(_responseObjectThreshold);
262 }
263
264 //
265 // GetInstanceResponseHandler
266 //
267
268 GetInstanceResponseHandler::GetInstanceResponseHandler(
269 CIMGetInstanceRequestMessage * request,
270 CIMGetInstanceResponseMessage * response)
271 : OperationResponseHandler(request, response)
272 {
273 #ifdef PEGASUS_ENABLE_OBJECT_NORMALIZATION
274 // Attempt to get the cached class definition used to validate results of this
275 // operation. If it does not exist, then this feature is disabled for this
276 // operation.
277 CIMClass cimClass;
278 chip 1.7
279 try
280 {
281 CachedClassDefinitionContainer container =
282 request->operationContext.get(CachedClassDefinitionContainer::NAME);
283
284 cimClass = container.getClass();
285
286 }
287 catch(Exception &)
288 {
289 // Do nothing. Container is missing, which implies normalization is disabled
290 // for this operation.
291 }
292
293 _normalizer =
294 ObjectNormalizer(
295 cimClass,
296 request->includeQualifiers,
297 request->includeClassOrigin);
298 #endif
299 chip 1.7 }
300
301 void GetInstanceResponseHandler::deliver(const CIMInstance & cimInstance)
302 {
303 if(cimInstance.isUninitialized())
304 {
305 MessageLoaderParms message(
306 "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
307 "The object is not initialized.");
308
309 throw CIMException(CIM_ERR_FAILED, message);
310 }
311
|
312 chip 1.9 if(SimpleInstanceResponseHandler::size() != 0)
313 {
314 MessageLoaderParms message(
315 "Server.OperationResponseHandler.TOO_MANY_OBJECTS_DELIVERED",
316 "Too many objects delivered.");
317
318 throw CIMException(CIM_ERR_FAILED, message);
319 }
320
|
321 chip 1.7 #ifdef PEGASUS_ENABLE_OBJECT_NORMALIZATION
322 // The normalizer expects an object path embedded in instances even
323 // though it is not required by this operation. Use the requested
324 // object path is missing from the instance.
325 CIMInstance localInstance(cimInstance);
326
327 if(localInstance.getPath().getKeyBindings().size() == 0)
328 {
329 // ATTN: should clone before modification
330 localInstance.setPath(static_cast<CIMGetInstanceRequestMessage *>(getRequest())->instanceName);
331 }
332
333 SimpleInstanceResponseHandler::deliver(_normalizer.processInstance(localInstance));
334 #else
335 SimpleInstanceResponseHandler::deliver(cimInstance);
336 #endif
337 }
338
|
339 chip 1.9 void GetInstanceResponseHandler::complete(void)
340 {
|
341 chip 1.10 if(SimpleInstanceResponseHandler::size() == 0)
|
342 chip 1.9 {
343 MessageLoaderParms message(
344 "Server.OperationResponseHandler.TOO_FEW_OBJECTS_DELIVERED",
345 "Too few objects delivered.");
346
347 throw CIMException(CIM_ERR_FAILED, message);
348 }
349
350 SimpleInstanceResponseHandler::complete();
351 }
352
|
353 chip 1.7 String GetInstanceResponseHandler::getClass(void) const
354 {
355 return(String("GetInstanceResponseHandler"));
356 }
357
358 void GetInstanceResponseHandler::transfer(void)
359 {
360 if(size() > 0)
361 {
362 CIMGetInstanceResponseMessage & msg =
363 *static_cast<CIMGetInstanceResponseMessage *>(getResponse());
364
365 msg.cimInstance = getObjects()[0];
366 }
367 }
368
369 void GetInstanceResponseHandler::validate(void)
370 {
371 if(getResponseObjectTotal() == 0)
372 {
373 // error? provider claims success,
374 chip 1.7 // but did not deliver an instance.
375 setStatus(CIM_ERR_NOT_FOUND);
376 }
377 }
378
379 //
380 // EnumerateInstancesResponseHandler
381 //
382
383 EnumerateInstancesResponseHandler::EnumerateInstancesResponseHandler(
384 CIMEnumerateInstancesRequestMessage * request,
385 CIMEnumerateInstancesResponseMessage * response)
386 : OperationResponseHandler(request, response)
387 {
388 #ifdef PEGASUS_ENABLE_OBJECT_NORMALIZATION
389 // Attempt to get the cached class definition used to validate results of this
390 // operation. If it does not exist, then this feature is disabled for this
391 // operation.
392 CIMClass cimClass;
393
394 try
395 chip 1.7 {
396 CachedClassDefinitionContainer container =
397 request->operationContext.get(CachedClassDefinitionContainer::NAME);
398
399 cimClass = container.getClass();
400 }
401 catch(Exception &)
402 {
403 // Do nothing. Container is missing, which implies normalization is disabled
404 // for this operation.
405 }
406
407 _normalizer =
408 ObjectNormalizer(
409 cimClass,
410 request->includeQualifiers,
411 request->includeClassOrigin);
412 #endif
413 }
414
415 void EnumerateInstancesResponseHandler::deliver(const CIMInstance & cimInstance)
416 chip 1.7 {
417 if(cimInstance.isUninitialized())
418 {
419 MessageLoaderParms message(
420 "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
421 "The object is not initialized.");
422
423 throw CIMException(CIM_ERR_FAILED, message);
424 }
425
426 #ifdef PEGASUS_ENABLE_OBJECT_NORMALIZATION
427 SimpleInstanceResponseHandler::deliver(_normalizer.processInstance(cimInstance));
428 #else
429 SimpleInstanceResponseHandler::deliver(cimInstance);
430 #endif
431 }
432
433 String EnumerateInstancesResponseHandler::getClass(void) const
434 {
435 return(String("EnumerateInstancesResponseHandler"));
436 }
437 chip 1.7
438 void EnumerateInstancesResponseHandler::transfer(void)
439 {
440 CIMEnumerateInstancesResponseMessage & msg =
441 *static_cast<CIMEnumerateInstancesResponseMessage *>(getResponse());
442
443 msg.cimNamedInstances = getObjects();
444 }
445
446 //
447 // EnumerateInstanceNamesResponseHandler
448 //
449
450 EnumerateInstanceNamesResponseHandler::EnumerateInstanceNamesResponseHandler(
451 CIMEnumerateInstanceNamesRequestMessage * request,
452 CIMEnumerateInstanceNamesResponseMessage * response)
453 : OperationResponseHandler(request, response)
454 {
455 #ifdef PEGASUS_ENABLE_OBJECT_NORMALIZATION
456 // Attempt to get the cached class definition used to validate results of this
457 // operation. If it does not exist, then this feature is disabled for this
458 chip 1.7 // operation.
459 CIMClass cimClass;
460
461 try
462 {
463 CachedClassDefinitionContainer container =
464 request->operationContext.get(CachedClassDefinitionContainer::NAME);
465
466 cimClass = container.getClass();
467 }
468 catch(Exception &)
469 {
470 // Do nothing. Container is missing, which implies normalization is disabled
471 // for this operation.
472 }
473
474 _normalizer =
475 ObjectNormalizer(
476 cimClass,
477 false,
478 false);
479 chip 1.7 #endif
480 }
481
482 void EnumerateInstanceNamesResponseHandler::deliver(const CIMObjectPath & cimObjectPath)
483 {
484 if(cimObjectPath.getClassName().isNull())
485 {
486 MessageLoaderParms message(
487 "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
488 "The object is not initialized.");
489
490 throw CIMException(CIM_ERR_FAILED, message);
491 }
492
493 #ifdef PEGASUS_ENABLE_OBJECT_NORMALIZATION
494 SimpleObjectPathResponseHandler::deliver(_normalizer.processInstanceObjectPath(cimObjectPath));
495 #else
496 SimpleObjectPathResponseHandler::deliver(cimObjectPath);
497 #endif
498 }
499
500 chip 1.7 String EnumerateInstanceNamesResponseHandler::getClass(void) const
501 {
502 return(String("EnumerateInstanceNamesResponseHandler"));
503 }
504
505 void EnumerateInstanceNamesResponseHandler::transfer(void)
506 {
507 CIMEnumerateInstanceNamesResponseMessage & msg =
508 *static_cast<CIMEnumerateInstanceNamesResponseMessage *>(getResponse());
509
510 msg.instanceNames = getObjects();
511 }
512
513 //
514 // CreateInstanceResponseHandler
515 //
516
517 CreateInstanceResponseHandler::CreateInstanceResponseHandler(
518 CIMCreateInstanceRequestMessage * request,
519 CIMCreateInstanceResponseMessage * response)
520 : OperationResponseHandler(request, response)
521 chip 1.7 {
522 }
523
524 void CreateInstanceResponseHandler::deliver(const CIMObjectPath & cimObjectPath)
525 {
526 if(cimObjectPath.getClassName().isNull())
527 {
528 MessageLoaderParms message(
529 "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
530 "The object is not initialized.");
531
532 throw CIMException(CIM_ERR_FAILED, message);
533 }
534
535 SimpleObjectPathResponseHandler::deliver(cimObjectPath);
536 }
537
|
538 chip 1.9 void CreateInstanceResponseHandler::complete(void)
539 {
|
540 chip 1.10 if(SimpleObjectPathResponseHandler::size() == 0)
|
541 chip 1.9 {
542 MessageLoaderParms message(
543 "Server.OperationResponseHandler.TOO_FEW_OBJECTS_DELIVERED",
544 "Too few objects delivered.");
545
546 throw CIMException(CIM_ERR_FAILED, message);
547 }
548
549 SimpleObjectPathResponseHandler::complete();
550 }
551
|
552 chip 1.7 String CreateInstanceResponseHandler::getClass(void) const
553 {
554 return(String("CreateInstanceResponseHandler"));
555 }
556
557 #if 0
558 // ATTN: is it an error to not return instance name?
559 void CreateInstanceResponseHandler::validate(void)
560 {
561 if(getResponseObjectTotal() == 0)
562 {
563 setStatus(CIM_ERR_NOT_FOUND);
564 }
565 }
566 #endif
567
568 void CreateInstanceResponseHandler::transfer(void)
569 {
570 if(size() > 0)
571 {
572 CIMCreateInstanceResponseMessage & msg =
573 chip 1.7 *static_cast<CIMCreateInstanceResponseMessage *>(getResponse());
574
575 msg.instanceName = getObjects()[0];
576 }
577 }
578
579 //
580 // ModifyInstanceResponseHandler
581 //
582
583 ModifyInstanceResponseHandler::ModifyInstanceResponseHandler(
584 CIMModifyInstanceRequestMessage * request,
585 CIMModifyInstanceResponseMessage * response)
586 : OperationResponseHandler(request, response)
587 {
588 }
589
590 String ModifyInstanceResponseHandler::getClass(void) const
591 {
592 return(String("ModifyInstanceResponseHandler"));
593 }
594 chip 1.7
595 //
596 // DeleteInstanceResponseHandler
597 //
598
599 DeleteInstanceResponseHandler::DeleteInstanceResponseHandler(
600 CIMDeleteInstanceRequestMessage * request,
601 CIMDeleteInstanceResponseMessage * response)
602 : OperationResponseHandler(request, response)
603 {
604 }
605
606 String DeleteInstanceResponseHandler::getClass(void) const
607 {
608 return(String("DeleteInstanceResponseHandler"));
609 }
610
611 //
612 // GetPropertyResponseHandler
613 //
614
615 chip 1.7 GetPropertyResponseHandler::GetPropertyResponseHandler(
616 CIMGetPropertyRequestMessage * request,
617 CIMGetPropertyResponseMessage * response)
618 : OperationResponseHandler(request, response)
619 {
620 }
621
622 void GetPropertyResponseHandler::deliver(const CIMValue & cimValue)
623 {
624 if(cimValue.isNull())
625 {
626 MessageLoaderParms message(
627 "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
628 "The object is not initialized.");
629
630 throw CIMException(CIM_ERR_FAILED, message);
631 }
632
633 SimpleValueResponseHandler::deliver(cimValue);
634 }
635
636 chip 1.7 String GetPropertyResponseHandler::getClass(void) const
637 {
638 return(String("GetPropertyResponseHandler"));
639 }
640
641 void GetPropertyResponseHandler::transfer(void)
642 {
643 if(size() > 0)
644 {
645 CIMGetPropertyResponseMessage & msg =
646 *static_cast<CIMGetPropertyResponseMessage *>(getResponse());
647
648 msg.value = getObjects()[0];
649 }
650 }
651
652 void GetPropertyResponseHandler::validate(void)
653 {
654 // error? provider claims success,
655 // but did not deliver an instance.
656 if(getResponseObjectTotal() == 0)
657 chip 1.7 {
658 setStatus(CIM_ERR_NOT_FOUND);
659 }
660 }
661
662 //
663 // SetPropertyResponseHandler
664 //
665
666 SetPropertyResponseHandler::SetPropertyResponseHandler(
667 CIMSetPropertyRequestMessage * request,
668 CIMSetPropertyResponseMessage * response)
669 : OperationResponseHandler(request, response)
670 {
671 }
672
673 String SetPropertyResponseHandler::getClass(void) const
674 {
675 return(String("SetPropertyResponseHandler"));
676 }
677
678 chip 1.7 //
679 // ExecQueryResponseHandler
680 //
681
682 ExecQueryResponseHandler::ExecQueryResponseHandler(
683 CIMExecQueryRequestMessage * request,
684 CIMExecQueryResponseMessage * response)
685 : OperationResponseHandler(request, response)
686 {
687 }
688
689 void ExecQueryResponseHandler::deliver(const CIMInstance & cimInstance)
690 {
691 if(cimInstance.isUninitialized())
692 {
693 MessageLoaderParms message(
694 "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
695 "The object is not initialized.");
696
697 throw CIMException(CIM_ERR_FAILED, message);
698 }
699 chip 1.7
700 SimpleInstance2ObjectResponseHandler::deliver(cimInstance);
701 }
702
703 String ExecQueryResponseHandler::getClass(void) const
704 {
705 return(String("ExecQueryResponseHandler"));
706 }
707
708 void ExecQueryResponseHandler::transfer(void)
709 {
710 CIMExecQueryResponseMessage & msg =
711 *static_cast<CIMExecQueryResponseMessage *>(getResponse());
712
713 msg.cimObjects = getObjects();
714 }
715
716 Boolean ExecQueryResponseHandler::isAsync(void) const
717 {
718 return(false);
719 }
720 chip 1.7
721 //
722 // AssociatorsResponseHandler
723 //
724
725 AssociatorsResponseHandler::AssociatorsResponseHandler(
726 CIMAssociatorsRequestMessage * request,
727 CIMAssociatorsResponseMessage * response)
728 : OperationResponseHandler(request, response)
729 {
730 }
731
732 void AssociatorsResponseHandler::deliver(const CIMObject & cimObject)
733 {
734 if(cimObject.isUninitialized())
735 {
736 MessageLoaderParms message(
737 "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
738 "The object is not initialized.");
739
740 throw CIMException(CIM_ERR_FAILED, message);
741 chip 1.7 }
742
743 SimpleObjectResponseHandler::deliver(cimObject);
744 }
745
746 String AssociatorsResponseHandler::getClass(void) const
747 {
748 return(String("AssociatorsResponseHandler"));
749 }
750
751 void AssociatorsResponseHandler::transfer(void)
752 {
753 CIMAssociatorsResponseMessage & msg =
754 *static_cast<CIMAssociatorsResponseMessage *>(getResponse());
755
756 msg.cimObjects = getObjects();
757 }
758
759 //
760 // AssociatorNamesResponseHandler
761 //
762 chip 1.7
763 AssociatorNamesResponseHandler::AssociatorNamesResponseHandler(
764 CIMAssociatorNamesRequestMessage * request,
765 CIMAssociatorNamesResponseMessage * response)
766 : OperationResponseHandler(request, response)
767 {
768 }
769
770 void AssociatorNamesResponseHandler::deliver(const CIMObjectPath & cimObjectPath)
771 {
772 if(cimObjectPath.getClassName().isNull())
773 {
774 MessageLoaderParms message(
775 "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
776 "The object is not initialized.");
777
778 throw CIMException(CIM_ERR_FAILED, message);
779 }
780
781 SimpleObjectPathResponseHandler::deliver(cimObjectPath);
782 }
783 chip 1.7
784 String AssociatorNamesResponseHandler::getClass(void) const
785 {
786 return(String("AssociatorNamesResponseHandler"));
787 }
788
789 void AssociatorNamesResponseHandler::transfer(void)
790 {
791 CIMAssociatorNamesResponseMessage & msg =
792 *static_cast<CIMAssociatorNamesResponseMessage *>(getResponse());
793
794 msg.objectNames = getObjects();
795 }
796
797 //
798 // ReferencesResponseHandler
799 //
800
801 ReferencesResponseHandler::ReferencesResponseHandler(
802 CIMReferencesRequestMessage * request,
803 CIMReferencesResponseMessage * response)
804 chip 1.7 : OperationResponseHandler(request, response)
805 {
806 }
807
808 void ReferencesResponseHandler::deliver(const CIMObject & cimObject)
809 {
810 if(cimObject.isUninitialized())
811 {
812 MessageLoaderParms message(
813 "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
814 "The object is not initialized.");
815
816 throw CIMException(CIM_ERR_FAILED, message);
817 }
818
819 SimpleObjectResponseHandler::deliver(cimObject);
820 }
821
822 String ReferencesResponseHandler::getClass(void) const
823 {
824 return(String("ReferencesResponseHandler"));
825 chip 1.7 }
826
827 void ReferencesResponseHandler::transfer(void)
828 {
829 CIMReferencesResponseMessage & msg =
830 *static_cast<CIMReferencesResponseMessage *>(getResponse());
831
832 msg.cimObjects = getObjects();
833 }
834
835 //
836 // ReferenceNamesResponseHandler
837 //
838
839 ReferenceNamesResponseHandler::ReferenceNamesResponseHandler(
840 CIMReferenceNamesRequestMessage * request,
841 CIMReferenceNamesResponseMessage * response)
842 : OperationResponseHandler(request, response)
843 {
844 }
845
846 chip 1.7 void ReferenceNamesResponseHandler::deliver(const CIMObjectPath & cimObjectPath)
847 {
848 if(cimObjectPath.getClassName().isNull())
849 {
850 MessageLoaderParms message(
851 "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
852 "The object is not initialized.");
853
854 throw CIMException(CIM_ERR_FAILED, message);
855 }
856
857 SimpleObjectPathResponseHandler::deliver(cimObjectPath);
858 }
859
860 String ReferenceNamesResponseHandler::getClass(void) const
861 {
862 return(String("ReferenceNamesResponseHandler"));
863 }
864
865 void ReferenceNamesResponseHandler::transfer(void)
866 {
867 chip 1.7 CIMReferenceNamesResponseMessage & msg =
868 *static_cast<CIMReferenceNamesResponseMessage *>(getResponse());
869
870 msg.objectNames = getObjects();
871 }
872
873 //
874 // InvokeMethodResponseHandler
875 //
876
877 InvokeMethodResponseHandler::InvokeMethodResponseHandler(
878 CIMInvokeMethodRequestMessage * request,
879 CIMInvokeMethodResponseMessage * response)
880 : OperationResponseHandler(request, response)
881 {
882 }
883
884 void InvokeMethodResponseHandler::deliverParamValue(const CIMParamValue & cimParamValue)
885 {
886 if(cimParamValue.isUninitialized())
887 {
888 chip 1.7 MessageLoaderParms message(
889 "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
890 "The object is not initialized.");
891
892 throw CIMException(CIM_ERR_FAILED, message);
893 }
894
895 SimpleMethodResultResponseHandler::deliverParamValue(cimParamValue);
896 }
897
898 void InvokeMethodResponseHandler::deliver(const CIMValue & cimValue)
899 {
900 if(cimValue.isNull())
901 {
902 MessageLoaderParms message(
903 "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
904 "The object is not initialized.");
905
906 throw CIMException(CIM_ERR_FAILED, message);
907 }
908
909 chip 1.7 SimpleMethodResultResponseHandler::deliver(cimValue);
910 }
911
912 String InvokeMethodResponseHandler::getClass(void) const
913 {
914 return(String("InvokeMethodResponseHandler"));
915 }
916
917 void InvokeMethodResponseHandler::transfer(void)
918 {
919 CIMInvokeMethodResponseMessage & msg =
920 *static_cast<CIMInvokeMethodResponseMessage *>(getResponse());
921
922 msg.outParameters = getParamValues();
923
924 // ATTN-RK-20020903: Is it legal for the return value to be null?
925 // if not, then the check must be done here since deliver() works off the
926 // virtual size, which refers to out parameters!
927 msg.retValue = getReturnValue();
928 }
929
930 chip 1.7 //
931 // EnableIndicationsResponseHandler
932 //
933
934 typedef void (*PEGASUS_INDICATION_CALLBACK)(CIMProcessIndicationRequestMessage*);
935
936 EnableIndicationsResponseHandler::EnableIndicationsResponseHandler(
937 CIMRequestMessage * request,
938 CIMResponseMessage * response,
939 CIMInstance & provider,
940 PEGASUS_INDICATION_CALLBACK indicationCallback)
941 : OperationResponseHandler(request, response),
942 _indicationCallback(indicationCallback)
943 {
944 _provider = provider;
945 }
946
947 void EnableIndicationsResponseHandler::deliver(const CIMIndication & cimIndication)
948 {
949 OperationContext context;
950
951 chip 1.7 Array<CIMObjectPath> subscriptionInstanceNames;
952
953 context.insert(SubscriptionInstanceNamesContainer(subscriptionInstanceNames));
954
955 deliver(context, cimIndication);
956 }
957
958 void EnableIndicationsResponseHandler::deliver(const OperationContext & context, const CIMIndication & cimIndication)
959 {
960 if(cimIndication.isUninitialized())
961 {
962 MessageLoaderParms message(
963 "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
964 "The object is not initialized.");
965
966 throw CIMException(CIM_ERR_FAILED, message);
967 }
968
969 // ATTN: temporarily convert indication to instance
970 CIMInstance cimInstance(cimIndication);
971
972 chip 1.7 // Get list of subscription instance names from context
973 Array<CIMObjectPath> subscriptionInstanceNames;
974
975 try
976 {
977 SubscriptionInstanceNamesContainer container =
978 context.get(SubscriptionInstanceNamesContainer::NAME);
979
980 subscriptionInstanceNames = container.getInstanceNames();
981 }
982 catch(Exception &)
983 {
984 subscriptionInstanceNames.clear();
985 }
986
987 // l10n
988 ContentLanguages contentLangs;
989
990 try
991 {
992 // Get the Content-Language for this indication. The provider
993 chip 1.7 // does not have to add specify a language for the indication.
994 ContentLanguageListContainer langContainer =
995 context.get(ContentLanguageListContainer::NAME);
996
997 contentLangs = langContainer.getLanguages();
998 }
999 catch(Exception &)
1000 {
1001 // The provider did not explicitly set a Content-Language for
1002 // the indication. Fall back to the lang set in this object.
1003 contentLangs = getLanguages();
1004 }
1005 // l10n -end
1006
1007 // create message
1008 // l10n
1009 CIMProcessIndicationRequestMessage * request =
1010 new CIMProcessIndicationRequestMessage(
1011 XmlWriter::getNextMessageId(),
1012 cimInstance.getPath().getNameSpace(),
1013 cimInstance,
1014 chip 1.7 subscriptionInstanceNames,
1015 _provider,
1016 QueueIdStack()); // Must be filled in by the callback function
1017
1018 request->operationContext = context;
1019
1020 try
1021 {
1022 request->operationContext.set(ContentLanguageListContainer(contentLangs));
1023 }
1024 catch(Exception &)
1025 {
1026 request->operationContext.insert(ContentLanguageListContainer(contentLangs));
1027 }
1028
1029 _indicationCallback(request);
1030 }
1031
1032 void EnableIndicationsResponseHandler::deliver(const Array<CIMIndication> & cimIndications)
1033 {
1034 OperationContext context;
1035 chip 1.7
1036 deliver(context, cimIndications);
1037 }
1038
1039 void EnableIndicationsResponseHandler::deliver(const OperationContext & context, const Array<CIMIndication> & cimIndications)
1040 {
1041 for(Uint32 i = 0, n = cimIndications.size(); i < n; i++)
1042 {
1043 deliver(context, cimIndications[i]);
1044 }
1045 }
1046
1047 String EnableIndicationsResponseHandler::getClass(void) const
1048 {
1049 return(String("EnableIndicationsResponseHandler"));
1050 }
1051
1052 Boolean EnableIndicationsResponseHandler::isAsync(void) const
1053 {
1054 return(false);
1055 }
1056 chip 1.7
|
1057 schuur 1.1 PEGASUS_NAMESPACE_END
|