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 marek 1.25 #include <Pegasus/Common/Tracer.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.25.12.1 #include <Pegasus/Config/ConfigManager.h>
|
41 chip 1.7
|
42 schuur 1.1 PEGASUS_NAMESPACE_BEGIN
43
|
44 s.kodali 1.25.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.25.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 marek 1.25 PEG_TRACE((
254 TRC_PROVIDERMANAGER,
255 Tracer::LEVEL4,
256 "%s::transfer",
257 (const char*) getClass().getCString()));
|
258 chip 1.7
|
259 kumpf 1.23 transfer();
260 simple.clear();
|
261 brian.campbell 1.3
|
262 kumpf 1.23 _response->operationContext.set(
263 ContentLanguageListContainer(simple.getLanguages()));
|
264 brian.campbell 1.3
|
265 kumpf 1.23 // call thru ProviderManager to get externally declared entry point
|
266 brian.campbell 1.3
|
267 kumpf 1.23 if (isComplete == false)
268 {
269 _responseChunkCallback(_request, _response);
270 }
|
271 brian.campbell 1.3
|
272 kumpf 1.23 // put caller's allocated response back in place. Note that _response
273 // is INVALID after sending because it has been deleted externally
|
274 brian.campbell 1.3
|
275 kumpf 1.23 _response = response;
|
276 brian.campbell 1.3 }
277
|
278 kumpf 1.23 void OperationResponseHandler::transfer()
|
279 chip 1.7 {
280 }
281
|
282 kumpf 1.23 void OperationResponseHandler::validate()
|
283 chip 1.7 {
284 }
285
|
286 kumpf 1.23 String OperationResponseHandler::getClass() const
|
287 chip 1.7 {
|
288 kumpf 1.23 return String("OperationResponseHandler");
|
289 chip 1.7 }
290
|
291 kumpf 1.23 Uint32 OperationResponseHandler::getResponseObjectTotal() const
|
292 chip 1.7 {
|
293 kumpf 1.23 return _responseObjectTotal;
|
294 chip 1.7 }
295
|
296 kumpf 1.23 Uint32 OperationResponseHandler::getResponseMessageTotal() const
|
297 chip 1.7 {
|
298 kumpf 1.23 return _responseMessageTotal;
|
299 chip 1.7 }
300
|
301 kumpf 1.23 Uint32 OperationResponseHandler::getResponseObjectThreshold() const
|
302 chip 1.7 {
|
303 kumpf 1.23 return _responseObjectThreshold;
|
304 chip 1.7 }
305
306 //
307 // GetInstanceResponseHandler
308 //
309
310 GetInstanceResponseHandler::GetInstanceResponseHandler(
|
311 kumpf 1.14 CIMGetInstanceRequestMessage* request,
312 CIMGetInstanceResponseMessage* response,
313 PEGASUS_RESPONSE_CHUNK_CALLBACK_T responseChunkCallback)
314 : OperationResponseHandler(request, response, responseChunkCallback)
|
315 chip 1.7 {
|
316 s.kodali 1.25.12.1 _initializeNormalizer(
317 request,
|
318 a.dunfey 1.15 request->includeQualifiers,
319 request->includeClassOrigin,
|
320 s.kodali 1.25.12.1 _normalizer);
|
321 chip 1.7 }
322
|
323 kumpf 1.23 void GetInstanceResponseHandler::deliver(const CIMInstance& cimInstance)
|
324 chip 1.7 {
|
325 kumpf 1.23 if (cimInstance.isUninitialized())
|
326 chip 1.7 {
327 MessageLoaderParms message(
328 "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
329 "The object is not initialized.");
330
331 throw CIMException(CIM_ERR_FAILED, message);
332 }
333
|
334 kumpf 1.23 if (SimpleInstanceResponseHandler::size() != 0)
|
335 chip 1.9 {
336 MessageLoaderParms message(
337 "Server.OperationResponseHandler.TOO_MANY_OBJECTS_DELIVERED",
338 "Too many objects delivered.");
339
340 throw CIMException(CIM_ERR_FAILED, message);
341 }
342
|
343 s.kodali 1.25.12.1 CIMInstance localInstance(cimInstance);
|
344 kumpf 1.23 #ifdef PEGASUS_ENABLE_OBJECT_NORMALIZATION
|
345 chip 1.7 // The normalizer expects an object path embedded in instances even
346 // though it is not required by this operation. Use the requested
347 // object path is missing from the instance.
|
348 kumpf 1.23 if (localInstance.getPath().getKeyBindings().size() == 0)
|
349 chip 1.7 {
350 // ATTN: should clone before modification
|
351 kumpf 1.23 localInstance.setPath(static_cast<CIMGetInstanceRequestMessage*>(
352 getRequest())->instanceName);
|
353 chip 1.7 }
|
354 s.kodali 1.25.12.1 #endif
|
355 kumpf 1.23 SimpleInstanceResponseHandler::deliver(
356 _normalizer.processInstance(localInstance));
|
357 chip 1.7 }
358
|
359 kumpf 1.23 void GetInstanceResponseHandler::complete()
|
360 chip 1.9 {
|
361 kumpf 1.23 if (SimpleInstanceResponseHandler::size() == 0)
|
362 chip 1.9 {
363 MessageLoaderParms message(
364 "Server.OperationResponseHandler.TOO_FEW_OBJECTS_DELIVERED",
365 "Too few objects delivered.");
|
366 venkat.puvvada 1.21 // Provider claims success, no instances returned. -V see Bug #4104
367 setStatus(CIM_ERR_NOT_FOUND);
|
368 chip 1.9 throw CIMException(CIM_ERR_FAILED, message);
369 }
370
371 SimpleInstanceResponseHandler::complete();
372 }
373
|
374 kumpf 1.23 String GetInstanceResponseHandler::getClass() const
|
375 chip 1.7 {
|
376 kumpf 1.23 return String("GetInstanceResponseHandler");
|
377 chip 1.7 }
378
|
379 kumpf 1.23 void GetInstanceResponseHandler::transfer()
|
380 chip 1.7 {
|
381 kumpf 1.23 if (size() > 0)
|
382 chip 1.7 {
|
383 kumpf 1.23 CIMGetInstanceResponseMessage& msg =
384 *static_cast<CIMGetInstanceResponseMessage*>(getResponse());
|
385 chip 1.7
386 msg.cimInstance = getObjects()[0];
387 }
388 }
389
|
390 kumpf 1.23 void GetInstanceResponseHandler::validate()
|
391 chip 1.7 {
|
392 kumpf 1.23 if (getResponseObjectTotal() == 0)
|
393 chip 1.7 {
394 // error? provider claims success,
395 // but did not deliver an instance.
396 setStatus(CIM_ERR_NOT_FOUND);
397 }
398 }
399
400 //
401 // EnumerateInstancesResponseHandler
402 //
403
404 EnumerateInstancesResponseHandler::EnumerateInstancesResponseHandler(
|
405 kumpf 1.14 CIMEnumerateInstancesRequestMessage* request,
406 CIMEnumerateInstancesResponseMessage* response,
407 PEGASUS_RESPONSE_CHUNK_CALLBACK_T responseChunkCallback)
408 : OperationResponseHandler(request, response, responseChunkCallback)
|
409 chip 1.7 {
|
410 s.kodali 1.25.12.1 _initializeNormalizer(
411 request,
|
412 a.dunfey 1.15 request->includeQualifiers,
413 request->includeClassOrigin,
|
414 s.kodali 1.25.12.1 _normalizer);
|
415 chip 1.7 }
416
|
417 kumpf 1.23 void EnumerateInstancesResponseHandler::deliver(const CIMInstance& cimInstance)
|
418 chip 1.7 {
|
419 kumpf 1.23 if (cimInstance.isUninitialized())
|
420 chip 1.7 {
421 MessageLoaderParms message(
422 "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
423 "The object is not initialized.");
424
425 throw CIMException(CIM_ERR_FAILED, message);
426 }
427
|
428 kumpf 1.23 SimpleInstanceResponseHandler::deliver(
429 _normalizer.processInstance(cimInstance));
|
430 chip 1.7 }
431
|
432 kumpf 1.23 String EnumerateInstancesResponseHandler::getClass() const
|
433 chip 1.7 {
|
434 kumpf 1.23 return String("EnumerateInstancesResponseHandler");
|
435 chip 1.7 }
436
|
437 kumpf 1.23 void EnumerateInstancesResponseHandler::transfer()
|
438 chip 1.7 {
|
439 kumpf 1.23 CIMEnumerateInstancesResponseMessage& msg =
440 *static_cast<CIMEnumerateInstancesResponseMessage*>(getResponse());
|
441 chip 1.7
442 msg.cimNamedInstances = getObjects();
443 }
444
445 //
446 // EnumerateInstanceNamesResponseHandler
447 //
448
449 EnumerateInstanceNamesResponseHandler::EnumerateInstanceNamesResponseHandler(
|
450 kumpf 1.14 CIMEnumerateInstanceNamesRequestMessage* request,
451 CIMEnumerateInstanceNamesResponseMessage* response,
452 PEGASUS_RESPONSE_CHUNK_CALLBACK_T responseChunkCallback)
453 : OperationResponseHandler(request, response, responseChunkCallback)
|
454 chip 1.7 {
|
455 s.kodali 1.25.12.1 _initializeNormalizer(
456 request,
|
457 a.dunfey 1.15 false,
458 false,
|
459 s.kodali 1.25.12.1 _normalizer);
|
460 chip 1.7 }
461
|
462 kumpf 1.23 void EnumerateInstanceNamesResponseHandler::deliver(
463 const CIMObjectPath& cimObjectPath)
|
464 chip 1.7 {
|
465 kumpf 1.23 if (cimObjectPath.getClassName().isNull())
|
466 chip 1.7 {
467 MessageLoaderParms message(
468 "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
469 "The object is not initialized.");
470
471 throw CIMException(CIM_ERR_FAILED, message);
472 }
473
|
474 kumpf 1.23 SimpleObjectPathResponseHandler::deliver(
475 _normalizer.processInstanceObjectPath(cimObjectPath));
|
476 chip 1.7 }
477
|
478 kumpf 1.23 String EnumerateInstanceNamesResponseHandler::getClass() const
|
479 chip 1.7 {
|
480 kumpf 1.23 return String("EnumerateInstanceNamesResponseHandler");
|
481 chip 1.7 }
482
|
483 kumpf 1.23 void EnumerateInstanceNamesResponseHandler::transfer()
|
484 chip 1.7 {
|
485 kumpf 1.23 CIMEnumerateInstanceNamesResponseMessage& msg =
486 *static_cast<CIMEnumerateInstanceNamesResponseMessage*>(getResponse());
|
487 chip 1.7
488 msg.instanceNames = getObjects();
489 }
490
491 //
492 // CreateInstanceResponseHandler
493 //
494
495 CreateInstanceResponseHandler::CreateInstanceResponseHandler(
|
496 kumpf 1.14 CIMCreateInstanceRequestMessage* request,
497 CIMCreateInstanceResponseMessage* response,
498 PEGASUS_RESPONSE_CHUNK_CALLBACK_T responseChunkCallback)
499 : OperationResponseHandler(request, response, responseChunkCallback)
|
500 chip 1.7 {
501 }
502
|
503 kumpf 1.23 void CreateInstanceResponseHandler::deliver(const CIMObjectPath& cimObjectPath)
|
504 chip 1.7 {
|
505 kumpf 1.23 if (cimObjectPath.getClassName().isNull())
|
506 chip 1.7 {
507 MessageLoaderParms message(
508 "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
509 "The object is not initialized.");
510
511 throw CIMException(CIM_ERR_FAILED, message);
512 }
513
|
514 kumpf 1.23 if (SimpleObjectPathResponseHandler::size() != 0)
|
515 chip 1.11 {
516 MessageLoaderParms message(
517 "Server.OperationResponseHandler.TOO_MANY_OBJECTS_DELIVERED",
518 "Too many objects delivered.");
519
520 throw CIMException(CIM_ERR_FAILED, message);
521 }
522
|
523 chip 1.7 SimpleObjectPathResponseHandler::deliver(cimObjectPath);
524 }
525
|
526 kumpf 1.23 void CreateInstanceResponseHandler::complete()
|
527 chip 1.9 {
|
528 kumpf 1.23 if (SimpleObjectPathResponseHandler::size() == 0)
|
529 chip 1.9 {
530 MessageLoaderParms message(
531 "Server.OperationResponseHandler.TOO_FEW_OBJECTS_DELIVERED",
532 "Too few objects delivered.");
533
534 throw CIMException(CIM_ERR_FAILED, message);
535 }
536
537 SimpleObjectPathResponseHandler::complete();
538 }
539
|
540 kumpf 1.23 String CreateInstanceResponseHandler::getClass() const
|
541 chip 1.7 {
|
542 kumpf 1.23 return String("CreateInstanceResponseHandler");
|
543 chip 1.7 }
544
545 #if 0
546 // ATTN: is it an error to not return instance name?
|
547 kumpf 1.23 void CreateInstanceResponseHandler::validate()
|
548 chip 1.7 {
|
549 kumpf 1.23 if (getResponseObjectTotal() == 0)
|
550 chip 1.7 {
551 setStatus(CIM_ERR_NOT_FOUND);
552 }
553 }
554 #endif
555
|
556 kumpf 1.23 void CreateInstanceResponseHandler::transfer()
|
557 chip 1.7 {
|
558 kumpf 1.23 if (size() > 0)
|
559 chip 1.7 {
|
560 kumpf 1.23 CIMCreateInstanceResponseMessage& msg =
561 *static_cast<CIMCreateInstanceResponseMessage*>(getResponse());
|
562 chip 1.7
563 msg.instanceName = getObjects()[0];
564 }
565 }
566
567 //
568 // ModifyInstanceResponseHandler
569 //
570
571 ModifyInstanceResponseHandler::ModifyInstanceResponseHandler(
|
572 kumpf 1.14 CIMModifyInstanceRequestMessage* request,
573 CIMModifyInstanceResponseMessage* response,
574 PEGASUS_RESPONSE_CHUNK_CALLBACK_T responseChunkCallback)
575 : OperationResponseHandler(request, response, responseChunkCallback)
|
576 chip 1.7 {
577 }
578
|
579 kumpf 1.23 String ModifyInstanceResponseHandler::getClass() const
|
580 chip 1.7 {
|
581 kumpf 1.23 return String("ModifyInstanceResponseHandler");
|
582 chip 1.7 }
583
584 //
585 // DeleteInstanceResponseHandler
586 //
587
588 DeleteInstanceResponseHandler::DeleteInstanceResponseHandler(
|
589 kumpf 1.14 CIMDeleteInstanceRequestMessage* request,
590 CIMDeleteInstanceResponseMessage* response,
591 PEGASUS_RESPONSE_CHUNK_CALLBACK_T responseChunkCallback)
592 : OperationResponseHandler(request, response, responseChunkCallback)
|
593 chip 1.7 {
594 }
595
|
596 kumpf 1.23 String DeleteInstanceResponseHandler::getClass() const
|
597 chip 1.7 {
|
598 kumpf 1.23 return String("DeleteInstanceResponseHandler");
|
599 chip 1.7 }
600
601 //
602 // GetPropertyResponseHandler
603 //
604
605 GetPropertyResponseHandler::GetPropertyResponseHandler(
|
606 kumpf 1.14 CIMGetPropertyRequestMessage* request,
607 CIMGetPropertyResponseMessage* response,
608 PEGASUS_RESPONSE_CHUNK_CALLBACK_T responseChunkCallback)
609 : OperationResponseHandler(request, response, responseChunkCallback)
|
610 chip 1.7 {
611 }
612
|
613 kumpf 1.23 void GetPropertyResponseHandler::deliver(const CIMValue& cimValue)
|
614 chip 1.7 {
|
615 kumpf 1.23 if (cimValue.isNull())
|
616 chip 1.7 {
617 MessageLoaderParms message(
618 "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
619 "The object is not initialized.");
620
621 throw CIMException(CIM_ERR_FAILED, message);
622 }
623
624 SimpleValueResponseHandler::deliver(cimValue);
625 }
626
|
627 kumpf 1.23 String GetPropertyResponseHandler::getClass() const
|
628 chip 1.7 {
|
629 kumpf 1.23 return String("GetPropertyResponseHandler");
|
630 chip 1.7 }
631
|
632 kumpf 1.23 void GetPropertyResponseHandler::transfer()
|
633 chip 1.7 {
|
634 kumpf 1.23 if (size() > 0)
|
635 chip 1.7 {
|
636 kumpf 1.23 CIMGetPropertyResponseMessage& msg =
637 *static_cast<CIMGetPropertyResponseMessage*>(getResponse());
|
638 chip 1.7
639 msg.value = getObjects()[0];
640 }
641 }
642
|
643 kumpf 1.23 void GetPropertyResponseHandler::validate()
|
644 chip 1.7 {
645 // error? provider claims success,
646 // but did not deliver an instance.
|
647 kumpf 1.23 if (getResponseObjectTotal() == 0)
|
648 chip 1.7 {
649 setStatus(CIM_ERR_NOT_FOUND);
650 }
651 }
652
653 //
654 // SetPropertyResponseHandler
655 //
656
657 SetPropertyResponseHandler::SetPropertyResponseHandler(
|
658 kumpf 1.14 CIMSetPropertyRequestMessage* request,
659 CIMSetPropertyResponseMessage* response,
660 PEGASUS_RESPONSE_CHUNK_CALLBACK_T responseChunkCallback)
661 : OperationResponseHandler(request, response, responseChunkCallback)
|
662 chip 1.7 {
663 }
664
|
665 kumpf 1.23 String SetPropertyResponseHandler::getClass() const
|
666 chip 1.7 {
|
667 kumpf 1.23 return String("SetPropertyResponseHandler");
|
668 chip 1.7 }
669
670 //
671 // ExecQueryResponseHandler
672 //
673
674 ExecQueryResponseHandler::ExecQueryResponseHandler(
|
675 kumpf 1.14 CIMExecQueryRequestMessage* request,
676 CIMExecQueryResponseMessage* response,
677 PEGASUS_RESPONSE_CHUNK_CALLBACK_T responseChunkCallback)
678 : OperationResponseHandler(request, response, responseChunkCallback)
|
679 chip 1.7 {
680 }
681
|
682 kumpf 1.23 void ExecQueryResponseHandler::deliver(const CIMInstance& cimInstance)
|
683 chip 1.7 {
|
684 kumpf 1.23 if (cimInstance.isUninitialized())
|
685 chip 1.7 {
686 MessageLoaderParms message(
687 "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
688 "The object is not initialized.");
689
690 throw CIMException(CIM_ERR_FAILED, message);
691 }
692
693 SimpleInstance2ObjectResponseHandler::deliver(cimInstance);
694 }
695
|
696 kumpf 1.23 String ExecQueryResponseHandler::getClass() const
|
697 chip 1.7 {
|
698 kumpf 1.23 return String("ExecQueryResponseHandler");
|
699 chip 1.7 }
700
|
701 kumpf 1.23 void ExecQueryResponseHandler::transfer()
|
702 chip 1.7 {
|
703 kumpf 1.23 CIMExecQueryResponseMessage& msg =
704 *static_cast<CIMExecQueryResponseMessage*>(getResponse());
|
705 chip 1.7
706 msg.cimObjects = getObjects();
707 }
708
|
709 kumpf 1.23 Boolean ExecQueryResponseHandler::isAsync() const
|
710 chip 1.7 {
|
711 kumpf 1.23 return false;
|
712 chip 1.7 }
713
714 //
715 // AssociatorsResponseHandler
716 //
717
718 AssociatorsResponseHandler::AssociatorsResponseHandler(
|
719 kumpf 1.14 CIMAssociatorsRequestMessage* request,
720 CIMAssociatorsResponseMessage* response,
721 PEGASUS_RESPONSE_CHUNK_CALLBACK_T responseChunkCallback)
722 : OperationResponseHandler(request, response, responseChunkCallback)
|
723 chip 1.7 {
724 }
725
|
726 kumpf 1.23 void AssociatorsResponseHandler::deliver(const CIMObject& cimObject)
|
727 chip 1.7 {
|
728 kumpf 1.23 if (cimObject.isUninitialized())
|
729 chip 1.7 {
730 MessageLoaderParms message(
731 "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
732 "The object is not initialized.");
733
734 throw CIMException(CIM_ERR_FAILED, message);
735 }
736
737 SimpleObjectResponseHandler::deliver(cimObject);
738 }
739
|
740 kumpf 1.23 String AssociatorsResponseHandler::getClass() const
|
741 chip 1.7 {
|
742 kumpf 1.23 return String("AssociatorsResponseHandler");
|
743 chip 1.7 }
744
|
745 kumpf 1.23 void AssociatorsResponseHandler::transfer()
|
746 chip 1.7 {
|
747 kumpf 1.23 CIMAssociatorsResponseMessage& msg =
748 *static_cast<CIMAssociatorsResponseMessage*>(getResponse());
|
749 chip 1.7
750 msg.cimObjects = getObjects();
751 }
752
753 //
754 // AssociatorNamesResponseHandler
755 //
756
757 AssociatorNamesResponseHandler::AssociatorNamesResponseHandler(
|
758 kumpf 1.14 CIMAssociatorNamesRequestMessage* request,
759 CIMAssociatorNamesResponseMessage* response,
760 PEGASUS_RESPONSE_CHUNK_CALLBACK_T responseChunkCallback)
761 : OperationResponseHandler(request, response, responseChunkCallback)
|
762 chip 1.7 {
763 }
764
|
765 kumpf 1.23 void AssociatorNamesResponseHandler::deliver(const CIMObjectPath& cimObjectPath)
|
766 chip 1.7 {
|
767 kumpf 1.23 if (cimObjectPath.getClassName().isNull())
|
768 chip 1.7 {
769 MessageLoaderParms message(
770 "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
771 "The object is not initialized.");
772
773 throw CIMException(CIM_ERR_FAILED, message);
774 }
775
776 SimpleObjectPathResponseHandler::deliver(cimObjectPath);
777 }
778
|
779 kumpf 1.23 String AssociatorNamesResponseHandler::getClass() const
|
780 chip 1.7 {
|
781 kumpf 1.23 return String("AssociatorNamesResponseHandler");
|
782 chip 1.7 }
783
|
784 kumpf 1.23 void AssociatorNamesResponseHandler::transfer()
|
785 chip 1.7 {
|
786 kumpf 1.23 CIMAssociatorNamesResponseMessage& msg =
787 *static_cast<CIMAssociatorNamesResponseMessage*>(getResponse());
|
788 chip 1.7
789 msg.objectNames = getObjects();
790 }
791
792 //
793 // ReferencesResponseHandler
794 //
795
796 ReferencesResponseHandler::ReferencesResponseHandler(
|
797 kumpf 1.14 CIMReferencesRequestMessage* request,
798 CIMReferencesResponseMessage* response,
799 PEGASUS_RESPONSE_CHUNK_CALLBACK_T responseChunkCallback)
800 : OperationResponseHandler(request, response, responseChunkCallback)
|
801 chip 1.7 {
802 }
803
|
804 kumpf 1.23 void ReferencesResponseHandler::deliver(const CIMObject& cimObject)
|
805 chip 1.7 {
|
806 kumpf 1.23 if (cimObject.isUninitialized())
|
807 chip 1.7 {
808 MessageLoaderParms message(
809 "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
810 "The object is not initialized.");
811
812 throw CIMException(CIM_ERR_FAILED, message);
813 }
814
815 SimpleObjectResponseHandler::deliver(cimObject);
816 }
817
|
818 kumpf 1.23 String ReferencesResponseHandler::getClass() const
|
819 chip 1.7 {
|
820 kumpf 1.23 return String("ReferencesResponseHandler");
|
821 chip 1.7 }
822
|
823 kumpf 1.23 void ReferencesResponseHandler::transfer()
|
824 chip 1.7 {
|
825 kumpf 1.23 CIMReferencesResponseMessage& msg =
826 *static_cast<CIMReferencesResponseMessage*>(getResponse());
|
827 chip 1.7
828 msg.cimObjects = getObjects();
829 }
830
831 //
832 // ReferenceNamesResponseHandler
833 //
834
835 ReferenceNamesResponseHandler::ReferenceNamesResponseHandler(
|
836 kumpf 1.14 CIMReferenceNamesRequestMessage* request,
837 CIMReferenceNamesResponseMessage* response,
838 PEGASUS_RESPONSE_CHUNK_CALLBACK_T responseChunkCallback)
839 : OperationResponseHandler(request, response, responseChunkCallback)
|
840 chip 1.7 {
841 }
842
|
843 kumpf 1.23 void ReferenceNamesResponseHandler::deliver(const CIMObjectPath& cimObjectPath)
|
844 chip 1.7 {
|
845 kumpf 1.23 if (cimObjectPath.getClassName().isNull())
|
846 chip 1.7 {
847 MessageLoaderParms message(
848 "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
849 "The object is not initialized.");
850
851 throw CIMException(CIM_ERR_FAILED, message);
852 }
853
854 SimpleObjectPathResponseHandler::deliver(cimObjectPath);
855 }
856
|
857 kumpf 1.23 String ReferenceNamesResponseHandler::getClass() const
|
858 chip 1.7 {
|
859 kumpf 1.23 return String("ReferenceNamesResponseHandler");
|
860 chip 1.7 }
861
|
862 kumpf 1.23 void ReferenceNamesResponseHandler::transfer()
|
863 chip 1.7 {
|
864 kumpf 1.23 CIMReferenceNamesResponseMessage& msg =
865 *static_cast<CIMReferenceNamesResponseMessage*>(getResponse());
|
866 chip 1.7
867 msg.objectNames = getObjects();
868 }
869
870 //
871 // InvokeMethodResponseHandler
872 //
873
874 InvokeMethodResponseHandler::InvokeMethodResponseHandler(
|
875 kumpf 1.14 CIMInvokeMethodRequestMessage* request,
876 CIMInvokeMethodResponseMessage* response,
877 PEGASUS_RESPONSE_CHUNK_CALLBACK_T responseChunkCallback)
878 : OperationResponseHandler(request, response, responseChunkCallback)
|
879 chip 1.7 {
880 }
881
|
882 kumpf 1.23 void InvokeMethodResponseHandler::deliverParamValue(
883 const CIMParamValue& cimParamValue)
|
884 chip 1.7 {
|
885 kumpf 1.23 if (cimParamValue.isUninitialized())
|
886 chip 1.7 {
887 MessageLoaderParms message(
888 "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
889 "The object is not initialized.");
890
891 throw CIMException(CIM_ERR_FAILED, message);
892 }
893
894 SimpleMethodResultResponseHandler::deliverParamValue(cimParamValue);
895 }
896
|
897 kumpf 1.23 void InvokeMethodResponseHandler::deliver(const CIMValue& cimValue)
|
898 chip 1.7 {
|
899 kumpf 1.23 if (cimValue.isNull())
|
900 chip 1.7 {
901 MessageLoaderParms message(
902 "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
903 "The object is not initialized.");
904
905 throw CIMException(CIM_ERR_FAILED, message);
906 }
907
908 SimpleMethodResultResponseHandler::deliver(cimValue);
909 }
910
|
911 kumpf 1.23 String InvokeMethodResponseHandler::getClass() const
|
912 chip 1.7 {
|
913 kumpf 1.23 return String("InvokeMethodResponseHandler");
|
914 chip 1.7 }
915
|
916 kumpf 1.23 void InvokeMethodResponseHandler::transfer()
|
917 chip 1.7 {
|
918 kumpf 1.23 CIMInvokeMethodResponseMessage& msg =
919 *static_cast<CIMInvokeMethodResponseMessage*>(getResponse());
|
920 chip 1.7
921 msg.outParameters = getParamValues();
922
923 // ATTN-RK-20020903: Is it legal for the return value to be null?
924 // if not, then the check must be done here since deliver() works off the
925 // virtual size, which refers to out parameters!
926 msg.retValue = getReturnValue();
927 }
928
929 //
930 // EnableIndicationsResponseHandler
931 //
932
933 EnableIndicationsResponseHandler::EnableIndicationsResponseHandler(
|
934 kumpf 1.14 CIMRequestMessage* request,
935 CIMResponseMessage* response,
|
936 kumpf 1.17 const CIMInstance& provider,
|
937 kumpf 1.14 PEGASUS_INDICATION_CALLBACK_T indicationCallback,
938 PEGASUS_RESPONSE_CHUNK_CALLBACK_T responseChunkCallback)
939 : OperationResponseHandler(request, response, responseChunkCallback),
940 _indicationCallback(indicationCallback)
|
941 chip 1.7 {
942 _provider = provider;
943 }
944
|
945 kumpf 1.23 void EnableIndicationsResponseHandler::deliver(
946 const CIMIndication& cimIndication)
|
947 chip 1.7 {
948 OperationContext context;
949
950 Array<CIMObjectPath> subscriptionInstanceNames;
951
|
952 kumpf 1.23 context.insert(
953 SubscriptionInstanceNamesContainer(subscriptionInstanceNames));
|
954 chip 1.7
955 deliver(context, cimIndication);
956 }
957
|
958 kumpf 1.23 void EnableIndicationsResponseHandler::deliver(
959 const OperationContext& context,
960 const CIMIndication& cimIndication)
|
961 chip 1.7 {
|
962 kumpf 1.23 if (cimIndication.isUninitialized())
|
963 chip 1.7 {
964 MessageLoaderParms message(
965 "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
966 "The object is not initialized.");
967
968 throw CIMException(CIM_ERR_FAILED, message);
969 }
970
971 // ATTN: temporarily convert indication to instance
972 CIMInstance cimInstance(cimIndication);
973
974 // Get list of subscription instance names from context
975 Array<CIMObjectPath> subscriptionInstanceNames;
976
|
977 kumpf 1.23 if (context.contains(SubscriptionInstanceNamesContainer::NAME))
|
978 chip 1.7 {
979 SubscriptionInstanceNamesContainer container =
980 context.get(SubscriptionInstanceNamesContainer::NAME);
981
982 subscriptionInstanceNames = container.getInstanceNames();
983 }
|
984 a.dunfey 1.16 else
|
985 chip 1.7 {
986 subscriptionInstanceNames.clear();
987 }
988
|
989 kumpf 1.12 ContentLanguageList contentLangs;
|
990 chip 1.7
|
991 kumpf 1.23 if (context.contains(ContentLanguageListContainer::NAME))
|
992 chip 1.7 {
993 // Get the Content-Language for this indication. The provider
994 // does not have to add specify a language for the indication.
995 ContentLanguageListContainer langContainer =
996 context.get(ContentLanguageListContainer::NAME);
997
998 contentLangs = langContainer.getLanguages();
999 }
|
1000 a.dunfey 1.16 else
|
1001 chip 1.7 {
1002 // The provider did not explicitly set a Content-Language for
1003 // the indication. Fall back to the lang set in this object.
1004 contentLangs = getLanguages();
1005 }
1006
1007 // create message
|
1008 kumpf 1.23 CIMProcessIndicationRequestMessage* request =
|
1009 chip 1.7 new CIMProcessIndicationRequestMessage(
1010 XmlWriter::getNextMessageId(),
1011 cimInstance.getPath().getNameSpace(),
1012 cimInstance,
1013 subscriptionInstanceNames,
1014 _provider,
1015 QueueIdStack()); // Must be filled in by the callback function
1016
1017 request->operationContext = context;
1018
|
1019 kumpf 1.23 if (request->operationContext.contains(ContentLanguageListContainer::NAME))
|
1020 chip 1.7 {
|
1021 kumpf 1.23 request->operationContext.set(
1022 ContentLanguageListContainer(contentLangs));
|
1023 chip 1.7 }
|
1024 a.dunfey 1.16 else
|
1025 chip 1.7 {
|
1026 kumpf 1.23 request->operationContext.insert(
1027 ContentLanguageListContainer(contentLangs));
|
1028 chip 1.7 }
1029
1030 _indicationCallback(request);
1031 }
1032
|
1033 kumpf 1.23 void EnableIndicationsResponseHandler::deliver(
1034 const Array<CIMIndication>& cimIndications)
|
1035 chip 1.7 {
1036 OperationContext context;
1037
1038 deliver(context, cimIndications);
1039 }
1040
|
1041 kumpf 1.23 void EnableIndicationsResponseHandler::deliver(
1042 const OperationContext& context,
1043 const Array<CIMIndication>& cimIndications)
|
1044 chip 1.7 {
|
1045 kumpf 1.23 for (Uint32 i = 0, n = cimIndications.size(); i < n; i++)
|
1046 chip 1.7 {
1047 deliver(context, cimIndications[i]);
1048 }
1049 }
1050
|
1051 kumpf 1.23 String EnableIndicationsResponseHandler::getClass() const
|
1052 chip 1.7 {
|
1053 kumpf 1.23 return String("EnableIndicationsResponseHandler");
|
1054 chip 1.7 }
1055
|
1056 kumpf 1.23 Boolean EnableIndicationsResponseHandler::isAsync() const
|
1057 chip 1.7 {
|
1058 kumpf 1.23 return false;
|
1059 chip 1.7 }
1060
|
1061 schuur 1.1 PEGASUS_NAMESPACE_END
|