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 kumpf 1.66 // STAT_SERVEREND sets the getTotalServerTime() value in the message class
157 STAT_SERVEREND
158
|
159 denise.eckstein 1.68 #ifndef PEGASUS_DISABLE_PERFINST
|
160 kumpf 1.66 Uint64 serverTime = response->getTotalServerTime();
|
161 denise.eckstein 1.68 #else
162 Uint64 serverTime = 0;
163 #endif
|
164 w.white 1.56
|
165 mike 1.60 Buffer (*formatResponse)(const CIMName& iMethodName,
|
166 brian.campbell 1.52 const String& messageId,
167 HttpMethod httpMethod,
|
168 kumpf 1.64 const ContentLanguageList &httpContentLanguages,
|
169 mike 1.60 const Buffer& body,
|
170 denise.eckstein 1.61 Uint64 serverResponseTime,
|
171 brian.campbell 1.52 Boolean isFirst,
172 Boolean isLast);
173
|
174 mike 1.60 Buffer (*formatError)(const CIMName& methodName,
|
175 brian.campbell 1.52 const String& messageId,
176 HttpMethod httpMethod,
177 const CIMException& cimException);
178
179 if (isImplicit == false)
180 {
181 formatResponse = XmlWriter::formatSimpleMethodRspMessage;
182 formatError = XmlWriter::formatSimpleMethodErrorRspMessage;
183 }
184 else
185 {
186 formatResponse = XmlWriter::formatSimpleIMethodRspMessage;
187 formatError = XmlWriter::formatSimpleIMethodErrorRspMessage;
188 }
189
190 if (cimException.getCode() != CIM_ERR_SUCCESS)
191 {
192 STAT_SERVEREND_ERROR
193
|
194 brian.campbell 1.53 // only process the FIRST error
|
195 brian.campbell 1.52 if (httpQueue->cimException.getCode() == CIM_ERR_SUCCESS)
196 {
|
197 brian.campbell 1.53 // NOTE: even if this error occurs in the middle, HTTPConnection will
198 // flush the entire queued message and reformat.
|
199 brian.campbell 1.52 if (isChunkRequest == false)
200 message = formatError(name, messageId, httpMethod, cimException);
201
202 // uri encode the error (for the http header) only when it is
203 // non-chunking or the first error with chunking
204 if (isChunkRequest == false || (isChunkRequest == true && isFirst == true))
|
205 brian.campbell 1.49 {
|
206 brian.campbell 1.52 String msg = TraceableCIMException(cimException).getDescription();
207 String uriEncodedMsg = XmlWriter::encodeURICharacters(msg);
|
208 brian.campbell 1.53 CIMException cimExceptionUri(cimException.getCode(), uriEncodedMsg);
209 cimExceptionUri.setContentLanguages(cimException.getContentLanguages());
210 cimException = cimExceptionUri;
|
211 brian.campbell 1.49 }
|
212 mike 1.2
|
213 brian.campbell 1.52 } // if first error in response stream
|
214 mike 1.2
|
215 brian.campbell 1.52 // never put the error in chunked response (because it will end up in
|
216 brian.campbell 1.53 // the trailer), so just use the non-error response formatter to send
|
217 brian.campbell 1.52 // more data
218
219 if (isChunkRequest == true)
220 {
|
221 brian.campbell 1.53 message = formatResponse(cimName, messageId, httpMethod, contentLanguage,
222 body, serverTime, isFirst, isLast);
|
223 brian.campbell 1.52 }
224 }
225 else
226 {
227 // else non-error condition
|
228 w.white 1.56 try
|
229 brian.campbell 1.52 {
|
230 brian.campbell 1.53 message = formatResponse(cimName, messageId, httpMethod, contentLanguage,
231 body, serverTime, isFirst, isLast);
|
232 brian.campbell 1.52 }
233
234 #ifdef PEGASUS_PLATFORM_WIN32_IX86_MSVC
235 catch (std::bad_alloc&)
236 #else
237 catch (bad_alloc&)
238 #endif
239 {
240 Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
241 funcname + OUT_OF_MEMORY_MESSAGE);
242
243 cimException = PEGASUS_CIM_EXCEPTION_L
244 (CIM_ERR_FAILED,
245 MessageLoaderParms("Server.CIMOperationResponseEncoder.OUT_OF_MEMORY",
246 OUT_OF_MEMORY_MESSAGE));
247 // try again with new error and no body
248 body.clear();
249 sendResponse(response, name, isImplicit);
250 return;
251 }
252
253 brian.campbell 1.52 STAT_BYTESSENT
254
255 }
256
257 AutoPtr<HTTPMessage> httpMessage(new HTTPMessage(message, 0, &cimException));
258 httpMessage->setComplete(isLast);
259 httpMessage->setIndex(messageIndex);
|
260 brian.campbell 1.53
261 if (cimException.getCode() != CIM_ERR_SUCCESS)
262 {
263 httpMessage->contentLanguages = cimException.getContentLanguages();
264 }
265 else
266 {
267 const OperationContext::Container &container =
268 response->operationContext.get(ContentLanguageListContainer::NAME);
269 const ContentLanguageListContainer &listContainer =
270 *dynamic_cast<const ContentLanguageListContainer *>(&container);
271 contentLanguage = listContainer.getLanguages();
272 httpMessage->contentLanguages = contentLanguage;
273 }
274
|
275 j.alex 1.59 Tracer::traceBuffer(
276 TRC_XML_IO,
277 Tracer::LEVEL2,
278 httpMessage->message.getData(),
279 httpMessage->message.size());
|
280 brian.campbell 1.52
|
281 mike 1.63 PEG_LOGGER_TRACE((
|
282 j.alex 1.59 Logger::STANDARD_LOG,
283 System::CIMSERVER,
284 Logger::TRACE,
285 "CIMOperationResponseEncoder::sendResponse - QueueId: $0 "
286 "XML content: $1",queueId,
|
287 mike 1.63 String(message.getData(), message.size())));
|
288 brian.campbell 1.52
|
289 j.alex 1.59 httpMessage->setCloseConnect(closeConnect);
|
290 brian.campbell 1.52 queue->enqueue(httpMessage.release());
291
292 PEG_METHOD_EXIT();
|
293 mday 1.9 }
294
|
295 kumpf 1.67 void CIMOperationResponseEncoder::enqueue(Message *message)
296 {
297 handleEnqueue(message);
298 }
299
|
300 mday 1.9 void CIMOperationResponseEncoder::handleEnqueue(Message *message)
301 {
|
302 kumpf 1.14 PEG_METHOD_ENTER(TRC_DISPATCHER,
303 "CIMOperationResponseEncoder::handleEnqueue()");
304
|
305 mday 1.9 if (!message)
306 {
|
307 kumpf 1.14 PEG_METHOD_EXIT();
|
308 mday 1.9 return;
309 }
|
310 j.alex 1.59
311 Tracer::trace(
312 TRC_HTTP,
313 Tracer::LEVEL3,
314 "CIMOperationResponseEncoder::handleEnque()- message->getCloseConnect() returned %d",
315 message->getCloseConnect());
316
|
317 mday 1.9
318 switch (message->getType())
319 {
320 case CIM_GET_CLASS_RESPONSE_MESSAGE:
321 encodeGetClassResponse(
322 (CIMGetClassResponseMessage*)message);
323 break;
324
325 case CIM_GET_INSTANCE_RESPONSE_MESSAGE:
326 encodeGetInstanceResponse(
327 (CIMGetInstanceResponseMessage*)message);
328 break;
329
330 case CIM_DELETE_CLASS_RESPONSE_MESSAGE:
331 encodeDeleteClassResponse(
332 (CIMDeleteClassResponseMessage*)message);
333 break;
334
335 case CIM_DELETE_INSTANCE_RESPONSE_MESSAGE:
336 encodeDeleteInstanceResponse(
337 (CIMDeleteInstanceResponseMessage*)message);
338 mday 1.9 break;
339
340 case CIM_CREATE_CLASS_RESPONSE_MESSAGE:
341 encodeCreateClassResponse(
342 (CIMCreateClassResponseMessage*)message);
343 break;
344
345 case CIM_CREATE_INSTANCE_RESPONSE_MESSAGE:
346 encodeCreateInstanceResponse(
347 (CIMCreateInstanceResponseMessage*)message);
348 break;
349
350 case CIM_MODIFY_CLASS_RESPONSE_MESSAGE:
351 encodeModifyClassResponse(
352 (CIMModifyClassResponseMessage*)message);
353 break;
354
355 case CIM_MODIFY_INSTANCE_RESPONSE_MESSAGE:
356 encodeModifyInstanceResponse(
357 (CIMModifyInstanceResponseMessage*)message);
358 break;
359 mday 1.9
360 case CIM_ENUMERATE_CLASSES_RESPONSE_MESSAGE:
361 encodeEnumerateClassesResponse(
362 (CIMEnumerateClassesResponseMessage*)message);
363 break;
364
365 case CIM_ENUMERATE_CLASS_NAMES_RESPONSE_MESSAGE:
366 encodeEnumerateClassNamesResponse(
367 (CIMEnumerateClassNamesResponseMessage*)message);
368 break;
369
370 case CIM_ENUMERATE_INSTANCES_RESPONSE_MESSAGE:
371 encodeEnumerateInstancesResponse(
372 (CIMEnumerateInstancesResponseMessage*)message);
373 break;
374
375 case CIM_ENUMERATE_INSTANCE_NAMES_RESPONSE_MESSAGE:
376 encodeEnumerateInstanceNamesResponse(
377 (CIMEnumerateInstanceNamesResponseMessage*)message);
378 break;
379
380 mday 1.9 case CIM_EXEC_QUERY_RESPONSE_MESSAGE:
|
381 kumpf 1.14 encodeExecQueryResponse(
382 (CIMExecQueryResponseMessage*)message);
|
383 mday 1.9 break;
384
385 case CIM_ASSOCIATORS_RESPONSE_MESSAGE:
386 encodeAssociatorsResponse(
387 (CIMAssociatorsResponseMessage*)message);
388 break;
389
390 case CIM_ASSOCIATOR_NAMES_RESPONSE_MESSAGE:
391 encodeAssociatorNamesResponse(
392 (CIMAssociatorNamesResponseMessage*)message);
393 break;
394
395 case CIM_REFERENCES_RESPONSE_MESSAGE:
396 encodeReferencesResponse(
397 (CIMReferencesResponseMessage*)message);
398 break;
399
400 case CIM_REFERENCE_NAMES_RESPONSE_MESSAGE:
401 encodeReferenceNamesResponse(
402 (CIMReferenceNamesResponseMessage*)message);
403 break;
404 mday 1.9
405 case CIM_GET_PROPERTY_RESPONSE_MESSAGE:
406 encodeGetPropertyResponse(
407 (CIMGetPropertyResponseMessage*)message);
408 break;
409
410 case CIM_SET_PROPERTY_RESPONSE_MESSAGE:
411 encodeSetPropertyResponse(
412 (CIMSetPropertyResponseMessage*)message);
413 break;
414
415 case CIM_GET_QUALIFIER_RESPONSE_MESSAGE:
416 encodeGetQualifierResponse(
417 (CIMGetQualifierResponseMessage*)message);
418 break;
419
420 case CIM_SET_QUALIFIER_RESPONSE_MESSAGE:
421 encodeSetQualifierResponse(
422 (CIMSetQualifierResponseMessage*)message);
423 break;
424
425 mday 1.9 case CIM_DELETE_QUALIFIER_RESPONSE_MESSAGE:
426 encodeDeleteQualifierResponse(
427 (CIMDeleteQualifierResponseMessage*)message);
428 break;
429
430 case CIM_ENUMERATE_QUALIFIERS_RESPONSE_MESSAGE:
431 encodeEnumerateQualifiersResponse(
432 (CIMEnumerateQualifiersResponseMessage*)message);
433 break;
434
435 case CIM_INVOKE_METHOD_RESPONSE_MESSAGE:
436 encodeInvokeMethodResponse(
437 (CIMInvokeMethodResponseMessage*)message);
438 break;
439 }
|
440 kumpf 1.4
|
441 brian.campbell 1.46 delete message;
|
442 mday 1.8
|
443 kumpf 1.14 PEG_METHOD_EXIT();
|
444 mday 1.9
445 return;
|
446 mday 1.8
|
447 mday 1.9 }
|
448 mday 1.8
449
|
450 mike 1.2 void CIMOperationResponseEncoder::handleEnqueue()
451 {
|
452 kumpf 1.4
|
453 mday 1.9 Message* message = dequeue();
454 if(message)
455 handleEnqueue(message);
|
456 mike 1.2 }
457
|
458 chuck 1.33 // l10n - added content language support below
459
|
460 mike 1.2 void CIMOperationResponseEncoder::encodeCreateClassResponse(
|
461 mday 1.9 CIMCreateClassResponseMessage* response)
|
462 mike 1.2 {
|
463 brian.campbell 1.52 sendResponse(response, "CreateClass", true);
|
464 mike 1.2 }
465
466 void CIMOperationResponseEncoder::encodeGetClassResponse(
|
467 mday 1.9 CIMGetClassResponseMessage* response)
|
468 mike 1.2 {
|
469 mike 1.60 Buffer body;
|
470 brian.campbell 1.52 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
471 XmlWriter::appendClassElement(body, response->cimClass);
472 sendResponse(response, "GetClass", true, &body);
|
473 mike 1.2 }
474
475 void CIMOperationResponseEncoder::encodeModifyClassResponse(
|
476 mday 1.9 CIMModifyClassResponseMessage* response)
|
477 mike 1.2 {
|
478 brian.campbell 1.52 sendResponse(response, "ModifyClass", true);
|
479 mike 1.2 }
480
481 void CIMOperationResponseEncoder::encodeEnumerateClassNamesResponse(
|
482 mday 1.9 CIMEnumerateClassNamesResponseMessage* response)
|
483 mike 1.2 {
|
484 mike 1.60 Buffer body;
|
485 brian.campbell 1.52 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
486 for (Uint32 i = 0, n = response->classNames.size(); i < n; i++)
487 XmlWriter::appendClassNameElement(body, response->classNames[i]);
488 sendResponse(response, "EnumerateClassNames", true, &body);
|
489 mike 1.2 }
490
491 void CIMOperationResponseEncoder::encodeEnumerateClassesResponse(
|
492 mday 1.9 CIMEnumerateClassesResponseMessage* response)
|
493 mike 1.2 {
|
494 mike 1.60 Buffer body;
|
495 brian.campbell 1.52 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
496 for (Uint32 i = 0, n= response->cimClasses.size(); i < n; i++)
497 XmlWriter::appendClassElement(body, response->cimClasses[i]);
498 sendResponse(response, "EnumerateClasses", true, &body);
|
499 mike 1.2 }
500
501 void CIMOperationResponseEncoder::encodeDeleteClassResponse(
|
502 mday 1.9 CIMDeleteClassResponseMessage* response)
|
503 mike 1.2 {
|
504 brian.campbell 1.52 sendResponse(response, "DeleteClass", true);
|
505 mike 1.2 }
506
507 void CIMOperationResponseEncoder::encodeCreateInstanceResponse(
|
508 mday 1.9 CIMCreateInstanceResponseMessage* response)
|
509 mike 1.2 {
|
510 mike 1.60 Buffer body;
|
511 brian.campbell 1.52 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
512 XmlWriter::appendInstanceNameElement(body, response->instanceName);
513 sendResponse(response, "CreateInstance", true, &body);
|
514 mike 1.2 }
515
516 void CIMOperationResponseEncoder::encodeGetInstanceResponse(
|
517 mday 1.9 CIMGetInstanceResponseMessage* response)
|
518 mike 1.2 {
|
519 mike 1.60 Buffer body;
|
520 brian.campbell 1.52 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
521 XmlWriter::appendInstanceElement(body, response->cimInstance);
522 sendResponse(response, "GetInstance", true, &body);
|
523 mike 1.2 }
524
525 void CIMOperationResponseEncoder::encodeModifyInstanceResponse(
|
526 mday 1.9 CIMModifyInstanceResponseMessage* response)
|
527 mike 1.2 {
|
528 brian.campbell 1.52 sendResponse(response, "ModifyInstance", true);
|
529 mike 1.2 }
530
531 void CIMOperationResponseEncoder::encodeEnumerateInstancesResponse(
|
532 mday 1.9 CIMEnumerateInstancesResponseMessage* response)
|
533 mike 1.2 {
|
534 mike 1.60 Buffer body;
|
535 brian.campbell 1.52 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
536 for (Uint32 i = 0, n = response->cimNamedInstances.size(); i < n; i++)
537 XmlWriter::appendValueNamedInstanceElement(body, response->cimNamedInstances[i]);
538 sendResponse(response, "EnumerateInstances", true, &body);
|
539 mike 1.2 }
540
541 void CIMOperationResponseEncoder::encodeEnumerateInstanceNamesResponse(
|
542 mday 1.9 CIMEnumerateInstanceNamesResponseMessage* response)
|
543 mike 1.2 {
|
544 mike 1.60 Buffer body;
|
545 brian.campbell 1.52 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
546 for (Uint32 i = 0, n = response->instanceNames.size(); i < n; i++)
547 XmlWriter::appendInstanceNameElement(body, response->instanceNames[i]);
548 sendResponse(response, "EnumerateInstanceNames", true, &body);
|
549 mike 1.2 }
550
551 void CIMOperationResponseEncoder::encodeDeleteInstanceResponse(
|
552 mday 1.9 CIMDeleteInstanceResponseMessage* response)
|
553 mike 1.2 {
|
554 brian.campbell 1.52 sendResponse(response, "DeleteInstance", true);
|
555 mike 1.2 }
556
557 void CIMOperationResponseEncoder::encodeGetPropertyResponse(
|
558 mday 1.9 CIMGetPropertyResponseMessage* response)
|
559 mike 1.2 {
|
560 mike 1.60 Buffer body;
|
561 brian.campbell 1.52 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
562 XmlWriter::appendValueElement(body, response->value);
563 sendResponse(response, "GetProperty", true, &body);
|
564 mike 1.2 }
565
566 void CIMOperationResponseEncoder::encodeSetPropertyResponse(
|
567 mday 1.9 CIMSetPropertyResponseMessage* response)
|
568 mike 1.2 {
|
569 brian.campbell 1.52 sendResponse(response, "SetProperty", true);
|
570 mike 1.2 }
571
572 void CIMOperationResponseEncoder::encodeSetQualifierResponse(
|
573 mday 1.9 CIMSetQualifierResponseMessage* response)
|
574 mike 1.2 {
|
575 brian.campbell 1.52 sendResponse(response, "SetQualifier", true);
|
576 mike 1.2 }
577
578 void CIMOperationResponseEncoder::encodeGetQualifierResponse(
|
579 mday 1.9 CIMGetQualifierResponseMessage* response)
|
580 mike 1.2 {
|
581 mike 1.60 Buffer body;
|
582 brian.campbell 1.52 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
583 XmlWriter::appendQualifierDeclElement(body, response->cimQualifierDecl);
584 sendResponse(response, "GetQualifier", true, &body);
|
585 mike 1.2 }
586
587 void CIMOperationResponseEncoder::encodeEnumerateQualifiersResponse(
|
588 mday 1.9 CIMEnumerateQualifiersResponseMessage* response)
|
589 mike 1.2 {
|
590 mike 1.60 Buffer body;
|
591 brian.campbell 1.52 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
592 for (Uint32 i = 0, n = response->qualifierDeclarations.size(); i < n;i++)
593 XmlWriter::appendQualifierDeclElement(body, response->qualifierDeclarations[i]);
594 sendResponse(response, "EnumerateQualifiers", true, &body);
|
595 mike 1.2 }
596
597 void CIMOperationResponseEncoder::encodeDeleteQualifierResponse(
|
598 mday 1.9 CIMDeleteQualifierResponseMessage* response)
|
599 mike 1.2 {
|
600 brian.campbell 1.52 sendResponse(response, "DeleteQualifier", true);
|
601 mike 1.2 }
602
603 void CIMOperationResponseEncoder::encodeReferenceNamesResponse(
|
604 mday 1.9 CIMReferenceNamesResponseMessage* response)
|
605 mike 1.2 {
|
606 mike 1.60 Buffer body;
|
607 brian.campbell 1.52 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(body, response->objectNames[i],
612 false);
613 body << "</OBJECTPATH>\n";
614 }
615 sendResponse(response, "ReferenceNames", true, &body);
|
616 mike 1.2 }
617
618 void CIMOperationResponseEncoder::encodeReferencesResponse(
|
619 mday 1.9 CIMReferencesResponseMessage* response)
|
620 mike 1.2 {
|
621 mike 1.60 Buffer body;
|
622 brian.campbell 1.52 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
623 for (Uint32 i = 0, n = response->cimObjects.size(); i < n;i++)
624 XmlWriter::appendValueObjectWithPathElement(body, response->cimObjects[i]);
625 sendResponse(response, "References", true, &body);
|
626 mike 1.2 }
627
628 void CIMOperationResponseEncoder::encodeAssociatorNamesResponse(
|
629 mday 1.9 CIMAssociatorNamesResponseMessage* response)
|
630 mike 1.2 {
|
631 mike 1.60 Buffer body;
|
632 brian.campbell 1.52 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
633 for (Uint32 i = 0, n = response->objectNames.size(); i < n; i++)
634 {
635 body << "<OBJECTPATH>\n";
636 XmlWriter::appendValueReferenceElement(body, response->objectNames[i], false);
637 body << "</OBJECTPATH>\n";
638 }
639 sendResponse(response, "AssociatorNames", true, &body);
|
640 mike 1.2 }
641
642 void CIMOperationResponseEncoder::encodeAssociatorsResponse(
|
643 mday 1.9 CIMAssociatorsResponseMessage* response)
|
644 mike 1.2 {
|
645 mike 1.60 Buffer body;
|
646 brian.campbell 1.52 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
647 for (Uint32 i = 0, n = response->cimObjects.size(); i < n; i++)
648 XmlWriter::appendValueObjectWithPathElement(body, response->cimObjects[i]);
649 sendResponse(response, "Associators", true, &body);
|
650 kumpf 1.14 }
651
652 void CIMOperationResponseEncoder::encodeExecQueryResponse(
653 CIMExecQueryResponseMessage* response)
654 {
|
655 mike 1.60 Buffer body;
|
656 brian.campbell 1.52 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
657 for (Uint32 i = 0; i < response->cimObjects.size(); i++)
658 XmlWriter::appendValueObjectWithPathElement(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 mike 1.60 Buffer body;
|
666 mday 1.9
667 // ATTN-RK-P3-20020219: Who's job is it to make sure the return value is
668 // not an array?
|
669 kumpf 1.17 // Only add the return value if it is not null
|
670 w.white 1.47
|
671 brian.campbell 1.52 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(body, response->outParameters[i]);
678 }
679 sendResponse(response, response->methodName.getString(), false, &body);
|
680 mike 1.2 }
681
682 PEGASUS_NAMESPACE_END
|