1 karl 1.54 //%2006////////////////////////////////////////////////////////////////////////
|
2 kumpf 1.1 //
|
3 karl 1.33 // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
4 // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
5 // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
|
6 karl 1.3 // IBM Corp.; EMC Corporation, The Open Group.
|
7 karl 1.33 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
8 // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
|
9 karl 1.36 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
10 // EMC Corporation; VERITAS Software Corporation; The Open Group.
|
11 karl 1.54 // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
12 // EMC Corporation; Symantec Corporation; The Open Group.
|
13 kumpf 1.1 //
14 // Permission is hereby granted, free of charge, to any person obtaining a copy
15 // of this software and associated documentation files (the "Software"), to
16 // deal in the Software without restriction, including without limitation the
17 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
18 // sell copies of the Software, and to permit persons to whom the Software is
19 // furnished to do so, subject to the following conditions:
|
20 karl 1.54 //
|
21 kumpf 1.1 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
22 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
23 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
24 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
25 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
26 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
27 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 //
30 //==============================================================================
31 //
32 //%/////////////////////////////////////////////////////////////////////////////
33
34 #include "CIMClientRep.h"
35
36 #include <Pegasus/Common/MessageLoader.h>
|
37 joyce.j 1.41 #include <Pegasus/Common/System.h>
|
38 kumpf 1.51 #include <Pegasus/Common/LanguageParser.h>
|
39 kumpf 1.1
40 #include <iostream>
41 #include <fstream>
|
42 mike 1.55 #include <Pegasus/Common/Network.h>
|
43 kumpf 1.1
44 PEGASUS_USING_STD;
45
46 PEGASUS_NAMESPACE_BEGIN
47
48 ///////////////////////////////////////////////////////////////////////////////
49 //
50 // CIMClientRep
51 //
52 ///////////////////////////////////////////////////////////////////////////////
53
54 CIMClientRep::CIMClientRep(Uint32 timeoutMilliseconds)
55 :
56 MessageQueue(PEGASUS_QUEUENAME_CLIENT),
57 _timeoutMilliseconds(timeoutMilliseconds),
|
58 kumpf 1.61 _connected(false),
59 _doReconnect(false)
|
60 kumpf 1.1 {
61 //
62 // Create Monitor and HTTPConnector
63 //
|
64 a.arora 1.31 _monitor.reset(new Monitor());
65 _httpConnector.reset(new HTTPConnector(_monitor.get()));
|
66 kumpf 1.1
|
67 kumpf 1.51 requestAcceptLanguages.clear();
68 requestContentLanguages.clear();
|
69 kumpf 1.1 }
70
71 CIMClientRep::~CIMClientRep()
72 {
73 disconnect();
74 }
75
76 void CIMClientRep::handleEnqueue()
77 {
78 }
79
80 Uint32 _getShowType(String& s)
81 {
82 String log = "log";
83 String con = "con";
84 String both = "both";
85 if (s == log)
|
86 tony 1.7 return 2;
87 if (s == con)
|
88 karl 1.6 return 1;
|
89 kumpf 1.1 if (s == both)
|
90 karl 1.6 return 3;
|
91 kumpf 1.1 return 0;
92 }
93
|
94 a.arora 1.32 void CIMClientRep::_connect()
|
95 kumpf 1.1 {
96 //
97 // Test for Display optons of the form
98 // Use Env variable PEGASUS_CLIENT_TRACE= <intrace> : <outtrace
99 // intrace = "con" | "log" | "both"
100 // outtrace = intrace
101 // ex set PEGASUS_CLIENT_TRACE=BOTH:BOTH traces input and output
102 // to console and log
103 // Keywords are case insensitive.
104 // PEP 90
105 //
106 Uint32 showOutput = 0;
107 Uint32 showInput = 0;
108 #ifdef PEGASUS_CLIENT_TRACE_ENABLE
109 String input;
110 if (char * envVar = getenv("PEGASUS_CLIENT_TRACE"))
111 {
112 input = envVar;
113 input.toLower();
|
114 kumpf 1.63 String io;
|
115 kumpf 1.1 Uint32 pos = input.find(':');
116 if (pos == PEG_NOT_FOUND)
117 pos = 0;
118 else
119 io = input.subString(0,pos);
120
|
121 tony 1.5 // some compilers do not allow temporaries to be passed to a
122 // reference argument - so break into 2 lines
123 String out = input.subString(pos + 1);
124 showOutput = _getShowType(out);
|
125 kumpf 1.1
126 showInput = _getShowType(io);
127 }
128 #endif
129
130 //
131 // Create response decoder:
132 //
|
133 kumpf 1.60 AutoPtr<CIMOperationResponseDecoder> responseDecoder(
134 new CIMOperationResponseDecoder(
135 this, _requestEncoder.get(), &_authenticator, showInput));
|
136 kumpf 1.1
137 //
138 // Attempt to establish a connection:
139 //
|
140 a.arora 1.31 AutoPtr<HTTPConnection> httpConnection(_httpConnector->connect(
|
141 kumpf 1.60 _connectHost,
142 _connectPortNumber,
143 _connectSSLContext.get(),
144 responseDecoder.get()));
|
145 david.dillard 1.42
|
146 kumpf 1.1 //
147 // Create request encoder:
148 //
|
149 kumpf 1.30 String connectHost = _connectHost;
150 if (connectHost.size())
151 {
152 char portStr[32];
153 sprintf(portStr, ":%u", _connectPortNumber);
154 connectHost.append(portStr);
155 }
156
|
157 kumpf 1.60 AutoPtr<CIMOperationRequestEncoder> requestEncoder(
158 new CIMOperationRequestEncoder(
|
159 a.arora 1.31 httpConnection.get(), connectHost, &_authenticator, showOutput));
|
160 david.dillard 1.42
|
161 a.arora 1.31 _responseDecoder.reset(responseDecoder.release());
|
162 denise.eckstein 1.46 _httpConnection = httpConnection.release();
|
163 a.arora 1.31 _requestEncoder.reset(requestEncoder.release());
164 _responseDecoder->setEncoderQueue(_requestEncoder.get());
|
165 kumpf 1.60
166 //pass encoder and decoder a pointer to CIMClientRep::perfDataStore
|
167 a.dunfey 1.53 _requestEncoder->setDataStorePointer(&perfDataStore);
168 _responseDecoder->setDataStorePointer(&perfDataStore);
169
|
170 kumpf 1.61 _doReconnect = false;
|
171 kumpf 1.1 _connected = true;
|
172 marek 1.56 _httpConnection->setSocketWriteTimeout(_timeoutMilliseconds/1000+1);
|
173 kumpf 1.1 }
174
|
175 kumpf 1.8 void CIMClientRep::_disconnect()
176 {
177 if (_connected)
178 {
179 //
180 // destroy response decoder
181 //
|
182 a.arora 1.31 _responseDecoder.reset();
|
183 david.dillard 1.42
|
184 kumpf 1.8
185 //
186 // Close the connection
187 //
|
188 a.arora 1.31 if (_httpConnector.get())
|
189 kumpf 1.8 {
|
190 denise.eckstein 1.46 _httpConnector->disconnect(_httpConnection);
191 _httpConnection = 0;
|
192 kumpf 1.8 }
193
194 //
195 // destroy request encoder
196 //
|
197 a.arora 1.31 _requestEncoder.reset();
|
198 kumpf 1.8
199 _connected = false;
200 }
201
|
202 kumpf 1.61 // Reconnect no longer applies
203 _doReconnect = false;
204
205 // Let go of the cached request message if we have one
206 _authenticator.setRequestMessage(0);
|
207 kumpf 1.1 }
208
209 void CIMClientRep::connect(
210 const String& host,
211 const Uint32 portNumber,
212 const String& userName,
|
213 kumpf 1.60 const String& password)
|
214 kumpf 1.1 {
215 //
216 // If already connected, bail out!
217 //
218 if (_connected)
219 throw AlreadyConnectedException();
220
221 //
222 // If the host is empty, set hostName to "localhost"
223 //
224 String hostName = host;
225 if (host == String::EMPTY)
226 {
227 hostName = "localhost";
228 }
229
230 //
231 // Set authentication information
232 //
|
233 kumpf 1.8 _authenticator.clear();
|
234 kumpf 1.1
235 if (userName.size())
236 {
237 _authenticator.setUserName(userName);
238 }
239
240 if (password.size())
241 {
242 _authenticator.setPassword(password);
243 }
244
|
245 a.arora 1.31 _connectSSLContext.reset();
|
246 kumpf 1.1 _connectHost = hostName;
247 _connectPortNumber = portNumber;
248
|
249 a.arora 1.32 _connect();
|
250 kumpf 1.1 }
251
252
253 void CIMClientRep::connect(
254 const String& host,
255 const Uint32 portNumber,
256 const SSLContext& sslContext,
257 const String& userName,
|
258 kumpf 1.60 const String& password)
|
259 kumpf 1.1 {
260 //
261 // If already connected, bail out!
262 //
263 if (_connected)
264 throw AlreadyConnectedException();
265
266 //
267 // If the host is empty, set hostName to "localhost"
268 //
269 String hostName = host;
270 if (host == String::EMPTY)
271 {
272 hostName = "localhost";
273 }
274
275 //
276 // Set authentication information
277 //
|
278 kumpf 1.8 _authenticator.clear();
|
279 kumpf 1.1
280 if (userName.size())
281 {
282 _authenticator.setUserName(userName);
283 }
284
285 if (password.size())
286 {
287 _authenticator.setPassword(password);
288 }
289
290 _connectHost = hostName;
291 _connectPortNumber = portNumber;
292
|
293 a.arora 1.32 _connectSSLContext.reset(new SSLContext(sslContext));
294 _connect();
|
295 kumpf 1.1 }
296
297
298 void CIMClientRep::connectLocal()
299 {
300 //
301 // If already connected, bail out!
302 //
303 if (_connected)
304 throw AlreadyConnectedException();
305
306 //
307 // Set authentication type
308 //
|
309 kumpf 1.8 _authenticator.clear();
|
310 kumpf 1.1 _authenticator.setAuthType(ClientAuthenticator::LOCAL);
311
|
312 h.sterling 1.43 #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
|
313 a.arora 1.31 _connectSSLContext.reset();
|
314 kumpf 1.30 _connectHost = String::EMPTY;
315 _connectPortNumber = 0;
|
316 a.arora 1.32 _connect();
|
317 kumpf 1.1 #else
318
319 try
320 {
321 //
322 // Look up the WBEM HTTP port number for the local system
323 //
324 _connectPortNumber = System::lookupPort (WBEM_HTTP_SERVICE_NAME,
325 WBEM_DEFAULT_HTTP_PORT);
326
327 //
328 // Assign host
329 //
|
330 kumpf 1.61 _connectHost.assign(System::getHostName());
|
331 kumpf 1.1
|
332 a.arora 1.31 _connectSSLContext.reset();
|
333 kumpf 1.1
|
334 a.arora 1.32 _connect();
|
335 kumpf 1.1 }
|
336 kumpf 1.60 catch (const CannotConnectException &)
|
337 kumpf 1.1 {
338 //
339 // Look up the WBEM HTTPS port number for the local system
340 //
341 _connectPortNumber = System::lookupPort (WBEM_HTTPS_SERVICE_NAME,
342 WBEM_DEFAULT_HTTPS_PORT);
343
344 //
345 // Assign host
346 //
|
347 kumpf 1.61 _connectHost.assign(System::getHostName());
|
348 kumpf 1.1
349 //
350 // Create SSLContext
351 //
352 const char* pegasusHome = getenv("PEGASUS_HOME");
353
|
354 kumpf 1.63 String randFile;
|
355 kumpf 1.1
|
356 kumpf 1.66 # ifdef PEGASUS_SSL_RANDOMFILE
|
357 kumpf 1.1 randFile = FileSystem::getAbsolutePath(
358 pegasusHome, PEGASUS_SSLCLIENT_RANDOMFILE);
|
359 kumpf 1.66 # endif
|
360 kumpf 1.1
|
361 kumpf 1.66 // May throw SSLException
362 _connectSSLContext.reset(
363 new SSLContext(String::EMPTY, NULL, randFile));
|
364 kumpf 1.1
|
365 a.arora 1.32 _connect();
|
366 kumpf 1.1 }
367 #endif
368 }
369
370
371 void CIMClientRep::disconnect()
372 {
|
373 kumpf 1.8 _disconnect();
374 _authenticator.clear();
|
375 kumpf 1.28 _connectSSLContext.reset();
|
376 kumpf 1.8 }
|
377 kumpf 1.1
|
378 david.dillard 1.42 Boolean CIMClientRep::isConnected() const throw()
|
379 marek 1.21 {
|
380 david.dillard 1.42 return _connected;
|
381 marek 1.21 }
382
|
383 kumpf 1.52 AcceptLanguageList CIMClientRep::getRequestAcceptLanguages() const
|
384 kumpf 1.1 {
385 return requestAcceptLanguages;
386 }
387
|
388 kumpf 1.52 ContentLanguageList CIMClientRep::getRequestContentLanguages() const
|
389 kumpf 1.1 {
390 return requestContentLanguages;
391 }
392
|
393 kumpf 1.52 ContentLanguageList CIMClientRep::getResponseContentLanguages() const
|
394 kumpf 1.1 {
395 return responseContentLanguages;
396 }
397
|
398 kumpf 1.52 void CIMClientRep::setRequestAcceptLanguages(const AcceptLanguageList& langs)
|
399 kumpf 1.1 {
400 requestAcceptLanguages = langs;
401 }
402
|
403 kumpf 1.52 void CIMClientRep::setRequestContentLanguages(const ContentLanguageList& langs)
|
404 kumpf 1.1 {
405 requestContentLanguages = langs;
406 }
407
408 void CIMClientRep::setRequestDefaultLanguages()
409 {
|
410 kumpf 1.51 requestAcceptLanguages = LanguageParser::getDefaultAcceptLanguages();
|
411 kumpf 1.1 }
412
413 CIMClass CIMClientRep::getClass(
414 const CIMNamespaceName& nameSpace,
415 const CIMName& className,
416 Boolean localOnly,
417 Boolean includeQualifiers,
418 Boolean includeClassOrigin,
|
419 kumpf 1.60 const CIMPropertyList& propertyList)
|
420 kumpf 1.1 {
|
421 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMGetClassRequestMessage(
|
422 kumpf 1.1 String::EMPTY,
423 nameSpace,
424 className,
425 localOnly,
426 includeQualifiers,
427 includeClassOrigin,
428 propertyList,
|
429 a.arora 1.31 QueueIdStack()));
|
430 kumpf 1.1
431 Message* message = _doRequest(request, CIM_GET_CLASS_RESPONSE_MESSAGE);
432
433 CIMGetClassResponseMessage* response =
434 (CIMGetClassResponseMessage*)message;
435
|
436 a.arora 1.31 AutoPtr<CIMGetClassResponseMessage> destroyer(response);
|
437 kumpf 1.1
|
438 kumpf 1.60 return response->cimClass;
|
439 kumpf 1.1 }
440
441 CIMInstance CIMClientRep::getInstance(
442 const CIMNamespaceName& nameSpace,
443 const CIMObjectPath& instanceName,
444 Boolean localOnly,
445 Boolean includeQualifiers,
446 Boolean includeClassOrigin,
|
447 kumpf 1.60 const CIMPropertyList& propertyList)
|
448 kumpf 1.1 {
|
449 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMGetInstanceRequestMessage(
|
450 kumpf 1.1 String::EMPTY,
451 nameSpace,
452 instanceName,
453 localOnly,
454 includeQualifiers,
455 includeClassOrigin,
456 propertyList,
|
457 a.arora 1.31 QueueIdStack()));
|
458 kumpf 1.1
459 Message* message = _doRequest(request, CIM_GET_INSTANCE_RESPONSE_MESSAGE);
460
461 CIMGetInstanceResponseMessage* response =
462 (CIMGetInstanceResponseMessage*)message;
463
|
464 a.arora 1.31 AutoPtr<CIMGetInstanceResponseMessage> destroyer(response);
|
465 kumpf 1.1
|
466 kumpf 1.60 return response->cimInstance;
|
467 kumpf 1.1 }
468
469 void CIMClientRep::deleteClass(
470 const CIMNamespaceName& nameSpace,
|
471 kumpf 1.60 const CIMName& className)
|
472 kumpf 1.1 {
|
473 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMDeleteClassRequestMessage(
|
474 kumpf 1.1 String::EMPTY,
475 nameSpace,
476 className,
|
477 a.arora 1.31 QueueIdStack()));
|
478 kumpf 1.1
479 Message* message = _doRequest(request, CIM_DELETE_CLASS_RESPONSE_MESSAGE);
480
481 CIMDeleteClassResponseMessage* response =
482 (CIMDeleteClassResponseMessage*)message;
483
|
484 a.arora 1.31 AutoPtr<CIMDeleteClassResponseMessage> destroyer(response);
|
485 kumpf 1.1 }
486
487 void CIMClientRep::deleteInstance(
488 const CIMNamespaceName& nameSpace,
|
489 kumpf 1.60 const CIMObjectPath& instanceName)
|
490 kumpf 1.1 {
|
491 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMDeleteInstanceRequestMessage(
|
492 kumpf 1.1 String::EMPTY,
493 nameSpace,
494 instanceName,
|
495 a.arora 1.31 QueueIdStack()));
|
496 kumpf 1.1
|
497 kumpf 1.60 Message* message =
498 _doRequest(request, CIM_DELETE_INSTANCE_RESPONSE_MESSAGE);
|
499 kumpf 1.1
500 CIMDeleteInstanceResponseMessage* response =
501 (CIMDeleteInstanceResponseMessage*)message;
502
|
503 a.arora 1.31 AutoPtr<CIMDeleteInstanceResponseMessage> destroyer(response);
|
504 kumpf 1.1 }
505
506 void CIMClientRep::createClass(
507 const CIMNamespaceName& nameSpace,
|
508 kumpf 1.60 const CIMClass& newClass)
|
509 kumpf 1.1 {
|
510 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMCreateClassRequestMessage(
|
511 kumpf 1.1 String::EMPTY,
512 nameSpace,
513 newClass,
|
514 a.arora 1.31 QueueIdStack()));
|
515 kumpf 1.1
516 Message* message = _doRequest(request, CIM_CREATE_CLASS_RESPONSE_MESSAGE);
517
518 CIMCreateClassResponseMessage* response =
519 (CIMCreateClassResponseMessage*)message;
520
|
521 a.arora 1.31 AutoPtr<CIMCreateClassResponseMessage> destroyer(response);
|
522 kumpf 1.1 }
523
524 CIMObjectPath CIMClientRep::createInstance(
525 const CIMNamespaceName& nameSpace,
|
526 kumpf 1.60 const CIMInstance& newInstance)
|
527 kumpf 1.1 {
|
528 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMCreateInstanceRequestMessage(
|
529 kumpf 1.1 String::EMPTY,
530 nameSpace,
531 newInstance,
|
532 a.arora 1.31 QueueIdStack()));
|
533 kumpf 1.1
|
534 kumpf 1.60 Message* message =
535 _doRequest(request, CIM_CREATE_INSTANCE_RESPONSE_MESSAGE);
|
536 kumpf 1.1
537 CIMCreateInstanceResponseMessage* response =
538 (CIMCreateInstanceResponseMessage*)message;
539
|
540 a.arora 1.31 AutoPtr<CIMCreateInstanceResponseMessage> destroyer(response);
|
541 kumpf 1.1
|
542 kumpf 1.60 return response->instanceName;
|
543 kumpf 1.1 }
544
545 void CIMClientRep::modifyClass(
546 const CIMNamespaceName& nameSpace,
|
547 kumpf 1.60 const CIMClass& modifiedClass)
|
548 kumpf 1.1 {
|
549 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMModifyClassRequestMessage(
|
550 kumpf 1.1 String::EMPTY,
551 nameSpace,
552 modifiedClass,
|
553 a.arora 1.31 QueueIdStack()));
|
554 kumpf 1.1
555 Message* message = _doRequest(request, CIM_MODIFY_CLASS_RESPONSE_MESSAGE);
556
557 CIMModifyClassResponseMessage* response =
558 (CIMModifyClassResponseMessage*)message;
559
|
560 a.arora 1.31 AutoPtr<CIMModifyClassResponseMessage> destroyer(response);
|
561 kumpf 1.1 }
562
563 void CIMClientRep::modifyInstance(
564 const CIMNamespaceName& nameSpace,
565 const CIMInstance& modifiedInstance,
566 Boolean includeQualifiers,
|
567 kumpf 1.60 const CIMPropertyList& propertyList)
|
568 kumpf 1.1 {
|
569 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMModifyInstanceRequestMessage(
|
570 kumpf 1.1 String::EMPTY,
571 nameSpace,
572 modifiedInstance,
573 includeQualifiers,
574 propertyList,
|
575 a.arora 1.31 QueueIdStack()));
|
576 kumpf 1.1
|
577 kumpf 1.60 Message* message =
578 _doRequest(request, CIM_MODIFY_INSTANCE_RESPONSE_MESSAGE);
|
579 kumpf 1.1
580 CIMModifyInstanceResponseMessage* response =
581 (CIMModifyInstanceResponseMessage*)message;
582
|
583 a.arora 1.31 AutoPtr<CIMModifyInstanceResponseMessage> destroyer(response);
|
584 kumpf 1.1 }
585
586 Array<CIMClass> CIMClientRep::enumerateClasses(
587 const CIMNamespaceName& nameSpace,
588 const CIMName& className,
589 Boolean deepInheritance,
590 Boolean localOnly,
591 Boolean includeQualifiers,
|
592 kumpf 1.60 Boolean includeClassOrigin)
|
593 kumpf 1.1 {
|
594 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMEnumerateClassesRequestMessage(
|
595 kumpf 1.1 String::EMPTY,
596 nameSpace,
597 className,
598 deepInheritance,
599 localOnly,
600 includeQualifiers,
601 includeClassOrigin,
|
602 a.arora 1.31 QueueIdStack()));
|
603 kumpf 1.1
|
604 kumpf 1.60 Message* message =
605 _doRequest(request, CIM_ENUMERATE_CLASSES_RESPONSE_MESSAGE);
|
606 kumpf 1.1
607 CIMEnumerateClassesResponseMessage* response =
608 (CIMEnumerateClassesResponseMessage*)message;
609
|
610 a.arora 1.31 AutoPtr<CIMEnumerateClassesResponseMessage> destroyer(response);
|
611 kumpf 1.1
|
612 kumpf 1.60 return response->cimClasses;
|
613 kumpf 1.1 }
614
615 Array<CIMName> CIMClientRep::enumerateClassNames(
616 const CIMNamespaceName& nameSpace,
617 const CIMName& className,
|
618 kumpf 1.60 Boolean deepInheritance)
|
619 kumpf 1.1 {
|
620 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMEnumerateClassNamesRequestMessage(
|
621 kumpf 1.1 String::EMPTY,
622 nameSpace,
623 className,
624 deepInheritance,
|
625 a.arora 1.31 QueueIdStack()));
|
626 kumpf 1.1
|
627 kumpf 1.60 Message* message =
628 _doRequest(request, CIM_ENUMERATE_CLASS_NAMES_RESPONSE_MESSAGE);
|
629 kumpf 1.1
630 CIMEnumerateClassNamesResponseMessage* response =
631 (CIMEnumerateClassNamesResponseMessage*)message;
632
|
633 a.arora 1.31 AutoPtr<CIMEnumerateClassNamesResponseMessage> destroyer(response);
|
634 kumpf 1.1
635 // Temporary code until internal structures use CIMName instead of String
636 Array<CIMName> classNameArray;
637 classNameArray.reserveCapacity(response->classNames.size());
638 for (Uint32 i=0; i<response->classNames.size(); i++)
639 {
640 classNameArray.append(response->classNames[i]);
641 }
|
642 kumpf 1.60 return classNameArray;
|
643 kumpf 1.1 }
644
645 Array<CIMInstance> CIMClientRep::enumerateInstances(
646 const CIMNamespaceName& nameSpace,
647 const CIMName& className,
648 Boolean deepInheritance,
649 Boolean localOnly,
650 Boolean includeQualifiers,
651 Boolean includeClassOrigin,
|
652 kumpf 1.60 const CIMPropertyList& propertyList)
|
653 kumpf 1.1 {
|
654 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMEnumerateInstancesRequestMessage(
|
655 kumpf 1.1 String::EMPTY,
656 nameSpace,
657 className,
658 deepInheritance,
659 localOnly,
660 includeQualifiers,
661 includeClassOrigin,
662 propertyList,
|
663 a.arora 1.31 QueueIdStack()));
|
664 kumpf 1.1
|
665 kumpf 1.60 Message* message =
666 _doRequest(request, CIM_ENUMERATE_INSTANCES_RESPONSE_MESSAGE);
|
667 kumpf 1.1
668 CIMEnumerateInstancesResponseMessage* response =
669 (CIMEnumerateInstancesResponseMessage*)message;
670
|
671 a.arora 1.31 AutoPtr<CIMEnumerateInstancesResponseMessage> destroyer(response);
|
672 kumpf 1.1
|
673 kumpf 1.60 return response->cimNamedInstances;
|
674 kumpf 1.1 }
675
676 Array<CIMObjectPath> CIMClientRep::enumerateInstanceNames(
677 const CIMNamespaceName& nameSpace,
|
678 kumpf 1.60 const CIMName& className)
|
679 kumpf 1.1 {
|
680 kumpf 1.60 AutoPtr<CIMRequestMessage> request(
681 new CIMEnumerateInstanceNamesRequestMessage(
682 String::EMPTY,
683 nameSpace,
684 className,
685 QueueIdStack()));
|
686 kumpf 1.1
|
687 kumpf 1.60 Message* message =
688 _doRequest(request, CIM_ENUMERATE_INSTANCE_NAMES_RESPONSE_MESSAGE);
|
689 kumpf 1.1
690 CIMEnumerateInstanceNamesResponseMessage* response =
691 (CIMEnumerateInstanceNamesResponseMessage*)message;
692
|
693 a.arora 1.31 AutoPtr<CIMEnumerateInstanceNamesResponseMessage> destroyer(response);
|
694 kumpf 1.1
|
695 kumpf 1.60 return response->instanceNames;
|
696 kumpf 1.1 }
697
698 Array<CIMObject> CIMClientRep::execQuery(
699 const CIMNamespaceName& nameSpace,
700 const String& queryLanguage,
|
701 kumpf 1.60 const String& query)
|
702 kumpf 1.1 {
|
703 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMExecQueryRequestMessage(
|
704 kumpf 1.1 String::EMPTY,
705 nameSpace,
706 queryLanguage,
707 query,
|
708 a.arora 1.31 QueueIdStack()));
|
709 kumpf 1.1
710 Message* message = _doRequest(request, CIM_EXEC_QUERY_RESPONSE_MESSAGE);
711
712 CIMExecQueryResponseMessage* response =
713 (CIMExecQueryResponseMessage*)message;
714
|
715 a.arora 1.31 AutoPtr<CIMExecQueryResponseMessage> destroyer(response);
|
716 kumpf 1.1
|
717 kumpf 1.60 return response->cimObjects;
|
718 kumpf 1.1 }
719
720 Array<CIMObject> CIMClientRep::associators(
721 const CIMNamespaceName& nameSpace,
722 const CIMObjectPath& objectName,
723 const CIMName& assocClass,
724 const CIMName& resultClass,
725 const String& role,
726 const String& resultRole,
727 Boolean includeQualifiers,
728 Boolean includeClassOrigin,
|
729 kumpf 1.60 const CIMPropertyList& propertyList)
|
730 kumpf 1.1 {
|
731 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMAssociatorsRequestMessage(
|
732 kumpf 1.1 String::EMPTY,
733 nameSpace,
734 objectName,
735 assocClass,
736 resultClass,
737 role,
738 resultRole,
739 includeQualifiers,
740 includeClassOrigin,
741 propertyList,
|
742 a.arora 1.31 QueueIdStack()));
|
743 kumpf 1.1
744 Message* message = _doRequest(request, CIM_ASSOCIATORS_RESPONSE_MESSAGE);
745
746 CIMAssociatorsResponseMessage* response =
747 (CIMAssociatorsResponseMessage*)message;
748
|
749 a.arora 1.31 AutoPtr<CIMAssociatorsResponseMessage> destroyer(response);
|
750 kumpf 1.1
|
751 kumpf 1.60 return response->cimObjects;
|
752 kumpf 1.1 }
753
754 Array<CIMObjectPath> CIMClientRep::associatorNames(
755 const CIMNamespaceName& nameSpace,
756 const CIMObjectPath& objectName,
757 const CIMName& assocClass,
758 const CIMName& resultClass,
759 const String& role,
|
760 kumpf 1.60 const String& resultRole)
|
761 kumpf 1.1 {
|
762 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMAssociatorNamesRequestMessage(
|
763 kumpf 1.1 String::EMPTY,
764 nameSpace,
765 objectName,
766 assocClass,
767 resultClass,
768 role,
769 resultRole,
|
770 a.arora 1.31 QueueIdStack()));
|
771 kumpf 1.1
|
772 kumpf 1.60 Message* message =
773 _doRequest(request, CIM_ASSOCIATOR_NAMES_RESPONSE_MESSAGE);
|
774 kumpf 1.1
775 CIMAssociatorNamesResponseMessage* response =
776 (CIMAssociatorNamesResponseMessage*)message;
777
|
778 a.arora 1.31 AutoPtr<CIMAssociatorNamesResponseMessage> destroyer(response);
|
779 kumpf 1.1
|
780 kumpf 1.60 return response->objectNames;
|
781 kumpf 1.1 }
782
783 Array<CIMObject> CIMClientRep::references(
784 const CIMNamespaceName& nameSpace,
785 const CIMObjectPath& objectName,
786 const CIMName& resultClass,
787 const String& role,
788 Boolean includeQualifiers,
789 Boolean includeClassOrigin,
|
790 kumpf 1.60 const CIMPropertyList& propertyList)
|
791 kumpf 1.1 {
|
792 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMReferencesRequestMessage(
|
793 kumpf 1.1 String::EMPTY,
794 nameSpace,
795 objectName,
796 resultClass,
797 role,
798 includeQualifiers,
799 includeClassOrigin,
800 propertyList,
|
801 a.arora 1.31 QueueIdStack()));
|
802 kumpf 1.1
803 Message* message = _doRequest(request, CIM_REFERENCES_RESPONSE_MESSAGE);
804
805 CIMReferencesResponseMessage* response =
806 (CIMReferencesResponseMessage*)message;
807
|
808 a.arora 1.31 AutoPtr<CIMReferencesResponseMessage> destroyer(response);
|
809 kumpf 1.1
|
810 kumpf 1.60 return response->cimObjects;
|
811 kumpf 1.1 }
812
813 Array<CIMObjectPath> CIMClientRep::referenceNames(
814 const CIMNamespaceName& nameSpace,
815 const CIMObjectPath& objectName,
816 const CIMName& resultClass,
|
817 kumpf 1.60 const String& role)
|
818 kumpf 1.1 {
|
819 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMReferenceNamesRequestMessage(
|
820 kumpf 1.1 String::EMPTY,
821 nameSpace,
822 objectName,
823 resultClass,
824 role,
|
825 a.arora 1.31 QueueIdStack()));
|
826 kumpf 1.1
|
827 kumpf 1.60 Message* message =
828 _doRequest(request, CIM_REFERENCE_NAMES_RESPONSE_MESSAGE);
|
829 kumpf 1.1
830 CIMReferenceNamesResponseMessage* response =
831 (CIMReferenceNamesResponseMessage*)message;
832
|
833 a.arora 1.31 AutoPtr<CIMReferenceNamesResponseMessage> destroyer(response);
|
834 kumpf 1.1
|
835 kumpf 1.60 return response->objectNames;
|
836 kumpf 1.1 }
837
838 CIMValue CIMClientRep::getProperty(
839 const CIMNamespaceName& nameSpace,
840 const CIMObjectPath& instanceName,
|
841 kumpf 1.60 const CIMName& propertyName)
|
842 kumpf 1.1 {
|
843 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMGetPropertyRequestMessage(
|
844 kumpf 1.1 String::EMPTY,
845 nameSpace,
846 instanceName,
847 propertyName,
|
848 a.arora 1.31 QueueIdStack()));
|
849 kumpf 1.1
850 Message* message = _doRequest(request, CIM_GET_PROPERTY_RESPONSE_MESSAGE);
851
852 CIMGetPropertyResponseMessage* response =
853 (CIMGetPropertyResponseMessage*)message;
854
|
855 a.arora 1.31 AutoPtr<CIMGetPropertyResponseMessage> destroyer(response);
|
856 kumpf 1.1
|
857 kumpf 1.60 return response->value;
|
858 kumpf 1.1 }
859
860 void CIMClientRep::setProperty(
861 const CIMNamespaceName& nameSpace,
862 const CIMObjectPath& instanceName,
863 const CIMName& propertyName,
|
864 kumpf 1.60 const CIMValue& newValue)
|
865 kumpf 1.1 {
|
866 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMSetPropertyRequestMessage(
|
867 kumpf 1.1 String::EMPTY,
868 nameSpace,
869 instanceName,
870 propertyName,
871 newValue,
|
872 a.arora 1.31 QueueIdStack()));
|
873 kumpf 1.1
874 Message* message = _doRequest(request, CIM_SET_PROPERTY_RESPONSE_MESSAGE);
875
876 CIMSetPropertyResponseMessage* response =
877 (CIMSetPropertyResponseMessage*)message;
878
|
879 a.arora 1.31 AutoPtr<CIMSetPropertyResponseMessage> destroyer(response);
|
880 kumpf 1.1 }
881
882 CIMQualifierDecl CIMClientRep::getQualifier(
883 const CIMNamespaceName& nameSpace,
|
884 kumpf 1.60 const CIMName& qualifierName)
|
885 kumpf 1.1 {
|
886 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMGetQualifierRequestMessage(
|
887 kumpf 1.1 String::EMPTY,
888 nameSpace,
889 qualifierName,
|
890 a.arora 1.31 QueueIdStack()));
|
891 kumpf 1.1
892 Message* message = _doRequest(request, CIM_GET_QUALIFIER_RESPONSE_MESSAGE);
893
894 CIMGetQualifierResponseMessage* response =
895 (CIMGetQualifierResponseMessage*)message;
896
|
897 a.arora 1.31 AutoPtr<CIMGetQualifierResponseMessage> destroyer(response);
|
898 kumpf 1.1
|
899 kumpf 1.60 return response->cimQualifierDecl;
|
900 kumpf 1.1 }
901
902 void CIMClientRep::setQualifier(
903 const CIMNamespaceName& nameSpace,
|
904 kumpf 1.60 const CIMQualifierDecl& qualifierDeclaration)
|
905 kumpf 1.1 {
|
906 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMSetQualifierRequestMessage(
|
907 kumpf 1.1 String::EMPTY,
908 nameSpace,
909 qualifierDeclaration,
|
910 a.arora 1.31 QueueIdStack()));
|
911 kumpf 1.1
912 Message* message = _doRequest(request, CIM_SET_QUALIFIER_RESPONSE_MESSAGE);
913
914 CIMSetQualifierResponseMessage* response =
915 (CIMSetQualifierResponseMessage*)message;
916
|
917 a.arora 1.31 AutoPtr<CIMSetQualifierResponseMessage> destroyer(response);
|
918 kumpf 1.1 }
919
920 void CIMClientRep::deleteQualifier(
921 const CIMNamespaceName& nameSpace,
|
922 kumpf 1.60 const CIMName& qualifierName)
|
923 kumpf 1.1 {
|
924 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMDeleteQualifierRequestMessage(
|
925 kumpf 1.1 String::EMPTY,
926 nameSpace,
927 qualifierName,
|
928 a.arora 1.31 QueueIdStack()));
|
929 kumpf 1.1
|
930 kumpf 1.60 Message* message =
931 _doRequest(request, CIM_DELETE_QUALIFIER_RESPONSE_MESSAGE);
|
932 kumpf 1.1
933 CIMDeleteQualifierResponseMessage* response =
934 (CIMDeleteQualifierResponseMessage*)message;
935
|
936 a.arora 1.31 AutoPtr<CIMDeleteQualifierResponseMessage> destroyer(response);
|
937 kumpf 1.1 }
938
939 Array<CIMQualifierDecl> CIMClientRep::enumerateQualifiers(
|
940 kumpf 1.60 const CIMNamespaceName& nameSpace)
|
941 kumpf 1.1 {
|
942 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMEnumerateQualifiersRequestMessage(
|
943 kumpf 1.1 String::EMPTY,
944 nameSpace,
|
945 a.arora 1.31 QueueIdStack()));
|
946 kumpf 1.1
|
947 kumpf 1.60 Message* message =
948 _doRequest(request, CIM_ENUMERATE_QUALIFIERS_RESPONSE_MESSAGE);
|
949 kumpf 1.1
950 CIMEnumerateQualifiersResponseMessage* response =
951 (CIMEnumerateQualifiersResponseMessage*)message;
952
|
953 a.arora 1.31 AutoPtr<CIMEnumerateQualifiersResponseMessage> destroyer(response);
|
954 kumpf 1.1
|
955 kumpf 1.60 return response->qualifierDeclarations;
|
956 kumpf 1.1 }
957
958 CIMValue CIMClientRep::invokeMethod(
959 const CIMNamespaceName& nameSpace,
960 const CIMObjectPath& instanceName,
961 const CIMName& methodName,
962 const Array<CIMParamValue>& inParameters,
|
963 kumpf 1.60 Array<CIMParamValue>& outParameters)
|
964 kumpf 1.1 {
965 // ATTN-RK-P2-20020301: Does it make sense to have a nameSpace parameter
966 // when the namespace should already be included in the instanceName?
967 // ATTN-RK-P3-20020301: Do we need to make sure the caller didn't specify
968 // a host name in the instanceName?
969
|
970 david.dillard 1.42 // solved with PEP#139 Stage1 as other CIMOMs contained in the object path
971 // will cause a TypeMisMatchException
|
972 marek 1.12
|
973 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMInvokeMethodRequestMessage(
|
974 kumpf 1.1 String::EMPTY,
975 nameSpace,
976 instanceName,
977 methodName,
978 inParameters,
|
979 a.arora 1.31 QueueIdStack()));
|
980 kumpf 1.1
981 Message* message = _doRequest(request, CIM_INVOKE_METHOD_RESPONSE_MESSAGE);
982
983 CIMInvokeMethodResponseMessage* response =
984 (CIMInvokeMethodResponseMessage*)message;
985
|
986 a.arora 1.31 AutoPtr<CIMInvokeMethodResponseMessage> destroyer(response);
|
987 kumpf 1.1
988 outParameters = response->outParameters;
989
|
990 kumpf 1.60 return response->retValue;
|
991 kumpf 1.1 }
992
993 Message* CIMClientRep::_doRequest(
|
994 a.arora 1.31 AutoPtr<CIMRequestMessage>& request,
|
995 kumpf 1.65 MessageType expectedResponseMessageType)
|
996 kumpf 1.1 {
|
997 kumpf 1.61 if (!_connected && !_doReconnect)
|
998 kumpf 1.1 {
999 throw NotConnectedException();
1000 }
1001
|
1002 kumpf 1.61 if (_doReconnect)
1003 {
1004 _connect();
1005 _doReconnect = false;
1006 }
1007
|
1008 kumpf 1.1 String messageId = XmlWriter::getNextMessageId();
1009 const_cast<String &>(request->messageId) = messageId;
1010
|
1011 kumpf 1.8 _authenticator.setRequestMessage(0);
|
1012 kumpf 1.1
1013 // ATTN-RK-P2-20020416: We should probably clear out the queue first.
1014 PEGASUS_ASSERT(getCount() == 0); // Shouldn't be any messages in our queue
1015
1016 //
|
1017 karl 1.2 // Set HTTP method in request to POST
|
1018 kumpf 1.1 //
|
1019 david.dillard 1.42 //Bug 478/418 - Change this to do post call, not mpost
|
1020 karl 1.2 request->setHttpMethod (HTTP_METHOD__POST);
|
1021 kumpf 1.1
1022 // Set the Accept-Languages and Content-Languages into
1023 // the request message
1024
|
1025 kumpf 1.60 request->operationContext.set(
1026 AcceptLanguageListContainer(requestAcceptLanguages));
1027 request->operationContext.set(
1028 ContentLanguageListContainer(requestContentLanguages));
|
1029 se.gupta 1.22
1030
|
1031 kumpf 1.60 //gathering statistical information about client operation
1032 perfDataStore.reset();
1033 perfDataStore.setOperationType(request->getType());
1034 perfDataStore.setMessageID(request->messageId);
|
1035 w.white 1.35
|
1036 kumpf 1.1 // Sending a new request, so clear out the response Content-Languages
|
1037 kumpf 1.51 responseContentLanguages.clear();
|
1038 kumpf 1.1
|
1039 a.arora 1.32 _requestEncoder->enqueue(request.get());
1040 request.release();
|
1041 kumpf 1.1
1042 Uint64 startMilliseconds = TimeValue::getCurrentTime().toMilliseconds();
1043 Uint64 nowMilliseconds = startMilliseconds;
|
1044 dmitry.mikulin 1.67 #ifdef PEGASUS_DISABLE_CLIENT_TIMEOUT
1045 Uint64 stopMilliseconds = (Uint64) -1;
1046 #else
|
1047 kumpf 1.1 Uint64 stopMilliseconds = nowMilliseconds + _timeoutMilliseconds;
|
1048 dmitry.mikulin 1.67 #endif
|
1049 kumpf 1.1
1050 while (nowMilliseconds < stopMilliseconds)
1051 {
1052 //
1053 // Wait until the timeout expires or an event occurs:
1054 //
|
1055 kumpf 1.34 _monitor->run(Uint32(stopMilliseconds - nowMilliseconds));
|
1056 kumpf 1.1
1057 //
1058 // Check to see if incoming queue has a message
1059 //
1060
|
1061 kumpf 1.61 AutoPtr<Message> response(dequeue());
|
1062 kumpf 1.1
|
1063 kumpf 1.61 if (response.get())
|
1064 kumpf 1.1 {
1065 // Shouldn't be any more messages in our queue
1066 PEGASUS_ASSERT(getCount() == 0);
1067
1068 //
|
1069 kumpf 1.61 // Close the connection if response contained a "Connection: Close"
1070 // header (e.g. at authentication challenge)
|
1071 j.alex 1.47 //
|
1072 kumpf 1.60 if (response->getCloseConnect() == true)
1073 {
|
1074 kumpf 1.61 _disconnect();
1075 _doReconnect = true;
|
1076 j.alex 1.48 response->setCloseConnect(false);
|
1077 j.alex 1.47 }
1078
1079 //
|
1080 kumpf 1.4 // Future: If M-POST is used and HTTP response is 501 Not
1081 // Implemented or 510 Not Extended, retry with POST method
|
1082 kumpf 1.1 //
1083
1084 if (response->getType() == CLIENT_EXCEPTION_MESSAGE)
1085 {
1086 Exception* clientException =
|
1087 kumpf 1.61 ((ClientExceptionMessage*)response.get())->clientException;
|
1088 kumpf 1.4
|
1089 a.arora 1.31 AutoPtr<Exception> d(clientException);
|
1090 kumpf 1.4
|
1091 david.dillard 1.42 // Make the ContentLanguage of the exception available through
1092 // the CIMClient API (its also available in the exception).
|
1093 kumpf 1.60 responseContentLanguages =
1094 clientException->getContentLanguages();
|
1095 chuck 1.27
|
1096 kumpf 1.4 //
1097 // Determine and throw the specific class of client exception
1098 //
1099
1100 CIMClientMalformedHTTPException* malformedHTTPException =
1101 dynamic_cast<CIMClientMalformedHTTPException*>(
1102 clientException);
1103 if (malformedHTTPException)
1104 {
1105 throw *malformedHTTPException;
1106 }
1107
1108 CIMClientHTTPErrorException* httpErrorException =
1109 dynamic_cast<CIMClientHTTPErrorException*>(
1110 clientException);
1111 if (httpErrorException)
1112 {
1113 throw *httpErrorException;
1114 }
1115
1116 CIMClientXmlException* xmlException =
1117 kumpf 1.4 dynamic_cast<CIMClientXmlException*>(clientException);
1118 if (xmlException)
1119 {
1120 throw *xmlException;
1121 }
1122
1123 CIMClientResponseException* responseException =
1124 dynamic_cast<CIMClientResponseException*>(clientException);
1125 if (responseException)
1126 {
1127 throw *responseException;
1128 }
1129
|
1130 david.dillard 1.42 CIMException* cimException =
|
1131 brian.campbell 1.25 dynamic_cast<CIMException*>(clientException);
1132 if (cimException)
1133 {
1134 throw *cimException;
1135 }
1136
|
1137 kumpf 1.1 throw *clientException;
1138 }
1139 else if (response->getType() == expectedResponseMessageType)
1140 {
|
1141 kumpf 1.61 CIMResponseMessage* cimResponse =
1142 (CIMResponseMessage*)response.get();
|
1143 kumpf 1.1
1144 if (cimResponse->messageId != messageId)
1145 {
1146 MessageLoaderParms mlParms(
1147 "Client.CIMClient.MISMATCHED_RESPONSE",
1148 "Mismatched response message ID: Got \"$0\", "
1149 "expected \"$1\".",
1150 cimResponse->messageId, messageId);
1151 String mlString(MessageLoader::getMessage(mlParms));
1152
1153 CIMClientResponseException responseException(mlString);
1154
1155 throw responseException;
1156 }
1157
|
1158 kumpf 1.60 // Get the Content-Languages from the response's
1159 // operationContext and make available through the
1160 // CIMClient API
1161 responseContentLanguages = ((ContentLanguageListContainer)
1162 cimResponse->operationContext.get(
1163 ContentLanguageListContainer::NAME)).getLanguages();
|
1164 kumpf 1.1
1165 if (cimResponse->cimException.getCode() != CIM_ERR_SUCCESS)
1166 {
|
1167 karl 1.59 CIMException cimException(cimResponse->cimException);
1168
|
1169 david.dillard 1.42 cimException.setContentLanguages(responseContentLanguages);
|
1170 kumpf 1.1 throw cimException;
1171 }
|
1172 w.white 1.37
|
1173 kumpf 1.60 // if execution gets here everytihng is working correctly
1174 // and a proper response was generated and received.
|
1175 w.white 1.37
|
1176 kumpf 1.60 // Check that client side statistics are valid before
1177 // handing them to the client application via a call back
1178 Boolean re_check = perfDataStore.checkMessageIDandType(
1179 cimResponse->messageId,
1180 cimResponse->getType());
1181
1182 if (re_check &&
1183 !perfDataStore.getStatError() &&
1184 perfDataStore.isClassRegistered())
|
1185 david.dillard 1.42 {
|
1186 kumpf 1.60 // If callback method throws an exception it will be seen
1187 // by the client no try/catch block is used here
1188 // intentionaly - because exceptions come from the client
1189 // application so client app. should handle them
1190 ClientOpPerformanceData item =
1191 perfDataStore.createPerfDataStruct();
1192 perfDataStore.handler_prt->handleClientOpPerformanceData(
1193 item);
|
1194 david.dillard 1.42
|
1195 w.white 1.37 }//end of if statmet that call the callback method
|
1196 kumpf 1.61 return response.release();
|
1197 kumpf 1.1 }
|
1198 kumpf 1.61 else if (dynamic_cast<CIMRequestMessage*>(response.get()) != 0)
|
1199 j.alex 1.48 {
|
1200 kumpf 1.61 //
1201 // Respond to an authentication challenge.
1202 // Reconnect if the connection was closed.
1203 //
1204 if (_doReconnect)
1205 {
1206 _connect();
1207 }
1208
1209 _requestEncoder->enqueue(response.release());
|
1210 j.alex 1.48 nowMilliseconds = TimeValue::getCurrentTime().toMilliseconds();
1211 stopMilliseconds = nowMilliseconds + _timeoutMilliseconds;
1212 continue;
1213 }
|
1214 kumpf 1.1 else
1215 {
1216 MessageLoaderParms mlParms(
|
1217 kumpf 1.60 "Client.CIMOperationResponseDecoder."
1218 "MISMATCHED_RESPONSE_TYPE",
|
1219 j.alex 1.48 "Mismatched response message type.");
|
1220 kumpf 1.1 String mlString(MessageLoader::getMessage(mlParms));
1221
1222 CIMClientResponseException responseException(mlString);
1223
1224 throw responseException;
1225 }
1226 }
1227
1228 nowMilliseconds = TimeValue::getCurrentTime().toMilliseconds();
1229 }
1230
1231 //
1232 // Reconnect to reset the connection (disregard late response)
1233 //
|
1234 kumpf 1.61
1235 _disconnect();
1236 _authenticator.resetChallengeStatus();
1237 _doReconnect = true;
|
1238 kumpf 1.1
1239 //
1240 // Throw timed out exception:
1241 //
1242 throw ConnectionTimeoutException();
1243 }
1244
|
1245 kumpf 1.60 void CIMClientRep::registerClientOpPerformanceDataHandler(
1246 ClientOpPerformanceDataHandler& handler)
|
1247 david.dillard 1.42 {
|
1248 kumpf 1.60 perfDataStore.handler_prt = &handler;
1249 perfDataStore.setClassRegistered(true);
|
1250 w.white 1.37 }
|
1251 david.dillard 1.42
|
1252 w.white 1.37 void CIMClientRep::deregisterClientOpPerformanceDataHandler()
1253 {
|
1254 a.dunfey 1.53 perfDataStore.handler_prt = NULL;
1255 perfDataStore.setClassRegistered(false);
|
1256 w.white 1.37 }
1257
|
1258 kumpf 1.1 PEGASUS_NAMESPACE_END
|