1 martin 1.121 //%LICENSE////////////////////////////////////////////////////////////////
|
2 martin 1.122 //
|
3 martin 1.121 // Licensed to The Open Group (TOG) under one or more contributor license
4 // agreements. Refer to the OpenPegasusNOTICE.txt file distributed with
5 // this work for additional information regarding copyright ownership.
6 // Each contributor licenses this file to you under the OpenPegasus Open
7 // Source License; you may not use this file except in compliance with the
8 // License.
|
9 martin 1.122 //
|
10 martin 1.121 // Permission is hereby granted, free of charge, to any person obtaining a
11 // copy of this software and associated documentation files (the "Software"),
12 // to deal in the Software without restriction, including without limitation
13 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
14 // and/or sell copies of the Software, and to permit persons to whom the
15 // Software is furnished to do so, subject to the following conditions:
|
16 martin 1.122 //
|
17 martin 1.121 // The above copyright notice and this permission notice shall be included
18 // in all copies or substantial portions of the Software.
|
19 martin 1.122 //
|
20 martin 1.121 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
21 martin 1.122 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
22 martin 1.121 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
23 // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
24 // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
25 // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
26 // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
27 martin 1.122 //
|
28 martin 1.121 //////////////////////////////////////////////////////////////////////////
|
29 mike 1.2 //
30 //%/////////////////////////////////////////////////////////////////////////////
31
32 #include <Pegasus/Common/Config.h>
|
33 kumpf 1.28 #include <Pegasus/Common/Constants.h>
|
34 mike 1.2 #include <cctype>
35 #include <cstdio>
36 #include <Pegasus/Common/XmlParser.h>
37 #include <Pegasus/Common/XmlReader.h>
38 #include <Pegasus/Common/XmlWriter.h>
39 #include <Pegasus/Common/XmlConstants.h>
|
40 kumpf 1.51 #include <Pegasus/Common/System.h>
|
41 mike 1.2 #include <Pegasus/Common/Logger.h>
42 #include <Pegasus/Common/Tracer.h>
|
43 sage 1.41 #include <Pegasus/Common/StatisticalData.h>
|
44 mike 1.2 #include "CIMOperationRequestDecoder.h"
|
45 david 1.60 #include <Pegasus/Common/CommonUTF.h>
|
46 humberto 1.59 #include <Pegasus/Common/MessageLoader.h>
|
47 mike 1.120 #include <Pegasus/Common/BinaryCodec.h>
|
48 humberto 1.59
|
49 mike 1.2 PEGASUS_USING_STD;
50
51 PEGASUS_NAMESPACE_BEGIN
52
|
53 karl 1.127.2.5 /******************************************************************************
54 **
55 ** Local Functions
|
56 karl 1.127.2.4 **
57 ******************************************************************************/
58 // KS_TODO_PULL Expand use of these two functions to all operations.
59 // Create a propertyList with the internal tags set. Used for property
60 // lists that involve instances. Tags used in output Xml Processing
61 void _createPropertyListWithTags(XmlParser& parser, CIMPropertyList& pl)
62 {
63 CIMValue val;
64 if (XmlReader::getValueArrayElement(parser, CIMTYPE_STRING, val))
65 {
66 Array<String> propertyListArray;
67 val.get(propertyListArray);
68 pl.append(propertyListArray);
69 }
70 }
71
72 // Create a PropertyList without the propertyList internal tags. Used for
73 // propertylists on class operations.
74 void _createPropertyListWithoutTags(XmlParser& parser, CIMPropertyList& pl)
75 {
76 CIMValue val;
77 karl 1.127.2.4 if (XmlReader::getValueArrayElement(parser, CIMTYPE_STRING, val))
78 {
79 Array<String> propertyListArray;
80 val.get(propertyListArray);
81 Array<CIMName> cimNameArray;
82 for (Uint32 i = 0; i < propertyListArray.size(); i++)
83 {
84 cimNameArray.append(propertyListArray[i]);
85 }
86 pl.set(cimNameArray);
87 }
88 }
89
|
90 karl 1.127.2.5 /******************************************************************************
91 **
|
92 karl 1.127.2.4 ** CIMOperationRequestDecoder Class
93 **
94 ******************************************************************************/
|
95 karl 1.127.2.5 // throw CIM_ERR_NOT_SUPPORTED with no additional text
96 void _throwCIMExceptionCIMErrNotSupported(const String& param = String::EMPTY)
97 {
98 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, param);
99 }
100
101 // Throw CIM_ERR_INVALID_PARAMETER with optional parameter name(s)
102 void _throwCIMExceptionInvalidParameter(const String& param = String::EMPTY)
103 {
104 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, param);
105 }
106
107 // Common call for all cases where duplicate IparameterValues recieved
108 // in a single operation. Throw InvalidParameter exception with optional
109 // additional data.
110 void _throwCIMExceptionDuplicateParameter(const String& name = String::EMPTY)
111 {
112 _throwCIMExceptionInvalidParameter(name);
113 }
114
115 // Common call for cases where Invalid IParameterValue names recived
116 karl 1.127.2.5 void _throwCIMExceptionInvalidIParamName(const String& param = String::EMPTY)
117 {
118 _throwCIMExceptionCIMErrNotSupported(param);
119 }
120
|
121 mike 1.2 CIMOperationRequestDecoder::CIMOperationRequestDecoder(
|
122 sahana.prabhakar 1.126 MessageQueue* outputQueue,
|
123 kumpf 1.104 Uint32 returnQueueId)
124 : Base(PEGASUS_QUEUENAME_OPREQDECODER),
|
125 mday 1.16 _outputQueue(outputQueue),
126 _returnQueueId(returnQueueId),
127 _serverTerminating(false)
|
128 mike 1.2 {
129 }
130
131 CIMOperationRequestDecoder::~CIMOperationRequestDecoder()
132 {
133 }
134
135 void CIMOperationRequestDecoder::sendResponse(
|
136 kumpf 1.104 Uint32 queueId,
137 Buffer& message,
138 Boolean closeConnect)
139 {
140 MessageQueue* queue = MessageQueue::lookup(queueId);
141
142 if (queue)
143 {
144 AutoPtr<HTTPMessage> httpMessage(new HTTPMessage(message));
145 httpMessage->setCloseConnect(closeConnect);
146 queue->enqueue(httpMessage.release());
147 }
|
148 mike 1.2 }
149
|
150 kumpf 1.18 void CIMOperationRequestDecoder::sendIMethodError(
|
151 kumpf 1.104 Uint32 queueId,
152 HttpMethod httpMethod,
153 const String& messageId,
154 const String& iMethodName,
155 const CIMException& cimException,
156 Boolean closeConnect)
|
157 mday 1.16 {
|
158 mike 1.96 Buffer message;
|
159 kumpf 1.19 message = XmlWriter::formatSimpleIMethodErrorRspMessage(
160 iMethodName,
161 messageId,
|
162 kumpf 1.53 httpMethod,
|
163 kumpf 1.35 cimException);
|
164 kumpf 1.18
|
165 j.alex 1.95 sendResponse(queueId, message,closeConnect);
|
166 kumpf 1.18 }
|
167 mday 1.16
|
168 kumpf 1.18 void CIMOperationRequestDecoder::sendMethodError(
|
169 kumpf 1.104 Uint32 queueId,
170 HttpMethod httpMethod,
171 const String& messageId,
172 const String& methodName,
173 const CIMException& cimException,
174 Boolean closeConnect)
|
175 kumpf 1.18 {
|
176 mike 1.96 Buffer message;
|
177 kumpf 1.19 message = XmlWriter::formatSimpleMethodErrorRspMessage(
178 methodName,
179 messageId,
|
180 kumpf 1.53 httpMethod,
|
181 kumpf 1.35 cimException);
|
182 chip 1.92
|
183 j.alex 1.95 sendResponse(queueId, message,closeConnect);
|
184 mike 1.2 }
185
|
186 kumpf 1.33 void CIMOperationRequestDecoder::sendHttpError(
|
187 kumpf 1.104 Uint32 queueId,
188 const String& status,
189 const String& cimError,
190 const String& pegasusError,
191 Boolean closeConnect)
|
192 kumpf 1.21 {
|
193 mike 1.96 Buffer message;
|
194 kumpf 1.33 message = XmlWriter::formatHttpErrorRspMessage(
195 status,
196 cimError,
|
197 kumpf 1.37 pegasusError);
|
198 chip 1.92
|
199 j.alex 1.95 sendResponse(queueId, message,closeConnect);
|
200 kumpf 1.26 }
201
|
202 kumpf 1.104 void CIMOperationRequestDecoder::handleEnqueue(Message* message)
|
203 mike 1.2 {
|
204 kumpf 1.104 if (!message)
205 return;
|
206 mike 1.2
|
207 kumpf 1.104 switch (message->getType())
208 {
209 case HTTP_MESSAGE:
210 handleHTTPMessage((HTTPMessage*)message);
211 break;
|
212 kumpf 1.112
213 default:
214 // Unexpected message type
|
215 karl 1.127.2.5 PEGASUS_UNREACHABLE(PEGASUS_ASSERT(0);)
|
216 kumpf 1.112 break;
|
217 kumpf 1.104 }
|
218 mday 1.16
|
219 kumpf 1.104 delete message;
|
220 mday 1.16 }
|
221 mike 1.2
222
|
223 mday 1.16 void CIMOperationRequestDecoder::handleEnqueue()
224 {
|
225 kumpf 1.104 Message* message = dequeue();
226 if (message)
227 handleEnqueue(message);
|
228 mike 1.2 }
229
230 //------------------------------------------------------------------------------
231 //
232 // From the HTTP/1.1 Specification (RFC 2626):
233 //
|
234 chip 1.92 // Both types of message consist of a start-line, zero or more header fields
235 // (also known as "headers"), an empty line (i.e., a line with nothing
236 // preceding the CRLF) indicating the end of the header fields, and possibly
|
237 mike 1.2 // a message-body.
238 //
239 // Example CIM request:
240 //
|
241 chip 1.92 // M-POST /cimom HTTP/1.1
242 // HOST: www.erewhon.com
|
243 karl 1.127.2.2 // Content-Type: application/xml; charset=utf-8
|
244 chip 1.92 // Content-Length: xxxx
245 // Man: http://www.dmtf.org/cim/operation ; ns=73
246 // 73-CIMOperation: MethodCall
247 // 73-CIMMethod: EnumerateInstances
248 // 73-CIMObject: root/cimv2
249 //
|
250 mike 1.2 //------------------------------------------------------------------------------
251
252 void CIMOperationRequestDecoder::handleHTTPMessage(HTTPMessage* httpMessage)
253 {
|
254 kumpf 1.104 PEG_METHOD_ENTER(TRC_DISPATCHER,
255 "CIMOperationRequestDecoder::handleHTTPMessage()");
|
256 kumpf 1.20
|
257 kumpf 1.104 // Set the Accept-Language into the thread for this service.
258 // This will allow all code in this thread to get
259 // the languages for the messages returned to the client.
|
260 kumpf 1.114 Thread::setLanguages(httpMessage->acceptLanguages);
|
261 kumpf 1.104
262 // Save queueId:
263
264 Uint32 queueId = httpMessage->queueId;
265
266 // Save userName and authType:
267
268 String userName;
269 String authType;
270 Boolean closeConnect = httpMessage->getCloseConnect();
271
272 PEG_TRACE((
273 TRC_HTTP,
|
274 marek 1.118 Tracer::LEVEL4,
|
275 kumpf 1.104 "CIMOperationRequestDecoder::handleHTTPMessage()- "
276 "httpMessage->getCloseConnect() returned %d",
277 closeConnect));
278
|
279 sushma.fernandes 1.109 userName = httpMessage->authInfo->getAuthenticatedUser();
280 authType = httpMessage->authInfo->getAuthType();
|
281 kumpf 1.104
282 // Parse the HTTP message:
283
284 String startLine;
285 Array<HTTPHeader> headers;
286 char* content;
287 Uint32 contentLength;
288
289 httpMessage->parse(startLine, headers, contentLength);
290
291 // Parse the request line:
292
293 String methodName;
294 String requestUri;
295 String httpVersion;
296 HttpMethod httpMethod = HTTP_METHOD__POST;
297
298 HTTPMessage::parseRequestLine(
299 startLine, methodName, requestUri, httpVersion);
300
301 //
302 kumpf 1.104 // Set HTTP method for the request
303 //
304 if (methodName == "M-POST")
305 {
306 httpMethod = HTTP_METHOD_M_POST;
307 }
308
309 // Unsupported methods are caught in the HTTPAuthenticatorDelegator
310 PEGASUS_ASSERT(methodName == "M-POST" || methodName == "POST");
311
312 //
313 // Mismatch of method and version is caught in HTTPAuthenticatorDelegator
314 //
315 PEGASUS_ASSERT(!((httpMethod == HTTP_METHOD_M_POST) &&
316 (httpVersion == "HTTP/1.0")));
|
317 humberto 1.80
|
318 kumpf 1.104 // Process M-POST and POST messages:
|
319 humberto 1.80
|
320 kumpf 1.104 if (httpVersion == "HTTP/1.1")
321 {
322 // Validate the presence of a "Host" header. The HTTP/1.1 specification
323 // says this in section 14.23 regarding the Host header field:
324 //
325 // All Internet-based HTTP/1.1 servers MUST respond with a 400 (Bad
326 // Request) status code to any HTTP/1.1 request message which lacks
327 // a Host header field.
328 //
329 // Note: The Host header value is not validated.
330
|
331 kumpf 1.124 const char* hostHeader;
|
332 kumpf 1.104 Boolean hostHeaderFound = HTTPMessage::lookupHeader(
333 headers, "Host", hostHeader, false);
|
334 mike 1.2
|
335 kumpf 1.104 if (!hostHeaderFound)
336 {
337 MessageLoaderParms parms(
338 "Server.CIMOperationRequestDecoder.MISSING_HOST_HEADER",
339 "HTTP request message lacks a Host header field.");
340 sendHttpError(
341 queueId,
342 HTTP_STATUS_BADREQUEST,
343 "",
344 MessageLoader::getMessage(parms),
345 closeConnect);
346 PEG_METHOD_EXIT();
347 return;
348 }
349 }
|
350 mike 1.2
|
351 kumpf 1.104 // Validate the "CIMOperation" header:
|
352 mike 1.2
|
353 kumpf 1.124 const char* cimOperation;
|
354 karl 1.127.2.5
|
355 kumpf 1.104 // If the CIMOperation header was missing, the HTTPAuthenticatorDelegator
356 // would not have passed the message to us.
|
357 karl 1.127.2.5 PEGASUS_FCT_EXECUTE_AND_ASSERT(
358 true,
359 HTTPMessage::lookupHeader(headers, "CIMOperation", cimOperation, true));
|
360 kumpf 1.104
|
361 kumpf 1.124 if (System::strcasecmp(cimOperation, "MethodCall") != 0)
|
362 kumpf 1.104 {
363 // The Specification for CIM Operations over HTTP reads:
364 // 3.3.4. CIMOperation
365 // If a CIM Server receives CIM Operation request with this
366 // [CIMOperation] header, but with a missing value or a value
367 // that is not "MethodCall", then it MUST fail the request with
368 // status "400 Bad Request". The CIM Server MUST include a
369 // CIMError header in the response with a value of
370 // unsupported-operation.
371 MessageLoaderParms parms(
372 "Server.CIMOperationRequestDecoder."
373 "CIMOPERATION_VALUE_NOT_SUPPORTED",
374 "CIMOperation value \"$0\" is not supported.",cimOperation);
375 sendHttpError(
376 queueId,
377 HTTP_STATUS_BADREQUEST,
378 "unsupported-operation",
379 MessageLoader::getMessage(parms),
380 closeConnect);
381 PEG_METHOD_EXIT();
382 return;
383 kumpf 1.104 }
384
385 // Validate the "CIMBatch" header:
386
|
387 kumpf 1.124 const char* cimBatch;
388 if (HTTPMessage::lookupHeader(headers, "CIMBatch", cimBatch, true))
|
389 kumpf 1.104 {
390 // The Specification for CIM Operations over HTTP reads:
391 // 3.3.9. CIMBatch
392 // If a CIM Server receives CIM Operation Request for which the
393 // CIMBatch header is present, but the Server does not support
394 // Multiple Operations, then it MUST fail the request and
395 // return a status of "501 Not Implemented".
396 sendHttpError(
397 queueId,
398 HTTP_STATUS_NOTIMPLEMENTED,
399 "multiple-requests-unsupported",
400 String::EMPTY,
401 closeConnect);
402 PEG_METHOD_EXIT();
403 return;
404 }
405
406 // Save these headers for later checking
407
|
408 kumpf 1.124 const char* cimProtocolVersion;
|
409 kumpf 1.104 if (!HTTPMessage::lookupHeader(
410 headers, "CIMProtocolVersion", cimProtocolVersion, true))
411 {
412 // Mandated by the Specification for CIM Operations over HTTP
|
413 kumpf 1.124 cimProtocolVersion = "1.0";
|
414 kumpf 1.104 }
415
|
416 kumpf 1.124 String cimMethod;
|
417 kumpf 1.104 if (HTTPMessage::lookupHeader(headers, "CIMMethod", cimMethod, true))
418 {
419 if (cimMethod == String::EMPTY)
420 {
421 // This is not a valid value, and we use EMPTY to mean "absent"
422 MessageLoaderParms parms(
423 "Server.CIMOperationRequestDecoder.EMPTY_CIMMETHOD_VALUE",
424 "Empty CIMMethod value.");
425 sendHttpError(
426 queueId,
427 HTTP_STATUS_BADREQUEST,
428 "header-mismatch",
429 MessageLoader::getMessage(parms),
430 closeConnect);
431 PEG_METHOD_EXIT();
432 return;
433 }
|
434 mike 1.98
|
435 kumpf 1.104 try
436 {
437 cimMethod = XmlReader::decodeURICharacters(cimMethod);
438 }
439 catch (const ParseError&)
440 {
441 // The CIMMethod header value could not be decoded
442 MessageLoaderParms parms(
443 "Server.CIMOperationRequestDecoder."
444 "CIMMETHOD_VALUE_SYNTAX_ERROR",
445 "CIMMethod value syntax error.");
446 sendHttpError(
447 queueId,
448 HTTP_STATUS_BADREQUEST,
449 "header-mismatch",
450 MessageLoader::getMessage(parms),
451 closeConnect);
452 PEG_METHOD_EXIT();
453 return;
454 }
455 }
|
456 mike 1.2
|
457 kumpf 1.124 String cimObject;
|
458 kumpf 1.104 if (HTTPMessage::lookupHeader(headers, "CIMObject", cimObject, true))
459 {
460 if (cimObject == String::EMPTY)
461 {
462 // This is not a valid value, and we use EMPTY to mean "absent"
463 MessageLoaderParms parms(
464 "Server.CIMOperationRequestDecoder.EMPTY_CIMOBJECT_VALUE",
465 "Empty CIMObject value.");
466 sendHttpError(
467 queueId,
468 HTTP_STATUS_BADREQUEST,
469 "header-mismatch",
470 MessageLoader::getMessage(parms),
471 closeConnect);
472 PEG_METHOD_EXIT();
473 return;
474 }
|
475 mike 1.2
|
476 kumpf 1.104 try
477 {
478 cimObject = XmlReader::decodeURICharacters(cimObject);
479 }
480 catch (const ParseError&)
481 {
482 // The CIMObject header value could not be decoded
483 MessageLoaderParms parms(
484 "Server.CIMOperationRequestDecoder."
485 "CIMOBJECT_VALUE_SYNTAX_ERROR",
486 "CIMObject value syntax error.");
487 sendHttpError(
488 queueId,
489 HTTP_STATUS_BADREQUEST,
490 "header-mismatch",
491 MessageLoader::getMessage(parms),
492 closeConnect);
493 PEG_METHOD_EXIT();
494 return;
495 }
496 }
|
497 mike 1.2
|
498 kumpf 1.104 // Validate the "Content-Type" header:
|
499 mike 1.2
|
500 kumpf 1.124 const char* cimContentType;
|
501 kumpf 1.104 Boolean contentTypeHeaderFound = HTTPMessage::lookupHeader(
502 headers, "Content-Type", cimContentType, true);
|
503 kumpf 1.115 String type;
504 String charset;
|
505 mike 1.120 Boolean binaryRequest = false;
|
506 kumpf 1.115
|
507 kumpf 1.123 if (!contentTypeHeaderFound ||
|
508 kumpf 1.115 !HTTPMessage::parseContentTypeHeader(cimContentType, type, charset) ||
|
509 marek 1.127 (((!String::equalNoCase(type, "application/xml") &&
|
510 kumpf 1.115 !String::equalNoCase(type, "text/xml")) ||
|
511 kumpf 1.123 !String::equalNoCase(charset, "utf-8"))
512 && !(binaryRequest = String::equalNoCase(type,
|
513 mike 1.120 "application/x-openpegasus"))
|
514 marek 1.127 ))
|
515 kumpf 1.104 {
|
516 j.alex 1.95 MessageLoaderParms parms(
|
517 kumpf 1.104 "Server.CIMOperationRequestDecoder.CIMCONTENTTYPE_SYNTAX_ERROR",
|
518 kumpf 1.105 "HTTP Content-Type header error.");
|
519 j.alex 1.95 sendHttpError(
520 queueId,
521 HTTP_STATUS_BADREQUEST,
|
522 kumpf 1.105 "",
|
523 j.alex 1.95 MessageLoader::getMessage(parms),
524 closeConnect);
|
525 kumpf 1.104 PEG_METHOD_EXIT();
526 return;
527 }
|
528 karl 1.127.2.2 // Calculate the beginning of the content from the message size and
529 // the content length.
530 if (binaryRequest)
531 {
532 // binary the "Content" also contains a few padding '\0' to align
533 // data structures to 8byte boundary
534 // the padding '\0' are also part of the counted contentLength
535 Uint32 headerEnd = httpMessage->message.size() - contentLength;
536 Uint32 binContentStart = CIMBuffer::round(headerEnd);
537
538 contentLength = contentLength - (binContentStart - headerEnd);
539 content = (char*) httpMessage->message.getData() + binContentStart;
540 }
541 else
542 {
543 content = (char*) httpMessage->message.getData() +
544 httpMessage->message.size() - contentLength;
545 }
546
|
547 kumpf 1.104 // Validating content falls within UTF8
548 // (required to be complaint with section C12 of Unicode 4.0 spec,
549 // chapter 3.)
|
550 karl 1.127.2.2 if (!binaryRequest)
|
551 kumpf 1.104 {
552 Uint32 count = 0;
553 while(count<contentLength)
554 {
555 if (!(isUTF8((char*)&content[count])))
556 {
557 MessageLoaderParms parms(
558 "Server.CIMOperationRequestDecoder.INVALID_UTF8_CHARACTER",
559 "Invalid UTF-8 character detected.");
560 sendHttpError(
561 queueId,
562 HTTP_STATUS_BADREQUEST,
563 "request-not-valid",
564 MessageLoader::getMessage(parms),
565 closeConnect);
566
567 PEG_METHOD_EXIT();
|
568 mike 1.120 return;
|
569 kumpf 1.104 }
570 UTF8_NEXT(content,count);
571 }
572 }
573
|
574 kumpf 1.123 // Check for "Accept: application/x-openpegasus" HTTP header to see if
|
575 mike 1.120 // client can accept binary responses.
576
577 bool binaryResponse;
578
579 if (HTTPMessage::lookupHeader(headers, "Accept", type, true) &&
580 String::equalNoCase(type, "application/x-openpegasus"))
581 {
582 binaryResponse = true;
583 }
584 else
585 {
586 binaryResponse = false;
587 }
|
588 karl 1.127.2.2 httpMessage->binaryResponse=binaryResponse;
|
589 mike 1.120
|
590 kumpf 1.104 // If it is a method call, then dispatch it to be handled:
591
592 handleMethodCall(
593 queueId,
594 httpMethod,
595 content,
596 contentLength,
597 cimProtocolVersion,
598 cimMethod,
599 cimObject,
600 authType,
601 userName,
602 httpMessage->ipAddress,
603 httpMessage->acceptLanguages,
604 httpMessage->contentLanguages,
|
605 mike 1.120 closeConnect,
606 binaryRequest,
607 binaryResponse);
|
608 kumpf 1.104
609 PEG_METHOD_EXIT();
610 }
611
612 void CIMOperationRequestDecoder::handleMethodCall(
613 Uint32 queueId,
614 HttpMethod httpMethod,
615 char* content,
616 Uint32 contentLength, // used for statistics only
|
617 kumpf 1.124 const char* cimProtocolVersionInHeader,
|
618 kumpf 1.104 const String& cimMethodInHeader,
619 const String& cimObjectInHeader,
620 const String& authType,
621 const String& userName,
622 const String& ipAddress,
623 const AcceptLanguageList& httpAcceptLanguages,
624 const ContentLanguageList& httpContentLanguages,
|
625 mike 1.120 Boolean closeConnect,
626 Boolean binaryRequest,
627 Boolean binaryResponse)
|
628 kumpf 1.104 {
629 PEG_METHOD_ENTER(TRC_DISPATCHER,
630 "CIMOperationRequestDecoder::handleMethodCall()");
631
632 //
633 // If CIMOM is shutting down, return "Service Unavailable" response
634 //
635 if (_serverTerminating)
636 {
|
637 j.alex 1.95 MessageLoaderParms parms(
|
638 kumpf 1.104 "Server.CIMOperationRequestDecoder.CIMSERVER_SHUTTING_DOWN",
639 "CIM Server is shutting down.");
|
640 j.alex 1.95 sendHttpError(
641 queueId,
|
642 kumpf 1.104 HTTP_STATUS_SERVICEUNAVAILABLE,
643 String::EMPTY,
|
644 j.alex 1.95 MessageLoader::getMessage(parms),
645 closeConnect);
|
646 kumpf 1.104 PEG_METHOD_EXIT();
647 return;
648 }
649
|
650 karl 1.127.2.3 // Trace as binary display if binary request
|
651 karl 1.127.2.1 if(binaryRequest)
652 {
653 PEG_TRACE((TRC_XML,Tracer::LEVEL4,
654 "CIMOperationRequestdecoder - Binary content: Not Shown."));
655 }
656 else
657 {
658 PEG_TRACE((TRC_XML,Tracer::LEVEL4,
659 "CIMOperationRequestdecoder - XML content: %s",
660 content));
661 }
|
662 kumpf 1.104
|
663 mike 1.120 //
664 // Handle binary messages:
665 //
|
666 kumpf 1.104
667 AutoPtr<CIMOperationRequestMessage> request;
668
|
669 mike 1.120 if (binaryRequest)
|
670 kumpf 1.104 {
|
671 karl 1.127.2.2 CIMBuffer buf(content, contentLength);
672 CIMBufferReleaser buf_(buf);
|
673 mike 1.120
674 request.reset(BinaryCodec::decodeRequest(buf, queueId, _returnQueueId));
675
676 if (!request.get())
677 {
678 sendHttpError(
679 queueId,
680 HTTP_STATUS_BADREQUEST,
681 "Corrupt binary request message",
682 String::EMPTY,
683 closeConnect);
684 PEG_METHOD_EXIT();
685 return;
686 }
687 }
688 else try
689 {
690 XmlParser parser(content);
691 XmlEntry entry;
692 String messageId;
693 const char* cimMethodName = "";
694 mike 1.120
|
695 kumpf 1.104 //
696 // Process <?xml ... >
697 //
698
699 // These values are currently unused
700 const char* xmlVersion = 0;
701 const char* xmlEncoding = 0;
|
702 mike 1.2
|
703 kumpf 1.104 XmlReader::getXmlDeclaration(parser, xmlVersion, xmlEncoding);
|
704 mike 1.2
|
705 kumpf 1.104 // Expect <CIM ...>
|
706 chip 1.92
|
707 kumpf 1.104 const char* cimVersion = 0;
708 const char* dtdVersion = 0;
|
709 mike 1.2
|
710 kumpf 1.104 XmlReader::getCimStartTag(parser, cimVersion, dtdVersion);
|
711 mike 1.2
|
712 karl 1.108 if (!XmlReader::isSupportedCIMVersion(cimVersion))
|
713 kumpf 1.104 {
714 MessageLoaderParms parms(
715 "Server.CIMOperationRequestDecoder.CIM_VERSION_NOT_SUPPORTED",
716 "CIM version \"$0\" is not supported.",
717 cimVersion);
718 sendHttpError(
719 queueId,
720 HTTP_STATUS_NOTIMPLEMENTED,
721 "unsupported-cim-version",
722 MessageLoader::getMessage(parms),
723 closeConnect);
|
724 kumpf 1.23 PEG_METHOD_EXIT();
725 return;
|
726 kumpf 1.104 }
|
727 kumpf 1.23
|
728 karl 1.108 if (!XmlReader::isSupportedDTDVersion(dtdVersion))
|
729 kumpf 1.104 {
730 MessageLoaderParms parms(
731 "Server.CIMOperationRequestDecoder.DTD_VERSION_NOT_SUPPORTED",
732 "DTD version \"$0\" is not supported.",
733 dtdVersion);
734 sendHttpError(
|
735 j.alex 1.95 queueId,
|
736 kumpf 1.104 HTTP_STATUS_NOTIMPLEMENTED,
737 "unsupported-dtd-version",
738 MessageLoader::getMessage(parms),
|
739 j.alex 1.95 closeConnect);
|
740 kumpf 1.20 PEG_METHOD_EXIT();
|
741 kumpf 1.34 return;
|
742 kumpf 1.104 }
743
744 // Expect <MESSAGE ...>
745
746 String protocolVersion;
|
747 kumpf 1.73
|
748 kumpf 1.104 if (!XmlReader::getMessageStartTag(
749 parser, messageId, protocolVersion))
750 {
751 MessageLoaderParms mlParms(
752 "Server.CIMOperationRequestDecoder.EXPECTED_MESSAGE_ELEMENT",
753 "expected MESSAGE element");
|
754 mday 1.16
|
755 kumpf 1.104 throw XmlValidationError(parser.getLine(), mlParms);
756 }
|
757 mday 1.16
|
758 kumpf 1.104 // Validate that the protocol version in the header matches the XML
759 if (!String::equalNoCase(protocolVersion, cimProtocolVersionInHeader))
760 {
|
761 j.alex 1.95 MessageLoaderParms parms(
|
762 kumpf 1.104 "Server.CIMOperationRequestDecoder."
763 "CIMPROTOCOL_VERSION_MISMATCH",
764 "CIMProtocolVersion value \"$0\" does not match CIM request "
765 "protocol version \"$1\".",
766 cimProtocolVersionInHeader,
767 protocolVersion);
|
768 j.alex 1.95 sendHttpError(
769 queueId,
770 HTTP_STATUS_BADREQUEST,
771 "header-mismatch",
772 MessageLoader::getMessage(parms),
773 closeConnect);
|
774 kumpf 1.39 PEG_METHOD_EXIT();
775 return;
|
776 kumpf 1.104 }
|
777 kumpf 1.39
|
778 karl 1.108 // Accept protocol version 1.x (see Bugzilla 1556)
779 if (!XmlReader::isSupportedProtocolVersion(protocolVersion))
|
780 kumpf 1.104 {
781 // See Specification for CIM Operations over HTTP section 4.3
|
782 j.alex 1.95 MessageLoaderParms parms(
|
783 kumpf 1.104 "Server.CIMOperationRequestDecoder."
784 "CIMPROTOCOL_VERSION_NOT_SUPPORTED",
785 "CIMProtocolVersion \"$0\" is not supported.",
786 protocolVersion);
|
787 j.alex 1.95 sendHttpError(
788 queueId,
|
789 kumpf 1.104 HTTP_STATUS_NOTIMPLEMENTED,
790 "unsupported-protocol-version",
|
791 j.alex 1.95 MessageLoader::getMessage(parms),
792 closeConnect);
|
793 kumpf 1.23 PEG_METHOD_EXIT();
794 return;
|
795 kumpf 1.104 }
|
796 kumpf 1.23
|
797 kumpf 1.104 if (XmlReader::testStartTag(parser, entry, "MULTIREQ"))
798 {
799 // We wouldn't have gotten here if CIMBatch header was specified,
800 // so this must be indicative of a header mismatch
|
801 j.alex 1.95 MessageLoaderParms parms(
|
802 kumpf 1.104 "Server.CIMOperationRequestDecoder."
803 "MULTI_REQUEST_MISSING_CIMBATCH_HTTP_HEADER",
804 "Multi-request is missing CIMBatch HTTP header");
|
805 j.alex 1.95 sendHttpError(
806 queueId,
807 HTTP_STATUS_BADREQUEST,
808 "header-mismatch",
809 MessageLoader::getMessage(parms),
810 closeConnect);
|
811 kumpf 1.23 PEG_METHOD_EXIT();
812 return;
|
813 kumpf 1.104 // Future: When MULTIREQ is supported, must ensure CIMMethod and
814 // CIMObject headers are absent, and CIMBatch header is present.
815 }
816
817 // Expect <SIMPLEREQ ...>
818
819 XmlReader::expectStartTag(parser, entry, "SIMPLEREQ");
820
821 // Check for <IMETHODCALL ...>
822
823 if (XmlReader::getIMethodCallStartTag(parser, cimMethodName))
824 {
825 // The Specification for CIM Operations over HTTP reads:
826 // 3.3.6. CIMMethod
827 //
828 // This header MUST be present in any CIM Operation Request
829 // message that contains a Simple Operation Request.
830 //
831 // It MUST NOT be present in any CIM Operation Response message,
832 // nor in any CIM Operation Request message that is not a
833 // Simple Operation Request.
834 kumpf 1.104 //
835 // The name of the CIM method within a Simple Operation Request
836 // is defined to be the value of the NAME attribute of the
837 // <METHODCALL> or <IMETHODCALL> element.
838 //
839 // If a CIM Server receives a CIM Operation Request for which
840 // either:
841 //
842 // - The CIMMethod header is present but has an invalid value,
843 // or;
844 // - The CIMMethod header is not present but the Operation
845 // Request Message is a Simple Operation Request, or;
846 // - The CIMMethod header is present but the Operation Request
847 // Message is not a Simple Operation Request, or;
848 // - The CIMMethod header is present, the Operation Request
849 // Message is a Simple Operation Request, but the
850 // CIMIdentifier value (when unencoded) does not match the
851 // unique method name within the Simple Operation Request,
852 //
853 // then it MUST fail the request and return a status of
854 // "400 Bad Request" (and MUST include a CIMError header in the
855 kumpf 1.104 // response with a value of header-mismatch), subject to the
856 // considerations specified in Errors.
857 if (!String::equalNoCase(cimMethodName, cimMethodInHeader))
858 {
859 // ATTN-RK-P3-20020304: How to decode cimMethodInHeader?
860 if (cimMethodInHeader == String::EMPTY)
861 {
862 MessageLoaderParms parms(
863 "Server.CIMOperationRequestDecoder."
864 "MISSING_CIMMETHOD_HTTP_HEADER",
865 "Missing CIMMethod HTTP header.");
866 sendHttpError(
867 queueId,
868 HTTP_STATUS_BADREQUEST,
869 "header-mismatch",
870 MessageLoader::getMessage(parms),
871 closeConnect);
872 }
873 else
874 {
875 MessageLoaderParms parms(
876 kumpf 1.104 "Server.CIMOperationRequestDecoder."
877 "CIMMETHOD_VALUE_DOES_NOT_MATCH_REQUEST_METHOD",
878 "CIMMethod value \"$0\" does not match CIM request "
879 "method \"$1\".",
880 cimMethodInHeader,
881 cimMethodName);
882 sendHttpError(
883 queueId,
884 HTTP_STATUS_BADREQUEST,
885 "header-mismatch",
886 MessageLoader::getMessage(parms),
887 closeConnect);
888 }
889 PEG_METHOD_EXIT();
890 return;
891 }
|
892 kumpf 1.23
|
893 kumpf 1.104 // Expect <LOCALNAMESPACEPATH ...>
894
895 String nameSpace;
896
897 if (!XmlReader::getLocalNameSpacePathElement(parser, nameSpace))
898 {
899 MessageLoaderParms mlParms(
900 "Server.CIMOperationRequestDecoder."
901 "EXPECTED_LOCALNAMESPACEPATH_ELEMENT",
902 "expected LOCALNAMESPACEPATH element");
903 throw XmlValidationError(parser.getLine(), mlParms);
904 }
905
906 // The Specification for CIM Operations over HTTP reads:
907 // 3.3.7. CIMObject
908 //
909 // This header MUST be present in any CIM Operation Request
910 // message that contains a Simple Operation Request.
911 //
912 // It MUST NOT be present in any CIM Operation Response message,
913 // nor in any CIM Operation Request message that is not a
914 kumpf 1.104 // Simple Operation Request.
915 //
916 // The header identifies the CIM object (which MUST be a Class
917 // or Instance for an extrinsic method, or a Namespace for an
918 // intrinsic method) on which the method is to be invoked, using
919 // a CIM object path encoded in an HTTP-safe representation.
920 //
921 // If a CIM Server receives a CIM Operation Request for which
922 // either:
923 //
924 // - The CIMObject header is present but has an invalid value,
925 // or;
926 // - The CIMObject header is not present but the Operation
927 // Request Message is a Simple Operation Request, or;
928 // - The CIMObject header is present but the Operation Request
929 // Message is not a Simple Operation Request, or;
930 // - The CIMObject header is present, the Operation Request
931 // Message is a Simple Operation Request, but the ObjectPath
932 // value does not match (where match is defined in the section
933 // section on Encoding CIM Object Paths) the Operation Request
934 // Message,
935 kumpf 1.104 //
936 // then it MUST fail the request and return a status of
937 // "400 Bad Request" (and MUST include a CIMError header in the
938 // response with a value of header-mismatch), subject to the
939 // considerations specified in Errors.
940 if (!String::equalNoCase(nameSpace, cimObjectInHeader))
941 {
942 if (cimObjectInHeader == String::EMPTY)
943 {
944 MessageLoaderParms parms(
945 "Server.CIMOperationRequestDecoder."
946 "MISSING_CIMOBJECT_HTTP_HEADER",
947 "Missing CIMObject HTTP header.");
948 sendHttpError(
949 queueId,
950 HTTP_STATUS_BADREQUEST,
951 "header-mismatch",
952 MessageLoader::getMessage(parms),
953 closeConnect);
954 }
955 else
956 kumpf 1.104 {
957 MessageLoaderParms parms(
958 "Server.CIMOperationRequestDecoder."
|
959 kumpf 1.113 "CIMOBJECT_VALUE_DOES_NOT_MATCH_REQUEST_OBJECT",
|
960 kumpf 1.104 "CIMObject value \"$0\" does not match CIM request "
961 "object \"$1\".",
962 cimObjectInHeader,
963 nameSpace);
964 sendHttpError(
965 queueId,
966 HTTP_STATUS_BADREQUEST,
967 "header-mismatch",
968 MessageLoader::getMessage(parms),
969 closeConnect);
970 }
971 PEG_METHOD_EXIT();
972 return;
973 }
974
975 // This try block only catches CIMExceptions, because they must be
976 // responded to with a proper IMETHODRESPONSE. Other exceptions are
977 // caught in the outer try block.
978 try
979 {
980 // Delegate to appropriate method to handle:
981 kumpf 1.104
982 if (System::strcasecmp(cimMethodName, "GetClass") == 0)
983 request.reset(decodeGetClassRequest(
984 queueId, parser, messageId, nameSpace));
985 else if (System::strcasecmp(cimMethodName, "GetInstance") == 0)
986 request.reset(decodeGetInstanceRequest(
987 queueId, parser, messageId, nameSpace));
988 else if (System::strcasecmp(
989 cimMethodName, "EnumerateClassNames") == 0)
990 request.reset(decodeEnumerateClassNamesRequest(
991 queueId, parser, messageId, nameSpace));
992 else if (System::strcasecmp(cimMethodName, "References") == 0)
993 request.reset(decodeReferencesRequest(
994 queueId, parser, messageId, nameSpace));
995 else if (System::strcasecmp(
996 cimMethodName, "ReferenceNames") == 0)
997 request.reset(decodeReferenceNamesRequest(
998 queueId, parser, messageId, nameSpace));
999 else if (System::strcasecmp(
1000 cimMethodName, "AssociatorNames") == 0)
1001 request.reset(decodeAssociatorNamesRequest(
1002 kumpf 1.104 queueId, parser, messageId, nameSpace));
1003 else if (System::strcasecmp(cimMethodName, "Associators") == 0)
1004 request.reset(decodeAssociatorsRequest(
1005 queueId, parser, messageId, nameSpace));
1006 else if (System::strcasecmp(
1007 cimMethodName, "CreateInstance") == 0)
1008 request.reset(decodeCreateInstanceRequest(
1009 queueId, parser, messageId, nameSpace));
1010 else if (System::strcasecmp(
1011 cimMethodName, "EnumerateInstanceNames")==0)
1012 request.reset(decodeEnumerateInstanceNamesRequest(
1013 queueId, parser, messageId, nameSpace));
1014 else if (System::strcasecmp(
1015 cimMethodName, "DeleteQualifier") == 0)
1016 request.reset(decodeDeleteQualifierRequest(
1017 queueId, parser, messageId, nameSpace));
1018 else if (System::strcasecmp(cimMethodName, "GetQualifier") == 0)
1019 request.reset(decodeGetQualifierRequest(
1020 queueId, parser, messageId, nameSpace));
1021 else if (System::strcasecmp(cimMethodName, "SetQualifier") == 0)
1022 request.reset(decodeSetQualifierRequest(
1023 kumpf 1.104 queueId, parser, messageId, nameSpace));
1024 else if (System::strcasecmp(
1025 cimMethodName, "EnumerateQualifiers") == 0)
1026 request.reset(decodeEnumerateQualifiersRequest(
1027 queueId, parser, messageId, nameSpace));
1028 else if (System::strcasecmp(
1029 cimMethodName, "EnumerateClasses") == 0)
1030 request.reset(decodeEnumerateClassesRequest(
1031 queueId, parser, messageId, nameSpace));
1032 else if (System::strcasecmp(
1033 cimMethodName, "EnumerateInstances") == 0)
1034 request.reset(decodeEnumerateInstancesRequest(
1035 queueId, parser, messageId, nameSpace));
1036 else if (System::strcasecmp(cimMethodName, "CreateClass") == 0)
1037 request.reset(decodeCreateClassRequest(
1038 queueId, parser, messageId, nameSpace));
1039 else if (System::strcasecmp(cimMethodName, "ModifyClass") == 0)
1040 request.reset(decodeModifyClassRequest(
1041 queueId, parser, messageId, nameSpace));
1042 else if (System::strcasecmp(
1043 cimMethodName, "ModifyInstance") == 0)
1044 kumpf 1.104 request.reset(decodeModifyInstanceRequest(
1045 queueId, parser, messageId, nameSpace));
1046 else if (System::strcasecmp(cimMethodName, "DeleteClass") == 0)
1047 request.reset(decodeDeleteClassRequest(
1048 queueId, parser, messageId, nameSpace));
1049 else if (System::strcasecmp(
1050 cimMethodName, "DeleteInstance") == 0)
1051 request.reset(decodeDeleteInstanceRequest(
1052 queueId, parser, messageId, nameSpace));
1053 else if (System::strcasecmp(cimMethodName, "GetProperty") == 0)
1054 request.reset(decodeGetPropertyRequest(
1055 queueId, parser, messageId, nameSpace));
1056 else if (System::strcasecmp(cimMethodName, "SetProperty") == 0)
1057 request.reset(decodeSetPropertyRequest(
1058 queueId, parser, messageId, nameSpace));
1059 else if (System::strcasecmp(cimMethodName, "ExecQuery") == 0)
1060 request.reset(decodeExecQueryRequest(
1061 queueId, parser, messageId, nameSpace));
|
1062 karl 1.127.2.1 // Pull Operations decoders
1063 else if (System::strcasecmp(
1064 cimMethodName, "OpenEnumerateInstances") == 0)
1065 request.reset(decodeOpenEnumerateInstancesRequest(
1066 queueId, parser, messageId, nameSpace));
1067
1068 else if (System::strcasecmp(
1069 cimMethodName, "OpenEnumerateInstancePaths") == 0)
1070 request.reset(decodeOpenEnumerateInstancePathsRequest(
1071 queueId, parser, messageId, nameSpace));
1072
1073 else if (System::strcasecmp(
1074 cimMethodName, "OpenReferenceInstances") == 0)
1075 request.reset(decodeOpenReferenceInstancesRequest(
1076 queueId, parser, messageId, nameSpace));
1077
1078 else if (System::strcasecmp(
1079 cimMethodName, "OpenReferenceInstancePaths") == 0)
1080 request.reset(decodeOpenReferenceInstancePathsRequest(
1081 queueId, parser, messageId, nameSpace));
1082
1083 karl 1.127.2.1 else if (System::strcasecmp(
1084 cimMethodName, "OpenAssociatorInstances") == 0)
1085 request.reset(decodeOpenAssociatorInstancesRequest(
1086 queueId, parser, messageId, nameSpace));
1087
1088 else if (System::strcasecmp(
1089 cimMethodName, "OpenAssociatorInstancePaths") == 0)
1090 request.reset(decodeOpenAssociatorInstancePathsRequest(
1091 queueId, parser, messageId, nameSpace));
1092
1093 else if (System::strcasecmp(
1094 cimMethodName, "PullInstancesWithPath") == 0)
1095 request.reset(decodePullInstancesWithPathRequest(
1096 queueId, parser, messageId, nameSpace));
1097
1098 else if (System::strcasecmp(
1099 cimMethodName, "PullInstancePaths") == 0)
1100 request.reset(decodePullInstancePathsRequest(
1101 queueId, parser, messageId, nameSpace));
1102
1103 else if (System::strcasecmp(
1104 karl 1.127.2.1 cimMethodName, "CloseEnumeration") == 0)
1105 request.reset(decodeCloseEnumerationRequest(
1106 queueId, parser, messageId, nameSpace));
1107
1108 else if (System::strcasecmp(
1109 cimMethodName, "EnumerationCount") == 0)
1110 request.reset(decodeEnumerationCountRequest(
1111 queueId, parser, messageId, nameSpace));
|
1112 karl 1.127.2.6
1113 else if (System::strcasecmp(
1114 cimMethodName, "OpenQueryInstances") == 0)
1115 request.reset(decodeOpenQueryInstancesRequest(
1116 queueId, parser, messageId, nameSpace));
|
1117 karl 1.127.2.1 // End Of Pull Operations
|
1118 kumpf 1.104 else
1119 {
1120 throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_NOT_SUPPORTED,
1121 MessageLoaderParms(
1122 "Server.CIMOperationRequestDecoder."
1123 "UNRECOGNIZED_INTRINSIC_METHOD",
1124 "Unrecognized intrinsic method: $0",
1125 cimMethodName));
1126 }
1127 }
1128 catch (CIMException& e)
1129 {
1130 sendIMethodError(
1131 queueId,
1132 httpMethod,
1133 messageId,
1134 cimMethodName,
1135 e,
1136 closeConnect);
1137
1138 PEG_METHOD_EXIT();
1139 kumpf 1.104 return;
1140 }
1141 catch (XmlException&)
1142 {
1143 // XmlExceptions are handled below
1144 throw;
1145 }
1146 catch (Exception& e)
1147 {
1148 // Caught an unexpected exception from decoding. Since we must
1149 // have had a problem reconstructing a CIM object, we'll treat
1150 // it as an invalid parameter
1151 sendIMethodError(
1152 queueId,
1153 httpMethod,
1154 messageId,
1155 cimMethodName,
1156 PEGASUS_CIM_EXCEPTION(
1157 CIM_ERR_INVALID_PARAMETER, e.getMessage()),
1158 closeConnect);
1159
1160 kumpf 1.104 PEG_METHOD_EXIT();
1161 return;
1162 }
1163
1164 // Expect </IMETHODCALL>
1165
1166 XmlReader::expectEndTag(parser, "IMETHODCALL");
1167 }
1168 // Expect <METHODCALL ...>
1169 else if (XmlReader::getMethodCallStartTag(parser, cimMethodName))
1170 {
1171 CIMObjectPath reference;
1172
1173 // The Specification for CIM Operations over HTTP reads:
1174 // 3.3.6. CIMMethod
1175 //
1176 // This header MUST be present in any CIM Operation Request
1177 // message that contains a Simple Operation Request.
1178 //
1179 // It MUST NOT be present in any CIM Operation Response message,
1180 // nor in any CIM Operation Request message that is not a
1181 kumpf 1.104 // Simple Operation Request.
1182 //
1183 // The name of the CIM method within a Simple Operation Request
1184 // is defined to be the value of the NAME attribute of the
1185 // <METHODCALL> or <IMETHODCALL> element.
1186 //
1187 // If a CIM Server receives a CIM Operation Request for which
1188 // either:
1189 //
1190 // - The CIMMethod header is present but has an invalid value,
1191 // or;
1192 // - The CIMMethod header is not present but the Operation
1193 // Request Message is a Simple Operation Request, or;
1194 // - The CIMMethod header is present but the Operation Request
1195 // Message is not a Simple Operation Request, or;
1196 // - The CIMMethod header is present, the Operation Request
1197 // Message is a Simple Operation Request, but the
1198 // CIMIdentifier value (when unencoded) does not match the
1199 // unique method name within the Simple Operation Request,
1200 //
1201 // then it MUST fail the request and return a status of
1202 kumpf 1.104 // "400 Bad Request" (and MUST include a CIMError header in the
1203 // response with a value of header-mismatch), subject to the
1204 // considerations specified in Errors.
1205
1206 // Extrinic methods can have UTF-8!
1207 String cimMethodNameUTF16(cimMethodName);
1208 if (cimMethodNameUTF16 != cimMethodInHeader)
1209 {
1210 // ATTN-RK-P3-20020304: How to decode cimMethodInHeader?
1211 if (cimMethodInHeader == String::EMPTY)
1212 {
1213 MessageLoaderParms parms(
1214 "Server.CIMOperationRequestDecoder."
1215 "MISSING_CIMMETHOD_HTTP_HEADER",
1216 "Missing CIMMethod HTTP header.");
1217 sendHttpError(
1218 queueId,
1219 HTTP_STATUS_BADREQUEST,
1220 "header-mismatch",
1221 MessageLoader::getMessage(parms),
1222 closeConnect);
1223 kumpf 1.104 }
1224 else
1225 {
1226 MessageLoaderParms parms(
1227 "Server.CIMOperationRequestDecoder."
1228 "CIMMETHOD_VALUE_DOES_NOT_MATCH_REQUEST_METHOD",
1229 "CIMMethod value \"$0\" does not match CIM request "
1230 "method \"$1\".",
1231 (const char*)cimMethodInHeader.getCString(),
1232 cimMethodName);
1233 sendHttpError(
1234 queueId,
1235 HTTP_STATUS_BADREQUEST,
1236 "header-mismatch",
1237 MessageLoader::getMessage(parms),
1238 closeConnect);
1239 }
1240 PEG_METHOD_EXIT();
1241 return;
1242 }
1243
1244 kumpf 1.104 //
1245 // Check for <LOCALINSTANCEPATHELEMENT> or <LOCALCLASSPATHELEMENT>
1246 //
1247 if (!(XmlReader::getLocalInstancePathElement(parser, reference) ||
1248 XmlReader::getLocalClassPathElement(parser, reference)))
1249 {
1250 MessageLoaderParms parms(
1251 "Common.XmlConstants.MISSING_ELEMENT_LOCALPATH",
1252 MISSING_ELEMENT_LOCALPATH);
1253 // this throw is not updated with MLP because
1254 // MISSING_ELEMENT_LOCALPATH is a hardcoded variable,
1255 // not a message
1256 throw XmlValidationError(parser.getLine(), parms);
1257 }
1258
1259 // The Specification for CIM Operations over HTTP reads:
1260 // 3.3.7. CIMObject
1261 //
1262 // This header MUST be present in any CIM Operation Request
1263 // message that contains a Simple Operation Request.
1264 //
1265 kumpf 1.104 // It MUST NOT be present in any CIM Operation Response message,
1266 // nor in any CIM Operation Request message that is not a
1267 // Simple Operation Request.
1268 //
1269 // The header identifies the CIM object (which MUST be a Class
1270 // or Instance for an extrinsic method, or a Namespace for an
1271 // intrinsic method) on which the method is to be invoked, using
1272 // a CIM object path encoded in an HTTP-safe representation.
1273 //
1274 // If a CIM Server receives a CIM Operation Request for which
1275 // either:
1276 //
1277 // - The CIMObject header is present but has an invalid value,
1278 // or;
1279 // - The CIMObject header is not present but the Operation
1280 // Request Message is a Simple Operation Request, or;
1281 // - The CIMObject header is present but the Operation Request
1282 // Message is not a Simple Operation Request, or;
1283 // - The CIMObject header is present, the Operation Request
1284 // Message is a Simple Operation Request, but the ObjectPath
1285 // value does not match (where match is defined in the section
1286 kumpf 1.104 // section on Encoding CIM Object Paths) the Operation Request
1287 // Message,
1288 //
1289 // then it MUST fail the request and return a status of
1290 // "400 Bad Request" (and MUST include a CIMError header in the
1291 // response with a value of header-mismatch), subject to the
1292 // considerations specified in Errors.
1293 if (cimObjectInHeader == String::EMPTY)
1294 {
1295 MessageLoaderParms parms(
1296 "Server.CIMOperationRequestDecoder."
1297 "MISSING_CIMOBJECT_HTTP_HEADER",
1298 "Missing CIMObject HTTP header.");
1299 sendHttpError(
1300 queueId,
1301 HTTP_STATUS_BADREQUEST,
1302 "header-mismatch",
1303 MessageLoader::getMessage(parms),
1304 closeConnect);
1305 PEG_METHOD_EXIT();
1306 return;
1307 kumpf 1.104 }
1308
1309 CIMObjectPath headerObjectReference;
1310 try
1311 {
1312 headerObjectReference.set(cimObjectInHeader);
1313 }
1314 catch (Exception&)
1315 {
1316 MessageLoaderParms parms(
1317 "Server.CIMOperationRequestDecoder."
1318 "COULD_NOT_PARSE_CIMOBJECT_VALUE",
1319 "Could not parse CIMObject value \"$0\".",
1320 cimObjectInHeader);
1321 sendHttpError(
1322 queueId,
1323 HTTP_STATUS_BADREQUEST,
1324 "header-mismatch",
1325 MessageLoader::getMessage(parms),
1326 closeConnect);
1327 PEG_METHOD_EXIT();
1328 kumpf 1.104 return;
1329 }
1330
1331 if (!reference.identical(headerObjectReference))
1332 {
1333 MessageLoaderParms parms(
1334 "Server.CIMOperationRequestDecoder."
|
1335 kumpf 1.113 "CIMOBJECT_VALUE_DOES_NOT_MATCH_REQUEST_OBJECT",
|
1336 kumpf 1.104 "CIMObject value \"$0\" does not match CIM request "
1337 "object \"$1\".",
1338 cimObjectInHeader,
|
1339 kumpf 1.113 reference.toString());
|
1340 kumpf 1.104 sendHttpError(
1341 queueId,
1342 HTTP_STATUS_BADREQUEST,
1343 "header-mismatch",
1344 MessageLoader::getMessage(parms),
1345 closeConnect);
1346 PEG_METHOD_EXIT();
1347 return;
1348 }
1349
1350 // This try block only catches CIMExceptions, because they must be
1351 // responded to with a proper METHODRESPONSE. Other exceptions are
1352 // caught in the outer try block.
1353 try
1354 {
1355 // Delegate to appropriate method to handle:
1356
1357 request.reset(decodeInvokeMethodRequest(
1358 queueId,
1359 parser,
1360 messageId,
1361 kumpf 1.104 reference,
1362 cimMethodNameUTF16)); // contains UTF-16 converted from UTF-8
1363 }
1364 catch (CIMException& e)
1365 {
1366 sendMethodError(
1367 queueId,
1368 httpMethod,
1369 messageId,
1370 cimMethodNameUTF16, // contains UTF-16 converted from UTF-8
1371 e,
1372 closeConnect);
1373
1374 PEG_METHOD_EXIT();
1375 return;
1376 }
1377 catch (XmlException&)
1378 {
1379 // XmlExceptions are handled below
1380 throw;
1381 }
1382 kumpf 1.104 catch (Exception& e)
1383 {
1384 // Caught an unexpected exception from decoding. Since we must
1385 // have had a problem reconstructing a CIM object, we'll treata
1386 // it as an invalid parameter
1387 sendMethodError(
1388 queueId,
1389 httpMethod,
1390 messageId,
1391 cimMethodNameUTF16, // contains UTF-16 converted from UTF-8
1392 PEGASUS_CIM_EXCEPTION(
1393 CIM_ERR_INVALID_PARAMETER, e.getMessage()),
1394 closeConnect);
1395
1396 PEG_METHOD_EXIT();
1397 return;
1398 }
|
1399 kumpf 1.73
|
1400 kumpf 1.104 // Expect </METHODCALL>
|
1401 mday 1.16
|
1402 kumpf 1.104 XmlReader::expectEndTag(parser, "METHODCALL");
1403 }
1404 else
1405 {
1406 MessageLoaderParms mlParms(
1407 "Server.CIMOperationRequestDecoder.EXPECTED_IMETHODCALL_ELEMENT",
1408 "expected IMETHODCALL or METHODCALL element");
1409 throw XmlValidationError(parser.getLine(),mlParms);
1410 }
1411
1412 // Expect </SIMPLEREQ>
1413
1414 XmlReader::expectEndTag(parser, "SIMPLEREQ");
1415
1416 // Expect </MESSAGE>
1417
1418 XmlReader::expectEndTag(parser, "MESSAGE");
1419
1420 // Expect </CIM>
1421
1422 XmlReader::expectEndTag(parser, "CIM");
1423 kumpf 1.104 }
1424 catch (XmlValidationError& e)
1425 {
|
1426 thilo.boehm 1.119 PEG_TRACE((TRC_XML,Tracer::LEVEL1,
|
1427 kumpf 1.104 "CIMOperationRequestDecoder::handleMethodCall - "
|
1428 marek 1.116 "XmlValidationError exception has occurred. Message: %s",
1429 (const char*) e.getMessage().getCString()));
|
1430 kumpf 1.24
|
1431 kumpf 1.104 sendHttpError(
1432 queueId,
1433 HTTP_STATUS_BADREQUEST,
1434 "request-not-valid",
1435 e.getMessage(),
1436 closeConnect);
1437 PEG_METHOD_EXIT();
1438 return;
1439 }
1440 catch (XmlSemanticError& e)
1441 {
|
1442 thilo.boehm 1.119 PEG_TRACE((TRC_XML,Tracer::LEVEL1,
|
1443 kumpf 1.104 "CIMOperationRequestDecoder::handleMethodCall - "
|
1444 marek 1.116 "XmlSemanticError exception has occurred. Message: %s",
1445 (const char*) e.getMessage().getCString()));
|
1446 mday 1.16
|
1447 kumpf 1.104 // ATTN-RK-P2-20020404: Is this the correct response for these errors?
1448 sendHttpError(
1449 queueId,
1450 HTTP_STATUS_BADREQUEST,
1451 "request-not-valid",
1452 e.getMessage(),
1453 closeConnect);
1454 PEG_METHOD_EXIT();
1455 return;
1456 }
1457 catch (XmlException& e)
1458 {
|
1459 thilo.boehm 1.119 PEG_TRACE((TRC_XML,Tracer::LEVEL1,
|
1460 kumpf 1.104 "CIMOperationRequestDecoder::handleMethodCall - "
|
1461 marek 1.116 "XmlException has occurred. Message: %s",
1462 (const char*) e.getMessage().getCString()));
|
1463 kumpf 1.104
1464 sendHttpError(
1465 queueId,
1466 HTTP_STATUS_BADREQUEST,
1467 "request-not-well-formed",
1468 e.getMessage(),
1469 closeConnect);
1470 PEG_METHOD_EXIT();
1471 return;
1472 }
|
1473 karl 1.127.2.5 catch (TooManyElementsException& e)
1474 {
1475 PEG_TRACE((TRC_XML,Tracer::LEVEL1,
1476 "CIMOperationRequestDecoder::handleMethodCall - "
1477 "TooManyElementsException has occurred. Message: %s",
1478 (const char*) e.getMessage().getCString()));
1479
1480 sendHttpError(
1481 queueId,
1482 HTTP_STATUS_BADREQUEST,
1483 "request-with-too-many-elements",
1484 e.getMessage(),
1485 closeConnect);
1486 PEG_METHOD_EXIT();
1487 return;
1488 }
|
1489 kumpf 1.104 catch (Exception& e)
1490 {
1491 // Don't know why I got this exception. Seems like a bad thing.
1492 // Any exceptions we're expecting should be caught separately and
1493 // dealt with appropriately. This is a last resort.
1494 sendHttpError(
1495 queueId,
1496 HTTP_STATUS_INTERNALSERVERERROR,
1497 String::EMPTY,
1498 e.getMessage(),
1499 closeConnect);
1500 PEG_METHOD_EXIT();
1501 return;
1502 }
1503 catch (...)
1504 {
1505 // Don't know why I got whatever this is. Seems like a bad thing.
1506 // Any exceptions we're expecting should be caught separately and
1507 // dealt with appropriately. This is a last resort.
1508 sendHttpError(
1509 queueId,
1510 kumpf 1.104 HTTP_STATUS_INTERNALSERVERERROR,
1511 String::EMPTY,
1512 String::EMPTY,
1513 closeConnect);
1514 PEG_METHOD_EXIT();
1515 return;
1516 }
1517
1518 STAT_BYTESREAD
1519
1520 request->authType = authType;
1521 request->userName = userName;
1522 request->ipAddress = ipAddress;
1523 request->setHttpMethod (httpMethod);
|
1524 mike 1.120 request->binaryResponse = binaryResponse;
|
1525 sage 1.41
|
1526 chuck 1.58 //l10n start
1527 // l10n TODO - might want to move A-L and C-L to Message
1528 // to make this more maintainable
|
1529 kumpf 1.104 // Add the language headers to the request
1530 CIMMessage* cimmsg = dynamic_cast<CIMMessage*>(request.get());
1531 if (cimmsg != NULL)
1532 {
1533 cimmsg->operationContext.insert(IdentityContainer(userName));
1534 cimmsg->operationContext.set(
1535 AcceptLanguageListContainer(httpAcceptLanguages));
1536 cimmsg->operationContext.set(
1537 ContentLanguageListContainer(httpContentLanguages));
1538 }
1539 else
1540 {
1541 ; // l10n TODO - error back to client here
1542 }
|
1543 chip 1.92 // l10n end
|
1544 chuck 1.58
|
1545 kumpf 1.104 request->setCloseConnect(closeConnect);
1546 _outputQueue->enqueue(request.release());
|
1547 chip 1.92
|
1548 kumpf 1.104 PEG_METHOD_EXIT();
|
1549 mike 1.2 }
|
1550 karl 1.127.2.5 /**************************************************************************
1551 **
1552 ** Decode CIM Operation Type Common IParameter types.
1553 ** Each class defines processing for a particular IPARAM type
1554 ** (ex. boolean)or parameter name (i.e. propertyListIParam)
1555 ** Each struct defines:
1556 ** got - Boolean defines whether this parameter has been found
1557 ** value - The value container for this type
1558 ** iParamFound(...) - function sets the duplicate flag and the got flag
1559 ** get - Function to get the defined parameter from the
1560 ** parser
1561 ** NOTE: at least one has multiple get.. functions.
1562 ** NOTE: Some of these are defined for a particular attribute (ex.
1563 ** propertyListIparam) so the attribute name is integrated into the
1564 ** methods and others for a whole class of attributes (Boolean,
1565 ** String,ClassName etc.) so the attribute name is defined as part
1566 ** of the constructor.
1567 ***************************************************************************/
1568 // Common xml attribute accessor for all boolean attributes. The
1569 // attribute name is defined in the constructor.
1570 // The usage pattern is:
1571 karl 1.127.2.5 // Boolean duplicate; // Flag to indicate multiple calls
1572 //
1573 // booleanIParam xyz("xyz"); default is false for attribute xyz
1574 //
1575 // if(xyz.get(parser, name, emptyTag) // parses to test if name == xyz
1576 // iParamFound(duplicate); // set flag to indicate exists etc.
1577 class booleanIParam
1578 {
1579 public:
1580 Boolean got;
1581 Boolean value;
1582
1583 // constructor with default value = false
1584 booleanIParam(const char* name): got(false),value(false),iParamName(name){}
1585
1586 // constructor with initial value specifically set from the input
1587 booleanIParam(const char* name, Boolean _value):
1588 got(false),value(_value),iParamName(name){}
1589
1590 ~booleanIParam(){}
1591
1592 karl 1.127.2.5 void iParamFound(Boolean& duplicate)
1593 {
1594 duplicate = got;
1595 got = true;
1596 }
1597
1598 // get the value of the parameter if the parameter if it exists.
1599 // Note that the attribute name is defined in the constructor
1600 // Value is required.
1601 // @param parser
1602 // @param testName attribute name from parse.
1603 // @emptyTag returns true if emptyTag returned true from parser
1604 Boolean get(XmlParser& parser, const char * testName, Boolean& emptyTag)
1605 {
1606 if (System::strcasecmp(iParamName.getCString(), testName) == 0)
1607 {
1608 XmlReader::rejectNullIParamValue(parser, emptyTag,
1609 iParamName.getCString());
1610 XmlReader::getBooleanValueElement(parser, value, true);
1611 return true;
1612 }
1613 karl 1.127.2.5 return false;
1614 }
1615 private:
1616 String iParamName;
1617 // hide unused default constructor and assign, copy constructors
1618 booleanIParam();
1619 booleanIParam(const booleanIParam&);
1620 booleanIParam& operator = (const booleanIParam&);
1621 };
1622
1623 // decode Iparam to CIMName representing class names. This struct
1624 // has two get functions:
1625 // get - parse where the parameter value is required
1626 // getOptional - parse where the parameter value is optional
1627
1628 class classNameIParam
1629 {
1630 public:
1631 Boolean got;
1632 CIMName value;
1633
1634 karl 1.127.2.5 // Set the flag to inidcate that this IParam has been gotten and also
1635 // set the flag defined by the duplicate parameter
1636 // @param duplicate Boolean that is set to previous value of the got
1637 // variable indicating whether this is second call to this IParam
1638 void iParamFound(Boolean& duplicate)
1639 {
1640 duplicate = got;
1641 got = true;
1642 }
1643
1644 // construct an IParam definition with name.
1645 // @param name const char* defining name of IParam to match
1646 // @return true if IParam found with _attrName
1647 classNameIParam(const char* name): got(false), iParamName(name){}
1648
1649 ~classNameIParam(){}
1650
1651 // Get Required value element.Test for name parameter as IParam with
1652 // name and if found, if value not NULL, parse the className and
1653 // set into value
1654 Boolean get(XmlParser& parser, const char* name, Boolean& emptyTag)
1655 karl 1.127.2.5 {
1656 if (System::strcasecmp(name,iParamName.getCString()) == 0)
1657 {
1658 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
1659 XmlReader::getClassNameElement(parser, value, true);
1660 return true;
1661 }
1662 return false;
1663 }
1664 // Get Iparam with optional value.
1665 Boolean getOptional(XmlParser& parser, const char* name,
1666 Boolean& emptyTag)
1667 {
1668 if (System::strcasecmp(name, iParamName.getCString()) == 0)
1669 {
1670 // value may be NULL
1671 if (!emptyTag)
1672 {
1673 XmlReader::getClassNameElement(parser, value, false);
1674 }
1675 return true;
1676 karl 1.127.2.5 }
1677 return false;
1678 }
1679 private:
1680 String iParamName;
1681 // hide unused default constructor and assign, copy constructors
1682 classNameIParam();
1683 classNameIParam(const classNameIParam&);
1684 classNameIParam& operator = (const classNameIParam&);
1685 };
1686
1687 // test for "InstanceName" iParam and if found, return CIMObjectPath
1688 // in value
1689 class instanceNameIParam
1690 {
1691 public:
1692 Boolean got;
1693 CIMObjectPath value;
1694
1695 void iParamFound(Boolean& duplicate)
1696 {
1697 karl 1.127.2.5 duplicate = got;
1698 got = true;
1699 }
1700 instanceNameIParam(): got(false){}
1701
1702 ~instanceNameIParam(){}
1703
1704 Boolean get(XmlParser& parser, const char * name, Boolean& emptyTag)
1705 {
1706 if (System::strcasecmp(name, "InstanceName") == 0)
1707 {
1708 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
1709 XmlReader::getInstanceNameElement(parser, value);
1710 return true;
1711 }
1712 return false;
1713 }
1714 private:
1715 // hide unused assign, copy constructors
1716 instanceNameIParam(const instanceNameIParam&);
1717 instanceNameIParam& operator = (const instanceNameIParam&);
1718 karl 1.127.2.5 };
1719
1720 // test for "ObjectName" attribute and if found, return CIMObjectPath
1721 // This struct has an extra attribute, the flag isClassNameElement which
1722 // returns true if the objectName was a classPath and not an instance
1723 // path.
1724 // If Xmlreader returns true, this is class only element, no
1725 // key bindings. That state must be set into the request
1726 // message (ex. objectName.isClassElement)
1727 // @param (Optional) Name of IParam. Default is ObjectName. Note
1728 // that pull operations use InstanceName as IParamName.
1729 class objectNameIParam
1730 {
1731 public:
1732 Boolean got;
1733 CIMObjectPath value;
1734 Boolean isClassNameElement;
1735
1736 void iParamFound(Boolean& duplicate)
1737 {
1738 duplicate = got;
1739 karl 1.127.2.5 got = true;
1740 }
1741
1742 // Constructor using default IParam name
1743 objectNameIParam(): got(false), isClassNameElement(false),
1744 iParamName("ObjectName"){}
1745
1746 // Constructor with IParam name included
1747 objectNameIParam(const char* name): got(false), isClassNameElement(false),
1748 iParamName(name){}
1749
1750 ~objectNameIParam(){}
1751
1752 Boolean get(XmlParser& parser, const char * name, Boolean& emptyTag)
1753 {
1754 if (System::strcasecmp(name, iParamName.getCString()) == 0)
1755 {
1756 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
1757 isClassNameElement =
1758 XmlReader::getObjectNameElement(parser, value);
1759 return true;
1760 karl 1.127.2.5 }
1761 return false;
1762 }
1763 private:
1764 String iParamName;
1765 // hide unused assign, copy constructors
1766 objectNameIParam(const objectNameIParam&);
1767 objectNameIParam& operator = (const objectNameIParam&);
1768 };
1769
1770 // test for "PropertyList" attribute and, if found, return property list
1771 // in the value element.
1772 class propertyListIParam
1773 {
1774 public:
1775 Boolean got;
1776 CIMPropertyList value;
1777
1778 void iParamFound(Boolean& duplicate)
1779 {
1780 duplicate = got;
1781 karl 1.127.2.5 got = true;
1782 }
1783
1784 // construct a propertyListIParam object
1785 propertyListIParam(): got(false){}
1786
1787 ~propertyListIParam(){}
1788
1789 Boolean get(XmlParser& parser, const char* name, Boolean& emptyTag)
1790 {
1791 if (System::strcasecmp(name, "PropertyList") == 0)
1792 {
1793 if (!emptyTag)
1794 {
1795 CIMValue pl;
1796 if (XmlReader::getValueArrayElement(parser, CIMTYPE_STRING, pl))
1797 {
1798 Array<String> propertyListArray;
1799 pl.get(propertyListArray);
1800 // NOTE: Cannot use the propertyList.set(...) method
1801 // here because set does not create propertyList tags
1802 karl 1.127.2.5 value.append(propertyListArray);
1803 }
1804 }
1805 return true;
1806 }
1807 return false;
1808 }
1809
1810 // This version of the get function usees the propertyList set function
1811 // to set the property list array into the propertyList object. It
1812 // can only be used for those Operations where the propertylist is NOT
1813 // used by the Server in the response (i.e. getClass and modifyInstance).
1814 //
1815 Boolean getSpecial(XmlParser& parser, const char* name, Boolean& emptyTag)
1816 {
1817 if (System::strcasecmp(name, "PropertyList") == 0)
1818 {
1819 if (!emptyTag)
1820 {
1821 CIMValue pl;
1822 if (XmlReader::getValueArrayElement(parser, CIMTYPE_STRING, pl))
1823 karl 1.127.2.5 {
1824 Array<String> propertyListArray;
1825 pl.get(propertyListArray);
1826 Array<CIMName> cimNameArray;
1827 // Map the strings to CIMNames.
1828 for (Uint32 i = 0; i < propertyListArray.size(); i++)
1829 {
1830 cimNameArray.append(propertyListArray[i]);
1831 }
1832 // use set to put list into property list without
1833 // setting propertyList tags.
1834 value.set(cimNameArray);
1835 }
1836 }
1837 return true;
1838 }
1839 return false;
1840 }
1841 private:
1842 // hide unused default assign, copy constructors
1843 propertyListIParam(const propertyListIParam&);
1844 karl 1.127.2.5 propertyListIParam& operator = (const propertyListIParam&);
1845 };
1846
1847 // Attribute decoder for String Parameters
1848 // The constructor MUST include the attribute name.
1849 // The second defines whether a value is required.
1850 // If true and there is no value, the XmlReader does an exception.
1851 class stringIParam
1852 {
1853 public:
1854 Boolean got;
1855 String value;
1856
1857 // constructor with definition of attribute and default for the
1858 // required flag.
1859 // @param name const char* with name of IParam to match
1860 // @param valueRequired Boolean that defines whether value is required
1861 stringIParam(const char* name, Boolean _valueRequired):
1862 got(false), iParamName(name), valueRequired(_valueRequired){}
1863
1864 ~stringIParam(){}
1865 karl 1.127.2.5
1866 void iParamFound(Boolean& duplicate)
1867 {
1868 duplicate = got;
1869 got = true;
1870 }
1871
1872 // get the attribute if it exists. The attribute name is defined in
1873 // the constructor
1874 // @param parser
1875 // @param testName attribute name from parse.
1876 // @emptyTag returns true if emptyTag returned true from parser
1877 // @return Returns true if testName matches the IParam defined by current
1878 // position in the parser
1879 Boolean get(XmlParser& parser, const char * testName, Boolean& emptyTag)
1880 {
1881 if (System::strcasecmp(iParamName.getCString(), testName) == 0)
1882 {
1883 if (!emptyTag)
1884 {
1885 XmlReader::getStringValueElement(parser, value, valueRequired);
1886 karl 1.127.2.5 }
1887 return true;
1888 }
1889 return false;
1890 }
1891 private:
1892 String iParamName;
1893 Boolean valueRequired;
1894 stringIParam();
1895 stringIParam(const stringIParam&);
1896 stringIParam& operator = (const stringIParam&);
1897 };
1898
1899 // Attribute decoder for Uint32Arg Parameters
1900 // The constructor MUST include the attribute name.
1901 // The second defines whether a value is required.
1902 // If true and there is no value, the XmlReader does an exception.
1903 //
|
1904 karl 1.127.2.6 //// KS_TODO NEED REVIEW ON THIS ONE
|
1905 karl 1.127.2.5 class uint32ArgIParam
1906 {
1907 public:
1908 Boolean got;
1909 Uint32Arg value;
1910
1911 // constructor with definition of iParam name and default for the
1912 // required flag (false). Default value of parameter is NULL if
1913 // no value is supplied.
1914 // @param name const char* with name of IParam to match
1915 uint32ArgIParam(const char* name):
1916 got(false), iParamName(name), valueRequired(false){}
1917
1918 // constructor with definition of iParam name and default for the
1919 // required flag (false). Default value of parameter is integer defined
1920 // by supplied value.
1921 // @param name const char* with name of IParam to match
1922 uint32ArgIParam(const char* name, Uint32 _int):
1923 got(false), value(_int), iParamName(name), valueRequired(false){}
1924
1925 // constructor with definition of attribute and default for the
1926 karl 1.127.2.5 // required flag.
1927 // @param name const char* with name of IParam to match
1928 // @param valueRequired Boolean that defines whether value is required
1929 //// uint32ArgIParam(const char* name, Boolean _valueRequired):
1930 //// got(false), iParamName(name), valueRequired(_valueRequired){}
1931
1932 ~uint32ArgIParam(){}
1933
1934 void iParamFound(Boolean& duplicate)
1935 {
1936 duplicate = got;
1937 got = true;
1938 }
1939
1940 // get the attribute if it exists. The attribute name is defined in
1941 // the constructor
1942 // @param parser
1943 // @param testName attribute name from parse.
1944 // @emptyTag returns true if emptyTag returned true from parser
1945 // @return Returns true if testName matches the IParam defined by current
1946 // position in the parser
1947 karl 1.127.2.5 Boolean get(XmlParser& parser, const char * testName, Boolean& emptyTag)
1948 {
1949 if (valueRequired)
1950 {
1951 XmlReader::rejectNullIParamValue(parser, emptyTag, testName);
1952 }
1953 if (System::strcasecmp(iParamName.getCString(), testName) == 0)
1954 {
1955 XmlReader::getUint32ArgValueElement(parser, value, true);
1956 return true;
1957 }
1958 return false;
1959 }
1960 private:
1961 String iParamName;
1962 Boolean valueRequired;
1963 uint32ArgIParam();
1964 uint32ArgIParam(const uint32ArgIParam&);
1965 uint32ArgIParam& operator = (const uint32ArgIParam&);
1966 };
1967
1968 karl 1.127.2.5 // Attribute decoder for Uint32 Parameters
1969 // The constructor MUST include the attribute name.
1970 // The second defines whether a value is required.
1971 // If true and there is no value, the XmlReader does an exception.
1972 class uint32IParam
1973 {
1974 public:
1975 Boolean got;
1976 Uint32 value;
1977
1978 // constructor with definition of iParam name and default for the
1979 // required flag (false). Default value of parameter is NULL if
1980 // no value is supplied.
1981 // @param name const char* with name of IParam to match
1982 uint32IParam(const char* name):
1983 got(false), iParamName(name), valueRequired(false){}
1984
1985 // constructor with definition of iParam name and default for the
1986 // required flag (false). Default value of parameter is integer defined
1987 // by supplied value.
1988 // @param name const char* with name of IParam to match
1989 karl 1.127.2.5 uint32IParam(const char* name, Uint32 _int):
1990 got(false), value(_int), iParamName(name), valueRequired(false){}
1991
1992 // constructor with definition of attribute and default for the
1993 // required flag.
1994 // @param name const char* with name of IParam to match
1995 // @param valueRequired Boolean that defines whether value is required
1996 //// uint32IParam(const char* name, Boolean _valueRequired):
1997 //// got(false), iParamName(name), valueRequired(_valueRequired){}
1998
1999 ~uint32IParam(){}
2000
2001 void iParamFound(Boolean& duplicate)
2002 {
2003 duplicate = got;
2004 got = true;
2005 }
2006
2007 // get the attribute if it exists. The attribute name is defined in
2008 // the constructor
2009 // @param parser
2010 karl 1.127.2.5 // @param testName attribute name from parse.
2011 // @emptyTag returns true if emptyTag returned true from parser
2012 // @return Returns true if testName matches the IParam defined by current
2013 // position in the parser
2014 Boolean get(XmlParser& parser, const char * testName, Boolean& emptyTag)
2015 {
2016 if (valueRequired)
2017 {
2018 XmlReader::rejectNullIParamValue(parser, emptyTag, testName);
2019 }
2020 if (System::strcasecmp(iParamName.getCString(), testName) == 0)
2021 {
2022 XmlReader::getUint32ValueElement(parser, value, true);
2023 return true;
2024 }
2025 return false;
2026 }
2027 private:
2028 String iParamName;
2029 Boolean valueRequired;
2030 uint32IParam();
2031 karl 1.127.2.5 uint32IParam(const uint32IParam&);
2032 uint32IParam& operator = (const uint32IParam&);
2033 };
2034
2035 /************************************************************************
2036 **
2037 ** Common functions used by the decoders to avoid duplicate code.
2038 **
2039 **************************************************************************/
2040 // test for valid end of XML and duplicate parameters on input
2041 // This function returns if OK or executes appropriate exceptions if there
2042 // is either a duplicate (duplicateParameter == true) or the
2043 // end tag IPARAMVALUE is not found.
2044 void _checkMissingEndTagOrDuplicateParamValue(
2045 XmlParser& parser, Boolean duplicateParameter, Boolean emptyTag)
2046 {
2047 if (!emptyTag)
2048 {
2049 XmlReader::expectEndTag(parser, "IPARAMVALUE");
2050 }
2051
2052 karl 1.127.2.5 if (duplicateParameter)
2053 {
2054 _throwCIMExceptionDuplicateParameter();
2055 }
2056 }
2057
2058 // test if Required paramters exist (i.e. the got variable is
2059 // true. Generates exception if exist == false
2060 void _testRequiredParametersExist(Boolean exist)
2061 {
2062 if (!exist)
2063 {
2064 _throwCIMExceptionInvalidParameter();
2065 }
2066 }
2067 /**************************************************************************
2068 **
2069 ** Decode each CIMOperation type, processing the parameters for that type
2070 ** and producing either a CIMMessage of the appropriate type or
2071 ** an exception.
2072 **
2073 karl 1.127.2.5 ***************************************************************************/
|
2074 mike 1.2
|
2075 kumpf 1.104 CIMCreateClassRequestMessage*
2076 CIMOperationRequestDecoder::decodeCreateClassRequest(
2077 Uint32 queueId,
2078 XmlParser& parser,
2079 const String& messageId,
2080 const CIMNamespaceName& nameSpace)
2081 {
2082 STAT_GETSTARTTIME
2083
2084 CIMClass newClass;
|
2085 karl 1.127.2.5 Boolean gotNewClass = false;
2086
|
2087 kumpf 1.104 Boolean emptyTag;
|
2088 karl 1.127.2.5 Boolean duplicateParameter = false;
|
2089 kumpf 1.104
2090 for (const char* name;
2091 XmlReader::getIParamValueTag(parser, name, emptyTag); )
2092 {
2093 if (System::strcasecmp(name, "NewClass") == 0)
2094 {
2095 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
|
2096 kumpf 1.106 if (!XmlReader::getClassElement(parser, newClass))
2097 {
|
2098 karl 1.127.2.5 _throwCIMExceptionInvalidParameter("NewClass");
|
2099 kumpf 1.106 }
|
2100 karl 1.127.2.5 duplicateParameter = gotNewClass;
2101 gotNewClass = true;
|
2102 kumpf 1.104 }
2103 else
2104 {
|
2105 karl 1.127.2.5 _throwCIMExceptionInvalidIParamName();
|
2106 kumpf 1.104 }
|
2107 sage 1.41
|
2108 karl 1.127.2.5 // generate exception if endtag error or duplicate attributes
2109 _checkMissingEndTagOrDuplicateParamValue(
2110 parser, duplicateParameter, emptyTag);
|
2111 kumpf 1.104 }
2112
|
2113 karl 1.127.2.5 _testRequiredParametersExist(gotNewClass);
|
2114 kumpf 1.104
2115 AutoPtr<CIMCreateClassRequestMessage> request(
2116 new CIMCreateClassRequestMessage(
2117 messageId,
2118 nameSpace,
2119 newClass,
2120 QueueIdStack(queueId, _returnQueueId)));
2121
2122 STAT_SERVERSTART
2123
2124 return request.release();
|
2125 mike 1.2 }
2126
2127 CIMGetClassRequestMessage* CIMOperationRequestDecoder::decodeGetClassRequest(
|
2128 kumpf 1.104 Uint32 queueId,
2129 XmlParser& parser,
2130 const String& messageId,
2131 const CIMNamespaceName& nameSpace)
2132 {
2133 STAT_GETSTARTTIME
2134
|
2135 karl 1.127.2.5 // GetClass Parameters
2136 classNameIParam className("ClassName");
2137 booleanIParam localOnly("localOnly",true);
2138 booleanIParam includeQualifiers("IncludeQualifiers", true);
2139 booleanIParam includeClassOrigin("IncludeClassOrigin");
2140 propertyListIParam propertyList;
2141
|
2142 kumpf 1.104 Boolean duplicateParameter = false;
2143 Boolean emptyTag;
2144
2145 for (const char* name;
2146 XmlReader::getIParamValueTag(parser, name, emptyTag); )
2147 {
|
2148 karl 1.127.2.5 if(className.get(parser, name, emptyTag))
|
2149 kumpf 1.104 {
|
2150 karl 1.127.2.5 className.iParamFound(duplicateParameter);
|
2151 kumpf 1.104 }
|
2152 karl 1.127.2.5 else if(localOnly.get(parser, name, emptyTag))
|
2153 kumpf 1.104 {
|
2154 karl 1.127.2.5 localOnly.iParamFound(duplicateParameter);
|
2155 kumpf 1.104 }
|
2156 karl 1.127.2.5 else if(includeQualifiers.get(parser, name, emptyTag))
|
2157 kumpf 1.104 {
|
2158 karl 1.127.2.5 includeQualifiers.iParamFound(duplicateParameter);
|
2159 kumpf 1.104 }
|
2160 karl 1.127.2.5 else if(includeClassOrigin.get(parser, name, emptyTag))
|
2161 kumpf 1.104 {
|
2162 karl 1.127.2.5 includeClassOrigin.iParamFound(duplicateParameter);
|
2163 kumpf 1.104 }
|
2164 karl 1.127.2.5 else if(propertyList.getSpecial(parser, name, emptyTag))
|
2165 kumpf 1.104 {
|
2166 karl 1.127.2.5 propertyList.iParamFound(duplicateParameter);
|
2167 kumpf 1.104 }
2168 else
2169 {
|
2170 karl 1.127.2.5 _throwCIMExceptionInvalidIParamName();
|
2171 kumpf 1.104 }
|
2172 karl 1.127.2.5 // generate exception if endtag error or duplicate attributes
2173 _checkMissingEndTagOrDuplicateParamValue(
2174 parser, duplicateParameter, emptyTag);
|
2175 kumpf 1.104 }
2176
|
2177 karl 1.127.2.5 // test for required parameters
2178 _testRequiredParametersExist(className.got);
|
2179 kumpf 1.104
|
2180 karl 1.127.2.5 // Build message
|
2181 kumpf 1.104 AutoPtr<CIMGetClassRequestMessage> request(new CIMGetClassRequestMessage(
2182 messageId,
2183 nameSpace,
|
2184 karl 1.127.2.5 className.value,
2185 localOnly.value,
2186 includeQualifiers.value,
2187 includeClassOrigin.value,
2188 propertyList.value,
|
2189 kumpf 1.104 QueueIdStack(queueId, _returnQueueId)));
2190
2191 STAT_SERVERSTART
2192
2193 return request.release();
2194 }
2195
2196 CIMModifyClassRequestMessage*
2197 CIMOperationRequestDecoder::decodeModifyClassRequest(
2198 Uint32 queueId,
2199 XmlParser& parser,
2200 const String& messageId,
2201 const CIMNamespaceName& nameSpace)
2202 {
2203 STAT_GETSTARTTIME
2204
2205 CIMClass modifiedClass;
2206 Boolean gotClass = false;
|
2207 karl 1.127.2.5
|
2208 kumpf 1.104 Boolean emptyTag;
|
2209 karl 1.127.2.5 Boolean duplicateParameter = false;
|
2210 kumpf 1.104
2211 for (const char* name;
2212 XmlReader::getIParamValueTag(parser, name, emptyTag); )
2213 {
2214 if (System::strcasecmp(name, "ModifiedClass") == 0)
2215 {
2216 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
|
2217 kumpf 1.106 if (!XmlReader::getClassElement(parser, modifiedClass))
2218 {
|
2219 karl 1.127.2.5 _throwCIMExceptionInvalidParameter("ModifiedClass");
|
2220 kumpf 1.106 }
|
2221 kumpf 1.104 duplicateParameter = gotClass;
2222 gotClass = true;
2223 }
2224 else
2225 {
|
2226 karl 1.127.2.5 _throwCIMExceptionInvalidIParamName();
|
2227 kumpf 1.104 }
2228
|
2229 karl 1.127.2.5 // generate exception if endtag error or duplicate attributes
2230 _checkMissingEndTagOrDuplicateParamValue(
2231 parser, duplicateParameter, emptyTag);
|
2232 kumpf 1.104 }
2233
|
2234 karl 1.127.2.5 _testRequiredParametersExist(gotClass);
|
2235 kumpf 1.104
2236 AutoPtr<CIMModifyClassRequestMessage> request(
2237 new CIMModifyClassRequestMessage(
2238 messageId,
2239 nameSpace,
2240 modifiedClass,
2241 QueueIdStack(queueId, _returnQueueId)));
2242
2243 STAT_SERVERSTART
2244
2245 return request.release();
2246 }
2247
2248 CIMEnumerateClassNamesRequestMessage*
2249 CIMOperationRequestDecoder::decodeEnumerateClassNamesRequest(
2250 Uint32 queueId,
2251 XmlParser& parser,
2252 const String& messageId,
2253 const CIMNamespaceName& nameSpace)
2254 {
2255 STAT_GETSTARTTIME
2256 kumpf 1.104
|
2257 karl 1.127.2.5 classNameIParam className("ClassName");
2258 booleanIParam deepInheritance("DeepInheritance");
2259
|
2260 kumpf 1.104 Boolean duplicateParameter = false;
2261 Boolean emptyTag;
2262
2263 for (const char* name;
2264 XmlReader::getIParamValueTag(parser, name, emptyTag); )
2265 {
|
2266 karl 1.127.2.5 if(className.getOptional(parser, name, emptyTag))
|
2267 kumpf 1.104 {
|
2268 karl 1.127.2.5 className.iParamFound(duplicateParameter);
|
2269 kumpf 1.104 }
|
2270 karl 1.127.2.5 else if(deepInheritance.get(parser, name, emptyTag))
|
2271 kumpf 1.104 {
|
2272 karl 1.127.2.5 deepInheritance.iParamFound(duplicateParameter);
|
2273 kumpf 1.104 }
2274 else
2275 {
|
2276 karl 1.127.2.5 _throwCIMExceptionInvalidIParamName();
|
2277 kumpf 1.104 }
2278
|
2279 karl 1.127.2.5 // generate exception if endtag error or duplicate attributes
2280 _checkMissingEndTagOrDuplicateParamValue(
2281 parser, duplicateParameter, emptyTag);
|
2282 kumpf 1.104 }
2283
|
2284 karl 1.127.2.5 // NOTE: className not required for this operation
2285
|
2286 kumpf 1.104 AutoPtr<CIMEnumerateClassNamesRequestMessage> request(
2287 new CIMEnumerateClassNamesRequestMessage(
2288 messageId,
2289 nameSpace,
|
2290 karl 1.127.2.5 className.value,
2291 deepInheritance.value,
|
2292 kumpf 1.104 QueueIdStack(queueId, _returnQueueId)));
2293
2294 STAT_SERVERSTART
2295
2296 return request.release();
2297 }
2298
2299 CIMEnumerateClassesRequestMessage*
2300 CIMOperationRequestDecoder::decodeEnumerateClassesRequest(
2301 Uint32 queueId,
2302 XmlParser& parser,
2303 const String& messageId,
2304 const CIMNamespaceName& nameSpace)
2305 {
2306 STAT_GETSTARTTIME
2307
|
2308 karl 1.127.2.5 // EnumerateClasses Parameters
2309 classNameIParam className("ClassName");
2310 booleanIParam deepInheritance("deepInheritance");
2311 booleanIParam localOnly("localOnly",true);
2312 booleanIParam includeQualifiers("IncludeQualifiers", true);
2313 booleanIParam includeClassOrigin("IncludeClassOrigin");
2314
|
2315 kumpf 1.104 Boolean duplicateParameter = false;
2316 Boolean emptyTag;
2317
2318 for (const char* name;
2319 XmlReader::getIParamValueTag(parser, name, emptyTag); )
2320 {
|
2321 karl 1.127.2.5 if(className.getOptional(parser, name, emptyTag))
|
2322 kumpf 1.104 {
|
2323 karl 1.127.2.5 className.iParamFound(duplicateParameter);
|
2324 kumpf 1.104 }
|
2325 karl 1.127.2.5 else if(deepInheritance.get(parser, name, emptyTag))
|
2326 kumpf 1.104 {
|
2327 karl 1.127.2.5 deepInheritance.iParamFound(duplicateParameter);
|
2328 kumpf 1.104 }
|
2329 karl 1.127.2.5 else if(localOnly.get(parser, name, emptyTag))
|
2330 kumpf 1.104 {
|
2331 karl 1.127.2.5 localOnly.iParamFound(duplicateParameter);
|
2332 kumpf 1.104 }
|
2333 karl 1.127.2.5 else if(includeQualifiers.get(parser, name, emptyTag))
|
2334 kumpf 1.104 {
|
2335 karl 1.127.2.5 includeQualifiers.iParamFound(duplicateParameter);
|
2336 kumpf 1.104 }
|
2337 karl 1.127.2.5 else if(includeClassOrigin.get(parser, name, emptyTag))
|
2338 kumpf 1.104 {
|
2339 karl 1.127.2.5 includeClassOrigin.iParamFound(duplicateParameter);
|
2340 kumpf 1.104 }
2341 else
2342 {
|
2343 karl 1.127.2.5 _throwCIMExceptionInvalidIParamName();
|
2344 kumpf 1.104 }
2345
|
2346 karl 1.127.2.5 // generate exception if endtag error or duplicate attributes
2347 _checkMissingEndTagOrDuplicateParamValue(
2348 parser, duplicateParameter, emptyTag);
|
2349 kumpf 1.104 }
2350
|
2351 karl 1.127.2.5 // NOTE: Class name not required for this enumerate.
2352
|
2353 kumpf 1.104 AutoPtr<CIMEnumerateClassesRequestMessage> request(
2354 new CIMEnumerateClassesRequestMessage(
2355 messageId,
2356 nameSpace,
|
2357 karl 1.127.2.5 className.value,
2358 deepInheritance.value,
2359 localOnly.value,
2360 includeQualifiers.value,
2361 includeClassOrigin.value,
|
2362 kumpf 1.104 QueueIdStack(queueId, _returnQueueId)));
2363
2364 STAT_SERVERSTART
2365
2366 return request.release();
2367 }
2368
2369 CIMDeleteClassRequestMessage*
2370 CIMOperationRequestDecoder::decodeDeleteClassRequest(
2371 Uint32 queueId,
2372 XmlParser& parser,
2373 const String& messageId,
2374 const CIMNamespaceName& nameSpace)
2375 {
2376 STAT_GETSTARTTIME
2377
|
2378 karl 1.127.2.5 classNameIParam className("ClassName");
2379
|
2380 kumpf 1.104 Boolean duplicateParameter = false;
2381 Boolean emptyTag;
2382
2383 for (const char* name;
2384 XmlReader::getIParamValueTag(parser, name, emptyTag); )
2385 {
|
2386 karl 1.127.2.5 if(className.get(parser, name, emptyTag))
|
2387 kumpf 1.104 {
|
2388 karl 1.127.2.5 className.iParamFound(duplicateParameter);
|
2389 kumpf 1.104 }
2390 else
2391 {
|
2392 karl 1.127.2.5 _throwCIMExceptionInvalidIParamName();
|
2393 kumpf 1.104 }
2394
|
2395 karl 1.127.2.5 // generate exception if endtag error or duplicate attributes
2396 _checkMissingEndTagOrDuplicateParamValue(
2397 parser, duplicateParameter, emptyTag);
|
2398 kumpf 1.104 }
2399
|
2400 karl 1.127.2.5 _testRequiredParametersExist(className.got);
|
2401 kumpf 1.104
2402 AutoPtr<CIMDeleteClassRequestMessage> request(
2403 new CIMDeleteClassRequestMessage(
2404 messageId,
2405 nameSpace,
|
2406 karl 1.127.2.5 className.value,
|
2407 kumpf 1.104 QueueIdStack(queueId, _returnQueueId)));
2408
2409 STAT_SERVERSTART
2410
2411 return request.release();
2412 }
2413
2414 CIMCreateInstanceRequestMessage*
2415 CIMOperationRequestDecoder::decodeCreateInstanceRequest(
2416 Uint32 queueId,
2417 XmlParser& parser,
2418 const String& messageId,
2419 const CIMNamespaceName& nameSpace)
2420 {
2421 STAT_GETSTARTTIME
2422
2423 CIMInstance newInstance;
2424 Boolean gotInstance = false;
|
2425 karl 1.127.2.5
|
2426 kumpf 1.104 Boolean emptyTag;
|
2427 karl 1.127.2.5 Boolean duplicateParameter = false;
|
2428 kumpf 1.104
2429 for (const char* name;
2430 XmlReader::getIParamValueTag(parser, name, emptyTag); )
2431 {
2432 if (System::strcasecmp(name, "NewInstance") == 0)
2433 {
2434 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2435 XmlReader::getInstanceElement(parser, newInstance);
2436 duplicateParameter = gotInstance;
2437 gotInstance = true;
2438 }
2439 else
2440 {
|
2441 karl 1.127.2.5 _throwCIMExceptionInvalidIParamName();
|
2442 kumpf 1.104 }
2443
|
2444 karl 1.127.2.5 // generate exception if endtag error or duplicate attributes
2445 _checkMissingEndTagOrDuplicateParamValue(
2446 parser, duplicateParameter, emptyTag);
|
2447 kumpf 1.104 }
2448
|
2449 karl 1.127.2.5
2450 _testRequiredParametersExist(gotInstance);
|
2451 kumpf 1.104
2452 AutoPtr<CIMCreateInstanceRequestMessage> request(
2453 new CIMCreateInstanceRequestMessage(
2454 messageId,
2455 nameSpace,
2456 newInstance,
2457 QueueIdStack(queueId, _returnQueueId)));
2458
2459 STAT_SERVERSTART
2460
2461 return request.release();
2462 }
2463
2464 CIMGetInstanceRequestMessage*
2465 CIMOperationRequestDecoder::decodeGetInstanceRequest(
2466 Uint32 queueId,
2467 XmlParser& parser,
2468 const String& messageId,
2469 const CIMNamespaceName& nameSpace)
2470 {
2471 STAT_GETSTARTTIME
2472 kumpf 1.104
|
2473 karl 1.127.2.5 instanceNameIParam instanceName;
2474 // This attribute is accepted for compatibility reasons, but is
2475 // not honored because it is deprecated.
2476 booleanIParam localOnly("localOnly",true);
2477 booleanIParam includeQualifiers("IncludeQualifiers");
2478 booleanIParam includeClassOrigin("IncludeClassOrigin");
2479 propertyListIParam propertyList;
2480
|
2481 kumpf 1.104 Boolean duplicateParameter = false;
2482 Boolean emptyTag;
2483
2484 for (const char* name;
2485 XmlReader::getIParamValueTag(parser, name, emptyTag); )
2486 {
|
2487 karl 1.127.2.5 if(instanceName.get(parser, name, emptyTag))
|
2488 kumpf 1.104 {
|
2489 karl 1.127.2.5 instanceName.iParamFound(duplicateParameter);
|
2490 kumpf 1.104 }
|
2491 karl 1.127.2.5 // localOnly is accepted for compatibility reasons, but is
2492 // not honored because it is deprecated.
2493 else if(localOnly.get(parser, name, emptyTag))
|
2494 kumpf 1.104 {
|
2495 karl 1.127.2.5 localOnly.iParamFound(duplicateParameter);
|
2496 kumpf 1.104 }
|
2497 karl 1.127.2.5 else if(includeQualifiers.get(parser, name, emptyTag))
|
2498 kumpf 1.104 {
|
2499 karl 1.127.2.5 includeQualifiers.iParamFound(duplicateParameter);
|
2500 kumpf 1.104 }
|
2501 karl 1.127.2.5 else if(includeClassOrigin.get(parser, name, emptyTag))
|
2502 kumpf 1.104 {
|
2503 karl 1.127.2.5 includeClassOrigin.iParamFound(duplicateParameter);
|
2504 kumpf 1.104 }
|
2505 karl 1.127.2.5 else if(propertyList.get(parser, name, emptyTag))
|
2506 kumpf 1.104 {
|
2507 karl 1.127.2.5 propertyList.iParamFound(duplicateParameter);
|
2508 kumpf 1.104 }
2509 else
2510 {
|
2511 karl 1.127.2.5 _throwCIMExceptionInvalidIParamName();
|
2512 kumpf 1.104 }
2513
|
2514 karl 1.127.2.5 // generate exception if endtag error or duplicate attributes
2515 _checkMissingEndTagOrDuplicateParamValue(
2516 parser, duplicateParameter, emptyTag);
|
2517 kumpf 1.104 }
2518
|
2519 karl 1.127.2.5 _testRequiredParametersExist(instanceName.got);
|
2520 kumpf 1.104
2521 AutoPtr<CIMGetInstanceRequestMessage> request(
2522 new CIMGetInstanceRequestMessage(
2523 messageId,
2524 nameSpace,
|
2525 karl 1.127.2.5 instanceName.value,
|
2526 h.sterling 1.97 #ifdef PEGASUS_DISABLE_INSTANCE_QUALIFIERS
|
2527 kumpf 1.104 false,
|
2528 h.sterling 1.97 #else
|
2529 karl 1.127.2.5 includeQualifiers.value,
|
2530 h.sterling 1.97 #endif
|
2531 karl 1.127.2.5 includeClassOrigin.value,
2532 propertyList.value,
|
2533 kumpf 1.104 QueueIdStack(queueId, _returnQueueId)));
2534
2535 STAT_SERVERSTART
2536
2537 return request.release();
2538 }
2539
|
2540 karl 1.127.2.5
|
2541 kumpf 1.104 CIMModifyInstanceRequestMessage*
2542 CIMOperationRequestDecoder::decodeModifyInstanceRequest(
2543 Uint32 queueId,
2544 XmlParser& parser,
2545 const String& messageId,
2546 const CIMNamespaceName& nameSpace)
2547 {
2548 STAT_GETSTARTTIME
2549
2550 CIMInstance modifiedInstance;
2551 Boolean gotInstance = false;
|
2552 karl 1.127.2.5
2553 booleanIParam includeQualifiers("IncludeQualifiers", true);
2554 propertyListIParam propertyList;
2555
|
2556 kumpf 1.104 Boolean emptyTag;
|
2557 karl 1.127.2.5 Boolean duplicateParameter = false;
|
2558 kumpf 1.104
2559 for (const char* name;
2560 XmlReader::getIParamValueTag(parser, name, emptyTag); )
2561 {
2562 if (System::strcasecmp(name, "ModifiedInstance") == 0)
2563 {
2564 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2565 XmlReader::getNamedInstanceElement(parser, modifiedInstance);
2566 duplicateParameter = gotInstance;
2567 gotInstance = true;
2568 }
|
2569 karl 1.127.2.5 else if(includeQualifiers.get(parser, name, emptyTag))
|
2570 kumpf 1.104 {
|
2571 karl 1.127.2.5 includeQualifiers.iParamFound(duplicateParameter);
|
2572 kumpf 1.104 }
|
2573 karl 1.127.2.5 else if(propertyList.getSpecial(parser, name, emptyTag))
|
2574 kumpf 1.104 {
|
2575 karl 1.127.2.5 propertyList.iParamFound(duplicateParameter);
|
2576 kumpf 1.104 }
2577 else
2578 {
|
2579 karl 1.127.2.5 _throwCIMExceptionInvalidIParamName();
|
2580 kumpf 1.104 }
2581
|
2582 karl 1.127.2.5 _checkMissingEndTagOrDuplicateParamValue(
2583 parser, duplicateParameter, emptyTag);
|
2584 kumpf 1.104 }
2585
|
2586 karl 1.127.2.5 _testRequiredParametersExist(gotInstance);
|
2587 kumpf 1.104
2588 AutoPtr<CIMModifyInstanceRequestMessage> request(
2589 new CIMModifyInstanceRequestMessage(
2590 messageId,
2591 nameSpace,
2592 modifiedInstance,
|
2593 karl 1.127.2.5 includeQualifiers.value,
2594 propertyList.value,
|
2595 kumpf 1.104 QueueIdStack(queueId, _returnQueueId)));
2596
2597 STAT_SERVERSTART
2598
2599 return request.release();
2600 }
2601
2602 CIMEnumerateInstancesRequestMessage*
2603 CIMOperationRequestDecoder::decodeEnumerateInstancesRequest(
2604 Uint32 queueId,
2605 XmlParser& parser,
2606 const String& messageId,
2607 const CIMNamespaceName& nameSpace)
2608 {
2609 STAT_GETSTARTTIME
2610
|
2611 karl 1.127.2.5 // EnumerateInstance Parameters
2612 classNameIParam className("ClassName");
2613 booleanIParam deepInheritance("DeepInheritance", true);
2614 // localOnly is accepted for compatibility reasons, but is
2615 // not honored because it is deprecated.
2616 booleanIParam localOnly("localOnly", true);
2617 booleanIParam includeQualifiers("IncludeQualifiers");
2618 booleanIParam includeClassOrigin("IncludeClassOrigin");
2619 propertyListIParam propertyList;
2620
|
2621 kumpf 1.104 Boolean duplicateParameter = false;
2622 Boolean emptyTag;
2623
2624 for (const char* name;
2625 XmlReader::getIParamValueTag(parser, name, emptyTag); )
2626 {
|
2627 karl 1.127.2.5 if(className.get(parser, name, emptyTag))
|
2628 kumpf 1.104 {
|
2629 karl 1.127.2.5 className.iParamFound(duplicateParameter);
|
2630 kumpf 1.104 }
|
2631 karl 1.127.2.5 else if(deepInheritance.get(parser, name, emptyTag))
|
2632 kumpf 1.104 {
|
2633 karl 1.127.2.5 deepInheritance.iParamFound(duplicateParameter);
|
2634 kumpf 1.104 }
|
2635 karl 1.127.2.5 // This attribute is accepted for compatibility reasons, but is
2636 // not honored because it is deprecated.
2637 else if(localOnly.get(parser, name, emptyTag))
|
2638 kumpf 1.104 {
|
2639 karl 1.127.2.5 localOnly.iParamFound(duplicateParameter);
|
2640 kumpf 1.104 }
|
2641 karl 1.127.2.5 else if(includeQualifiers.get(parser, name, emptyTag))
|
2642 kumpf 1.104 {
|
2643 karl 1.127.2.5 includeQualifiers.iParamFound(duplicateParameter);
|
2644 kumpf 1.104 }
|
2645 karl 1.127.2.5 else if(includeClassOrigin.get(parser, name, emptyTag))
|
2646 kumpf 1.104 {
|
2647 karl 1.127.2.5 includeClassOrigin.iParamFound(duplicateParameter);
|
2648 kumpf 1.104 }
|
2649 karl 1.127.2.5 else if(propertyList.get(parser, name, emptyTag))
|
2650 kumpf 1.104 {
|
2651 karl 1.127.2.5 propertyList.iParamFound(duplicateParameter);
|
2652 kumpf 1.104 }
|
2653 karl 1.127.2.5 else
|
2654 kumpf 1.104 {
|
2655 karl 1.127.2.5 _throwCIMExceptionInvalidIParamName();
|
2656 kumpf 1.104 }
2657
|
2658 karl 1.127.2.5 // generate exception if endtag error or duplicate attributes
2659 _checkMissingEndTagOrDuplicateParamValue(
2660 parser, duplicateParameter, emptyTag);
|
2661 kumpf 1.104 }
2662
|
2663 karl 1.127.2.5 _testRequiredParametersExist(className.got);
|
2664 karl 1.127.2.3
|
2665 kumpf 1.104 AutoPtr<CIMEnumerateInstancesRequestMessage> request(
2666 new CIMEnumerateInstancesRequestMessage(
2667 messageId,
2668 nameSpace,
|
2669 karl 1.127.2.5 className.value,
2670 deepInheritance.value,
|
2671 h.sterling 1.97 #ifdef PEGASUS_DISABLE_INSTANCE_QUALIFIERS
|
2672 kumpf 1.104 false,
|
2673 h.sterling 1.97 #else
|
2674 karl 1.127.2.5 includeQualifiers.value,
|
2675 h.sterling 1.97 #endif
|
2676 karl 1.127.2.5 includeClassOrigin.value,
2677 propertyList.value,
|
2678 kumpf 1.104 QueueIdStack(queueId, _returnQueueId)));
2679
2680 STAT_SERVERSTART
2681
2682 return request.release();
2683 }
2684
2685 CIMEnumerateInstanceNamesRequestMessage*
2686 CIMOperationRequestDecoder::decodeEnumerateInstanceNamesRequest(
2687 Uint32 queueId,
2688 XmlParser& parser,
2689 const String& messageId,
2690 const CIMNamespaceName& nameSpace)
2691 {
2692 STAT_GETSTARTTIME
2693
|
2694 karl 1.127.2.5 classNameIParam className("ClassName");
2695
|
2696 kumpf 1.104 Boolean duplicateParameter = false;
2697 Boolean emptyTag;
2698
2699 for (const char* name;
2700 XmlReader::getIParamValueTag(parser, name, emptyTag); )
2701 {
|
2702 karl 1.127.2.5 if(className.get(parser, name, emptyTag))
|
2703 kumpf 1.104 {
|
2704 karl 1.127.2.5 className.iParamFound(duplicateParameter);
|
2705 kumpf 1.104 }
2706 else
2707 {
|
2708 karl 1.127.2.5 _throwCIMExceptionInvalidIParamName();
|
2709 kumpf 1.104 }
2710
|
2711 karl 1.127.2.5 // generate exception if endtag error or duplicate attributes
2712 _checkMissingEndTagOrDuplicateParamValue(
2713 parser, duplicateParameter, emptyTag);
|
2714 kumpf 1.104 }
2715
|
2716 karl 1.127.2.5 _testRequiredParametersExist(className.got);
|
2717 kumpf 1.104
2718 AutoPtr<CIMEnumerateInstanceNamesRequestMessage> request(
2719 new CIMEnumerateInstanceNamesRequestMessage(
2720 messageId,
2721 nameSpace,
|
2722 karl 1.127.2.5 className.value,
|
2723 kumpf 1.104 QueueIdStack(queueId, _returnQueueId)));
2724
2725 STAT_SERVERSTART
2726
2727 return request.release();
2728 }
2729
2730 CIMDeleteInstanceRequestMessage*
2731 CIMOperationRequestDecoder::decodeDeleteInstanceRequest(
2732 Uint32 queueId,
2733 XmlParser& parser,
2734 const String& messageId,
2735 const CIMNamespaceName& nameSpace)
2736 {
2737 STAT_GETSTARTTIME
2738
|
2739 karl 1.127.2.5 instanceNameIParam instanceName;
2740
|
2741 kumpf 1.104 Boolean duplicateParameter = false;
2742 Boolean emptyTag;
2743
2744 for (const char* name;
2745 XmlReader::getIParamValueTag(parser, name, emptyTag); )
2746 {
|
2747 karl 1.127.2.5 if(instanceName.get(parser, name, emptyTag))
|
2748 kumpf 1.104 {
|
2749 karl 1.127.2.5 instanceName.iParamFound(duplicateParameter);
|
2750 kumpf 1.104 }
2751 else
2752 {
|
2753 karl 1.127.2.5 _throwCIMExceptionInvalidIParamName();
|
2754 kumpf 1.104 }
2755
|
2756 karl 1.127.2.5 // generate exception if endtag error or duplicate attributes
2757 _checkMissingEndTagOrDuplicateParamValue(
2758 parser, duplicateParameter, emptyTag);
|
2759 kumpf 1.104 }
2760
|
2761 karl 1.127.2.5 _testRequiredParametersExist(instanceName.got);
|
2762 kumpf 1.104
2763 AutoPtr<CIMDeleteInstanceRequestMessage> request(
2764 new CIMDeleteInstanceRequestMessage(
2765 messageId,
2766 nameSpace,
|
2767 karl 1.127.2.5 instanceName.value,
|
2768 kumpf 1.104 QueueIdStack(queueId, _returnQueueId)));
2769
2770 STAT_SERVERSTART
2771
2772 return request.release();
2773 }
2774
2775 CIMSetQualifierRequestMessage*
2776 CIMOperationRequestDecoder::decodeSetQualifierRequest(
2777 Uint32 queueId,
2778 XmlParser& parser,
2779 const String& messageId,
2780 const CIMNamespaceName& nameSpace)
2781 {
2782 STAT_GETSTARTTIME
2783
2784 CIMQualifierDecl qualifierDeclaration;
2785 Boolean duplicateParameter = false;
2786 Boolean gotQualifierDeclaration = false;
2787 Boolean emptyTag;
2788
2789 kumpf 1.104 for (const char* name;
2790 XmlReader::getIParamValueTag(parser, name, emptyTag); )
2791 {
2792 if (System::strcasecmp(name, "QualifierDeclaration") == 0)
2793 {
2794 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2795 XmlReader::getQualifierDeclElement(parser, qualifierDeclaration);
2796 duplicateParameter = gotQualifierDeclaration;
2797 gotQualifierDeclaration = true;
2798 }
2799 else
2800 {
|
2801 karl 1.127.2.5 _throwCIMExceptionInvalidIParamName();
|
2802 kumpf 1.104 }
2803
|
2804 karl 1.127.2.5 // generate exception if endtag error or duplicate attributes
2805 _checkMissingEndTagOrDuplicateParamValue(
2806 parser, duplicateParameter, emptyTag);
|
2807 kumpf 1.104 }
2808
|
2809 karl 1.127.2.5 _testRequiredParametersExist(gotQualifierDeclaration);
|
2810 kumpf 1.104
2811 AutoPtr<CIMSetQualifierRequestMessage> request(
2812 new CIMSetQualifierRequestMessage(
2813 messageId,
2814 nameSpace,
2815 qualifierDeclaration,
2816 QueueIdStack(queueId, _returnQueueId)));
2817
2818 STAT_SERVERSTART
2819
2820 return request.release();
2821 }
2822
2823 CIMGetQualifierRequestMessage*
2824 CIMOperationRequestDecoder::decodeGetQualifierRequest(
2825 Uint32 queueId,
2826 XmlParser& parser,
2827 const String& messageId,
2828 const CIMNamespaceName& nameSpace)
2829 {
2830 STAT_GETSTARTTIME
2831 kumpf 1.104
2832 String qualifierNameString;
2833 CIMName qualifierName;
2834 Boolean duplicateParameter = false;
2835 Boolean gotQualifierName = false;
2836 Boolean emptyTag;
2837
2838 for (const char* name;
2839 XmlReader::getIParamValueTag(parser, name, emptyTag); )
2840 {
2841 if (System::strcasecmp(name, "QualifierName") == 0)
2842 {
2843 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2844 XmlReader::getStringValueElement(parser, qualifierNameString, true);
2845 qualifierName = qualifierNameString;
2846 duplicateParameter = gotQualifierName;
2847 gotQualifierName = true;
2848 }
2849 else
2850 {
|
2851 karl 1.127.2.5 _throwCIMExceptionInvalidIParamName();
|
2852 kumpf 1.104 }
2853
|
2854 karl 1.127.2.5 // generate exception if endtag error or duplicate attributes
2855 _checkMissingEndTagOrDuplicateParamValue(
2856 parser, duplicateParameter, emptyTag);
|
2857 kumpf 1.104 }
2858
|
2859 karl 1.127.2.5 _testRequiredParametersExist(gotQualifierName);
|
2860 kumpf 1.104
2861 AutoPtr<CIMGetQualifierRequestMessage> request(
2862 new CIMGetQualifierRequestMessage(
2863 messageId,
2864 nameSpace,
2865 qualifierName,
2866 QueueIdStack(queueId, _returnQueueId)));
2867
2868 STAT_SERVERSTART
2869
2870 return request.release();
2871 }
2872
2873 CIMEnumerateQualifiersRequestMessage*
2874 CIMOperationRequestDecoder::decodeEnumerateQualifiersRequest(
2875 Uint32 queueId,
2876 XmlParser& parser,
2877 const String& messageId,
2878 const CIMNamespaceName& nameSpace)
2879 {
2880 STAT_GETSTARTTIME
2881 kumpf 1.104 Boolean emptyTag;
2882
2883 for (const char* name;
2884 XmlReader::getIParamValueTag(parser, name, emptyTag); )
2885 {
2886 // No IPARAMVALUEs are defined for this operation
|
2887 karl 1.127.2.5 _throwCIMExceptionInvalidIParamName();
|
2888 kumpf 1.104 }
2889
2890 AutoPtr<CIMEnumerateQualifiersRequestMessage> request(
2891 new CIMEnumerateQualifiersRequestMessage(
2892 messageId,
2893 nameSpace,
2894 QueueIdStack(queueId, _returnQueueId)));
2895
2896 STAT_SERVERSTART
2897
2898 return request.release();
2899 }
2900
2901 CIMDeleteQualifierRequestMessage*
2902 CIMOperationRequestDecoder::decodeDeleteQualifierRequest(
2903 Uint32 queueId,
2904 XmlParser& parser,
2905 const String& messageId,
2906 const CIMNamespaceName& nameSpace)
2907 {
2908 STAT_GETSTARTTIME
2909 kumpf 1.104
2910 String qualifierNameString;
2911 CIMName qualifierName;
2912 Boolean gotQualifierName = false;
|
2913 karl 1.127.2.5
|
2914 kumpf 1.104 Boolean emptyTag;
|
2915 karl 1.127.2.5 Boolean duplicateParameter = false;
|
2916 kumpf 1.104
2917 for (const char* name;
2918 XmlReader::getIParamValueTag(parser, name, emptyTag); )
2919 {
2920 if (System::strcasecmp(name, "QualifierName") == 0)
2921 {
2922 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2923 XmlReader::getStringValueElement(parser, qualifierNameString, true);
2924 qualifierName = qualifierNameString;
2925 duplicateParameter = gotQualifierName;
2926 gotQualifierName = true;
2927 }
2928 else
2929 {
|
2930 karl 1.127.2.5 _throwCIMExceptionInvalidIParamName();
|
2931 kumpf 1.104 }
2932
2933
|
2934 karl 1.127.2.5 // generate exception if endtag error or duplicate attributes
2935 _checkMissingEndTagOrDuplicateParamValue(
2936 parser, duplicateParameter, emptyTag);
|
2937 kumpf 1.104 }
2938
|
2939 karl 1.127.2.5 _testRequiredParametersExist(gotQualifierName);
|
2940 kumpf 1.104
2941 AutoPtr<CIMDeleteQualifierRequestMessage> request(
2942 new CIMDeleteQualifierRequestMessage(
2943 messageId,
2944 nameSpace,
2945 qualifierName,
2946 QueueIdStack(queueId, _returnQueueId)));
2947
2948 STAT_SERVERSTART
2949
2950 return request.release();
2951 }
2952
2953 CIMReferenceNamesRequestMessage*
2954 CIMOperationRequestDecoder::decodeReferenceNamesRequest(
2955 Uint32 queueId,
2956 XmlParser& parser,
2957 const String& messageId,
2958 const CIMNamespaceName& nameSpace)
2959 {
2960 STAT_GETSTARTTIME
|
2961 karl 1.127.2.5 objectNameIParam objectName;
2962 classNameIParam resultClass("ResultClass");
2963 stringIParam role("role", false);
|
2964 kumpf 1.104
2965 Boolean duplicateParameter = false;
2966 Boolean emptyTag;
2967
2968 for (const char* name;
|
2969 karl 1.127.2.5 XmlReader::getIParamValueTag(parser, name, emptyTag); )
|
2970 kumpf 1.104 {
|
2971 karl 1.127.2.5 if(objectName.get(parser, name, emptyTag))
|
2972 kumpf 1.104 {
|
2973 karl 1.127.2.5 objectName.iParamFound(duplicateParameter);
|
2974 kumpf 1.104 }
|
2975 karl 1.127.2.5 else if (resultClass.getOptional(parser, name, emptyTag))
|
2976 kumpf 1.104 {
|
2977 karl 1.127.2.5 resultClass.iParamFound(duplicateParameter);
|
2978 kumpf 1.104 }
|
2979 karl 1.127.2.5 else if(role.get(parser, name, emptyTag))
|
2980 kumpf 1.104 {
|
2981 karl 1.127.2.5 role.iParamFound(duplicateParameter);
|
2982 kumpf 1.104 }
2983 else
2984 {
|
2985 karl 1.127.2.5 _throwCIMExceptionInvalidIParamName();
|
2986 kumpf 1.104 }
2987
|
2988 karl 1.127.2.5 // generate exception if endtag error or duplicate attributes
2989 _checkMissingEndTagOrDuplicateParamValue(
2990 parser, duplicateParameter, emptyTag);
|
2991 kumpf 1.104 }
2992
|
2993 karl 1.127.2.5 _testRequiredParametersExist(objectName.got);
|
2994 kumpf 1.104
2995 AutoPtr<CIMReferenceNamesRequestMessage> request(
2996 new CIMReferenceNamesRequestMessage(
2997 messageId,
2998 nameSpace,
|
2999 karl 1.127.2.5 objectName.value,
3000 resultClass.value,
3001 role.value,
3002 QueueIdStack(queueId, _returnQueueId),
3003 objectName.isClassNameElement));
|
3004 kumpf 1.104
3005 STAT_SERVERSTART
3006
3007 return request.release();
3008 }
3009
3010 CIMReferencesRequestMessage*
3011 CIMOperationRequestDecoder::decodeReferencesRequest(
3012 Uint32 queueId,
3013 XmlParser& parser,
3014 const String& messageId,
3015 const CIMNamespaceName& nameSpace)
3016 {
3017 STAT_GETSTARTTIME
3018
|
3019 karl 1.127.2.5 objectNameIParam objectName;
3020 classNameIParam resultClass("ResultClass");
3021 stringIParam role("role", false);
3022 booleanIParam includeQualifiers("IncludeQualifiers");
3023 booleanIParam includeClassOrigin("IncludeClassOrigin");
3024 propertyListIParam propertyList;
3025
|
3026 kumpf 1.104 Boolean duplicateParameter = false;
3027 Boolean emptyTag;
3028
3029 for (const char* name;
3030 XmlReader::getIParamValueTag(parser, name, emptyTag); )
3031 {
|
3032 karl 1.127.2.5 if(objectName.get(parser, name, emptyTag))
|
3033 kumpf 1.104 {
|
3034 karl 1.127.2.5 objectName.iParamFound(duplicateParameter);
|
3035 kumpf 1.104 }
|
3036 karl 1.127.2.5 else if(role.get(parser, name, emptyTag))
|
3037 kumpf 1.104 {
|
3038 karl 1.127.2.5 role.iParamFound(duplicateParameter);
|
3039 kumpf 1.104 }
|
3040 karl 1.127.2.5 else if (resultClass.getOptional(parser, name, emptyTag))
|
3041 kumpf 1.104 {
|
3042 karl 1.127.2.5 resultClass.iParamFound(duplicateParameter);
|
3043 kumpf 1.104 }
|
3044 karl 1.127.2.5 else if(includeQualifiers.get(parser, name, emptyTag))
|
3045 kumpf 1.104 {
|
3046 karl 1.127.2.5 includeQualifiers.iParamFound(duplicateParameter);
|
3047 kumpf 1.104 }
|
3048 karl 1.127.2.5 else if(includeClassOrigin.get(parser, name, emptyTag))
|
3049 kumpf 1.104 {
|
3050 karl 1.127.2.5 includeClassOrigin.iParamFound(duplicateParameter);
|
3051 kumpf 1.104 }
|
3052 karl 1.127.2.5 else if(propertyList.get(parser, name, emptyTag))
|
3053 kumpf 1.104 {
|
3054 karl 1.127.2.5 propertyList.iParamFound(duplicateParameter);
|
3055 kumpf 1.104 }
3056 else
3057 {
|
3058 karl 1.127.2.5 _throwCIMExceptionInvalidIParamName();
|
3059 kumpf 1.104 }
3060
|
3061 karl 1.127.2.5 // generate exception if endtag error or duplicate attributes
3062 _checkMissingEndTagOrDuplicateParamValue(
3063 parser, duplicateParameter, emptyTag);
|
3064 kumpf 1.104 }
3065
|
3066 karl 1.127.2.5 _testRequiredParametersExist(objectName.got);
|
3067 kumpf 1.104
3068 AutoPtr<CIMReferencesRequestMessage> request(
3069 new CIMReferencesRequestMessage(
3070 messageId,
3071 nameSpace,
|
3072 karl 1.127.2.5 objectName.value,
3073 resultClass.value,
3074 role.value,
3075 includeQualifiers.value,
3076 includeClassOrigin.value,
3077 propertyList.value,
3078 QueueIdStack(queueId, _returnQueueId),
3079 objectName.isClassNameElement));
|
3080 kumpf 1.104
3081 STAT_SERVERSTART
3082
3083 return request.release();
3084 }
3085
3086 CIMAssociatorNamesRequestMessage*
3087 CIMOperationRequestDecoder::decodeAssociatorNamesRequest(
3088 Uint32 queueId,
3089 XmlParser& parser,
3090 const String& messageId,
3091 const CIMNamespaceName& nameSpace)
3092 {
3093 STAT_GETSTARTTIME
3094
|
3095 karl 1.127.2.5 objectNameIParam objectName;
3096 classNameIParam assocClass("AssocClass");
3097 classNameIParam resultClass("ResultClass");
3098 stringIParam role("role", false);
3099 stringIParam resultRole("Resultrole", false);
3100
|
3101 kumpf 1.104 Boolean emptyTag;
|
3102 karl 1.127.2.5 Boolean duplicateParameter = false;
|
3103 kumpf 1.104
3104 for (const char* name;
3105 XmlReader::getIParamValueTag(parser, name, emptyTag); )
3106 {
|
3107 karl 1.127.2.5 if(objectName.get(parser, name, emptyTag))
|
3108 kumpf 1.104 {
|
3109 karl 1.127.2.5 objectName.iParamFound(duplicateParameter);
|
3110 kumpf 1.104 }
|
3111 karl 1.127.2.5 else if (assocClass.getOptional(parser, name, emptyTag))
|
3112 kumpf 1.104 {
|
3113 karl 1.127.2.5 assocClass.iParamFound(duplicateParameter);
|
3114 kumpf 1.104 }
|
3115 karl 1.127.2.5 else if (resultClass.getOptional(parser, name, emptyTag))
|
3116 kumpf 1.104 {
|
3117 karl 1.127.2.5 resultClass.iParamFound(duplicateParameter);
|
3118 kumpf 1.104 }
|
3119 karl 1.127.2.5 else if(role.get(parser, name, emptyTag))
|
3120 kumpf 1.104 {
|
3121 karl 1.127.2.5 role.iParamFound(duplicateParameter);
|
3122 kumpf 1.104 }
|
3123 karl 1.127.2.5 else if(resultRole.get(parser, name, emptyTag))
|
3124 kumpf 1.104 {
|
3125 karl 1.127.2.5 resultRole.iParamFound(duplicateParameter);
|
3126 kumpf 1.104 }
3127 else
3128 {
|
3129 karl 1.127.2.5 _throwCIMExceptionInvalidIParamName();
|
3130 kumpf 1.104
3131 }
3132
|
3133 karl 1.127.2.5 // generate exception if endtag error or duplicate attributes
3134 _checkMissingEndTagOrDuplicateParamValue(
3135 parser, duplicateParameter, emptyTag);
|
3136 kumpf 1.104 }
3137
|
3138 karl 1.127.2.5 _testRequiredParametersExist(objectName.got);
|
3139 kumpf 1.104
3140 AutoPtr<CIMAssociatorNamesRequestMessage> request(
3141 new CIMAssociatorNamesRequestMessage(
3142 messageId,
3143 nameSpace,
|
3144 karl 1.127.2.5 objectName.value,
3145 assocClass.value,
3146 resultClass.value,
3147 role.value,
3148 resultRole.value,
3149 QueueIdStack(queueId, _returnQueueId),
3150 objectName.isClassNameElement));
|
3151 kumpf 1.104
3152 STAT_SERVERSTART
3153
3154 return request.release();
3155 }
3156
3157 CIMAssociatorsRequestMessage*
3158 CIMOperationRequestDecoder::decodeAssociatorsRequest(
3159 Uint32 queueId,
3160 XmlParser& parser,
3161 const String& messageId,
3162 const CIMNamespaceName& nameSpace)
3163 {
3164 STAT_GETSTARTTIME
3165
|
3166 karl 1.127.2.5 // Associator Operation Parameters
3167 objectNameIParam objectName;
3168 classNameIParam assocClass("AssocClass");
3169 classNameIParam resultClass("ResultClass");
3170 stringIParam resultRole("Resultrole", false);
3171 stringIParam role("role", false);
3172 booleanIParam includeQualifiers("IncludeQualifiers");
3173 booleanIParam includeClassOrigin("IncludeClassOrigin");
3174 propertyListIParam propertyList;
3175
|
3176 kumpf 1.104 Boolean duplicateParameter = false;
3177 Boolean emptyTag;
3178
3179 for (const char* name;
3180 XmlReader::getIParamValueTag(parser, name, emptyTag); )
3181 {
|
3182 karl 1.127.2.5 if(objectName.get(parser, name, emptyTag))
|
3183 kumpf 1.104 {
|
3184 karl 1.127.2.5 objectName.iParamFound(duplicateParameter);
|
3185 kumpf 1.104 }
|
3186 karl 1.127.2.5 else if (assocClass.getOptional(parser, name, emptyTag))
|
3187 kumpf 1.104 {
|
3188 karl 1.127.2.5 assocClass.iParamFound(duplicateParameter);
|
3189 kumpf 1.104 }
|
3190 karl 1.127.2.5 else if (resultClass.getOptional(parser, name, emptyTag))
|
3191 kumpf 1.104 {
|
3192 karl 1.127.2.5 resultClass.iParamFound(duplicateParameter);
|
3193 kumpf 1.104 }
|
3194 karl 1.127.2.5 else if(role.get(parser, name, emptyTag))
|
3195 kumpf 1.104 {
|
3196 karl 1.127.2.5 role.iParamFound(duplicateParameter);
|
3197 kumpf 1.104 }
|
3198 karl 1.127.2.5 else if(resultRole.get(parser, name, emptyTag))
|
3199 kumpf 1.104 {
|
3200 karl 1.127.2.5 resultRole.iParamFound(duplicateParameter);
|
3201 kumpf 1.104 }
|
3202 karl 1.127.2.5 else if(includeQualifiers.get(parser, name, emptyTag))
|
3203 kumpf 1.104 {
|
3204 karl 1.127.2.5 includeQualifiers.iParamFound(duplicateParameter);
|
3205 kumpf 1.104 }
|
3206 karl 1.127.2.5 else if(includeClassOrigin.get(parser, name, emptyTag))
|
3207 kumpf 1.104 {
|
3208 karl 1.127.2.5 includeClassOrigin.iParamFound(duplicateParameter);
|
3209 kumpf 1.104 }
|
3210 karl 1.127.2.5 else if(propertyList.get(parser, name, emptyTag))
|
3211 kumpf 1.104 {
|
3212 karl 1.127.2.5 propertyList.iParamFound(duplicateParameter);
|
3213 kumpf 1.104 }
3214 else
3215 {
|
3216 karl 1.127.2.5 _throwCIMExceptionInvalidIParamName();
|
3217 kumpf 1.104 }
3218
|
3219 karl 1.127.2.5 // generate exception if endtag error or duplicate attributes
3220 _checkMissingEndTagOrDuplicateParamValue(
3221 parser, duplicateParameter, emptyTag);
|
3222 kumpf 1.104 }
3223
|
3224 karl 1.127.2.5 _testRequiredParametersExist(objectName.got);
|
3225 kumpf 1.104
3226 AutoPtr<CIMAssociatorsRequestMessage> request(
3227 new CIMAssociatorsRequestMessage(
3228 messageId,
3229 nameSpace,
|
3230 karl 1.127.2.5 objectName.value,
3231 assocClass.value,
3232 resultClass.value,
3233 role.value,
3234 resultRole.value,
3235 includeQualifiers.value,
3236 includeClassOrigin.value,
3237 propertyList.value,
3238 QueueIdStack(queueId, _returnQueueId),
3239 objectName.isClassNameElement));
|
3240 kumpf 1.104
3241 STAT_SERVERSTART
3242
3243 return request.release();
3244 }
3245
3246 CIMGetPropertyRequestMessage*
3247 CIMOperationRequestDecoder::decodeGetPropertyRequest(
3248 Uint32 queueId,
3249 XmlParser& parser,
3250 const String& messageId,
3251 const CIMNamespaceName& nameSpace)
3252 {
3253 STAT_GETSTARTTIME
3254
3255 CIMObjectPath instanceName;
3256 String propertyName;
3257 Boolean duplicateParameter = false;
3258 Boolean gotInstanceName = false;
3259 Boolean gotPropertyName = false;
3260 Boolean emptyTag;
3261 kumpf 1.104
3262 for (const char* name;
3263 XmlReader::getIParamValueTag(parser, name, emptyTag); )
3264 {
3265 if (System::strcasecmp(name, "InstanceName") == 0)
3266 {
3267 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
3268 XmlReader::getInstanceNameElement(parser, instanceName);
3269 duplicateParameter = gotInstanceName;
3270 gotInstanceName = true;
3271 }
3272 else if (System::strcasecmp(name, "PropertyName") == 0)
3273 {
3274 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
3275 XmlReader::getStringValueElement(parser, propertyName, true);
3276 duplicateParameter = gotPropertyName;
3277 gotPropertyName = true;
3278 }
3279 else
3280 {
|
3281 karl 1.127.2.5 _throwCIMExceptionInvalidIParamName();
|
3282 kumpf 1.104 }
3283
|
3284 karl 1.127.2.5 // generate exception if endtag error or duplicate attributes
3285 _checkMissingEndTagOrDuplicateParamValue(
3286 parser, duplicateParameter, emptyTag);
|
3287 kumpf 1.104 }
3288
|
3289 karl 1.127.2.5 _testRequiredParametersExist(gotInstanceName && gotPropertyName);
|
3290 kumpf 1.104
3291 AutoPtr<CIMGetPropertyRequestMessage> request(
3292 new CIMGetPropertyRequestMessage(
3293 messageId,
3294 nameSpace,
3295 instanceName,
3296 propertyName,
3297 QueueIdStack(queueId, _returnQueueId)));
3298
3299 STAT_SERVERSTART
3300
3301 return request.release();
3302 }
3303
3304 CIMSetPropertyRequestMessage*
3305 CIMOperationRequestDecoder::decodeSetPropertyRequest(
3306 Uint32 queueId,
3307 XmlParser& parser,
3308 const String& messageId,
3309 const CIMNamespaceName& nameSpace)
3310 {
3311 kumpf 1.104 STAT_GETSTARTTIME
3312
3313 CIMObjectPath instanceName;
3314 String propertyName;
3315 CIMValue propertyValue;
3316 Boolean duplicateParameter = false;
3317 Boolean gotInstanceName = false;
3318 Boolean gotPropertyName = false;
3319 Boolean gotNewValue = false;
3320 Boolean emptyTag;
3321
3322 for (const char* name;
3323 XmlReader::getIParamValueTag(parser, name, emptyTag); )
3324 {
3325 if (System::strcasecmp(name, "InstanceName") == 0)
3326 {
3327 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
3328 XmlReader::getInstanceNameElement(parser, instanceName);
3329 duplicateParameter = gotInstanceName;
3330 gotInstanceName = true;
3331 }
3332 kumpf 1.104 else if (System::strcasecmp(name, "PropertyName") == 0)
3333 {
3334 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
3335 XmlReader::getStringValueElement(parser, propertyName, true);
3336 duplicateParameter = gotPropertyName;
3337 gotPropertyName = true;
3338 }
3339 else if (System::strcasecmp(name, "NewValue") == 0)
3340 {
3341 if (emptyTag || !XmlReader::getPropertyValue(parser, propertyValue))
3342 {
3343 propertyValue.setNullValue(CIMTYPE_STRING, false);
3344 }
3345 duplicateParameter = gotNewValue;
3346 gotNewValue = true;
3347 }
3348 else
3349 {
|
3350 karl 1.127.2.5 _throwCIMExceptionInvalidIParamName();
|
3351 kumpf 1.104 }
3352
|
3353 karl 1.127.2.5 // generate exception if endtag error or duplicate attributes
3354 _checkMissingEndTagOrDuplicateParamValue(
3355 parser, duplicateParameter, emptyTag);
|
3356 kumpf 1.104 }
3357
|
3358 karl 1.127.2.5 _testRequiredParametersExist(gotInstanceName && gotPropertyName);
|
3359 kumpf 1.104
3360 AutoPtr<CIMSetPropertyRequestMessage> request(
3361 new CIMSetPropertyRequestMessage(
3362 messageId,
3363 nameSpace,
3364 instanceName,
3365 propertyName,
3366 propertyValue,
3367 QueueIdStack(queueId, _returnQueueId)));
|
3368 kumpf 1.29
|
3369 kumpf 1.104 STAT_SERVERSTART
|
3370 sage 1.41
|
3371 kumpf 1.104 return request.release();
|
3372 kumpf 1.29 }
3373
3374 CIMExecQueryRequestMessage* CIMOperationRequestDecoder::decodeExecQueryRequest(
|
3375 kumpf 1.104 Uint32 queueId,
3376 XmlParser& parser,
3377 const String& messageId,
3378 const CIMNamespaceName& nameSpace)
3379 {
3380 STAT_GETSTARTTIME
3381
|
3382 karl 1.127.2.5 // define execQuery parameters. Values are required parameters exist.
3383 stringIParam queryLanguage("QueryLanguage", true);
3384 stringIParam query("Query", true);
3385
|
3386 kumpf 1.104 Boolean emptyTag;
|
3387 karl 1.127.2.5 Boolean duplicateParameter = false;
|
3388 kumpf 1.104
3389 for (const char* name;
3390 XmlReader::getIParamValueTag(parser, name, emptyTag); )
3391 {
|
3392 karl 1.127.2.5 if(queryLanguage.get(parser, name, emptyTag))
|
3393 kumpf 1.104 {
|
3394 karl 1.127.2.5 queryLanguage.iParamFound(duplicateParameter);
|
3395 kumpf 1.104 }
|
3396 karl 1.127.2.5 else if(query.get(parser, name, emptyTag))
|
3397 kumpf 1.104 {
|
3398 karl 1.127.2.5 query.iParamFound(duplicateParameter);
|
3399 kumpf 1.104 }
3400 else
3401 {
|
3402 karl 1.127.2.5 _throwCIMExceptionInvalidIParamName();
|
3403 kumpf 1.104 }
3404
|
3405 karl 1.127.2.5 // generate exception if endtag error or duplicate attributes
3406 _checkMissingEndTagOrDuplicateParamValue(parser,
3407 duplicateParameter, emptyTag);
|
3408 kumpf 1.104 }
3409
|
3410 karl 1.127.2.5 _testRequiredParametersExist(queryLanguage.got && query.got);
|
3411 kumpf 1.104
3412 AutoPtr<CIMExecQueryRequestMessage> request(
3413 new CIMExecQueryRequestMessage(
3414 messageId,
3415 nameSpace,
|
3416 karl 1.127.2.5 queryLanguage.value,
3417 query.value,
|
3418 kumpf 1.104 QueueIdStack(queueId, _returnQueueId)));
3419
3420 STAT_SERVERSTART
3421
3422 return request.release();
3423 }
3424
3425 CIMInvokeMethodRequestMessage*
3426 CIMOperationRequestDecoder::decodeInvokeMethodRequest(
3427 Uint32 queueId,
3428 XmlParser& parser,
3429 const String& messageId,
3430 const CIMObjectPath& reference,
3431 const String& cimMethodName)
3432 {
3433 STAT_GETSTARTTIME
3434
3435 CIMParamValue paramValue;
3436 Array<CIMParamValue> inParameters;
3437
3438 while (XmlReader::getParamValueElement(parser, paramValue))
3439 kumpf 1.104 {
3440 inParameters.append(paramValue);
3441 }
3442
3443 AutoPtr<CIMInvokeMethodRequestMessage> request(
3444 new CIMInvokeMethodRequestMessage(
3445 messageId,
3446 reference.getNameSpace(),
3447 reference,
3448 cimMethodName,
3449 inParameters,
3450 QueueIdStack(queueId, _returnQueueId)));
|
3451 kumpf 1.9
|
3452 kumpf 1.104 STAT_SERVERSTART
|
3453 mike 1.2
|
3454 kumpf 1.104 return request.release();
|
3455 mike 1.2 }
3456
|
3457 karl 1.127.2.1 // EXP_PULL_BEGIN
3458 CIMOpenEnumerateInstancesRequestMessage*
3459 CIMOperationRequestDecoder::decodeOpenEnumerateInstancesRequest(
3460 Uint32 queueId,
3461 XmlParser& parser,
3462 const String& messageId,
3463 const CIMNamespaceName& nameSpace)
3464 {
3465 STAT_GETSTARTTIME
3466
|
3467 karl 1.127.2.5 // EnumerateInstance Parameters
3468 classNameIParam className("ClassName");
3469 booleanIParam deepInheritance("DeepInheritance", true);
3470 booleanIParam includeQualifiers("IncludeQualifiers");
3471 booleanIParam includeClassOrigin("IncludeClassOrigin");
3472 propertyListIParam propertyList;
3473 //// TODO confirm the false here
3474 stringIParam filterQueryLanguage("FilterQueryLanguage",false);
3475 stringIParam filterQuery("FilterQuery", false);
3476 booleanIParam continueOnError("ContinueOnError");
3477 // [IN,OPTIONAL] uint32 MaxObjectCount = 0
3478 uint32IParam maxObjectCount("MaxObjectCount", 0);
3479 // [IN,OPTIONAL,NULL] uint32 OperationTimeout = NULL,
3480 uint32ArgIParam operationTimeout("OperationTimeout");
|
3481 karl 1.127.2.1
3482 Boolean duplicateParameter = false;
3483
3484 Boolean emptyTag;
3485
3486 for (const char* name;
3487 XmlReader::getIParamValueTag(parser, name, emptyTag); )
3488 {
|
3489 karl 1.127.2.5 if(className.get(parser, name, emptyTag))
|
3490 karl 1.127.2.1 {
|
3491 karl 1.127.2.5 className.iParamFound(duplicateParameter);
|
3492 karl 1.127.2.1 }
|
3493 karl 1.127.2.5 else if(deepInheritance.get(parser, name, emptyTag))
|
3494 karl 1.127.2.1 {
|
3495 karl 1.127.2.5 deepInheritance.iParamFound(duplicateParameter);
|
3496 karl 1.127.2.1 }
|
3497 karl 1.127.2.5 else if(includeQualifiers.get(parser, name, emptyTag))
|
3498 karl 1.127.2.1 {
|
3499 karl 1.127.2.5 includeQualifiers.iParamFound(duplicateParameter);
|
3500 karl 1.127.2.1 }
|
3501 karl 1.127.2.5 else if(includeClassOrigin.get(parser, name, emptyTag))
|
3502 karl 1.127.2.1 {
|
3503 karl 1.127.2.5 includeClassOrigin.iParamFound(duplicateParameter);
|
3504 karl 1.127.2.1 }
|
3505 karl 1.127.2.5 // [IN,OPTIONAL,NULL] string FilterQueryLanguage = NULL,
3506 else if(filterQueryLanguage.get(parser, name, emptyTag))
|
3507 karl 1.127.2.1 {
|
3508 karl 1.127.2.5 filterQueryLanguage.iParamFound(duplicateParameter);
|
3509 karl 1.127.2.1 }
|
3510 karl 1.127.2.5 // [IN,OPTIONAL,NULL] string FilterQuery = NULL,
3511 else if(filterQuery.get(parser, name, emptyTag))
|
3512 karl 1.127.2.1 {
|
3513 karl 1.127.2.5 filterQuery.iParamFound(duplicateParameter);
|
3514 karl 1.127.2.1 }
|
3515 karl 1.127.2.5 // [IN,OPTIONAL] Boolean ContinueOnError = false,
3516 else if (continueOnError.get(parser, name, emptyTag))
|
3517 karl 1.127.2.1 {
|
3518 karl 1.127.2.5 continueOnError.iParamFound(duplicateParameter);
3519 }
3520 // [IN,OPTIONAL,NULL] uint32 OperationTimeout = NULL,
3521 else if (operationTimeout.get(parser, name, emptyTag))
3522 {
3523 operationTimeout.iParamFound(duplicateParameter);
|
3524 karl 1.127.2.1 }
3525 // [IN,OPTIONAL] uint32 MaxObjectCount = 0
|
3526 karl 1.127.2.5 else if (maxObjectCount.get(parser, name, emptyTag))
|
3527 karl 1.127.2.1 {
|
3528 karl 1.127.2.5 maxObjectCount.iParamFound(duplicateParameter);
|
3529 karl 1.127.2.1 }
|
3530 karl 1.127.2.5 else if(propertyList.get(parser, name, emptyTag))
|
3531 karl 1.127.2.1 {
|
3532 karl 1.127.2.5 propertyList.iParamFound(duplicateParameter);
|
3533 karl 1.127.2.1 }
3534 else
3535 {
|
3536 karl 1.127.2.5 _throwCIMExceptionInvalidIParamName(name);
|
3537 karl 1.127.2.1 }
3538
|
3539 karl 1.127.2.5 // generate exception if endtag error or duplicate attributes
3540 _checkMissingEndTagOrDuplicateParamValue(
3541 parser, duplicateParameter, emptyTag);
|
3542 karl 1.127.2.1
3543 }
3544
|
3545 karl 1.127.2.5 _testRequiredParametersExist(className.got);
|
3546 karl 1.127.2.1
3547 AutoPtr<CIMOpenEnumerateInstancesRequestMessage> request(
3548 new CIMOpenEnumerateInstancesRequestMessage(
3549 messageId,
3550 nameSpace,
|
3551 karl 1.127.2.5 className.value,
3552 deepInheritance.value,
3553 includeClassOrigin.value,
3554 propertyList.value,
3555 filterQueryLanguage.value,
3556 filterQuery.value,
3557 operationTimeout.value,
3558 continueOnError.value,
3559 maxObjectCount.value,
|
3560 karl 1.127.2.1 QueueIdStack(queueId, _returnQueueId)));
3561
3562 STAT_SERVERSTART
3563
3564 return request.release();
3565 }
3566
3567
3568 CIMOpenEnumerateInstancePathsRequestMessage*
3569 CIMOperationRequestDecoder::decodeOpenEnumerateInstancePathsRequest(
3570 Uint32 queueId,
3571 XmlParser& parser,
3572 const String& messageId,
3573 const CIMNamespaceName& nameSpace)
3574 {
3575 STAT_GETSTARTTIME
3576
|
3577 karl 1.127.2.5 // EnumerateInstance Parameters
3578 classNameIParam className("ClassName");
3579 //// TODO confirm the false here
3580 stringIParam filterQueryLanguage("FilterQueryLanguage",false);
3581 stringIParam filterQuery("FilterQuery", false);
3582 booleanIParam continueOnError("ContinueOnError");
3583 // [IN,OPTIONAL] uint32 MaxObjectCount = 0
3584 uint32IParam maxObjectCount("MaxObjectCount", 0);
3585 // [IN,OPTIONAL,NULL] uint32 OperationTimeout = NULL,
3586 uint32ArgIParam operationTimeout("OperationTimeout");
|
3587 karl 1.127.2.1
3588 Boolean duplicateParameter = false;
3589 Boolean emptyTag;
3590
3591 for (const char* name;
3592 XmlReader::getIParamValueTag(parser, name, emptyTag); )
3593 {
|
3594 karl 1.127.2.5 if(className.get(parser, name, emptyTag))
|
3595 karl 1.127.2.1 {
|
3596 karl 1.127.2.5 className.iParamFound(duplicateParameter);
|
3597 karl 1.127.2.1 }
|
3598 karl 1.127.2.5 // [IN,OPTIONAL,NULL] string FilterQueryLanguage = NULL,
3599 else if(filterQueryLanguage.get(parser, name, emptyTag))
|
3600 karl 1.127.2.1 {
|
3601 karl 1.127.2.5 filterQueryLanguage.iParamFound(duplicateParameter);
|
3602 karl 1.127.2.1 }
|
3603 karl 1.127.2.5 // [IN,OPTIONAL,NULL] string FilterQuery = NULL,
3604 else if(filterQuery.get(parser, name, emptyTag))
|
3605 karl 1.127.2.1 {
|
3606 karl 1.127.2.5 filterQuery.iParamFound(duplicateParameter);
|
3607 karl 1.127.2.1 }
3608 // [IN,OPTIONAL] Boolean ContinueOnError = false,
|
3609 karl 1.127.2.5 else if (continueOnError.get(parser, name, emptyTag))
|
3610 karl 1.127.2.1 {
|
3611 karl 1.127.2.5 continueOnError.iParamFound(duplicateParameter);
|
3612 karl 1.127.2.1 }
|
3613 karl 1.127.2.5 // [IN,OPTIONAL,NULL] uint32 OperationTimeout = NULL,
3614 else if (operationTimeout.get(parser, name, emptyTag))
|
3615 karl 1.127.2.1 {
|
3616 karl 1.127.2.5 operationTimeout.iParamFound(duplicateParameter);
|
3617 karl 1.127.2.1 }
|
3618 karl 1.127.2.5 // [IN,OPTIONAL] uint32 MaxObjectCount = 0
3619 else if (maxObjectCount.get(parser, name, emptyTag))
|
3620 karl 1.127.2.1 {
|
3621 karl 1.127.2.5 maxObjectCount.iParamFound(duplicateParameter);
|
3622 karl 1.127.2.1 }
|
3623 karl 1.127.2.5 else
|
3624 karl 1.127.2.1 {
|
3625 karl 1.127.2.5 _throwCIMExceptionInvalidIParamName(name);
|
3626 karl 1.127.2.1 }
3627
|
3628 karl 1.127.2.5 // generate exception if endtag error or duplicate attributes
3629 _checkMissingEndTagOrDuplicateParamValue(
3630 parser, duplicateParameter, emptyTag);
|
3631 karl 1.127.2.1
3632 }
3633
|
3634 karl 1.127.2.5 _testRequiredParametersExist(className.got);
|
3635 karl 1.127.2.1
3636 AutoPtr<CIMOpenEnumerateInstancePathsRequestMessage> request(
3637 new CIMOpenEnumerateInstancePathsRequestMessage(
3638 messageId,
3639 nameSpace,
|
3640 karl 1.127.2.5 className.value,
3641 filterQueryLanguage.value,
3642 filterQuery.value,
3643 operationTimeout.value,
3644 continueOnError.value,
3645 maxObjectCount.value,
|
3646 karl 1.127.2.1 QueueIdStack(queueId, _returnQueueId)));
3647
3648 STAT_SERVERSTART
3649
3650 return request.release();
3651 }
3652
3653 CIMOpenReferenceInstancesRequestMessage*
3654 CIMOperationRequestDecoder::decodeOpenReferenceInstancesRequest(
3655 Uint32 queueId,
3656 XmlParser& parser,
3657 const String& messageId,
3658 const CIMNamespaceName& nameSpace)
3659 {
3660 STAT_GETSTARTTIME
3661
|
3662 karl 1.127.2.5 objectNameIParam objectName("InstanceName");
3663 classNameIParam resultClass("ResultClass");
3664 stringIParam role("role", false);
3665 booleanIParam includeClassOrigin("IncludeClassOrigin");
3666 propertyListIParam propertyList;
3667
3668 stringIParam filterQueryLanguage("FilterQueryLanguage",false);
3669 stringIParam filterQuery("FilterQuery", false);
3670 booleanIParam continueOnError("ContinueOnError");
3671 uint32IParam maxObjectCount("MaxObjectCount", 0);
3672 uint32ArgIParam operationTimeout("OperationTimeout");
|
3673 karl 1.127.2.1
3674 Boolean duplicateParameter = false;
3675 Boolean emptyTag;
3676
|
3677 karl 1.127.2.5
|
3678 karl 1.127.2.1 for (const char* name;
3679 XmlReader::getIParamValueTag(parser, name, emptyTag); )
3680 {
|
3681 karl 1.127.2.5 if(objectName.get(parser, name, emptyTag))
|
3682 karl 1.127.2.1 {
|
3683 karl 1.127.2.5 objectName.iParamFound(duplicateParameter);
|
3684 karl 1.127.2.1 }
|
3685 karl 1.127.2.5 else if(role.get(parser, name, emptyTag))
|
3686 karl 1.127.2.1 {
|
3687 karl 1.127.2.5 role.iParamFound(duplicateParameter);
|
3688 karl 1.127.2.1 }
|
3689 karl 1.127.2.5 else if (resultClass.getOptional(parser, name, emptyTag))
|
3690 karl 1.127.2.1 {
|
3691 karl 1.127.2.5 resultClass.iParamFound(duplicateParameter);
|
3692 karl 1.127.2.1 }
|
3693 karl 1.127.2.5 else if(includeClassOrigin.get(parser, name, emptyTag))
|
3694 karl 1.127.2.1 {
|
3695 karl 1.127.2.5 includeClassOrigin.iParamFound(duplicateParameter);
|
3696 karl 1.127.2.1 }
|
3697 karl 1.127.2.5 else if(propertyList.get(parser, name, emptyTag))
|
3698 karl 1.127.2.1 {
|
3699 karl 1.127.2.5 propertyList.iParamFound(duplicateParameter);
|
3700 karl 1.127.2.1 }
|
3701 karl 1.127.2.5 // [IN,OPTIONAL,NULL] string FilterQueryLanguage = NULL,
3702 else if(filterQueryLanguage.get(parser, name, emptyTag))
|
3703 karl 1.127.2.1 {
|
3704 karl 1.127.2.5 filterQueryLanguage.iParamFound(duplicateParameter);
|
3705 karl 1.127.2.1 }
|
3706 karl 1.127.2.5 // [IN,OPTIONAL,NULL] string FilterQuery = NULL,
3707 else if(filterQuery.get(parser, name, emptyTag))
|
3708 karl 1.127.2.1 {
|
3709 karl 1.127.2.5 filterQuery.iParamFound(duplicateParameter);
|
3710 karl 1.127.2.1 }
|
3711 karl 1.127.2.5 // [IN,OPTIONAL] Boolean ContinueOnError = false,
3712 else if (continueOnError.get(parser, name, emptyTag))
|
3713 karl 1.127.2.1 {
|
3714 karl 1.127.2.5 continueOnError.iParamFound(duplicateParameter);
|
3715 karl 1.127.2.1 }
|
3716 karl 1.127.2.5 // [IN,OPTIONAL,NULL] uint32 OperationTimeout = NULL,
3717 else if (operationTimeout.get(parser, name, emptyTag))
|
3718 karl 1.127.2.1 {
|
3719 karl 1.127.2.5 operationTimeout.iParamFound(duplicateParameter);
|
3720 karl 1.127.2.1 }
|
3721 karl 1.127.2.5 // [IN,OPTIONAL] uint32 MaxObjectCount = 0
3722 else if (maxObjectCount.get(parser, name, emptyTag))
|
3723 karl 1.127.2.1 {
|
3724 karl 1.127.2.5 maxObjectCount.iParamFound(duplicateParameter);
|
3725 karl 1.127.2.1 }
3726 else
3727 {
|
3728 karl 1.127.2.5 _throwCIMExceptionInvalidIParamName();
|
3729 karl 1.127.2.1 }
3730
|
3731 karl 1.127.2.5 // generate exception if endtag error or duplicate attributes
3732 _checkMissingEndTagOrDuplicateParamValue(
3733 parser, duplicateParameter, emptyTag);
|
3734 karl 1.127.2.1 }
3735
|
3736 karl 1.127.2.5 _testRequiredParametersExist(objectName.got);
|
3737 karl 1.127.2.1
3738 AutoPtr<CIMOpenReferenceInstancesRequestMessage> request(
3739 new CIMOpenReferenceInstancesRequestMessage(
3740 messageId,
3741 nameSpace,
|
3742 karl 1.127.2.5 objectName.value,
3743 resultClass.value,
3744 role.value,
3745 includeClassOrigin.value,
3746 propertyList.value,
3747 filterQueryLanguage.value,
3748 filterQuery.value,
3749 operationTimeout.value,
3750 continueOnError.value,
3751 maxObjectCount.value,
|
3752 karl 1.127.2.1 QueueIdStack(queueId, _returnQueueId)));
3753
3754 STAT_SERVERSTART
3755
3756 return request.release();
3757 }
3758
3759
3760 CIMOpenReferenceInstancePathsRequestMessage*
3761 CIMOperationRequestDecoder::decodeOpenReferenceInstancePathsRequest(
3762 Uint32 queueId,
3763 XmlParser& parser,
3764 const String& messageId,
3765 const CIMNamespaceName& nameSpace)
3766 {
3767 STAT_GETSTARTTIME
3768
|
3769 karl 1.127.2.5 objectNameIParam objectName("InstanceName");
3770 classNameIParam resultClass("ResultClass");
3771 stringIParam role("role", false);
3772
3773 stringIParam filterQueryLanguage("FilterQueryLanguage",false);
3774 stringIParam filterQuery("FilterQuery", false);
3775 booleanIParam continueOnError("ContinueOnError");
3776 uint32IParam maxObjectCount("MaxObjectCount", 0);
3777 uint32ArgIParam operationTimeout("OperationTimeout");
|
3778 karl 1.127.2.1
3779 Boolean duplicateParameter = false;
3780 Boolean emptyTag;
3781
3782 for (const char* name;
3783 XmlReader::getIParamValueTag(parser, name, emptyTag); )
3784 {
|
3785 karl 1.127.2.5 if(objectName.get(parser, name, emptyTag))
|
3786 karl 1.127.2.1 {
|
3787 karl 1.127.2.5 objectName.iParamFound(duplicateParameter);
|
3788 karl 1.127.2.1 }
|
3789 karl 1.127.2.5 else if(role.get(parser, name, emptyTag))
|
3790 karl 1.127.2.1 {
|
3791 karl 1.127.2.5 role.iParamFound(duplicateParameter);
|
3792 karl 1.127.2.1 }
|
3793 karl 1.127.2.5 else if (resultClass.getOptional(parser, name, emptyTag))
|
3794 karl 1.127.2.1 {
|
3795 karl 1.127.2.5 resultClass.iParamFound(duplicateParameter);
|
3796 karl 1.127.2.1 }
|
3797 karl 1.127.2.5 else if(filterQueryLanguage.get(parser, name, emptyTag))
|
3798 karl 1.127.2.1 {
|
3799 karl 1.127.2.5 filterQueryLanguage.iParamFound(duplicateParameter);
|
3800 karl 1.127.2.1 }
|
3801 karl 1.127.2.5 else if(filterQuery.get(parser, name, emptyTag))
|
3802 karl 1.127.2.1 {
|
3803 karl 1.127.2.5 filterQuery.iParamFound(duplicateParameter);
|
3804 karl 1.127.2.1 }
|
3805 karl 1.127.2.5 else if (continueOnError.get(parser, name, emptyTag))
|
3806 karl 1.127.2.1 {
|
3807 karl 1.127.2.5 continueOnError.iParamFound(duplicateParameter);
|
3808 karl 1.127.2.1 }
|
3809 karl 1.127.2.5 else if (operationTimeout.get(parser, name, emptyTag))
|
3810 karl 1.127.2.1 {
|
3811 karl 1.127.2.5 operationTimeout.iParamFound(duplicateParameter);
|
3812 karl 1.127.2.1 }
|
3813 karl 1.127.2.5 else if (maxObjectCount.get(parser, name, emptyTag))
|
3814 karl 1.127.2.1 {
|
3815 karl 1.127.2.5 maxObjectCount.iParamFound(duplicateParameter);
|
3816 karl 1.127.2.1 }
3817 else
3818 {
|
3819 karl 1.127.2.5 _throwCIMExceptionInvalidIParamName();
|
3820 karl 1.127.2.1 }
3821
|
3822 karl 1.127.2.5 // generate exception if endtag error or duplicate attributes
3823 _checkMissingEndTagOrDuplicateParamValue(
3824 parser, duplicateParameter, emptyTag);
|
3825 karl 1.127.2.1 }
3826
|
3827 karl 1.127.2.5 _testRequiredParametersExist(objectName.got);
|
3828 karl 1.127.2.1
3829 AutoPtr<CIMOpenReferenceInstancePathsRequestMessage> request(
3830 new CIMOpenReferenceInstancePathsRequestMessage(
3831 messageId,
3832 nameSpace,
|
3833 karl 1.127.2.5 objectName.value,
3834 resultClass.value,
3835 role.value,
3836 filterQueryLanguage.value,
3837 filterQuery.value,
3838 operationTimeout.value,
3839 continueOnError.value,
3840 maxObjectCount.value,
|
3841 karl 1.127.2.1 QueueIdStack(queueId, _returnQueueId)));
3842
3843 STAT_SERVERSTART
3844
3845 return request.release();
3846 }
3847
3848 CIMOpenAssociatorInstancesRequestMessage*
3849 CIMOperationRequestDecoder::decodeOpenAssociatorInstancesRequest(
3850 Uint32 queueId,
3851 XmlParser& parser,
3852 const String& messageId,
3853 const CIMNamespaceName& nameSpace)
3854 {
3855 STAT_GETSTARTTIME
3856
|
3857 karl 1.127.2.5 objectNameIParam objectName("InstanceName");
3858 classNameIParam assocClass("AssocClass");
3859 classNameIParam resultClass("ResultClass");
3860 stringIParam resultRole("Resultrole", false);
3861 stringIParam role("role", false);
3862 booleanIParam includeClassOrigin("IncludeClassOrigin");
3863 propertyListIParam propertyList;
3864
3865 stringIParam filterQueryLanguage("FilterQueryLanguage",false);
3866 stringIParam filterQuery("FilterQuery", false);
3867 booleanIParam continueOnError("ContinueOnError");
3868 uint32IParam maxObjectCount("MaxObjectCount", 0);
3869 uint32ArgIParam operationTimeout("OperationTimeout");
|
3870 karl 1.127.2.1
3871 Boolean duplicateParameter = false;
3872 Boolean emptyTag;
3873
3874 for (const char* name;
3875 XmlReader::getIParamValueTag(parser, name, emptyTag); )
3876 {
|
3877 karl 1.127.2.5 if(objectName.get(parser, name, emptyTag))
|
3878 karl 1.127.2.1 {
|
3879 karl 1.127.2.5 objectName.iParamFound(duplicateParameter);
|
3880 karl 1.127.2.1 }
|
3881 karl 1.127.2.5 else if (assocClass.getOptional(parser, name, emptyTag))
|
3882 karl 1.127.2.1 {
|
3883 karl 1.127.2.5 assocClass.iParamFound(duplicateParameter);
|
3884 karl 1.127.2.1 }
|
3885 karl 1.127.2.5 else if (resultClass.getOptional(parser, name, emptyTag))
|
3886 karl 1.127.2.1 {
|
3887 karl 1.127.2.5 resultClass.iParamFound(duplicateParameter);
|
3888 karl 1.127.2.1 }
|
3889 karl 1.127.2.5 else if(role.get(parser, name, emptyTag))
|
3890 karl 1.127.2.1 {
|
3891 karl 1.127.2.5 role.iParamFound(duplicateParameter);
|
3892 karl 1.127.2.1 }
|
3893 karl 1.127.2.5 else if(resultRole.get(parser, name, emptyTag))
|
3894 karl 1.127.2.1 {
|
3895 karl 1.127.2.5 resultRole.iParamFound(duplicateParameter);
|
3896 karl 1.127.2.1 }
|
3897 karl 1.127.2.5 else if(includeClassOrigin.get(parser, name, emptyTag))
|
3898 karl 1.127.2.1 {
|
3899 karl 1.127.2.5 includeClassOrigin.iParamFound(duplicateParameter);
|
3900 karl 1.127.2.1 }
|
3901 karl 1.127.2.5 else if(propertyList.get(parser, name, emptyTag))
|
3902 karl 1.127.2.1 {
|
3903 karl 1.127.2.5 propertyList.iParamFound(duplicateParameter);
|
3904 karl 1.127.2.1 }
|
3905 karl 1.127.2.5 else if(filterQueryLanguage.get(parser, name, emptyTag))
|
3906 karl 1.127.2.1 {
|
3907 karl 1.127.2.5 filterQueryLanguage.iParamFound(duplicateParameter);
|
3908 karl 1.127.2.1 }
|
3909 karl 1.127.2.5 else if(filterQuery.get(parser, name, emptyTag))
|
3910 karl 1.127.2.1 {
|
3911 karl 1.127.2.5 filterQuery.iParamFound(duplicateParameter);
|
3912 karl 1.127.2.1 }
|
3913 karl 1.127.2.5 else if (continueOnError.get(parser, name, emptyTag))
|
3914 karl 1.127.2.1 {
|
3915 karl 1.127.2.5 continueOnError.iParamFound(duplicateParameter);
|
3916 karl 1.127.2.1 }
|
3917 karl 1.127.2.5 else if (operationTimeout.get(parser, name, emptyTag))
|
3918 karl 1.127.2.1 {
|
3919 karl 1.127.2.5 operationTimeout.iParamFound(duplicateParameter);
|
3920 karl 1.127.2.1 }
|
3921 karl 1.127.2.5 else if (maxObjectCount.get(parser, name, emptyTag))
|
3922 karl 1.127.2.1 {
|
3923 karl 1.127.2.5 maxObjectCount.iParamFound(duplicateParameter);
|
3924 karl 1.127.2.1 }
3925 else
3926 {
|
3927 karl 1.127.2.5 _throwCIMExceptionInvalidIParamName();
|
3928 karl 1.127.2.1 }
3929
|
3930 karl 1.127.2.5 // generate exception if endtag error or duplicate attributes
3931 _checkMissingEndTagOrDuplicateParamValue(
3932 parser, duplicateParameter, emptyTag);
|
3933 karl 1.127.2.1 }
3934
|
3935 karl 1.127.2.5 _testRequiredParametersExist(objectName.got);
|
3936 karl 1.127.2.1
3937 AutoPtr<CIMOpenAssociatorInstancesRequestMessage> request(
3938 new CIMOpenAssociatorInstancesRequestMessage(
3939 messageId,
3940 nameSpace,
|
3941 karl 1.127.2.5 objectName.value,
3942 assocClass.value,
3943 resultClass.value,
3944 role.value,
3945 resultRole.value,
3946 includeClassOrigin.value,
3947 propertyList.value,
3948 filterQueryLanguage.value,
3949 filterQuery.value,
3950 operationTimeout.value,
3951 continueOnError.value,
3952 maxObjectCount.value,
|
3953 karl 1.127.2.1 QueueIdStack(queueId, _returnQueueId)));
3954
3955 STAT_SERVERSTART
3956
3957 return request.release();
3958 }
3959
3960 CIMOpenAssociatorInstancePathsRequestMessage*
3961 CIMOperationRequestDecoder::decodeOpenAssociatorInstancePathsRequest(
3962 Uint32 queueId,
3963 XmlParser& parser,
3964 const String& messageId,
3965 const CIMNamespaceName& nameSpace)
3966 {
3967 STAT_GETSTARTTIME
3968
|
3969 karl 1.127.2.5 objectNameIParam objectName("InstanceName");
3970 classNameIParam assocClass("AssocClass");
3971 classNameIParam resultClass("ResultClass");
3972 stringIParam resultRole("Resultrole", false);
3973 stringIParam role("role", false);
3974
3975 stringIParam filterQueryLanguage("FilterQueryLanguage",false);
3976 stringIParam filterQuery("FilterQuery", false);
3977 booleanIParam continueOnError("ContinueOnError");
3978 uint32IParam maxObjectCount("MaxObjectCount", 0);
3979 uint32ArgIParam operationTimeout("OperationTimeout");
|
3980 karl 1.127.2.1
3981 Boolean duplicateParameter = false;
3982 Boolean emptyTag;
3983
3984 for (const char* name;
3985 XmlReader::getIParamValueTag(parser, name, emptyTag); )
3986 {
|
3987 karl 1.127.2.5 if(objectName.get(parser, name, emptyTag))
|
3988 karl 1.127.2.1 {
|
3989 karl 1.127.2.5 objectName.iParamFound(duplicateParameter);
|
3990 karl 1.127.2.1 }
|
3991 karl 1.127.2.5 else if (assocClass.getOptional(parser, name, emptyTag))
|
3992 karl 1.127.2.1 {
|
3993 karl 1.127.2.5 assocClass.iParamFound(duplicateParameter);
|
3994 karl 1.127.2.1 }
|
3995 karl 1.127.2.5 else if (resultClass.getOptional(parser, name, emptyTag))
|
3996 karl 1.127.2.1 {
|
3997 karl 1.127.2.5 resultClass.iParamFound(duplicateParameter);
|
3998 karl 1.127.2.1 }
|
3999 karl 1.127.2.5 else if(role.get(parser, name, emptyTag))
|
4000 karl 1.127.2.1 {
|
4001 karl 1.127.2.5 role.iParamFound(duplicateParameter);
|
4002 karl 1.127.2.1 }
|
4003 karl 1.127.2.5 else if(resultRole.get(parser, name, emptyTag))
|
4004 karl 1.127.2.1 {
|
4005 karl 1.127.2.5 resultRole.iParamFound(duplicateParameter);
|
4006 karl 1.127.2.1 }
|
4007 karl 1.127.2.5 else if(filterQueryLanguage.get(parser, name, emptyTag))
|
4008 karl 1.127.2.1 {
|
4009 karl 1.127.2.5 filterQueryLanguage.iParamFound(duplicateParameter);
|
4010 karl 1.127.2.1 }
|
4011 karl 1.127.2.5 else if(filterQuery.get(parser, name, emptyTag))
|
4012 karl 1.127.2.1 {
|
4013 karl 1.127.2.5 filterQuery.iParamFound(duplicateParameter);
|
4014 karl 1.127.2.1 }
|
4015 karl 1.127.2.5 else if (continueOnError.get(parser, name, emptyTag))
|
4016 karl 1.127.2.1 {
|
4017 karl 1.127.2.5 continueOnError.iParamFound(duplicateParameter);
|
4018 karl 1.127.2.1 }
|
4019 karl 1.127.2.5 else if (operationTimeout.get(parser, name, emptyTag))
|
4020 karl 1.127.2.1 {
|
4021 karl 1.127.2.5 operationTimeout.iParamFound(duplicateParameter);
|
4022 karl 1.127.2.1 }
|
4023 karl 1.127.2.5 else if (maxObjectCount.get(parser, name, emptyTag))
|
4024 karl 1.127.2.1 {
|
4025 karl 1.127.2.5 maxObjectCount.iParamFound(duplicateParameter);
|
4026 karl 1.127.2.1 }
4027 else
4028 {
|
4029 karl 1.127.2.5 _throwCIMExceptionInvalidIParamName();
|
4030 karl 1.127.2.1 }
4031
|
4032 karl 1.127.2.5 // generate exception if endtag error or duplicate attributes
4033 _checkMissingEndTagOrDuplicateParamValue(
4034 parser, duplicateParameter, emptyTag);
|
4035 karl 1.127.2.1 }
4036
|
4037 karl 1.127.2.5 _testRequiredParametersExist(objectName.got);
|
4038 karl 1.127.2.1
4039 AutoPtr<CIMOpenAssociatorInstancePathsRequestMessage> request(
4040 new CIMOpenAssociatorInstancePathsRequestMessage(
4041 messageId,
4042 nameSpace,
|
4043 karl 1.127.2.5 objectName.value,
4044 assocClass.value,
4045 resultClass.value,
4046 role.value,
4047 resultRole.value,
4048 filterQueryLanguage.value,
4049 filterQuery.value,
4050 operationTimeout.value,
4051 continueOnError.value,
4052 maxObjectCount.value,
|
4053 karl 1.127.2.1 QueueIdStack(queueId, _returnQueueId)));
4054
4055 STAT_SERVERSTART
4056
4057 return request.release();
4058 }
4059
4060 CIMPullInstancesWithPathRequestMessage*
4061 CIMOperationRequestDecoder::decodePullInstancesWithPathRequest(
4062 Uint32 queueId,
4063 XmlParser& parser,
4064 const String& messageId,
4065 const CIMNamespaceName& nameSpace)
4066 {
4067 STAT_GETSTARTTIME
4068
4069 String enumerationContext = String::EMPTY;
|
4070 karl 1.127.2.5 Uint32 maxObjectCount = 0;
|
4071 karl 1.127.2.1
4072 Boolean duplicateParameter = false;
4073 Boolean gotEnumerationContext = false;
4074 Boolean gotMaxObjectCount = false;
4075
4076 Boolean emptyTag;
4077
4078 for (const char* name;
4079 XmlReader::getIParamValueTag(parser, name, emptyTag); )
4080 {
4081 if (System::strcasecmp(name, "EnumerationContext") == 0)
4082 {
4083 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
4084 XmlReader::getStringValueElement(parser, enumerationContext, true);
4085 duplicateParameter = gotEnumerationContext;
4086 gotEnumerationContext = true;
4087 }
4088
4089 else if (System::strcasecmp(name, "MaxObjectCount") == 0)
4090 {
4091 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
4092 karl 1.127.2.1 XmlReader::getUint32ValueElement(parser, maxObjectCount, true);
4093 duplicateParameter = gotMaxObjectCount;
4094 gotMaxObjectCount = true;
4095 }
4096 else
4097 {
4098 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
4099 }
4100
4101 if (!emptyTag)
4102 {
4103 XmlReader::expectEndTag(parser, "IPARAMVALUE");
4104 }
4105
4106 if (duplicateParameter)
4107 {
4108
4109 throw PEGASUS_CIM_EXCEPTION(
4110 CIM_ERR_INVALID_PARAMETER, "Duplicate IPARAM received");
4111 }
4112 }
4113 karl 1.127.2.1
4114 if (!gotEnumerationContext)
4115 {
4116 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER,
4117 "EnumerationContext IPARAM required");
4118 }
4119
4120 if (!gotMaxObjectCount)
4121 {
4122 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER,
4123 "MaxObjectCount IPARAM required");
4124 }
4125
4126 AutoPtr<CIMPullInstancesWithPathRequestMessage> request(
4127 new CIMPullInstancesWithPathRequestMessage(
4128 messageId,
4129 nameSpace,
4130 enumerationContext,
4131 maxObjectCount,
4132 QueueIdStack(queueId, _returnQueueId)));
4133
4134 karl 1.127.2.1 STAT_SERVERSTART
4135
4136 return request.release();
4137 }
4138
4139 CIMPullInstancePathsRequestMessage*
4140 CIMOperationRequestDecoder::decodePullInstancePathsRequest(
4141 Uint32 queueId,
4142 XmlParser& parser,
4143 const String& messageId,
4144 const CIMNamespaceName& nameSpace)
4145 {
4146 STAT_GETSTARTTIME
4147
4148 String enumerationContext = String::EMPTY;
|
4149 karl 1.127.2.5 Uint32 maxObjectCount = 0;
|
4150 karl 1.127.2.1
4151 Boolean duplicateParameter = false;
4152 Boolean gotEnumerationContext = false;
4153 Boolean gotMaxObjectCount = false;
4154
4155 Boolean emptyTag;
4156
4157 for (const char* name;
4158 XmlReader::getIParamValueTag(parser, name, emptyTag); )
4159 {
4160 if (System::strcasecmp(name, "EnumerationContext") == 0)
4161 {
4162 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
4163 XmlReader::getStringValueElement(parser, enumerationContext, true);
4164 duplicateParameter = gotEnumerationContext;
4165 gotEnumerationContext = true;
4166 }
4167
4168 else if (System::strcasecmp(name, "MaxObjectCount") == 0)
4169 {
4170 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
4171 karl 1.127.2.1 XmlReader::getUint32ValueElement(parser, maxObjectCount, true);
4172 duplicateParameter = gotMaxObjectCount;
4173 gotMaxObjectCount = true;
4174 }
4175 else
4176 {
4177 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED,
4178 "Invalid IPARAMVALUE tag ");
4179 }
4180
4181 if (!emptyTag)
4182 {
4183 XmlReader::expectEndTag(parser, "IPARAMVALUE");
4184 }
4185
4186 if (duplicateParameter)
4187 {
4188 throw PEGASUS_CIM_EXCEPTION(
4189 CIM_ERR_INVALID_PARAMETER, String::EMPTY);
4190 }
4191 }
4192 karl 1.127.2.1
4193 if (!gotEnumerationContext)
4194 {
4195 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER,
4196 "EnumerationContext IPARAM required");
4197 }
4198
4199 if (!gotMaxObjectCount)
4200 {
4201 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER,
4202 "MaxObjectCount IPARAM required");
4203 }
4204
4205 AutoPtr<CIMPullInstancePathsRequestMessage> request(
4206 new CIMPullInstancePathsRequestMessage(
4207 messageId,
4208 nameSpace,
4209 enumerationContext,
4210 maxObjectCount,
4211 QueueIdStack(queueId, _returnQueueId)));
4212
4213 karl 1.127.2.1 STAT_SERVERSTART
4214
4215 return request.release();
4216 }
4217
4218 CIMCloseEnumerationRequestMessage*
4219 CIMOperationRequestDecoder::decodeCloseEnumerationRequest(
4220 Uint32 queueId,
4221 XmlParser& parser,
4222 const String& messageId,
4223 const CIMNamespaceName& nameSpace)
4224 {
4225 STAT_GETSTARTTIME
4226
4227 String enumerationContext = String::EMPTY;
4228 Boolean duplicateParameter = false;
4229 Boolean gotEnumerationContext = false;
4230
4231 Boolean emptyTag;
4232 for (const char* name;
4233 XmlReader::getIParamValueTag(parser, name, emptyTag); )
4234 karl 1.127.2.1 {
4235 if (System::strcasecmp(name, "EnumerationContext") == 0)
4236 {
4237 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
4238 XmlReader::getStringValueElement(parser, enumerationContext, true);
4239 duplicateParameter = gotEnumerationContext;
4240 gotEnumerationContext = true;
4241 }
4242 else
4243 {
4244 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
4245 }
4246
4247 if (!emptyTag)
4248 {
4249 XmlReader::expectEndTag(parser, "IPARAMVALUE");
4250 }
4251
4252
4253 if (duplicateParameter)
4254 {
4255 karl 1.127.2.1 throw PEGASUS_CIM_EXCEPTION(
4256 CIM_ERR_INVALID_PARAMETER, String::EMPTY);
4257 }
4258 }
4259
4260 if (!gotEnumerationContext)
4261 {
4262 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER,
4263 "EnumerationContext IPARAM required");
4264 }
4265
4266 AutoPtr<CIMCloseEnumerationRequestMessage> request(
4267 new CIMCloseEnumerationRequestMessage(
4268 messageId,
4269 nameSpace,
4270 enumerationContext,
4271 QueueIdStack(queueId, _returnQueueId)));
4272
4273 STAT_SERVERSTART
4274
4275 return request.release();
4276 karl 1.127.2.1 }
4277
4278
4279 CIMEnumerationCountRequestMessage*
4280 CIMOperationRequestDecoder::decodeEnumerationCountRequest(
4281 Uint32 queueId,
4282 XmlParser& parser,
4283 const String& messageId,
4284 const CIMNamespaceName& nameSpace)
4285 {
4286 STAT_GETSTARTTIME
4287
4288 String enumerationContext = String::EMPTY;
4289 Boolean duplicateParameter = false;
4290 Boolean gotEnumerationContext = false;
4291
4292 Boolean emptyTag;
4293
4294 for (const char* name;
4295 XmlReader::getIParamValueTag(parser, name, emptyTag); )
4296 {
4297 karl 1.127.2.1 if (System::strcasecmp(name, "EnumerationContext") == 0)
4298 {
4299 XmlReader::rejectNullIParamValue(parser, emptyTag, name);
4300 XmlReader::getStringValueElement(parser, enumerationContext, true);
4301 duplicateParameter = gotEnumerationContext;
4302 gotEnumerationContext = true;
4303 }
4304 else
4305 {
4306 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
4307 }
4308
4309 if (!emptyTag)
4310 {
4311 XmlReader::expectEndTag(parser, "IPARAMVALUE");
4312 }
4313
4314 if (duplicateParameter)
4315 {
4316 throw PEGASUS_CIM_EXCEPTION(
4317 CIM_ERR_INVALID_PARAMETER, String::EMPTY);
4318 karl 1.127.2.1 }
4319 }
4320
4321 if (!gotEnumerationContext)
4322 {
4323 throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER,
4324 "Missing EnumerationContext Parameter");
4325 }
4326
4327
4328 AutoPtr<CIMEnumerationCountRequestMessage> request(
4329 new CIMEnumerationCountRequestMessage(
4330 messageId,
4331 nameSpace,
4332 enumerationContext,
4333 QueueIdStack(queueId, _returnQueueId)));
4334
4335 STAT_SERVERSTART
4336
4337 return request.release();
4338 }
|
4339 karl 1.127.2.6
4340 CIMOpenQueryInstancesRequestMessage*
4341 CIMOperationRequestDecoder::decodeOpenQueryInstancesRequest(
4342 Uint32 queueId,
4343 XmlParser& parser,
4344 const String& messageId,
4345 const CIMNamespaceName& nameSpace)
4346 {
4347 STAT_GETSTARTTIME
4348
4349 stringIParam filterQueryLanguage("FilterQueryLanguage",true);
4350 stringIParam filterQuery("FilterQuery", true);
4351
4352 booleanIParam returnQueryResultClass("ReturnQueryResultClass");
4353 booleanIParam continueOnError("ContinueOnError");
4354 // [IN,OPTIONAL] uint32 MaxObjectCount = 0
4355 uint32IParam maxObjectCount("MaxObjectCount", 0);
4356 // [IN,OPTIONAL,NULL] uint32 OperationTimeout = NULL,
4357 uint32ArgIParam operationTimeout("OperationTimeout");
4358
4359 Boolean duplicateParameter = false;
4360 karl 1.127.2.6 Boolean emptyTag;
4361
4362 for (const char* name;
4363 XmlReader::getIParamValueTag(parser, name, emptyTag); )
4364 {
4365 // [IN,OPTIONAL,NULL] string FilterQueryLanguage = NULL,
4366 if(filterQueryLanguage.get(parser, name, emptyTag))
4367 {
4368 filterQueryLanguage.iParamFound(duplicateParameter);
4369 }
4370 // [IN,OPTIONAL,NULL] string FilterQuery = NULL,
4371 else if(filterQuery.get(parser, name, emptyTag))
4372 {
4373 filterQuery.iParamFound(duplicateParameter);
4374 }
4375 else if (returnQueryResultClass.get(parser, name, emptyTag))
4376 {
4377 returnQueryResultClass.iParamFound(duplicateParameter);
4378 }
4379 // [IN,OPTIONAL] Boolean ContinueOnError = false,
4380 else if (continueOnError.get(parser, name, emptyTag))
4381 karl 1.127.2.6 {
4382 continueOnError.iParamFound(duplicateParameter);
4383 }
4384 // [IN,OPTIONAL,NULL] uint32 OperationTimeout = NULL,
4385 else if (operationTimeout.get(parser, name, emptyTag))
4386 {
4387 operationTimeout.iParamFound(duplicateParameter);
4388 }
4389 // [IN,OPTIONAL] uint32 MaxObjectCount = 0
4390 else if (maxObjectCount.get(parser, name, emptyTag))
4391 {
4392 maxObjectCount.iParamFound(duplicateParameter);
4393 }
4394 else
4395 {
4396 _throwCIMExceptionInvalidIParamName(name);
4397 }
4398
4399 // generate exception if endtag error or duplicate attributes
4400 _checkMissingEndTagOrDuplicateParamValue(
4401 parser, duplicateParameter, emptyTag);
4402 karl 1.127.2.6 }
4403
4404 _testRequiredParametersExist(filterQuery.got);
4405 _testRequiredParametersExist(filterQueryLanguage.got);
4406
4407 AutoPtr<CIMOpenQueryInstancesRequestMessage> request(
4408 new CIMOpenQueryInstancesRequestMessage(
4409 messageId,
4410 nameSpace,
4411 filterQuery.value,
4412 filterQueryLanguage.value,
4413 returnQueryResultClass.value,
4414 operationTimeout.value,
4415 continueOnError.value,
4416 maxObjectCount.value,
4417 QueueIdStack(queueId, _returnQueueId)));
4418
4419 STAT_SERVERSTART
4420
4421 return request.release();
4422 }
|
4423 karl 1.127.2.3 //EXP_PULL_END
|
4424 karl 1.127.2.1
|
4425 mike 1.2 void CIMOperationRequestDecoder::setServerTerminating(Boolean flag)
4426 {
|
4427 kumpf 1.104 _serverTerminating = flag;
|
4428 mike 1.2 }
4429
4430 PEGASUS_NAMESPACE_END
|