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