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 karl 1.34.8.1 // Karl Schopmeyer (k.schopmeyer@opengroup.org)
|
33 mike 1.2 //
34 //%/////////////////////////////////////////////////////////////////////////////
35
36 #include <Pegasus/Common/Config.h>
37 #include <iostream>
|
38 kumpf 1.15 #include <Pegasus/Common/Constants.h>
|
39 mike 1.2 #include <Pegasus/Common/XmlParser.h>
40 #include <Pegasus/Common/XmlReader.h>
41 #include <Pegasus/Common/System.h>
42 #include <Pegasus/Common/XmlWriter.h>
43 #include <Pegasus/Common/HTTPMessage.h>
44 #include <Pegasus/Common/CIMMessage.h>
|
45 chuck 1.29 #include <Pegasus/Common/Exception.h>
|
46 mike 1.2 #include "CIMOperationResponseDecoder.h"
47
48 PEGASUS_USING_STD;
49
50 PEGASUS_NAMESPACE_BEGIN
51
52 CIMOperationResponseDecoder::CIMOperationResponseDecoder(
53 MessageQueue* outputQueue,
54 MessageQueue* encoderQueue,
55 ClientAuthenticator* authenticator)
56 :
|
57 kumpf 1.16 MessageQueue(PEGASUS_QUEUENAME_OPRESPDECODER),
|
58 mike 1.2 _outputQueue(outputQueue),
59 _encoderQueue(encoderQueue),
60 _authenticator(authenticator)
61 {
62
63 }
64
65 CIMOperationResponseDecoder::~CIMOperationResponseDecoder()
66 {
67
68 }
69
70 void CIMOperationResponseDecoder::setEncoderQueue(MessageQueue* encoderQueue)
71 {
72 _encoderQueue = encoderQueue;
73 }
74
75 void CIMOperationResponseDecoder::handleEnqueue()
76 {
77 Message* message = dequeue();
78
79 mike 1.2 if (!message)
80 return;
81
82 switch (message->getType())
83 {
84 case HTTP_MESSAGE:
85 {
|
86 mday 1.3
|
87 mike 1.2 HTTPMessage* httpMessage = (HTTPMessage*)message;
88 _handleHTTPMessage(httpMessage);
89 break;
90 }
91
92 default:
|
93 kumpf 1.17 PEGASUS_ASSERT(0);
|
94 mike 1.2 break;
95 }
96
97 delete message;
98 }
99
100 void CIMOperationResponseDecoder::_handleHTTPMessage(HTTPMessage* httpMessage)
101 {
102 //
103 // Parse the HTTP message:
104 //
105
106 String startLine;
107 Array<HTTPHeader> headers;
108 Sint8* content;
109 Uint32 contentLength;
110
|
111 kumpf 1.19 if (httpMessage->message.size() == 0)
112 {
|
113 kumpf 1.20 CIMClientMalformedHTTPException* malformedHTTPException =
114 new CIMClientMalformedHTTPException("Empty HTTP response message.");
|
115 kumpf 1.19 ClientExceptionMessage * response =
116 new ClientExceptionMessage(malformedHTTPException);
117
118 _outputQueue->enqueue(response);
119 return;
120 }
121
|
122 mike 1.2 httpMessage->parse(startLine, headers, contentLength);
123
|
124 kumpf 1.19 //
125 // Get the status line info
126 //
127
128 String httpVersion;
129 Uint32 statusCode;
130 String reasonPhrase;
131
132 Boolean parsableMessage = HTTPMessage::parseStatusLine(
133 startLine, httpVersion, statusCode, reasonPhrase);
134 if (!parsableMessage)
135 {
|
136 kumpf 1.20 CIMClientMalformedHTTPException* malformedHTTPException = new
137 CIMClientMalformedHTTPException("Malformed HTTP response message.");
|
138 kumpf 1.19 ClientExceptionMessage * response =
139 new ClientExceptionMessage(malformedHTTPException);
140
141 _outputQueue->enqueue(response);
142 return;
143 }
144
|
145 kumpf 1.8 try
|
146 mike 1.2 {
|
147 kumpf 1.8 if (_authenticator->checkResponseHeaderForChallenge(headers))
148 {
149 //
150 // Get the original request, put that in the encoder's queue for
151 // re-sending with authentication challenge response.
152 //
153 Message* reqMessage = _authenticator->getRequestMessage();
154 _encoderQueue->enqueue(reqMessage);
|
155 mike 1.2
|
156 kumpf 1.8 return;
157 }
158 else
159 {
160 //
161 // Received a valid/error response from the server.
162 // We do not need the original request message anymore, hence delete
163 // the request message by getting the handle from the ClientAuthenticator.
164 //
165 Message* reqMessage = _authenticator->getRequestMessage();
166 _authenticator->clearRequest();
167 if (reqMessage)
168 {
169 delete reqMessage;
170 }
171 }
|
172 mike 1.2 }
|
173 kumpf 1.8 catch(InvalidAuthHeader& e)
|
174 mike 1.2 {
|
175 kumpf 1.20 CIMClientMalformedHTTPException* malformedHTTPException =
176 new CIMClientMalformedHTTPException(e.getMessage());
|
177 kumpf 1.17 ClientExceptionMessage * response =
178 new ClientExceptionMessage(malformedHTTPException);
|
179 mike 1.2
|
180 kumpf 1.17 _outputQueue->enqueue(response);
|
181 kumpf 1.15 return;
182 }
|
183 kumpf 1.22 catch(UnauthorizedAccess& e)
184 {
|
185 kumpf 1.27 CannotConnectException* cannotConnectException =
186 new CannotConnectException(e.getMessage());
|
187 kumpf 1.22 ClientExceptionMessage * response =
|
188 kumpf 1.27 new ClientExceptionMessage(cannotConnectException);
|
189 kumpf 1.22
190 _outputQueue->enqueue(response);
191 return;
192 }
|
193 kumpf 1.15
194 //
195 // Check for a success (200 OK) response
196 //
|
197 karl 1.34.8.1 //httpMessage->message.append('\0');
198 #ifdef PEGASUS_SNIA_INTEROP_TEST
199 // Display of received packet. Displays the complete received packet
200 // For now, this is conditionally compiled.
201 //httpMessage->message.append('\0');
202 //if (getenv("PEGASUS_CLIENT_TRACE"))
203 // XmlWriter::indentedPrint(cout, httpMessage->message.getData());
204 // Remove the appended 0
205 #endif
|
206 kumpf 1.17 if (statusCode != HTTP_STATUSCODE_OK)
|
207 kumpf 1.15 {
208 String cimError;
209 String pegasusError;
210
211 HTTPMessage::lookupHeader(headers, "CIMError", cimError);
212 HTTPMessage::lookupHeader(headers, PEGASUS_HTTPHEADERTAG_ERRORDETAIL, pegasusError);
213
|
214 kumpf 1.32 CIMClientHTTPErrorException* httpError =
215 new CIMClientHTTPErrorException(statusCode, cimError, pegasusError);
|
216 kumpf 1.17 ClientExceptionMessage * response =
217 new ClientExceptionMessage(httpError);
|
218 kumpf 1.15
219 _outputQueue->enqueue(response);
|
220 kumpf 1.8 return;
|
221 mike 1.2 }
222
223 //
224 // Search for "CIMOperation" header:
225 //
226
227 String cimOperation;
228
229 if (!HTTPMessage::lookupHeader(
|
230 kumpf 1.18 headers, "CIMOperation", cimOperation, true))
|
231 mike 1.2 {
|
232 karl 1.34.8.2 #ifdef PEGASUS_SNIA_INTEROP_TEST
233 if (getenv("PEGASUS_CLIENT_TRACE"))
234 {
235 cout << "Missing CIMOperation HTTP header on this response" << endl;
236 httpMessage->printAll(cout);
237 }
238 #endif
239
|
240 kumpf 1.20 CIMClientMalformedHTTPException* malformedHTTPException = new
241 CIMClientMalformedHTTPException("Missing CIMOperation HTTP header");
|
242 kumpf 1.17 ClientExceptionMessage * response =
243 new ClientExceptionMessage(malformedHTTPException);
244
245 _outputQueue->enqueue(response);
246 return;
|
247 mike 1.2 }
248
249 //
250 // Zero-terminate the message:
251 //
252
253 httpMessage->message.append('\0');
254
|
255 karl 1.34.8.1 #ifdef PEGASUS_SNIA_INTEROP_TEST
256 // Display of received packet. Displays the complete received packet
257 // For now, this is conditionally compiled.
258 if (getenv("PEGASUS_CLIENT_TRACE"))
259 XmlWriter::indentedPrint(cout, httpMessage->message.getData());
260 #endif
261
262
|
263 mike 1.2 // Calculate the beginning of the content from the message size and
264 // the content length. Subtract 1 to take into account the null
265 // character we just added to the end of the message.
266
267 content = (Sint8*) httpMessage->message.getData() +
268 httpMessage->message.size() - contentLength - 1;
269
270 //
271 // If it is a method response, then dispatch it to be handled:
272 //
273
274 if (!String::equalNoCase(cimOperation, "MethodResponse"))
275 {
|
276 kumpf 1.20 CIMClientMalformedHTTPException* malformedHTTPException =
277 new CIMClientMalformedHTTPException(
278 String("Received CIMOperation HTTP header value \"") +
|
279 kumpf 1.17 cimOperation + "\", expected \"MethodResponse\"");
280 ClientExceptionMessage * response =
281 new ClientExceptionMessage(malformedHTTPException);
282
283 _outputQueue->enqueue(response);
284 return;
|
285 mike 1.2 }
286
287 _handleMethodResponse(content);
288 }
289
290 void CIMOperationResponseDecoder::_handleMethodResponse(char* content)
291 {
292 Message* response = 0;
293
294 //
295 // Create and initialize XML parser:
296 //
297
298 XmlParser parser((char*)content);
299 XmlEntry entry;
300
301 try
302 {
303 //
304 // Process <?xml ... >
305 //
306 mike 1.2
|
307 kumpf 1.11 const char* xmlVersion = 0;
308 const char* xmlEncoding = 0;
309
310 XmlReader::getXmlDeclaration(parser, xmlVersion, xmlEncoding);
|
311 mike 1.2
312 //
313 // Process <CIM ... >
314 //
315
|
316 kumpf 1.9 const char* cimVersion = 0;
317 const char* dtdVersion = 0;
318
|
319 kumpf 1.17 // ATTN-RK-P3-20020416: Need to validate these versions?
|
320 kumpf 1.9 XmlReader::getCimStartTag(parser, cimVersion, dtdVersion);
|
321 mike 1.2
322 //
323 // Expect <MESSAGE ... >
324 //
325
326 String messageId;
|
327 kumpf 1.9 String protocolVersion;
|
328 mike 1.2
329 if (!XmlReader::getMessageStartTag(parser, messageId, protocolVersion))
330 throw XmlValidationError(
331 parser.getLine(), "expected MESSAGE element");
332
|
333 kumpf 1.9 if (!String::equalNoCase(protocolVersion, "1.0"))
|
334 mike 1.2 {
|
335 kumpf 1.20 CIMClientResponseException* responseException =
336 new CIMClientResponseException(
337 String("Received unsupported protocol version \"") +
|
338 kumpf 1.17 protocolVersion + "\", expected \"1.0\"");
339 ClientExceptionMessage * response =
340 new ClientExceptionMessage(responseException);
|
341 mike 1.2
|
342 kumpf 1.17 _outputQueue->enqueue(response);
343 return;
|
344 mike 1.2 }
345
346 //
347 // Expect <SIMPLERSP ... >
348 //
349
350 XmlReader::expectStartTag(parser, entry, "SIMPLERSP");
351
352 //
353 // Expect <IMETHODRESPONSE ... >
354 //
355
356 const char* iMethodResponseName = 0;
357
358 if (XmlReader::getIMethodResponseStartTag(parser, iMethodResponseName))
359 {
360 //
361 // Dispatch the method:
362 //
363
|
364 kumpf 1.31 if (System::strcasecmp(iMethodResponseName, "GetClass") == 0)
|
365 mike 1.2 response = _decodeGetClassResponse(parser, messageId);
|
366 kumpf 1.31 else if (System::strcasecmp(iMethodResponseName, "GetInstance") == 0)
|
367 mike 1.2 response = _decodeGetInstanceResponse(parser, messageId);
|
368 kumpf 1.31 else if (System::strcasecmp(iMethodResponseName, "EnumerateClassNames") == 0)
|
369 mike 1.2 response = _decodeEnumerateClassNamesResponse(parser,messageId);
|
370 kumpf 1.31 else if (System::strcasecmp(iMethodResponseName, "References") == 0)
|
371 mike 1.2 response = _decodeReferencesResponse(parser, messageId);
|
372 kumpf 1.31 else if (System::strcasecmp(iMethodResponseName, "ReferenceNames") == 0)
|
373 mike 1.2 response = _decodeReferenceNamesResponse(parser, messageId);
|
374 kumpf 1.31 else if (System::strcasecmp(iMethodResponseName, "AssociatorNames") == 0)
|
375 mike 1.2 response = _decodeAssociatorNamesResponse(parser, messageId);
|
376 kumpf 1.31 else if (System::strcasecmp(iMethodResponseName, "Associators") == 0)
|
377 mike 1.2 response = _decodeAssociatorsResponse(parser, messageId);
|
378 kumpf 1.31 else if (System::strcasecmp(iMethodResponseName, "CreateInstance") == 0)
|
379 mike 1.2 response = _decodeCreateInstanceResponse(parser, messageId);
|
380 kumpf 1.31 else if (System::strcasecmp(iMethodResponseName,"EnumerateInstanceNames") == 0)
|
381 mike 1.2 response = _decodeEnumerateInstanceNamesResponse(
382 parser, messageId);
|
383 kumpf 1.31 else if (System::strcasecmp(iMethodResponseName,"EnumerateInstances") == 0)
|
384 mike 1.2 response = _decodeEnumerateInstancesResponse(parser, messageId);
|
385 kumpf 1.31 else if (System::strcasecmp(iMethodResponseName, "GetProperty") == 0)
|
386 mike 1.2 response = _decodeGetPropertyResponse(parser, messageId);
|
387 kumpf 1.31 else if (System::strcasecmp(iMethodResponseName, "SetProperty") == 0)
|
388 mike 1.2 response = _decodeSetPropertyResponse(parser, messageId);
|
389 kumpf 1.31 else if (System::strcasecmp(iMethodResponseName, "DeleteQualifier") == 0)
|
390 mike 1.2 response = _decodeDeleteQualifierResponse(parser, messageId);
|
391 kumpf 1.31 else if (System::strcasecmp(iMethodResponseName, "GetQualifier") == 0)
|
392 mike 1.2 response = _decodeGetQualifierResponse(parser, messageId);
|
393 kumpf 1.31 else if (System::strcasecmp(iMethodResponseName, "SetQualifier") == 0)
|
394 mike 1.2 response = _decodeSetQualifierResponse(parser, messageId);
|
395 kumpf 1.31 else if (System::strcasecmp(iMethodResponseName, "EnumerateQualifiers") == 0)
|
396 mike 1.2 response = _decodeEnumerateQualifiersResponse(parser,messageId);
|
397 kumpf 1.31 else if (System::strcasecmp(iMethodResponseName, "EnumerateClasses") == 0)
|
398 mike 1.2 response = _decodeEnumerateClassesResponse(parser, messageId);
|
399 kumpf 1.31 else if (System::strcasecmp(iMethodResponseName, "CreateClass") == 0)
|
400 mike 1.2 response = _decodeCreateClassResponse(parser, messageId);
|
401 kumpf 1.31 else if (System::strcasecmp(iMethodResponseName, "ModifyClass") == 0)
|
402 mike 1.2 response = _decodeModifyClassResponse(parser, messageId);
|
403 kumpf 1.31 else if (System::strcasecmp(iMethodResponseName, "ModifyInstance") == 0)
|
404 mike 1.2 response = _decodeModifyInstanceResponse(parser, messageId);
|
405 kumpf 1.31 else if (System::strcasecmp(iMethodResponseName, "DeleteClass") == 0)
|
406 mike 1.2 response = _decodeDeleteClassResponse(parser, messageId);
|
407 kumpf 1.31 else if (System::strcasecmp(iMethodResponseName, "DeleteInstance") == 0)
|
408 mike 1.2 response = _decodeDeleteInstanceResponse(parser, messageId);
|
409 kumpf 1.31 else if (System::strcasecmp(iMethodResponseName, "ExecQuery") == 0)
|
410 kumpf 1.10 response = _decodeExecQueryResponse(parser, messageId);
|
411 mike 1.2 else
412 {
413 // Unrecognized IMethodResponse name attribute
414 throw XmlValidationError(parser.getLine(),
415 String("Unrecognized IMethodResponse name \"") +
416 iMethodResponseName + "\"");
417 }
418
419 //
420 // Handle end tag:
421 //
422
423 XmlReader::expectEndTag(parser, "IMETHODRESPONSE");
424 }
425 else if (XmlReader::getMethodResponseStartTag(parser,
426 iMethodResponseName))
427 {
428 response = _decodeInvokeMethodResponse(
429 parser, messageId, iMethodResponseName);
430
431 //
432 mike 1.2 // Handle end tag:
433 //
434 XmlReader::expectEndTag(parser, "METHODRESPONSE");
435 }
436 else
437 {
438 throw XmlValidationError(parser.getLine(),
439 "expected METHODRESPONSE or IMETHODRESPONSE element");
440 }
441
442 //
443 // Handle end tags:
444 //
445 XmlReader::expectEndTag(parser, "SIMPLERSP");
446 XmlReader::expectEndTag(parser, "MESSAGE");
447 XmlReader::expectEndTag(parser, "CIM");
448 }
|
449 kumpf 1.17 catch (XmlException& x)
450 {
451 if (response)
452 {
453 delete response;
454 }
455
456 response = new ClientExceptionMessage(
|
457 kumpf 1.20 new CIMClientXmlException(x.getMessage()));
|
458 kumpf 1.17 }
|
459 mike 1.2 catch (Exception& x)
460 {
|
461 kumpf 1.17 // Shouldn't ever get exceptions other than XmlExceptions.
462 PEGASUS_ASSERT(0);
463
464 if (response)
465 {
466 delete response;
467 }
|
468 mike 1.2
|
469 kumpf 1.17 response = new ClientExceptionMessage(
|
470 kumpf 1.28 new Exception(x.getMessage()));
|
471 mike 1.2 }
472
473 _outputQueue->enqueue(response);
474 }
475
476 CIMCreateClassResponseMessage* CIMOperationResponseDecoder::_decodeCreateClassResponse(
477 XmlParser& parser,
478 const String& messageId)
479 {
480 XmlEntry entry;
|
481 kumpf 1.12 CIMException cimException;
|
482 mike 1.2
|
483 kumpf 1.12 if (XmlReader::getErrorElement(parser, cimException))
|
484 mike 1.2 {
485 return(new CIMCreateClassResponseMessage(
486 messageId,
|
487 kumpf 1.12 cimException,
|
488 mike 1.2 QueueIdStack()));
489
490 }
|
491 kumpf 1.14 else
|
492 mike 1.2 {
|
493 kumpf 1.14 if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
494 {
495 XmlReader::expectEndTag(parser, "IRETURNVALUE");
496 }
|
497 mike 1.2
498 return(new CIMCreateClassResponseMessage(
499 messageId,
|
500 kumpf 1.12 cimException,
|
501 mike 1.2 QueueIdStack()));
502 }
503 }
504
505 CIMGetClassResponseMessage* CIMOperationResponseDecoder::_decodeGetClassResponse(
506 XmlParser& parser, const String& messageId)
507 {
508 XmlEntry entry;
|
509 kumpf 1.12 CIMException cimException;
|
510 mike 1.2
|
511 kumpf 1.12 if (XmlReader::getErrorElement(parser, cimException))
|
512 mike 1.2 {
513 return(new CIMGetClassResponseMessage(
514 messageId,
|
515 kumpf 1.12 cimException,
|
516 mike 1.2 QueueIdStack(),
517 CIMClass()));
518 }
519 else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
520 {
521 CIMClass cimClass;
522
523 if (!XmlReader::getClassElement(parser, cimClass))
524 throw XmlValidationError(parser.getLine(),"expected CLASS element");
525
526 XmlReader::testEndTag(parser, "IRETURNVALUE");
527
528 return(new CIMGetClassResponseMessage(
529 messageId,
|
530 kumpf 1.12 cimException,
|
531 mike 1.2 QueueIdStack(),
532 cimClass));
533 }
534 else
535 {
536 throw XmlValidationError(parser.getLine(),
537 "expected ERROR or IRETURNVALUE element");
538 }
539 }
540
541 CIMModifyClassResponseMessage* CIMOperationResponseDecoder::_decodeModifyClassResponse(
542 XmlParser& parser, const String& messageId)
543 {
544 XmlEntry entry;
|
545 kumpf 1.12 CIMException cimException;
|
546 mike 1.2
|
547 kumpf 1.12 if (XmlReader::getErrorElement(parser, cimException))
|
548 mike 1.2 {
549 return(new CIMModifyClassResponseMessage(
550 messageId,
|
551 kumpf 1.12 cimException,
|
552 mike 1.2 QueueIdStack()));
553 }
|
554 kumpf 1.14 else
|
555 mike 1.2 {
|
556 kumpf 1.14 if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
557 {
558 XmlReader::expectEndTag(parser, "IRETURNVALUE");
559 }
|
560 mike 1.2
561 return(new CIMModifyClassResponseMessage(
562 messageId,
|
563 kumpf 1.12 cimException,
|
564 mike 1.2 QueueIdStack()));
565 }
566 }
567
568 CIMEnumerateClassNamesResponseMessage* CIMOperationResponseDecoder::_decodeEnumerateClassNamesResponse(
569 XmlParser& parser, const String& messageId)
570 {
571 XmlEntry entry;
|
572 kumpf 1.12 CIMException cimException;
|
573 mike 1.2
|
574 kumpf 1.12 if (XmlReader::getErrorElement(parser, cimException))
|
575 mike 1.2 {
576 return(new CIMEnumerateClassNamesResponseMessage(
577 messageId,
|
578 kumpf 1.12 cimException,
|
579 mike 1.2 QueueIdStack(),
|
580 kumpf 1.34 Array<CIMName>()));
|
581 mike 1.2 }
|
582 kumpf 1.14 else
|
583 mike 1.2 {
|
584 kumpf 1.34 Array<CIMName> classNames;
|
585 mike 1.2
|
586 karl 1.34.8.1 // KS 20020931 - Addition to allow empty tag return. BUGZILLA135
587 // WBEMServices returns this tag wneh no instances exist.
588 if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
589 if (entry.type != XmlEntry::EMPTY_TAG)
590 {
591 CIMName className;
592
593 while (XmlReader::getClassNameElement(parser, className, false))
594 classNames.append(className);
595
596 XmlReader::expectEndTag(parser, "IRETURNVALUE");
597 }
|
598 mike 1.2
599 return(new CIMEnumerateClassNamesResponseMessage(
600 messageId,
|
601 kumpf 1.12 cimException,
|
602 mike 1.2 QueueIdStack(),
603 classNames));
604 }
605 }
606
607 CIMEnumerateClassesResponseMessage* CIMOperationResponseDecoder::_decodeEnumerateClassesResponse(
608 XmlParser& parser, const String& messageId)
609 {
610 XmlEntry entry;
|
611 kumpf 1.12 CIMException cimException;
|
612 mike 1.2
|
613 kumpf 1.12 if (XmlReader::getErrorElement(parser, cimException))
|
614 mike 1.2 {
615 return(new CIMEnumerateClassesResponseMessage(
616 messageId,
|
617 kumpf 1.12 cimException,
|
618 mike 1.2 QueueIdStack(),
619 Array<CIMClass>()));
620 }
|
621 kumpf 1.14 else
|
622 mike 1.2 {
623 Array<CIMClass> cimClasses;
624
|
625 karl 1.34.8.1 // KS 20020931 - Addition to allow empty tag return. BUGZILLA135
626 // WBEMServices returns this tag wneh no instances exist.
627 if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
628 if (entry.type != XmlEntry::EMPTY_TAG)
629 {
630 CIMClass cimClass;
631
632 while (XmlReader::getClassElement(parser, cimClass))
633 cimClasses.append(cimClass);
634
635 XmlReader::expectEndTag(parser, "IRETURNVALUE");
636 }
|
637 mike 1.2
638 return(new CIMEnumerateClassesResponseMessage(
639 messageId,
|
640 kumpf 1.12 cimException,
|
641 mike 1.2 QueueIdStack(),
642 cimClasses));
643 }
644 }
645
646 CIMDeleteClassResponseMessage* CIMOperationResponseDecoder::_decodeDeleteClassResponse(
647 XmlParser& parser, const String& messageId)
648 {
649 XmlEntry entry;
|
650 kumpf 1.12 CIMException cimException;
|
651 mike 1.2
|
652 kumpf 1.12 if (XmlReader::getErrorElement(parser, cimException))
|
653 mike 1.2 {
654 return(new CIMDeleteClassResponseMessage(
655 messageId,
|
656 kumpf 1.12 cimException,
|
657 mike 1.2 QueueIdStack()));
658 }
|
659 kumpf 1.14 else
|
660 mike 1.2 {
|
661 kumpf 1.14 if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
662 {
663 XmlReader::expectEndTag(parser, "IRETURNVALUE");
664 }
|
665 mike 1.2
666 return(new CIMDeleteClassResponseMessage(
667 messageId,
|
668 kumpf 1.12 cimException,
|
669 mike 1.2 QueueIdStack()));
670 }
671 }
672
673 CIMCreateInstanceResponseMessage* CIMOperationResponseDecoder::_decodeCreateInstanceResponse(
674 XmlParser& parser, const String& messageId)
675 {
676 XmlEntry entry;
|
677 kumpf 1.12 CIMException cimException;
|
678 mike 1.2
|
679 kumpf 1.12 if (XmlReader::getErrorElement(parser, cimException))
|
680 mike 1.2 {
681 return(new CIMCreateInstanceResponseMessage(
682 messageId,
|
683 kumpf 1.12 cimException,
|
684 mike 1.2 QueueIdStack(),
|
685 kumpf 1.21 CIMObjectPath()));
|
686 mike 1.2 }
687 else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
688 {
|
689 kumpf 1.21 CIMObjectPath instanceName;
|
690 mike 1.2 XmlReader::getInstanceNameElement(parser, instanceName);
691
692 XmlReader::testEndTag(parser, "IRETURNVALUE");
693
694 return(new CIMCreateInstanceResponseMessage(
695 messageId,
|
696 kumpf 1.12 cimException,
|
697 mike 1.2 QueueIdStack(),
698 instanceName));
699 }
700 else
701 {
702 throw XmlValidationError(parser.getLine(),
703 "expected ERROR or IRETURNVALUE element");
704 }
705 }
706
707 CIMGetInstanceResponseMessage* CIMOperationResponseDecoder::_decodeGetInstanceResponse(
708 XmlParser& parser, const String& messageId)
709 {
710 XmlEntry entry;
|
711 kumpf 1.12 CIMException cimException;
|
712 mike 1.2
|
713 kumpf 1.12 if (XmlReader::getErrorElement(parser, cimException))
|
714 mike 1.2 {
715 return(new CIMGetInstanceResponseMessage(
716 messageId,
|
717 kumpf 1.12 cimException,
|
718 mike 1.2 QueueIdStack(),
719 CIMInstance()));
720 }
721 else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
722 {
723 CIMInstance cimInstance;
724
725 if (!XmlReader::getInstanceElement(parser, cimInstance))
726 {
727 throw XmlValidationError(
728 parser.getLine(), "expected INSTANCE element");
729 }
730
731 XmlReader::testEndTag(parser, "IRETURNVALUE");
732
733 return(new CIMGetInstanceResponseMessage(
734 messageId,
|
735 kumpf 1.12 cimException,
|
736 mike 1.2 QueueIdStack(),
737 cimInstance));
738 }
739 else
740 {
741 throw XmlValidationError(parser.getLine(),
742 "expected ERROR or IRETURNVALUE element");
743 }
744 }
745
746 CIMModifyInstanceResponseMessage* CIMOperationResponseDecoder::_decodeModifyInstanceResponse(
747 XmlParser& parser, const String& messageId)
748 {
749 XmlEntry entry;
|
750 kumpf 1.12 CIMException cimException;
|
751 mike 1.2
|
752 kumpf 1.12 if (XmlReader::getErrorElement(parser, cimException))
|
753 mike 1.2 {
754 return(new CIMModifyInstanceResponseMessage(
755 messageId,
|
756 kumpf 1.12 cimException,
|
757 mike 1.2 QueueIdStack()));
758 }
|
759 kumpf 1.14 else
|
760 mike 1.2 {
|
761 kumpf 1.14 if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
762 {
763 XmlReader::expectEndTag(parser, "IRETURNVALUE");
764 }
|
765 mike 1.2
766 return(new CIMModifyInstanceResponseMessage(
767 messageId,
|
768 kumpf 1.12 cimException,
|
769 mike 1.2 QueueIdStack()));
770 }
771 }
772
773 CIMEnumerateInstanceNamesResponseMessage* CIMOperationResponseDecoder::_decodeEnumerateInstanceNamesResponse(
774 XmlParser& parser, const String& messageId)
775 {
776 XmlEntry entry;
|
777 kumpf 1.12 CIMException cimException;
|
778 mike 1.2
|
779 kumpf 1.12 if (XmlReader::getErrorElement(parser, cimException))
|
780 mike 1.2 {
781 return(new CIMEnumerateInstanceNamesResponseMessage(
782 messageId,
|
783 kumpf 1.12 cimException,
|
784 mike 1.2 QueueIdStack(),
|
785 kumpf 1.21 Array<CIMObjectPath>()));
|
786 mike 1.2 }
|
787 kumpf 1.14 else
|
788 mike 1.2 {
|
789 kumpf 1.21 Array<CIMObjectPath> instanceNames;
|
790 mike 1.2
|
791 karl 1.34.8.1 // KS 20020931 - Addition to allow empty tag return. BUGZILLA135
792 // WBEMServices returns this tag wneh no instances exist.
793 if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
794 if (entry.type != XmlEntry::EMPTY_TAG)
795 {
796 String className;
797 Array<CIMKeyBinding> keyBindings;
798
799 while (XmlReader::getInstanceNameElement(
800 parser, className, keyBindings))
801 {
802 CIMObjectPath r(
803 String::EMPTY,
804 String::EMPTY,
805 className,
806 keyBindings);
807 instanceNames.append(r);
808 }
809
810 XmlReader::expectEndTag(parser, "IRETURNVALUE");
811 }
|
812 mike 1.2
813 return(new CIMEnumerateInstanceNamesResponseMessage(
814 messageId,
|
815 kumpf 1.12 cimException,
|
816 mike 1.2 QueueIdStack(),
817 instanceNames));
818 }
819 }
820
821 CIMEnumerateInstancesResponseMessage* CIMOperationResponseDecoder::_decodeEnumerateInstancesResponse(
822 XmlParser& parser, const String& messageId)
823 {
824 XmlEntry entry;
|
825 kumpf 1.12 CIMException cimException;
|
826 mike 1.2
|
827 kumpf 1.12 if (XmlReader::getErrorElement(parser, cimException))
|
828 mike 1.2 {
829 return(new CIMEnumerateInstancesResponseMessage(
830 messageId,
|
831 kumpf 1.12 cimException,
|
832 mike 1.2 QueueIdStack(),
|
833 kumpf 1.23 Array<CIMInstance>()));
|
834 mike 1.2 }
|
835 kumpf 1.14 else
|
836 mike 1.2 {
|
837 kumpf 1.23 Array<CIMInstance> namedInstances;
|
838 karl 1.34.8.1
839 // KS 20020931 - Addition to allow empty tag return. BUGZILLA135
840 // WBEMServices returns this tag wneh no instances exist.
841 if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
842 if (entry.type != XmlEntry::EMPTY_TAG)
843 {
844 CIMInstance namedInstance;
845
846 while (XmlReader::getNamedInstanceElement(parser, namedInstance))
847 namedInstances.append(namedInstance);
848
849 XmlReader::expectEndTag(parser, "IRETURNVALUE");
850 }
|
851 mike 1.2
852 return(new CIMEnumerateInstancesResponseMessage(
853 messageId,
|
854 kumpf 1.12 cimException,
|
855 mike 1.2 QueueIdStack(),
856 namedInstances));
857 }
858 }
859
860 CIMDeleteInstanceResponseMessage* CIMOperationResponseDecoder::_decodeDeleteInstanceResponse(
861 XmlParser& parser, const String& messageId)
862 {
863 XmlEntry entry;
|
864 kumpf 1.12 CIMException cimException;
|
865 mike 1.2
|
866 kumpf 1.12 if (XmlReader::getErrorElement(parser, cimException))
|
867 mike 1.2 {
868 return(new CIMDeleteInstanceResponseMessage(
869 messageId,
|
870 kumpf 1.12 cimException,
|
871 mike 1.2 QueueIdStack()));
872 }
|
873 kumpf 1.14 else
|
874 mike 1.2 {
|
875 kumpf 1.14 if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
876 {
877 XmlReader::expectEndTag(parser, "IRETURNVALUE");
878 }
|
879 mike 1.2
880 return(new CIMDeleteInstanceResponseMessage(
881 messageId,
|
882 kumpf 1.12 cimException,
|
883 mike 1.2 QueueIdStack()));
884 }
885 }
886
887 CIMGetPropertyResponseMessage* CIMOperationResponseDecoder::_decodeGetPropertyResponse(
888 XmlParser& parser, const String& messageId)
889 {
890 XmlEntry entry;
|
891 kumpf 1.12 CIMException cimException;
|
892 mike 1.2
|
893 kumpf 1.12 if (XmlReader::getErrorElement(parser, cimException))
|
894 mike 1.2 {
895 return(new CIMGetPropertyResponseMessage(
896 messageId,
|
897 kumpf 1.12 cimException,
|
898 mike 1.2 QueueIdStack(),
899 CIMValue()));
900 }
|
901 kumpf 1.14 else
|
902 mike 1.2 {
|
903 kumpf 1.26 CIMValue cimValue(CIMTYPE_STRING, false);
|
904 kumpf 1.14
905 if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
906 {
907 if (!XmlReader::getPropertyValue(parser, cimValue))
908 {
909 // No value given; just return a null String value
910 }
911
912 XmlReader::expectEndTag(parser, "IRETURNVALUE");
913 }
914 else
|
915 mike 1.2 {
|
916 kumpf 1.14 // No value given; just return a null String value
|
917 mike 1.2 }
918
919 return(new CIMGetPropertyResponseMessage(
920 messageId,
|
921 kumpf 1.12 cimException,
|
922 mike 1.2 QueueIdStack(),
923 cimValue));
924 }
925 }
926
927 CIMSetPropertyResponseMessage* CIMOperationResponseDecoder::_decodeSetPropertyResponse(
928 XmlParser& parser, const String& messageId)
929 {
930 XmlEntry entry;
|
931 kumpf 1.12 CIMException cimException;
|
932 mike 1.2
|
933 kumpf 1.12 if (XmlReader::getErrorElement(parser, cimException))
|
934 mike 1.2 {
935 return(new CIMSetPropertyResponseMessage(
936 messageId,
|
937 kumpf 1.12 cimException,
|
938 mike 1.2 QueueIdStack()));
939 }
|
940 kumpf 1.14 else
|
941 mike 1.2 {
|
942 kumpf 1.14 if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
943 {
944 XmlReader::expectEndTag(parser, "IRETURNVALUE");
945 }
|
946 mike 1.2
947 return(new CIMSetPropertyResponseMessage(
948 messageId,
|
949 kumpf 1.12 cimException,
|
950 mike 1.2 QueueIdStack()));
951 }
952 }
953
954 CIMSetQualifierResponseMessage* CIMOperationResponseDecoder::_decodeSetQualifierResponse(
955 XmlParser& parser, const String& messageId)
956 {
957 XmlEntry entry;
|
958 kumpf 1.12 CIMException cimException;
|
959 mike 1.2
|
960 kumpf 1.12 if (XmlReader::getErrorElement(parser, cimException))
|
961 mike 1.2 {
962 return(new CIMSetQualifierResponseMessage(
963 messageId,
|
964 kumpf 1.12 cimException,
|
965 mike 1.2 QueueIdStack()));
966 }
|
967 kumpf 1.14 else
|
968 mike 1.2 {
|
969 kumpf 1.14 if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
970 {
971 XmlReader::expectEndTag(parser, "IRETURNVALUE");
972 }
|
973 mike 1.2
974 return(new CIMSetQualifierResponseMessage(
975 messageId,
|
976 kumpf 1.12 cimException,
|
977 mike 1.2 QueueIdStack()));
978 }
979 }
980
981 CIMGetQualifierResponseMessage* CIMOperationResponseDecoder::_decodeGetQualifierResponse(
982 XmlParser& parser, const String& messageId)
983 {
984 XmlEntry entry;
|
985 kumpf 1.12 CIMException cimException;
|
986 mike 1.2
|
987 kumpf 1.12 if (XmlReader::getErrorElement(parser, cimException))
|
988 mike 1.2 {
989 return(new CIMGetQualifierResponseMessage(
990 messageId,
|
991 kumpf 1.12 cimException,
|
992 mike 1.2 QueueIdStack(),
993 CIMQualifierDecl()));
994 }
995 else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
996 {
997 CIMQualifierDecl qualifierDecl;
998 XmlReader::getQualifierDeclElement(parser, qualifierDecl);
999
1000 XmlReader::testEndTag(parser, "IRETURNVALUE");
1001
1002 return(new CIMGetQualifierResponseMessage(
1003 messageId,
|
1004 kumpf 1.12 cimException,
|
1005 mike 1.2 QueueIdStack(),
1006 qualifierDecl));
1007 }
1008 else
1009 {
1010 throw XmlValidationError(parser.getLine(),
1011 "expected ERROR or IRETURNVALUE element");
1012 }
1013 }
1014
1015 CIMEnumerateQualifiersResponseMessage* CIMOperationResponseDecoder::_decodeEnumerateQualifiersResponse(
1016 XmlParser& parser, const String& messageId)
1017 {
1018 XmlEntry entry;
|
1019 kumpf 1.12 CIMException cimException;
|
1020 mike 1.2
|
1021 kumpf 1.12 if (XmlReader::getErrorElement(parser, cimException))
|
1022 mike 1.2 {
1023 return(new CIMEnumerateQualifiersResponseMessage(
1024 messageId,
|
1025 kumpf 1.12 cimException,
|
1026 mike 1.2 QueueIdStack(),
1027 Array<CIMQualifierDecl>()));
1028 }
|
1029 kumpf 1.14 else
|
1030 mike 1.2 {
1031 Array<CIMQualifierDecl> qualifierDecls;
1032
|
1033 karl 1.34.8.1 // KS 20020931 - Addition to allow empty tag return. BUGZILLA135
1034 // WBEMServices returns this tag wneh no instances exist.
1035 if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
1036 if (entry.type != XmlEntry::EMPTY_TAG)
1037 {
1038 CIMQualifierDecl qualifierDecl;
1039
1040 while (XmlReader::getQualifierDeclElement(parser, qualifierDecl))
1041 qualifierDecls.append(qualifierDecl);
1042
1043 XmlReader::expectEndTag(parser, "IRETURNVALUE");
1044 }
|
1045 mike 1.2
1046 return(new CIMEnumerateQualifiersResponseMessage(
1047 messageId,
|
1048 kumpf 1.12 cimException,
|
1049 mike 1.2 QueueIdStack(),
1050 qualifierDecls));
1051 }
1052 }
1053
1054 CIMDeleteQualifierResponseMessage* CIMOperationResponseDecoder::_decodeDeleteQualifierResponse(
1055 XmlParser& parser, const String& messageId)
1056 {
1057 XmlEntry entry;
|
1058 kumpf 1.12 CIMException cimException;
|
1059 mike 1.2
|
1060 kumpf 1.12 if (XmlReader::getErrorElement(parser, cimException))
|
1061 mike 1.2 {
1062 return(new CIMDeleteQualifierResponseMessage(
1063 messageId,
|
1064 kumpf 1.12 cimException,
|
1065 mike 1.2 QueueIdStack()));
1066 }
|
1067 kumpf 1.14 else
|
1068 mike 1.2 {
|
1069 kumpf 1.14 if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
1070 {
1071 XmlReader::expectEndTag(parser, "IRETURNVALUE");
1072 }
|
1073 mike 1.2
1074 return(new CIMDeleteQualifierResponseMessage(
1075 messageId,
|
1076 kumpf 1.12 cimException,
|
1077 mike 1.2 QueueIdStack()));
1078 }
1079 }
1080
|
1081 karl 1.34.8.1
1082 //********************Temporary code insertion**********************
1083 // KS 20021001 - Added this duplicate from xmlreader to test changes
1084 // BUGZILLA 136
1085 // for wbemservices problem where it does not return objectpath element
1086 // Tests for ObjectPath OR InstancePathelemen or classpath element
1087 Boolean _getObjectPathElement(
1088 XmlParser& parser,
1089 CIMObjectPath& objectPath)
1090 {
1091 XmlEntry entry;
1092
1093 if (!XmlReader::testStartTag(parser, entry, "OBJECTPATH"))
1094 { // loop for the interop test
1095 //See getValueReferenceElement for good code.
1096 if (!parser.next(entry))
1097 throw XmlException(XmlException::UNCLOSED_TAGS, parser.getLine());
1098 if (entry.type != XmlEntry::START_TAG &&
1099 entry.type != XmlEntry::EMPTY_TAG)
1100 {
1101 parser.putBack(entry);
1102 karl 1.34.8.1 return false;
1103 }
1104 if (strcmp(entry.text, "CLASSPATH") == 0)
1105 {
1106 parser.putBack(entry);
1107 XmlReader::getClassPathElement(parser, objectPath);
1108 return true;
1109 }
1110 else if (strcmp(entry.text, "LOCALCLASSPATH") == 0)
1111 {
1112 parser.putBack(entry);
1113 XmlReader::getLocalClassPathElement(parser, objectPath);
1114 return true;
1115 }
1116 else if (strcmp(entry.text, "CLASSNAME") == 0)
1117 {
1118 parser.putBack(entry);
1119 CIMName className;
1120 XmlReader::getClassNameElement(parser, className);
1121 objectPath.set(String(), CIMNamespaceName(), className);
1122 return true;
1123 karl 1.34.8.1 }
1124 else if (strcmp(entry.text, "INSTANCEPATH") == 0)
1125 {
1126 parser.putBack(entry);
1127 XmlReader::getInstancePathElement(parser, objectPath);
1128 return true;
1129 }
1130 else if (strcmp(entry.text, "LOCALINSTANCEPATH") == 0)
1131 {
1132 parser.putBack(entry);
1133 XmlReader::getLocalInstancePathElement(parser, objectPath);
1134 return true;
1135 }
1136 else if (strcmp(entry.text, "INSTANCENAME") == 0)
1137 {
1138 parser.putBack(entry);
1139 String className;
1140 Array<CIMKeyBinding> keyBindings;
1141 XmlReader::getInstanceNameElement(parser, className, keyBindings);
1142 objectPath.set(String(), CIMNamespaceName(), className, keyBindings);
1143 return true;
1144 karl 1.34.8.1 }
1145 return false;
1146 }
1147
1148 if (XmlReader::getClassPathElement(parser, objectPath))
1149 {
1150 XmlReader::expectEndTag(parser, "OBJECTPATH");
1151 return true;
1152 }
1153 else if (XmlReader::getInstancePathElement(parser, objectPath))
1154 {
1155 XmlReader::expectEndTag(parser, "OBJECTPATH");
1156 return true;
1157 }
1158 else
1159 {
1160 throw XmlValidationError(parser.getLine(),
1161 "expected INSTANCEPATH or CLASSPATH element");
1162 }
1163
1164 PEGASUS_UNREACHABLE ( return false; )
1165 karl 1.34.8.1 }
1166 //*******************END of Temporary code insertion******
1167
|
1168 mike 1.2
1169 CIMReferenceNamesResponseMessage* CIMOperationResponseDecoder::_decodeReferenceNamesResponse(
1170 XmlParser& parser, const String& messageId)
1171 {
1172 XmlEntry entry;
|
1173 kumpf 1.12 CIMException cimException;
|
1174 mike 1.2
|
1175 kumpf 1.12 if (XmlReader::getErrorElement(parser, cimException))
|
1176 mike 1.2 {
1177 return(new CIMReferenceNamesResponseMessage(
1178 messageId,
|
1179 kumpf 1.12 cimException,
|
1180 mike 1.2 QueueIdStack(),
|
1181 kumpf 1.21 Array<CIMObjectPath>()));
|
1182 mike 1.2 }
|
1183 kumpf 1.14 else
|
1184 mike 1.2 {
|
1185 kumpf 1.21 Array<CIMObjectPath> objectPaths;
|
1186 mike 1.2
|
1187 karl 1.34.8.1 // KS 20020931 - Addition to allow empty tag return. BUGZILLA135
1188 // WBEMServices returns this tag wneh no instances exist.
1189 if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
1190 if (entry.type != XmlEntry::EMPTY_TAG)
1191 {
1192 CIMObjectPath objectPath;
1193
1194 // KS 20021001 - Call local version of getobjectpath for
1195 // client responses. BUGZILLA 136. This added to correct
1196 // for Wbemservices problem (treats objectpath and instancepath
1197 // tags as optional) and should be removed when these problems
1198 // are corrected permanently.
1199
1200 //while (XmlReader::getObjectPathElement(parser, objectPath))
1201 // objectPaths.append(objectPath);
1202
1203 while (_getObjectPathElement(parser, objectPath))
1204 objectPaths.append(objectPath);
1205
1206 // End of BUGZILLA 136 fix
1207
1208 karl 1.34.8.1 XmlReader::expectEndTag(parser, "IRETURNVALUE");
1209 }
|
1210 mike 1.2
1211 return(new CIMReferenceNamesResponseMessage(
1212 messageId,
|
1213 kumpf 1.12 cimException,
|
1214 mike 1.2 QueueIdStack(),
1215 objectPaths));
1216 }
1217 }
1218
1219 CIMReferencesResponseMessage* CIMOperationResponseDecoder::_decodeReferencesResponse(
1220 XmlParser& parser, const String& messageId)
1221 {
1222 XmlEntry entry;
|
1223 kumpf 1.12 CIMException cimException;
|
1224 mike 1.2
|
1225 kumpf 1.12 if (XmlReader::getErrorElement(parser, cimException))
|
1226 mike 1.2 {
1227 return(new CIMReferencesResponseMessage(
1228 messageId,
|
1229 kumpf 1.12 cimException,
|
1230 mike 1.2 QueueIdStack(),
|
1231 kumpf 1.24 Array<CIMObject>()));
|
1232 mike 1.2 }
|
1233 kumpf 1.14 else
|
1234 mike 1.2 {
|
1235 kumpf 1.24 Array<CIMObject> objectWithPathArray;
|
1236 mike 1.2
|
1237 karl 1.34.8.1
1238 // KS 20020931 - Addition to allow empty tag return. BUGZILLA135
1239 // WBEMServices returns this tag wneh no instances exist.
1240 if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
1241 if (entry.type != XmlEntry::EMPTY_TAG)
1242 {
1243 CIMObject objectWithPath;
1244
1245 while (XmlReader::getValueObjectWithPathElement(parser, objectWithPath))
1246 objectWithPathArray.append(objectWithPath);
1247
1248 XmlReader::expectEndTag(parser, "IRETURNVALUE");
1249 }
|
1250 mike 1.2
1251 return(new CIMReferencesResponseMessage(
1252 messageId,
|
1253 kumpf 1.12 cimException,
|
1254 mike 1.2 QueueIdStack(),
1255 objectWithPathArray));
1256 }
1257 }
1258
1259 CIMAssociatorNamesResponseMessage* CIMOperationResponseDecoder::_decodeAssociatorNamesResponse(
1260 XmlParser& parser, const String& messageId)
1261 {
1262 XmlEntry entry;
|
1263 kumpf 1.12 CIMException cimException;
|
1264 mike 1.2
|
1265 kumpf 1.12 if (XmlReader::getErrorElement(parser, cimException))
|
1266 mike 1.2 {
1267 return(new CIMAssociatorNamesResponseMessage(
1268 messageId,
|
1269 kumpf 1.12 cimException,
|
1270 mike 1.2 QueueIdStack(),
|
1271 kumpf 1.21 Array<CIMObjectPath>()));
|
1272 mike 1.2 }
|
1273 kumpf 1.14 else
|
1274 mike 1.2 {
|
1275 kumpf 1.21 Array<CIMObjectPath> objectPaths;
|
1276 karl 1.34.8.1
1277 // KS 20020931 - Addition to allow empty tag return. BUGZILLA 135
1278 // WBEMServices returns this tag wneh no instances exist.
1279 if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
1280 if (entry.type != XmlEntry::EMPTY_TAG)
1281 {
1282 CIMObjectPath objectPath;
1283
1284 // KS 20021001 - Call local version of getobjectpath for
1285 // client responses. BUGZILLA 136. This added to correct
1286 // for Wbemservices problem (treats objectpath and instancepath
1287 // tags as optional) and should be removed when these problems
1288 // are corrected permanently.
1289
1290 //while (XmlReader::getObjectPathElement(parser, objectPath))
1291 // objectPaths.append(objectPath);
1292
1293 while (_getObjectPathElement(parser, objectPath))
1294 objectPaths.append(objectPath);
1295 // End of BUGZILLA 136 fix
1296
1297 karl 1.34.8.1 XmlReader::expectEndTag(parser, "IRETURNVALUE");
1298 }
|
1299 mike 1.2
1300 return(new CIMAssociatorNamesResponseMessage(
1301 messageId,
|
1302 kumpf 1.12 cimException,
|
1303 mike 1.2 QueueIdStack(),
1304 objectPaths));
1305 }
1306 }
1307
1308 CIMAssociatorsResponseMessage* CIMOperationResponseDecoder::_decodeAssociatorsResponse(
1309 XmlParser& parser, const String& messageId)
1310 {
1311 XmlEntry entry;
|
1312 kumpf 1.12 CIMException cimException;
|
1313 mike 1.2
|
1314 kumpf 1.12 if (XmlReader::getErrorElement(parser, cimException))
|
1315 mike 1.2 {
1316 return(new CIMAssociatorsResponseMessage(
1317 messageId,
|
1318 kumpf 1.12 cimException,
|
1319 mike 1.2 QueueIdStack(),
|
1320 kumpf 1.24 Array<CIMObject>()));
|
1321 mike 1.2 }
|
1322 kumpf 1.14 else
|
1323 mike 1.2 {
|
1324 kumpf 1.24 Array<CIMObject> objectWithPathArray;
|
1325 mike 1.2
|
1326 karl 1.34.8.1 // KS 20020931 - Addition to allow empty tag return.
1327 // WBEMServices returns this tag wneh no instances exist.
1328 if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
1329 if (entry.type != XmlEntry::EMPTY_TAG)
1330 {
1331 CIMObject objectWithPath;
1332
1333 while (XmlReader::getValueObjectWithPathElement(parser, objectWithPath))
1334 objectWithPathArray.append(objectWithPath);
1335
1336 XmlReader::expectEndTag(parser, "IRETURNVALUE");
1337 }
|
1338 mike 1.2
1339 return(new CIMAssociatorsResponseMessage(
|
1340 kumpf 1.10 messageId,
|
1341 kumpf 1.12 cimException,
|
1342 kumpf 1.10 QueueIdStack(),
1343 objectWithPathArray));
1344 }
1345 }
1346
1347 CIMExecQueryResponseMessage* CIMOperationResponseDecoder::_decodeExecQueryResponse(
1348 XmlParser& parser, const String& messageId)
1349 {
1350 XmlEntry entry;
|
1351 kumpf 1.12 CIMException cimException;
|
1352 kumpf 1.10
|
1353 kumpf 1.12 if (XmlReader::getErrorElement(parser, cimException))
|
1354 kumpf 1.10 {
1355 return(new CIMExecQueryResponseMessage(
1356 messageId,
|
1357 kumpf 1.12 cimException,
|
1358 kumpf 1.10 QueueIdStack(),
|
1359 kumpf 1.24 Array<CIMObject>()));
|
1360 kumpf 1.10 }
|
1361 kumpf 1.14 else
|
1362 kumpf 1.10 {
|
1363 kumpf 1.24 Array<CIMObject> objectWithPathArray;
|
1364 kumpf 1.10
|
1365 kumpf 1.14 if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
1366 {
1367 XmlReader::getObjectArray(parser, objectWithPathArray);
|
1368 kumpf 1.10
|
1369 kumpf 1.14 XmlReader::expectEndTag(parser, "IRETURNVALUE");
1370 }
|
1371 kumpf 1.10
1372 return(new CIMExecQueryResponseMessage(
|
1373 mike 1.2 messageId,
|
1374 kumpf 1.12 cimException,
|
1375 mike 1.2 QueueIdStack(),
1376 objectWithPathArray));
1377 }
1378 }
1379
1380 CIMInvokeMethodResponseMessage* CIMOperationResponseDecoder::_decodeInvokeMethodResponse(
1381 XmlParser& parser, const String& messageId, const String& methodName)
1382 {
1383 XmlEntry entry;
|
1384 kumpf 1.12 CIMException cimException;
|
1385 mike 1.2
|
1386 kumpf 1.5 CIMParamValue paramValue;
1387 Array<CIMParamValue> outParameters;
|
1388 kumpf 1.6 CIMValue returnValue;
|
1389 mike 1.2 const char* paramName;
1390 String inValue;
1391
|
1392 kumpf 1.12 if (XmlReader::getErrorElement(parser, cimException))
|
1393 mike 1.2 {
1394 return(new CIMInvokeMethodResponseMessage(
1395 messageId,
|
1396 kumpf 1.12 cimException,
|
1397 mike 1.2 QueueIdStack(),
|
1398 kumpf 1.6 returnValue,
|
1399 mike 1.2 outParameters,
1400 methodName));
1401 }
|
1402 kumpf 1.4 else
|
1403 mike 1.2 {
|
1404 kumpf 1.4 Boolean isReturnValue = false;
1405 Boolean isParamValue = false;
1406 Boolean gotReturnValue = false;
1407
1408 while ((isReturnValue =
|
1409 kumpf 1.6 XmlReader::getReturnValueElement(parser, returnValue)) ||
|
1410 kumpf 1.5 (isParamValue =
1411 XmlReader::getParamValueElement(parser, paramValue)))
|
1412 kumpf 1.4 {
1413 if (isReturnValue)
1414 {
1415 if (gotReturnValue)
1416 {
1417 throw XmlValidationError(parser.getLine(),
1418 "unexpected RETURNVALUE element");
1419 }
1420 gotReturnValue = true;
1421 }
1422 else // isParamValue == true
1423 {
|
1424 kumpf 1.5 outParameters.append(paramValue);
|
1425 kumpf 1.4 }
1426
1427 isReturnValue = false;
1428 isParamValue = false;
1429 }
1430
|
1431 mike 1.2 return(new CIMInvokeMethodResponseMessage(
1432 messageId,
|
1433 kumpf 1.12 cimException,
|
1434 mike 1.2 QueueIdStack(),
|
1435 kumpf 1.6 returnValue,
|
1436 mike 1.2 outParameters,
1437 methodName));
1438 }
1439 }
1440
1441 PEGASUS_NAMESPACE_END
|