1 karl 1.100 //%2006////////////////////////////////////////////////////////////////////////
|
2 mike 1.2 //
|
3 karl 1.88 // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
4 // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
5 // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
|
6 karl 1.72 // IBM Corp.; EMC Corporation, The Open Group.
|
7 karl 1.88 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
8 // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
|
9 karl 1.91 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
10 // EMC Corporation; VERITAS Software Corporation; The Open Group.
|
11 karl 1.100 // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
12 // EMC Corporation; Symantec Corporation; The Open Group.
|
13 mike 1.2 //
14 // Permission is hereby granted, free of charge, to any person obtaining a copy
|
15 kumpf 1.47 // of this software and associated documentation files (the "Software"), to
16 // deal in the Software without restriction, including without limitation the
17 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
18 mike 1.2 // sell copies of the Software, and to permit persons to whom the Software is
19 // furnished to do so, subject to the following conditions:
|
20 karl 1.100 //
|
21 kumpf 1.47 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
|
22 mike 1.2 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
23 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
|
24 kumpf 1.47 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
25 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
26 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
27 mike 1.2 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 //
30 //==============================================================================
31 //
32 //%/////////////////////////////////////////////////////////////////////////////
33
34 #include <Pegasus/Common/Config.h>
|
35 kumpf 1.28 #include <Pegasus/Common/Constants.h>
|
36 mike 1.2 #include <cctype>
37 #include <cstdio>
38 #include <Pegasus/Common/XmlParser.h>
39 #include <Pegasus/Common/XmlReader.h>
40 #include <Pegasus/Common/XmlWriter.h>
41 #include <Pegasus/Common/XmlConstants.h>
|
42 kumpf 1.51 #include <Pegasus/Common/System.h>
|
43 mike 1.2 #include <Pegasus/Common/Logger.h>
44 #include <Pegasus/Common/Tracer.h>
|
45 sage 1.41 #include <Pegasus/Common/StatisticalData.h>
|
46 mike 1.2 #include "CIMOperationRequestDecoder.h"
|
47 david 1.60 #include <Pegasus/Common/CommonUTF.h>
|
48 humberto 1.59 #include <Pegasus/Common/MessageLoader.h>
49
|
50 mike 1.2 PEGASUS_USING_STD;
51
52 PEGASUS_NAMESPACE_BEGIN
53
54 CIMOperationRequestDecoder::CIMOperationRequestDecoder(
|
55 kumpf 1.104 MessageQueueService* outputQueue,
56 Uint32 returnQueueId)
57 : Base(PEGASUS_QUEUENAME_OPREQDECODER),
|
58 mday 1.16 _outputQueue(outputQueue),
59 _returnQueueId(returnQueueId),
60 _serverTerminating(false)
|
61 mike 1.2 {
62 }
63
64 CIMOperationRequestDecoder::~CIMOperationRequestDecoder()
65 {
66 }
67
68 void CIMOperationRequestDecoder::sendResponse(
|
69 kumpf 1.104 Uint32 queueId,
70 Buffer& message,
71 Boolean closeConnect)
72 {
73 MessageQueue* queue = MessageQueue::lookup(queueId);
74
75 if (queue)
76 {
77 AutoPtr<HTTPMessage> httpMessage(new HTTPMessage(message));
78 httpMessage->setCloseConnect(closeConnect);
79 queue->enqueue(httpMessage.release());
80 }
|
81 mike 1.2 }
82
|
83 kumpf 1.18 void CIMOperationRequestDecoder::sendIMethodError(
|
84 kumpf 1.104 Uint32 queueId,
85 HttpMethod httpMethod,
86 const String& messageId,
87 const String& iMethodName,
88 const CIMException& cimException,
89 Boolean closeConnect)
|
90 mday 1.16 {
|
91 mike 1.96 Buffer message;
|
92 kumpf 1.19 message = XmlWriter::formatSimpleIMethodErrorRspMessage(
93 iMethodName,
94 messageId,
|
95 kumpf 1.53 httpMethod,
|
96 kumpf 1.35 cimException);
|
97 kumpf 1.18
|
98 j.alex 1.95 sendResponse(queueId, message,closeConnect);
|
99 kumpf 1.18 }
|
100 mday 1.16
|
101 kumpf 1.18 void CIMOperationRequestDecoder::sendMethodError(
|
102 kumpf 1.104 Uint32 queueId,
103 HttpMethod httpMethod,
104 const String& messageId,
105 const String& methodName,
106 const CIMException& cimException,
107 Boolean closeConnect)
|
108 kumpf 1.18 {
|
109 mike 1.96 Buffer message;
|
110 kumpf 1.19 message = XmlWriter::formatSimpleMethodErrorRspMessage(
111 methodName,
112 messageId,
|
113 kumpf 1.53 httpMethod,
|
114 kumpf 1.35 cimException);
|
115 chip 1.92
|
116 j.alex 1.95 sendResponse(queueId, message,closeConnect);
|
117 mike 1.2 }
118
|
119 kumpf 1.33 void CIMOperationRequestDecoder::sendHttpError(
|
120 kumpf 1.104 Uint32 queueId,
121 const String& status,
122 const String& cimError,
123 const String& pegasusError,
124 Boolean closeConnect)
|
125 kumpf 1.21 {
|
126 mike 1.96 Buffer message;
|
127 kumpf 1.33 message = XmlWriter::formatHttpErrorRspMessage(
128 status,
129 cimError,
|
130 kumpf 1.37 pegasusError);
|
131 chip 1.92
|
132 j.alex 1.95 sendResponse(queueId, message,closeConnect);
|
133 kumpf 1.26 }
134
|
135 kumpf 1.104 void CIMOperationRequestDecoder::handleEnqueue(Message* message)
|
136 mike 1.2 {
|
137 kumpf 1.104 if (!message)
138 return;
|
139 mike 1.2
|
140 kumpf 1.104 switch (message->getType())
141 {
142 case HTTP_MESSAGE:
143 handleHTTPMessage((HTTPMessage*)message);
144 break;
145 }
|
146 mday 1.16
|
147 kumpf 1.104 delete message;
|
148 mday 1.16 }
|
149 mike 1.2
150
|
151 mday 1.16 void CIMOperationRequestDecoder::handleEnqueue()
152 {
|
153 kumpf 1.104 Message* message = dequeue();
154 if (message)
155 handleEnqueue(message);
|
156 mike 1.2 }
157
158 //------------------------------------------------------------------------------
159 //
160 // From the HTTP/1.1 Specification (RFC 2626):
161 //
|
162 chip 1.92 // Both types of message consist of a start-line, zero or more header fields
163 // (also known as "headers"), an empty line (i.e., a line with nothing
164 // preceding the CRLF) indicating the end of the header fields, and possibly
|
165 mike 1.2 // a message-body.
166 //
167 // Example CIM request:
168 //
|
169 chip 1.92 // M-POST /cimom HTTP/1.1
170 // HOST: www.erewhon.com
171 // Content-Type: application/xml; charset="utf-8"
172 // Content-Length: xxxx
173 // Man: http://www.dmtf.org/cim/operation ; ns=73
174 // 73-CIMOperation: MethodCall
175 // 73-CIMMethod: EnumerateInstances
176 // 73-CIMObject: root/cimv2
177 //
|
178 mike 1.2 //------------------------------------------------------------------------------
179
180 void CIMOperationRequestDecoder::handleHTTPMessage(HTTPMessage* httpMessage)
181 {
|
182 kumpf 1.104 PEG_METHOD_ENTER(TRC_DISPATCHER,
183 "CIMOperationRequestDecoder::handleHTTPMessage()");
|
184 kumpf 1.20
|
185 kumpf 1.104 // Set the Accept-Language into the thread for this service.
186 // This will allow all code in this thread to get
187 // the languages for the messages returned to the client.
188 Thread::setLanguages(new AcceptLanguageList(httpMessage->acceptLanguages));
189
190 // Save queueId:
191
192 Uint32 queueId = httpMessage->queueId;
193
194 // Save userName and authType:
195
196 String userName;
197 String authType;
198 Boolean closeConnect = httpMessage->getCloseConnect();
199
200 PEG_TRACE((
201 TRC_HTTP,
202 Tracer::LEVEL3,
203 "CIMOperationRequestDecoder::handleHTTPMessage()- "
204 "httpMessage->getCloseConnect() returned %d",
205 closeConnect));
206 kumpf 1.104
|
207 sushma.fernandes 1.109 userName = httpMessage->authInfo->getAuthenticatedUser();
208 authType = httpMessage->authInfo->getAuthType();
|
209 kumpf 1.104
210 // Parse the HTTP message:
211
212 String startLine;
213 Array<HTTPHeader> headers;
214 char* content;
215 Uint32 contentLength;
216
217 httpMessage->parse(startLine, headers, contentLength);
218
219 // Parse the request line:
220
221 String methodName;
222 String requestUri;
223 String httpVersion;
224 HttpMethod httpMethod = HTTP_METHOD__POST;
225
226 HTTPMessage::parseRequestLine(
227 startLine, methodName, requestUri, httpVersion);
228
229 //
230 kumpf 1.104 // Set HTTP method for the request
231 //
232 if (methodName == "M-POST")
233 {
234 httpMethod = HTTP_METHOD_M_POST;
235 }
236
237 // Unsupported methods are caught in the HTTPAuthenticatorDelegator
238 PEGASUS_ASSERT(methodName == "M-POST" || methodName == "POST");
239
240 //
241 // Mismatch of method and version is caught in HTTPAuthenticatorDelegator
242 //
243 PEGASUS_ASSERT(!((httpMethod == HTTP_METHOD_M_POST) &&
244 (httpVersion == "HTTP/1.0")));
|
245 humberto 1.80
|
246 kumpf 1.104 // Process M-POST and POST messages:
|
247 humberto 1.80
|
248 kumpf 1.104 String cimContentType;
249 String cimOperation;
250 String cimBatch;
251 Boolean cimBatchFlag;
252 String cimProtocolVersion;
253 String cimMethod;
254 String cimObject;
255
256 if (httpVersion == "HTTP/1.1")
257 {
258 // Validate the presence of a "Host" header. The HTTP/1.1 specification
259 // says this in section 14.23 regarding the Host header field:
260 //
261 // All Internet-based HTTP/1.1 servers MUST respond with a 400 (Bad
262 // Request) status code to any HTTP/1.1 request message which lacks
263 // a Host header field.
264 //
265 // Note: The Host header value is not validated.
266
267 String hostHeader;
268 Boolean hostHeaderFound = HTTPMessage::lookupHeader(
269 kumpf 1.104 headers, "Host", hostHeader, false);
|
270 mike 1.2
|
271 kumpf 1.104 if (!hostHeaderFound)
272 {
273 MessageLoaderParms parms(
274 "Server.CIMOperationRequestDecoder.MISSING_HOST_HEADER",
275 "HTTP request message lacks a Host header field.");
276 sendHttpError(
277 queueId,
278 HTTP_STATUS_BADREQUEST,
279 "",
280 MessageLoader::getMessage(parms),
281 closeConnect);
282 PEG_METHOD_EXIT();
283 return;
284 }
285 }
|
286 mike 1.2
|
287 kumpf 1.104 // Validate the "CIMOperation" header:
|
288 mike 1.2
|
289 kumpf 1.104 Boolean operationHeaderFound = HTTPMessage::lookupHeader(
290 headers, "CIMOperation", cimOperation, true);
291 // If the CIMOperation header was missing, the HTTPAuthenticatorDelegator
292 // would not have passed the message to us.
293 PEGASUS_ASSERT(operationHeaderFound);
294
295 if (!String::equalNoCase(cimOperation, "MethodCall"))
296 {
297 // The Specification for CIM Operations over HTTP reads:
298 // 3.3.4. CIMOperation
299 // If a CIM Server receives CIM Operation request with this
300 // [CIMOperation] header, but with a missing value or a value
301 // that is not "MethodCall", then it MUST fail the request with
302 // status "400 Bad Request". The CIM Server MUST include a
303 // CIMError header in the response with a value of
304 // unsupported-operation.
305 MessageLoaderParms parms(
306 "Server.CIMOperationRequestDecoder."
307 "CIMOPERATION_VALUE_NOT_SUPPORTED",
308 "CIMOperation value \"$0\" is not supported.",cimOperation);
309 sendHttpError(
310 kumpf 1.104 queueId,
311 HTTP_STATUS_BADREQUEST,
312 "unsupported-operation",
313 MessageLoader::getMessage(parms),
314 closeConnect);
315 PEG_METHOD_EXIT();
316 return;
317 }
318
319 // Validate the "CIMBatch" header:
320
321 cimBatchFlag = HTTPMessage::lookupHeader(
322 headers, "CIMBatch", cimBatch, true);
323 if (cimBatchFlag)
324 {
325 // The Specification for CIM Operations over HTTP reads:
326 // 3.3.9. CIMBatch
327 // If a CIM Server receives CIM Operation Request for which the
328 // CIMBatch header is present, but the Server does not support
329 // Multiple Operations, then it MUST fail the request and
330 // return a status of "501 Not Implemented".
331 kumpf 1.104 sendHttpError(
332 queueId,
333 HTTP_STATUS_NOTIMPLEMENTED,
334 "multiple-requests-unsupported",
335 String::EMPTY,
336 closeConnect);
337 PEG_METHOD_EXIT();
338 return;
339 }
340
341 // Save these headers for later checking
342
343 if (!HTTPMessage::lookupHeader(
344 headers, "CIMProtocolVersion", cimProtocolVersion, true))
345 {
346 // Mandated by the Specification for CIM Operations over HTTP
347 cimProtocolVersion.assign("1.0");
348 }
349
350 if (HTTPMessage::lookupHeader(headers, "CIMMethod", cimMethod, true))
351 {
352 kumpf 1.104 if (cimMethod == String::EMPTY)
353 {
354 // This is not a valid value, and we use EMPTY to mean "absent"
355 MessageLoaderParms parms(
356 "Server.CIMOperationRequestDecoder.EMPTY_CIMMETHOD_VALUE",
357 "Empty CIMMethod value.");
358 sendHttpError(
359 queueId,
360 HTTP_STATUS_BADREQUEST,
361 "header-mismatch",
362 MessageLoader::getMessage(parms),
363 closeConnect);
364 PEG_METHOD_EXIT();
365 return;
366 }
|
367 mike 1.98
|
368 kumpf 1.104 try
369 {
370 cimMethod = XmlReader::decodeURICharacters(cimMethod);
371 }
372 catch (const ParseError&)
373 {
374 // The CIMMethod header value could not be decoded
375 MessageLoaderParms parms(
376 "Server.CIMOperationRequestDecoder."
377 "CIMMETHOD_VALUE_SYNTAX_ERROR",
378 "CIMMethod value syntax error.");
379 sendHttpError(
380 queueId,
381 HTTP_STATUS_BADREQUEST,
382 "header-mismatch",
383 MessageLoader::getMessage(parms),
384 closeConnect);
385 PEG_METHOD_EXIT();
386 return;
387 }
388 }
|
389 mike 1.2
|
390 kumpf 1.104 if (HTTPMessage::lookupHeader(headers, "CIMObject", cimObject, true))
391 {
392 if (cimObject == String::EMPTY)
393 {
394 // This is not a valid value, and we use EMPTY to mean "absent"
395 MessageLoaderParms parms(
396 "Server.CIMOperationRequestDecoder.EMPTY_CIMOBJECT_VALUE",
397 "Empty CIMObject value.");
398 sendHttpError(
399 queueId,
400 HTTP_STATUS_BADREQUEST,
401 "header-mismatch",
402 MessageLoader::getMessage(parms),
403 closeConnect);
404 PEG_METHOD_EXIT();
405 return;
406 }
|
407 mike 1.2
|
408 kumpf 1.104 try
409 {
410 cimObject = XmlReader::decodeURICharacters(cimObject);
411 }
412 catch (const ParseError&)
413 {
414 // The CIMObject header value could not be decoded
415 MessageLoaderParms parms(
416 "Server.CIMOperationRequestDecoder."
417 "CIMOBJECT_VALUE_SYNTAX_ERROR",
418 "CIMObject value syntax error.");
419 sendHttpError(
420 queueId,
421 HTTP_STATUS_BADREQUEST,
422 "header-mismatch",
423 MessageLoader::getMessage(parms),
424 closeConnect);
425 PEG_METHOD_EXIT();
426 return;
427 }
428 }
|
429 mike 1.2
|
430 kumpf 1.104 // Calculate the beginning of the content from the message size and
|
431 kumpf 1.110 // the content length.
|
432 mike 1.2
|
433 kumpf 1.104 content = (char*) httpMessage->message.getData() +
|
434 kumpf 1.110 httpMessage->message.size() - contentLength;
|
435 mike 1.2
|
436 kumpf 1.104 // Validate the "Content-Type" header:
|
437 mike 1.2
|
438 kumpf 1.104 Boolean contentTypeHeaderFound = HTTPMessage::lookupHeader(
439 headers, "Content-Type", cimContentType, true);
|
440 venkat.puvvada 1.111 if (!contentTypeHeaderFound ||
441 !HTTPMessage::isSupportedContentType (cimContentType))
|
442 kumpf 1.104 {
|
443 j.alex 1.95 MessageLoaderParms parms(
|
444 kumpf 1.104 "Server.CIMOperationRequestDecoder.CIMCONTENTTYPE_SYNTAX_ERROR",
|
445 kumpf 1.105 "HTTP Content-Type header error.");
|
446 j.alex 1.95 sendHttpError(
447 queueId,
448 HTTP_STATUS_BADREQUEST,
|
449 kumpf 1.105 "",
|
450 j.alex 1.95 MessageLoader::getMessage(parms),
451 closeConnect);
|
452 kumpf 1.104 PEG_METHOD_EXIT();
453 return;
454 }
455 // Validating content falls within UTF8
456 // (required to be complaint with section C12 of Unicode 4.0 spec,
457 // chapter 3.)
458 else
459 {
460 Uint32 count = 0;
461 while(count<contentLength)
462 {
463 if (!(isUTF8((char*)&content[count])))
464 {
465 MessageLoaderParms parms(
466 "Server.CIMOperationRequestDecoder.INVALID_UTF8_CHARACTER",
467 "Invalid UTF-8 character detected.");
468 sendHttpError(
469 queueId,
470 HTTP_STATUS_BADREQUEST,
471 "request-not-valid",
472 MessageLoader::getMessage(parms),
473 kumpf 1.104 closeConnect);
474
475 PEG_METHOD_EXIT();
476 return;
477 }
478 UTF8_NEXT(content,count);
479 }
480 }
481
482 // If it is a method call, then dispatch it to be handled:
483
484 handleMethodCall(
485 queueId,
486 httpMethod,
487 content,
488 contentLength,
489 cimProtocolVersion,
490 cimMethod,
491 cimObject,
492 authType,
493 userName,
494 kumpf 1.104 httpMessage->ipAddress,
495 httpMessage->acceptLanguages,
496 httpMessage->contentLanguages,
497 closeConnect);
498
499 PEG_METHOD_EXIT();
500 }
501
502 void CIMOperationRequestDecoder::handleMethodCall(
503 Uint32 queueId,
504 HttpMethod httpMethod,
505 char* content,
506 Uint32 contentLength, // used for statistics only
507 const String& cimProtocolVersionInHeader,
508 const String& cimMethodInHeader,
509 const String& cimObjectInHeader,
510 const String& authType,
511 const String& userName,
512 const String& ipAddress,
513 const AcceptLanguageList& httpAcceptLanguages,
514 const ContentLanguageList& httpContentLanguages,
515 kumpf 1.104 Boolean closeConnect)
516 {
517 PEG_METHOD_ENTER(TRC_DISPATCHER,
518 "CIMOperationRequestDecoder::handleMethodCall()");
519
520 //
521 // If CIMOM is shutting down, return "Service Unavailable" response
522 //
523 if (_serverTerminating)
524 {
|
525 j.alex 1.95 MessageLoaderParms parms(
|
526 kumpf 1.104 "Server.CIMOperationRequestDecoder.CIMSERVER_SHUTTING_DOWN",
527 "CIM Server is shutting down.");
|
528 j.alex 1.95 sendHttpError(
529 queueId,
|
530 kumpf 1.104 HTTP_STATUS_SERVICEUNAVAILABLE,
531 String::EMPTY,
|
532 j.alex 1.95 MessageLoader::getMessage(parms),
533 closeConnect);
|
534 kumpf 1.104 PEG_METHOD_EXIT();
535 return;
536 }
537
538 PEG_LOGGER_TRACE((Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
539 "CIMOperationRequestdecoder - XML content: $0", content));
540
541 // Create a parser:
542
543 XmlParser parser(content);
544 XmlEntry entry;
545 String messageId;
546 const char* cimMethodName = "";
547 AutoPtr<CIMOperationRequestMessage> request;
548
549 try
550 {
551 //
552 // Process <?xml ... >
553 //
554
555 kumpf 1.104 // These values are currently unused
556 const char* xmlVersion = 0;
557 const char* xmlEncoding = 0;
|
558 mike 1.2
|
559 kumpf 1.104 XmlReader::getXmlDeclaration(parser, xmlVersion, xmlEncoding);
|
560 mike 1.2
|
561 kumpf 1.104 // Expect <CIM ...>
|
562 chip 1.92
|
563 kumpf 1.104 const char* cimVersion = 0;
564 const char* dtdVersion = 0;
|
565 mike 1.2
|
566 kumpf 1.104 XmlReader::getCimStartTag(parser, cimVersion, dtdVersion);
|
567 mike 1.2
|
568 karl 1.108 if (!XmlReader::isSupportedCIMVersion(cimVersion))
|
569 kumpf 1.104 {
570 MessageLoaderParms parms(
571 "Server.CIMOperationRequestDecoder.CIM_VERSION_NOT_SUPPORTED",
572 "CIM version \"$0\" is not supported.",
573 cimVersion);
574 sendHttpError(
575 queueId,
576 HTTP_STATUS_NOTIMPLEMENTED,
577 "unsupported-cim-version",
578 MessageLoader::getMessage(parms),
579 closeConnect);
|
580 kumpf 1.23 PEG_METHOD_EXIT();
581 return;
|
582 kumpf 1.104 }
|
583 kumpf 1.23
|
584 karl 1.108 if (!XmlReader::isSupportedDTDVersion(dtdVersion))
|
585 kumpf 1.104 {
586 MessageLoaderParms parms(
587 "Server.CIMOperationRequestDecoder.DTD_VERSION_NOT_SUPPORTED",
588 "DTD version \"$0\" is not supported.",
589 dtdVersion);
590 sendHttpError(
|
591 j.alex 1.95 queueId,
|
592 kumpf 1.104 HTTP_STATUS_NOTIMPLEMENTED,
593 "unsupported-dtd-version",
594 MessageLoader::getMessage(parms),
|
595 j.alex 1.95 closeConnect);
|
596 kumpf 1.20 PEG_METHOD_EXIT();
|
597 kumpf 1.34 return;
|
598 kumpf 1.104 }
599
600 // Expect <MESSAGE ...>
601
602 String protocolVersion;
|
603 kumpf 1.73
|
604 kumpf 1.104 if (!XmlReader::getMessageStartTag(
605 parser, messageId, protocolVersion))
606 {
607 MessageLoaderParms mlParms(
608 "Server.CIMOperationRequestDecoder.EXPECTED_MESSAGE_ELEMENT",
609 "expected MESSAGE element");
|
610 mday 1.16
|
611 kumpf 1.104 throw XmlValidationError(parser.getLine(), mlParms);
612 }
|
613 mday 1.16
|
614 kumpf 1.104 // Validate that the protocol version in the header matches the XML
615 if (!String::equalNoCase(protocolVersion, cimProtocolVersionInHeader))
616 {
|
617 j.alex 1.95 MessageLoaderParms parms(
|
618 kumpf 1.104 "Server.CIMOperationRequestDecoder."
619 "CIMPROTOCOL_VERSION_MISMATCH",
620 "CIMProtocolVersion value \"$0\" does not match CIM request "
621 "protocol version \"$1\".",
622 cimProtocolVersionInHeader,
623 protocolVersion);
|
624 j.alex 1.95 sendHttpError(
625 queueId,
626 HTTP_STATUS_BADREQUEST,
627 "header-mismatch",
628 MessageLoader::getMessage(parms),
629 closeConnect);
|
630 kumpf 1.39 PEG_METHOD_EXIT();
631 return;
|
632 kumpf 1.104 }
|
633 kumpf 1.39
|
634 karl 1.108 // Accept protocol version 1.x (see Bugzilla 1556)
635 if (!XmlReader::isSupportedProtocolVersion(protocolVersion))
|
636 kumpf 1.104 {
637 // See Specification for CIM Operations over HTTP section 4.3
|
638 j.alex 1.95 MessageLoaderParms parms(
|
639 kumpf 1.104 "Server.CIMOperationRequestDecoder."
640 "CIMPROTOCOL_VERSION_NOT_SUPPORTED",
641 "CIMProtocolVersion \"$0\" is not supported.",
642 protocolVersion);
|
643 j.alex 1.95 sendHttpError(
644 queueId,
|
645 kumpf 1.104 HTTP_STATUS_NOTIMPLEMENTED,
646 "unsupported-protocol-version",
|
647 j.alex 1.95 MessageLoader::getMessage(parms),
648 closeConnect);
|
649 kumpf 1.23 PEG_METHOD_EXIT();
650 return;
|
651 kumpf 1.104 }
|
652 kumpf 1.23
|
653 kumpf 1.104 if (XmlReader::testStartTag(parser, entry, "MULTIREQ"))
654 {
655 // We wouldn't have gotten here if CIMBatch header was specified,
656 // so this must be indicative of a header mismatch
|
657 j.alex 1.95 MessageLoaderParms parms(
|
658 kumpf 1.104 "Server.CIMOperationRequestDecoder."
659 "MULTI_REQUEST_MISSING_CIMBATCH_HTTP_HEADER",
660 "Multi-request is missing CIMBatch HTTP header");
|
661 j.alex 1.95 sendHttpError(
662 queueId,
663 HTTP_STATUS_BADREQUEST,
664 "header-mismatch",
665 MessageLoader::getMessage(parms),
666 closeConnect);
|
667 kumpf 1.23 PEG_METHOD_EXIT();
668 return;
|
669 kumpf 1.104 // Future: When MULTIREQ is supported, must ensure CIMMethod and
670 // CIMObject headers are absent, and CIMBatch header is present.
671 }
672
673 // Expect <SIMPLEREQ ...>
674
675 XmlReader::expectStartTag(parser, entry, "SIMPLEREQ");
676
677 // Check for <IMETHODCALL ...>
678
679 if (XmlReader::getIMethodCallStartTag(parser, cimMethodName))
680 {
681 // The Specification for CIM Operations over HTTP reads:
682 // 3.3.6. CIMMethod
683 //
684 // This header MUST be present in any CIM Operation Request
685 // message that contains a Simple Operation Request.
686 //
687 // It MUST NOT be present in any CIM Operation Response message,
688 // nor in any CIM Operation Request message that is not a
689 // Simple Operation Request.
690 kumpf 1.104 //
691 // The name of the CIM method within a Simple Operation Request
692 // is defined to be the value of the NAME attribute of the
693 // <METHODCALL> or <IMETHODCALL> element.
694 //
695 // If a CIM Server receives a CIM Operation Request for which
696 // either:
697 //
698 // - The CIMMethod header is present but has an invalid value,
699 // or;
700 // - The CIMMethod header is not present but the Operation
701 // Request Message is a Simple Operation Request, or;
702 // - The CIMMethod header is present but the Operation Request
703 // Message is not a Simple Operation Request, or;
704 // - The CIMMethod header is present, the Operation Request
705 // Message is a Simple Operation Request, but the
706 // CIMIdentifier value (when unencoded) does not match the
707 // unique method name within the Simple Operation Request,
708 //
709 // then it MUST fail the request and return a status of
710 // "400 Bad Request" (and MUST include a CIMError header in the
711 kumpf 1.104 // response with a value of header-mismatch), subject to the
712 // considerations specified in Errors.
713 if (!String::equalNoCase(cimMethodName, cimMethodInHeader))
714 {
715 // ATTN-RK-P3-20020304: How to decode cimMethodInHeader?
716 if (cimMethodInHeader == String::EMPTY)
717 {
718 MessageLoaderParms parms(
719 "Server.CIMOperationRequestDecoder."
720 "MISSING_CIMMETHOD_HTTP_HEADER",
721 "Missing CIMMethod HTTP header.");
722 sendHttpError(
723 queueId,
724 HTTP_STATUS_BADREQUEST,
725 "header-mismatch",
726 MessageLoader::getMessage(parms),
727 closeConnect);
728 }
729 else
730 {
731 MessageLoaderParms parms(
732 kumpf 1.104 "Server.CIMOperationRequestDecoder."
733 "CIMMETHOD_VALUE_DOES_NOT_MATCH_REQUEST_METHOD",
734 "CIMMethod value \"$0\" does not match CIM request "
735 "method \"$1\".",
736 cimMethodInHeader,
737 cimMethodName);
738 sendHttpError(
739 queueId,
740 HTTP_STATUS_BADREQUEST,
741 "header-mismatch",
742 MessageLoader::getMessage(parms),
743 closeConnect);
744 }
745 PEG_METHOD_EXIT();
746 return;
747 }
|
748 kumpf 1.23
|
749 kumpf 1.104 // Expect <LOCALNAMESPACEPATH ...>
750
751 String nameSpace;
752
753 if (!XmlReader::getLocalNameSpacePathElement(parser, nameSpace))
754 {
755 MessageLoaderParms mlParms(
756 "Server.CIMOperationRequestDecoder."
757 "EXPECTED_LOCALNAMESPACEPATH_ELEMENT",
758 "expected LOCALNAMESPACEPATH element");
759 throw XmlValidationError(parser.getLine(), mlParms);
760 }
761
762 // The Specification for CIM Operations over HTTP reads:
763 // 3.3.7. CIMObject
764 //
765 // This header MUST be present in any CIM Operation Request
766 // message that contains a Simple Operation Request.
767 //
768 // It MUST NOT be present in any CIM Operation Response message,
769 // nor in any CIM Operation Request message that is not a
770 kumpf 1.104 // Simple Operation Request.
771 //
772 // The header identifies the CIM object (which MUST be a Class
773 // or Instance for an extrinsic method, or a Namespace for an
774 // intrinsic method) on which the method is to be invoked, using
775 // a CIM object path encoded in an HTTP-safe representation.
776 //
777 // If a CIM Server receives a CIM Operation Request for which
778 // either:
779 //
780 // - The CIMObject header is present but has an invalid value,
781 // or;
782 // - The CIMObject header is not present but the Operation
783 // Request Message is a Simple Operation Request, or;
784 // - The CIMObject header is present but the Operation Request
785 // Message is not a Simple Operation Request, or;
786 // - The CIMObject header is present, the Operation Request
787 // Message is a Simple Operation Request, but the ObjectPath
788 // value does not match (where match is defined in the section
789 // section on Encoding CIM Object Paths) the Operation Request
790 // Message,
791 kumpf 1.104 //
792 // then it MUST fail the request and return a status of
793 // "400 Bad Request" (and MUST include a CIMError header in the
794 // response with a value of header-mismatch), subject to the
795 // considerations specified in Errors.
796 if (!String::equalNoCase(nameSpace, cimObjectInHeader))
797 {
798 if (cimObjectInHeader == String::EMPTY)
799 {
800 MessageLoaderParms parms(
801 "Server.CIMOperationRequestDecoder."
802 "MISSING_CIMOBJECT_HTTP_HEADER",
803 "Missing CIMObject HTTP header.");
804 sendHttpError(
805 queueId,
806 HTTP_STATUS_BADREQUEST,
807 "header-mismatch",
808 MessageLoader::getMessage(parms),
809 closeConnect);
810 }
811 else
812 kumpf 1.104 {
813 MessageLoaderParms parms(
814 "Server.CIMOperationRequestDecoder."
815 "CIMOBJECT_VALUE_DOES_NOT_MATCH_REQUEST_OBJECT:",
816 "CIMObject value \"$0\" does not match CIM request "
817 "object \"$1\".",
818 cimObjectInHeader,
819 nameSpace);
820 sendHttpError(
821 queueId,
822 HTTP_STATUS_BADREQUEST,
823 "header-mismatch",
824 MessageLoader::getMessage(parms),
825 closeConnect);
826 }
827 PEG_METHOD_EXIT();
828 return;
829 }
830
831 // This try block only catches CIMExceptions, because they must be
832 // responded to with a proper IMETHODRESPONSE. Other exceptions are
833 kumpf 1.104 // caught in the outer try block.
834 try
835 {
836 // Delegate to appropriate method to handle:
837
838 if (System::strcasecmp(cimMethodName, "GetClass") == 0)
839 request.reset(decodeGetClassRequest(
840 queueId, parser, messageId, nameSpace));
841 else if (System::strcasecmp(cimMethodName, "GetInstance") == 0)
842 request.reset(decodeGetInstanceRequest(
843 queueId, parser, messageId, nameSpace));
844 else if (System::strcasecmp(
845 cimMethodName, "EnumerateClassNames") == 0)
846 request.reset(decodeEnumerateClassNamesRequest(
847 queueId, parser, messageId, nameSpace));
848 else if (System::strcasecmp(cimMethodName, "References") == 0)
849 request.reset(decodeReferencesRequest(
850 queueId, parser, messageId, nameSpace));
851 else if (System::strcasecmp(
852 cimMethodName, "ReferenceNames") == 0)
853 request.reset(decodeReferenceNamesRequest(
854 kumpf 1.104 queueId, parser, messageId, nameSpace));
855 else if (System::strcasecmp(
856 cimMethodName, "AssociatorNames") == 0)
857 request.reset(decodeAssociatorNamesRequest(
858 queueId, parser, messageId, nameSpace));
859 else if (System::strcasecmp(cimMethodName, "Associators") == 0)
860 request.reset(decodeAssociatorsRequest(
861 queueId, parser, messageId, nameSpace));
862 else if (System::strcasecmp(
863 cimMethodName, "CreateInstance") == 0)
864 request.reset(decodeCreateInstanceRequest(
865 queueId, parser, messageId, nameSpace));
866 else if (System::strcasecmp(
867 cimMethodName, "EnumerateInstanceNames")==0)
868 request.reset(decodeEnumerateInstanceNamesRequest(
869 queueId, parser, messageId, nameSpace));
870 else if (System::strcasecmp(
871 cimMethodName, "DeleteQualifier") == 0)
872 request.reset(decodeDeleteQualifierRequest(
873 queueId, parser, messageId, nameSpace));
874 else if (System::strcasecmp(cimMethodName, "GetQualifier") == 0)
875 kumpf 1.104 request.reset(decodeGetQualifierRequest(
876 queueId, parser, messageId, nameSpace));
877 else if (System::strcasecmp(cimMethodName, "SetQualifier") == 0)
878 request.reset(decodeSetQualifierRequest(
879 queueId, parser, messageId, nameSpace));
880 else if (System::strcasecmp(
881 cimMethodName, "EnumerateQualifiers") == 0)
882 request.reset(decodeEnumerateQualifiersRequest(
883 queueId, parser, messageId, nameSpace));
884 else if (System::strcasecmp(
885 cimMethodName, "EnumerateClasses") == 0)
886 request.reset(decodeEnumerateClassesRequest(
887 queueId, parser, messageId, nameSpace));
888 else if (System::strcasecmp(
889 cimMethodName, "EnumerateInstances") == 0)
890 request.reset(decodeEnumerateInstancesRequest(
891 queueId, parser, messageId, nameSpace));
892 else if (System::strcasecmp(cimMethodName, "CreateClass") == 0)
893 request.reset(decodeCreateClassRequest(
894 queueId, parser, messageId, nameSpace));
895 else if (System::strcasecmp(cimMethodName, "ModifyClass") == 0)
896 kumpf 1.104 request.reset(decodeModifyClassRequest(
897 queueId, parser, messageId, nameSpace));
898 else if (System::strcasecmp(
899 cimMethodName, "ModifyInstance") == 0)
900 request.reset(decodeModifyInstanceRequest(
901 queueId, parser, messageId, nameSpace));
902 else if (System::strcasecmp(cimMethodName, "DeleteClass") == 0)
903 request.reset(decodeDeleteClassRequest(
904 queueId, parser, messageId, nameSpace));
905 else if (System::strcasecmp(
906 cimMethodName, "DeleteInstance") == 0)
907 request.reset(decodeDeleteInstanceRequest(
908 queueId, parser, messageId, nameSpace));
909 else if (System::strcasecmp(cimMethodName, "GetProperty") == 0)
910 request.reset(decodeGetPropertyRequest(
911 queueId, parser, messageId, nameSpace));
912 else if (System::strcasecmp(cimMethodName, "SetProperty") == 0)
913 request.reset(decodeSetPropertyRequest(
914 queueId, parser, messageId, nameSpace));
915 else if (System::strcasecmp(cimMethodName, "ExecQuery") == 0)
916 request.reset(decodeExecQueryRequest(
917 kumpf 1.104 queueId, parser, messageId, nameSpace));
918 else
919 {
920 throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_NOT_SUPPORTED,
921 MessageLoaderParms(
922 "Server.CIMOperationRequestDecoder."
923 "UNRECOGNIZED_INTRINSIC_METHOD",
924 "Unrecognized intrinsic method: $0",
925 cimMethodName));
926 }
927 }
928 catch (CIMException& e)
929 {
930 sendIMethodError(
931 queueId,
932 httpMethod,
933 messageId,
934 cimMethodName,
935 e,
936 closeConnect);
937
938 kumpf 1.104 PEG_METHOD_EXIT();
939 return;
940 }
941 catch (XmlException&)
942 {
943 // XmlExceptions are handled below
944 throw;
945 }
946 catch (Exception& e)
947 {
948 // Caught an unexpected exception from decoding. Since we must
949 // have had a problem reconstructing a CIM object, we'll treat
950 // it as an invalid parameter
951 sendIMethodError(
952 queueId,
953 httpMethod,
954 messageId,
955 cimMethodName,
956 PEGASUS_CIM_EXCEPTION(
957 CIM_ERR_INVALID_PARAMETER, e.getMessage()),
958 closeConnect);
959 kumpf 1.104
960 PEG_METHOD_EXIT();
961 return;
962 }
963
964 // Expect </IMETHODCALL>
965
966 XmlReader::expectEndTag(parser, "IMETHODCALL");
967 }
968 // Expect <METHODCALL ...>
969 else if (XmlReader::getMethodCallStartTag(parser, cimMethodName))
970 {
971 CIMObjectPath reference;
972
973 // The Specification for CIM Operations over HTTP reads:
974 // 3.3.6. CIMMethod
975 //
976 // This header MUST be present in any CIM Operation Request
977 // message that contains a Simple Operation Request.
978 //
979 // It MUST NOT be present in any CIM Operation Response message,
980 kumpf 1.104 // nor in any CIM Operation Request message that is not a
981 // Simple Operation Request.
982 //
983 // The name of the CIM method within a Simple Operation Request
984 // is defined to be the value of the NAME attribute of the
985 // <METHODCALL> or <IMETHODCALL> element.
986 //
987 // If a CIM Server receives a CIM Operation Request for which
988 // either:
989 //
990 // - The CIMMethod header is present but has an invalid value,
991 // or;
992 // - The CIMMethod header is not present but the Operation
993 // Request Message is a Simple Operation Request, or;
994 // - The CIMMethod header is present but the Operation Request
995 // Message is not a Simple Operation Request, or;
996 // - The CIMMethod header is present, the Operation Request
997 // Message is a Simple Operation Request, but the
998 // CIMIdentifier value (when unencoded) does not match the
999 // unique method name within the Simple Operation Request,
1000 //
1001 kumpf 1.104 // then it MUST fail the request and return a status of
1002 // "400 Bad Request" (and MUST include a CIMError header in the
1003 // response with a value of header-mismatch), subject to the
1004 // considerations specified in Errors.
1005
1006 // Extrinic methods can have UTF-8!
1007 String cimMethodNameUTF16(cimMethodName);
1008 if (cimMethodNameUTF16 != cimMethodInHeader)
1009 {
1010 // ATTN-RK-P3-20020304: How to decode cimMethodInHeader?
1011 if (cimMethodInHeader == String::EMPTY)
1012 {
1013 MessageLoaderParms parms(
1014 "Server.CIMOperationRequestDecoder."
1015 "MISSING_CIMMETHOD_HTTP_HEADER",
1016 "Missing CIMMethod HTTP header.");
1017 sendHttpError(
1018 queueId,
1019 HTTP_STATUS_BADREQUEST,
1020 "header-mismatch",
1021 MessageLoader::getMessage(parms),
1022 kumpf 1.104 closeConnect);
1023 }
1024 else
1025 {
1026 MessageLoaderParms parms(
1027 "Server.CIMOperationRequestDecoder."
1028 "CIMMETHOD_VALUE_DOES_NOT_MATCH_REQUEST_METHOD",
1029 "CIMMethod value \"$0\" does not match CIM request "
1030 "method \"$1\".",
1031 (const char*)cimMethodInHeader.getCString(),
1032 cimMethodName);
1033 sendHttpError(
1034 queueId,
1035 HTTP_STATUS_BADREQUEST,
1036 "header-mismatch",
1037 MessageLoader::getMessage(parms),
1038 closeConnect);
1039 }
1040 PEG_METHOD_EXIT();
1041 return;
1042 }
1043 kumpf 1.104
1044 //
1045 // Check for <LOCALINSTANCEPATHELEMENT> or <LOCALCLASSPATHELEMENT>
1046 //
1047 if (!(XmlReader::getLocalInstancePathElement(parser, reference) ||
1048 XmlReader::getLocalClassPathElement(parser, reference)))
1049 {
1050 MessageLoaderParms parms(
1051 "Common.XmlConstants.MISSING_ELEMENT_LOCALPATH",
1052 MISSING_ELEMENT_LOCALPATH);
1053 // this throw is not updated with MLP because
1054 // MISSING_ELEMENT_LOCALPATH is a hardcoded variable,
1055 // not a message
1056 throw XmlValidationError(parser.getLine(), parms);
1057 }
1058
1059 // The Specification for CIM Operations over HTTP reads:
1060 // 3.3.7. CIMObject
1061 //
1062 // This header MUST be present in any CIM Operation Request
1063 // message that contains a Simple Operation Request.
1064 kumpf 1.104 //
1065 // It MUST NOT be present in any CIM Operation Response message,
1066 // nor in any CIM Operation Request message that is not a
1067 // Simple Operation Request.
1068 //
1069 // The header identifies the CIM object (which MUST be a Class
1070 // or Instance for an extrinsic method, or a Namespace for an
1071 // intrinsic method) on which the method is to be invoked, using
1072 // a CIM object path encoded in an HTTP-safe representation.
1073 //
1074 // If a CIM Server receives a CIM Operation Request for which
1075 // either:
1076 //
1077 // - The CIMObject header is present but has an invalid value,
1078 // or;
1079 // - The CIMObject header is not present but the Operation
1080 // Request Message is a Simple Operation Request, or;
1081 // - The CIMObject header is present but the Operation Request
1082 // Message is not a Simple Operation Request, or;
1083 // - The CIMObject header is present, the Operation Request
1084 // Message is a Simple Operation Request, but the ObjectPath
1085 kumpf 1.104 // value does not match (where match is defined in the section
1086 // section on Encoding CIM Object Paths) the Operation Request
1087 // Message,
1088 //
1089 // then it MUST fail the request and return a status of
1090 // "400 Bad Request" (and MUST include a CIMError header in the
1091 // response with a value of header-mismatch), subject to the
1092 // considerations specified in Errors.
1093 if (cimObjectInHeader == String::EMPTY)
1094 {
1095 MessageLoaderParms parms(
1096 "Server.CIMOperationRequestDecoder."
1097 "MISSING_CIMOBJECT_HTTP_HEADER",
1098 "Missing CIMObject HTTP header.");
1099 sendHttpError(
1100 queueId,
1101 HTTP_STATUS_BADREQUEST,
1102 "header-mismatch",
1103 MessageLoader::getMessage(parms),
1104 closeConnect);
1105 PEG_METHOD_EXIT();
1106 kumpf 1.104 return;
1107 }
1108
1109 CIMObjectPath headerObjectReference;
1110 try
1111 {
1112 headerObjectReference.set(cimObjectInHeader);
1113 }
1114 catch (Exception&)
1115 {
1116 MessageLoaderParms parms(
1117 "Server.CIMOperationRequestDecoder."
1118 "COULD_NOT_PARSE_CIMOBJECT_VALUE",
1119 "Could not parse CIMObject value \"$0\".",
1120 cimObjectInHeader);
1121 sendHttpError(
1122 queueId,
1123 HTTP_STATUS_BADREQUEST,
1124 "header-mismatch",
1125 MessageLoader::getMessage(parms),
1126 closeConnect);
1127 kumpf 1.104 PEG_METHOD_EXIT();
1128 return;
1129 }
1130
1131 if (!reference.identical(headerObjectReference))
1132 {
1133 MessageLoaderParms parms(
1134 "Server.CIMOperationRequestDecoder."
1135 "CIMOBJECT_VALUE_DOES_NOT_MATCH_REQUEST_OBJECT:",
1136 "CIMObject value \"$0\" does not match CIM request "
1137 "object \"$1\".",
1138 cimObjectInHeader,
1139 reference.toString());
1140 sendHttpError(
1141 queueId,
1142 HTTP_STATUS_BADREQUEST,
1143 "header-mismatch",
1144 MessageLoader::getMessage(parms),
1145 closeConnect);
1146 PEG_METHOD_EXIT();
1147 return;
1148 kumpf 1.104 }
1149
1150 // This try block only catches CIMExceptions, because they must be
1151 // responded to with a proper METHODRESPONSE. Other exceptions are
1152 // caught in the outer try block.
1153 try
1154 {
1155 // Delegate to appropriate method to handle:
1156
1157 request.reset(decodeInvokeMethodRequest(
1158 queueId,
1159 parser,
1160 messageId,
1161 reference,
1162 cimMethodNameUTF16)); // contains UTF-16 converted from UTF-8
1163 }
1164 catch (CIMException& e)
1165 {
1166 sendMethodError(
1167 queueId,
1168 httpMethod,
1169 kumpf 1.104 messageId,
1170 cimMethodNameUTF16, // contains UTF-16 converted from UTF-8
1171 e,
1172 closeConnect);
1173
1174 PEG_METHOD_EXIT();
1175 return;
1176 }
1177 catch (XmlException&)
1178 {
1179 // XmlExceptions are handled below
1180 throw;
1181 }
1182 catch (Exception& e)
1183 {
1184 // Caught an unexpected exception from decoding. Since we must
1185 // have had a problem reconstructing a CIM object, we'll treata
1186 // it as an invalid parameter
1187 sendMethodError(
1188 queueId,
1189 httpMethod,
1190 kumpf 1.104 messageId,
1191 cimMethodNameUTF16, // contains UTF-16 converted from UTF-8
1192 PEGASUS_CIM_EXCEPTION(
1193 CIM_ERR_INVALID_PARAMETER, e.getMessage()),
1194 closeConnect);
1195
1196 PEG_METHOD_EXIT();
1197 return;
1198 }
|
1199 kumpf 1.73
|
1200 kumpf 1.104 // Expect </METHODCALL>
|
1201 mday 1.16
|
1202 kumpf 1.104 XmlReader::expectEndTag(parser, "METHODCALL");
1203 }
1204 else
1205 {
1206 MessageLoaderParms mlParms(
1207 "Server.CIMOperationRequestDecoder.EXPECTED_IMETHODCALL_ELEMENT",
1208 "expected IMETHODCALL or METHODCALL element");
1209 throw XmlValidationError(parser.getLine(),mlParms);
1210 }
1211
1212 // Expect </SIMPLEREQ>
1213
1214 XmlReader::expectEndTag(parser, "SIMPLEREQ");
1215
1216 // Expect </MESSAGE>
1217
1218 XmlReader::expectEndTag(parser, "MESSAGE");
1219
1220 // Expect </CIM>
1221
1222 XmlReader::expectEndTag(parser, "CIM");
1223 kumpf 1.104 }
1224 catch (XmlValidationError& e)
1225 {
1226 Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::TRACE,
1227 "CIMOperationRequestDecoder::handleMethodCall - "
1228 "XmlValidationError exception has occurred. Message: $0",
1229 e.getMessage());
|
1230 kumpf 1.24
|
1231 kumpf 1.104 sendHttpError(
1232 queueId,
1233 HTTP_STATUS_BADREQUEST,
1234 "request-not-valid",
1235 e.getMessage(),
1236 closeConnect);
1237 PEG_METHOD_EXIT();
1238 return;
1239 }
1240 catch (XmlSemanticError& e)
1241 {
1242 Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::TRACE,
1243 "CIMOperationRequestDecoder::handleMethodCall - "
1244 "XmlSemanticError exception has occurred. Message: $0",
1245 e.getMessage());
|
1246 mday 1.16
|
1247 kumpf 1.104 // ATTN-RK-P2-20020404: Is this the correct response for these errors?
1248 sendHttpError(
1249 queueId,
1250 HTTP_STATUS_BADREQUEST,
1251 "request-not-valid",
1252 e.getMessage(),
1253 closeConnect);
1254 PEG_METHOD_EXIT();
1255 return;
1256 }
1257 catch (XmlException& e)
1258 {
1259 Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::TRACE,
1260 "CIMOperationRequestDecoder::handleMethodCall - "
1261 "XmlException has occurred. Message: $0",
1262 e.getMessage());
1263
1264 sendHttpError(
1265 queueId,
1266 HTTP_STATUS_BADREQUEST,
1267 "request-not-well-formed",
1268 kumpf 1.104 e.getMessage(),
1269 closeConnect);
1270 PEG_METHOD_EXIT();
1271 return;
1272 }
1273 catch (Exception& e)
1274 {
1275 // Don't know why I got this exception. Seems like a bad thing.
1276 // Any exceptions we're expecting should be caught separately and
1277 // dealt with appropriately. This is a last resort.
1278 sendHttpError(
1279 queueId,
1280 HTTP_STATUS_INTERNALSERVERERROR,
1281 String::EMPTY,
1282 e.getMessage(),
1283 closeConnect);
1284 PEG_METHOD_EXIT();
1285 return;
1286 }
1287 catch (...)
1288 {
1289 kumpf 1.104 // Don't know why I got whatever this is. Seems like a bad thing.
1290 // Any exceptions we're expecting should be caught separately and
1291 // dealt with appropriately. This is a last resort.
1292 sendHttpError(
1293 queueId,
1294 HTTP_STATUS_INTERNALSERVERERROR,
1295 String::EMPTY,
1296 String::EMPTY,
1297 closeConnect);
1298 PEG_METHOD_EXIT();
1299 return;
1300 }
1301
1302 STAT_BYTESREAD
1303
1304 request->authType = authType;
1305 request->userName = userName;
1306 request->ipAddress = ipAddress;
1307 request->setHttpMethod (httpMethod);
|
1308 sage 1.41
|
1309 chuck 1.58 //l10n start
1310 // l10n TODO - might want to move A-L and C-L to Message
1311 // to make this more maintainable
|
1312 kumpf 1.104 // Add the language headers to the request
1313 CIMMessage* cimmsg = dynamic_cast<CIMMessage*>(request.get());
1314 if (cimmsg != NULL)
1315 {
1316 cimmsg->operationContext.insert(IdentityContainer(userName));
1317 cimmsg->operationContext.set(
1318 AcceptLanguageListContainer(httpAcceptLanguages));
1319 cimmsg->operationContext.set(
1320 ContentLanguageListContainer(httpContentLanguages));
1321 }
1322 else
1323 {
1324 ; // l10n TODO - error back to client here
1325 }
|
1326 chip 1.92 // l10n end
|
1327 chuck 1.58
|
1328 kumpf 1.104 request->setCloseConnect(closeConnect);
1329 _outputQueue->enqueue(request.release());
|
1330 chip 1.92
|
1331 kumpf 1.104 PEG_METHOD_EXIT();
|
1332 mike 1.2 }
1333
|
1334 kumpf 1.104 CIMCreateClassRequestMessage*
1335 CIMOperationRequestDecoder::decodeCreateClassRequest(
1336 Uint32 queueId,
1337 XmlParser& parser,
1338 const String& messageId,
1339 const CIMNamespaceName& nameSpace)
1340 {
1341 PEG_METHOD_ENTER(TRC_DISPATCHER,
1342 "CIMOperationRequestDecoder::decodeCreateClassRequest()");
1343
1344 STAT_GETSTARTTIME
1345
1346 CIMClass newClass;
1347 Boolean duplicateParameter = false;
1348 Boolean gotClass = false;
1349 Boolean emptyTag;
1350
1351 for (const char* name;
1352 XmlReader::getIParamValueTag(parser, name, emptyTag); )
1353 {
1354 if (System::strcasecmp(name, "NewClass") == 0)
1355 kumpf 1.104 {
1356 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
|
1357 kumpf 1.106 if (!XmlReader::getClassElement(parser, newClass))
1358 {
1359 throw PEGASUS_CIM_EXCEPTION(
1360 CIM_ERR_INVALID_PARAMETER, "NewClass");
1361 }
|
1362 kumpf 1.104 duplicateParameter = gotClass;
1363 gotClass = true;
1364 }
1365 else
1366 {
1367 PEG_METHOD_EXIT();
1368 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
1369 }
|
1370 mike 1.2
|
1371 kumpf 1.104 if (!emptyTag)
1372 {
1373 XmlReader::expectEndTag(parser, "IPARAMVALUE");
1374 }
|
1375 sage 1.41
|
1376 kumpf 1.104 if (duplicateParameter)
1377 {
1378 PEG_METHOD_EXIT();
1379 throw PEGASUS_CIM_EXCEPTION(
1380 CIM_ERR_INVALID_PARAMETER, String::EMPTY);
1381 }
1382 }
1383
1384 if (!gotClass)
1385 {
1386 PEG_METHOD_EXIT();
1387 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, String::EMPTY);
1388 }
1389
1390 AutoPtr<CIMCreateClassRequestMessage> request(
1391 new CIMCreateClassRequestMessage(
1392 messageId,
1393 nameSpace,
1394 newClass,
1395 QueueIdStack(queueId, _returnQueueId)));
1396
1397 kumpf 1.104 STAT_SERVERSTART
1398
1399 PEG_METHOD_EXIT();
1400 return request.release();
|
1401 mike 1.2 }
1402
1403 CIMGetClassRequestMessage* CIMOperationRequestDecoder::decodeGetClassRequest(
|
1404 kumpf 1.104 Uint32 queueId,
1405 XmlParser& parser,
1406 const String& messageId,
1407 const CIMNamespaceName& nameSpace)
1408 {
1409 PEG_METHOD_ENTER(TRC_DISPATCHER,
1410 "CIMOperationRequestDecoder::decodeGetClassRequest()");
1411
1412 STAT_GETSTARTTIME
1413
1414 CIMName className;
1415 Boolean localOnly = true;
1416 Boolean includeQualifiers = true;
1417 Boolean includeClassOrigin = false;
1418 CIMPropertyList propertyList;
1419 Boolean duplicateParameter = false;
1420 Boolean gotClassName = false;
1421 Boolean gotLocalOnly = false;
1422 Boolean gotIncludeQualifiers = false;
1423 Boolean gotIncludeClassOrigin = false;
1424 Boolean gotPropertyList = false;
1425 kumpf 1.104 Boolean emptyTag;
1426
1427 for (const char* name;
1428 XmlReader::getIParamValueTag(parser, name, emptyTag); )
1429 {
1430 if (System::strcasecmp(name, "ClassName") == 0)
1431 {
1432 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
1433 XmlReader::getClassNameElement(parser, className, true);
1434 duplicateParameter = gotClassName;
1435 gotClassName = true;
1436 }
1437 else if (System::strcasecmp(name, "LocalOnly") == 0)
1438 {
1439 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
1440 XmlReader::getBooleanValueElement(parser, localOnly, true);
1441 duplicateParameter = gotLocalOnly;
1442 gotLocalOnly = true;
1443 }
1444 else if (System::strcasecmp(name, "IncludeQualifiers") == 0)
1445 {
1446 kumpf 1.104 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
1447 XmlReader::getBooleanValueElement(parser, includeQualifiers, true);
1448 duplicateParameter = gotIncludeQualifiers;
1449 gotIncludeQualifiers = true;
1450 }
1451 else if (System::strcasecmp(name, "IncludeClassOrigin") == 0)
1452 {
1453 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
1454 XmlReader::getBooleanValueElement(parser, includeClassOrigin, true);
1455 duplicateParameter = gotIncludeClassOrigin;
1456 gotIncludeClassOrigin = true;
1457 }
1458 else if (System::strcasecmp(name, "PropertyList") == 0)
1459 {
1460 if (!emptyTag)
1461 {
1462 CIMValue pl;
1463 if (XmlReader::getValueArrayElement(parser, CIMTYPE_STRING, pl))
1464 {
1465 Array<String> propertyListArray;
1466 pl.get(propertyListArray);
1467 kumpf 1.104 Array<CIMName> cimNameArray;
1468 for (Uint32 i = 0; i < propertyListArray.size(); i++)
1469 {
1470 cimNameArray.append(propertyListArray[i]);
1471 }
1472 propertyList.set(cimNameArray);
1473 }
1474 }
1475 duplicateParameter = gotPropertyList;
1476 gotPropertyList = true;
1477 }
1478 else
1479 {
1480 PEG_METHOD_EXIT();
1481 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
1482 }
1483
1484 if (!emptyTag)
1485 {
1486 XmlReader::expectEndTag(parser, "IPARAMVALUE");
1487 }
1488 kumpf 1.104
1489 if (duplicateParameter)
1490 {
1491 PEG_METHOD_EXIT();
1492 throw PEGASUS_CIM_EXCEPTION(
1493 CIM_ERR_INVALID_PARAMETER, String::EMPTY);
1494 }
1495 }
1496
1497 if (!gotClassName)
1498 {
1499 PEG_METHOD_EXIT();
1500 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, String::EMPTY);
1501 }
1502
1503 AutoPtr<CIMGetClassRequestMessage> request(new CIMGetClassRequestMessage(
1504 messageId,
1505 nameSpace,
1506 className,
1507 localOnly,
1508 includeQualifiers,
1509 kumpf 1.104 includeClassOrigin,
1510 propertyList,
1511 QueueIdStack(queueId, _returnQueueId)));
1512
1513 STAT_SERVERSTART
1514
1515 PEG_METHOD_EXIT();
1516 return request.release();
1517 }
1518
1519 CIMModifyClassRequestMessage*
1520 CIMOperationRequestDecoder::decodeModifyClassRequest(
1521 Uint32 queueId,
1522 XmlParser& parser,
1523 const String& messageId,
1524 const CIMNamespaceName& nameSpace)
1525 {
1526 STAT_GETSTARTTIME
1527
1528 CIMClass modifiedClass;
1529 Boolean duplicateParameter = false;
1530 kumpf 1.104 Boolean gotClass = false;
1531 Boolean emptyTag;
1532
1533 for (const char* name;
1534 XmlReader::getIParamValueTag(parser, name, emptyTag); )
1535 {
1536 if (System::strcasecmp(name, "ModifiedClass") == 0)
1537 {
1538 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
|
1539 kumpf 1.106 if (!XmlReader::getClassElement(parser, modifiedClass))
1540 {
1541 throw PEGASUS_CIM_EXCEPTION(
1542 CIM_ERR_INVALID_PARAMETER, "ModifiedClass");
1543 }
|
1544 kumpf 1.104 duplicateParameter = gotClass;
1545 gotClass = true;
1546 }
1547 else
1548 {
1549 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
1550 }
1551
1552 if (!emptyTag)
1553 {
1554 XmlReader::expectEndTag(parser, "IPARAMVALUE");
1555 }
1556
1557 if (duplicateParameter)
1558 {
1559 throw PEGASUS_CIM_EXCEPTION(
1560 CIM_ERR_INVALID_PARAMETER, String::EMPTY);
1561 }
1562 }
1563
1564 if (!gotClass)
1565 kumpf 1.104 {
1566 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, String::EMPTY);
1567 }
1568
1569 AutoPtr<CIMModifyClassRequestMessage> request(
1570 new CIMModifyClassRequestMessage(
1571 messageId,
1572 nameSpace,
1573 modifiedClass,
1574 QueueIdStack(queueId, _returnQueueId)));
1575
1576 STAT_SERVERSTART
1577
1578 return request.release();
1579 }
1580
1581 CIMEnumerateClassNamesRequestMessage*
1582 CIMOperationRequestDecoder::decodeEnumerateClassNamesRequest(
1583 Uint32 queueId,
1584 XmlParser& parser,
1585 const String& messageId,
1586 kumpf 1.104 const CIMNamespaceName& nameSpace)
1587 {
1588 STAT_GETSTARTTIME
1589
1590 CIMName className;
1591 Boolean deepInheritance = false;
1592 Boolean duplicateParameter = false;
1593 Boolean gotClassName = false;
1594 Boolean gotDeepInheritance = false;
1595 Boolean emptyTag;
1596
1597 for (const char* name;
1598 XmlReader::getIParamValueTag(parser, name, emptyTag); )
1599 {
1600 if (System::strcasecmp(name, "ClassName") == 0)
1601 {
1602 //
1603 // ClassName may be NULL
1604 //
1605 if (!emptyTag)
1606 {
1607 kumpf 1.104 XmlReader::getClassNameElement(parser, className, false);
1608 }
1609 duplicateParameter = gotClassName;
1610 gotClassName = true;
1611 }
1612 else if (System::strcasecmp(name, "DeepInheritance") == 0)
1613 {
1614 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
1615 XmlReader::getBooleanValueElement(parser, deepInheritance, true);
1616 duplicateParameter = gotDeepInheritance;
1617 gotDeepInheritance = true;
1618 }
1619 else
1620 {
1621 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
1622 }
1623
1624 if (!emptyTag)
1625 {
1626 XmlReader::expectEndTag(parser, "IPARAMVALUE");
1627 }
1628 kumpf 1.104
1629 if (duplicateParameter)
1630 {
1631 throw PEGASUS_CIM_EXCEPTION(
1632 CIM_ERR_INVALID_PARAMETER, String::EMPTY);
1633 }
1634 }
1635
1636 AutoPtr<CIMEnumerateClassNamesRequestMessage> request(
1637 new CIMEnumerateClassNamesRequestMessage(
1638 messageId,
1639 nameSpace,
1640 className,
1641 deepInheritance,
1642 QueueIdStack(queueId, _returnQueueId)));
1643
1644 STAT_SERVERSTART
1645
1646 return request.release();
1647 }
1648
1649 kumpf 1.104 CIMEnumerateClassesRequestMessage*
1650 CIMOperationRequestDecoder::decodeEnumerateClassesRequest(
1651 Uint32 queueId,
1652 XmlParser& parser,
1653 const String& messageId,
1654 const CIMNamespaceName& nameSpace)
1655 {
1656 STAT_GETSTARTTIME
1657
1658 CIMName className;
1659 Boolean deepInheritance = false;
1660 Boolean localOnly = true;
1661 Boolean includeQualifiers = true;
1662 Boolean includeClassOrigin = false;
1663 Boolean duplicateParameter = false;
1664 Boolean gotClassName = false;
1665 Boolean gotDeepInheritance = false;
1666 Boolean gotLocalOnly = false;
1667 Boolean gotIncludeQualifiers = false;
1668 Boolean gotIncludeClassOrigin = false;
1669 Boolean emptyTag;
1670 kumpf 1.104
1671 for (const char* name;
1672 XmlReader::getIParamValueTag(parser, name, emptyTag); )
1673 {
1674 if (System::strcasecmp(name, "ClassName") == 0)
1675 {
1676 //
1677 // ClassName may be NULL
1678 //
1679 if (!emptyTag)
1680 {
1681 XmlReader::getClassNameElement(parser, className, false);
1682 }
1683 duplicateParameter = gotClassName;
1684 gotClassName = true;
1685 }
1686 else if (System::strcasecmp(name, "DeepInheritance") == 0)
1687 {
1688 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
1689 XmlReader::getBooleanValueElement(parser, deepInheritance, true);
1690 duplicateParameter = gotDeepInheritance;
1691 kumpf 1.104 gotDeepInheritance = true;
1692 }
1693 else if (System::strcasecmp(name, "LocalOnly") == 0)
1694 {
1695 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
1696 XmlReader::getBooleanValueElement(parser, localOnly, true);
1697 duplicateParameter = gotLocalOnly;
1698 gotLocalOnly = true;
1699 }
1700 else if (System::strcasecmp(name, "IncludeQualifiers") == 0)
1701 {
1702 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
1703 XmlReader::getBooleanValueElement(parser, includeQualifiers, true);
1704 duplicateParameter = gotIncludeQualifiers;
1705 gotIncludeQualifiers = true;
1706 }
1707 else if (System::strcasecmp(name, "IncludeClassOrigin") == 0)
1708 {
1709 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
1710 XmlReader::getBooleanValueElement(parser, includeClassOrigin, true);
1711 duplicateParameter = gotIncludeClassOrigin;
1712 kumpf 1.104 gotIncludeClassOrigin = true;
1713 }
1714 else
1715 {
1716 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
1717 }
1718
1719 if (!emptyTag)
1720 {
1721 XmlReader::expectEndTag(parser, "IPARAMVALUE");
1722 }
1723
1724 if (duplicateParameter)
1725 {
1726 throw PEGASUS_CIM_EXCEPTION(
1727 CIM_ERR_INVALID_PARAMETER, String::EMPTY);
1728 }
1729 }
1730
1731 AutoPtr<CIMEnumerateClassesRequestMessage> request(
1732 new CIMEnumerateClassesRequestMessage(
1733 kumpf 1.104 messageId,
1734 nameSpace,
1735 className,
1736 deepInheritance,
1737 localOnly,
1738 includeQualifiers,
1739 includeClassOrigin,
1740 QueueIdStack(queueId, _returnQueueId)));
1741
1742 STAT_SERVERSTART
1743
1744 return request.release();
1745 }
1746
1747 CIMDeleteClassRequestMessage*
1748 CIMOperationRequestDecoder::decodeDeleteClassRequest(
1749 Uint32 queueId,
1750 XmlParser& parser,
1751 const String& messageId,
1752 const CIMNamespaceName& nameSpace)
1753 {
1754 kumpf 1.104 STAT_GETSTARTTIME
1755
1756 CIMName className;
1757 Boolean duplicateParameter = false;
1758 Boolean gotClassName = false;
1759 Boolean emptyTag;
1760
1761 for (const char* name;
1762 XmlReader::getIParamValueTag(parser, name, emptyTag); )
1763 {
1764 if (System::strcasecmp(name, "ClassName") == 0)
1765 {
1766 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
1767 XmlReader::getClassNameElement(parser, className);
1768 duplicateParameter = gotClassName;
1769 gotClassName = true;
1770 }
1771 else
1772 {
1773 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
1774 }
1775 kumpf 1.104
1776 if (!emptyTag)
1777 {
1778 XmlReader::expectEndTag(parser, "IPARAMVALUE");
1779 }
1780
1781 if (duplicateParameter)
1782 {
1783 throw PEGASUS_CIM_EXCEPTION(
1784 CIM_ERR_INVALID_PARAMETER, String::EMPTY);
1785 }
1786 }
1787
1788 if (!gotClassName)
1789 {
1790 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, String::EMPTY);
1791 }
1792
1793 AutoPtr<CIMDeleteClassRequestMessage> request(
1794 new CIMDeleteClassRequestMessage(
1795 messageId,
1796 kumpf 1.104 nameSpace,
1797 className,
1798 QueueIdStack(queueId, _returnQueueId)));
1799
1800 STAT_SERVERSTART
1801
1802 return request.release();
1803 }
1804
1805 CIMCreateInstanceRequestMessage*
1806 CIMOperationRequestDecoder::decodeCreateInstanceRequest(
1807 Uint32 queueId,
1808 XmlParser& parser,
1809 const String& messageId,
1810 const CIMNamespaceName& nameSpace)
1811 {
1812 STAT_GETSTARTTIME
1813
1814 CIMInstance newInstance;
1815 Boolean duplicateParameter = false;
1816 Boolean gotInstance = false;
1817 kumpf 1.104 Boolean emptyTag;
1818
1819 for (const char* name;
1820 XmlReader::getIParamValueTag(parser, name, emptyTag); )
1821 {
1822 if (System::strcasecmp(name, "NewInstance") == 0)
1823 {
1824 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
1825 XmlReader::getInstanceElement(parser, newInstance);
1826 duplicateParameter = gotInstance;
1827 gotInstance = true;
1828 }
1829 else
1830 {
1831 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
1832 }
1833
1834 if (!emptyTag)
1835 {
1836 XmlReader::expectEndTag(parser, "IPARAMVALUE");
1837 }
1838 kumpf 1.104
1839 if (duplicateParameter)
1840 {
1841 throw PEGASUS_CIM_EXCEPTION(
1842 CIM_ERR_INVALID_PARAMETER, String::EMPTY);
1843 }
1844 }
1845
1846 if (!gotInstance)
1847 {
1848 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, String::EMPTY);
1849 }
1850
1851 AutoPtr<CIMCreateInstanceRequestMessage> request(
1852 new CIMCreateInstanceRequestMessage(
1853 messageId,
1854 nameSpace,
1855 newInstance,
1856 QueueIdStack(queueId, _returnQueueId)));
1857
1858 STAT_SERVERSTART
1859 kumpf 1.104
1860 return request.release();
1861 }
1862
1863 CIMGetInstanceRequestMessage*
1864 CIMOperationRequestDecoder::decodeGetInstanceRequest(
1865 Uint32 queueId,
1866 XmlParser& parser,
1867 const String& messageId,
1868 const CIMNamespaceName& nameSpace)
1869 {
1870 STAT_GETSTARTTIME
1871
1872 CIMObjectPath instanceName;
1873 Boolean localOnly = true;
1874 Boolean includeQualifiers = false;
1875 Boolean includeClassOrigin = false;
1876 CIMPropertyList propertyList;
1877 Boolean duplicateParameter = false;
1878 Boolean gotInstanceName = false;
1879 Boolean gotLocalOnly = false;
1880 kumpf 1.104 Boolean gotIncludeQualifiers = false;
1881 Boolean gotIncludeClassOrigin = false;
1882 Boolean gotPropertyList = false;
1883 Boolean emptyTag;
1884
1885 for (const char* name;
1886 XmlReader::getIParamValueTag(parser, name, emptyTag); )
1887 {
1888 if (System::strcasecmp(name, "InstanceName") == 0)
1889 {
1890 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
1891 XmlReader::getInstanceNameElement(parser, instanceName);
1892 duplicateParameter = gotInstanceName;
1893 gotInstanceName = true;
1894 }
1895 else if (System::strcasecmp(name, "LocalOnly") == 0)
1896 {
1897 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
1898 XmlReader::getBooleanValueElement(parser, localOnly, true);
1899 duplicateParameter = gotLocalOnly;
1900 gotLocalOnly = true;
1901 kumpf 1.104 }
1902 else if (System::strcasecmp(name, "IncludeQualifiers") == 0)
1903 {
1904 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
1905 XmlReader::getBooleanValueElement(parser, includeQualifiers, true);
1906 duplicateParameter = gotIncludeQualifiers;
1907 gotIncludeQualifiers = true;
1908 }
1909 else if (System::strcasecmp(name, "IncludeClassOrigin") == 0)
1910 {
1911 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
1912 XmlReader::getBooleanValueElement(parser, includeClassOrigin, true);
1913 duplicateParameter = gotIncludeClassOrigin;
1914 gotIncludeClassOrigin = true;
1915 }
1916 else if (System::strcasecmp(name, "PropertyList") == 0)
1917 {
1918 if (!emptyTag)
1919 {
1920 CIMValue pl;
1921 if (XmlReader::getValueArrayElement(parser, CIMTYPE_STRING, pl))
1922 kumpf 1.104 {
1923 Array<String> propertyListArray;
1924 pl.get(propertyListArray);
1925 Array<CIMName> cimNameArray;
1926 for (Uint32 i = 0; i < propertyListArray.size(); i++)
1927 {
1928 cimNameArray.append(propertyListArray[i]);
1929 }
1930 propertyList.set(cimNameArray);
1931 }
1932 }
1933 duplicateParameter = gotPropertyList;
1934 gotPropertyList = true;
1935 }
1936 else
1937 {
1938 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
1939 }
1940
1941 if (!emptyTag)
1942 {
1943 kumpf 1.104 XmlReader::expectEndTag(parser, "IPARAMVALUE");
1944 }
1945
1946 if (duplicateParameter)
1947 {
1948 throw PEGASUS_CIM_EXCEPTION(
1949 CIM_ERR_INVALID_PARAMETER, String::EMPTY);
1950 }
1951 }
1952
1953 if (!gotInstanceName)
1954 {
1955 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, String::EMPTY);
1956 }
1957
1958 AutoPtr<CIMGetInstanceRequestMessage> request(
1959 new CIMGetInstanceRequestMessage(
1960 messageId,
1961 nameSpace,
1962 instanceName,
1963 false, // Bug 1985 localOnly is deprecated
|
1964 h.sterling 1.97 #ifdef PEGASUS_DISABLE_INSTANCE_QUALIFIERS
|
1965 kumpf 1.104 false,
|
1966 h.sterling 1.97 #else
|
1967 kumpf 1.104 includeQualifiers,
|
1968 h.sterling 1.97 #endif
|
1969 kumpf 1.104 includeClassOrigin,
1970 propertyList,
1971 QueueIdStack(queueId, _returnQueueId)));
1972
1973 STAT_SERVERSTART
1974
1975 return request.release();
1976 }
1977
1978 CIMModifyInstanceRequestMessage*
1979 CIMOperationRequestDecoder::decodeModifyInstanceRequest(
1980 Uint32 queueId,
1981 XmlParser& parser,
1982 const String& messageId,
1983 const CIMNamespaceName& nameSpace)
1984 {
1985 STAT_GETSTARTTIME
1986
1987 CIMInstance modifiedInstance;
1988 Boolean includeQualifiers = true;
1989 CIMPropertyList propertyList;
1990 kumpf 1.104 Boolean duplicateParameter = false;
1991 Boolean gotInstance = false;
1992 Boolean gotIncludeQualifiers = false;
1993 Boolean gotPropertyList = false;
1994 Boolean emptyTag;
1995
1996 for (const char* name;
1997 XmlReader::getIParamValueTag(parser, name, emptyTag); )
1998 {
1999 if (System::strcasecmp(name, "ModifiedInstance") == 0)
2000 {
2001 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2002 XmlReader::getNamedInstanceElement(parser, modifiedInstance);
2003 duplicateParameter = gotInstance;
2004 gotInstance = true;
2005 }
2006 else if (System::strcasecmp(name, "IncludeQualifiers") == 0)
2007 {
2008 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2009 XmlReader::getBooleanValueElement(parser, includeQualifiers, true);
2010 duplicateParameter = gotIncludeQualifiers;
2011 kumpf 1.104 gotIncludeQualifiers = true;
2012 }
2013 else if (System::strcasecmp(name, "PropertyList") == 0)
2014 {
2015 if (!emptyTag)
2016 {
2017 CIMValue pl;
2018 if (XmlReader::getValueArrayElement(parser, CIMTYPE_STRING, pl))
2019 {
2020 Array<String> propertyListArray;
2021 pl.get(propertyListArray);
2022 Array<CIMName> cimNameArray;
2023 for (Uint32 i = 0; i < propertyListArray.size(); i++)
2024 {
2025 cimNameArray.append(propertyListArray[i]);
2026 }
2027 propertyList.set(cimNameArray);
2028 }
2029 }
2030 duplicateParameter = gotPropertyList;
2031 gotPropertyList = true;
2032 kumpf 1.104 }
2033 else
2034 {
2035 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
2036 }
2037
2038 if (!emptyTag)
2039 {
2040 XmlReader::expectEndTag(parser, "IPARAMVALUE");
2041 }
2042
2043 if (duplicateParameter)
2044 {
2045 throw PEGASUS_CIM_EXCEPTION(
2046 CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2047 }
2048 }
2049
2050 if (!gotInstance)
2051 {
2052 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2053 kumpf 1.104 }
2054
2055 AutoPtr<CIMModifyInstanceRequestMessage> request(
2056 new CIMModifyInstanceRequestMessage(
2057 messageId,
2058 nameSpace,
2059 modifiedInstance,
2060 includeQualifiers,
2061 propertyList,
2062 QueueIdStack(queueId, _returnQueueId)));
2063
2064 STAT_SERVERSTART
2065
2066 return request.release();
2067 }
2068
2069 CIMEnumerateInstancesRequestMessage*
2070 CIMOperationRequestDecoder::decodeEnumerateInstancesRequest(
2071 Uint32 queueId,
2072 XmlParser& parser,
2073 const String& messageId,
2074 kumpf 1.104 const CIMNamespaceName& nameSpace)
2075 {
2076 STAT_GETSTARTTIME
2077
2078 CIMName className;
2079 Boolean deepInheritance = true;
2080 Boolean localOnly = true;
2081 Boolean includeQualifiers = false;
2082 Boolean includeClassOrigin = false;
2083 CIMPropertyList propertyList;
2084 Boolean duplicateParameter = false;
2085 Boolean gotClassName = false;
2086 Boolean gotDeepInheritance = false;
2087 Boolean gotLocalOnly = false;
2088 Boolean gotIncludeQualifiers = false;
2089 Boolean gotIncludeClassOrigin = false;
2090 Boolean gotPropertyList = false;
2091 Boolean emptyTag;
2092
2093 for (const char* name;
2094 XmlReader::getIParamValueTag(parser, name, emptyTag); )
2095 kumpf 1.104 {
2096 if (System::strcasecmp(name, "ClassName") == 0)
2097 {
2098 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2099 XmlReader::getClassNameElement(parser, className, true);
2100 duplicateParameter = gotClassName;
2101 gotClassName = true;
2102 }
2103 else if (System::strcasecmp(name, "DeepInheritance") == 0)
2104 {
2105 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2106 XmlReader::getBooleanValueElement(parser, deepInheritance, true);
2107 duplicateParameter = gotDeepInheritance;
2108 gotDeepInheritance = true;
2109 }
2110 else if (System::strcasecmp(name, "LocalOnly") == 0)
2111 {
2112 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2113 XmlReader::getBooleanValueElement(parser, localOnly, true);
2114 duplicateParameter = gotLocalOnly;
2115 gotLocalOnly = true;
2116 kumpf 1.104 }
2117 else if (System::strcasecmp(name, "IncludeQualifiers") == 0)
2118 {
2119 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2120 XmlReader::getBooleanValueElement(parser, includeQualifiers, true);
2121 duplicateParameter = gotIncludeQualifiers;
2122 gotIncludeQualifiers = true;
2123 }
2124 else if (System::strcasecmp(name, "IncludeClassOrigin") == 0)
2125 {
2126 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2127 XmlReader::getBooleanValueElement(parser, includeClassOrigin, true);
2128 duplicateParameter = gotIncludeClassOrigin;
2129 gotIncludeClassOrigin = true;
2130 }
2131 else if (System::strcasecmp(name, "PropertyList") == 0)
2132 {
2133 if (!emptyTag)
2134 {
2135 CIMValue pl;
2136 if (XmlReader::getValueArrayElement(parser, CIMTYPE_STRING, pl))
2137 kumpf 1.104 {
2138 Array<String> propertyListArray;
2139 pl.get(propertyListArray);
2140 Array<CIMName> cimNameArray;
2141 for (Uint32 i = 0; i < propertyListArray.size(); i++)
2142 {
2143 cimNameArray.append(propertyListArray[i]);
2144 }
2145 propertyList.set(cimNameArray);
2146 }
2147 }
2148 duplicateParameter = gotPropertyList;
2149 gotPropertyList = true;
2150 }
2151 else
2152 {
2153 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
2154 }
2155
2156 if (!emptyTag)
2157 {
2158 kumpf 1.104 XmlReader::expectEndTag(parser, "IPARAMVALUE");
2159 }
2160
2161 if (duplicateParameter)
2162 {
2163 throw PEGASUS_CIM_EXCEPTION(
2164 CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2165 }
2166 }
2167
2168 if (!gotClassName)
2169 {
2170 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2171 }
2172
2173 AutoPtr<CIMEnumerateInstancesRequestMessage> request(
2174 new CIMEnumerateInstancesRequestMessage(
2175 messageId,
2176 nameSpace,
2177 className,
2178 deepInheritance,
2179 kumpf 1.104 false, // Bug 1985 localOnly is deprecated
|
2180 h.sterling 1.97 #ifdef PEGASUS_DISABLE_INSTANCE_QUALIFIERS
|
2181 kumpf 1.104 false,
|
2182 h.sterling 1.97 #else
|
2183 kumpf 1.104 includeQualifiers,
|
2184 h.sterling 1.97 #endif
|
2185 kumpf 1.104 includeClassOrigin,
2186 propertyList,
2187 QueueIdStack(queueId, _returnQueueId)));
2188
2189 STAT_SERVERSTART
2190
2191 return request.release();
2192 }
2193
2194 CIMEnumerateInstanceNamesRequestMessage*
2195 CIMOperationRequestDecoder::decodeEnumerateInstanceNamesRequest(
2196 Uint32 queueId,
2197 XmlParser& parser,
2198 const String& messageId,
2199 const CIMNamespaceName& nameSpace)
2200 {
2201 STAT_GETSTARTTIME
2202
2203 CIMName className;
2204 Boolean duplicateParameter = false;
2205 Boolean gotClassName = false;
2206 kumpf 1.104 Boolean emptyTag;
2207
2208 for (const char* name;
2209 XmlReader::getIParamValueTag(parser, name, emptyTag); )
2210 {
2211 if (System::strcasecmp(name, "ClassName") == 0)
2212 {
2213 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2214 XmlReader::getClassNameElement(parser, className, true);
2215 duplicateParameter = gotClassName;
2216 gotClassName = true;
2217 }
2218 else
2219 {
2220 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
2221 }
2222
2223 if (!emptyTag)
2224 {
2225 XmlReader::expectEndTag(parser, "IPARAMVALUE");
2226 }
2227 kumpf 1.104
2228 if (duplicateParameter)
2229 {
2230 throw PEGASUS_CIM_EXCEPTION(
2231 CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2232 }
2233 }
2234
2235 if (!gotClassName)
2236 {
2237 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2238 }
2239
2240 AutoPtr<CIMEnumerateInstanceNamesRequestMessage> request(
2241 new CIMEnumerateInstanceNamesRequestMessage(
2242 messageId,
2243 nameSpace,
2244 className,
2245 QueueIdStack(queueId, _returnQueueId)));
2246
2247 STAT_SERVERSTART
2248 kumpf 1.104
2249 return request.release();
2250 }
2251
2252 CIMDeleteInstanceRequestMessage*
2253 CIMOperationRequestDecoder::decodeDeleteInstanceRequest(
2254 Uint32 queueId,
2255 XmlParser& parser,
2256 const String& messageId,
2257 const CIMNamespaceName& nameSpace)
2258 {
2259 STAT_GETSTARTTIME
2260
2261 CIMObjectPath instanceName;
2262 Boolean duplicateParameter = false;
2263 Boolean gotInstanceName = false;
2264 Boolean emptyTag;
2265
2266 for (const char* name;
2267 XmlReader::getIParamValueTag(parser, name, emptyTag); )
2268 {
2269 kumpf 1.104 if (System::strcasecmp(name, "InstanceName") == 0)
2270 {
2271 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2272 XmlReader::getInstanceNameElement(parser, instanceName);
2273 duplicateParameter = gotInstanceName;
2274 gotInstanceName = true;
2275 }
2276 else
2277 {
2278 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
2279 }
2280
2281 if (!emptyTag)
2282 {
2283 XmlReader::expectEndTag(parser, "IPARAMVALUE");
2284 }
2285
2286 if (duplicateParameter)
2287 {
2288 throw PEGASUS_CIM_EXCEPTION(
2289 CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2290 kumpf 1.104 }
2291 }
2292
2293 if (!gotInstanceName)
2294 {
2295 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2296 }
2297
2298 AutoPtr<CIMDeleteInstanceRequestMessage> request(
2299 new CIMDeleteInstanceRequestMessage(
2300 messageId,
2301 nameSpace,
2302 instanceName,
2303 QueueIdStack(queueId, _returnQueueId)));
2304
2305 STAT_SERVERSTART
2306
2307 return request.release();
2308 }
2309
2310 CIMSetQualifierRequestMessage*
2311 kumpf 1.104 CIMOperationRequestDecoder::decodeSetQualifierRequest(
2312 Uint32 queueId,
2313 XmlParser& parser,
2314 const String& messageId,
2315 const CIMNamespaceName& nameSpace)
2316 {
2317 STAT_GETSTARTTIME
2318
2319 CIMQualifierDecl qualifierDeclaration;
2320 Boolean duplicateParameter = false;
2321 Boolean gotQualifierDeclaration = false;
2322 Boolean emptyTag;
2323
2324 for (const char* name;
2325 XmlReader::getIParamValueTag(parser, name, emptyTag); )
2326 {
2327 if (System::strcasecmp(name, "QualifierDeclaration") == 0)
2328 {
2329 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2330 XmlReader::getQualifierDeclElement(parser, qualifierDeclaration);
2331 duplicateParameter = gotQualifierDeclaration;
2332 kumpf 1.104 gotQualifierDeclaration = true;
2333 }
2334 else
2335 {
2336 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
2337 }
2338
2339 if (!emptyTag)
2340 {
2341 XmlReader::expectEndTag(parser, "IPARAMVALUE");
2342 }
2343
2344 if (duplicateParameter)
2345 {
2346 throw PEGASUS_CIM_EXCEPTION(
2347 CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2348 }
2349 }
2350
2351 if (!gotQualifierDeclaration)
2352 {
2353 kumpf 1.104 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2354 }
2355
2356 AutoPtr<CIMSetQualifierRequestMessage> request(
2357 new CIMSetQualifierRequestMessage(
2358 messageId,
2359 nameSpace,
2360 qualifierDeclaration,
2361 QueueIdStack(queueId, _returnQueueId)));
2362
2363 STAT_SERVERSTART
2364
2365 return request.release();
2366 }
2367
2368 CIMGetQualifierRequestMessage*
2369 CIMOperationRequestDecoder::decodeGetQualifierRequest(
2370 Uint32 queueId,
2371 XmlParser& parser,
2372 const String& messageId,
2373 const CIMNamespaceName& nameSpace)
2374 kumpf 1.104 {
2375 STAT_GETSTARTTIME
2376
2377 String qualifierNameString;
2378 CIMName qualifierName;
2379 Boolean duplicateParameter = false;
2380 Boolean gotQualifierName = false;
2381 Boolean emptyTag;
2382
2383 for (const char* name;
2384 XmlReader::getIParamValueTag(parser, name, emptyTag); )
2385 {
2386 if (System::strcasecmp(name, "QualifierName") == 0)
2387 {
2388 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2389 XmlReader::getStringValueElement(parser, qualifierNameString, true);
2390 qualifierName = qualifierNameString;
2391 duplicateParameter = gotQualifierName;
2392 gotQualifierName = true;
2393 }
2394 else
2395 kumpf 1.104 {
2396 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
2397 }
2398
2399 if (!emptyTag)
2400 {
2401 XmlReader::expectEndTag(parser, "IPARAMVALUE");
2402 }
2403
2404 if (duplicateParameter)
2405 {
2406 throw PEGASUS_CIM_EXCEPTION(
2407 CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2408 }
2409 }
2410
2411 if (!gotQualifierName)
2412 {
2413 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2414 }
2415
2416 kumpf 1.104 AutoPtr<CIMGetQualifierRequestMessage> request(
2417 new CIMGetQualifierRequestMessage(
2418 messageId,
2419 nameSpace,
2420 qualifierName,
2421 QueueIdStack(queueId, _returnQueueId)));
2422
2423 STAT_SERVERSTART
2424
2425 return request.release();
2426 }
2427
2428 CIMEnumerateQualifiersRequestMessage*
2429 CIMOperationRequestDecoder::decodeEnumerateQualifiersRequest(
2430 Uint32 queueId,
2431 XmlParser& parser,
2432 const String& messageId,
2433 const CIMNamespaceName& nameSpace)
2434 {
2435 STAT_GETSTARTTIME
2436 Boolean emptyTag;
2437 kumpf 1.104
2438 for (const char* name;
2439 XmlReader::getIParamValueTag(parser, name, emptyTag); )
2440 {
2441 // No IPARAMVALUEs are defined for this operation
2442 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
2443 }
2444
2445 AutoPtr<CIMEnumerateQualifiersRequestMessage> request(
2446 new CIMEnumerateQualifiersRequestMessage(
2447 messageId,
2448 nameSpace,
2449 QueueIdStack(queueId, _returnQueueId)));
2450
2451 STAT_SERVERSTART
2452
2453 return request.release();
2454 }
2455
2456 CIMDeleteQualifierRequestMessage*
2457 CIMOperationRequestDecoder::decodeDeleteQualifierRequest(
2458 kumpf 1.104 Uint32 queueId,
2459 XmlParser& parser,
2460 const String& messageId,
2461 const CIMNamespaceName& nameSpace)
2462 {
2463 STAT_GETSTARTTIME
2464
2465 String qualifierNameString;
2466 CIMName qualifierName;
2467 Boolean duplicateParameter = false;
2468 Boolean gotQualifierName = false;
2469 Boolean emptyTag;
2470
2471 for (const char* name;
2472 XmlReader::getIParamValueTag(parser, name, emptyTag); )
2473 {
2474 if (System::strcasecmp(name, "QualifierName") == 0)
2475 {
2476 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2477 XmlReader::getStringValueElement(parser, qualifierNameString, true);
2478 qualifierName = qualifierNameString;
2479 kumpf 1.104 duplicateParameter = gotQualifierName;
2480 gotQualifierName = true;
2481 }
2482 else
2483 {
2484 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
2485 }
2486
2487 if (!emptyTag)
2488 {
2489 XmlReader::expectEndTag(parser, "IPARAMVALUE");
2490 }
2491
2492 if (duplicateParameter)
2493 {
2494 throw PEGASUS_CIM_EXCEPTION(
2495 CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2496 }
2497 }
2498
2499 if (!gotQualifierName)
2500 kumpf 1.104 {
2501 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2502 }
2503
2504 AutoPtr<CIMDeleteQualifierRequestMessage> request(
2505 new CIMDeleteQualifierRequestMessage(
2506 messageId,
2507 nameSpace,
2508 qualifierName,
2509 QueueIdStack(queueId, _returnQueueId)));
2510
2511 STAT_SERVERSTART
2512
2513 return request.release();
2514 }
2515
2516 CIMReferenceNamesRequestMessage*
2517 CIMOperationRequestDecoder::decodeReferenceNamesRequest(
2518 Uint32 queueId,
2519 XmlParser& parser,
2520 const String& messageId,
2521 kumpf 1.104 const CIMNamespaceName& nameSpace)
2522 {
2523 STAT_GETSTARTTIME
2524
2525 CIMObjectPath objectName;
2526 CIMName resultClass;
2527 String role;
2528 Boolean duplicateParameter = false;
2529 Boolean gotObjectName = false;
2530 Boolean gotResultClass = false;
2531 Boolean gotRole = false;
2532 Boolean emptyTag;
2533
2534 for (const char* name;
2535 XmlReader::getIParamValueTag(parser, name, emptyTag); )
2536 {
2537 if (System::strcasecmp(name, "ObjectName") == 0)
2538 {
2539 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2540 XmlReader::getObjectNameElement(parser, objectName);
2541 duplicateParameter = gotObjectName;
2542 kumpf 1.104 gotObjectName = true;
2543 }
2544 else if (System::strcasecmp(name, "ResultClass") == 0)
2545 {
2546 //
2547 // ResultClass may be NULL
2548 //
2549 if (!emptyTag)
2550 {
2551 XmlReader::getClassNameElement(parser, resultClass, false);
2552 }
2553 duplicateParameter = gotResultClass;
2554 gotResultClass = true;
2555 }
2556 else if (System::strcasecmp(name, "Role") == 0)
2557 {
2558 //
2559 // Role may be NULL
2560 //
2561 if (!emptyTag)
2562 {
2563 kumpf 1.104 XmlReader::getStringValueElement(parser, role, false);
2564 }
2565 duplicateParameter = gotRole;
2566 gotRole = true;
2567 }
2568 else
2569 {
2570 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
2571 }
2572
2573 if (!emptyTag)
2574 {
2575 XmlReader::expectEndTag(parser, "IPARAMVALUE");
2576 }
2577
2578 if (duplicateParameter)
2579 {
2580 throw PEGASUS_CIM_EXCEPTION(
2581 CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2582 }
2583 }
2584 kumpf 1.104
2585 if (!gotObjectName)
2586 {
2587 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2588 }
2589
2590 AutoPtr<CIMReferenceNamesRequestMessage> request(
2591 new CIMReferenceNamesRequestMessage(
2592 messageId,
2593 nameSpace,
2594 objectName,
2595 resultClass,
2596 role,
2597 QueueIdStack(queueId, _returnQueueId)));
2598
2599 STAT_SERVERSTART
2600
2601 return request.release();
2602 }
2603
2604 CIMReferencesRequestMessage*
2605 kumpf 1.104 CIMOperationRequestDecoder::decodeReferencesRequest(
2606 Uint32 queueId,
2607 XmlParser& parser,
2608 const String& messageId,
2609 const CIMNamespaceName& nameSpace)
2610 {
2611 STAT_GETSTARTTIME
2612
2613 CIMObjectPath objectName;
2614 CIMName resultClass;
2615 String role;
2616 Boolean includeQualifiers = false;
2617 Boolean includeClassOrigin = false;
2618 CIMPropertyList propertyList;
2619 Boolean duplicateParameter = false;
2620 Boolean gotObjectName = false;
2621 Boolean gotResultClass = false;
2622 Boolean gotRole = false;
2623 Boolean gotIncludeQualifiers = false;
2624 Boolean gotIncludeClassOrigin = false;
2625 Boolean gotPropertyList = false;
2626 kumpf 1.104 Boolean emptyTag;
2627
2628 for (const char* name;
2629 XmlReader::getIParamValueTag(parser, name, emptyTag); )
2630 {
2631 if (System::strcasecmp(name, "ObjectName") == 0)
2632 {
2633 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2634 XmlReader::getObjectNameElement(parser, objectName);
2635 duplicateParameter = gotObjectName;
2636 gotObjectName = true;
2637 }
2638 else if (System::strcasecmp(name, "ResultClass") == 0)
2639 {
2640 //
2641 // ResultClass may be NULL
2642 //
2643 if (!emptyTag)
2644 {
2645 XmlReader::getClassNameElement(parser, resultClass, false);
2646 }
2647 kumpf 1.104 duplicateParameter = gotResultClass;
2648 gotResultClass = true;
2649 }
2650 else if (System::strcasecmp(name, "Role") == 0)
2651 {
2652 //
2653 // Role may be NULL
2654 //
2655 if (!emptyTag)
2656 {
2657 XmlReader::getStringValueElement(parser, role, false);
2658 }
2659 duplicateParameter = gotRole;
2660 gotRole = true;
2661 }
2662 else if (System::strcasecmp(name, "IncludeQualifiers") == 0)
2663 {
2664 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2665 XmlReader::getBooleanValueElement(parser, includeQualifiers, true);
2666 duplicateParameter = gotIncludeQualifiers;
2667 gotIncludeQualifiers = true;
2668 kumpf 1.104 }
2669 else if (System::strcasecmp(name, "IncludeClassOrigin") == 0)
2670 {
2671 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2672 XmlReader::getBooleanValueElement(parser, includeClassOrigin, true);
2673 duplicateParameter = gotIncludeClassOrigin;
2674 gotIncludeClassOrigin = true;
2675 }
2676 else if (System::strcasecmp(name, "PropertyList") == 0)
2677 {
2678 if (!emptyTag)
2679 {
2680 CIMValue pl;
2681 if (XmlReader::getValueArrayElement(parser, CIMTYPE_STRING, pl))
2682 {
2683 Array<String> propertyListArray;
2684 pl.get(propertyListArray);
2685 Array<CIMName> cimNameArray;
2686 for (Uint32 i = 0; i < propertyListArray.size(); i++)
2687 {
2688 cimNameArray.append(propertyListArray[i]);
2689 kumpf 1.104 }
2690 propertyList.set(cimNameArray);
2691 }
2692 }
2693 duplicateParameter = gotPropertyList;
2694 gotPropertyList = true;
2695 }
2696 else
2697 {
2698 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
2699 }
2700
2701 if (!emptyTag)
2702 {
2703 XmlReader::expectEndTag(parser, "IPARAMVALUE");
2704 }
2705
2706 if (duplicateParameter)
2707 {
2708 throw PEGASUS_CIM_EXCEPTION(
2709 CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2710 kumpf 1.104 }
2711 }
2712
2713 if (!gotObjectName)
2714 {
2715 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2716 }
2717
2718 AutoPtr<CIMReferencesRequestMessage> request(
2719 new CIMReferencesRequestMessage(
2720 messageId,
2721 nameSpace,
2722 objectName,
2723 resultClass,
2724 role,
2725 includeQualifiers,
2726 includeClassOrigin,
2727 propertyList,
2728 QueueIdStack(queueId, _returnQueueId)));
2729
2730 STAT_SERVERSTART
2731 kumpf 1.104
2732 return request.release();
2733 }
2734
2735 CIMAssociatorNamesRequestMessage*
2736 CIMOperationRequestDecoder::decodeAssociatorNamesRequest(
2737 Uint32 queueId,
2738 XmlParser& parser,
2739 const String& messageId,
2740 const CIMNamespaceName& nameSpace)
2741 {
2742 STAT_GETSTARTTIME
2743
2744 CIMObjectPath objectName;
2745 CIMName assocClass;
2746 CIMName resultClass;
2747 String role;
2748 String resultRole;
2749 Boolean duplicateParameter = false;
2750 Boolean gotObjectName = false;
2751 Boolean gotAssocClass = false;
2752 kumpf 1.104 Boolean gotResultClass = false;
2753 Boolean gotRole = false;
2754 Boolean gotResultRole = false;
2755 Boolean emptyTag;
2756
2757 for (const char* name;
2758 XmlReader::getIParamValueTag(parser, name, emptyTag); )
2759 {
2760 if (System::strcasecmp(name, "ObjectName") == 0)
2761 {
2762 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2763 XmlReader::getObjectNameElement(parser, objectName);
2764 duplicateParameter = gotObjectName;
2765 gotObjectName = true;
2766 }
2767 else if (System::strcasecmp(name, "AssocClass") == 0)
2768 {
2769 //
2770 // AssocClass may be NULL
2771 //
2772 if (!emptyTag)
2773 kumpf 1.104 {
2774 XmlReader::getClassNameElement(parser, assocClass, false);
2775 }
2776 duplicateParameter = gotAssocClass;
2777 gotAssocClass = true;
2778 }
2779 else if (System::strcasecmp(name, "ResultClass") == 0)
2780 {
2781 //
2782 // ResultClass may be NULL
2783 //
2784 if (!emptyTag)
2785 {
2786 XmlReader::getClassNameElement(parser, resultClass, false);
2787 }
2788 duplicateParameter = gotResultClass;
2789 gotResultClass = true;
2790 }
2791 else if (System::strcasecmp(name, "Role") == 0)
2792 {
2793 //
2794 kumpf 1.104 // Role may be NULL
2795 //
2796 if (!emptyTag)
2797 {
2798 XmlReader::getStringValueElement(parser, role, false);
2799 }
2800 duplicateParameter = gotRole;
2801 gotRole = true;
2802 }
2803 else if (System::strcasecmp(name, "ResultRole") == 0)
2804 {
2805 //
2806 // ResultRole may be NULL
2807 //
2808 if (!emptyTag)
2809 {
2810 XmlReader::getStringValueElement(parser, resultRole, false);
2811 }
2812 duplicateParameter = gotResultRole;
2813 gotResultRole = true;
2814 }
2815 kumpf 1.104 else
2816 {
2817 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
2818 }
2819
2820 if (!emptyTag)
2821 {
2822 XmlReader::expectEndTag(parser, "IPARAMVALUE");
2823 }
2824
2825 if (duplicateParameter)
2826 {
2827 throw PEGASUS_CIM_EXCEPTION(
2828 CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2829 }
2830 }
2831
2832 if (!gotObjectName)
2833 {
2834 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2835 }
2836 kumpf 1.104
2837 AutoPtr<CIMAssociatorNamesRequestMessage> request(
2838 new CIMAssociatorNamesRequestMessage(
2839 messageId,
2840 nameSpace,
2841 objectName,
2842 assocClass,
2843 resultClass,
2844 role,
2845 resultRole,
2846 QueueIdStack(queueId, _returnQueueId)));
2847
2848 STAT_SERVERSTART
2849
2850 return request.release();
2851 }
2852
2853 CIMAssociatorsRequestMessage*
2854 CIMOperationRequestDecoder::decodeAssociatorsRequest(
2855 Uint32 queueId,
2856 XmlParser& parser,
2857 kumpf 1.104 const String& messageId,
2858 const CIMNamespaceName& nameSpace)
2859 {
2860 STAT_GETSTARTTIME
2861
2862 CIMObjectPath objectName;
2863 CIMName assocClass;
2864 CIMName resultClass;
2865 String role;
2866 String resultRole;
2867 Boolean includeQualifiers = false;
2868 Boolean includeClassOrigin = false;
2869 CIMPropertyList propertyList;
2870 Boolean duplicateParameter = false;
2871 Boolean gotObjectName = false;
2872 Boolean gotAssocClass = false;
2873 Boolean gotResultClass = false;
2874 Boolean gotRole = false;
2875 Boolean gotResultRole = false;
2876 Boolean gotIncludeQualifiers = false;
2877 Boolean gotIncludeClassOrigin = false;
2878 kumpf 1.104 Boolean gotPropertyList = false;
2879 Boolean emptyTag;
2880
2881 for (const char* name;
2882 XmlReader::getIParamValueTag(parser, name, emptyTag); )
2883 {
2884 if (System::strcasecmp(name, "ObjectName") == 0)
2885 {
2886 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2887 XmlReader::getObjectNameElement(parser, objectName);
2888 duplicateParameter = gotObjectName;
2889 gotObjectName = true;
2890 }
2891 else if (System::strcasecmp(name, "AssocClass") == 0)
2892 {
2893 //
2894 // AssocClass may be NULL
2895 //
2896 if (!emptyTag)
2897 {
2898 XmlReader::getClassNameElement(parser, assocClass, false);
2899 kumpf 1.104 }
2900 duplicateParameter = gotAssocClass;
2901 gotAssocClass = true;
2902 }
2903 else if (System::strcasecmp(name, "ResultClass") == 0)
2904 {
2905 //
2906 // ResultClass may be NULL
2907 //
2908 if (!emptyTag)
2909 {
2910 XmlReader::getClassNameElement(parser, resultClass, false);
2911 }
2912 duplicateParameter = gotResultClass;
2913 gotResultClass = true;
2914 }
2915 else if (System::strcasecmp(name, "Role") == 0)
2916 {
2917 //
2918 // Role may be NULL
2919 //
2920 kumpf 1.104 if (!emptyTag)
2921 {
2922 XmlReader::getStringValueElement(parser, role, false);
2923 }
2924 duplicateParameter = gotRole;
2925 gotRole = true;
2926 }
2927 else if (System::strcasecmp(name, "ResultRole") == 0)
2928 {
2929 //
2930 // ResultRole may be NULL
2931 //
2932 if (!emptyTag)
2933 {
2934 XmlReader::getStringValueElement(parser, resultRole, false);
2935 }
2936 duplicateParameter = gotResultRole;
2937 gotResultRole = true;
2938 }
2939 else if (System::strcasecmp(name, "IncludeQualifiers") == 0)
2940 {
2941 kumpf 1.104 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2942 XmlReader::getBooleanValueElement(parser, includeQualifiers, true);
2943 duplicateParameter = gotIncludeQualifiers;
2944 gotIncludeQualifiers = true;
2945 }
2946 else if (System::strcasecmp(name, "IncludeClassOrigin") == 0)
2947 {
2948 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2949 XmlReader::getBooleanValueElement(parser, includeClassOrigin, true);
2950 duplicateParameter = gotIncludeClassOrigin;
2951 gotIncludeClassOrigin = true;
2952 }
2953 else if (System::strcasecmp(name, "PropertyList") == 0)
2954 {
2955 if (!emptyTag)
2956 {
2957 CIMValue pl;
2958 if (XmlReader::getValueArrayElement(parser, CIMTYPE_STRING, pl))
2959 {
2960 Array<String> propertyListArray;
2961 pl.get(propertyListArray);
2962 kumpf 1.104 Array<CIMName> cimNameArray;
2963 for (Uint32 i = 0; i < propertyListArray.size(); i++)
2964 {
2965 cimNameArray.append(propertyListArray[i]);
2966 }
2967 propertyList.set(cimNameArray);
2968 }
2969 }
2970 duplicateParameter = gotPropertyList;
2971 gotPropertyList = true;
2972 }
2973 else
2974 {
2975 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
2976 }
2977
2978 if (!emptyTag)
2979 {
2980 XmlReader::expectEndTag(parser, "IPARAMVALUE");
2981 }
2982
2983 kumpf 1.104 if (duplicateParameter)
2984 {
2985 throw PEGASUS_CIM_EXCEPTION(
2986 CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2987 }
2988 }
2989
2990 if (!gotObjectName)
2991 {
2992 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2993 }
2994
2995 AutoPtr<CIMAssociatorsRequestMessage> request(
2996 new CIMAssociatorsRequestMessage(
2997 messageId,
2998 nameSpace,
2999 objectName,
3000 assocClass,
3001 resultClass,
3002 role,
3003 resultRole,
3004 kumpf 1.104 includeQualifiers,
3005 includeClassOrigin,
3006 propertyList,
3007 QueueIdStack(queueId, _returnQueueId)));
3008
3009 STAT_SERVERSTART
3010
3011 return request.release();
3012 }
3013
3014 CIMGetPropertyRequestMessage*
3015 CIMOperationRequestDecoder::decodeGetPropertyRequest(
3016 Uint32 queueId,
3017 XmlParser& parser,
3018 const String& messageId,
3019 const CIMNamespaceName& nameSpace)
3020 {
3021 STAT_GETSTARTTIME
3022
3023 CIMObjectPath instanceName;
3024 String propertyName;
3025 kumpf 1.104 Boolean duplicateParameter = false;
3026 Boolean gotInstanceName = false;
3027 Boolean gotPropertyName = false;
3028 Boolean emptyTag;
3029
3030 for (const char* name;
3031 XmlReader::getIParamValueTag(parser, name, emptyTag); )
3032 {
3033 if (System::strcasecmp(name, "InstanceName") == 0)
3034 {
3035 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
3036 XmlReader::getInstanceNameElement(parser, instanceName);
3037 duplicateParameter = gotInstanceName;
3038 gotInstanceName = true;
3039 }
3040 else if (System::strcasecmp(name, "PropertyName") == 0)
3041 {
3042 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
3043 XmlReader::getStringValueElement(parser, propertyName, true);
3044 duplicateParameter = gotPropertyName;
3045 gotPropertyName = true;
3046 kumpf 1.104 }
3047 else
3048 {
3049 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
3050 }
3051
3052 if (!emptyTag)
3053 {
3054 XmlReader::expectEndTag(parser, "IPARAMVALUE");
3055 }
3056
3057 if (duplicateParameter)
3058 {
3059 throw PEGASUS_CIM_EXCEPTION(
3060 CIM_ERR_INVALID_PARAMETER, String::EMPTY);
3061 }
3062 }
3063
3064 if (!gotInstanceName || !gotPropertyName)
3065 {
3066 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, String::EMPTY);
3067 kumpf 1.104 }
3068
3069 AutoPtr<CIMGetPropertyRequestMessage> request(
3070 new CIMGetPropertyRequestMessage(
3071 messageId,
3072 nameSpace,
3073 instanceName,
3074 propertyName,
3075 QueueIdStack(queueId, _returnQueueId)));
3076
3077 STAT_SERVERSTART
3078
3079 return request.release();
3080 }
3081
3082 CIMSetPropertyRequestMessage*
3083 CIMOperationRequestDecoder::decodeSetPropertyRequest(
3084 Uint32 queueId,
3085 XmlParser& parser,
3086 const String& messageId,
3087 const CIMNamespaceName& nameSpace)
3088 kumpf 1.104 {
3089 STAT_GETSTARTTIME
3090
3091 CIMObjectPath instanceName;
3092 String propertyName;
3093 CIMValue propertyValue;
3094 Boolean duplicateParameter = false;
3095 Boolean gotInstanceName = false;
3096 Boolean gotPropertyName = false;
3097 Boolean gotNewValue = false;
3098 Boolean emptyTag;
3099
3100 for (const char* name;
3101 XmlReader::getIParamValueTag(parser, name, emptyTag); )
3102 {
3103 if (System::strcasecmp(name, "InstanceName") == 0)
3104 {
3105 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
3106 XmlReader::getInstanceNameElement(parser, instanceName);
3107 duplicateParameter = gotInstanceName;
3108 gotInstanceName = true;
3109 kumpf 1.104 }
3110 else if (System::strcasecmp(name, "PropertyName") == 0)
3111 {
3112 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
3113 XmlReader::getStringValueElement(parser, propertyName, true);
3114 duplicateParameter = gotPropertyName;
3115 gotPropertyName = true;
3116 }
3117 else if (System::strcasecmp(name, "NewValue") == 0)
3118 {
3119 if (emptyTag || !XmlReader::getPropertyValue(parser, propertyValue))
3120 {
3121 propertyValue.setNullValue(CIMTYPE_STRING, false);
3122 }
3123 duplicateParameter = gotNewValue;
3124 gotNewValue = true;
3125 }
3126 else
3127 {
3128 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
3129 }
3130 kumpf 1.104
3131 if (!emptyTag)
3132 {
3133 XmlReader::expectEndTag(parser, "IPARAMVALUE");
3134 }
3135
3136 if (duplicateParameter)
3137 {
3138 throw PEGASUS_CIM_EXCEPTION(
3139 CIM_ERR_INVALID_PARAMETER, String::EMPTY);
3140 }
3141 }
3142
3143 if (!gotInstanceName || !gotPropertyName)
3144 {
3145 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, String::EMPTY);
3146 }
3147
3148 AutoPtr<CIMSetPropertyRequestMessage> request(
3149 new CIMSetPropertyRequestMessage(
3150 messageId,
3151 kumpf 1.104 nameSpace,
3152 instanceName,
3153 propertyName,
3154 propertyValue,
3155 QueueIdStack(queueId, _returnQueueId)));
|
3156 kumpf 1.29
|
3157 kumpf 1.104 STAT_SERVERSTART
|
3158 sage 1.41
|
3159 kumpf 1.104 return request.release();
|
3160 kumpf 1.29 }
3161
3162 CIMExecQueryRequestMessage* CIMOperationRequestDecoder::decodeExecQueryRequest(
|
3163 kumpf 1.104 Uint32 queueId,
3164 XmlParser& parser,
3165 const String& messageId,
3166 const CIMNamespaceName& nameSpace)
3167 {
3168 STAT_GETSTARTTIME
3169
3170 String queryLanguage;
3171 String query;
3172 Boolean duplicateParameter = false;
3173 Boolean gotQueryLanguage = false;
3174 Boolean gotQuery = false;
3175 Boolean emptyTag;
3176
3177 for (const char* name;
3178 XmlReader::getIParamValueTag(parser, name, emptyTag); )
3179 {
3180 if (System::strcasecmp(name, "QueryLanguage") == 0)
3181 {
3182 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
3183 XmlReader::getStringValueElement(parser, queryLanguage, true);
3184 kumpf 1.104 duplicateParameter = gotQueryLanguage;
3185 gotQueryLanguage = true;
3186 }
3187 else if (System::strcasecmp(name, "Query") == 0)
3188 {
3189 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
3190 XmlReader::getStringValueElement(parser, query, true);
3191 duplicateParameter = gotQuery;
3192 gotQuery = true;
3193 }
3194 else
3195 {
3196 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
3197 }
3198
3199 if (!emptyTag)
3200 {
3201 XmlReader::expectEndTag(parser, "IPARAMVALUE");
3202 }
3203
3204 if (duplicateParameter)
3205 kumpf 1.104 {
3206 throw PEGASUS_CIM_EXCEPTION(
3207 CIM_ERR_INVALID_PARAMETER, String::EMPTY);
3208 }
3209 }
3210
3211 if (!gotQueryLanguage || !gotQuery)
3212 {
3213 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, String::EMPTY);
3214 }
3215
3216 AutoPtr<CIMExecQueryRequestMessage> request(
3217 new CIMExecQueryRequestMessage(
3218 messageId,
3219 nameSpace,
3220 queryLanguage,
3221 query,
3222 QueueIdStack(queueId, _returnQueueId)));
3223
3224 STAT_SERVERSTART
3225
3226 kumpf 1.104 return request.release();
3227 }
3228
3229 CIMInvokeMethodRequestMessage*
3230 CIMOperationRequestDecoder::decodeInvokeMethodRequest(
3231 Uint32 queueId,
3232 XmlParser& parser,
3233 const String& messageId,
3234 const CIMObjectPath& reference,
3235 const String& cimMethodName)
3236 {
3237 STAT_GETSTARTTIME
3238
3239 CIMParamValue paramValue;
3240 Array<CIMParamValue> inParameters;
3241
3242 while (XmlReader::getParamValueElement(parser, paramValue))
3243 {
3244 inParameters.append(paramValue);
3245 }
3246
3247 kumpf 1.104 AutoPtr<CIMInvokeMethodRequestMessage> request(
3248 new CIMInvokeMethodRequestMessage(
3249 messageId,
3250 reference.getNameSpace(),
3251 reference,
3252 cimMethodName,
3253 inParameters,
3254 QueueIdStack(queueId, _returnQueueId)));
|
3255 kumpf 1.9
|
3256 kumpf 1.104 STAT_SERVERSTART
|
3257 mike 1.2
|
3258 kumpf 1.104 return request.release();
|
3259 mike 1.2 }
3260
3261 void CIMOperationRequestDecoder::setServerTerminating(Boolean flag)
3262 {
|
3263 kumpf 1.104 _serverTerminating = flag;
|
3264 mike 1.2 }
3265
3266 PEGASUS_NAMESPACE_END
|