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