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