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