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 //
88 // Create response decoder:
89 //
|
90 kumpf 1.60 AutoPtr<CIMOperationResponseDecoder> responseDecoder(
91 new CIMOperationResponseDecoder(
|
92 karl 1.85 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.85 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 marek 1.82 _connectLocal(true);
|
267 mike 1.71 #else
|
268 marek 1.82 _connectLocal(false);
|
269 mike 1.71 #endif
|
270 marek 1.82 }
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 karl 1.85
|
983 kumpf 1.1 }
984
985 Message* CIMClientRep::_doRequest(
|
986 a.arora 1.31 AutoPtr<CIMRequestMessage>& request,
|
987 kumpf 1.65 MessageType expectedResponseMessageType)
|
988 kumpf 1.1 {
|
989 kumpf 1.61 if (!_connected && !_doReconnect)
|
990 kumpf 1.1 {
991 throw NotConnectedException();
992 }
993
|
994 harsha.bm 1.78 // Check if the connection has to be re-established
|
995 harsha.bm 1.80 if ( _connected && _httpConnection->needsReconnect() )
|
996 harsha.bm 1.78 {
997 _disconnect();
998 _doReconnect = true;
999 }
1000
|
1001 kumpf 1.61 if (_doReconnect)
1002 {
|
1003 mike 1.71 _connect(_binaryRequest, _binaryResponse);
|
1004 kumpf 1.61 _doReconnect = false;
1005 }
1006
|
1007 kumpf 1.1 String messageId = XmlWriter::getNextMessageId();
1008 const_cast<String &>(request->messageId) = messageId;
1009
|
1010 kumpf 1.8 _authenticator.setRequestMessage(0);
|
1011 kumpf 1.1
1012 // ATTN-RK-P2-20020416: We should probably clear out the queue first.
1013 PEGASUS_ASSERT(getCount() == 0); // Shouldn't be any messages in our queue
1014
1015 //
|
1016 karl 1.2 // Set HTTP method in request to POST
|
1017 kumpf 1.1 //
|
1018 david.dillard 1.42 //Bug 478/418 - Change this to do post call, not mpost
|
1019 karl 1.2 request->setHttpMethod (HTTP_METHOD__POST);
|
1020 kumpf 1.1
1021 // Set the Accept-Languages and Content-Languages into
1022 // the request message
1023
|
1024 kumpf 1.60 request->operationContext.set(
1025 AcceptLanguageListContainer(requestAcceptLanguages));
1026 request->operationContext.set(
1027 ContentLanguageListContainer(requestContentLanguages));
|
1028 se.gupta 1.22
1029
|
1030 kumpf 1.60 //gathering statistical information about client operation
1031 perfDataStore.reset();
1032 perfDataStore.setOperationType(request->getType());
1033 perfDataStore.setMessageID(request->messageId);
|
1034 w.white 1.35
|
1035 kumpf 1.1 // Sending a new request, so clear out the response Content-Languages
|
1036 kumpf 1.51 responseContentLanguages.clear();
|
1037 kumpf 1.1
|
1038 a.arora 1.32 _requestEncoder->enqueue(request.get());
1039 request.release();
|
1040 kumpf 1.1
1041 Uint64 startMilliseconds = TimeValue::getCurrentTime().toMilliseconds();
1042 Uint64 nowMilliseconds = startMilliseconds;
|
1043 dmitry.mikulin 1.67 #ifdef PEGASUS_DISABLE_CLIENT_TIMEOUT
1044 Uint64 stopMilliseconds = (Uint64) -1;
1045 #else
|
1046 kumpf 1.1 Uint64 stopMilliseconds = nowMilliseconds + _timeoutMilliseconds;
|
1047 dmitry.mikulin 1.67 #endif
|
1048 kumpf 1.1
1049 while (nowMilliseconds < stopMilliseconds)
1050 {
1051 //
1052 // Wait until the timeout expires or an event occurs:
1053 //
|
1054 kumpf 1.34 _monitor->run(Uint32(stopMilliseconds - nowMilliseconds));
|
1055 kumpf 1.1
1056 //
1057 // Check to see if incoming queue has a message
1058 //
1059
|
1060 kumpf 1.61 AutoPtr<Message> response(dequeue());
|
1061 kumpf 1.1
|
1062 kumpf 1.61 if (response.get())
|
1063 kumpf 1.1 {
1064 // Shouldn't be any more messages in our queue
1065 PEGASUS_ASSERT(getCount() == 0);
1066
1067 //
|
1068 kumpf 1.61 // Close the connection if response contained a "Connection: Close"
1069 // header (e.g. at authentication challenge)
|
1070 j.alex 1.47 //
|
1071 kumpf 1.60 if (response->getCloseConnect() == true)
1072 {
|
1073 kumpf 1.61 _disconnect();
1074 _doReconnect = true;
|
1075 j.alex 1.48 response->setCloseConnect(false);
|
1076 j.alex 1.47 }
1077
1078 //
|
1079 kumpf 1.4 // Future: If M-POST is used and HTTP response is 501 Not
1080 // Implemented or 510 Not Extended, retry with POST method
|
1081 kumpf 1.1 //
1082
1083 if (response->getType() == CLIENT_EXCEPTION_MESSAGE)
1084 {
1085 Exception* clientException =
|
1086 kumpf 1.61 ((ClientExceptionMessage*)response.get())->clientException;
|
1087 kumpf 1.4
|
1088 a.arora 1.31 AutoPtr<Exception> d(clientException);
|
1089 kumpf 1.4
|
1090 david.dillard 1.42 // Make the ContentLanguage of the exception available through
1091 // the CIMClient API (its also available in the exception).
|
1092 kumpf 1.60 responseContentLanguages =
1093 clientException->getContentLanguages();
|
1094 chuck 1.27
|
1095 kumpf 1.4 //
1096 // Determine and throw the specific class of client exception
1097 //
1098
1099 CIMClientMalformedHTTPException* malformedHTTPException =
1100 dynamic_cast<CIMClientMalformedHTTPException*>(
1101 clientException);
1102 if (malformedHTTPException)
1103 {
1104 throw *malformedHTTPException;
1105 }
1106
1107 CIMClientHTTPErrorException* httpErrorException =
1108 dynamic_cast<CIMClientHTTPErrorException*>(
1109 clientException);
1110 if (httpErrorException)
1111 {
1112 throw *httpErrorException;
1113 }
1114
1115 CIMClientXmlException* xmlException =
1116 kumpf 1.4 dynamic_cast<CIMClientXmlException*>(clientException);
1117 if (xmlException)
1118 {
1119 throw *xmlException;
1120 }
1121
1122 CIMClientResponseException* responseException =
1123 dynamic_cast<CIMClientResponseException*>(clientException);
1124 if (responseException)
1125 {
1126 throw *responseException;
1127 }
1128
|
1129 david.dillard 1.42 CIMException* cimException =
|
1130 brian.campbell 1.25 dynamic_cast<CIMException*>(clientException);
1131 if (cimException)
1132 {
1133 throw *cimException;
1134 }
1135
|
1136 kumpf 1.1 throw *clientException;
1137 }
1138 else if (response->getType() == expectedResponseMessageType)
1139 {
|
1140 kumpf 1.61 CIMResponseMessage* cimResponse =
1141 (CIMResponseMessage*)response.get();
|
1142 kumpf 1.1
1143 if (cimResponse->messageId != messageId)
1144 {
1145 MessageLoaderParms mlParms(
1146 "Client.CIMClient.MISMATCHED_RESPONSE",
1147 "Mismatched response message ID: Got \"$0\", "
1148 "expected \"$1\".",
1149 cimResponse->messageId, messageId);
1150 String mlString(MessageLoader::getMessage(mlParms));
1151
1152 CIMClientResponseException responseException(mlString);
1153
1154 throw responseException;
1155 }
1156
|
1157 kumpf 1.60 // Get the Content-Languages from the response's
1158 // operationContext and make available through the
1159 // CIMClient API
1160 responseContentLanguages = ((ContentLanguageListContainer)
1161 cimResponse->operationContext.get(
1162 ContentLanguageListContainer::NAME)).getLanguages();
|
1163 kumpf 1.1
1164 if (cimResponse->cimException.getCode() != CIM_ERR_SUCCESS)
1165 {
|
1166 karl 1.59 CIMException cimException(cimResponse->cimException);
1167
|
1168 david.dillard 1.42 cimException.setContentLanguages(responseContentLanguages);
|
1169 kumpf 1.1 throw cimException;
1170 }
|
1171 w.white 1.37
|
1172 kumpf 1.60 // if execution gets here everytihng is working correctly
1173 // and a proper response was generated and received.
|
1174 w.white 1.37
|
1175 kumpf 1.60 // Check that client side statistics are valid before
1176 // handing them to the client application via a call back
1177 Boolean re_check = perfDataStore.checkMessageIDandType(
1178 cimResponse->messageId,
1179 cimResponse->getType());
1180
1181 if (re_check &&
1182 !perfDataStore.getStatError() &&
1183 perfDataStore.isClassRegistered())
|
1184 david.dillard 1.42 {
|
1185 kumpf 1.60 // If callback method throws an exception it will be seen
1186 // by the client no try/catch block is used here
1187 // intentionaly - because exceptions come from the client
1188 // application so client app. should handle them
1189 ClientOpPerformanceData item =
1190 perfDataStore.createPerfDataStruct();
1191 perfDataStore.handler_prt->handleClientOpPerformanceData(
1192 item);
|
1193 david.dillard 1.42
|
1194 w.white 1.37 }//end of if statmet that call the callback method
|
1195 kumpf 1.61 return response.release();
|
1196 kumpf 1.1 }
|
1197 kumpf 1.61 else if (dynamic_cast<CIMRequestMessage*>(response.get()) != 0)
|
1198 j.alex 1.48 {
|
1199 kumpf 1.61 //
1200 // Respond to an authentication challenge.
1201 // Reconnect if the connection was closed.
1202 //
1203 if (_doReconnect)
1204 {
|
1205 mike 1.71 _connect(_binaryRequest, _binaryResponse);
|
1206 kumpf 1.61 }
1207
1208 _requestEncoder->enqueue(response.release());
|
1209 j.alex 1.48 nowMilliseconds = TimeValue::getCurrentTime().toMilliseconds();
1210 stopMilliseconds = nowMilliseconds + _timeoutMilliseconds;
1211 continue;
1212 }
|
1213 kumpf 1.1 else
1214 {
1215 MessageLoaderParms mlParms(
|
1216 kumpf 1.60 "Client.CIMOperationResponseDecoder."
1217 "MISMATCHED_RESPONSE_TYPE",
|
1218 j.alex 1.48 "Mismatched response message type.");
|
1219 kumpf 1.1 String mlString(MessageLoader::getMessage(mlParms));
1220
1221 CIMClientResponseException responseException(mlString);
1222
1223 throw responseException;
1224 }
1225 }
1226
1227 nowMilliseconds = TimeValue::getCurrentTime().toMilliseconds();
1228 }
1229
1230 //
1231 // Reconnect to reset the connection (disregard late response)
1232 //
|
1233 kumpf 1.61
1234 _disconnect();
1235 _doReconnect = true;
|
1236 kumpf 1.1
1237 //
1238 // Throw timed out exception:
1239 //
1240 throw ConnectionTimeoutException();
1241 }
1242
|
1243 kumpf 1.60 void CIMClientRep::registerClientOpPerformanceDataHandler(
1244 ClientOpPerformanceDataHandler& handler)
|
1245 david.dillard 1.42 {
|
1246 kumpf 1.60 perfDataStore.handler_prt = &handler;
1247 perfDataStore.setClassRegistered(true);
|
1248 w.white 1.37 }
|
1249 david.dillard 1.42
|
1250 w.white 1.37 void CIMClientRep::deregisterClientOpPerformanceDataHandler()
1251 {
|
1252 a.dunfey 1.53 perfDataStore.handler_prt = NULL;
1253 perfDataStore.setClassRegistered(false);
|
1254 w.white 1.37 }
1255
|
1256 karl 1.85
1257 /*
1258 Implementation of the Trace mechanism
1259 */
1260
1261 // static variables to store the display state for input and output.
1262 Uint32 ClientTrace::inputState;
1263 Uint32 ClientTrace::outputState;
1264
1265 ClientTrace::TraceType ClientTrace::selectType(const String& str)
1266 {
1267 if (str == "con")
1268 {
1269 return TRACE_CON;
1270 }
1271 if (str == "log")
1272 {
1273 return TRACE_LOG;
1274 }
1275 if (str == "both")
1276 {
1277 karl 1.85 return TRACE_BOTH;
1278 }
1279 return TRACE_NONE;
1280 }
1281
1282 Boolean ClientTrace::displayOutput(TraceType tt)
1283 {
1284 return (tt & outputState);
1285 }
1286
1287 Boolean ClientTrace::displayInput(TraceType tt)
1288 {
1289 return (tt & inputState);
1290 }
1291
1292 // Set up the input and output state variables from the input
1293 // environment variable.
1294 void ClientTrace::setup()
1295 {
1296 String input;
1297 if (char * envVar = getenv("PEGASUS_CLIENT_TRACE"))
1298 karl 1.85 {
1299 input = envVar;
1300 input.toLower();
1301 String in;
1302 String out;
1303 Uint32 pos = input.find(':');
1304
1305 // if no colon found, input and output have same mask
1306 if (pos == PEG_NOT_FOUND)
1307 {
1308 in = input;
1309 out = input;
1310 }
1311 else
1312 {
1313 // if string starts with colon, input empty, else
1314 // either both or output empty
1315 if (input[0] == ':')
1316 {
1317 in = "";
1318 out = input.subString(1);
1319 karl 1.85 }
1320 else
1321 {
1322 in = input.subString(0,pos);
1323 if (pos == (input.size() - 1))
1324 {
1325 out = "";
1326 }
1327 else
1328 {
1329 out =input.subString(pos + 1);
1330 }
1331 }
1332 }
1333
1334 // set the state variables
1335 outputState = ClientTrace::selectType(out);
1336 inputState = ClientTrace::selectType(in);
1337
1338 // Test for logging requested and if so set log parameters
1339 if (((outputState| inputState) & TRACE_LOG) != 0)
1340 karl 1.85 {
1341 Logger::setlogLevelMask("");
1342 }
1343 }
1344 }
|
1345 kumpf 1.1 PEGASUS_NAMESPACE_END
|