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 void CIMOperationResponseEncoder::handleEnqueue(Message *message)
291 {
|
292 kumpf 1.14 PEG_METHOD_ENTER(TRC_DISPATCHER,
293 "CIMOperationResponseEncoder::handleEnqueue()");
294
|
295 mday 1.9 if (!message)
296 {
|
297 kumpf 1.14 PEG_METHOD_EXIT();
|
298 mday 1.9 return;
299 }
|
300 j.alex 1.59
301 Tracer::trace(
302 TRC_HTTP,
303 Tracer::LEVEL3,
304 "CIMOperationResponseEncoder::handleEnque()- message->getCloseConnect() returned %d",
305 message->getCloseConnect());
306
|
307 mday 1.9
308 switch (message->getType())
309 {
310 case CIM_GET_CLASS_RESPONSE_MESSAGE:
311 encodeGetClassResponse(
312 (CIMGetClassResponseMessage*)message);
313 break;
314
315 case CIM_GET_INSTANCE_RESPONSE_MESSAGE:
316 encodeGetInstanceResponse(
317 (CIMGetInstanceResponseMessage*)message);
318 break;
319
320 case CIM_DELETE_CLASS_RESPONSE_MESSAGE:
321 encodeDeleteClassResponse(
322 (CIMDeleteClassResponseMessage*)message);
323 break;
324
325 case CIM_DELETE_INSTANCE_RESPONSE_MESSAGE:
326 encodeDeleteInstanceResponse(
327 (CIMDeleteInstanceResponseMessage*)message);
328 mday 1.9 break;
329
330 case CIM_CREATE_CLASS_RESPONSE_MESSAGE:
331 encodeCreateClassResponse(
332 (CIMCreateClassResponseMessage*)message);
333 break;
334
335 case CIM_CREATE_INSTANCE_RESPONSE_MESSAGE:
336 encodeCreateInstanceResponse(
337 (CIMCreateInstanceResponseMessage*)message);
338 break;
339
340 case CIM_MODIFY_CLASS_RESPONSE_MESSAGE:
341 encodeModifyClassResponse(
342 (CIMModifyClassResponseMessage*)message);
343 break;
344
345 case CIM_MODIFY_INSTANCE_RESPONSE_MESSAGE:
346 encodeModifyInstanceResponse(
347 (CIMModifyInstanceResponseMessage*)message);
348 break;
349 mday 1.9
350 case CIM_ENUMERATE_CLASSES_RESPONSE_MESSAGE:
351 encodeEnumerateClassesResponse(
352 (CIMEnumerateClassesResponseMessage*)message);
353 break;
354
355 case CIM_ENUMERATE_CLASS_NAMES_RESPONSE_MESSAGE:
356 encodeEnumerateClassNamesResponse(
357 (CIMEnumerateClassNamesResponseMessage*)message);
358 break;
359
360 case CIM_ENUMERATE_INSTANCES_RESPONSE_MESSAGE:
361 encodeEnumerateInstancesResponse(
362 (CIMEnumerateInstancesResponseMessage*)message);
363 break;
364
365 case CIM_ENUMERATE_INSTANCE_NAMES_RESPONSE_MESSAGE:
366 encodeEnumerateInstanceNamesResponse(
367 (CIMEnumerateInstanceNamesResponseMessage*)message);
368 break;
369
370 mday 1.9 case CIM_EXEC_QUERY_RESPONSE_MESSAGE:
|
371 kumpf 1.14 encodeExecQueryResponse(
372 (CIMExecQueryResponseMessage*)message);
|
373 mday 1.9 break;
374
375 case CIM_ASSOCIATORS_RESPONSE_MESSAGE:
376 encodeAssociatorsResponse(
377 (CIMAssociatorsResponseMessage*)message);
378 break;
379
380 case CIM_ASSOCIATOR_NAMES_RESPONSE_MESSAGE:
381 encodeAssociatorNamesResponse(
382 (CIMAssociatorNamesResponseMessage*)message);
383 break;
384
385 case CIM_REFERENCES_RESPONSE_MESSAGE:
386 encodeReferencesResponse(
387 (CIMReferencesResponseMessage*)message);
388 break;
389
390 case CIM_REFERENCE_NAMES_RESPONSE_MESSAGE:
391 encodeReferenceNamesResponse(
392 (CIMReferenceNamesResponseMessage*)message);
393 break;
394 mday 1.9
395 case CIM_GET_PROPERTY_RESPONSE_MESSAGE:
396 encodeGetPropertyResponse(
397 (CIMGetPropertyResponseMessage*)message);
398 break;
399
400 case CIM_SET_PROPERTY_RESPONSE_MESSAGE:
401 encodeSetPropertyResponse(
402 (CIMSetPropertyResponseMessage*)message);
403 break;
404
405 case CIM_GET_QUALIFIER_RESPONSE_MESSAGE:
406 encodeGetQualifierResponse(
407 (CIMGetQualifierResponseMessage*)message);
408 break;
409
410 case CIM_SET_QUALIFIER_RESPONSE_MESSAGE:
411 encodeSetQualifierResponse(
412 (CIMSetQualifierResponseMessage*)message);
413 break;
414
415 mday 1.9 case CIM_DELETE_QUALIFIER_RESPONSE_MESSAGE:
416 encodeDeleteQualifierResponse(
417 (CIMDeleteQualifierResponseMessage*)message);
418 break;
419
420 case CIM_ENUMERATE_QUALIFIERS_RESPONSE_MESSAGE:
421 encodeEnumerateQualifiersResponse(
422 (CIMEnumerateQualifiersResponseMessage*)message);
423 break;
424
425 case CIM_INVOKE_METHOD_RESPONSE_MESSAGE:
426 encodeInvokeMethodResponse(
427 (CIMInvokeMethodResponseMessage*)message);
428 break;
429 }
|
430 kumpf 1.4
|
431 brian.campbell 1.46 delete message;
|
432 mday 1.8
|
433 kumpf 1.14 PEG_METHOD_EXIT();
|
434 mday 1.9
435 return;
|
436 mday 1.8
|
437 mday 1.9 }
|
438 mday 1.8
439
|
440 mike 1.2 void CIMOperationResponseEncoder::handleEnqueue()
441 {
|
442 kumpf 1.4
|
443 mday 1.9 Message* message = dequeue();
444 if(message)
445 handleEnqueue(message);
|
446 mike 1.2 }
447
|
448 chuck 1.33 // l10n - added content language support below
449
|
450 mike 1.2 void CIMOperationResponseEncoder::encodeCreateClassResponse(
|
451 mday 1.9 CIMCreateClassResponseMessage* response)
|
452 mike 1.2 {
|
453 brian.campbell 1.52 sendResponse(response, "CreateClass", true);
|
454 mike 1.2 }
455
456 void CIMOperationResponseEncoder::encodeGetClassResponse(
|
457 mday 1.9 CIMGetClassResponseMessage* response)
|
458 mike 1.2 {
|
459 mike 1.60 Buffer body;
|
460 brian.campbell 1.52 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
461 XmlWriter::appendClassElement(body, response->cimClass);
462 sendResponse(response, "GetClass", true, &body);
|
463 mike 1.2 }
464
465 void CIMOperationResponseEncoder::encodeModifyClassResponse(
|
466 mday 1.9 CIMModifyClassResponseMessage* response)
|
467 mike 1.2 {
|
468 brian.campbell 1.52 sendResponse(response, "ModifyClass", true);
|
469 mike 1.2 }
470
471 void CIMOperationResponseEncoder::encodeEnumerateClassNamesResponse(
|
472 mday 1.9 CIMEnumerateClassNamesResponseMessage* response)
|
473 mike 1.2 {
|
474 mike 1.60 Buffer body;
|
475 brian.campbell 1.52 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
476 for (Uint32 i = 0, n = response->classNames.size(); i < n; i++)
477 XmlWriter::appendClassNameElement(body, response->classNames[i]);
478 sendResponse(response, "EnumerateClassNames", true, &body);
|
479 mike 1.2 }
480
481 void CIMOperationResponseEncoder::encodeEnumerateClassesResponse(
|
482 mday 1.9 CIMEnumerateClassesResponseMessage* 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->cimClasses.size(); i < n; i++)
487 XmlWriter::appendClassElement(body, response->cimClasses[i]);
488 sendResponse(response, "EnumerateClasses", true, &body);
|
489 mike 1.2 }
490
491 void CIMOperationResponseEncoder::encodeDeleteClassResponse(
|
492 mday 1.9 CIMDeleteClassResponseMessage* response)
|
493 mike 1.2 {
|
494 brian.campbell 1.52 sendResponse(response, "DeleteClass", true);
|
495 mike 1.2 }
496
497 void CIMOperationResponseEncoder::encodeCreateInstanceResponse(
|
498 mday 1.9 CIMCreateInstanceResponseMessage* response)
|
499 mike 1.2 {
|
500 mike 1.60 Buffer body;
|
501 brian.campbell 1.52 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
502 XmlWriter::appendInstanceNameElement(body, response->instanceName);
503 sendResponse(response, "CreateInstance", true, &body);
|
504 mike 1.2 }
505
506 void CIMOperationResponseEncoder::encodeGetInstanceResponse(
|
507 mday 1.9 CIMGetInstanceResponseMessage* response)
|
508 mike 1.2 {
|
509 mike 1.60 Buffer body;
|
510 brian.campbell 1.52 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
511 XmlWriter::appendInstanceElement(body, response->cimInstance);
512 sendResponse(response, "GetInstance", true, &body);
|
513 mike 1.2 }
514
515 void CIMOperationResponseEncoder::encodeModifyInstanceResponse(
|
516 mday 1.9 CIMModifyInstanceResponseMessage* response)
|
517 mike 1.2 {
|
518 brian.campbell 1.52 sendResponse(response, "ModifyInstance", true);
|
519 mike 1.2 }
520
521 void CIMOperationResponseEncoder::encodeEnumerateInstancesResponse(
|
522 mday 1.9 CIMEnumerateInstancesResponseMessage* response)
|
523 mike 1.2 {
|
524 mike 1.60 Buffer body;
|
525 brian.campbell 1.52 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
526 for (Uint32 i = 0, n = response->cimNamedInstances.size(); i < n; i++)
527 XmlWriter::appendValueNamedInstanceElement(body, response->cimNamedInstances[i]);
528 sendResponse(response, "EnumerateInstances", true, &body);
|
529 mike 1.2 }
530
531 void CIMOperationResponseEncoder::encodeEnumerateInstanceNamesResponse(
|
532 mday 1.9 CIMEnumerateInstanceNamesResponseMessage* 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->instanceNames.size(); i < n; i++)
537 XmlWriter::appendInstanceNameElement(body, response->instanceNames[i]);
538 sendResponse(response, "EnumerateInstanceNames", true, &body);
|
539 mike 1.2 }
540
541 void CIMOperationResponseEncoder::encodeDeleteInstanceResponse(
|
542 mday 1.9 CIMDeleteInstanceResponseMessage* response)
|
543 mike 1.2 {
|
544 brian.campbell 1.52 sendResponse(response, "DeleteInstance", true);
|
545 mike 1.2 }
546
547 void CIMOperationResponseEncoder::encodeGetPropertyResponse(
|
548 mday 1.9 CIMGetPropertyResponseMessage* response)
|
549 mike 1.2 {
|
550 mike 1.60 Buffer body;
|
551 brian.campbell 1.52 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
552 XmlWriter::appendValueElement(body, response->value);
553 sendResponse(response, "GetProperty", true, &body);
|
554 mike 1.2 }
555
556 void CIMOperationResponseEncoder::encodeSetPropertyResponse(
|
557 mday 1.9 CIMSetPropertyResponseMessage* response)
|
558 mike 1.2 {
|
559 brian.campbell 1.52 sendResponse(response, "SetProperty", true);
|
560 mike 1.2 }
561
562 void CIMOperationResponseEncoder::encodeSetQualifierResponse(
|
563 mday 1.9 CIMSetQualifierResponseMessage* response)
|
564 mike 1.2 {
|
565 brian.campbell 1.52 sendResponse(response, "SetQualifier", true);
|
566 mike 1.2 }
567
568 void CIMOperationResponseEncoder::encodeGetQualifierResponse(
|
569 mday 1.9 CIMGetQualifierResponseMessage* response)
|
570 mike 1.2 {
|
571 mike 1.60 Buffer body;
|
572 brian.campbell 1.52 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
573 XmlWriter::appendQualifierDeclElement(body, response->cimQualifierDecl);
574 sendResponse(response, "GetQualifier", true, &body);
|
575 mike 1.2 }
576
577 void CIMOperationResponseEncoder::encodeEnumerateQualifiersResponse(
|
578 mday 1.9 CIMEnumerateQualifiersResponseMessage* response)
|
579 mike 1.2 {
|
580 mike 1.60 Buffer body;
|
581 brian.campbell 1.52 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
582 for (Uint32 i = 0, n = response->qualifierDeclarations.size(); i < n;i++)
583 XmlWriter::appendQualifierDeclElement(body, response->qualifierDeclarations[i]);
584 sendResponse(response, "EnumerateQualifiers", true, &body);
|
585 mike 1.2 }
586
587 void CIMOperationResponseEncoder::encodeDeleteQualifierResponse(
|
588 mday 1.9 CIMDeleteQualifierResponseMessage* response)
|
589 mike 1.2 {
|
590 brian.campbell 1.52 sendResponse(response, "DeleteQualifier", true);
|
591 mike 1.2 }
592
593 void CIMOperationResponseEncoder::encodeReferenceNamesResponse(
|
594 mday 1.9 CIMReferenceNamesResponseMessage* response)
|
595 mike 1.2 {
|
596 mike 1.60 Buffer body;
|
597 brian.campbell 1.52 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
598 for (Uint32 i = 0, n = response->objectNames.size(); i < n; i++)
599 {
600 body << "<OBJECTPATH>\n";
601 XmlWriter::appendValueReferenceElement(body, response->objectNames[i],
602 false);
603 body << "</OBJECTPATH>\n";
604 }
605 sendResponse(response, "ReferenceNames", true, &body);
|
606 mike 1.2 }
607
608 void CIMOperationResponseEncoder::encodeReferencesResponse(
|
609 mday 1.9 CIMReferencesResponseMessage* response)
|
610 mike 1.2 {
|
611 mike 1.60 Buffer body;
|
612 brian.campbell 1.52 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
613 for (Uint32 i = 0, n = response->cimObjects.size(); i < n;i++)
614 XmlWriter::appendValueObjectWithPathElement(body, response->cimObjects[i]);
615 sendResponse(response, "References", true, &body);
|
616 mike 1.2 }
617
618 void CIMOperationResponseEncoder::encodeAssociatorNamesResponse(
|
619 mday 1.9 CIMAssociatorNamesResponseMessage* 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->objectNames.size(); i < n; i++)
624 {
625 body << "<OBJECTPATH>\n";
626 XmlWriter::appendValueReferenceElement(body, response->objectNames[i], false);
627 body << "</OBJECTPATH>\n";
628 }
629 sendResponse(response, "AssociatorNames", true, &body);
|
630 mike 1.2 }
631
632 void CIMOperationResponseEncoder::encodeAssociatorsResponse(
|
633 mday 1.9 CIMAssociatorsResponseMessage* response)
|
634 mike 1.2 {
|
635 mike 1.60 Buffer body;
|
636 brian.campbell 1.52 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
637 for (Uint32 i = 0, n = response->cimObjects.size(); i < n; i++)
638 XmlWriter::appendValueObjectWithPathElement(body, response->cimObjects[i]);
639 sendResponse(response, "Associators", true, &body);
|
640 kumpf 1.14 }
641
642 void CIMOperationResponseEncoder::encodeExecQueryResponse(
643 CIMExecQueryResponseMessage* response)
644 {
|
645 mike 1.60 Buffer body;
|
646 brian.campbell 1.52 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
647 for (Uint32 i = 0; i < response->cimObjects.size(); i++)
648 XmlWriter::appendValueObjectWithPathElement(body, response->cimObjects[i]);
649 sendResponse(response, "ExecQuery", true, &body);
|
650 mike 1.2 }
651
652 void CIMOperationResponseEncoder::encodeInvokeMethodResponse(
|
653 mday 1.26 CIMInvokeMethodResponseMessage* response)
|
654 mike 1.2 {
|
655 mike 1.60 Buffer body;
|
656 mday 1.9
657 // ATTN-RK-P3-20020219: Who's job is it to make sure the return value is
658 // not an array?
|
659 kumpf 1.17 // Only add the return value if it is not null
|
660 w.white 1.47
|
661 brian.campbell 1.52 if (response->cimException.getCode() == CIM_ERR_SUCCESS)
662 {
663 if (!response->retValue.isNull())
664 XmlWriter::appendReturnValueElement(body, response->retValue);
665
666 for (Uint32 i=0, n = response->outParameters.size(); i < n; i++)
667 XmlWriter::appendParamValueElement(body, response->outParameters[i]);
668 }
669 sendResponse(response, response->methodName.getString(), false, &body);
|
670 mike 1.2 }
671
672 PEGASUS_NAMESPACE_END
|