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