1 martin 1.72 //%LICENSE////////////////////////////////////////////////////////////////
|
2 martin 1.73 //
|
3 martin 1.72 // 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.73 //
|
10 martin 1.72 // 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.73 //
|
17 martin 1.72 // The above copyright notice and this permission notice shall be included
18 // in all copies or substantial portions of the Software.
|
19 martin 1.73 //
|
20 martin 1.72 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
21 martin 1.73 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
22 martin 1.72 // 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.73 //
|
28 martin 1.72 //////////////////////////////////////////////////////////////////////////
|
29 kumpf 1.1 //
30 //%/////////////////////////////////////////////////////////////////////////////
31
32 #include "CIMClientRep.h"
33
34 #include <Pegasus/Common/MessageLoader.h>
|
35 joyce.j 1.41 #include <Pegasus/Common/System.h>
|
36 kumpf 1.51 #include <Pegasus/Common/LanguageParser.h>
|
37 kumpf 1.1
38 #include <iostream>
39 #include <fstream>
|
40 mike 1.55 #include <Pegasus/Common/Network.h>
|
41 karl 1.85 #include <Pegasus/Common/Logger.h>
|
42 kumpf 1.1
43 PEGASUS_USING_STD;
44
45 PEGASUS_NAMESPACE_BEGIN
46
|
47 mike 1.71
|
48 kumpf 1.1 ///////////////////////////////////////////////////////////////////////////////
49 //
50 // CIMClientRep
51 //
52 ///////////////////////////////////////////////////////////////////////////////
53
54 CIMClientRep::CIMClientRep(Uint32 timeoutMilliseconds)
55 :
56 MessageQueue(PEGASUS_QUEUENAME_CLIENT),
|
57 marek 1.83 _binaryResponse(false),
|
58 kumpf 1.1 _timeoutMilliseconds(timeoutMilliseconds),
|
59 kumpf 1.61 _connected(false),
|
60 mike 1.71 _doReconnect(false),
61 _binaryRequest(false),
|
62 r.kieninger 1.77 _localConnect(false)
|
63 kumpf 1.1 {
64 //
65 // Create Monitor and HTTPConnector
66 //
|
67 a.arora 1.31 _monitor.reset(new Monitor());
68 _httpConnector.reset(new HTTPConnector(_monitor.get()));
|
69 kumpf 1.1
|
70 kumpf 1.51 requestAcceptLanguages.clear();
71 requestContentLanguages.clear();
|
72 kumpf 1.1 }
73
74 CIMClientRep::~CIMClientRep()
75 {
76 disconnect();
77 }
78
79 void CIMClientRep::handleEnqueue()
80 {
81 }
82
|
83 mike 1.71 void CIMClientRep::_connect(bool binaryRequest, bool binaryResponse)
|
84 kumpf 1.1 {
|
85 karl 1.85 ClientTrace::setup();
|
86 kumpf 1.1
|
87 jsafrane 1.89 _authenticator.setHost(_connectHost);
88
|
89 kumpf 1.1 //
90 // Create response decoder:
91 //
|
92 kumpf 1.60 AutoPtr<CIMOperationResponseDecoder> responseDecoder(
93 new CIMOperationResponseDecoder(
|
94 karl 1.85 this, _requestEncoder.get(), &_authenticator ));
|
95 kumpf 1.1
96 //
97 // Attempt to establish a connection:
98 //
|
99 a.arora 1.31 AutoPtr<HTTPConnection> httpConnection(_httpConnector->connect(
|
100 kumpf 1.60 _connectHost,
101 _connectPortNumber,
102 _connectSSLContext.get(),
|
103 kumpf 1.68 _timeoutMilliseconds,
|
104 kumpf 1.60 responseDecoder.get()));
|
105 david.dillard 1.42
|
106 kumpf 1.1 //
107 // Create request encoder:
108 //
|
109 kumpf 1.30 String connectHost = _connectHost;
110 if (connectHost.size())
111 {
112 char portStr[32];
113 sprintf(portStr, ":%u", _connectPortNumber);
114 connectHost.append(portStr);
115 }
116
|
117 kumpf 1.60 AutoPtr<CIMOperationRequestEncoder> requestEncoder(
118 new CIMOperationRequestEncoder(
|
119 karl 1.85 httpConnection.get(), connectHost, &_authenticator,
|
120 mike 1.71 binaryRequest,
121 binaryResponse));
|
122 david.dillard 1.42
|
123 a.arora 1.31 _responseDecoder.reset(responseDecoder.release());
|
124 denise.eckstein 1.46 _httpConnection = httpConnection.release();
|
125 a.arora 1.31 _requestEncoder.reset(requestEncoder.release());
126 _responseDecoder->setEncoderQueue(_requestEncoder.get());
|
127 kumpf 1.60
128 //pass encoder and decoder a pointer to CIMClientRep::perfDataStore
|
129 a.dunfey 1.53 _requestEncoder->setDataStorePointer(&perfDataStore);
130 _responseDecoder->setDataStorePointer(&perfDataStore);
131
|
132 kumpf 1.61 _doReconnect = false;
|
133 kumpf 1.1 _connected = true;
|
134 mike 1.71 _binaryRequest = binaryRequest;
135 _binaryResponse = binaryResponse;
|
136 marek 1.56 _httpConnection->setSocketWriteTimeout(_timeoutMilliseconds/1000+1);
|
137 kumpf 1.1 }
138
|
139 dl.meetei 1.87 void CIMClientRep::_disconnect(bool keepChallengeStatus)
|
140 kumpf 1.8 {
141 if (_connected)
142 {
143 //
144 // destroy response decoder
145 //
|
146 a.arora 1.31 _responseDecoder.reset();
|
147 david.dillard 1.42
|
148 kumpf 1.8
149 //
150 // Close the connection
151 //
|
152 a.arora 1.31 if (_httpConnector.get())
|
153 kumpf 1.8 {
|
154 denise.eckstein 1.46 _httpConnector->disconnect(_httpConnection);
155 _httpConnection = 0;
|
156 kumpf 1.8 }
157
158 //
159 // destroy request encoder
160 //
|
161 a.arora 1.31 _requestEncoder.reset();
|
162 kumpf 1.8
163 _connected = false;
164 }
165
|
166 kumpf 1.61 // Reconnect no longer applies
167 _doReconnect = false;
168
169 // Let go of the cached request message if we have one
170 _authenticator.setRequestMessage(0);
|
171 venkat.puvvada 1.81
|
172 dl.meetei 1.87 if (keepChallengeStatus == false)
173 {
|
174 venkat.puvvada 1.81 // Reset the challenge status
175 _authenticator.resetChallengeStatus();
|
176 kumpf 1.1 }
|
177 dl.meetei 1.87 }
|
178 kumpf 1.1
179 void CIMClientRep::connect(
180 const String& host,
181 const Uint32 portNumber,
182 const String& userName,
|
183 kumpf 1.60 const String& password)
|
184 kumpf 1.1 {
185 //
186 // If already connected, bail out!
187 //
188 if (_connected)
189 throw AlreadyConnectedException();
190
191 //
|
192 b.whiteley 1.69 // If the host is empty and port is valid, set hostName to "localhost"
|
193 kumpf 1.74 // Otherwise, HTTPConnector will use the unix domain socket.
|
194 kumpf 1.1 //
195 String hostName = host;
|
196 b.whiteley 1.69 if (!host.size() && (portNumber != 0))
|
197 kumpf 1.1 {
198 hostName = "localhost";
199 }
200
201 //
202 // Set authentication information
203 //
|
204 kumpf 1.8 _authenticator.clear();
|
205 kumpf 1.1
206 if (userName.size())
207 {
208 _authenticator.setUserName(userName);
209 }
210
211 if (password.size())
212 {
213 _authenticator.setPassword(password);
214 }
215
|
216 a.arora 1.31 _connectSSLContext.reset();
|
217 kumpf 1.1 _connectHost = hostName;
218 _connectPortNumber = portNumber;
|
219 mike 1.71 _connect(_binaryRequest, _binaryResponse);
|
220 kumpf 1.1 }
221
222
223 void CIMClientRep::connect(
224 const String& host,
225 const Uint32 portNumber,
226 const SSLContext& sslContext,
227 const String& userName,
|
228 kumpf 1.60 const String& password)
|
229 kumpf 1.1 {
230 //
231 // If already connected, bail out!
232 //
233 if (_connected)
234 throw AlreadyConnectedException();
235
236 //
237 // If the host is empty, set hostName to "localhost"
238 //
239 String hostName = host;
240 if (host == String::EMPTY)
241 {
242 hostName = "localhost";
243 }
244
245 //
246 // Set authentication information
247 //
|
248 kumpf 1.8 _authenticator.clear();
|
249 kumpf 1.1
250 if (userName.size())
251 {
252 _authenticator.setUserName(userName);
253 }
254
255 if (password.size())
256 {
257 _authenticator.setPassword(password);
258 }
259
260 _connectHost = hostName;
261 _connectPortNumber = portNumber;
262
|
263 a.arora 1.32 _connectSSLContext.reset(new SSLContext(sslContext));
|
264 mike 1.71 _connect(_binaryRequest, _binaryResponse);
|
265 kumpf 1.1 }
266
267
268 void CIMClientRep::connectLocal()
269 {
|
270 mike 1.71 #if defined(PEGASUS_ENABLE_PROTOCOL_BINARY)
|
271 marek 1.82 _connectLocal(true);
|
272 mike 1.71 #else
|
273 marek 1.82 _connectLocal(false);
|
274 mike 1.71 #endif
|
275 marek 1.82 }
276
277 void CIMClientRep::connectLocalBinary()
278 {
279 _connectLocal(true);
280 }
281
282 void CIMClientRep::_connectLocal(bool binary)
283 {
284 bool binaryRequest = binary;
285 bool binaryResponse = binary;
|
286 mike 1.71
|
287 kumpf 1.1 //
288 // If already connected, bail out!
289 //
290 if (_connected)
291 throw AlreadyConnectedException();
292
293 //
294 // Set authentication type
295 //
|
296 kumpf 1.8 _authenticator.clear();
|
297 kumpf 1.1 _authenticator.setAuthType(ClientAuthenticator::LOCAL);
298
|
299 r.kieninger 1.77 _localConnect=true;
300
|
301 h.sterling 1.43 #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
|
302 a.arora 1.31 _connectSSLContext.reset();
|
303 kumpf 1.30 _connectHost = String::EMPTY;
304 _connectPortNumber = 0;
|
305 mike 1.71 _connect(binaryRequest, binaryResponse);
|
306 kumpf 1.1 #else
307
308 try
309 {
310 //
311 // Look up the WBEM HTTP port number for the local system
312 //
313 _connectPortNumber = System::lookupPort (WBEM_HTTP_SERVICE_NAME,
314 WBEM_DEFAULT_HTTP_PORT);
315
316 //
317 // Assign host
318 //
|
319 kumpf 1.61 _connectHost.assign(System::getHostName());
|
320 kumpf 1.1
|
321 a.arora 1.31 _connectSSLContext.reset();
|
322 kumpf 1.1
|
323 mike 1.71 _connect(binaryRequest, binaryResponse);
|
324 kumpf 1.1 }
|
325 kumpf 1.60 catch (const CannotConnectException &)
|
326 kumpf 1.1 {
327 //
328 // Look up the WBEM HTTPS port number for the local system
329 //
330 _connectPortNumber = System::lookupPort (WBEM_HTTPS_SERVICE_NAME,
331 WBEM_DEFAULT_HTTPS_PORT);
332
333 //
334 // Assign host
335 //
|
336 kumpf 1.61 _connectHost.assign(System::getHostName());
|
337 kumpf 1.1
338 //
339 // Create SSLContext
340 //
341 const char* pegasusHome = getenv("PEGASUS_HOME");
342
|
343 kumpf 1.63 String randFile;
|
344 kumpf 1.1
|
345 kumpf 1.66 # ifdef PEGASUS_SSL_RANDOMFILE
|
346 kumpf 1.1 randFile = FileSystem::getAbsolutePath(
347 pegasusHome, PEGASUS_SSLCLIENT_RANDOMFILE);
|
348 kumpf 1.66 # endif
|
349 kumpf 1.1
|
350 kumpf 1.66 // May throw SSLException
351 _connectSSLContext.reset(
352 new SSLContext(String::EMPTY, NULL, randFile));
|
353 kumpf 1.1
|
354 mike 1.71 _connect(binaryRequest, binaryResponse);
|
355 kumpf 1.1 }
356 #endif
357 }
358
359 void CIMClientRep::disconnect()
360 {
|
361 kumpf 1.8 _disconnect();
362 _authenticator.clear();
|
363 kumpf 1.28 _connectSSLContext.reset();
|
364 r.kieninger 1.77 _localConnect=false;
|
365 kumpf 1.8 }
|
366 kumpf 1.1
|
367 david.dillard 1.42 Boolean CIMClientRep::isConnected() const throw()
|
368 marek 1.21 {
|
369 david.dillard 1.42 return _connected;
|
370 marek 1.21 }
371
|
372 r.kieninger 1.77 Boolean CIMClientRep::isLocalConnect() const throw()
373 {
374 return _localConnect;
375 }
376
|
377 kumpf 1.52 AcceptLanguageList CIMClientRep::getRequestAcceptLanguages() const
|
378 kumpf 1.1 {
379 return requestAcceptLanguages;
380 }
381
|
382 kumpf 1.52 ContentLanguageList CIMClientRep::getRequestContentLanguages() const
|
383 kumpf 1.1 {
384 return requestContentLanguages;
385 }
386
|
387 kumpf 1.52 ContentLanguageList CIMClientRep::getResponseContentLanguages() const
|
388 kumpf 1.1 {
389 return responseContentLanguages;
390 }
391
|
392 kumpf 1.52 void CIMClientRep::setRequestAcceptLanguages(const AcceptLanguageList& langs)
|
393 kumpf 1.1 {
394 requestAcceptLanguages = langs;
395 }
396
|
397 kumpf 1.52 void CIMClientRep::setRequestContentLanguages(const ContentLanguageList& langs)
|
398 kumpf 1.1 {
399 requestContentLanguages = langs;
400 }
401
402 void CIMClientRep::setRequestDefaultLanguages()
403 {
|
404 kumpf 1.51 requestAcceptLanguages = LanguageParser::getDefaultAcceptLanguages();
|
405 kumpf 1.1 }
406
407 CIMClass CIMClientRep::getClass(
408 const CIMNamespaceName& nameSpace,
409 const CIMName& className,
410 Boolean localOnly,
411 Boolean includeQualifiers,
412 Boolean includeClassOrigin,
|
413 kumpf 1.60 const CIMPropertyList& propertyList)
|
414 kumpf 1.1 {
|
415 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMGetClassRequestMessage(
|
416 kumpf 1.1 String::EMPTY,
417 nameSpace,
418 className,
419 localOnly,
420 includeQualifiers,
421 includeClassOrigin,
422 propertyList,
|
423 a.arora 1.31 QueueIdStack()));
|
424 kumpf 1.1
425 Message* message = _doRequest(request, CIM_GET_CLASS_RESPONSE_MESSAGE);
426
427 CIMGetClassResponseMessage* response =
428 (CIMGetClassResponseMessage*)message;
429
|
430 a.arora 1.31 AutoPtr<CIMGetClassResponseMessage> destroyer(response);
|
431 kumpf 1.1
|
432 kumpf 1.60 return response->cimClass;
|
433 kumpf 1.1 }
434
|
435 thilo.boehm 1.79 CIMResponseData CIMClientRep::getInstance(
|
436 kumpf 1.1 const CIMNamespaceName& nameSpace,
437 const CIMObjectPath& instanceName,
438 Boolean localOnly,
439 Boolean includeQualifiers,
440 Boolean includeClassOrigin,
|
441 kumpf 1.60 const CIMPropertyList& propertyList)
|
442 kumpf 1.1 {
|
443 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMGetInstanceRequestMessage(
|
444 kumpf 1.1 String::EMPTY,
445 nameSpace,
446 instanceName,
447 includeQualifiers,
448 includeClassOrigin,
449 propertyList,
|
450 a.arora 1.31 QueueIdStack()));
|
451 kumpf 1.75 dynamic_cast<CIMGetInstanceRequestMessage*>(request.get())->localOnly =
452 localOnly;
|
453 kumpf 1.1
454 Message* message = _doRequest(request, CIM_GET_INSTANCE_RESPONSE_MESSAGE);
455
456 CIMGetInstanceResponseMessage* response =
457 (CIMGetInstanceResponseMessage*)message;
458
|
459 a.arora 1.31 AutoPtr<CIMGetInstanceResponseMessage> destroyer(response);
|
460 kumpf 1.1
|
461 thilo.boehm 1.79 return response->getResponseData();
|
462 kumpf 1.1 }
463
464 void CIMClientRep::deleteClass(
465 const CIMNamespaceName& nameSpace,
|
466 kumpf 1.60 const CIMName& className)
|
467 kumpf 1.1 {
|
468 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMDeleteClassRequestMessage(
|
469 kumpf 1.1 String::EMPTY,
470 nameSpace,
471 className,
|
472 a.arora 1.31 QueueIdStack()));
|
473 kumpf 1.1
474 Message* message = _doRequest(request, CIM_DELETE_CLASS_RESPONSE_MESSAGE);
475
476 CIMDeleteClassResponseMessage* response =
477 (CIMDeleteClassResponseMessage*)message;
478
|
479 a.arora 1.31 AutoPtr<CIMDeleteClassResponseMessage> destroyer(response);
|
480 kumpf 1.1 }
481
482 void CIMClientRep::deleteInstance(
483 const CIMNamespaceName& nameSpace,
|
484 kumpf 1.60 const CIMObjectPath& instanceName)
|
485 kumpf 1.1 {
|
486 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMDeleteInstanceRequestMessage(
|
487 kumpf 1.1 String::EMPTY,
488 nameSpace,
489 instanceName,
|
490 a.arora 1.31 QueueIdStack()));
|
491 kumpf 1.1
|
492 kumpf 1.60 Message* message =
493 _doRequest(request, CIM_DELETE_INSTANCE_RESPONSE_MESSAGE);
|
494 kumpf 1.1
495 CIMDeleteInstanceResponseMessage* response =
496 (CIMDeleteInstanceResponseMessage*)message;
497
|
498 a.arora 1.31 AutoPtr<CIMDeleteInstanceResponseMessage> destroyer(response);
|
499 kumpf 1.1 }
500
501 void CIMClientRep::createClass(
502 const CIMNamespaceName& nameSpace,
|
503 kumpf 1.60 const CIMClass& newClass)
|
504 kumpf 1.1 {
|
505 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMCreateClassRequestMessage(
|
506 kumpf 1.1 String::EMPTY,
507 nameSpace,
508 newClass,
|
509 a.arora 1.31 QueueIdStack()));
|
510 kumpf 1.1
511 Message* message = _doRequest(request, CIM_CREATE_CLASS_RESPONSE_MESSAGE);
512
513 CIMCreateClassResponseMessage* response =
514 (CIMCreateClassResponseMessage*)message;
515
|
516 a.arora 1.31 AutoPtr<CIMCreateClassResponseMessage> destroyer(response);
|
517 kumpf 1.1 }
518
519 CIMObjectPath CIMClientRep::createInstance(
520 const CIMNamespaceName& nameSpace,
|
521 kumpf 1.60 const CIMInstance& newInstance)
|
522 kumpf 1.1 {
|
523 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMCreateInstanceRequestMessage(
|
524 kumpf 1.1 String::EMPTY,
525 nameSpace,
526 newInstance,
|
527 a.arora 1.31 QueueIdStack()));
|
528 kumpf 1.1
|
529 kumpf 1.60 Message* message =
530 _doRequest(request, CIM_CREATE_INSTANCE_RESPONSE_MESSAGE);
|
531 kumpf 1.1
532 CIMCreateInstanceResponseMessage* response =
533 (CIMCreateInstanceResponseMessage*)message;
534
|
535 a.arora 1.31 AutoPtr<CIMCreateInstanceResponseMessage> destroyer(response);
|
536 kumpf 1.1
|
537 kumpf 1.60 return response->instanceName;
|
538 kumpf 1.1 }
539
540 void CIMClientRep::modifyClass(
541 const CIMNamespaceName& nameSpace,
|
542 kumpf 1.60 const CIMClass& modifiedClass)
|
543 kumpf 1.1 {
|
544 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMModifyClassRequestMessage(
|
545 kumpf 1.1 String::EMPTY,
546 nameSpace,
547 modifiedClass,
|
548 a.arora 1.31 QueueIdStack()));
|
549 kumpf 1.1
550 Message* message = _doRequest(request, CIM_MODIFY_CLASS_RESPONSE_MESSAGE);
551
552 CIMModifyClassResponseMessage* response =
553 (CIMModifyClassResponseMessage*)message;
554
|
555 a.arora 1.31 AutoPtr<CIMModifyClassResponseMessage> destroyer(response);
|
556 kumpf 1.1 }
557
558 void CIMClientRep::modifyInstance(
559 const CIMNamespaceName& nameSpace,
560 const CIMInstance& modifiedInstance,
561 Boolean includeQualifiers,
|
562 kumpf 1.60 const CIMPropertyList& propertyList)
|
563 kumpf 1.1 {
|
564 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMModifyInstanceRequestMessage(
|
565 kumpf 1.1 String::EMPTY,
566 nameSpace,
567 modifiedInstance,
568 includeQualifiers,
569 propertyList,
|
570 a.arora 1.31 QueueIdStack()));
|
571 kumpf 1.1
|
572 kumpf 1.60 Message* message =
573 _doRequest(request, CIM_MODIFY_INSTANCE_RESPONSE_MESSAGE);
|
574 kumpf 1.1
575 CIMModifyInstanceResponseMessage* response =
576 (CIMModifyInstanceResponseMessage*)message;
577
|
578 a.arora 1.31 AutoPtr<CIMModifyInstanceResponseMessage> destroyer(response);
|
579 kumpf 1.1 }
580
581 Array<CIMClass> CIMClientRep::enumerateClasses(
582 const CIMNamespaceName& nameSpace,
583 const CIMName& className,
584 Boolean deepInheritance,
585 Boolean localOnly,
586 Boolean includeQualifiers,
|
587 kumpf 1.60 Boolean includeClassOrigin)
|
588 kumpf 1.1 {
|
589 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMEnumerateClassesRequestMessage(
|
590 kumpf 1.1 String::EMPTY,
591 nameSpace,
592 className,
593 deepInheritance,
594 localOnly,
595 includeQualifiers,
596 includeClassOrigin,
|
597 a.arora 1.31 QueueIdStack()));
|
598 kumpf 1.1
|
599 kumpf 1.60 Message* message =
600 _doRequest(request, CIM_ENUMERATE_CLASSES_RESPONSE_MESSAGE);
|
601 kumpf 1.1
602 CIMEnumerateClassesResponseMessage* response =
603 (CIMEnumerateClassesResponseMessage*)message;
604
|
605 a.arora 1.31 AutoPtr<CIMEnumerateClassesResponseMessage> destroyer(response);
|
606 kumpf 1.1
|
607 kumpf 1.60 return response->cimClasses;
|
608 kumpf 1.1 }
609
610 Array<CIMName> CIMClientRep::enumerateClassNames(
611 const CIMNamespaceName& nameSpace,
612 const CIMName& className,
|
613 kumpf 1.60 Boolean deepInheritance)
|
614 kumpf 1.1 {
|
615 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMEnumerateClassNamesRequestMessage(
|
616 kumpf 1.1 String::EMPTY,
617 nameSpace,
618 className,
619 deepInheritance,
|
620 a.arora 1.31 QueueIdStack()));
|
621 kumpf 1.1
|
622 kumpf 1.60 Message* message =
623 _doRequest(request, CIM_ENUMERATE_CLASS_NAMES_RESPONSE_MESSAGE);
|
624 kumpf 1.1
625 CIMEnumerateClassNamesResponseMessage* response =
626 (CIMEnumerateClassNamesResponseMessage*)message;
627
|
628 a.arora 1.31 AutoPtr<CIMEnumerateClassNamesResponseMessage> destroyer(response);
|
629 kumpf 1.1
630 // Temporary code until internal structures use CIMName instead of String
631 Array<CIMName> classNameArray;
632 classNameArray.reserveCapacity(response->classNames.size());
633 for (Uint32 i=0; i<response->classNames.size(); i++)
634 {
635 classNameArray.append(response->classNames[i]);
636 }
|
637 kumpf 1.60 return classNameArray;
|
638 kumpf 1.1 }
639
|
640 thilo.boehm 1.79 CIMResponseData CIMClientRep::enumerateInstances(
|
641 kumpf 1.1 const CIMNamespaceName& nameSpace,
642 const CIMName& className,
643 Boolean deepInheritance,
644 Boolean localOnly,
645 Boolean includeQualifiers,
646 Boolean includeClassOrigin,
|
647 kumpf 1.60 const CIMPropertyList& propertyList)
|
648 kumpf 1.1 {
|
649 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMEnumerateInstancesRequestMessage(
|
650 kumpf 1.1 String::EMPTY,
651 nameSpace,
652 className,
653 deepInheritance,
654 includeQualifiers,
655 includeClassOrigin,
656 propertyList,
|
657 a.arora 1.31 QueueIdStack()));
|
658 kumpf 1.75 dynamic_cast<CIMEnumerateInstancesRequestMessage*>(
659 request.get())->localOnly = localOnly;
|
660 kumpf 1.1
|
661 kumpf 1.60 Message* message =
662 _doRequest(request, CIM_ENUMERATE_INSTANCES_RESPONSE_MESSAGE);
|
663 kumpf 1.1
664 CIMEnumerateInstancesResponseMessage* response =
665 (CIMEnumerateInstancesResponseMessage*)message;
666
|
667 a.arora 1.31 AutoPtr<CIMEnumerateInstancesResponseMessage> destroyer(response);
|
668 kumpf 1.1
|
669 thilo.boehm 1.79 return response->getResponseData();
|
670 kumpf 1.1 }
671
|
672 thilo.boehm 1.79 CIMResponseData CIMClientRep::enumerateInstanceNames(
|
673 kumpf 1.1 const CIMNamespaceName& nameSpace,
|
674 kumpf 1.60 const CIMName& className)
|
675 kumpf 1.1 {
|
676 kumpf 1.60 AutoPtr<CIMRequestMessage> request(
677 new CIMEnumerateInstanceNamesRequestMessage(
678 String::EMPTY,
679 nameSpace,
680 className,
681 QueueIdStack()));
|
682 kumpf 1.1
|
683 kumpf 1.60 Message* message =
684 _doRequest(request, CIM_ENUMERATE_INSTANCE_NAMES_RESPONSE_MESSAGE);
|
685 kumpf 1.1
686 CIMEnumerateInstanceNamesResponseMessage* response =
687 (CIMEnumerateInstanceNamesResponseMessage*)message;
688
|
689 a.arora 1.31 AutoPtr<CIMEnumerateInstanceNamesResponseMessage> destroyer(response);
|
690 kumpf 1.1
|
691 thilo.boehm 1.79 return response->getResponseData();
|
692 kumpf 1.1 }
693
|
694 thilo.boehm 1.79 CIMResponseData CIMClientRep::execQuery(
|
695 r.kieninger 1.77 const CIMNamespaceName& nameSpace,
696 const String& queryLanguage,
697 const String& query)
698 {
699 AutoPtr<CIMRequestMessage> request(new CIMExecQueryRequestMessage(
700 String::EMPTY,
701 nameSpace,
702 queryLanguage,
703 query,
704 QueueIdStack()));
705
706 Message* message = _doRequest(request, CIM_EXEC_QUERY_RESPONSE_MESSAGE);
707
708 CIMExecQueryResponseMessage* response =
709 (CIMExecQueryResponseMessage*)message;
710
711 AutoPtr<CIMExecQueryResponseMessage> destroyer(response);
712
|
713 thilo.boehm 1.79 return response->getResponseData();
|
714 kumpf 1.1 }
715
|
716 thilo.boehm 1.79 CIMResponseData CIMClientRep::associators(
|
717 r.kieninger 1.77 const CIMNamespaceName& nameSpace,
718 const CIMObjectPath& objectName,
719 const CIMName& assocClass,
720 const CIMName& resultClass,
721 const String& role,
722 const String& resultRole,
723 Boolean includeQualifiers,
724 Boolean includeClassOrigin,
725 const CIMPropertyList& propertyList)
726 {
727 AutoPtr<CIMRequestMessage> request(new CIMAssociatorsRequestMessage(
728 String::EMPTY,
729 nameSpace,
730 objectName,
731 assocClass,
732 resultClass,
733 role,
734 resultRole,
735 includeQualifiers,
736 includeClassOrigin,
737 propertyList,
738 r.kieninger 1.77 QueueIdStack()));
739
740 Message* message = _doRequest(request, CIM_ASSOCIATORS_RESPONSE_MESSAGE);
741
742 CIMAssociatorsResponseMessage* response =
743 (CIMAssociatorsResponseMessage*)message;
744
745 AutoPtr<CIMAssociatorsResponseMessage> destroyer(response);
746
|
747 thilo.boehm 1.79 return response->getResponseData();
|
748 r.kieninger 1.77 }
749
|
750 thilo.boehm 1.79 CIMResponseData CIMClientRep::associatorNames(
|
751 kumpf 1.1 const CIMNamespaceName& nameSpace,
752 const CIMObjectPath& objectName,
753 const CIMName& assocClass,
754 const CIMName& resultClass,
755 const String& role,
|
756 kumpf 1.60 const String& resultRole)
|
757 kumpf 1.1 {
|
758 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMAssociatorNamesRequestMessage(
|
759 kumpf 1.1 String::EMPTY,
760 nameSpace,
761 objectName,
762 assocClass,
763 resultClass,
764 role,
765 resultRole,
|
766 a.arora 1.31 QueueIdStack()));
|
767 kumpf 1.1
|
768 kumpf 1.60 Message* message =
769 _doRequest(request, CIM_ASSOCIATOR_NAMES_RESPONSE_MESSAGE);
|
770 kumpf 1.1
771 CIMAssociatorNamesResponseMessage* response =
772 (CIMAssociatorNamesResponseMessage*)message;
773
|
774 a.arora 1.31 AutoPtr<CIMAssociatorNamesResponseMessage> destroyer(response);
|
775 kumpf 1.1
|
776 thilo.boehm 1.79 return response->getResponseData();
|
777 kumpf 1.1 }
778
|
779 thilo.boehm 1.79 CIMResponseData CIMClientRep::references(
|
780 kumpf 1.1 const CIMNamespaceName& nameSpace,
781 const CIMObjectPath& objectName,
782 const CIMName& resultClass,
783 const String& role,
784 Boolean includeQualifiers,
785 Boolean includeClassOrigin,
|
786 kumpf 1.60 const CIMPropertyList& propertyList)
|
787 kumpf 1.1 {
|
788 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMReferencesRequestMessage(
|
789 kumpf 1.1 String::EMPTY,
790 nameSpace,
791 objectName,
792 resultClass,
793 role,
794 includeQualifiers,
795 includeClassOrigin,
796 propertyList,
|
797 a.arora 1.31 QueueIdStack()));
|
798 kumpf 1.1
799 Message* message = _doRequest(request, CIM_REFERENCES_RESPONSE_MESSAGE);
800
801 CIMReferencesResponseMessage* response =
802 (CIMReferencesResponseMessage*)message;
803
|
804 a.arora 1.31 AutoPtr<CIMReferencesResponseMessage> destroyer(response);
|
805 kumpf 1.1
|
806 thilo.boehm 1.79 return response->getResponseData();
|
807 kumpf 1.1 }
808
|
809 thilo.boehm 1.79 CIMResponseData CIMClientRep::referenceNames(
|
810 kumpf 1.1 const CIMNamespaceName& nameSpace,
811 const CIMObjectPath& objectName,
812 const CIMName& resultClass,
|
813 kumpf 1.60 const String& role)
|
814 kumpf 1.1 {
|
815 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMReferenceNamesRequestMessage(
|
816 kumpf 1.1 String::EMPTY,
817 nameSpace,
818 objectName,
819 resultClass,
820 role,
|
821 a.arora 1.31 QueueIdStack()));
|
822 kumpf 1.1
|
823 kumpf 1.60 Message* message =
824 _doRequest(request, CIM_REFERENCE_NAMES_RESPONSE_MESSAGE);
|
825 kumpf 1.1
826 CIMReferenceNamesResponseMessage* response =
827 (CIMReferenceNamesResponseMessage*)message;
828
|
829 a.arora 1.31 AutoPtr<CIMReferenceNamesResponseMessage> destroyer(response);
|
830 kumpf 1.1
|
831 thilo.boehm 1.79 return response->getResponseData();
|
832 kumpf 1.1 }
833
834 CIMValue CIMClientRep::getProperty(
835 const CIMNamespaceName& nameSpace,
836 const CIMObjectPath& instanceName,
|
837 kumpf 1.60 const CIMName& propertyName)
|
838 kumpf 1.1 {
|
839 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMGetPropertyRequestMessage(
|
840 kumpf 1.1 String::EMPTY,
841 nameSpace,
842 instanceName,
843 propertyName,
|
844 a.arora 1.31 QueueIdStack()));
|
845 kumpf 1.1
846 Message* message = _doRequest(request, CIM_GET_PROPERTY_RESPONSE_MESSAGE);
847
848 CIMGetPropertyResponseMessage* response =
849 (CIMGetPropertyResponseMessage*)message;
850
|
851 a.arora 1.31 AutoPtr<CIMGetPropertyResponseMessage> destroyer(response);
|
852 kumpf 1.1
|
853 kumpf 1.60 return response->value;
|
854 kumpf 1.1 }
855
856 void CIMClientRep::setProperty(
857 const CIMNamespaceName& nameSpace,
858 const CIMObjectPath& instanceName,
859 const CIMName& propertyName,
|
860 kumpf 1.60 const CIMValue& newValue)
|
861 kumpf 1.1 {
|
862 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMSetPropertyRequestMessage(
|
863 kumpf 1.1 String::EMPTY,
864 nameSpace,
865 instanceName,
866 propertyName,
867 newValue,
|
868 a.arora 1.31 QueueIdStack()));
|
869 kumpf 1.1
870 Message* message = _doRequest(request, CIM_SET_PROPERTY_RESPONSE_MESSAGE);
871
872 CIMSetPropertyResponseMessage* response =
873 (CIMSetPropertyResponseMessage*)message;
874
|
875 a.arora 1.31 AutoPtr<CIMSetPropertyResponseMessage> destroyer(response);
|
876 kumpf 1.1 }
877
878 CIMQualifierDecl CIMClientRep::getQualifier(
879 const CIMNamespaceName& nameSpace,
|
880 kumpf 1.60 const CIMName& qualifierName)
|
881 kumpf 1.1 {
|
882 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMGetQualifierRequestMessage(
|
883 kumpf 1.1 String::EMPTY,
884 nameSpace,
885 qualifierName,
|
886 a.arora 1.31 QueueIdStack()));
|
887 kumpf 1.1
888 Message* message = _doRequest(request, CIM_GET_QUALIFIER_RESPONSE_MESSAGE);
889
890 CIMGetQualifierResponseMessage* response =
891 (CIMGetQualifierResponseMessage*)message;
892
|
893 a.arora 1.31 AutoPtr<CIMGetQualifierResponseMessage> destroyer(response);
|
894 kumpf 1.1
|
895 kumpf 1.60 return response->cimQualifierDecl;
|
896 kumpf 1.1 }
897
898 void CIMClientRep::setQualifier(
899 const CIMNamespaceName& nameSpace,
|
900 kumpf 1.60 const CIMQualifierDecl& qualifierDeclaration)
|
901 kumpf 1.1 {
|
902 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMSetQualifierRequestMessage(
|
903 kumpf 1.1 String::EMPTY,
904 nameSpace,
905 qualifierDeclaration,
|
906 a.arora 1.31 QueueIdStack()));
|
907 kumpf 1.1
908 Message* message = _doRequest(request, CIM_SET_QUALIFIER_RESPONSE_MESSAGE);
909
910 CIMSetQualifierResponseMessage* response =
911 (CIMSetQualifierResponseMessage*)message;
912
|
913 a.arora 1.31 AutoPtr<CIMSetQualifierResponseMessage> destroyer(response);
|
914 kumpf 1.1 }
915
916 void CIMClientRep::deleteQualifier(
917 const CIMNamespaceName& nameSpace,
|
918 kumpf 1.60 const CIMName& qualifierName)
|
919 kumpf 1.1 {
|
920 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMDeleteQualifierRequestMessage(
|
921 kumpf 1.1 String::EMPTY,
922 nameSpace,
923 qualifierName,
|
924 a.arora 1.31 QueueIdStack()));
|
925 kumpf 1.1
|
926 kumpf 1.60 Message* message =
927 _doRequest(request, CIM_DELETE_QUALIFIER_RESPONSE_MESSAGE);
|
928 kumpf 1.1
929 CIMDeleteQualifierResponseMessage* response =
930 (CIMDeleteQualifierResponseMessage*)message;
931
|
932 a.arora 1.31 AutoPtr<CIMDeleteQualifierResponseMessage> destroyer(response);
|
933 kumpf 1.1 }
934
935 Array<CIMQualifierDecl> CIMClientRep::enumerateQualifiers(
|
936 kumpf 1.60 const CIMNamespaceName& nameSpace)
|
937 kumpf 1.1 {
|
938 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMEnumerateQualifiersRequestMessage(
|
939 kumpf 1.1 String::EMPTY,
940 nameSpace,
|
941 a.arora 1.31 QueueIdStack()));
|
942 kumpf 1.1
|
943 kumpf 1.60 Message* message =
944 _doRequest(request, CIM_ENUMERATE_QUALIFIERS_RESPONSE_MESSAGE);
|
945 kumpf 1.1
946 CIMEnumerateQualifiersResponseMessage* response =
947 (CIMEnumerateQualifiersResponseMessage*)message;
948
|
949 a.arora 1.31 AutoPtr<CIMEnumerateQualifiersResponseMessage> destroyer(response);
|
950 kumpf 1.1
|
951 kumpf 1.60 return response->qualifierDeclarations;
|
952 kumpf 1.1 }
953
954 CIMValue CIMClientRep::invokeMethod(
955 const CIMNamespaceName& nameSpace,
956 const CIMObjectPath& instanceName,
957 const CIMName& methodName,
958 const Array<CIMParamValue>& inParameters,
|
959 kumpf 1.60 Array<CIMParamValue>& outParameters)
|
960 kumpf 1.1 {
961 // ATTN-RK-P2-20020301: Does it make sense to have a nameSpace parameter
962 // when the namespace should already be included in the instanceName?
963 // ATTN-RK-P3-20020301: Do we need to make sure the caller didn't specify
964 // a host name in the instanceName?
965
|
966 david.dillard 1.42 // solved with PEP#139 Stage1 as other CIMOMs contained in the object path
967 // will cause a TypeMisMatchException
|
968 marek 1.12
|
969 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMInvokeMethodRequestMessage(
|
970 kumpf 1.1 String::EMPTY,
971 nameSpace,
972 instanceName,
973 methodName,
974 inParameters,
|
975 a.arora 1.31 QueueIdStack()));
|
976 kumpf 1.1
977 Message* message = _doRequest(request, CIM_INVOKE_METHOD_RESPONSE_MESSAGE);
978
979 CIMInvokeMethodResponseMessage* response =
980 (CIMInvokeMethodResponseMessage*)message;
981
|
982 a.arora 1.31 AutoPtr<CIMInvokeMethodResponseMessage> destroyer(response);
|
983 kumpf 1.1
984 outParameters = response->outParameters;
985
|
986 kumpf 1.60 return response->retValue;
|
987 karl 1.88 }
988
989 // EXP_PULL_BEGIN
990 CIMResponseData CIMClientRep::openEnumerateInstances(
991 CIMEnumerationContext& enumerationContext,
992 Boolean& endOfSequence,
993 const CIMNamespaceName& nameSpace,
994 const CIMName& className,
995 Boolean deepInheritance,
996 Boolean includeClassOrigin,
997 const CIMPropertyList& propertyList,
998 const String& filterQueryLanguage,
999 const String& filterQuery,
1000 const Uint32Arg& operationTimeout,
1001 Boolean continueOnError,
1002 Uint32 maxObjectCount)
1003 {
1004 // Save requied information in enumerationContext
1005 enumerationContext.setNameSpace(nameSpace);
1006
1007 // Create/send the request message
1008 karl 1.88 AutoPtr<CIMRequestMessage> request(
1009 new CIMOpenEnumerateInstancesRequestMessage(
1010 String::EMPTY, // messageId_ param
1011 nameSpace,
1012 className,
1013 deepInheritance,
1014 includeClassOrigin,
1015 propertyList,
1016 filterQueryLanguage,
1017 filterQuery,
1018 operationTimeout,
1019 continueOnError,
1020 maxObjectCount,
1021 QueueIdStack()));
1022
1023 Message* message =
1024 _doRequest(request, CIM_OPEN_ENUMERATE_INSTANCES_RESPONSE_MESSAGE);
1025
1026 // When Response received, get response message, get output parameters
1027 // and return data
1028 CIMOpenEnumerateInstancesResponseMessage* response =
1029 karl 1.88 (CIMOpenEnumerateInstancesResponseMessage*)message;
1030
1031 AutoPtr<CIMOpenEnumerateInstancesResponseMessage> destroyer(response);
1032
1033 // set endOfSequence and context return parameters
1034 endOfSequence = response->endOfSequence;
1035 enumerationContext.setContextString(response->enumerationContext);
1036
1037 return response->getResponseData();
1038 }
1039
1040
1041 CIMResponseData CIMClientRep::openEnumerateInstancePaths(
1042 CIMEnumerationContext& enumerationContext,
1043 Boolean& endOfSequence,
1044 const CIMNamespaceName& nameSpace,
1045 const CIMName& className,
1046 const String& filterQueryLanguage,
1047 const String& filterQuery,
1048 const Uint32Arg& operationTimeout,
1049 Boolean continueOnError,
1050 karl 1.88 Uint32 maxObjectCount)
1051 {
1052 AutoPtr<CIMRequestMessage> request(
1053 new CIMOpenEnumerateInstancePathsRequestMessage(
1054 String::EMPTY, // messageId_ param
1055 nameSpace,
1056 className,
1057 filterQueryLanguage,
1058 filterQuery,
1059 operationTimeout,
1060 continueOnError,
1061 maxObjectCount,
1062 QueueIdStack()));
1063
1064 enumerationContext.setNameSpace(nameSpace);
1065 Message* message =
1066 _doRequest(request, CIM_OPEN_ENUMERATE_INSTANCE_PATHS_RESPONSE_MESSAGE);
1067
1068 CIMOpenEnumerateInstancePathsResponseMessage* response =
1069 (CIMOpenEnumerateInstancePathsResponseMessage*)message;
1070
1071 karl 1.88 AutoPtr<CIMOpenEnumerateInstancePathsResponseMessage> destroyer(response);
1072
1073 // set paramters to be returned to caller
1074 endOfSequence = response->endOfSequence;
1075 enumerationContext.setContextString(response->enumerationContext);
1076
1077 return response->getResponseData();
1078 }
1079
1080 CIMResponseData CIMClientRep::openReferenceInstances(
1081 CIMEnumerationContext& enumerationContext,
1082 Boolean& endOfSequence,
1083 const CIMNamespaceName& nameSpace,
1084 const CIMObjectPath& objectName,
1085 const CIMName& resultClass,
1086 const String& role,
1087 Boolean includeClassOrigin,
1088 const CIMPropertyList& propertyList,
1089 const String& filterQueryLanguage,
1090 const String& filterQuery,
1091 const Uint32Arg& operationTimeout,
1092 karl 1.88 Boolean continueOnError,
1093 Uint32 maxObjectCount)
1094 {
1095 AutoPtr<CIMRequestMessage> request(
1096 new CIMOpenReferenceInstancesRequestMessage(
1097 String::EMPTY, // messageId_ param
1098 nameSpace,
1099 objectName,
1100 resultClass,
1101 role,
1102 includeClassOrigin,
1103 propertyList,
1104 filterQueryLanguage,
1105 filterQuery,
1106 operationTimeout,
1107 continueOnError,
1108 maxObjectCount,
1109 QueueIdStack()));
1110
1111 enumerationContext.setNameSpace(nameSpace);
1112 Message* message =
1113 karl 1.88 _doRequest(request, CIM_OPEN_REFERENCE_INSTANCES_RESPONSE_MESSAGE);
1114
1115 CIMOpenReferenceInstancesResponseMessage* response =
1116 (CIMOpenReferenceInstancesResponseMessage*)message;
1117
1118 AutoPtr<CIMOpenReferenceInstancesResponseMessage> destroyer(response);
1119
1120 // set paramters to be returned to caller
1121 endOfSequence = response->endOfSequence;
1122 enumerationContext.setContextString(response->enumerationContext);
1123
1124 return response->getResponseData();
1125 }
1126
1127
1128 CIMResponseData CIMClientRep::openReferenceInstancePaths(
1129 CIMEnumerationContext& enumerationContext,
1130 Boolean& endOfSequence,
1131 const CIMNamespaceName& nameSpace,
1132 const CIMObjectPath& objectName,
1133 const CIMName& resultClass,
1134 karl 1.88 const String& role,
1135 const String& filterQueryLanguage,
1136 const String& filterQuery,
1137 const Uint32Arg& operationTimeout,
1138 Boolean continueOnError,
1139 Uint32 maxObjectCount)
1140 {
1141 AutoPtr<CIMRequestMessage> request(
1142 new CIMOpenReferenceInstancePathsRequestMessage(
1143 String::EMPTY, // messageId_ param
1144 nameSpace,
1145 objectName,
1146 resultClass,
1147 role,
1148 filterQueryLanguage,
1149 filterQuery,
1150 operationTimeout,
1151 continueOnError,
1152 maxObjectCount,
1153 QueueIdStack()));
1154
1155 karl 1.88 enumerationContext.setNameSpace(nameSpace);
1156 Message* message =
1157 _doRequest(request, CIM_OPEN_REFERENCE_INSTANCE_PATHS_RESPONSE_MESSAGE);
1158
1159 CIMOpenReferenceInstancePathsResponseMessage* response =
1160 (CIMOpenReferenceInstancePathsResponseMessage*)message;
1161
1162 AutoPtr<CIMOpenReferenceInstancePathsResponseMessage> destroyer(response);
1163
1164 // set paramters to be returned to caller
1165 endOfSequence = response->endOfSequence;
1166 enumerationContext.setContextString(response->enumerationContext);
1167
1168 return response->getResponseData();
1169 }
1170
1171 CIMResponseData CIMClientRep::openAssociatorInstances(
1172 CIMEnumerationContext& enumerationContext,
1173 Boolean& endOfSequence,
1174 const CIMNamespaceName& nameSpace,
1175 const CIMObjectPath& objectName,
1176 karl 1.88 const CIMName& assocClass,
1177 const CIMName& resultClass,
1178 const String& role,
1179 const String& resultRole,
1180 Boolean includeClassOrigin,
1181 const CIMPropertyList& propertyList,
1182 const String& filterQueryLanguage,
1183 const String& filterQuery,
1184 const Uint32Arg& operationTimeout,
1185 Boolean continueOnError,
1186 Uint32 maxObjectCount )
1187 {
1188 AutoPtr<CIMRequestMessage> request(
1189 new CIMOpenAssociatorInstancesRequestMessage(
1190 String::EMPTY, // messageId_ param
1191 nameSpace,
1192 objectName,
1193 assocClass,
1194 resultClass,
1195 role,
1196 resultRole,
1197 karl 1.88 includeClassOrigin,
1198 propertyList,
1199 filterQueryLanguage,
1200 filterQuery,
1201 operationTimeout,
1202 continueOnError,
1203 maxObjectCount,
1204 QueueIdStack()));
1205
1206 enumerationContext.setNameSpace(nameSpace);
1207
1208 Message* message =
1209 _doRequest(request, CIM_OPEN_ASSOCIATOR_INSTANCES_RESPONSE_MESSAGE);
1210
1211 CIMOpenAssociatorInstancesResponseMessage* response =
1212 (CIMOpenAssociatorInstancesResponseMessage*)message;
1213
1214 AutoPtr<CIMOpenAssociatorInstancesResponseMessage> destroyer(response);
1215
1216 // set parameters to be returned to caller
1217 endOfSequence = response->endOfSequence;
1218 karl 1.88 enumerationContext.setContextString(response->enumerationContext);
1219
1220 return response->getResponseData();
1221 }
1222
1223 CIMResponseData CIMClientRep::openAssociatorInstancePaths(
1224 CIMEnumerationContext& enumerationContext,
1225 Boolean& endOfSequence,
1226 const CIMNamespaceName& nameSpace,
1227 const CIMObjectPath& objectName,
1228 const CIMName& assocClass,
1229 const CIMName& resultClass,
1230 const String& role,
1231 const String& resultRole,
1232 const String& filterQueryLanguage,
1233 const String& filterQuery,
1234 const Uint32Arg& operationTimeout,
1235 Boolean continueOnError,
1236 Uint32 maxObjectCount)
1237 {
1238 AutoPtr<CIMRequestMessage> request(
1239 karl 1.88 new CIMOpenAssociatorInstancePathsRequestMessage(
1240 String::EMPTY, // messageId_ param
1241 nameSpace,
1242 objectName,
1243 assocClass,
1244 resultClass,
1245 role,
1246 resultRole,
1247 filterQueryLanguage,
1248 filterQuery,
1249 operationTimeout,
1250 continueOnError,
1251 maxObjectCount,
1252 QueueIdStack()));
1253
1254 enumerationContext.setNameSpace(nameSpace);
1255 Message* message =
1256 _doRequest(request,
1257 CIM_OPEN_ASSOCIATOR_INSTANCE_PATHS_RESPONSE_MESSAGE);
1258
1259 CIMOpenAssociatorInstancePathsResponseMessage* response =
1260 karl 1.88 (CIMOpenAssociatorInstancePathsResponseMessage*)message;
1261
1262 AutoPtr<CIMOpenAssociatorInstancePathsResponseMessage> destroyer(response);
1263
1264 // set paramters to be returned to caller
1265 endOfSequence = response->endOfSequence;
1266 enumerationContext.setContextString(response->enumerationContext);
1267
1268 return response->getResponseData();
1269 }
1270
1271 CIMResponseData CIMClientRep::pullInstancesWithPath(
1272 CIMEnumerationContext& enumerationContext,
1273 Boolean& endOfSequence,
1274 Uint32 maxObjectCount)
1275 {
1276 AutoPtr<CIMRequestMessage> request(
1277 new CIMPullInstancesWithPathRequestMessage(
1278 String::EMPTY, // messageId_ param
1279 enumerationContext.getNameSpace(),
1280 enumerationContext.getContextString(),
1281 karl 1.88 maxObjectCount,
1282 QueueIdStack() ));
1283
1284 Message* message =
1285 _doRequest(request, CIM_PULL_INSTANCES_WITH_PATH_RESPONSE_MESSAGE);
1286
1287 CIMPullInstancesWithPathResponseMessage* response =
1288 (CIMPullInstancesWithPathResponseMessage*)message;
1289
1290 AutoPtr<CIMPullInstancesWithPathResponseMessage> destroyer(response);
1291
1292 // set paramters to be returned to caller
1293 endOfSequence = response->endOfSequence;
1294 enumerationContext.setContextString(response->enumerationContext);
1295
1296 return response->getResponseData();
1297 }
1298
1299 CIMResponseData CIMClientRep::pullInstancePaths(
1300 CIMEnumerationContext& enumerationContext,
1301 Boolean& endOfSequence,
1302 karl 1.88 Uint32 maxObjectCount)
1303 {
1304 AutoPtr<CIMRequestMessage> request(
1305 new CIMPullInstancePathsRequestMessage(
1306 String::EMPTY, // messageId_ param
1307 enumerationContext.getNameSpace(),
1308 enumerationContext.getContextString(),
1309 maxObjectCount,
1310 QueueIdStack()
1311 ));
1312
1313 Message* message =
1314 _doRequest(request, CIM_PULL_INSTANCE_PATHS_RESPONSE_MESSAGE);
1315
1316 CIMPullInstancePathsResponseMessage* response =
1317 (CIMPullInstancePathsResponseMessage*)message;
1318
1319 AutoPtr<CIMPullInstancePathsResponseMessage> destroyer(response);
1320
1321 // set paramters to be returned to caller
1322 endOfSequence = response->endOfSequence;
1323 karl 1.88 enumerationContext.setContextString(response->enumerationContext);
1324
1325 return response->getResponseData();
1326 }
1327
1328 CIMResponseData CIMClientRep::pullInstances(
1329 CIMEnumerationContext& enumerationContext,
1330 Boolean& endOfSequence,
1331 Uint32 maxObjectCount)
1332 {
1333 AutoPtr<CIMRequestMessage> request(
1334 new CIMPullInstancesRequestMessage(
1335 String::EMPTY, // messageId_ param
1336 enumerationContext.getNameSpace(),
1337 enumerationContext.getContextString(),
1338 maxObjectCount,
1339 QueueIdStack() ));
1340
1341 Message* message =
1342 _doRequest(request, CIM_PULL_INSTANCES_RESPONSE_MESSAGE);
1343
1344 karl 1.88 CIMPullInstancesResponseMessage* response =
1345 (CIMPullInstancesResponseMessage*)message;
1346
1347 AutoPtr<CIMPullInstancesResponseMessage> destroyer(response);
1348
1349 // set paramters to be returned to caller
1350 endOfSequence = response->endOfSequence;
1351 enumerationContext.setContextString(response->enumerationContext);
1352
1353 return response->getResponseData();
1354 }
1355
1356 void CIMClientRep::closeEnumeration(
1357 CIMEnumerationContext& enumerationContext)
1358 {
1359 AutoPtr<CIMRequestMessage> request(
1360 new CIMCloseEnumerationRequestMessage(
1361 String::EMPTY, // messageId_ param
1362 enumerationContext.getNameSpace(),
1363 enumerationContext.getContextString(),
1364 QueueIdStack()
1365 karl 1.88 ));
1366
1367 Message* message =
1368 _doRequest(request, CIM_CLOSE_ENUMERATION_RESPONSE_MESSAGE);
1369
1370 CIMCloseEnumerationResponseMessage* response =
1371 (CIMCloseEnumerationResponseMessage*)message;
1372
1373 AutoPtr<CIMCloseEnumerationResponseMessage> destroyer(response);
1374
1375 return;
1376 }
1377
1378 Uint64Arg CIMClientRep::enumerationCount(
1379 CIMEnumerationContext& enumerationContext)
1380 {
1381 if (enumerationContext.getContextString().size())
1382 {
1383 throw InvalidEnumerationContextException();
1384 }
1385 AutoPtr<CIMRequestMessage> request(
1386 karl 1.88 new CIMEnumerationCountRequestMessage(
1387 String::EMPTY, // messageId_ param
1388 enumerationContext.getNameSpace(),
1389 enumerationContext.getContextString(),
1390 QueueIdStack()
1391 ));
1392
1393 Message* message =
1394 _doRequest(request, CIM_ENUMERATION_COUNT_RESPONSE_MESSAGE);
1395
1396 CIMEnumerationCountResponseMessage* response =
1397 (CIMEnumerationCountResponseMessage*)message;
1398
1399 AutoPtr<CIMEnumerationCountResponseMessage> destroyer(response);
1400
1401 return response->count ;
1402 }
1403
1404 CIMResponseData CIMClientRep::openQueryInstances(
1405 CIMEnumerationContext& enumerationContext,
1406 Boolean& endOfSequence,
1407 karl 1.88 const CIMNamespaceName& nameSpace,
1408 const String& queryLanguage,
1409 const String& query,
1410 CIMClass& queryResultClass,
1411 Boolean returnQueryResultClass,
1412 const Uint32Arg& operationTimeout,
1413 Boolean continueOnError,
1414 Uint32 maxObjectCount)
1415 {
1416 // Save requied information in enumerationContext
1417 enumerationContext.setNameSpace(nameSpace);
1418
1419 // Create/send the request message
1420 AutoPtr<CIMRequestMessage> request(
1421 new CIMOpenQueryInstancesRequestMessage(
1422 String::EMPTY, // messageId_ param
1423 nameSpace,
1424 queryLanguage,
1425 query,
1426 returnQueryResultClass,
1427 operationTimeout,
1428 karl 1.88 continueOnError,
1429 maxObjectCount,
1430 QueueIdStack()));
1431
1432 Message* message =
1433 _doRequest(request, CIM_OPEN_QUERY_INSTANCES_RESPONSE_MESSAGE);
1434
1435 // When Response received, get response message, get output parameters
1436 // and return data
1437 CIMOpenQueryInstancesResponseMessage* response =
1438 (CIMOpenQueryInstancesResponseMessage*)message;
1439
1440 AutoPtr<CIMOpenQueryInstancesResponseMessage> destroyer(response);
1441
1442 // set endOfSequence and context return parameters
1443 endOfSequence = response->endOfSequence;
1444 enumerationContext.setContextString(response->enumerationContext);
|
1445 karl 1.85
|
1446 karl 1.88 return response->getResponseData();
|
1447 kumpf 1.1 }
|
1448 karl 1.88 //EXP_PULL_END
|
1449 kumpf 1.1
1450 Message* CIMClientRep::_doRequest(
|
1451 a.arora 1.31 AutoPtr<CIMRequestMessage>& request,
|
1452 kumpf 1.65 MessageType expectedResponseMessageType)
|
1453 kumpf 1.1 {
|
1454 kumpf 1.61 if (!_connected && !_doReconnect)
|
1455 kumpf 1.1 {
1456 throw NotConnectedException();
1457 }
1458
|
1459 harsha.bm 1.78 // Check if the connection has to be re-established
|
1460 harsha.bm 1.80 if ( _connected && _httpConnection->needsReconnect() )
|
1461 harsha.bm 1.78 {
1462 _disconnect();
1463 _doReconnect = true;
1464 }
1465
|
1466 kumpf 1.61 if (_doReconnect)
1467 {
|
1468 mike 1.71 _connect(_binaryRequest, _binaryResponse);
|
1469 kumpf 1.61 _doReconnect = false;
1470 }
1471
|
1472 kumpf 1.1 String messageId = XmlWriter::getNextMessageId();
1473 const_cast<String &>(request->messageId) = messageId;
1474
|
1475 kumpf 1.8 _authenticator.setRequestMessage(0);
|
1476 kumpf 1.1
1477 // ATTN-RK-P2-20020416: We should probably clear out the queue first.
1478 PEGASUS_ASSERT(getCount() == 0); // Shouldn't be any messages in our queue
1479
1480 //
|
1481 karl 1.2 // Set HTTP method in request to POST
|
1482 kumpf 1.1 //
|
1483 david.dillard 1.42 //Bug 478/418 - Change this to do post call, not mpost
|
1484 karl 1.2 request->setHttpMethod (HTTP_METHOD__POST);
|
1485 kumpf 1.1
1486 // Set the Accept-Languages and Content-Languages into
1487 // the request message
1488
|
1489 kumpf 1.60 request->operationContext.set(
1490 AcceptLanguageListContainer(requestAcceptLanguages));
1491 request->operationContext.set(
1492 ContentLanguageListContainer(requestContentLanguages));
|
1493 se.gupta 1.22
1494
|
1495 kumpf 1.60 //gathering statistical information about client operation
1496 perfDataStore.reset();
1497 perfDataStore.setOperationType(request->getType());
1498 perfDataStore.setMessageID(request->messageId);
|
1499 w.white 1.35
|
1500 kumpf 1.1 // Sending a new request, so clear out the response Content-Languages
|
1501 kumpf 1.51 responseContentLanguages.clear();
|
1502 kumpf 1.1
|
1503 a.arora 1.32 _requestEncoder->enqueue(request.get());
1504 request.release();
|
1505 kumpf 1.1
1506 Uint64 startMilliseconds = TimeValue::getCurrentTime().toMilliseconds();
1507 Uint64 nowMilliseconds = startMilliseconds;
|
1508 dmitry.mikulin 1.67 #ifdef PEGASUS_DISABLE_CLIENT_TIMEOUT
1509 Uint64 stopMilliseconds = (Uint64) -1;
1510 #else
|
1511 kumpf 1.1 Uint64 stopMilliseconds = nowMilliseconds + _timeoutMilliseconds;
|
1512 dmitry.mikulin 1.67 #endif
|
1513 kumpf 1.1
1514 while (nowMilliseconds < stopMilliseconds)
1515 {
1516 //
1517 // Wait until the timeout expires or an event occurs:
1518 //
|
1519 kumpf 1.34 _monitor->run(Uint32(stopMilliseconds - nowMilliseconds));
|
1520 kumpf 1.1
1521 //
1522 // Check to see if incoming queue has a message
1523 //
1524
|
1525 kumpf 1.61 AutoPtr<Message> response(dequeue());
|
1526 kumpf 1.1
|
1527 kumpf 1.61 if (response.get())
|
1528 kumpf 1.1 {
1529 // Shouldn't be any more messages in our queue
1530 PEGASUS_ASSERT(getCount() == 0);
1531
1532 //
|
1533 kumpf 1.61 // Close the connection if response contained a "Connection: Close"
1534 // header (e.g. at authentication challenge)
|
1535 j.alex 1.47 //
|
1536 kumpf 1.60 if (response->getCloseConnect() == true)
1537 {
|
1538 dl.meetei 1.87 _disconnect(true);
|
1539 kumpf 1.61 _doReconnect = true;
|
1540 j.alex 1.48 response->setCloseConnect(false);
|
1541 j.alex 1.47 }
1542
1543 //
|
1544 kumpf 1.4 // Future: If M-POST is used and HTTP response is 501 Not
1545 // Implemented or 510 Not Extended, retry with POST method
|
1546 kumpf 1.1 //
1547
1548 if (response->getType() == CLIENT_EXCEPTION_MESSAGE)
1549 {
1550 Exception* clientException =
|
1551 kumpf 1.61 ((ClientExceptionMessage*)response.get())->clientException;
|
1552 kumpf 1.4
|
1553 a.arora 1.31 AutoPtr<Exception> d(clientException);
|
1554 kumpf 1.4
|
1555 david.dillard 1.42 // Make the ContentLanguage of the exception available through
1556 // the CIMClient API (its also available in the exception).
|
1557 kumpf 1.60 responseContentLanguages =
1558 clientException->getContentLanguages();
|
1559 chuck 1.27
|
1560 kumpf 1.4 //
1561 // Determine and throw the specific class of client exception
1562 //
1563
1564 CIMClientMalformedHTTPException* malformedHTTPException =
1565 dynamic_cast<CIMClientMalformedHTTPException*>(
1566 clientException);
1567 if (malformedHTTPException)
1568 {
1569 throw *malformedHTTPException;
1570 }
1571
1572 CIMClientHTTPErrorException* httpErrorException =
1573 dynamic_cast<CIMClientHTTPErrorException*>(
1574 clientException);
1575 if (httpErrorException)
1576 {
1577 throw *httpErrorException;
1578 }
1579
1580 CIMClientXmlException* xmlException =
1581 kumpf 1.4 dynamic_cast<CIMClientXmlException*>(clientException);
1582 if (xmlException)
1583 {
1584 throw *xmlException;
1585 }
1586
1587 CIMClientResponseException* responseException =
1588 dynamic_cast<CIMClientResponseException*>(clientException);
1589 if (responseException)
1590 {
1591 throw *responseException;
1592 }
1593
|
1594 david.dillard 1.42 CIMException* cimException =
|
1595 brian.campbell 1.25 dynamic_cast<CIMException*>(clientException);
1596 if (cimException)
1597 {
1598 throw *cimException;
1599 }
1600
|
1601 kumpf 1.1 throw *clientException;
1602 }
1603 else if (response->getType() == expectedResponseMessageType)
1604 {
|
1605 kumpf 1.61 CIMResponseMessage* cimResponse =
1606 (CIMResponseMessage*)response.get();
|
1607 kumpf 1.1
1608 if (cimResponse->messageId != messageId)
1609 {
1610 MessageLoaderParms mlParms(
1611 "Client.CIMClient.MISMATCHED_RESPONSE",
1612 "Mismatched response message ID: Got \"$0\", "
1613 "expected \"$1\".",
1614 cimResponse->messageId, messageId);
1615 String mlString(MessageLoader::getMessage(mlParms));
1616
1617 CIMClientResponseException responseException(mlString);
1618
1619 throw responseException;
1620 }
1621
|
1622 kumpf 1.60 // Get the Content-Languages from the response's
1623 // operationContext and make available through the
1624 // CIMClient API
1625 responseContentLanguages = ((ContentLanguageListContainer)
1626 cimResponse->operationContext.get(
1627 ContentLanguageListContainer::NAME)).getLanguages();
|
1628 kumpf 1.1
1629 if (cimResponse->cimException.getCode() != CIM_ERR_SUCCESS)
1630 {
|
1631 karl 1.59 CIMException cimException(cimResponse->cimException);
1632
|
1633 david.dillard 1.42 cimException.setContentLanguages(responseContentLanguages);
|
1634 kumpf 1.1 throw cimException;
1635 }
|
1636 w.white 1.37
|
1637 kumpf 1.60 // if execution gets here everytihng is working correctly
1638 // and a proper response was generated and received.
|
1639 w.white 1.37
|
1640 kumpf 1.60 // Check that client side statistics are valid before
1641 // handing them to the client application via a call back
1642 Boolean re_check = perfDataStore.checkMessageIDandType(
1643 cimResponse->messageId,
1644 cimResponse->getType());
1645
1646 if (re_check &&
1647 !perfDataStore.getStatError() &&
1648 perfDataStore.isClassRegistered())
|
1649 david.dillard 1.42 {
|
1650 kumpf 1.60 // If callback method throws an exception it will be seen
1651 // by the client no try/catch block is used here
1652 // intentionaly - because exceptions come from the client
1653 // application so client app. should handle them
1654 ClientOpPerformanceData item =
1655 perfDataStore.createPerfDataStruct();
1656 perfDataStore.handler_prt->handleClientOpPerformanceData(
1657 item);
|
1658 david.dillard 1.42
|
1659 w.white 1.37 }//end of if statmet that call the callback method
|
1660 kumpf 1.61 return response.release();
|
1661 kumpf 1.1 }
|
1662 kumpf 1.61 else if (dynamic_cast<CIMRequestMessage*>(response.get()) != 0)
|
1663 j.alex 1.48 {
|
1664 kumpf 1.61 //
1665 // Respond to an authentication challenge.
1666 // Reconnect if the connection was closed.
1667 //
1668 if (_doReconnect)
1669 {
|
1670 mike 1.71 _connect(_binaryRequest, _binaryResponse);
|
1671 kumpf 1.61 }
1672
1673 _requestEncoder->enqueue(response.release());
|
1674 j.alex 1.48 nowMilliseconds = TimeValue::getCurrentTime().toMilliseconds();
1675 stopMilliseconds = nowMilliseconds + _timeoutMilliseconds;
1676 continue;
1677 }
|
1678 kumpf 1.1 else
1679 {
1680 MessageLoaderParms mlParms(
|
1681 kumpf 1.60 "Client.CIMOperationResponseDecoder."
1682 "MISMATCHED_RESPONSE_TYPE",
|
1683 j.alex 1.48 "Mismatched response message type.");
|
1684 kumpf 1.1 String mlString(MessageLoader::getMessage(mlParms));
1685
1686 CIMClientResponseException responseException(mlString);
1687
1688 throw responseException;
1689 }
1690 }
1691
1692 nowMilliseconds = TimeValue::getCurrentTime().toMilliseconds();
1693 }
1694
1695 //
1696 // Reconnect to reset the connection (disregard late response)
1697 //
|
1698 kumpf 1.61
1699 _disconnect();
1700 _doReconnect = true;
|
1701 kumpf 1.1
1702 //
1703 // Throw timed out exception:
1704 //
1705 throw ConnectionTimeoutException();
1706 }
1707
|
1708 kumpf 1.60 void CIMClientRep::registerClientOpPerformanceDataHandler(
1709 ClientOpPerformanceDataHandler& handler)
|
1710 david.dillard 1.42 {
|
1711 kumpf 1.60 perfDataStore.handler_prt = &handler;
1712 perfDataStore.setClassRegistered(true);
|
1713 w.white 1.37 }
|
1714 david.dillard 1.42
|
1715 w.white 1.37 void CIMClientRep::deregisterClientOpPerformanceDataHandler()
1716 {
|
1717 a.dunfey 1.53 perfDataStore.handler_prt = NULL;
1718 perfDataStore.setClassRegistered(false);
|
1719 w.white 1.37 }
1720
|
1721 karl 1.85
1722 /*
1723 Implementation of the Trace mechanism
1724 */
1725
1726 // static variables to store the display state for input and output.
1727 Uint32 ClientTrace::inputState;
1728 Uint32 ClientTrace::outputState;
1729
1730 ClientTrace::TraceType ClientTrace::selectType(const String& str)
1731 {
1732 if (str == "con")
1733 {
1734 return TRACE_CON;
1735 }
1736 if (str == "log")
1737 {
1738 return TRACE_LOG;
1739 }
1740 if (str == "both")
1741 {
1742 karl 1.85 return TRACE_BOTH;
1743 }
1744 return TRACE_NONE;
1745 }
1746
1747 Boolean ClientTrace::displayOutput(TraceType tt)
1748 {
1749 return (tt & outputState);
1750 }
1751
1752 Boolean ClientTrace::displayInput(TraceType tt)
1753 {
1754 return (tt & inputState);
1755 }
1756
1757 // Set up the input and output state variables from the input
1758 // environment variable.
1759 void ClientTrace::setup()
1760 {
1761 String input;
1762 if (char * envVar = getenv("PEGASUS_CLIENT_TRACE"))
1763 karl 1.85 {
1764 input = envVar;
1765 input.toLower();
1766 String in;
1767 String out;
1768 Uint32 pos = input.find(':');
1769
1770 // if no colon found, input and output have same mask
1771 if (pos == PEG_NOT_FOUND)
1772 {
1773 in = input;
1774 out = input;
1775 }
1776 else
1777 {
1778 // if string starts with colon, input empty, else
1779 // either both or output empty
1780 if (input[0] == ':')
1781 {
1782 in = "";
1783 out = input.subString(1);
1784 karl 1.85 }
1785 else
1786 {
1787 in = input.subString(0,pos);
1788 if (pos == (input.size() - 1))
1789 {
1790 out = "";
1791 }
1792 else
1793 {
1794 out =input.subString(pos + 1);
1795 }
1796 }
1797 }
1798
1799 // set the state variables
1800 outputState = ClientTrace::selectType(out);
1801 inputState = ClientTrace::selectType(in);
1802
1803 // Test for logging requested and if so set log parameters
1804 if (((outputState| inputState) & TRACE_LOG) != 0)
1805 karl 1.85 {
1806 Logger::setlogLevelMask("");
1807 }
1808 }
1809 }
|
1810 kumpf 1.1 PEGASUS_NAMESPACE_END
|