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