1 mike 1.1.2.1 //%/////////////////////////////////////////////////////////////////////////////
2 //
|
3 kumpf 1.1.2.5 // Copyright (c) 2000, 2001 BMC Software, Hewlett-Packard Company, IBM,
4 // The Open Group, Tivoli Systems
|
5 mike 1.1.2.1 //
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 //
13 // 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 kumpf 1.1.2.5 // Modified By: Nitin Upasani, Hewlett-Packard Company (Nitin_Upasani@hp.com)
|
27 kumpf 1.1.2.11 // Yi Zhou, Hewlett-Packard Company (yi_zhou@hp.com)
|
28 kumpf 1.1.2.10 // Nag Boranna, Hewlett-Packard Company (nagaraja_boranna@hp.com)
|
29 kumpf 1.1.2.11 // Roger Kumpf, Hewlett-Packard Company (roger_kumpf@hp.com)
|
30 kumpf 1.1.2.10 //
|
31 mike 1.1.2.1 //%/////////////////////////////////////////////////////////////////////////////
32
33 #include <iostream>
34 #include <Pegasus/Common/Config.h>
|
35 mike 1.1.2.2 #include <Pegasus/Common/XmlParser.h>
36 #include <Pegasus/Common/XmlReader.h>
|
37 mike 1.1.2.1 #include <Pegasus/Common/System.h>
38 #include <Pegasus/Common/XmlWriter.h>
39 #include <Pegasus/Common/HTTPMessage.h>
40 #include <Pegasus/Common/CIMMessage.h>
41 #include "CIMOperationResponseDecoder.h"
42
43 PEGASUS_USING_STD;
44
45 PEGASUS_NAMESPACE_BEGIN
46
47 CIMOperationResponseDecoder::CIMOperationResponseDecoder(
|
48 kumpf 1.1.2.10 MessageQueue* outputQueue,
49 MessageQueue* encoderQueue,
50 ClientAuthenticator* authenticator)
51 :
52 _outputQueue(outputQueue),
53 _encoderQueue(encoderQueue),
54 _authenticator(authenticator)
|
55 mike 1.1.2.1 {
56
57 }
58
59 CIMOperationResponseDecoder::~CIMOperationResponseDecoder()
60 {
61
62 }
63
|
64 kumpf 1.1.2.10 void CIMOperationResponseDecoder::setEncoderQueue(MessageQueue* encoderQueue)
65 {
66 _encoderQueue = encoderQueue;
67 }
68
|
69 mike 1.1.2.1 void CIMOperationResponseDecoder::handleEnqueue()
70 {
71 Message* message = dequeue();
72
73 if (!message)
74 return;
75
76 switch (message->getType())
77 {
78 case HTTP_MESSAGE:
79 {
80 HTTPMessage* httpMessage = (HTTPMessage*)message;
|
81 mike 1.1.2.2 _handleHTTPMessage(httpMessage);
82 break;
|
83 mike 1.1.2.1 }
84
85 default:
86 // ATTN: send this to the orphan queue!
87 break;
88 }
89
90 delete message;
91 }
92
93 const char* CIMOperationResponseDecoder::getQueueName() const
94 {
95 return "CIMOperationResponseDecoder";
96 }
97
|
98 mike 1.1.2.2 void CIMOperationResponseDecoder::_handleHTTPMessage(HTTPMessage* httpMessage)
99 {
100 //
101 // Parse the HTTP message:
102 //
103
104 String startLine;
105 Array<HTTPHeader> headers;
106 Sint8* content;
107 Uint32 contentLength;
108
|
109 kumpf 1.1.2.12 httpMessage->parse(startLine, headers, contentLength);
|
110 mike 1.1.2.2
|
111 kumpf 1.1.2.10 if (_authenticator->checkResponseHeaderForChallenge(headers))
112 {
113 //
114 // Get the original request, put that in the encoder's queue for
115 // re-sending with authentication challenge response.
116 //
117
118 Message* reqMessage = _authenticator->getRequestMessage();
119 _encoderQueue->enqueue(reqMessage);
120
121 return;
122 }
123 else
124 {
125
126 //
127 // Received a valid/error response from the server.
128 // We do not need the original request message anymore, hence delete
129 // the request message by getting the handle from the ClientAuthenticator.
130 //
131 Message* reqMessage = _authenticator->getRequestMessage();
132 kumpf 1.1.2.10 if (reqMessage)
133 {
134 delete reqMessage;
135 }
136 }
137
|
138 mike 1.1.2.2 //
139 // Search for "CIMOperation" header:
140 //
141
142 String cimOperation;
143
144 if (!HTTPMessage::lookupHeader(
145 headers, "*CIMOperation", cimOperation, true))
146 {
147 // ATTN: error discarded at this time!
148 return;
149 }
150
151 //
152 // Zero-terminate the message:
153 //
154
155 httpMessage->message.append('\0');
|
156 kumpf 1.1.2.12
157 // Calculate the beginning of the content from the message size and
158 // the content length. Subtract 1 to take into account the null
159 // character we just added to the end of the message.
160
161 content = (Sint8*) httpMessage->message.getData() +
162 httpMessage->message.size() - contentLength - 1;
|
163 mike 1.1.2.2
164 //
165 // If it is a method response, then dispatch it to be handled:
166 //
167
|
168 mike 1.1.2.4 if (!String::equalNoCase(cimOperation, "MethodResponse"))
|
169 mike 1.1.2.2 {
170 // ATTN: error discarded at this time!
171 return;
172 }
173
174 _handleMethodResponse(content);
175 }
176
177 void CIMOperationResponseDecoder::_handleMethodResponse(char* content)
178 {
|
179 mike 1.1.2.9 Message* response = 0;
180
|
181 mike 1.1.2.2 //
182 // Create and initialize XML parser:
183 //
184
185 XmlParser parser((char*)content);
186 XmlEntry entry;
187
188 try
189 {
190 //
191 // Process <?xml ... >
192 //
193
194 XmlReader::expectXmlDeclaration(parser, entry);
195
196 //
197 // Process <CIM ... >
198 //
199
200 XmlReader::testCimStartTag(parser);
201
202 mike 1.1.2.2 //
203 // Expect <MESSAGE ... >
204 //
205
206 String messageId;
207 const char* protocolVersion = 0;
208
209 if (!XmlReader::getMessageStartTag(parser, messageId, protocolVersion))
210 throw XmlValidationError(
211 parser.getLine(), "expected MESSAGE element");
212
213 if (strcmp(protocolVersion, "1.0") != 0)
214 {
215 // ATTN: protocol version being ignored at present!
216
217 return;
218 }
219
220 //
221 // Expect <SIMPLERSP ... >
222 //
223 mike 1.1.2.2
224 XmlReader::expectStartTag(parser, entry, "SIMPLERSP");
225
226 //
227 // Expect <IMETHODRESPONSE ... >
228 //
229
230 const char* iMethodResponseName = 0;
231
|
232 kumpf 1.1.2.5 if (XmlReader::getIMethodResponseStartTag(parser, iMethodResponseName))
|
233 mike 1.1.2.2 {
|
234 kumpf 1.1.2.5 //
235 // Dispatch the method:
236 //
237
238 if (EqualNoCase(iMethodResponseName, "GetClass"))
|
239 kumpf 1.1.2.6 response = _decodeGetClassResponse(parser, messageId);
|
240 kumpf 1.1.2.5 else if (EqualNoCase(iMethodResponseName, "GetInstance"))
|
241 kumpf 1.1.2.6 response = _decodeGetInstanceResponse(parser, messageId);
|
242 kumpf 1.1.2.5 else if (EqualNoCase(iMethodResponseName, "EnumerateClassNames"))
|
243 mike 1.1.2.9 response = _decodeEnumerateClassNamesResponse(parser,messageId);
|
244 kumpf 1.1.2.5 else if (EqualNoCase(iMethodResponseName, "References"))
|
245 kumpf 1.1.2.6 response = _decodeReferencesResponse(parser, messageId);
|
246 kumpf 1.1.2.5 else if (EqualNoCase(iMethodResponseName, "ReferenceNames"))
|
247 kumpf 1.1.2.6 response = _decodeReferenceNamesResponse(parser, messageId);
|
248 kumpf 1.1.2.5 else if (EqualNoCase(iMethodResponseName, "AssociatorNames"))
|
249 kumpf 1.1.2.6 response = _decodeAssociatorNamesResponse(parser, messageId);
|
250 kumpf 1.1.2.5 else if (EqualNoCase(iMethodResponseName, "Associators"))
|
251 kumpf 1.1.2.6 response = _decodeAssociatorsResponse(parser, messageId);
|
252 kumpf 1.1.2.5 else if (EqualNoCase(iMethodResponseName, "CreateInstance"))
|
253 kumpf 1.1.2.6 response = _decodeCreateInstanceResponse(parser, messageId);
|
254 kumpf 1.1.2.5 else if (EqualNoCase(iMethodResponseName,"EnumerateInstanceNames"))
|
255 mike 1.1.2.9 response = _decodeEnumerateInstanceNamesResponse(
|
256 kumpf 1.1.2.10 parser, messageId);
|
257 kumpf 1.1.2.8 else if (EqualNoCase(iMethodResponseName,"EnumerateInstances"))
258 response = _decodeEnumerateInstancesResponse(parser, messageId);
259 else if (EqualNoCase(iMethodResponseName, "GetProperty"))
260 response = _decodeGetPropertyResponse(parser, messageId);
261 else if (EqualNoCase(iMethodResponseName, "SetProperty"))
262 response = _decodeSetPropertyResponse(parser, messageId);
|
263 kumpf 1.1.2.5 else if (EqualNoCase(iMethodResponseName, "DeleteQualifier"))
|
264 kumpf 1.1.2.6 response = _decodeDeleteQualifierResponse(parser, messageId);
|
265 kumpf 1.1.2.5 else if (EqualNoCase(iMethodResponseName, "GetQualifier"))
|
266 kumpf 1.1.2.6 response = _decodeGetQualifierResponse(parser, messageId);
|
267 kumpf 1.1.2.5 else if (EqualNoCase(iMethodResponseName, "SetQualifier"))
|
268 kumpf 1.1.2.6 response = _decodeSetQualifierResponse(parser, messageId);
|
269 kumpf 1.1.2.5 else if (EqualNoCase(iMethodResponseName, "EnumerateQualifiers"))
|
270 mike 1.1.2.9 response = _decodeEnumerateQualifiersResponse(parser,messageId);
|
271 kumpf 1.1.2.5 else if (EqualNoCase(iMethodResponseName, "EnumerateClasses"))
|
272 kumpf 1.1.2.6 response = _decodeEnumerateClassesResponse(parser, messageId);
|
273 kumpf 1.1.2.5 else if (EqualNoCase(iMethodResponseName, "CreateClass"))
|
274 kumpf 1.1.2.6 response = _decodeCreateClassResponse(parser, messageId);
|
275 kumpf 1.1.2.5 else if (EqualNoCase(iMethodResponseName, "ModifyClass"))
|
276 kumpf 1.1.2.6 response = _decodeModifyClassResponse(parser, messageId);
|
277 kumpf 1.1.2.5 else if (EqualNoCase(iMethodResponseName, "ModifyInstance"))
|
278 kumpf 1.1.2.6 response = _decodeModifyInstanceResponse(parser, messageId);
|
279 kumpf 1.1.2.5 else if (EqualNoCase(iMethodResponseName, "DeleteClass"))
|
280 kumpf 1.1.2.6 response = _decodeDeleteClassResponse(parser, messageId);
|
281 kumpf 1.1.2.5 else if (EqualNoCase(iMethodResponseName, "DeleteInstance"))
|
282 kumpf 1.1.2.6 response = _decodeDeleteInstanceResponse(parser, messageId);
|
283 mike 1.1.2.9 else
284 {
|
285 kumpf 1.1.2.10 // ATTN: This message is received due to InvokeMethod
286 // from Serevr
|
287 mike 1.1.2.9
|
288 kumpf 1.1.2.10 // We better return since response is unitialized if
289 // this is reached. For now we print a message:
290
291 cout << "INFORM: " << __FILE__ << "(" << __LINE__ << "): ";
292 cout << "Unexpected case" << endl;
293 return;
|
294 mike 1.1.2.9 }
|
295 kumpf 1.1.2.5
296 //
297 // Handle end tags:
298 //
|
299 mike 1.1.2.2
|
300 kumpf 1.1.2.5 XmlReader::expectEndTag(parser, "IMETHODRESPONSE");
|
301 mike 1.1.2.2 }
|
302 kumpf 1.1.2.5 else if (XmlReader::getMethodResponseStartTag(parser,
303 iMethodResponseName))
304 {
|
305 mike 1.1.2.9 response = _decodeInvokeMethodResponse(
|
306 kumpf 1.1.2.10 parser, messageId, iMethodResponseName);
|
307 mike 1.1.2.2
|
308 kumpf 1.1.2.5 //
309 // Handle end tags:
310 //
311 XmlReader::expectEndTag(parser, "METHODRESPONSE");
312 }
313 else
314 {
315 // ATTN: error ignored for now!
|
316 mike 1.1.2.2
|
317 kumpf 1.1.2.5 return;
318 }
|
319 mike 1.1.2.2
320 XmlReader::expectEndTag(parser, "SIMPLERSP");
321 XmlReader::expectEndTag(parser, "MESSAGE");
322 XmlReader::expectEndTag(parser, "CIM");
323 }
324 catch (Exception& x)
325 {
326 // ATTN: ignore the exception for now!
327
328 cout << x.getMessage() << endl;
329 return;
330 }
|
331 kumpf 1.1.2.6
332 _outputQueue->enqueue(response);
|
333 mike 1.1.2.2 }
334
|
335 kumpf 1.1.2.6 CIMCreateClassResponseMessage* CIMOperationResponseDecoder::_decodeCreateClassResponse(
|
336 mike 1.1.2.2 XmlParser& parser,
337 const String& messageId)
|
338 mike 1.1.2.1 {
|
339 mike 1.1.2.3 XmlEntry entry;
340 CIMStatusCode code;
341 const char* description = 0;
342
343 if (XmlReader::getErrorElement(parser, code, description))
344 {
|
345 kumpf 1.1.2.6 return(new CIMCreateClassResponseMessage(
|
346 mike 1.1.2.3 messageId,
347 code,
348 description,
349 QueueIdStack()));
350
351 }
352 else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
353 {
354 XmlReader::testEndTag(parser, "IRETURNVALUE");
355
|
356 kumpf 1.1.2.6 return(new CIMCreateClassResponseMessage(
|
357 mike 1.1.2.3 messageId,
358 CIM_ERR_SUCCESS,
359 String(),
360 QueueIdStack()));
361 }
362 else
363 {
364 throw XmlValidationError(parser.getLine(),
365 "expected ERROR or IRETURNVALUE element");
366 }
|
367 mike 1.1.2.1 }
368
|
369 kumpf 1.1.2.6 CIMGetClassResponseMessage* CIMOperationResponseDecoder::_decodeGetClassResponse(
|
370 mike 1.1.2.2 XmlParser& parser, const String& messageId)
|
371 mike 1.1.2.1 {
|
372 mike 1.1.2.2 XmlEntry entry;
373 CIMStatusCode code;
374 const char* description = 0;
375
376 if (XmlReader::getErrorElement(parser, code, description))
377 {
|
378 kumpf 1.1.2.6 return(new CIMGetClassResponseMessage(
|
379 mike 1.1.2.2 messageId,
380 code,
381 description,
382 QueueIdStack(),
|
383 mike 1.1.2.3 CIMClass()));
|
384 mike 1.1.2.2 }
385 else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
386 {
387 CIMClass cimClass;
388
389 if (!XmlReader::getClassElement(parser, cimClass))
390 throw XmlValidationError(parser.getLine(),"expected CLASS element");
391
392 XmlReader::testEndTag(parser, "IRETURNVALUE");
393
|
394 kumpf 1.1.2.6 return(new CIMGetClassResponseMessage(
|
395 mike 1.1.2.2 messageId,
396 CIM_ERR_SUCCESS,
397 String(),
398 QueueIdStack(),
|
399 mike 1.1.2.3 cimClass));
|
400 mike 1.1.2.2 }
401 else
402 {
403 throw XmlValidationError(parser.getLine(),
404 "expected ERROR or IRETURNVALUE element");
405 }
|
406 mike 1.1.2.1 }
407
|
408 kumpf 1.1.2.6 CIMModifyClassResponseMessage* CIMOperationResponseDecoder::_decodeModifyClassResponse(
|
409 mike 1.1.2.2 XmlParser& parser, const String& messageId)
|
410 mike 1.1.2.1 {
|
411 mike 1.1.2.3 XmlEntry entry;
412 CIMStatusCode code;
413 const char* description = 0;
414
415 if (XmlReader::getErrorElement(parser, code, description))
416 {
|
417 kumpf 1.1.2.6 return(new CIMModifyClassResponseMessage(
|
418 mike 1.1.2.3 messageId,
419 code,
420 description,
421 QueueIdStack()));
422 }
423 else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
424 {
425 XmlReader::testEndTag(parser, "IRETURNVALUE");
426
|
427 kumpf 1.1.2.6 return(new CIMModifyClassResponseMessage(
|
428 mike 1.1.2.3 messageId,
429 CIM_ERR_SUCCESS,
430 String(),
431 QueueIdStack()));
432 }
433 else
434 {
435 throw XmlValidationError(parser.getLine(),
436 "expected ERROR or IRETURNVALUE element");
437 }
|
438 mike 1.1.2.1 }
439
|
440 kumpf 1.1.2.6 CIMEnumerateClassNamesResponseMessage* CIMOperationResponseDecoder::_decodeEnumerateClassNamesResponse(
|
441 mike 1.1.2.2 XmlParser& parser, const String& messageId)
|
442 mike 1.1.2.1 {
|
443 mike 1.1.2.3 XmlEntry entry;
444 CIMStatusCode code;
445 const char* description = 0;
446
447 if (XmlReader::getErrorElement(parser, code, description))
448 {
|
449 kumpf 1.1.2.6 return(new CIMEnumerateClassNamesResponseMessage(
|
450 mike 1.1.2.3 messageId,
451 code,
452 description,
453 QueueIdStack(),
454 Array<String>()));
455 }
456 else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
457 {
458 Array<String> classNames;
459 String className;
460
461 while (XmlReader::getClassNameElement(parser, className, false))
462 classNames.append(className);
463
464 XmlReader::testEndTag(parser, "IRETURNVALUE");
465
|
466 kumpf 1.1.2.6 return(new CIMEnumerateClassNamesResponseMessage(
|
467 mike 1.1.2.3 messageId,
468 CIM_ERR_SUCCESS,
469 String(),
470 QueueIdStack(),
471 classNames));
472 }
473 else
474 {
475 throw XmlValidationError(parser.getLine(),
476 "expected ERROR or IRETURNVALUE element");
477 }
|
478 mike 1.1.2.1 }
479
|
480 kumpf 1.1.2.6 CIMEnumerateClassesResponseMessage* CIMOperationResponseDecoder::_decodeEnumerateClassesResponse(
|
481 mike 1.1.2.2 XmlParser& parser, const String& messageId)
|
482 mike 1.1.2.1 {
|
483 mike 1.1.2.3 XmlEntry entry;
484 CIMStatusCode code;
485 const char* description = 0;
486
487 if (XmlReader::getErrorElement(parser, code, description))
488 {
|
489 kumpf 1.1.2.6 return(new CIMEnumerateClassesResponseMessage(
|
490 mike 1.1.2.3 messageId,
491 code,
492 description,
493 QueueIdStack(),
494 Array<CIMClass>()));
495 }
496 else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
497 {
498 Array<CIMClass> cimClasses;
499 CIMClass cimClass;
500
501 while (XmlReader::getClassElement(parser, cimClass))
502 cimClasses.append(cimClass);
503
504 XmlReader::testEndTag(parser, "IRETURNVALUE");
505
|
506 kumpf 1.1.2.6 return(new CIMEnumerateClassesResponseMessage(
|
507 mike 1.1.2.3 messageId,
508 CIM_ERR_SUCCESS,
509 String(),
510 QueueIdStack(),
511 cimClasses));
512 }
513 else
514 {
515 throw XmlValidationError(parser.getLine(),
516 "expected ERROR or IRETURNVALUE element");
517 }
|
518 mike 1.1.2.1 }
519
|
520 kumpf 1.1.2.6 CIMDeleteClassResponseMessage* CIMOperationResponseDecoder::_decodeDeleteClassResponse(
|
521 mike 1.1.2.2 XmlParser& parser, const String& messageId)
|
522 mike 1.1.2.1 {
|
523 mike 1.1.2.3 XmlEntry entry;
524 CIMStatusCode code;
525 const char* description = 0;
526
527 if (XmlReader::getErrorElement(parser, code, description))
528 {
|
529 kumpf 1.1.2.6 return(new CIMDeleteClassResponseMessage(
|
530 mike 1.1.2.3 messageId,
531 code,
532 description,
533 QueueIdStack()));
534 }
535 else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
536 {
537 XmlReader::testEndTag(parser, "IRETURNVALUE");
538
|
539 kumpf 1.1.2.6 return(new CIMDeleteClassResponseMessage(
|
540 mike 1.1.2.3 messageId,
541 CIM_ERR_SUCCESS,
542 String(),
543 QueueIdStack()));
544 }
545 else
546 {
547 throw XmlValidationError(parser.getLine(),
548 "expected ERROR or IRETURNVALUE element");
549 }
|
550 mike 1.1.2.1 }
551
|
552 kumpf 1.1.2.6 CIMCreateInstanceResponseMessage* CIMOperationResponseDecoder::_decodeCreateInstanceResponse(
|
553 mike 1.1.2.2 XmlParser& parser, const String& messageId)
|
554 mike 1.1.2.1 {
|
555 mike 1.1.2.3 XmlEntry entry;
556 CIMStatusCode code;
557 const char* description = 0;
558
559 if (XmlReader::getErrorElement(parser, code, description))
560 {
|
561 kumpf 1.1.2.6 return(new CIMCreateInstanceResponseMessage(
|
562 mike 1.1.2.3 messageId,
563 code,
564 description,
|
565 kumpf 1.1.2.7 QueueIdStack(),
566 CIMReference()));
|
567 mike 1.1.2.3 }
568 else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
569 {
|
570 kumpf 1.1.2.7 CIMReference instanceName;
571 XmlReader::getInstanceNameElement(parser, instanceName);
572
|
573 mike 1.1.2.3 XmlReader::testEndTag(parser, "IRETURNVALUE");
574
|
575 kumpf 1.1.2.6 return(new CIMCreateInstanceResponseMessage(
|
576 mike 1.1.2.3 messageId,
577 CIM_ERR_SUCCESS,
578 String(),
|
579 kumpf 1.1.2.7 QueueIdStack(),
580 instanceName));
|
581 mike 1.1.2.3 }
582 else
583 {
584 throw XmlValidationError(parser.getLine(),
585 "expected ERROR or IRETURNVALUE element");
586 }
|
587 mike 1.1.2.1 }
588
|
589 kumpf 1.1.2.6 CIMGetInstanceResponseMessage* CIMOperationResponseDecoder::_decodeGetInstanceResponse(
|
590 mike 1.1.2.2 XmlParser& parser, const String& messageId)
|
591 mike 1.1.2.1 {
|
592 mike 1.1.2.3 XmlEntry entry;
593 CIMStatusCode code;
594 const char* description = 0;
595
596 if (XmlReader::getErrorElement(parser, code, description))
597 {
|
598 kumpf 1.1.2.6 return(new CIMGetInstanceResponseMessage(
|
599 mike 1.1.2.3 messageId,
600 code,
601 description,
602 QueueIdStack(),
603 CIMInstance()));
604 }
605 else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
606 {
607 CIMInstance cimInstance;
608
609 if (!XmlReader::getInstanceElement(parser, cimInstance))
610 {
611 throw XmlValidationError(
612 parser.getLine(), "expected INSTANCE element");
613 }
614
615 XmlReader::testEndTag(parser, "IRETURNVALUE");
616
|
617 kumpf 1.1.2.6 return(new CIMGetInstanceResponseMessage(
|
618 mike 1.1.2.3 messageId,
619 CIM_ERR_SUCCESS,
620 String(),
621 QueueIdStack(),
622 cimInstance));
623 }
624 else
625 {
626 throw XmlValidationError(parser.getLine(),
627 "expected ERROR or IRETURNVALUE element");
628 }
|
629 mike 1.1.2.1 }
630
|
631 kumpf 1.1.2.6 CIMModifyInstanceResponseMessage* CIMOperationResponseDecoder::_decodeModifyInstanceResponse(
|
632 mike 1.1.2.2 XmlParser& parser, const String& messageId)
|
633 mike 1.1.2.1 {
|
634 mike 1.1.2.3 XmlEntry entry;
635 CIMStatusCode code;
636 const char* description = 0;
637
638 if (XmlReader::getErrorElement(parser, code, description))
639 {
|
640 kumpf 1.1.2.6 return(new CIMModifyInstanceResponseMessage(
|
641 mike 1.1.2.3 messageId,
642 code,
643 description,
644 QueueIdStack()));
645 }
646 else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
647 {
648 XmlReader::testEndTag(parser, "IRETURNVALUE");
649
|
650 kumpf 1.1.2.6 return(new CIMModifyInstanceResponseMessage(
|
651 mike 1.1.2.3 messageId,
652 CIM_ERR_SUCCESS,
653 String(),
654 QueueIdStack()));
655 }
656 else
657 {
658 throw XmlValidationError(parser.getLine(),
659 "expected ERROR or IRETURNVALUE element");
660 }
|
661 mike 1.1.2.1 }
662
|
663 kumpf 1.1.2.6 CIMEnumerateInstanceNamesResponseMessage* CIMOperationResponseDecoder::_decodeEnumerateInstanceNamesResponse(
|
664 mike 1.1.2.2 XmlParser& parser, const String& messageId)
|
665 mike 1.1.2.1 {
|
666 mike 1.1.2.3 XmlEntry entry;
667 CIMStatusCode code;
668 const char* description = 0;
669
670 if (XmlReader::getErrorElement(parser, code, description))
671 {
|
672 kumpf 1.1.2.6 return(new CIMEnumerateInstanceNamesResponseMessage(
|
673 mike 1.1.2.3 messageId,
674 code,
675 description,
676 QueueIdStack(),
677 Array<CIMReference>()));
678 }
679 else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
680 {
681 Array<CIMReference> instanceNames;
682 String className;
683 Array<KeyBinding> keyBindings;
684
685 while (XmlReader::getInstanceNameElement(
686 parser, className, keyBindings))
687 {
688 CIMReference r(
689 String::EMPTY,
690 String::EMPTY,
691 className,
692 keyBindings);
693 instanceNames.append(r);
694 mike 1.1.2.3 }
695
696 XmlReader::testEndTag(parser, "IRETURNVALUE");
697
|
698 kumpf 1.1.2.6 return(new CIMEnumerateInstanceNamesResponseMessage(
|
699 mike 1.1.2.3 messageId,
700 CIM_ERR_SUCCESS,
701 String(),
702 QueueIdStack(),
703 instanceNames));
704 }
705 else
706 {
707 throw XmlValidationError(parser.getLine(),
708 "expected ERROR or IRETURNVALUE element");
709 }
|
710 mike 1.1.2.1 }
711
|
712 kumpf 1.1.2.8 CIMEnumerateInstancesResponseMessage* CIMOperationResponseDecoder::_decodeEnumerateInstancesResponse(
713 XmlParser& parser, const String& messageId)
714 {
715 XmlEntry entry;
716 CIMStatusCode code;
717 const char* description = 0;
718
719 if (XmlReader::getErrorElement(parser, code, description))
720 {
721 return(new CIMEnumerateInstancesResponseMessage(
722 messageId,
723 code,
724 description,
725 QueueIdStack(),
|
726 kumpf 1.1.2.11 Array<CIMNamedInstance>()));
|
727 kumpf 1.1.2.8 }
728 else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
729 {
|
730 kumpf 1.1.2.11 Array<CIMNamedInstance> namedInstances;
731 CIMNamedInstance tmp;
|
732 kumpf 1.1.2.8
|
733 kumpf 1.1.2.11 while (XmlReader::getNamedInstanceElement(parser, tmp))
734 namedInstances.append(tmp);
|
735 kumpf 1.1.2.8
736 XmlReader::testEndTag(parser, "IRETURNVALUE");
737
738 return(new CIMEnumerateInstancesResponseMessage(
739 messageId,
740 CIM_ERR_SUCCESS,
741 String(),
742 QueueIdStack(),
|
743 kumpf 1.1.2.11 namedInstances));
|
744 kumpf 1.1.2.8 }
745 else
746 {
747 throw XmlValidationError(parser.getLine(),
748 "expected ERROR or IRETURNVALUE element");
749 }
750 }
751
|
752 kumpf 1.1.2.6 CIMDeleteInstanceResponseMessage* CIMOperationResponseDecoder::_decodeDeleteInstanceResponse(
|
753 mike 1.1.2.2 XmlParser& parser, const String& messageId)
|
754 mike 1.1.2.1 {
|
755 mike 1.1.2.3 XmlEntry entry;
756 CIMStatusCode code;
757 const char* description = 0;
758
759 if (XmlReader::getErrorElement(parser, code, description))
760 {
|
761 kumpf 1.1.2.6 return(new CIMDeleteInstanceResponseMessage(
|
762 mike 1.1.2.3 messageId,
763 code,
764 description,
765 QueueIdStack()));
766 }
767 else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
768 {
769 XmlReader::testEndTag(parser, "IRETURNVALUE");
770
|
771 kumpf 1.1.2.6 return(new CIMDeleteInstanceResponseMessage(
|
772 kumpf 1.1.2.8 messageId,
773 CIM_ERR_SUCCESS,
774 String(),
775 QueueIdStack()));
776 }
777 else
778 {
779 throw XmlValidationError(parser.getLine(),
780 "expected ERROR or IRETURNVALUE element");
781 }
782 }
783
784 CIMGetPropertyResponseMessage* CIMOperationResponseDecoder::_decodeGetPropertyResponse(
785 XmlParser& parser, const String& messageId)
786 {
787 XmlEntry entry;
788 CIMStatusCode code;
789 const char* description = 0;
790
791 if (XmlReader::getErrorElement(parser, code, description))
792 {
793 kumpf 1.1.2.8 return(new CIMGetPropertyResponseMessage(
794 messageId,
795 code,
796 description,
797 QueueIdStack(),
798 CIMValue()));
799 }
800 else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
801 {
802 CIMValue cimValue;
803
804 if (!XmlReader::getPropertyValue(parser, cimValue))
805 {
806 // ATTN: Don't know what type of CIMValue to expect
807 throw XmlValidationError(
808 parser.getLine(),
809 "expected VALUE, VALUE.ARRAY, or VALUE.REFERENCE element");
810 }
811
812 XmlReader::testEndTag(parser, "IRETURNVALUE");
813
814 kumpf 1.1.2.8 return(new CIMGetPropertyResponseMessage(
815 messageId,
816 CIM_ERR_SUCCESS,
817 String(),
818 QueueIdStack(),
819 cimValue));
820 }
821 else
822 {
823 throw XmlValidationError(parser.getLine(),
824 "expected ERROR or IRETURNVALUE element");
825 }
826 }
827
828 CIMSetPropertyResponseMessage* CIMOperationResponseDecoder::_decodeSetPropertyResponse(
829 XmlParser& parser, const String& messageId)
830 {
831 XmlEntry entry;
832 CIMStatusCode code;
833 const char* description = 0;
834
835 kumpf 1.1.2.8 if (XmlReader::getErrorElement(parser, code, description))
836 {
837 return(new CIMSetPropertyResponseMessage(
838 messageId,
839 code,
840 description,
841 QueueIdStack()));
842 }
843 else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
844 {
845 XmlReader::testEndTag(parser, "IRETURNVALUE");
846
847 return(new CIMSetPropertyResponseMessage(
|
848 mike 1.1.2.3 messageId,
849 CIM_ERR_SUCCESS,
850 String(),
851 QueueIdStack()));
852 }
853 else
854 {
855 throw XmlValidationError(parser.getLine(),
856 "expected ERROR or IRETURNVALUE element");
857 }
|
858 mike 1.1.2.1 }
859
|
860 kumpf 1.1.2.6 CIMSetQualifierResponseMessage* CIMOperationResponseDecoder::_decodeSetQualifierResponse(
|
861 mike 1.1.2.2 XmlParser& parser, const String& messageId)
|
862 mike 1.1.2.1 {
|
863 mike 1.1.2.3 XmlEntry entry;
864 CIMStatusCode code;
865 const char* description = 0;
866
867 if (XmlReader::getErrorElement(parser, code, description))
868 {
|
869 kumpf 1.1.2.6 return(new CIMSetQualifierResponseMessage(
|
870 mike 1.1.2.3 messageId,
871 code,
872 description,
873 QueueIdStack()));
874 }
875 else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
876 {
877 XmlReader::testEndTag(parser, "IRETURNVALUE");
878
|
879 kumpf 1.1.2.6 return(new CIMSetQualifierResponseMessage(
|
880 mike 1.1.2.3 messageId,
881 CIM_ERR_SUCCESS,
882 String(),
883 QueueIdStack()));
884 }
885 else
886 {
887 throw XmlValidationError(parser.getLine(),
888 "expected ERROR or IRETURNVALUE element");
889 }
|
890 mike 1.1.2.1 }
891
|
892 kumpf 1.1.2.6 CIMGetQualifierResponseMessage* CIMOperationResponseDecoder::_decodeGetQualifierResponse(
|
893 mike 1.1.2.2 XmlParser& parser, const String& messageId)
|
894 mike 1.1.2.1 {
|
895 mike 1.1.2.3 XmlEntry entry;
896 CIMStatusCode code;
897 const char* description = 0;
898
899 if (XmlReader::getErrorElement(parser, code, description))
900 {
|
901 kumpf 1.1.2.6 return(new CIMGetQualifierResponseMessage(
|
902 mike 1.1.2.3 messageId,
903 code,
904 description,
905 QueueIdStack(),
906 CIMQualifierDecl()));
907 }
908 else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
909 {
910 CIMQualifierDecl qualifierDecl;
911 XmlReader::getQualifierDeclElement(parser, qualifierDecl);
912
913 XmlReader::testEndTag(parser, "IRETURNVALUE");
914
|
915 kumpf 1.1.2.6 return(new CIMGetQualifierResponseMessage(
|
916 mike 1.1.2.3 messageId,
917 CIM_ERR_SUCCESS,
918 String(),
919 QueueIdStack(),
920 qualifierDecl));
921 }
922 else
923 {
924 throw XmlValidationError(parser.getLine(),
925 "expected ERROR or IRETURNVALUE element");
926 }
|
927 mike 1.1.2.1 }
928
|
929 kumpf 1.1.2.6 CIMEnumerateQualifiersResponseMessage* CIMOperationResponseDecoder::_decodeEnumerateQualifiersResponse(
|
930 mike 1.1.2.2 XmlParser& parser, const String& messageId)
|
931 mike 1.1.2.1 {
|
932 mike 1.1.2.3 XmlEntry entry;
933 CIMStatusCode code;
934 const char* description = 0;
935
936 if (XmlReader::getErrorElement(parser, code, description))
937 {
|
938 kumpf 1.1.2.6 return(new CIMEnumerateQualifiersResponseMessage(
|
939 mike 1.1.2.3 messageId,
940 code,
941 description,
942 QueueIdStack(),
943 Array<CIMQualifierDecl>()));
944 }
945 else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
946 {
947 Array<CIMQualifierDecl> qualifierDecls;
948 CIMQualifierDecl qualifierDecl;
949
950 while (XmlReader::getQualifierDeclElement(parser, qualifierDecl))
951 qualifierDecls.append(qualifierDecl);
952
953 XmlReader::testEndTag(parser, "IRETURNVALUE");
954
|
955 kumpf 1.1.2.6 return(new CIMEnumerateQualifiersResponseMessage(
|
956 mike 1.1.2.3 messageId,
957 CIM_ERR_SUCCESS,
958 String(),
959 QueueIdStack(),
960 qualifierDecls));
961 }
962 else
963 {
964 throw XmlValidationError(parser.getLine(),
965 "expected ERROR or IRETURNVALUE element");
966 }
|
967 mike 1.1.2.1 }
968
|
969 kumpf 1.1.2.6 CIMDeleteQualifierResponseMessage* CIMOperationResponseDecoder::_decodeDeleteQualifierResponse(
|
970 mike 1.1.2.2 XmlParser& parser, const String& messageId)
|
971 mike 1.1.2.1 {
|
972 mike 1.1.2.3 XmlEntry entry;
973 CIMStatusCode code;
974 const char* description = 0;
975
976 if (XmlReader::getErrorElement(parser, code, description))
977 {
|
978 kumpf 1.1.2.6 return(new CIMDeleteQualifierResponseMessage(
|
979 mike 1.1.2.3 messageId,
980 code,
981 description,
982 QueueIdStack()));
983 }
984 else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
985 {
986 XmlReader::testEndTag(parser, "IRETURNVALUE");
987
|
988 kumpf 1.1.2.6 return(new CIMDeleteQualifierResponseMessage(
|
989 mike 1.1.2.3 messageId,
990 CIM_ERR_SUCCESS,
991 String(),
992 QueueIdStack()));
993 }
994 else
995 {
996 throw XmlValidationError(parser.getLine(),
997 "expected ERROR or IRETURNVALUE element");
998 }
|
999 mike 1.1.2.1 }
1000
|
1001 mike 1.1.2.3 //MEB:
1002
|
1003 kumpf 1.1.2.6 CIMReferenceNamesResponseMessage* CIMOperationResponseDecoder::_decodeReferenceNamesResponse(
|
1004 mike 1.1.2.2 XmlParser& parser, const String& messageId)
|
1005 mike 1.1.2.1 {
|
1006 mike 1.1.2.3 XmlEntry entry;
1007 CIMStatusCode code;
1008 const char* description = 0;
1009
1010 if (XmlReader::getErrorElement(parser, code, description))
1011 {
|
1012 kumpf 1.1.2.6 return(new CIMReferenceNamesResponseMessage(
|
1013 mike 1.1.2.3 messageId,
1014 code,
1015 description,
1016 QueueIdStack(),
1017 Array<CIMReference>()));
1018 }
1019 else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
1020 {
1021 CIMReference objectPath;
1022 Array<CIMReference> objectPaths;
1023
1024 while (XmlReader::getObjectPathElement(parser, objectPath))
1025 objectPaths.append(objectPath);
1026
1027 XmlReader::testEndTag(parser, "IRETURNVALUE");
1028
|
1029 kumpf 1.1.2.6 return(new CIMReferenceNamesResponseMessage(
|
1030 mike 1.1.2.3 messageId,
1031 CIM_ERR_SUCCESS,
1032 String(),
1033 QueueIdStack(),
1034 objectPaths));
1035 }
1036 else
1037 {
1038 throw XmlValidationError(parser.getLine(),
1039 "expected ERROR or IRETURNVALUE element");
1040 }
|
1041 mike 1.1.2.1 }
1042
|
1043 kumpf 1.1.2.6 CIMReferencesResponseMessage* CIMOperationResponseDecoder::_decodeReferencesResponse(
|
1044 mike 1.1.2.2 XmlParser& parser, const String& messageId)
|
1045 mike 1.1.2.1 {
|
1046 mike 1.1.2.3 XmlEntry entry;
1047 CIMStatusCode code;
1048 const char* description = 0;
1049
1050 if (XmlReader::getErrorElement(parser, code, description))
1051 {
|
1052 kumpf 1.1.2.6 return(new CIMReferencesResponseMessage(
|
1053 mike 1.1.2.3 messageId,
1054 code,
1055 description,
1056 QueueIdStack(),
1057 Array<CIMObjectWithPath>()));
1058 }
1059 else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
1060 {
1061 Array<CIMObjectWithPath> objectWithPathArray;
1062 CIMObjectWithPath tmp;
1063
1064 while (XmlReader::getObjectWithPath(parser, tmp))
1065 objectWithPathArray.append(tmp);
1066
1067 XmlReader::testEndTag(parser, "IRETURNVALUE");
1068
|
1069 kumpf 1.1.2.6 return(new CIMReferencesResponseMessage(
|
1070 mike 1.1.2.3 messageId,
1071 CIM_ERR_SUCCESS,
1072 String(),
1073 QueueIdStack(),
1074 objectWithPathArray));
1075 }
1076 else
1077 {
1078 throw XmlValidationError(parser.getLine(),
1079 "expected ERROR or IRETURNVALUE element");
1080 }
|
1081 mike 1.1.2.1 }
1082
|
1083 kumpf 1.1.2.6 CIMAssociatorNamesResponseMessage* CIMOperationResponseDecoder::_decodeAssociatorNamesResponse(
|
1084 mike 1.1.2.2 XmlParser& parser, const String& messageId)
|
1085 mike 1.1.2.1 {
|
1086 mike 1.1.2.3 XmlEntry entry;
1087 CIMStatusCode code;
1088 const char* description = 0;
1089
1090 if (XmlReader::getErrorElement(parser, code, description))
1091 {
|
1092 kumpf 1.1.2.6 return(new CIMAssociatorNamesResponseMessage(
|
1093 mike 1.1.2.3 messageId,
1094 code,
1095 description,
1096 QueueIdStack(),
1097 Array<CIMReference>()));
1098 }
1099 else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
1100 {
1101 CIMReference objectPath;
1102 Array<CIMReference> objectPaths;
1103
1104 while (XmlReader::getObjectPathElement(parser, objectPath))
1105 objectPaths.append(objectPath);
1106
1107 XmlReader::testEndTag(parser, "IRETURNVALUE");
1108
|
1109 kumpf 1.1.2.6 return(new CIMAssociatorNamesResponseMessage(
|
1110 mike 1.1.2.3 messageId,
1111 CIM_ERR_SUCCESS,
1112 String(),
1113 QueueIdStack(),
1114 objectPaths));
1115 }
1116 else
1117 {
1118 throw XmlValidationError(parser.getLine(),
1119 "expected ERROR or IRETURNVALUE element");
1120 }
|
1121 mike 1.1.2.1 }
1122
|
1123 kumpf 1.1.2.6 CIMAssociatorsResponseMessage* CIMOperationResponseDecoder::_decodeAssociatorsResponse(
|
1124 mike 1.1.2.2 XmlParser& parser, const String& messageId)
|
1125 mike 1.1.2.1 {
|
1126 mike 1.1.2.3 XmlEntry entry;
1127 CIMStatusCode code;
1128 const char* description = 0;
1129
1130 if (XmlReader::getErrorElement(parser, code, description))
1131 {
|
1132 kumpf 1.1.2.6 return(new CIMAssociatorsResponseMessage(
|
1133 mike 1.1.2.3 messageId,
1134 code,
1135 description,
1136 QueueIdStack(),
1137 Array<CIMObjectWithPath>()));
1138 }
1139 else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
1140 {
1141 Array<CIMObjectWithPath> objectWithPathArray;
1142 CIMObjectWithPath tmp;
1143
1144 while (XmlReader::getObjectWithPath(parser, tmp))
1145 objectWithPathArray.append(tmp);
1146
1147 XmlReader::testEndTag(parser, "IRETURNVALUE");
1148
|
1149 kumpf 1.1.2.6 return(new CIMAssociatorsResponseMessage(
|
1150 mike 1.1.2.3 messageId,
1151 CIM_ERR_SUCCESS,
1152 String(),
1153 QueueIdStack(),
1154 objectWithPathArray));
1155 }
1156 else
1157 {
1158 throw XmlValidationError(parser.getLine(),
1159 "expected ERROR or IRETURNVALUE element");
|
1160 kumpf 1.1.2.5 }
1161 }
1162
|
1163 kumpf 1.1.2.6 CIMInvokeMethodResponseMessage* CIMOperationResponseDecoder::_decodeInvokeMethodResponse(
|
1164 kumpf 1.1.2.5 XmlParser& parser, const String& messageId, const String& methodName)
1165 {
1166 XmlEntry entry;
1167 CIMStatusCode code;
1168 const char* description = 0;
1169
1170 CIMValue value;
1171 Array<CIMParamValue> outParameters;
1172 const char* paramName;
1173 String inValue;
1174
1175 if (XmlReader::getErrorElement(parser, code, description))
1176 {
|
1177 kumpf 1.1.2.6 return(new CIMInvokeMethodResponseMessage(
|
1178 kumpf 1.1.2.5 messageId,
1179 code,
1180 description,
1181 QueueIdStack(),
1182 value,
1183 outParameters,
1184 methodName));
1185 }
1186 else if (XmlReader::testStartTag(parser, entry, "RETURNVALUE"))
1187 {
1188 XmlReader::getValueElement(parser, CIMType::STRING, value);
1189
1190 XmlReader::testEndTag(parser, "RETURNVALUE");
1191
1192 while (XmlReader::getParamValueTag(parser, paramName))
1193 {
1194 //XmlReader::getValueElement(parser, CIMType::NONE, inValue);
1195 XmlReader::getStringValueElement(parser, inValue, true);
1196
1197 outParameters.append(CIMParamValue(
1198 CIMParameter(paramName, CIMType::STRING),
1199 kumpf 1.1.2.5 CIMValue(inValue)));
1200
1201 XmlReader::expectEndTag(parser, "PARAMVALUE");
1202 }
1203
|
1204 kumpf 1.1.2.6 return(new CIMInvokeMethodResponseMessage(
|
1205 kumpf 1.1.2.5 messageId,
1206 CIM_ERR_SUCCESS,
1207 String(),
1208 QueueIdStack(),
1209 value,
1210 outParameters,
1211 methodName));
1212 }
1213 else
1214 {
1215 throw XmlValidationError(parser.getLine(),
1216 "expected ERROR or RETURNVALUE element");
|
1217 mike 1.1.2.3 }
|
1218 mike 1.1.2.1 }
1219
1220 PEGASUS_NAMESPACE_END
|