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