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 marek 1.73 PEG_TRACE((
|
89 kumpf 1.69 TRC_HTTP,
|
90 mike 1.77.4.1 Tracer::LEVEL4,
|
91 kumpf 1.69 "CIMOperationResponseEncoder::sendResponse()- "
92 "response->getCloseConnect() returned %d",
|
93 marek 1.73 closeConnect));
|
94 kumpf 1.69
95 MessageQueue* queue = MessageQueue::lookup(queueId);
96
97 if (!queue)
98 {
|
99 mike 1.77.4.1 PEG_TRACE((TRC_DISCARDED_DATA, Tracer::LEVEL1,
|
100 marek 1.73 "ERROR: non-existent queueId = %u, response not sent.", queueId));
|
101 kumpf 1.69 PEG_METHOD_EXIT();
102 return;
103 }
104
105 HTTPConnection* httpQueue = dynamic_cast<HTTPConnection*>(queue);
106
107 if (! httpQueue)
108 {
|
109 mike 1.77.4.1 PEG_TRACE((TRC_DISCARDED_DATA, Tracer::LEVEL1,
|
110 kumpf 1.69 "ERROR: Unknown queue type. queueId = %u, response not sent.",
|
111 marek 1.73 queueId));
|
112 kumpf 1.69 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 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 marek 1.77 Logger::put(
238 Logger::ERROR_LOG,
239 System::CIMSERVER,
240 Logger::WARNING,
|
241 kumpf 1.69 funcname + OUT_OF_MEMORY_MESSAGE);
242
243 cimException = PEGASUS_CIM_EXCEPTION_L(
244 CIM_ERR_FAILED, MessageLoaderParms(
245 "Server.CIMOperationResponseEncoder.OUT_OF_MEMORY",
246 OUT_OF_MEMORY_MESSAGE));
247
248 // try again with new error and no body
249 body.clear();
250 sendResponse(response, name, isImplicit);
|
251 marek 1.74 PEG_METHOD_EXIT();
|
252 kumpf 1.69 return;
253 }
254
255 STAT_BYTESSENT
256 }
257
258 AutoPtr<HTTPMessage> httpMessage(
259 new HTTPMessage(message, 0, &cimException));
260 httpMessage->setComplete(isLast);
261 httpMessage->setIndex(messageIndex);
262
263 if (cimException.getCode() != CIM_ERR_SUCCESS)
264 {
265 httpMessage->contentLanguages = cimException.getContentLanguages();
266 }
267 else
268 {
269 const OperationContext::Container& container =
270 response->operationContext.get(ContentLanguageListContainer::NAME);
271 const ContentLanguageListContainer& listContainer =
272 *dynamic_cast<const ContentLanguageListContainer*>(&container);
273 kumpf 1.69 contentLanguage = listContainer.getLanguages();
274 httpMessage->contentLanguages = contentLanguage;
275 }
276
277 httpMessage->setCloseConnect(closeConnect);
278 queue->enqueue(httpMessage.release());
279
280 PEG_METHOD_EXIT();
|
281 mday 1.9 }
282
|
283 kumpf 1.69 void CIMOperationResponseEncoder::enqueue(Message* message)
|
284 kumpf 1.67 {
285 handleEnqueue(message);
286 }
287
|
288 kumpf 1.69 void CIMOperationResponseEncoder::handleEnqueue(Message* message)
|
289 mday 1.9 {
|
290 kumpf 1.69 PEG_METHOD_ENTER(TRC_DISPATCHER,
291 "CIMOperationResponseEncoder::handleEnqueue()");
292
293 if (!message)
294 {
295 PEG_METHOD_EXIT();
296 return;
297 }
298
|
299 kumpf 1.76 CIMResponseMessage* response = dynamic_cast<CIMResponseMessage*>(message);
300 PEGASUS_ASSERT(response);
301
302 response->updateThreadLanguages();
|
303 dave.sudlik 1.70
|
304 marek 1.73 PEG_TRACE((
|
305 kumpf 1.69 TRC_HTTP,
|
306 mike 1.77.4.1 Tracer::LEVEL4,
|
307 kumpf 1.69 "CIMOperationResponseEncoder::handleEnque()- "
308 "message->getCloseConnect() returned %d",
|
309 marek 1.73 message->getCloseConnect()));
|
310 kumpf 1.69
311 switch (message->getType())
312 {
313 case CIM_GET_CLASS_RESPONSE_MESSAGE:
314 encodeGetClassResponse(
315 (CIMGetClassResponseMessage*)message);
316 break;
317
318 case CIM_GET_INSTANCE_RESPONSE_MESSAGE:
319 encodeGetInstanceResponse(
320 (CIMGetInstanceResponseMessage*)message);
321 break;
322
323 case CIM_DELETE_CLASS_RESPONSE_MESSAGE:
324 encodeDeleteClassResponse(
325 (CIMDeleteClassResponseMessage*)message);
326 break;
327
328 case CIM_DELETE_INSTANCE_RESPONSE_MESSAGE:
329 encodeDeleteInstanceResponse(
330 (CIMDeleteInstanceResponseMessage*)message);
331 kumpf 1.69 break;
332
333 case CIM_CREATE_CLASS_RESPONSE_MESSAGE:
334 encodeCreateClassResponse(
335 (CIMCreateClassResponseMessage*)message);
336 break;
337
338 case CIM_CREATE_INSTANCE_RESPONSE_MESSAGE:
339 encodeCreateInstanceResponse(
340 (CIMCreateInstanceResponseMessage*)message);
341 break;
342
343 case CIM_MODIFY_CLASS_RESPONSE_MESSAGE:
344 encodeModifyClassResponse(
345 (CIMModifyClassResponseMessage*)message);
346 break;
347
348 case CIM_MODIFY_INSTANCE_RESPONSE_MESSAGE:
349 encodeModifyInstanceResponse(
350 (CIMModifyInstanceResponseMessage*)message);
351 break;
352 kumpf 1.69
353 case CIM_ENUMERATE_CLASSES_RESPONSE_MESSAGE:
354 encodeEnumerateClassesResponse(
355 (CIMEnumerateClassesResponseMessage*)message);
356 break;
357
358 case CIM_ENUMERATE_CLASS_NAMES_RESPONSE_MESSAGE:
359 encodeEnumerateClassNamesResponse(
360 (CIMEnumerateClassNamesResponseMessage*)message);
361 break;
362
363 case CIM_ENUMERATE_INSTANCES_RESPONSE_MESSAGE:
364 encodeEnumerateInstancesResponse(
365 (CIMEnumerateInstancesResponseMessage*)message);
366 break;
367
368 case CIM_ENUMERATE_INSTANCE_NAMES_RESPONSE_MESSAGE:
369 encodeEnumerateInstanceNamesResponse(
370 (CIMEnumerateInstanceNamesResponseMessage*)message);
371 break;
372
373 kumpf 1.69 case CIM_EXEC_QUERY_RESPONSE_MESSAGE:
374 encodeExecQueryResponse(
375 (CIMExecQueryResponseMessage*)message);
376 break;
377
378 case CIM_ASSOCIATORS_RESPONSE_MESSAGE:
379 encodeAssociatorsResponse(
380 (CIMAssociatorsResponseMessage*)message);
381 break;
382
383 case CIM_ASSOCIATOR_NAMES_RESPONSE_MESSAGE:
384 encodeAssociatorNamesResponse(
385 (CIMAssociatorNamesResponseMessage*)message);
386 break;
387
388 case CIM_REFERENCES_RESPONSE_MESSAGE:
389 encodeReferencesResponse(
390 (CIMReferencesResponseMessage*)message);
391 break;
392
393 case CIM_REFERENCE_NAMES_RESPONSE_MESSAGE:
394 kumpf 1.69 encodeReferenceNamesResponse(
395 (CIMReferenceNamesResponseMessage*)message);
396 break;
397
398 case CIM_GET_PROPERTY_RESPONSE_MESSAGE:
399 encodeGetPropertyResponse(
400 (CIMGetPropertyResponseMessage*)message);
401 break;
402
403 case CIM_SET_PROPERTY_RESPONSE_MESSAGE:
404 encodeSetPropertyResponse(
405 (CIMSetPropertyResponseMessage*)message);
406 break;
407
408 case CIM_GET_QUALIFIER_RESPONSE_MESSAGE:
409 encodeGetQualifierResponse(
410 (CIMGetQualifierResponseMessage*)message);
411 break;
412
413 case CIM_SET_QUALIFIER_RESPONSE_MESSAGE:
414 encodeSetQualifierResponse(
415 kumpf 1.69 (CIMSetQualifierResponseMessage*)message);
416 break;
417
418 case CIM_DELETE_QUALIFIER_RESPONSE_MESSAGE:
419 encodeDeleteQualifierResponse(
420 (CIMDeleteQualifierResponseMessage*)message);
421 break;
422
423 case CIM_ENUMERATE_QUALIFIERS_RESPONSE_MESSAGE:
424 encodeEnumerateQualifiersResponse(
425 (CIMEnumerateQualifiersResponseMessage*)message);
426 break;
427
428 case CIM_INVOKE_METHOD_RESPONSE_MESSAGE:
429 encodeInvokeMethodResponse(
430 (CIMInvokeMethodResponseMessage*)message);
431 break;
|
432 kumpf 1.75
433 default:
434 // Unexpected message type
435 PEGASUS_ASSERT(0);
436 break;
|
437 kumpf 1.69 }
438
439 delete message;
|
440 kumpf 1.14
|
441 kumpf 1.69 PEG_METHOD_EXIT();
442 return;
|
443 mday 1.9 }
|
444 mday 1.8
|
445 mike 1.2 void CIMOperationResponseEncoder::handleEnqueue()
446 {
|
447 kumpf 1.69 Message* message = dequeue();
448 if (message)
449 handleEnqueue(message);
|
450 mike 1.2 }
451
452 void CIMOperationResponseEncoder::encodeCreateClassResponse(
|
453 kumpf 1.69 CIMCreateClassResponseMessage* response)
|
454 mike 1.2 {
|
455 kumpf 1.69 sendResponse(response, "CreateClass", true);
|
456 mike 1.2 }
457
458 void CIMOperationResponseEncoder::encodeGetClassResponse(
|
459 kumpf 1.69 CIMGetClassResponseMessage* response)
|
460 mike 1.2 {
|
461 kumpf 1.69 Buffer body;
462 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
463 XmlWriter::appendClassElement(body, response->cimClass);
464 sendResponse(response, "GetClass", true, &body);
|
465 mike 1.2 }
466
467 void CIMOperationResponseEncoder::encodeModifyClassResponse(
|
468 kumpf 1.69 CIMModifyClassResponseMessage* response)
|
469 mike 1.2 {
|
470 kumpf 1.69 sendResponse(response, "ModifyClass", true);
|
471 mike 1.2 }
472
473 void CIMOperationResponseEncoder::encodeEnumerateClassNamesResponse(
|
474 kumpf 1.69 CIMEnumerateClassNamesResponseMessage* response)
|
475 mike 1.2 {
|
476 kumpf 1.69 Buffer body;
477 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
478 for (Uint32 i = 0, n = response->classNames.size(); i < n; i++)
479 XmlWriter::appendClassNameElement(body, response->classNames[i]);
480 sendResponse(response, "EnumerateClassNames", true, &body);
|
481 mike 1.2 }
482
483 void CIMOperationResponseEncoder::encodeEnumerateClassesResponse(
|
484 kumpf 1.69 CIMEnumerateClassesResponseMessage* response)
|
485 mike 1.2 {
|
486 kumpf 1.69 Buffer body;
487 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
488 for (Uint32 i = 0, n= response->cimClasses.size(); i < n; i++)
489 XmlWriter::appendClassElement(body, response->cimClasses[i]);
490 sendResponse(response, "EnumerateClasses", true, &body);
|
491 mike 1.2 }
492
493 void CIMOperationResponseEncoder::encodeDeleteClassResponse(
|
494 kumpf 1.69 CIMDeleteClassResponseMessage* response)
|
495 mike 1.2 {
|
496 kumpf 1.69 sendResponse(response, "DeleteClass", true);
|
497 mike 1.2 }
498
499 void CIMOperationResponseEncoder::encodeCreateInstanceResponse(
|
500 kumpf 1.69 CIMCreateInstanceResponseMessage* response)
|
501 mike 1.2 {
|
502 kumpf 1.69 Buffer body;
503 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
504 XmlWriter::appendInstanceNameElement(body, response->instanceName);
505 sendResponse(response, "CreateInstance", true, &body);
|
506 mike 1.2 }
507
508 void CIMOperationResponseEncoder::encodeGetInstanceResponse(
|
509 kumpf 1.69 CIMGetInstanceResponseMessage* response)
|
510 mike 1.2 {
|
511 kumpf 1.69 Buffer body;
512 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
513 XmlWriter::appendInstanceElement(body, response->cimInstance);
514 sendResponse(response, "GetInstance", true, &body);
|
515 mike 1.2 }
516
517 void CIMOperationResponseEncoder::encodeModifyInstanceResponse(
|
518 kumpf 1.69 CIMModifyInstanceResponseMessage* response)
|
519 mike 1.2 {
|
520 kumpf 1.69 sendResponse(response, "ModifyInstance", true);
|
521 mike 1.2 }
522
523 void CIMOperationResponseEncoder::encodeEnumerateInstancesResponse(
|
524 kumpf 1.69 CIMEnumerateInstancesResponseMessage* response)
|
525 mike 1.2 {
|
526 kumpf 1.69 Buffer body;
527 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
528 for (Uint32 i = 0, n = response->cimNamedInstances.size(); i < n; i++)
529 XmlWriter::appendValueNamedInstanceElement(
530 body, response->cimNamedInstances[i]);
531 sendResponse(response, "EnumerateInstances", true, &body);
|
532 mike 1.2 }
533
534 void CIMOperationResponseEncoder::encodeEnumerateInstanceNamesResponse(
|
535 kumpf 1.69 CIMEnumerateInstanceNamesResponseMessage* response)
|
536 mike 1.2 {
|
537 kumpf 1.69 Buffer body;
538 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
539 for (Uint32 i = 0, n = response->instanceNames.size(); i < n; i++)
540 XmlWriter::appendInstanceNameElement(
541 body, response->instanceNames[i]);
542 sendResponse(response, "EnumerateInstanceNames", true, &body);
|
543 mike 1.2 }
544
545 void CIMOperationResponseEncoder::encodeDeleteInstanceResponse(
|
546 kumpf 1.69 CIMDeleteInstanceResponseMessage* response)
|
547 mike 1.2 {
|
548 kumpf 1.69 sendResponse(response, "DeleteInstance", true);
|
549 mike 1.2 }
550
551 void CIMOperationResponseEncoder::encodeGetPropertyResponse(
|
552 kumpf 1.69 CIMGetPropertyResponseMessage* response)
|
553 mike 1.2 {
|
554 kumpf 1.69 Buffer body;
555 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
556 XmlWriter::appendValueElement(body, response->value);
557 sendResponse(response, "GetProperty", true, &body);
|
558 mike 1.2 }
559
560 void CIMOperationResponseEncoder::encodeSetPropertyResponse(
|
561 kumpf 1.69 CIMSetPropertyResponseMessage* response)
|
562 mike 1.2 {
|
563 kumpf 1.69 sendResponse(response, "SetProperty", true);
|
564 mike 1.2 }
565
566 void CIMOperationResponseEncoder::encodeSetQualifierResponse(
|
567 kumpf 1.69 CIMSetQualifierResponseMessage* response)
|
568 mike 1.2 {
|
569 kumpf 1.69 sendResponse(response, "SetQualifier", true);
|
570 mike 1.2 }
571
572 void CIMOperationResponseEncoder::encodeGetQualifierResponse(
|
573 kumpf 1.69 CIMGetQualifierResponseMessage* response)
|
574 mike 1.2 {
|
575 kumpf 1.69 Buffer body;
576 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
577 XmlWriter::appendQualifierDeclElement(body, response->cimQualifierDecl);
578 sendResponse(response, "GetQualifier", true, &body);
|
579 mike 1.2 }
580
581 void CIMOperationResponseEncoder::encodeEnumerateQualifiersResponse(
|
582 kumpf 1.69 CIMEnumerateQualifiersResponseMessage* response)
|
583 mike 1.2 {
|
584 kumpf 1.69 Buffer body;
585 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
586 for (Uint32 i = 0, n = response->qualifierDeclarations.size();
587 i < n; i++)
588 XmlWriter::appendQualifierDeclElement(
589 body, response->qualifierDeclarations[i]);
590 sendResponse(response, "EnumerateQualifiers", true, &body);
|
591 mike 1.2 }
592
593 void CIMOperationResponseEncoder::encodeDeleteQualifierResponse(
|
594 kumpf 1.69 CIMDeleteQualifierResponseMessage* response)
|
595 mike 1.2 {
|
596 kumpf 1.69 sendResponse(response, "DeleteQualifier", true);
|
597 mike 1.2 }
598
599 void CIMOperationResponseEncoder::encodeReferenceNamesResponse(
|
600 kumpf 1.69 CIMReferenceNamesResponseMessage* response)
|
601 mike 1.2 {
|
602 kumpf 1.69 Buffer body;
603 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
604 for (Uint32 i = 0, n = response->objectNames.size(); i < n; i++)
605 {
606 body << "<OBJECTPATH>\n";
607 XmlWriter::appendValueReferenceElement(
608 body, response->objectNames[i], false);
609 body << "</OBJECTPATH>\n";
610 }
611 sendResponse(response, "ReferenceNames", true, &body);
|
612 mike 1.2 }
613
614 void CIMOperationResponseEncoder::encodeReferencesResponse(
|
615 kumpf 1.69 CIMReferencesResponseMessage* response)
|
616 mike 1.2 {
|
617 kumpf 1.69 Buffer body;
618 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
619 for (Uint32 i = 0, n = response->cimObjects.size(); i < n;i++)
620 XmlWriter::appendValueObjectWithPathElement(
621 body, response->cimObjects[i]);
622 sendResponse(response, "References", true, &body);
|
623 mike 1.2 }
624
625 void CIMOperationResponseEncoder::encodeAssociatorNamesResponse(
|
626 kumpf 1.69 CIMAssociatorNamesResponseMessage* response)
|
627 mike 1.2 {
|
628 kumpf 1.69 Buffer body;
629 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
630 for (Uint32 i = 0, n = response->objectNames.size(); i < n; i++)
631 {
632 body << "<OBJECTPATH>\n";
633 XmlWriter::appendValueReferenceElement(
634 body, response->objectNames[i], false);
635 body << "</OBJECTPATH>\n";
636 }
637 sendResponse(response, "AssociatorNames", true, &body);
|
638 mike 1.2 }
639
640 void CIMOperationResponseEncoder::encodeAssociatorsResponse(
|
641 kumpf 1.69 CIMAssociatorsResponseMessage* response)
|
642 mike 1.2 {
|
643 kumpf 1.69 Buffer body;
644 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
645 for (Uint32 i = 0, n = response->cimObjects.size(); i < n; i++)
646 XmlWriter::appendValueObjectWithPathElement(
647 body, response->cimObjects[i]);
648 sendResponse(response, "Associators", true, &body);
|
649 kumpf 1.14 }
650
651 void CIMOperationResponseEncoder::encodeExecQueryResponse(
|
652 kumpf 1.69 CIMExecQueryResponseMessage* response)
|
653 kumpf 1.14 {
|
654 kumpf 1.69 Buffer body;
655 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
656 for (Uint32 i = 0; i < response->cimObjects.size(); i++)
657 XmlWriter::appendValueObjectWithPathElement(
658 body, response->cimObjects[i]);
659 sendResponse(response, "ExecQuery", true, &body);
|
660 mike 1.2 }
661
662 void CIMOperationResponseEncoder::encodeInvokeMethodResponse(
|
663 mday 1.26 CIMInvokeMethodResponseMessage* response)
|
664 mike 1.2 {
|
665 kumpf 1.69 Buffer body;
|
666 mday 1.9
|
667 kumpf 1.69 // ATTN-RK-P3-20020219: Who's job is it to make sure the return value is
668 // not an array?
669 // Only add the return value if it is not null
670
671 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
672 {
673 if (!response->retValue.isNull())
674 XmlWriter::appendReturnValueElement(body, response->retValue);
675
676 for (Uint32 i=0, n = response->outParameters.size(); i < n; i++)
677 XmlWriter::appendParamValueElement(
678 body, response->outParameters[i]);
679 }
680 sendResponse(response, response->methodName.getString(), false, &body);
|
681 mike 1.2 }
682
683 PEGASUS_NAMESPACE_END
|