1 karl 1.61 //%2004////////////////////////////////////////////////////////////////////////
|
2 mike 1.2 //
|
3 karl 1.61 // 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.51 // IBM Corp.; EMC Corporation, The Open Group.
|
7 karl 1.61 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
8 // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
|
9 mike 1.2 //
10 // Permission is hereby granted, free of charge, to any person obtaining a copy
11 // of this software and associated documentation files (the "Software"), to
12 // deal in the Software without restriction, including without limitation the
13 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
14 // sell copies of the Software, and to permit persons to whom the Software is
15 // furnished to do so, subject to the following conditions:
|
16 kumpf 1.25 //
|
17 mike 1.2 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
18 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
19 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
20 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
21 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
22 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
23 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 //
26 //==============================================================================
27 //
28 // Author: Mike Brasher (mbrasher@bmc.com)
29 //
30 // Modified By: Nitin Upasani, Hewlett-Packard Company (Nitin_Upasani@hp.com)
31 // Yi Zhou, Hewlett-Packard Company (yi_zhou@hp.com)
32 // Nag Boranna, Hewlett-Packard Company (nagaraja_boranna@hp.com)
33 // Roger Kumpf, Hewlett-Packard Company (roger_kumpf@hp.com)
|
34 kumpf 1.23 // Carol Ann Krug Graves, Hewlett-Packard Company
35 // (carolann_graves@hp.com)
|
36 kumpf 1.36 // Sushma Fernandes, Hewlett-Packard Company
37 // (sushma_fernandes@hp.com)
|
38 david 1.38 // Dave Rosckes (rosckes@us.ibm.com)
|
39 kumpf 1.60 // Seema Gupta (gseema@in.ibm.com) for PEP135
40 // Brian G. Campbell, EMC (campbell_brian@emc.com) - PEP140/phase1
|
41 mike 1.2 //
42 //%/////////////////////////////////////////////////////////////////////////////
43
44 #include <Pegasus/Common/Config.h>
45 #include <iostream>
|
46 kumpf 1.15 #include <Pegasus/Common/Constants.h>
|
47 mike 1.2 #include <Pegasus/Common/XmlParser.h>
48 #include <Pegasus/Common/XmlReader.h>
49 #include <Pegasus/Common/System.h>
50 #include <Pegasus/Common/XmlWriter.h>
51 #include <Pegasus/Common/HTTPMessage.h>
52 #include <Pegasus/Common/CIMMessage.h>
|
53 kumpf 1.60 #include <Pegasus/Common/Exception.h>
|
54 mike 1.2 #include "CIMOperationResponseDecoder.h"
55
|
56 humberto 1.43 // l10n
57 #include <Pegasus/Common/MessageLoader.h>
58
|
59 mike 1.2 PEGASUS_USING_STD;
60
61 PEGASUS_NAMESPACE_BEGIN
62
63 CIMOperationResponseDecoder::CIMOperationResponseDecoder(
64 MessageQueue* outputQueue,
65 MessageQueue* encoderQueue,
|
66 karl 1.41 ClientAuthenticator* authenticator,
67 Uint32 showInput)
|
68 mike 1.2 :
|
69 kumpf 1.16 MessageQueue(PEGASUS_QUEUENAME_OPRESPDECODER),
|
70 mike 1.2 _outputQueue(outputQueue),
71 _encoderQueue(encoderQueue),
|
72 karl 1.41 _authenticator(authenticator),
73 _showInput(showInput)
|
74 mike 1.2 {
75 }
76
77 CIMOperationResponseDecoder::~CIMOperationResponseDecoder()
78 {
79
80 }
81
82 void CIMOperationResponseDecoder::setEncoderQueue(MessageQueue* encoderQueue)
83 {
84 _encoderQueue = encoderQueue;
85 }
86
87 void CIMOperationResponseDecoder::handleEnqueue()
88 {
89 Message* message = dequeue();
90
91 if (!message)
|
92 kumpf 1.60 return;
|
93 mike 1.2
94 switch (message->getType())
95 {
|
96 kumpf 1.60 case HTTP_MESSAGE:
97 {
98 HTTPMessage* httpMessage = (HTTPMessage*)message;
99 _handleHTTPMessage(httpMessage);
100 break;
101 }
|
102 mike 1.2
|
103 kumpf 1.60 default:
|
104 kumpf 1.17 PEGASUS_ASSERT(0);
|
105 kumpf 1.60 break;
|
106 mike 1.2 }
107
108 delete message;
109 }
110
111 void CIMOperationResponseDecoder::_handleHTTPMessage(HTTPMessage* httpMessage)
112 {
113 //
114 // Parse the HTTP message:
115 //
116
117 String startLine;
118 Array<HTTPHeader> headers;
|
119 david.dillard 1.63 char* content;
|
120 mike 1.2 Uint32 contentLength;
121
|
122 kumpf 1.19 if (httpMessage->message.size() == 0)
|
123 kumpf 1.60 {
124 // l10n
125
126 // CIMClientMalformedHTTPException* malformedHTTPException =
127 // new CIMClientMalformedHTTPException("Empty HTTP response message.");
128
129 MessageLoaderParms mlParms("Client.CIMOperationResponseDecoder.EMPTY_RESPONSE", "Empty HTTP response message.");
130 String mlString(MessageLoader::getMessage(mlParms));
131
132 CIMClientMalformedHTTPException* malformedHTTPException =
133 new CIMClientMalformedHTTPException(mlString);
134
135 ClientExceptionMessage * response =
136 new ClientExceptionMessage(malformedHTTPException);
137
138 _outputQueue->enqueue(response);
139 return;
140 }
|
141 kumpf 1.19
|
142 mike 1.2 httpMessage->parse(startLine, headers, contentLength);
143
|
144 kumpf 1.19 //
145 // Get the status line info
146 //
147 String httpVersion;
148 Uint32 statusCode;
149 String reasonPhrase;
150
151 Boolean parsableMessage = HTTPMessage::parseStatusLine(
152 startLine, httpVersion, statusCode, reasonPhrase);
153 if (!parsableMessage)
154 {
|
155 kumpf 1.60 // l10n
156
157 // CIMClientMalformedHTTPException* malformedHTTPException = new
158 // CIMClientMalformedHTTPException("Malformed HTTP response message.");
159
160 MessageLoaderParms mlParms("Client.CIMOperationResponseDecoder.MALFORMED_RESPONSE", "Malformed HTTP response message.");
161 String mlString(MessageLoader::getMessage(mlParms));
162
163 CIMClientMalformedHTTPException* malformedHTTPException =
164 new CIMClientMalformedHTTPException(mlString);
|
165 kumpf 1.19
|
166 kumpf 1.60 ClientExceptionMessage * response =
167 new ClientExceptionMessage(malformedHTTPException);
|
168 humberto 1.43
|
169 kumpf 1.60 _outputQueue->enqueue(response);
170 return;
|
171 kumpf 1.19 }
172
|
173 karl 1.41 #ifdef PEGASUS_CLIENT_TRACE_ENABLE
174 if (_showInput & 1)
175 {
176 cout << "CIMOperatonResponseDecoder";
177 httpMessage->printAll(cout);
178 }
179 if (_showInput & 2)
180 {
181 Uint32 size = httpMessage->message.size();
182 char* tmpBuf = new char[size+1];
183
184 strncpy( tmpBuf, httpMessage->message.getData(), size );
185 tmpBuf[size] = '\0';
186 Logger::put(Logger::STANDARD_LOG,
|
187 kumpf 1.60 "CIMCLIENT",
188 Logger::TRACE,
189 "CIMOperationRequestDecoder::Response, XML content: $1",
190 tmpBuf);
|
191 karl 1.41 delete []tmpBuf;
192 }
193 #endif
194
|
195 kumpf 1.8 try
|
196 mike 1.2 {
|
197 kumpf 1.8 if (_authenticator->checkResponseHeaderForChallenge(headers))
198 {
199 //
200 // Get the original request, put that in the encoder's queue for
201 // re-sending with authentication challenge response.
202 //
203 Message* reqMessage = _authenticator->getRequestMessage();
204 _encoderQueue->enqueue(reqMessage);
|
205 mike 1.2
|
206 kumpf 1.8 return;
207 }
208 else
209 {
210 //
211 // Received a valid/error response from the server.
212 // We do not need the original request message anymore, hence delete
213 // the request message by getting the handle from the ClientAuthenticator.
214 //
215 Message* reqMessage = _authenticator->getRequestMessage();
216 if (reqMessage)
217 {
|
218 kumpf 1.55 _authenticator->setRequestMessage(0);
|
219 kumpf 1.8 delete reqMessage;
220 }
221 }
|
222 mike 1.2 }
|
223 kumpf 1.8 catch(InvalidAuthHeader& e)
|
224 mike 1.2 {
|
225 kumpf 1.20 CIMClientMalformedHTTPException* malformedHTTPException =
226 new CIMClientMalformedHTTPException(e.getMessage());
|
227 kumpf 1.17 ClientExceptionMessage * response =
228 new ClientExceptionMessage(malformedHTTPException);
|
229 mike 1.2
|
230 kumpf 1.17 _outputQueue->enqueue(response);
|
231 kumpf 1.15 return;
232 }
|
233 kumpf 1.36
|
234 kumpf 1.52 // We have the response. If authentication failed, we will generate a
235 // CIMClientHTTPErrorException below with the "401 Unauthorized" status
236 // in the (re-challenge) response.
|
237 kumpf 1.15
238 //
239 // Check for a success (200 OK) response
240 //
|
241 kumpf 1.17 if (statusCode != HTTP_STATUSCODE_OK)
|
242 kumpf 1.15 {
243 String cimError;
244 String pegasusError;
245
|
246 brian.campbell 1.57 HTTPMessage::lookupHeader(headers, "CIMError", cimError, true);
|
247 kumpf 1.15 HTTPMessage::lookupHeader(headers, PEGASUS_HTTPHEADERTAG_ERRORDETAIL, pegasusError);
|
248 kumpf 1.35 try
249 {
250 pegasusError = XmlReader::decodeURICharacters(pegasusError);
251 }
|
252 brian.campbell 1.57 catch (ParseError&)
|
253 kumpf 1.35 {
254 // Ignore this exception. We're more interested in having the
255 // message in encoded form than knowing that the format is invalid.
256 }
|
257 kumpf 1.15
|
258 kumpf 1.32 CIMClientHTTPErrorException* httpError =
|
259 kumpf 1.54 new CIMClientHTTPErrorException(statusCode, reasonPhrase,
260 cimError, pegasusError);
|
261 kumpf 1.17 ClientExceptionMessage * response =
262 new ClientExceptionMessage(httpError);
|
263 kumpf 1.15
264 _outputQueue->enqueue(response);
|
265 kumpf 1.8 return;
|
266 mike 1.2 }
267
268 //
269 // Search for "CIMOperation" header:
270 //
271 String cimOperation;
272
273 if (!HTTPMessage::lookupHeader(
|
274 kumpf 1.60 headers, "CIMOperation", cimOperation, true))
|
275 mike 1.2 {
|
276 humberto 1.43 // l10n
277
278 // CIMClientMalformedHTTPException* malformedHTTPException = new
279 // CIMClientMalformedHTTPException("Missing CIMOperation HTTP header");
280
|
281 humberto 1.44 MessageLoaderParms mlParms("Client.CIMOperationResponseDecoder.MISSING_CIMOP_HEADER", "Missing CIMOperation HTTP header");
|
282 humberto 1.43 String mlString(MessageLoader::getMessage(mlParms));
|
283 kumpf 1.60
|
284 humberto 1.43 CIMClientMalformedHTTPException* malformedHTTPException = new
|
285 kumpf 1.60 CIMClientMalformedHTTPException(mlString);
286
|
287 kumpf 1.17 ClientExceptionMessage * response =
288 new ClientExceptionMessage(malformedHTTPException);
289
290 _outputQueue->enqueue(response);
291 return;
|
292 mike 1.2 }
293
|
294 chuck 1.39
|
295 brian.campbell 1.62 // l10n start
|
296 kumpf 1.60 // l10n end
|
297 david 1.42 //
298 // Search for "Content-Type" header:
299 //
|
300 kumpf 1.60
301 // BUG 572, Use of Content-Type header and change error msg.
302 // If header exists, test type. If not, ignore. We will find
303 // content type errors in text analysis.
304 // content-type header value format:
305 // type "/" subtype *( ";" parameter )
306 // ex. text/xml;Charset="utf8"
307 String cimContentType;
308
309 if (HTTPMessage::lookupHeader(
310 headers, "Content-Type", cimContentType, true))
311 {
312 Uint32 len;
313 String contentTypeValue;
314 if ((len = cimContentType.find(';')) != PEG_NOT_FOUND)
315 contentTypeValue = cimContentType.subString(0,len);
316 else
317 contentTypeValue = cimContentType;
318
319 if (!String::equalNoCase(contentTypeValue, "text/xml") &&
320 !String::equalNoCase(contentTypeValue, "application/xml"))
321 kumpf 1.60 {
322 CIMClientMalformedHTTPException* malformedHTTPException = new
323 CIMClientMalformedHTTPException
324 ("Bad Content-Type HTTP header; " + contentTypeValue);
325 ClientExceptionMessage * response =
326 new ClientExceptionMessage(malformedHTTPException);
327
328 _outputQueue->enqueue(response);
329 return;
330 }
331 }
332 // comment out the error rejection code if the content-type header does
333 // not exist
|
334 karl 1.48 #ifdef PEGASUS_REJECT_ON_MISSING_CONTENTTYPE_HEADER
|
335 kumpf 1.60 else
336 {
337 CIMClientMalformedHTTPException* malformedHTTPException = new
338 CIMClientMalformedHTTPException
339 ("Missing Content-Type HTTP header; ");
340 ClientExceptionMessage * response =
341 new ClientExceptionMessage(malformedHTTPException);
342
343 _outputQueue->enqueue(response);
344 return;
345 }
|
346 karl 1.48 #endif
|
347 kumpf 1.60
348 // look for any cim status codes. The HTTPConnection level would have
349 // added them here.
350
351 String cimStatusCodeValue;
352 Boolean found = HTTPMessage::lookupHeader(headers, "CIMStatusCode",
353 cimStatusCodeValue, true);
354 CIMStatusCode cimStatusCodeNumber = CIM_ERR_SUCCESS;
355
356 if (found == true &&
357 (cimStatusCodeNumber = (CIMStatusCode)
358 atoi(cimStatusCodeValue.getCString())) != CIM_ERR_SUCCESS)
359 {
360 String cimStatusCodeDescription;
361 found = HTTPMessage::lookupHeader(headers, "CIMStatusCodeDescription",
362 cimStatusCodeDescription, true);
363 if (found == true && cimStatusCodeDescription.size() > 0)
364 {
365 try
366 {
367 cimStatusCodeDescription =
368 kumpf 1.60 XmlReader::decodeURICharacters(cimStatusCodeDescription);
369 }
370 catch (ParseError&)
371 {
372 }
373 } // if there is a description with the code
374
375 CIMException* cimStatusException =
376 new CIMException(cimStatusCodeNumber,cimStatusCodeDescription);
|
377 brian.campbell 1.62 cimStatusException->setContentLanguages(httpMessage->contentLanguages);
|
378 kumpf 1.60 ClientExceptionMessage * response =
379 new ClientExceptionMessage(cimStatusException);
380 _outputQueue->enqueue(response);
381 return;
382 }
|
383 brian.campbell 1.59
|
384 mike 1.2 //
385 // Zero-terminate the message:
386 //
387 httpMessage->message.append('\0');
|
388 keith.petley 1.40
|
389 mike 1.2 // Calculate the beginning of the content from the message size and
390 // the content length. Subtract 1 to take into account the null
391 // character we just added to the end of the message.
392
|
393 david.dillard 1.63 content = (char *) httpMessage->message.getData() +
|
394 karl 1.41 httpMessage->message.size() - contentLength - 1;
|
395 mike 1.2
396 //
397 // If it is a method response, then dispatch it to be handled:
398 //
399
400 if (!String::equalNoCase(cimOperation, "MethodResponse"))
401 {
|
402 kumpf 1.60 // l10n
|
403 humberto 1.43
|
404 kumpf 1.60 // CIMClientMalformedHTTPException* malformedHTTPException =
405 // new CIMClientMalformedHTTPException(
406 // String("Received CIMOperation HTTP header value \"") +
407 // cimOperation + "\", expected \"MethodResponse\"");
|
408 humberto 1.43
|
409 kumpf 1.60 MessageLoaderParms mlParms("Client.CIMOperationResponseDecoder.EXPECTED_METHODRESPONSE", "Received CIMOperation HTTP header value \"$1\", expected \"MethodResponse\"", cimOperation);
410 String mlString(MessageLoader::getMessage(mlParms));
|
411 humberto 1.43
|
412 kumpf 1.60 CIMClientMalformedHTTPException* malformedHTTPException =
413 new CIMClientMalformedHTTPException(mlString);
|
414 humberto 1.43
|
415 kumpf 1.60 ClientExceptionMessage * response =
416 new ClientExceptionMessage(malformedHTTPException);
|
417 kumpf 1.17
418 _outputQueue->enqueue(response);
419 return;
|
420 mike 1.2 }
421
|
422 brian.campbell 1.62 _handleMethodResponse(content, httpMessage->contentLanguages); // l10n
|
423 mike 1.2 }
424
|
425 chuck 1.39 void CIMOperationResponseDecoder::_handleMethodResponse(char* content,
|
426 kumpf 1.60 const ContentLanguages& contentLanguages) //l10n
|
427 mike 1.2 {
428 Message* response = 0;
429
430 //
431 // Create and initialize XML parser:
432 //
433
434 XmlParser parser((char*)content);
435 XmlEntry entry;
436
437 try
438 {
|
439 kumpf 1.60 //
440 // Process <?xml ... >
441 //
|
442 mike 1.2
|
443 kumpf 1.11 const char* xmlVersion = 0;
444 const char* xmlEncoding = 0;
445
|
446 kumpf 1.60 XmlReader::getXmlDeclaration(parser, xmlVersion, xmlEncoding);
|
447 mike 1.2
|
448 kumpf 1.60 //
449 // Process <CIM ... >
450 //
|
451 mike 1.2
|
452 kumpf 1.9 const char* cimVersion = 0;
453 const char* dtdVersion = 0;
454
|
455 kumpf 1.17 // ATTN-RK-P3-20020416: Need to validate these versions?
|
456 kumpf 1.60 XmlReader::getCimStartTag(parser, cimVersion, dtdVersion);
|
457 mike 1.2
|
458 kumpf 1.60 //
459 // Expect <MESSAGE ... >
460 //
|
461 mike 1.2
|
462 kumpf 1.60 String messageId;
463 String protocolVersion;
|
464 mike 1.2
|
465 kumpf 1.60 if (!XmlReader::getMessageStartTag(parser, messageId, protocolVersion))
466 {
467 // l10n
|
468 humberto 1.43
|
469 kumpf 1.60 // throw XmlValidationError(
470 // parser.getLine(), "expected MESSAGE element");
|
471 humberto 1.43
|
472 kumpf 1.60 MessageLoaderParms mlParms("Client.CIMOperationResponseDecoder.EXPECTED_MESSAGE_ELEMENT",
473 "expected MESSAGE element");
|
474 humberto 1.43
|
475 kumpf 1.60 throw XmlValidationError(parser.getLine(), mlParms);
476 }
|
477 humberto 1.43
|
478 kumpf 1.60 if (!String::equalNoCase(protocolVersion, "1.0"))
479 {
480 // l10n
|
481 mike 1.2
|
482 kumpf 1.60 // CIMClientResponseException* responseException =
483 // new CIMClientResponseException(
484 // String("Received unsupported protocol version \"") +
485 // protocolVersion + "\", expected \"1.0\"");
|
486 humberto 1.43
|
487 kumpf 1.60 MessageLoaderParms mlParms("Client.CIMOperationResponseDecoder.UNSUPPORTED_PROTOCOL", "Received unsupported protocol version \"$0\", expected \"$1\"", protocolVersion, "1.0");
488 String mlString(MessageLoader::getMessage(mlParms));
|
489 humberto 1.43
|
490 kumpf 1.60 CIMClientResponseException* responseException =
491 new CIMClientResponseException(mlString);
|
492 humberto 1.43
|
493 kumpf 1.17 ClientExceptionMessage * response =
494 new ClientExceptionMessage(responseException);
|
495 mike 1.2
|
496 kumpf 1.17 _outputQueue->enqueue(response);
497 return;
|
498 kumpf 1.60 }
499
500 //
501 // Expect <SIMPLERSP ... >
502 //
503
504 XmlReader::expectStartTag(parser, entry, "SIMPLERSP");
505
506 //
507 // Expect <IMETHODRESPONSE ... >
508 //
|
509 mike 1.2
|
510 kumpf 1.60 const char* iMethodResponseName = 0;
511 Boolean isEmptyTag = false;
|
512 humberto 1.43
|
513 kumpf 1.60 if (XmlReader::getIMethodResponseStartTag(
514 parser, iMethodResponseName, isEmptyTag))
515 {
516 //
517 // Dispatch the method:
518 //
519
520 if (System::strcasecmp(iMethodResponseName, "GetClass") == 0)
521 response = _decodeGetClassResponse(
522 parser, messageId, isEmptyTag);
523 else if (System::strcasecmp(iMethodResponseName, "GetInstance") == 0)
524 response = _decodeGetInstanceResponse(
525 parser, messageId, isEmptyTag);
526 else if (System::strcasecmp(iMethodResponseName, "EnumerateClassNames") == 0)
527 response = _decodeEnumerateClassNamesResponse(
528 parser, messageId, isEmptyTag);
529 else if (System::strcasecmp(iMethodResponseName, "References") == 0)
530 response = _decodeReferencesResponse(
531 parser, messageId, isEmptyTag);
532 else if (System::strcasecmp(iMethodResponseName, "ReferenceNames") == 0)
533 response = _decodeReferenceNamesResponse(
534 kumpf 1.60 parser, messageId, isEmptyTag);
535 else if (System::strcasecmp(iMethodResponseName, "AssociatorNames") == 0)
536 response = _decodeAssociatorNamesResponse(
537 parser, messageId, isEmptyTag);
538 else if (System::strcasecmp(iMethodResponseName, "Associators") == 0)
539 response = _decodeAssociatorsResponse(
540 parser, messageId, isEmptyTag);
541 else if (System::strcasecmp(iMethodResponseName, "CreateInstance") == 0)
542 response = _decodeCreateInstanceResponse(
543 parser, messageId, isEmptyTag);
544 else if (System::strcasecmp(iMethodResponseName,"EnumerateInstanceNames") == 0)
545 response = _decodeEnumerateInstanceNamesResponse(
546 parser, messageId, isEmptyTag);
547 else if (System::strcasecmp(iMethodResponseName,"EnumerateInstances") == 0)
548 response = _decodeEnumerateInstancesResponse(
549 parser, messageId, isEmptyTag);
550 else if (System::strcasecmp(iMethodResponseName, "GetProperty") == 0)
551 response = _decodeGetPropertyResponse(
552 parser, messageId, isEmptyTag);
553 else if (System::strcasecmp(iMethodResponseName, "SetProperty") == 0)
554 response = _decodeSetPropertyResponse(
555 kumpf 1.60 parser, messageId, isEmptyTag);
556 else if (System::strcasecmp(iMethodResponseName, "DeleteQualifier") == 0)
557 response = _decodeDeleteQualifierResponse(
558 parser, messageId, isEmptyTag);
559 else if (System::strcasecmp(iMethodResponseName, "GetQualifier") == 0)
560 response = _decodeGetQualifierResponse(
561 parser, messageId, isEmptyTag);
562 else if (System::strcasecmp(iMethodResponseName, "SetQualifier") == 0)
563 response = _decodeSetQualifierResponse(
564 parser, messageId, isEmptyTag);
565 else if (System::strcasecmp(iMethodResponseName, "EnumerateQualifiers") == 0)
566 response = _decodeEnumerateQualifiersResponse(
567 parser, messageId, isEmptyTag);
568 else if (System::strcasecmp(iMethodResponseName, "EnumerateClasses") == 0)
569 response = _decodeEnumerateClassesResponse(
570 parser, messageId, isEmptyTag);
571 else if (System::strcasecmp(iMethodResponseName, "CreateClass") == 0)
572 response = _decodeCreateClassResponse(
573 parser, messageId, isEmptyTag);
574 else if (System::strcasecmp(iMethodResponseName, "ModifyClass") == 0)
575 response = _decodeModifyClassResponse(
576 kumpf 1.60 parser, messageId, isEmptyTag);
577 else if (System::strcasecmp(iMethodResponseName, "ModifyInstance") == 0)
578 response = _decodeModifyInstanceResponse(
579 parser, messageId, isEmptyTag);
580 else if (System::strcasecmp(iMethodResponseName, "DeleteClass") == 0)
581 response = _decodeDeleteClassResponse(
582 parser, messageId, isEmptyTag);
583 else if (System::strcasecmp(iMethodResponseName, "DeleteInstance") == 0)
584 response = _decodeDeleteInstanceResponse(
585 parser, messageId, isEmptyTag);
586 else if (System::strcasecmp(iMethodResponseName, "ExecQuery") == 0)
587 response = _decodeExecQueryResponse(
588 parser, messageId, isEmptyTag);
589 else
590 {
591 // l10n
|
592 humberto 1.43
|
593 mike 1.2 // Unrecognized IMethodResponse name attribute
|
594 kumpf 1.60 // throw XmlValidationError(parser.getLine(),
595 // String("Unrecognized IMethodResponse name \"") +
596 // iMethodResponseName + "\"");
597
598 MessageLoaderParms mlParms(
599 "Client.CIMOperationResponseDecoder.UNRECOGNIZED_NAME",
600 "Unrecognized IMethodResponse name \"$0\"",
601 iMethodResponseName);
602 throw XmlValidationError(parser.getLine(), mlParms);
603 }
|
604 humberto 1.43
|
605 kumpf 1.60 //
606 // Handle end tag:
607 //
|
608 humberto 1.43
|
609 kumpf 1.60 if (!isEmptyTag)
610 {
611 XmlReader::expectEndTag(parser, "IMETHODRESPONSE");
612 }
613 }
614 else if (XmlReader::getMethodResponseStartTag(
615 parser, iMethodResponseName, isEmptyTag))
616 {
617 response = _decodeInvokeMethodResponse(
618 parser, messageId, iMethodResponseName, isEmptyTag);
619
620 //
621 // Handle end tag:
622 //
623 if (!isEmptyTag)
624 {
625 XmlReader::expectEndTag(parser, "METHODRESPONSE");
626 }
627 }
628 else
629 {
630 kumpf 1.60 // l10n
|
631 humberto 1.43
|
632 kumpf 1.60 // throw XmlValidationError(parser.getLine(),
633 // "expected METHODRESPONSE or IMETHODRESPONSE element");
634
635 MessageLoaderParms mlParms("Client.CIMOperationResponseDecoder.EXPECTED_METHODRESPONSE_OR_IMETHODRESPONSE_ELEMENT",
636 "expected METHODRESPONSE or IMETHODRESPONSE element");
637
638 throw XmlValidationError(parser.getLine(), mlParms);
639 }
|
640 mike 1.2
641 //
642 // Handle end tags:
643 //
|
644 kumpf 1.60 XmlReader::expectEndTag(parser, "SIMPLERSP");
645 XmlReader::expectEndTag(parser, "MESSAGE");
646 XmlReader::expectEndTag(parser, "CIM");
|
647 mike 1.2 }
|
648 kumpf 1.17 catch (XmlException& x)
649 {
|
650 kumpf 1.60 Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::TRACE,
651 "CIMOperationResponseDecoder::_handleMethodResponse - XmlException has occurred. Message: $0",x.getMessage());
|
652 david 1.38
|
653 kumpf 1.17 if (response)
654 {
|
655 karl 1.41 //#ifdef PEGASUS_SNIA_INTEROP_TEST
656 // httpMessage->printAll(cout);
657 //#endif
|
658 kumpf 1.60
|
659 kumpf 1.17 delete response;
660 }
661
662 response = new ClientExceptionMessage(
|
663 kumpf 1.20 new CIMClientXmlException(x.getMessage()));
|
664 kumpf 1.17 }
|
665 mike 1.2 catch (Exception& x)
666 {
|
667 kumpf 1.50 // Might get MalformedObjectNameException, InvalidNameException, etc.
|
668 kumpf 1.17
669 if (response)
670 {
671 delete response;
672 }
|
673 mike 1.2
|
674 kumpf 1.17 response = new ClientExceptionMessage(
|
675 kumpf 1.53 new CIMClientResponseException(x.getMessage()));
|
676 mike 1.2 }
|
677 chuck 1.39
678 //l10n start
679 // l10n TODO - might want to move A-L and C-L to Message
680 // to make this more maintainable
|
681 kumpf 1.60 // Add the language header to the request
682 CIMMessage * cimmsg = dynamic_cast<CIMMessage *>(response);
683 if (cimmsg != NULL)
684 {
685 cimmsg->operationContext.set(ContentLanguageListContainer(contentLanguages));
686 }
687 else
688 {
689 ; // l10n TODO - error back to client here
690 }
691 // l10n end
|
692 mike 1.2
693 _outputQueue->enqueue(response);
694 }
695
696 CIMCreateClassResponseMessage* CIMOperationResponseDecoder::_decodeCreateClassResponse(
|
697 kumpf 1.60 XmlParser& parser,
698 const String& messageId,
699 Boolean isEmptyImethodresponseTag)
|
700 mike 1.2 {
701 XmlEntry entry;
|
702 kumpf 1.12 CIMException cimException;
|
703 mike 1.2
|
704 kumpf 1.60 if (!isEmptyImethodresponseTag)
|
705 mike 1.2 {
|
706 kumpf 1.60 if (XmlReader::getErrorElement(parser, cimException))
707 {
708 return(new CIMCreateClassResponseMessage(
709 messageId,
710 cimException,
711 QueueIdStack()));
712 }
|
713 mike 1.2
|
714 kumpf 1.60 if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
715 {
716 if (entry.type != XmlEntry::EMPTY_TAG)
717 {
718 XmlReader::expectEndTag(parser, "IRETURNVALUE");
719 }
720 }
|
721 mike 1.2 }
|
722 kumpf 1.60
723 return(new CIMCreateClassResponseMessage(
724 messageId,
725 cimException,
726 QueueIdStack()));
|
727 mike 1.2 }
728
729 CIMGetClassResponseMessage* CIMOperationResponseDecoder::_decodeGetClassResponse(
|
730 kumpf 1.60 XmlParser& parser,
731 const String& messageId,
732 Boolean isEmptyImethodresponseTag)
|
733 mike 1.2 {
734 XmlEntry entry;
|
735 kumpf 1.12 CIMException cimException;
|
736 mike 1.2
|
737 kumpf 1.60 if (isEmptyImethodresponseTag)
738 {
739 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_OPEN",
740 "Expected open of $0 element", "IMETHODRESPONSE");
741 throw XmlValidationError(parser.getLine(), mlParms);
742 }
743 else if (XmlReader::getErrorElement(parser, cimException))
|
744 mike 1.2 {
|
745 kumpf 1.60 return(new CIMGetClassResponseMessage(
746 messageId,
747 cimException,
748 QueueIdStack(),
749 CIMClass()));
|
750 mike 1.2 }
|
751 kumpf 1.37 else if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
|
752 mike 1.2 {
|
753 kumpf 1.60 CIMClass cimClass;
|
754 mike 1.2
|
755 kumpf 1.60 if ((entry.type == XmlEntry::EMPTY_TAG) ||
756 !XmlReader::getClassElement(parser, cimClass))
757 {
758 // l10n
|
759 humberto 1.43
|
760 kumpf 1.60 // throw XmlValidationError(parser.getLine(),"expected CLASS element");
|
761 humberto 1.43
|
762 kumpf 1.60 MessageLoaderParms mlParms(
763 "Client.CIMOperationResponseDecoder.EXPECTED_CLASS_ELEMENT",
764 "expected CLASS element");
765 throw XmlValidationError(parser.getLine(), mlParms);
766 }
|
767 humberto 1.43
|
768 kumpf 1.60 XmlReader::expectEndTag(parser, "IRETURNVALUE");
|
769 humberto 1.43
|
770 kumpf 1.60 return(new CIMGetClassResponseMessage(
771 messageId,
772 cimException,
773 QueueIdStack(),
774 cimClass));
|
775 mike 1.2 }
776 else
777 {
|
778 kumpf 1.60 // l10n
|
779 humberto 1.43
|
780 kumpf 1.60 // throw XmlValidationError(parser.getLine(),
781 // "expected ERROR or IRETURNVALUE element");
|
782 humberto 1.43
|
783 kumpf 1.60 MessageLoaderParms mlParms("Client.CIMOperationResponseDecoder.EXPECTED_ERROR_OR_IRETURNVALUE_ELEMENT",
784 "expected ERROR or IRETURNVALUE element");
|
785 humberto 1.43
|
786 kumpf 1.60 throw XmlValidationError(parser.getLine(), mlParms);
|
787 mike 1.2 }
788 }
789
790 CIMModifyClassResponseMessage* CIMOperationResponseDecoder::_decodeModifyClassResponse(
|
791 kumpf 1.60 XmlParser& parser,
792 const String& messageId,
793 Boolean isEmptyImethodresponseTag)
|
794 mike 1.2 {
795 XmlEntry entry;
|
796 kumpf 1.12 CIMException cimException;
|
797 mike 1.2
|
798 kumpf 1.60 if (!isEmptyImethodresponseTag)
|
799 mike 1.2 {
|
800 kumpf 1.60 if (XmlReader::getErrorElement(parser, cimException))
801 {
802 return(new CIMModifyClassResponseMessage(
803 messageId,
804 cimException,
805 QueueIdStack()));
806 }
807
808 if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
809 {
810 if (entry.type != XmlEntry::EMPTY_TAG)
811 {
812 XmlReader::expectEndTag(parser, "IRETURNVALUE");
813 }
814 }
|
815 mike 1.2 }
|
816 kumpf 1.60
817 return(new CIMModifyClassResponseMessage(
818 messageId,
819 cimException,
820 QueueIdStack()));
|
821 mike 1.2 }
822
823 CIMEnumerateClassNamesResponseMessage* CIMOperationResponseDecoder::_decodeEnumerateClassNamesResponse(
|
824 kumpf 1.60 XmlParser& parser,
825 const String& messageId,
826 Boolean isEmptyImethodresponseTag)
|
827 mike 1.2 {
828 XmlEntry entry;
|
829 kumpf 1.12 CIMException cimException;
|
830 kumpf 1.60 Array<CIMName> classNames;
|
831 mike 1.2
|
832 kumpf 1.60 if (!isEmptyImethodresponseTag)
|
833 mike 1.2 {
|
834 kumpf 1.60 if (XmlReader::getErrorElement(parser, cimException))
835 {
836 return(new CIMEnumerateClassNamesResponseMessage(
837 messageId,
838 cimException,
839 QueueIdStack(),
840 Array<CIMName>()));
841 }
842
843 if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
844 {
845 if (entry.type != XmlEntry::EMPTY_TAG)
846 {
847 CIMName className;
848
849 while (XmlReader::getClassNameElement(parser, className, false))
850 classNames.append(className);
851
852 XmlReader::expectEndTag(parser, "IRETURNVALUE");
853 }
854 }
|
855 mike 1.2 }
856
|
857 kumpf 1.60 return(new CIMEnumerateClassNamesResponseMessage(
858 messageId,
859 cimException,
860 QueueIdStack(),
861 classNames));
|
862 mike 1.2 }
863
864 CIMEnumerateClassesResponseMessage* CIMOperationResponseDecoder::_decodeEnumerateClassesResponse(
|
865 kumpf 1.60 XmlParser& parser,
866 const String& messageId,
867 Boolean isEmptyImethodresponseTag)
|
868 mike 1.2 {
869 XmlEntry entry;
|
870 kumpf 1.12 CIMException cimException;
|
871 kumpf 1.60 Array<CIMClass> cimClasses;
|
872 mike 1.2
|
873 kumpf 1.60 if (!isEmptyImethodresponseTag)
|
874 mike 1.2 {
|
875 kumpf 1.60 if (XmlReader::getErrorElement(parser, cimException))
876 {
877 return(new CIMEnumerateClassesResponseMessage(
878 messageId,
879 cimException,
880 QueueIdStack(),
881 Array<CIMClass>()));
882 }
883
884 if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
885 {
886 if (entry.type != XmlEntry::EMPTY_TAG)
887 {
888 CIMClass cimClass;
889
890 while (XmlReader::getClassElement(parser, cimClass))
891 cimClasses.append(cimClass);
892
893 XmlReader::expectEndTag(parser, "IRETURNVALUE");
894 }
895 }
|
896 mike 1.2 }
897
|
898 kumpf 1.60 return(new CIMEnumerateClassesResponseMessage(
899 messageId,
900 cimException,
901 QueueIdStack(),
902 cimClasses));
|
903 mike 1.2 }
904
905 CIMDeleteClassResponseMessage* CIMOperationResponseDecoder::_decodeDeleteClassResponse(
|
906 kumpf 1.60 XmlParser& parser,
907 const String& messageId,
908 Boolean isEmptyImethodresponseTag)
|
909 mike 1.2 {
910 XmlEntry entry;
|
911 kumpf 1.12 CIMException cimException;
|
912 mike 1.2
|
913 kumpf 1.60 if (!isEmptyImethodresponseTag)
|
914 mike 1.2 {
|
915 kumpf 1.60 if (XmlReader::getErrorElement(parser, cimException))
916 {
917 return(new CIMDeleteClassResponseMessage(
918 messageId,
919 cimException,
920 QueueIdStack()));
921 }
922
923 if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
924 {
925 if (entry.type != XmlEntry::EMPTY_TAG)
926 {
927 XmlReader::expectEndTag(parser, "IRETURNVALUE");
928 }
929 }
|
930 mike 1.2 }
|
931 kumpf 1.60
932 return(new CIMDeleteClassResponseMessage(
933 messageId,
934 cimException,
935 QueueIdStack()));
|
936 mike 1.2 }
937
938 CIMCreateInstanceResponseMessage* CIMOperationResponseDecoder::_decodeCreateInstanceResponse(
|
939 kumpf 1.60 XmlParser& parser,
940 const String& messageId,
941 Boolean isEmptyImethodresponseTag)
|
942 mike 1.2 {
943 XmlEntry entry;
|
944 kumpf 1.12 CIMException cimException;
|
945 mike 1.2
|
946 kumpf 1.60 if (isEmptyImethodresponseTag)
947 {
948 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_OPEN",
949 "Expected open of $0 element", "IMETHODRESPONSE");
950 throw XmlValidationError(parser.getLine(), mlParms);
951 }
952 else if (XmlReader::getErrorElement(parser, cimException))
|
953 mike 1.2 {
|
954 kumpf 1.60 return(new CIMCreateInstanceResponseMessage(
955 messageId,
956 cimException,
957 QueueIdStack(),
958 CIMObjectPath()));
|
959 mike 1.2 }
960 else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
961 {
|
962 kumpf 1.60 CIMObjectPath instanceName;
963 XmlReader::getInstanceNameElement(parser, instanceName);
|
964 mike 1.2
|
965 kumpf 1.60 XmlReader::expectEndTag(parser, "IRETURNVALUE");
|
966 mike 1.2
|
967 kumpf 1.60 return(new CIMCreateInstanceResponseMessage(
968 messageId,
969 cimException,
970 QueueIdStack(),
971 instanceName));
|
972 mike 1.2 }
973 else
974 {
|
975 kumpf 1.60 // l10n
|
976 humberto 1.43
|
977 kumpf 1.60 // throw XmlValidationError(parser.getLine(),
978 // "expected ERROR or IRETURNVALUE element");
|
979 humberto 1.43
|
980 kumpf 1.60 MessageLoaderParms mlParms("Client.CIMOperationResponseDecoder.EXPECTED_ERROR_OR_IRETURNVALUE_ELEMENT",
981 "expected ERROR or IRETURNVALUE element");
|
982 humberto 1.43
|
983 kumpf 1.60 throw XmlValidationError(parser.getLine(), mlParms);
|
984 mike 1.2 }
985 }
986
987 CIMGetInstanceResponseMessage* CIMOperationResponseDecoder::_decodeGetInstanceResponse(
|
988 kumpf 1.60 XmlParser& parser,
989 const String& messageId,
990 Boolean isEmptyImethodresponseTag)
|
991 mike 1.2 {
992 XmlEntry entry;
|
993 kumpf 1.12 CIMException cimException;
|
994 mike 1.2
|
995 kumpf 1.60 if (isEmptyImethodresponseTag)
996 {
997 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_OPEN",
998 "Expected open of $0 element", "IMETHODRESPONSE");
999 throw XmlValidationError(parser.getLine(), mlParms);
1000 }
1001 else if (XmlReader::getErrorElement(parser, cimException))
|
1002 mike 1.2 {
|
1003 kumpf 1.60 return(new CIMGetInstanceResponseMessage(
1004 messageId,
1005 cimException,
1006 QueueIdStack(),
1007 CIMInstance()));
|
1008 mike 1.2 }
|
1009 kumpf 1.37 else if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
|
1010 mike 1.2 {
|
1011 kumpf 1.60 CIMInstance cimInstance;
|
1012 mike 1.2
|
1013 kumpf 1.60 if ((entry.type == XmlEntry::EMPTY_TAG) ||
1014 !XmlReader::getInstanceElement(parser, cimInstance))
1015 {
1016 // l10n
|
1017 humberto 1.43
|
1018 kumpf 1.60 // throw XmlValidationError(
1019 // parser.getLine(), "expected INSTANCE element");
|
1020 humberto 1.43
|
1021 kumpf 1.60 MessageLoaderParms mlParms(
1022 "Client.CIMOperationResponseDecoder.EXPECTED_INSTANCE_ELEMENT",
1023 "expected INSTANCE element");
|
1024 humberto 1.43
|
1025 kumpf 1.60 throw XmlValidationError(parser.getLine(), mlParms);
1026 }
|
1027 mike 1.2
|
1028 kumpf 1.60 XmlReader::expectEndTag(parser, "IRETURNVALUE");
|
1029 mike 1.2
|
1030 kumpf 1.60 return(new CIMGetInstanceResponseMessage(
1031 messageId,
1032 cimException,
1033 QueueIdStack(),
1034 cimInstance));
|
1035 mike 1.2 }
1036 else
1037 {
|
1038 kumpf 1.60 // l10n
|
1039 humberto 1.43
|
1040 kumpf 1.60 // throw XmlValidationError(parser.getLine(),
1041 // "expected ERROR or IRETURNVALUE element");
|
1042 humberto 1.43
|
1043 kumpf 1.60 MessageLoaderParms mlParms("Client.CIMOperationResponseDecoder.EXPECTED_ERROR_OR_IRETURNVALUE_ELEMENT",
1044 "expected ERROR or IRETURNVALUE element");
|
1045 humberto 1.43
|
1046 kumpf 1.60 throw XmlValidationError(parser.getLine(), mlParms);
|
1047 mike 1.2 }
1048 }
1049
1050 CIMModifyInstanceResponseMessage* CIMOperationResponseDecoder::_decodeModifyInstanceResponse(
|
1051 kumpf 1.60 XmlParser& parser,
1052 const String& messageId,
1053 Boolean isEmptyImethodresponseTag)
|
1054 mike 1.2 {
1055 XmlEntry entry;
|
1056 kumpf 1.12 CIMException cimException;
|
1057 mike 1.2
|
1058 kumpf 1.60 if (!isEmptyImethodresponseTag)
|
1059 mike 1.2 {
|
1060 kumpf 1.60 if (XmlReader::getErrorElement(parser, cimException))
1061 {
1062 return(new CIMModifyInstanceResponseMessage(
1063 messageId,
1064 cimException,
1065 QueueIdStack()));
1066 }
1067
1068 if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
1069 {
1070 if (entry.type != XmlEntry::EMPTY_TAG)
1071 {
1072 XmlReader::expectEndTag(parser, "IRETURNVALUE");
1073 }
1074 }
|
1075 mike 1.2 }
|
1076 kumpf 1.60
1077 return(new CIMModifyInstanceResponseMessage(
1078 messageId,
1079 cimException,
1080 QueueIdStack()));
|
1081 mike 1.2 }
1082
1083 CIMEnumerateInstanceNamesResponseMessage* CIMOperationResponseDecoder::_decodeEnumerateInstanceNamesResponse(
|
1084 kumpf 1.60 XmlParser& parser,
1085 const String& messageId,
1086 Boolean isEmptyImethodresponseTag)
|
1087 mike 1.2 {
1088 XmlEntry entry;
|
1089 kumpf 1.12 CIMException cimException;
|
1090 kumpf 1.60 Array<CIMObjectPath> instanceNames;
|
1091 mike 1.2
|
1092 kumpf 1.60 if (!isEmptyImethodresponseTag)
|
1093 mike 1.2 {
|
1094 kumpf 1.60 if (XmlReader::getErrorElement(parser, cimException))
1095 {
1096 return(new CIMEnumerateInstanceNamesResponseMessage(
1097 messageId,
1098 cimException,
1099 QueueIdStack(),
1100 Array<CIMObjectPath>()));
1101 }
1102
1103 if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
1104 {
1105 if (entry.type != XmlEntry::EMPTY_TAG)
1106 {
1107 String className;
1108 Array<CIMKeyBinding> keyBindings;
1109
1110 while (XmlReader::getInstanceNameElement(
1111 parser, className, keyBindings))
1112 {
1113 CIMObjectPath r(
1114 String::EMPTY,
1115 kumpf 1.60 CIMNamespaceName(),
1116 className,
1117 keyBindings);
1118 instanceNames.append(r);
1119 }
1120
1121 XmlReader::expectEndTag(parser, "IRETURNVALUE");
1122 }
1123 }
|
1124 mike 1.2 }
1125
|
1126 kumpf 1.60 return(new CIMEnumerateInstanceNamesResponseMessage(
1127 messageId,
1128 cimException,
1129 QueueIdStack(),
1130 instanceNames));
|
1131 mike 1.2 }
1132
1133 CIMEnumerateInstancesResponseMessage* CIMOperationResponseDecoder::_decodeEnumerateInstancesResponse(
|
1134 kumpf 1.60 XmlParser& parser,
1135 const String& messageId,
1136 Boolean isEmptyImethodresponseTag)
|
1137 mike 1.2 {
1138 XmlEntry entry;
|
1139 kumpf 1.12 CIMException cimException;
|
1140 kumpf 1.60 Array<CIMInstance> namedInstances;
|
1141 mike 1.2
|
1142 kumpf 1.60 if (!isEmptyImethodresponseTag)
|
1143 mike 1.2 {
|
1144 kumpf 1.60 if (XmlReader::getErrorElement(parser, cimException))
1145 {
1146 return(new CIMEnumerateInstancesResponseMessage(
1147 messageId,
1148 cimException,
1149 QueueIdStack(),
1150 Array<CIMInstance>()));
1151 }
1152
1153 if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
1154 {
1155 if (entry.type != XmlEntry::EMPTY_TAG)
1156 {
1157 CIMInstance namedInstance;
1158
1159 while (XmlReader::getNamedInstanceElement(
1160 parser, namedInstance))
1161 {
1162 namedInstances.append(namedInstance);
1163 }
1164
1165 kumpf 1.60 XmlReader::expectEndTag(parser, "IRETURNVALUE");
1166 }
1167 }
|
1168 mike 1.2 }
1169
|
1170 kumpf 1.60 return(new CIMEnumerateInstancesResponseMessage(
1171 messageId,
1172 cimException,
1173 QueueIdStack(),
1174 namedInstances));
|
1175 mike 1.2 }
1176
1177 CIMDeleteInstanceResponseMessage* CIMOperationResponseDecoder::_decodeDeleteInstanceResponse(
|
1178 kumpf 1.60 XmlParser& parser,
1179 const String& messageId,
1180 Boolean isEmptyImethodresponseTag)
|
1181 mike 1.2 {
1182 XmlEntry entry;
|
1183 kumpf 1.12 CIMException cimException;
|
1184 mike 1.2
|
1185 kumpf 1.60 if (!isEmptyImethodresponseTag)
|
1186 mike 1.2 {
|
1187 kumpf 1.60 if (XmlReader::getErrorElement(parser, cimException))
1188 {
1189 return(new CIMDeleteInstanceResponseMessage(
1190 messageId,
1191 cimException,
1192 QueueIdStack()));
1193 }
1194
1195 if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
1196 {
1197 if (entry.type != XmlEntry::EMPTY_TAG)
1198 {
1199 XmlReader::expectEndTag(parser, "IRETURNVALUE");
1200 }
1201 }
|
1202 mike 1.2 }
|
1203 kumpf 1.60
1204 return(new CIMDeleteInstanceResponseMessage(
1205 messageId,
1206 cimException,
1207 QueueIdStack()));
|
1208 mike 1.2 }
1209
1210 CIMGetPropertyResponseMessage* CIMOperationResponseDecoder::_decodeGetPropertyResponse(
|
1211 kumpf 1.60 XmlParser& parser,
1212 const String& messageId,
1213 Boolean isEmptyImethodresponseTag)
|
1214 mike 1.2 {
1215 XmlEntry entry;
|
1216 kumpf 1.12 CIMException cimException;
|
1217 kumpf 1.60 CIMValue cimValue(CIMTYPE_STRING, false);
|
1218 mike 1.2
|
1219 kumpf 1.60 if (!isEmptyImethodresponseTag)
|
1220 mike 1.2 {
|
1221 kumpf 1.60 if (XmlReader::getErrorElement(parser, cimException))
1222 {
1223 return(new CIMGetPropertyResponseMessage(
1224 messageId,
1225 cimException,
1226 QueueIdStack(),
1227 CIMValue()));
1228 }
|
1229 kumpf 1.14
|
1230 kumpf 1.60 if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
1231 {
1232 if (entry.type != XmlEntry::EMPTY_TAG)
1233 {
1234 if (!XmlReader::getPropertyValue(parser, cimValue))
1235 {
|
1236 kumpf 1.37 // No value given; just return a null String value
|
1237 kumpf 1.60 }
|
1238 kumpf 1.37
|
1239 kumpf 1.60 XmlReader::expectEndTag(parser, "IRETURNVALUE");
1240 }
1241 }
1242 else
1243 {
|
1244 kumpf 1.14 // No value given; just return a null String value
|
1245 kumpf 1.60 }
1246 }
|
1247 mike 1.2
|
1248 kumpf 1.60 return(new CIMGetPropertyResponseMessage(
1249 messageId,
1250 cimException,
1251 QueueIdStack(),
1252 cimValue));
|
1253 mike 1.2 }
1254
1255 CIMSetPropertyResponseMessage* CIMOperationResponseDecoder::_decodeSetPropertyResponse(
|
1256 kumpf 1.60 XmlParser& parser,
1257 const String& messageId,
1258 Boolean isEmptyImethodresponseTag)
|
1259 mike 1.2 {
1260 XmlEntry entry;
|
1261 kumpf 1.12 CIMException cimException;
|
1262 mike 1.2
|
1263 kumpf 1.60 if (!isEmptyImethodresponseTag)
|
1264 mike 1.2 {
|
1265 kumpf 1.60 if (XmlReader::getErrorElement(parser, cimException))
1266 {
1267 return(new CIMSetPropertyResponseMessage(
1268 messageId,
1269 cimException,
1270 QueueIdStack()));
1271 }
1272
1273 if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
1274 {
1275 if (entry.type != XmlEntry::EMPTY_TAG)
1276 {
1277 XmlReader::expectEndTag(parser, "IRETURNVALUE");
1278 }
1279 }
|
1280 mike 1.2 }
|
1281 kumpf 1.60
1282 return(new CIMSetPropertyResponseMessage(
1283 messageId,
1284 cimException,
1285 QueueIdStack()));
|
1286 mike 1.2 }
1287
1288 CIMSetQualifierResponseMessage* CIMOperationResponseDecoder::_decodeSetQualifierResponse(
|
1289 kumpf 1.60 XmlParser& parser,
1290 const String& messageId,
1291 Boolean isEmptyImethodresponseTag)
|
1292 mike 1.2 {
1293 XmlEntry entry;
|
1294 kumpf 1.12 CIMException cimException;
|
1295 mike 1.2
|
1296 kumpf 1.60 if (!isEmptyImethodresponseTag)
|
1297 mike 1.2 {
|
1298 kumpf 1.60 if (XmlReader::getErrorElement(parser, cimException))
1299 {
1300 return(new CIMSetQualifierResponseMessage(
1301 messageId,
1302 cimException,
1303 QueueIdStack()));
1304 }
1305
1306 if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
1307 {
1308 if (entry.type != XmlEntry::EMPTY_TAG)
1309 {
1310 XmlReader::expectEndTag(parser, "IRETURNVALUE");
1311 }
1312 }
|
1313 mike 1.2 }
|
1314 kumpf 1.60
1315 return(new CIMSetQualifierResponseMessage(
1316 messageId,
1317 cimException,
1318 QueueIdStack()));
|
1319 mike 1.2 }
1320
1321 CIMGetQualifierResponseMessage* CIMOperationResponseDecoder::_decodeGetQualifierResponse(
|
1322 kumpf 1.60 XmlParser& parser,
1323 const String& messageId,
1324 Boolean isEmptyImethodresponseTag)
|
1325 mike 1.2 {
1326 XmlEntry entry;
|
1327 kumpf 1.12 CIMException cimException;
|
1328 mike 1.2
|
1329 kumpf 1.60 if (isEmptyImethodresponseTag)
1330 {
1331 MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_OPEN",
1332 "Expected open of $0 element", "IMETHODRESPONSE");
1333 throw XmlValidationError(parser.getLine(), mlParms);
1334 }
1335 else if (XmlReader::getErrorElement(parser, cimException))
|
1336 mike 1.2 {
|
1337 kumpf 1.60 return(new CIMGetQualifierResponseMessage(
1338 messageId,
1339 cimException,
1340 QueueIdStack(),
1341 CIMQualifierDecl()));
|
1342 mike 1.2 }
1343 else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
1344 {
|
1345 kumpf 1.60 CIMQualifierDecl qualifierDecl;
1346 XmlReader::getQualifierDeclElement(parser, qualifierDecl);
|
1347 mike 1.2
|
1348 kumpf 1.60 XmlReader::expectEndTag(parser, "IRETURNVALUE");
|
1349 mike 1.2
|
1350 kumpf 1.60 return(new CIMGetQualifierResponseMessage(
1351 messageId,
1352 cimException,
1353 QueueIdStack(),
1354 qualifierDecl));
|
1355 mike 1.2 }
1356 else
1357 {
|
1358 kumpf 1.60 // l10n
|
1359 humberto 1.43
|
1360 kumpf 1.60 // throw XmlValidationError(parser.getLine(),
1361 // "expected ERROR or IRETURNVALUE element");
|
1362 humberto 1.43
|
1363 kumpf 1.60 MessageLoaderParms mlParms("Client.CIMOperationResponseDecoder.EXPECTED_ERROR_OR_IRETURNVALUE_ELEMENT",
1364 "expected ERROR or IRETURNVALUE element");
|
1365 humberto 1.43
|
1366 kumpf 1.60 throw XmlValidationError(parser.getLine(), mlParms);
|
1367 mike 1.2 }
1368 }
1369
1370 CIMEnumerateQualifiersResponseMessage* CIMOperationResponseDecoder::_decodeEnumerateQualifiersResponse(
|
1371 kumpf 1.60 XmlParser& parser,
1372 const String& messageId,
1373 Boolean isEmptyImethodresponseTag)
|
1374 mike 1.2 {
1375 XmlEntry entry;
|
1376 kumpf 1.12 CIMException cimException;
|
1377 kumpf 1.60 Array<CIMQualifierDecl> qualifierDecls;
|
1378 mike 1.2
|
1379 kumpf 1.60 if (!isEmptyImethodresponseTag)
|
1380 mike 1.2 {
|
1381 kumpf 1.60 if (XmlReader::getErrorElement(parser, cimException))
1382 {
1383 return(new CIMEnumerateQualifiersResponseMessage(
1384 messageId,
1385 cimException,
1386 QueueIdStack(),
1387 Array<CIMQualifierDecl>()));
1388 }
1389
1390 if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
1391 {
1392 if (entry.type != XmlEntry::EMPTY_TAG)
1393 {
1394 CIMQualifierDecl qualifierDecl;
1395
1396 while (XmlReader::getQualifierDeclElement(
1397 parser, qualifierDecl))
1398 {
1399 qualifierDecls.append(qualifierDecl);
1400 }
1401
1402 kumpf 1.60 XmlReader::expectEndTag(parser, "IRETURNVALUE");
1403 }
1404 }
|
1405 mike 1.2 }
1406
|
1407 kumpf 1.60 return(new CIMEnumerateQualifiersResponseMessage(
1408 messageId,
1409 cimException,
1410 QueueIdStack(),
1411 qualifierDecls));
|
1412 mike 1.2 }
1413
1414 CIMDeleteQualifierResponseMessage* CIMOperationResponseDecoder::_decodeDeleteQualifierResponse(
|
1415 kumpf 1.60 XmlParser& parser,
1416 const String& messageId,
1417 Boolean isEmptyImethodresponseTag)
|
1418 mike 1.2 {
1419 XmlEntry entry;
|
1420 kumpf 1.12 CIMException cimException;
|
1421 mike 1.2
|
1422 kumpf 1.60 if (!isEmptyImethodresponseTag)
|
1423 mike 1.2 {
|
1424 kumpf 1.60 if (XmlReader::getErrorElement(parser, cimException))
1425 {
1426 return(new CIMDeleteQualifierResponseMessage(
1427 messageId,
1428 cimException,
1429 QueueIdStack()));
1430 }
1431
1432 if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
1433 {
1434 if (entry.type != XmlEntry::EMPTY_TAG)
1435 {
1436 XmlReader::expectEndTag(parser, "IRETURNVALUE");
1437 }
1438 }
|
1439 mike 1.2 }
|
1440 kumpf 1.60
1441 return(new CIMDeleteQualifierResponseMessage(
1442 messageId,
1443 cimException,
1444 QueueIdStack()));
|
1445 mike 1.2 }
1446
1447 CIMReferenceNamesResponseMessage* CIMOperationResponseDecoder::_decodeReferenceNamesResponse(
|
1448 kumpf 1.60 XmlParser& parser,
1449 const String& messageId,
1450 Boolean isEmptyImethodresponseTag)
|
1451 mike 1.2 {
1452 XmlEntry entry;
|
1453 kumpf 1.12 CIMException cimException;
|
1454 kumpf 1.60 Array<CIMObjectPath> objectPaths;
|
1455 mike 1.2
|
1456 kumpf 1.60 if (!isEmptyImethodresponseTag)
|
1457 mike 1.2 {
|
1458 kumpf 1.60 if (XmlReader::getErrorElement(parser, cimException))
1459 {
1460 return(new CIMReferenceNamesResponseMessage(
1461 messageId,
1462 cimException,
1463 QueueIdStack(),
1464 Array<CIMObjectPath>()));
1465 }
1466
1467 if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
1468 {
1469 if (entry.type != XmlEntry::EMPTY_TAG)
1470 {
1471 CIMObjectPath objectPath;
1472
1473 while (XmlReader::getObjectPathElement(parser, objectPath))
1474 objectPaths.append(objectPath);
1475
1476 XmlReader::expectEndTag(parser, "IRETURNVALUE");
1477 }
1478 }
|
1479 mike 1.2 }
1480
|
1481 kumpf 1.60 return(new CIMReferenceNamesResponseMessage(
1482 messageId,
1483 cimException,
1484 QueueIdStack(),
1485 objectPaths));
|
1486 mike 1.2 }
1487
1488 CIMReferencesResponseMessage* CIMOperationResponseDecoder::_decodeReferencesResponse(
|
1489 kumpf 1.60 XmlParser& parser,
1490 const String& messageId,
1491 Boolean isEmptyImethodresponseTag)
|
1492 mike 1.2 {
1493 XmlEntry entry;
|
1494 kumpf 1.12 CIMException cimException;
|
1495 kumpf 1.60 Array<CIMObject> objectWithPathArray;
|
1496 mike 1.2
|
1497 kumpf 1.60 if (!isEmptyImethodresponseTag)
|
1498 mike 1.2 {
|
1499 kumpf 1.60 if (XmlReader::getErrorElement(parser, cimException))
1500 {
1501 return(new CIMReferencesResponseMessage(
1502 messageId,
1503 cimException,
1504 QueueIdStack(),
1505 Array<CIMObject>()));
1506 }
1507
1508 if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
1509 {
1510 if (entry.type != XmlEntry::EMPTY_TAG)
1511 {
1512 CIMObject objectWithPath;
1513
1514 while (XmlReader::getValueObjectWithPathElement(
1515 parser, objectWithPath))
1516 {
1517 objectWithPathArray.append(objectWithPath);
1518 }
1519
1520 kumpf 1.60 XmlReader::expectEndTag(parser, "IRETURNVALUE");
1521 }
1522 }
|
1523 mike 1.2 }
1524
|
1525 kumpf 1.60 return(new CIMReferencesResponseMessage(
1526 messageId,
1527 cimException,
1528 QueueIdStack(),
1529 objectWithPathArray));
|
1530 mike 1.2 }
1531
1532 CIMAssociatorNamesResponseMessage* CIMOperationResponseDecoder::_decodeAssociatorNamesResponse(
|
1533 kumpf 1.60 XmlParser& parser,
1534 const String& messageId,
1535 Boolean isEmptyImethodresponseTag)
|
1536 mike 1.2 {
1537 XmlEntry entry;
|
1538 kumpf 1.12 CIMException cimException;
|
1539 kumpf 1.60 Array<CIMObjectPath> objectPaths;
|
1540 mike 1.2
|
1541 kumpf 1.60 if (!isEmptyImethodresponseTag)
|
1542 mike 1.2 {
|
1543 kumpf 1.60 if (XmlReader::getErrorElement(parser, cimException))
1544 {
1545 return(new CIMAssociatorNamesResponseMessage(
1546 messageId,
1547 cimException,
1548 QueueIdStack(),
1549 Array<CIMObjectPath>()));
1550 }
1551
1552 if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
1553 {
1554 if (entry.type != XmlEntry::EMPTY_TAG)
1555 {
1556 CIMObjectPath objectPath;
1557
1558 while (XmlReader::getObjectPathElement(parser, objectPath))
1559 objectPaths.append(objectPath);
1560
1561 XmlReader::expectEndTag(parser, "IRETURNVALUE");
1562 }
1563 }
|
1564 mike 1.2 }
1565
|
1566 kumpf 1.60 return(new CIMAssociatorNamesResponseMessage(
1567 messageId,
1568 cimException,
1569 QueueIdStack(),
1570 objectPaths));
|
1571 mike 1.2 }
1572
1573 CIMAssociatorsResponseMessage* CIMOperationResponseDecoder::_decodeAssociatorsResponse(
|
1574 kumpf 1.60 XmlParser& parser,
1575 const String& messageId,
1576 Boolean isEmptyImethodresponseTag)
|
1577 mike 1.2 {
1578 XmlEntry entry;
|
1579 kumpf 1.12 CIMException cimException;
|
1580 kumpf 1.60 Array<CIMObject> objectWithPathArray;
|
1581 mike 1.2
|
1582 kumpf 1.60 if (!isEmptyImethodresponseTag)
|
1583 mike 1.2 {
|
1584 kumpf 1.60 if (XmlReader::getErrorElement(parser, cimException))
1585 {
1586 return(new CIMAssociatorsResponseMessage(
1587 messageId,
1588 cimException,
1589 QueueIdStack(),
1590 Array<CIMObject>()));
1591 }
1592
1593 if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
1594 {
1595 if (entry.type != XmlEntry::EMPTY_TAG)
1596 {
1597 CIMObject objectWithPath;
1598
1599 while (XmlReader::getValueObjectWithPathElement(
1600 parser, objectWithPath))
1601 {
1602 objectWithPathArray.append(objectWithPath);
1603 }
1604
1605 kumpf 1.60 XmlReader::expectEndTag(parser, "IRETURNVALUE");
1606 }
1607 }
|
1608 mike 1.2 }
1609
|
1610 kumpf 1.60 return(new CIMAssociatorsResponseMessage(
1611 messageId,
1612 cimException,
1613 QueueIdStack(),
1614 objectWithPathArray));
|
1615 kumpf 1.10 }
1616
1617 CIMExecQueryResponseMessage* CIMOperationResponseDecoder::_decodeExecQueryResponse(
|
1618 kumpf 1.60 XmlParser& parser,
1619 const String& messageId,
1620 Boolean isEmptyImethodresponseTag)
|
1621 kumpf 1.10 {
1622 XmlEntry entry;
|
1623 kumpf 1.12 CIMException cimException;
|
1624 kumpf 1.60 Array<CIMObject> objectWithPathArray;
|
1625 kumpf 1.10
|
1626 kumpf 1.60 if (!isEmptyImethodresponseTag)
|
1627 kumpf 1.10 {
|
1628 kumpf 1.60 if (XmlReader::getErrorElement(parser, cimException))
1629 {
1630 return(new CIMExecQueryResponseMessage(
1631 messageId,
1632 cimException,
1633 QueueIdStack(),
1634 Array<CIMObject>()));
1635 }
|
1636 kumpf 1.10
|
1637 kumpf 1.60 if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
1638 {
1639 if (entry.type != XmlEntry::EMPTY_TAG)
1640 {
|
1641 kumpf 1.37 XmlReader::getObjectArray(parser, objectWithPathArray);
|
1642 kumpf 1.10
|
1643 kumpf 1.60 XmlReader::expectEndTag(parser, "IRETURNVALUE");
1644 }
1645 }
|
1646 mike 1.2 }
|
1647 kumpf 1.60
1648 return(new CIMExecQueryResponseMessage(
1649 messageId,
1650 cimException,
1651 QueueIdStack(),
1652 objectWithPathArray));
|
1653 mike 1.2 }
1654
1655 CIMInvokeMethodResponseMessage* CIMOperationResponseDecoder::_decodeInvokeMethodResponse(
|
1656 kumpf 1.60 XmlParser& parser,
1657 const String& messageId,
1658 const String& methodName,
1659 Boolean isEmptyMethodresponseTag)
|
1660 mike 1.2 {
|
1661 kumpf 1.12 CIMException cimException;
|
1662 mike 1.2
|
1663 kumpf 1.5 CIMParamValue paramValue;
1664 Array<CIMParamValue> outParameters;
|
1665 kumpf 1.6 CIMValue returnValue;
|
1666 mike 1.2
|
1667 kumpf 1.60 if (!isEmptyMethodresponseTag)
|
1668 mike 1.2 {
|
1669 kumpf 1.60 if (XmlReader::getErrorElement(parser, cimException))
1670 {
1671 return(new CIMInvokeMethodResponseMessage(
1672 messageId,
1673 cimException,
1674 QueueIdStack(),
1675 returnValue,
1676 outParameters,
1677 methodName));
1678 }
1679
|
1680 kumpf 1.4 Boolean isReturnValue = false;
1681 Boolean isParamValue = false;
1682 Boolean gotReturnValue = false;
1683
1684 while ((isReturnValue =
|
1685 kumpf 1.6 XmlReader::getReturnValueElement(parser, returnValue)) ||
|
1686 kumpf 1.5 (isParamValue =
|
1687 kumpf 1.60 XmlReader::getParamValueElement(parser, paramValue)))
|
1688 kumpf 1.4 {
1689 if (isReturnValue)
1690 {
1691 if (gotReturnValue)
1692 {
|
1693 kumpf 1.60 // l10n
|
1694 humberto 1.43
|
1695 kumpf 1.60 // throw XmlValidationError(parser.getLine(),
1696 // "unexpected RETURNVALUE element");
|
1697 humberto 1.43
|
1698 kumpf 1.60 MessageLoaderParms mlParms("Client.CIMOperationResponseDecoder.EXPECTED_RETURNVALUE_ELEMENT",
1699 "unexpected RETURNVALUE element");
|
1700 humberto 1.43
|
1701 kumpf 1.60 throw XmlValidationError(parser.getLine(), mlParms);
|
1702 kumpf 1.4 }
1703 gotReturnValue = true;
1704 }
1705 else // isParamValue == true
1706 {
|
1707 kumpf 1.60 outParameters.append(paramValue);
|
1708 kumpf 1.4 }
1709
1710 isReturnValue = false;
1711 isParamValue = false;
1712 }
|
1713 kumpf 1.60 }
|
1714 kumpf 1.4
|
1715 kumpf 1.60 return(new CIMInvokeMethodResponseMessage(
1716 messageId,
1717 cimException,
1718 QueueIdStack(),
1719 returnValue,
1720 outParameters,
1721 methodName));
|
1722 mike 1.2 }
1723
1724 PEGASUS_NAMESPACE_END
|