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