1 karl 1.65 //%2006////////////////////////////////////////////////////////////////////////
|
2 mike 1.2 //
|
3 karl 1.51 // 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 karl 1.39 // IBM Corp.; EMC Corporation, The Open Group.
|
7 karl 1.51 // 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.55 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
10 // EMC Corporation; VERITAS Software Corporation; The Open Group.
|
11 karl 1.65 // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
12 // EMC Corporation; Symantec Corporation; The Open Group.
|
13 mike 1.2 //
14 // Permission is hereby granted, free of charge, to any person obtaining a copy
|
15 kumpf 1.27 // 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 mike 1.2 // 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 //
|
21 kumpf 1.27 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
|
22 mike 1.2 // 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 kumpf 1.27 // 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 mike 1.2 // 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 <Pegasus/Common/Config.h>
|
35 kumpf 1.13 #include <Pegasus/Common/Constants.h>
|
36 mike 1.2 #include <cctype>
37 #include <cstdio>
|
38 brian.campbell 1.52 #include <Pegasus/Common/HTTPConnection.h>
|
39 mike 1.2 #include <Pegasus/Common/XmlParser.h>
40 #include <Pegasus/Common/XmlReader.h>
41 #include <Pegasus/Common/XmlWriter.h>
42 #include <Pegasus/Common/HTTPMessage.h>
43 #include <Pegasus/Common/Logger.h>
44 #include <Pegasus/Common/Tracer.h>
|
45 sage 1.19 #include <Pegasus/Common/StatisticalData.h>
|
46 a.arora 1.42 #include <Pegasus/Common/AutoPtr.h>
|
47 kumpf 1.69 #include <Pegasus/Common/MessageLoader.h>
|
48 mike 1.2 #include "CIMOperationResponseEncoder.h"
49
50 PEGASUS_USING_STD;
51
52 PEGASUS_NAMESPACE_BEGIN
53
|
54 kumpf 1.69 const String CIMOperationResponseEncoder::OUT_OF_MEMORY_MESSAGE =
55 "A System error has occurred. Please retry the CIM Operation at a "
56 "later time.";
|
57 kumpf 1.31
|
58 mike 1.2 CIMOperationResponseEncoder::CIMOperationResponseEncoder()
|
59 kumpf 1.69 : Base(PEGASUS_QUEUENAME_OPRESPENCODER)
|
60 mike 1.2 {
61 }
62
63 CIMOperationResponseEncoder::~CIMOperationResponseEncoder()
64 {
65 }
66
|
67 kumpf 1.69 void CIMOperationResponseEncoder::sendResponse(
68 CIMResponseMessage* response,
69 const String& name,
70 Boolean isImplicit,
71 Buffer* bodygiven)
72 {
73 static String funcname = "CIMOperationResponseEncoder::sendResponse: ";
74 static String funcnameClassS = String(funcname + "for class " + name);
75 static CString funcnameClass = funcnameClassS.getCString();
76 PEG_METHOD_ENTER(TRC_DISPATCHER, funcnameClass);
77
78 if (! response)
79 {
80 PEG_METHOD_EXIT();
81 return;
82 }
83
84 Uint32 queueId = response->queueIds.top();
85 response->queueIds.pop();
86
87 Boolean closeConnect = response->getCloseConnect();
88 kumpf 1.69 Tracer::trace(
89 TRC_HTTP,
90 Tracer::LEVEL3,
91 "CIMOperationResponseEncoder::sendResponse()- "
92 "response->getCloseConnect() returned %d",
93 closeConnect);
94
95 MessageQueue* queue = MessageQueue::lookup(queueId);
96
97 if (!queue)
98 {
99 Tracer::trace(TRC_DISCARDED_DATA, Tracer::LEVEL2,
100 "ERROR: non-existent queueId = %u, response not sent.", queueId);
101 PEG_METHOD_EXIT();
102 return;
103 }
104
105 HTTPConnection* httpQueue = dynamic_cast<HTTPConnection*>(queue);
106
107 if (! httpQueue)
108 {
109 kumpf 1.69 Tracer::trace(TRC_DISCARDED_DATA, Tracer::LEVEL2,
110 "ERROR: Unknown queue type. queueId = %u, response not sent.",
111 queueId);
112 PEG_METHOD_EXIT();
113 return;
114 }
115
116 Boolean isChunkRequest = httpQueue->isChunkRequested();
117 HttpMethod httpMethod = response->getHttpMethod();
118 String& messageId = response->messageId;
119 CIMException& cimException = response->cimException;
120 Buffer message;
121
122 // Note: the language is ALWAYS passed empty to the xml formatters because
123 // it is HTTPConnection that needs to make the decision of whether to add
124 // the languages to the HTTP message.
125 ContentLanguageList contentLanguage;
126
127 CIMName cimName(name);
128 Uint32 messageIndex = response->getIndex();
129 Boolean isFirst = messageIndex == 0 ? true : false;
130 kumpf 1.69 Boolean isLast = response->isComplete();
131 Buffer bodylocal;
132 Buffer& body = bodygiven ? *bodygiven : bodylocal;
|
133 brian.campbell 1.52
|
134 kumpf 1.66 // STAT_SERVEREND sets the getTotalServerTime() value in the message class
135 STAT_SERVEREND
136
|
137 denise.eckstein 1.68 #ifndef PEGASUS_DISABLE_PERFINST
|
138 kumpf 1.66 Uint64 serverTime = response->getTotalServerTime();
|
139 denise.eckstein 1.68 #else
140 Uint64 serverTime = 0;
141 #endif
|
142 w.white 1.56
|
143 kumpf 1.69 Buffer (*formatResponse)(
144 const CIMName& iMethodName,
145 const String& messageId,
146 HttpMethod httpMethod,
147 const ContentLanguageList& httpContentLanguages,
148 const Buffer& body,
149 Uint64 serverResponseTime,
150 Boolean isFirst,
151 Boolean isLast);
152
153 Buffer (*formatError)(
154 const CIMName& methodName,
155 const String& messageId,
156 HttpMethod httpMethod,
157 const CIMException& cimException);
158
159 if (isImplicit == false)
160 {
161 formatResponse = XmlWriter::formatSimpleMethodRspMessage;
162 formatError = XmlWriter::formatSimpleMethodErrorRspMessage;
163 }
164 kumpf 1.69 else
165 {
166 formatResponse = XmlWriter::formatSimpleIMethodRspMessage;
167 formatError = XmlWriter::formatSimpleIMethodErrorRspMessage;
168 }
169
170 if (cimException.getCode() != CIM_ERR_SUCCESS)
171 {
172 STAT_SERVEREND_ERROR
173
174 // only process the FIRST error
175 if (httpQueue->cimException.getCode() == CIM_ERR_SUCCESS)
176 {
177 // NOTE: even if this error occurs in the middle, HTTPConnection
178 // will flush the entire queued message and reformat.
179 if (isChunkRequest == false)
180 message =
181 formatError(name, messageId, httpMethod, cimException);
182
183 // uri encode the error (for the http header) only when it is
184 // non-chunking or the first error with chunking
185 kumpf 1.69 if (isChunkRequest == false ||
186 (isChunkRequest == true && isFirst == true))
187 {
188 String msg =
189 TraceableCIMException(cimException).getDescription();
190 String uriEncodedMsg = XmlWriter::encodeURICharacters(msg);
191 CIMException cimExceptionUri(
192 cimException.getCode(), uriEncodedMsg);
193 cimExceptionUri.setContentLanguages(
194 cimException.getContentLanguages());
195 cimException = cimExceptionUri;
196 }
197 } // if first error in response stream
198
199 // never put the error in chunked response (because it will end up in
200 // the trailer), so just use the non-error response formatter to send
201 // more data
202
203 if (isChunkRequest == true)
204 {
205 message = formatResponse(
206 kumpf 1.69 cimName,
207 messageId,
208 httpMethod,
209 contentLanguage,
210 body,
211 serverTime,
212 isFirst,
213 isLast);
214 }
215 }
216 else
217 {
218 // else non-error condition
219 try
220 {
221 message = formatResponse(
222 cimName,
223 messageId,
224 httpMethod,
225 contentLanguage,
226 body,
227 kumpf 1.69 serverTime,
228 isFirst,
229 isLast);
230 }
|
231 a.dunfey 1.72 #if defined(PEGASUS_OS_TYPE_WINDOWS)
|
232 kumpf 1.69 catch (std::bad_alloc&)
|
233 brian.campbell 1.52 #else
|
234 kumpf 1.69 catch (bad_alloc&)
|
235 brian.campbell 1.52 #endif
|
236 kumpf 1.69 {
237 Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
238 funcname + OUT_OF_MEMORY_MESSAGE);
239
240 cimException = PEGASUS_CIM_EXCEPTION_L(
241 CIM_ERR_FAILED, MessageLoaderParms(
242 "Server.CIMOperationResponseEncoder.OUT_OF_MEMORY",
243 OUT_OF_MEMORY_MESSAGE));
244
245 // try again with new error and no body
246 body.clear();
247 sendResponse(response, name, isImplicit);
248 return;
249 }
250
251 STAT_BYTESSENT
252 }
253
254 AutoPtr<HTTPMessage> httpMessage(
255 new HTTPMessage(message, 0, &cimException));
256 httpMessage->setComplete(isLast);
257 kumpf 1.69 httpMessage->setIndex(messageIndex);
258
259 if (cimException.getCode() != CIM_ERR_SUCCESS)
260 {
261 httpMessage->contentLanguages = cimException.getContentLanguages();
262 }
263 else
264 {
265 const OperationContext::Container& container =
266 response->operationContext.get(ContentLanguageListContainer::NAME);
267 const ContentLanguageListContainer& listContainer =
268 *dynamic_cast<const ContentLanguageListContainer*>(&container);
269 contentLanguage = listContainer.getLanguages();
270 httpMessage->contentLanguages = contentLanguage;
271 }
272
273
274 PEG_LOGGER_TRACE((
275 Logger::STANDARD_LOG,
276 System::CIMSERVER,
277 Logger::TRACE,
278 kumpf 1.69 "CIMOperationResponseEncoder::sendResponse - QueueId: $0 "
|
279 j.alex 1.59 "XML content: $1",queueId,
|
280 kumpf 1.69 String(message.getData(), message.size())));
281
282 httpMessage->setCloseConnect(closeConnect);
283 queue->enqueue(httpMessage.release());
284
285 PEG_METHOD_EXIT();
|
286 mday 1.9 }
287
|
288 kumpf 1.69 void CIMOperationResponseEncoder::enqueue(Message* message)
|
289 kumpf 1.67 {
290 handleEnqueue(message);
291 }
292
|
293 kumpf 1.69 void CIMOperationResponseEncoder::handleEnqueue(Message* message)
|
294 mday 1.9 {
|
295 kumpf 1.69 PEG_METHOD_ENTER(TRC_DISPATCHER,
296 "CIMOperationResponseEncoder::handleEnqueue()");
297
298 if (!message)
299 {
300 PEG_METHOD_EXIT();
301 return;
302 }
303
|
304 dave.sudlik 1.70 CIMResponseMessage* response = (CIMResponseMessage*)message;
305 if (response->thread_changed())
306 {
307 AutoPtr<AcceptLanguageList> langs(new AcceptLanguageList((
308 (AcceptLanguageListContainer)response->operationContext.get(
309 AcceptLanguageListContainer::NAME)).getLanguages()));
310 Thread::setLanguages(langs.release());
311 }
312
|
313 kumpf 1.69 Tracer::trace(
314 TRC_HTTP,
315 Tracer::LEVEL3,
316 "CIMOperationResponseEncoder::handleEnque()- "
317 "message->getCloseConnect() returned %d",
318 message->getCloseConnect());
319
320 switch (message->getType())
321 {
322 case CIM_GET_CLASS_RESPONSE_MESSAGE:
323 encodeGetClassResponse(
324 (CIMGetClassResponseMessage*)message);
325 break;
326
327 case CIM_GET_INSTANCE_RESPONSE_MESSAGE:
328 encodeGetInstanceResponse(
329 (CIMGetInstanceResponseMessage*)message);
330 break;
331
332 case CIM_DELETE_CLASS_RESPONSE_MESSAGE:
333 encodeDeleteClassResponse(
334 kumpf 1.69 (CIMDeleteClassResponseMessage*)message);
335 break;
336
337 case CIM_DELETE_INSTANCE_RESPONSE_MESSAGE:
338 encodeDeleteInstanceResponse(
339 (CIMDeleteInstanceResponseMessage*)message);
340 break;
341
342 case CIM_CREATE_CLASS_RESPONSE_MESSAGE:
343 encodeCreateClassResponse(
344 (CIMCreateClassResponseMessage*)message);
345 break;
346
347 case CIM_CREATE_INSTANCE_RESPONSE_MESSAGE:
348 encodeCreateInstanceResponse(
349 (CIMCreateInstanceResponseMessage*)message);
350 break;
351
352 case CIM_MODIFY_CLASS_RESPONSE_MESSAGE:
353 encodeModifyClassResponse(
354 (CIMModifyClassResponseMessage*)message);
355 kumpf 1.69 break;
356
357 case CIM_MODIFY_INSTANCE_RESPONSE_MESSAGE:
358 encodeModifyInstanceResponse(
359 (CIMModifyInstanceResponseMessage*)message);
360 break;
361
362 case CIM_ENUMERATE_CLASSES_RESPONSE_MESSAGE:
363 encodeEnumerateClassesResponse(
364 (CIMEnumerateClassesResponseMessage*)message);
365 break;
366
367 case CIM_ENUMERATE_CLASS_NAMES_RESPONSE_MESSAGE:
368 encodeEnumerateClassNamesResponse(
369 (CIMEnumerateClassNamesResponseMessage*)message);
370 break;
371
372 case CIM_ENUMERATE_INSTANCES_RESPONSE_MESSAGE:
373 encodeEnumerateInstancesResponse(
374 (CIMEnumerateInstancesResponseMessage*)message);
375 break;
376 kumpf 1.69
377 case CIM_ENUMERATE_INSTANCE_NAMES_RESPONSE_MESSAGE:
378 encodeEnumerateInstanceNamesResponse(
379 (CIMEnumerateInstanceNamesResponseMessage*)message);
380 break;
381
382 case CIM_EXEC_QUERY_RESPONSE_MESSAGE:
383 encodeExecQueryResponse(
384 (CIMExecQueryResponseMessage*)message);
385 break;
386
387 case CIM_ASSOCIATORS_RESPONSE_MESSAGE:
388 encodeAssociatorsResponse(
389 (CIMAssociatorsResponseMessage*)message);
390 break;
391
392 case CIM_ASSOCIATOR_NAMES_RESPONSE_MESSAGE:
393 encodeAssociatorNamesResponse(
394 (CIMAssociatorNamesResponseMessage*)message);
395 break;
396
397 kumpf 1.69 case CIM_REFERENCES_RESPONSE_MESSAGE:
398 encodeReferencesResponse(
399 (CIMReferencesResponseMessage*)message);
400 break;
401
402 case CIM_REFERENCE_NAMES_RESPONSE_MESSAGE:
403 encodeReferenceNamesResponse(
404 (CIMReferenceNamesResponseMessage*)message);
405 break;
406
407 case CIM_GET_PROPERTY_RESPONSE_MESSAGE:
408 encodeGetPropertyResponse(
409 (CIMGetPropertyResponseMessage*)message);
410 break;
411
412 case CIM_SET_PROPERTY_RESPONSE_MESSAGE:
413 encodeSetPropertyResponse(
414 (CIMSetPropertyResponseMessage*)message);
415 break;
416
417 case CIM_GET_QUALIFIER_RESPONSE_MESSAGE:
418 kumpf 1.69 encodeGetQualifierResponse(
419 (CIMGetQualifierResponseMessage*)message);
420 break;
421
422 case CIM_SET_QUALIFIER_RESPONSE_MESSAGE:
423 encodeSetQualifierResponse(
424 (CIMSetQualifierResponseMessage*)message);
425 break;
426
427 case CIM_DELETE_QUALIFIER_RESPONSE_MESSAGE:
428 encodeDeleteQualifierResponse(
429 (CIMDeleteQualifierResponseMessage*)message);
430 break;
431
432 case CIM_ENUMERATE_QUALIFIERS_RESPONSE_MESSAGE:
433 encodeEnumerateQualifiersResponse(
434 (CIMEnumerateQualifiersResponseMessage*)message);
435 break;
436
437 case CIM_INVOKE_METHOD_RESPONSE_MESSAGE:
438 encodeInvokeMethodResponse(
439 kumpf 1.69 (CIMInvokeMethodResponseMessage*)message);
440 break;
441 }
442
443 delete message;
|
444 kumpf 1.14
|
445 kumpf 1.69 PEG_METHOD_EXIT();
446 return;
|
447 mday 1.9 }
|
448 mday 1.8
|
449 mike 1.2 void CIMOperationResponseEncoder::handleEnqueue()
450 {
|
451 kumpf 1.69 Message* message = dequeue();
452 if (message)
453 handleEnqueue(message);
|
454 mike 1.2 }
455
456 void CIMOperationResponseEncoder::encodeCreateClassResponse(
|
457 kumpf 1.69 CIMCreateClassResponseMessage* response)
|
458 mike 1.2 {
|
459 kumpf 1.69 sendResponse(response, "CreateClass", true);
|
460 mike 1.2 }
461
462 void CIMOperationResponseEncoder::encodeGetClassResponse(
|
463 kumpf 1.69 CIMGetClassResponseMessage* response)
|
464 mike 1.2 {
|
465 kumpf 1.69 Buffer body;
466 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
467 XmlWriter::appendClassElement(body, response->cimClass);
468 sendResponse(response, "GetClass", true, &body);
|
469 mike 1.2 }
470
471 void CIMOperationResponseEncoder::encodeModifyClassResponse(
|
472 kumpf 1.69 CIMModifyClassResponseMessage* response)
|
473 mike 1.2 {
|
474 kumpf 1.69 sendResponse(response, "ModifyClass", true);
|
475 mike 1.2 }
476
477 void CIMOperationResponseEncoder::encodeEnumerateClassNamesResponse(
|
478 kumpf 1.69 CIMEnumerateClassNamesResponseMessage* response)
|
479 mike 1.2 {
|
480 kumpf 1.69 Buffer body;
481 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
482 for (Uint32 i = 0, n = response->classNames.size(); i < n; i++)
483 XmlWriter::appendClassNameElement(body, response->classNames[i]);
484 sendResponse(response, "EnumerateClassNames", true, &body);
|
485 mike 1.2 }
486
487 void CIMOperationResponseEncoder::encodeEnumerateClassesResponse(
|
488 kumpf 1.69 CIMEnumerateClassesResponseMessage* response)
|
489 mike 1.2 {
|
490 kumpf 1.69 Buffer body;
491 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
492 for (Uint32 i = 0, n= response->cimClasses.size(); i < n; i++)
493 XmlWriter::appendClassElement(body, response->cimClasses[i]);
494 sendResponse(response, "EnumerateClasses", true, &body);
|
495 mike 1.2 }
496
497 void CIMOperationResponseEncoder::encodeDeleteClassResponse(
|
498 kumpf 1.69 CIMDeleteClassResponseMessage* response)
|
499 mike 1.2 {
|
500 kumpf 1.69 sendResponse(response, "DeleteClass", true);
|
501 mike 1.2 }
502
503 void CIMOperationResponseEncoder::encodeCreateInstanceResponse(
|
504 kumpf 1.69 CIMCreateInstanceResponseMessage* response)
|
505 mike 1.2 {
|
506 kumpf 1.69 Buffer body;
507 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
508 XmlWriter::appendInstanceNameElement(body, response->instanceName);
509 sendResponse(response, "CreateInstance", true, &body);
|
510 mike 1.2 }
511
512 void CIMOperationResponseEncoder::encodeGetInstanceResponse(
|
513 kumpf 1.69 CIMGetInstanceResponseMessage* response)
|
514 mike 1.2 {
|
515 kumpf 1.69 Buffer body;
516 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
517 XmlWriter::appendInstanceElement(body, response->cimInstance);
518 sendResponse(response, "GetInstance", true, &body);
|
519 mike 1.2 }
520
521 void CIMOperationResponseEncoder::encodeModifyInstanceResponse(
|
522 kumpf 1.69 CIMModifyInstanceResponseMessage* response)
|
523 mike 1.2 {
|
524 kumpf 1.69 sendResponse(response, "ModifyInstance", true);
|
525 mike 1.2 }
526
527 void CIMOperationResponseEncoder::encodeEnumerateInstancesResponse(
|
528 kumpf 1.69 CIMEnumerateInstancesResponseMessage* response)
|
529 mike 1.2 {
|
530 kumpf 1.69 Buffer body;
531 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
532 for (Uint32 i = 0, n = response->cimNamedInstances.size(); i < n; i++)
533 XmlWriter::appendValueNamedInstanceElement(
534 body, response->cimNamedInstances[i]);
535 sendResponse(response, "EnumerateInstances", true, &body);
|
536 mike 1.2 }
537
538 void CIMOperationResponseEncoder::encodeEnumerateInstanceNamesResponse(
|
539 kumpf 1.69 CIMEnumerateInstanceNamesResponseMessage* response)
|
540 mike 1.2 {
|
541 kumpf 1.69 Buffer body;
542 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
543 for (Uint32 i = 0, n = response->instanceNames.size(); i < n; i++)
544 XmlWriter::appendInstanceNameElement(
545 body, response->instanceNames[i]);
546 sendResponse(response, "EnumerateInstanceNames", true, &body);
|
547 mike 1.2 }
548
549 void CIMOperationResponseEncoder::encodeDeleteInstanceResponse(
|
550 kumpf 1.69 CIMDeleteInstanceResponseMessage* response)
|
551 mike 1.2 {
|
552 kumpf 1.69 sendResponse(response, "DeleteInstance", true);
|
553 mike 1.2 }
554
555 void CIMOperationResponseEncoder::encodeGetPropertyResponse(
|
556 kumpf 1.69 CIMGetPropertyResponseMessage* response)
|
557 mike 1.2 {
|
558 kumpf 1.69 Buffer body;
559 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
560 XmlWriter::appendValueElement(body, response->value);
561 sendResponse(response, "GetProperty", true, &body);
|
562 mike 1.2 }
563
564 void CIMOperationResponseEncoder::encodeSetPropertyResponse(
|
565 kumpf 1.69 CIMSetPropertyResponseMessage* response)
|
566 mike 1.2 {
|
567 kumpf 1.69 sendResponse(response, "SetProperty", true);
|
568 mike 1.2 }
569
570 void CIMOperationResponseEncoder::encodeSetQualifierResponse(
|
571 kumpf 1.69 CIMSetQualifierResponseMessage* response)
|
572 mike 1.2 {
|
573 kumpf 1.69 sendResponse(response, "SetQualifier", true);
|
574 mike 1.2 }
575
576 void CIMOperationResponseEncoder::encodeGetQualifierResponse(
|
577 kumpf 1.69 CIMGetQualifierResponseMessage* response)
|
578 mike 1.2 {
|
579 kumpf 1.69 Buffer body;
580 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
581 XmlWriter::appendQualifierDeclElement(body, response->cimQualifierDecl);
582 sendResponse(response, "GetQualifier", true, &body);
|
583 mike 1.2 }
584
585 void CIMOperationResponseEncoder::encodeEnumerateQualifiersResponse(
|
586 kumpf 1.69 CIMEnumerateQualifiersResponseMessage* response)
|
587 mike 1.2 {
|
588 kumpf 1.69 Buffer body;
589 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
590 for (Uint32 i = 0, n = response->qualifierDeclarations.size();
591 i < n; i++)
592 XmlWriter::appendQualifierDeclElement(
593 body, response->qualifierDeclarations[i]);
594 sendResponse(response, "EnumerateQualifiers", true, &body);
|
595 mike 1.2 }
596
597 void CIMOperationResponseEncoder::encodeDeleteQualifierResponse(
|
598 kumpf 1.69 CIMDeleteQualifierResponseMessage* response)
|
599 mike 1.2 {
|
600 kumpf 1.69 sendResponse(response, "DeleteQualifier", true);
|
601 mike 1.2 }
602
603 void CIMOperationResponseEncoder::encodeReferenceNamesResponse(
|
604 kumpf 1.69 CIMReferenceNamesResponseMessage* response)
|
605 mike 1.2 {
|
606 kumpf 1.69 Buffer body;
607 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
608 for (Uint32 i = 0, n = response->objectNames.size(); i < n; i++)
609 {
610 body << "<OBJECTPATH>\n";
611 XmlWriter::appendValueReferenceElement(
612 body, response->objectNames[i], false);
613 body << "</OBJECTPATH>\n";
614 }
615 sendResponse(response, "ReferenceNames", true, &body);
|
616 mike 1.2 }
617
618 void CIMOperationResponseEncoder::encodeReferencesResponse(
|
619 kumpf 1.69 CIMReferencesResponseMessage* response)
|
620 mike 1.2 {
|
621 kumpf 1.69 Buffer body;
622 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
623 for (Uint32 i = 0, n = response->cimObjects.size(); i < n;i++)
624 XmlWriter::appendValueObjectWithPathElement(
625 body, response->cimObjects[i]);
626 sendResponse(response, "References", true, &body);
|
627 mike 1.2 }
628
629 void CIMOperationResponseEncoder::encodeAssociatorNamesResponse(
|
630 kumpf 1.69 CIMAssociatorNamesResponseMessage* response)
|
631 mike 1.2 {
|
632 kumpf 1.69 Buffer body;
633 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
634 for (Uint32 i = 0, n = response->objectNames.size(); i < n; i++)
635 {
636 body << "<OBJECTPATH>\n";
637 XmlWriter::appendValueReferenceElement(
638 body, response->objectNames[i], false);
639 body << "</OBJECTPATH>\n";
640 }
641 sendResponse(response, "AssociatorNames", true, &body);
|
642 mike 1.2 }
643
644 void CIMOperationResponseEncoder::encodeAssociatorsResponse(
|
645 kumpf 1.69 CIMAssociatorsResponseMessage* response)
|
646 mike 1.2 {
|
647 kumpf 1.69 Buffer body;
648 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
649 for (Uint32 i = 0, n = response->cimObjects.size(); i < n; i++)
650 XmlWriter::appendValueObjectWithPathElement(
651 body, response->cimObjects[i]);
652 sendResponse(response, "Associators", true, &body);
|
653 kumpf 1.14 }
654
655 void CIMOperationResponseEncoder::encodeExecQueryResponse(
|
656 kumpf 1.69 CIMExecQueryResponseMessage* response)
|
657 kumpf 1.14 {
|
658 kumpf 1.69 Buffer body;
659 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
660 for (Uint32 i = 0; i < response->cimObjects.size(); i++)
661 XmlWriter::appendValueObjectWithPathElement(
662 body, response->cimObjects[i]);
663 sendResponse(response, "ExecQuery", true, &body);
|
664 mike 1.2 }
665
666 void CIMOperationResponseEncoder::encodeInvokeMethodResponse(
|
667 mday 1.26 CIMInvokeMethodResponseMessage* response)
|
668 mike 1.2 {
|
669 kumpf 1.69 Buffer body;
|
670 mday 1.9
|
671 kumpf 1.69 // ATTN-RK-P3-20020219: Who's job is it to make sure the return value is
672 // not an array?
673 // Only add the return value if it is not null
674
675 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
676 {
677 if (!response->retValue.isNull())
678 XmlWriter::appendReturnValueElement(body, response->retValue);
679
680 for (Uint32 i=0, n = response->outParameters.size(); i < n; i++)
681 XmlWriter::appendParamValueElement(
682 body, response->outParameters[i]);
683 }
684 sendResponse(response, response->methodName.getString(), false, &body);
|
685 mike 1.2 }
686
687 PEGASUS_NAMESPACE_END
|