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 a.arora 1.31 _connected(false)
|
59 kumpf 1.1 {
60 //
61 // Create Monitor and HTTPConnector
62 //
|
63 a.arora 1.31 _monitor.reset(new Monitor());
64 _httpConnector.reset(new HTTPConnector(_monitor.get()));
|
65 kumpf 1.1
|
66 kumpf 1.51 requestAcceptLanguages.clear();
67 requestContentLanguages.clear();
|
68 kumpf 1.1 }
69
70 CIMClientRep::~CIMClientRep()
71 {
72 disconnect();
73 }
74
75 void CIMClientRep::handleEnqueue()
76 {
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 String io = String::EMPTY;
115 Uint32 pos = input.find(':');
116 kumpf 1.1 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.1 _connected = true;
|
171 marek 1.56 _httpConnection->setSocketWriteTimeout(_timeoutMilliseconds/1000+1);
|
172 kumpf 1.1 }
173
|
174 kumpf 1.8 void CIMClientRep::_disconnect()
175 {
176 if (_connected)
177 {
178 //
179 // destroy response decoder
180 //
|
181 a.arora 1.31 _responseDecoder.reset();
|
182 david.dillard 1.42
|
183 kumpf 1.8
184 //
185 // Close the connection
186 //
|
187 a.arora 1.31 if (_httpConnector.get())
|
188 kumpf 1.8 {
|
189 denise.eckstein 1.46 _httpConnector->disconnect(_httpConnection);
190 _httpConnection = 0;
|
191 kumpf 1.8 }
192
193 //
194 // destroy request encoder
195 //
|
196 a.arora 1.31 _requestEncoder.reset();
|
197 kumpf 1.8
198 _connected = false;
199 }
200 }
201
|
202 kumpf 1.1 void CIMClientRep::_reconnect()
203 {
|
204 kumpf 1.8 _disconnect();
|
205 mateus.baur 1.50 _authenticator.clearReconnect();
|
206 a.arora 1.32 _connect();
|
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 _connectHost.assign(_getLocalHostName());
331
|
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 _connectHost.assign(_getLocalHostName());
348
349 //
350 // Create SSLContext
351 //
352 #ifdef PEGASUS_OS_OS400
353 #pragma convert(37)
354 const char* env = getenv("PEGASUS_HOME");
355 #pragma convert(0)
356 char pegasusHome[256] = {0};
357 if (env != NULL && strlen(env) < 256)
358 kumpf 1.1 {
359 strcpy(pegasusHome, env);
360 EtoA(pegasusHome);
361 }
362 #else
363 const char* pegasusHome = getenv("PEGASUS_HOME");
364 #endif
365
366 String randFile = String::EMPTY;
367
368 #ifdef PEGASUS_SSL_RANDOMFILE
369 randFile = FileSystem::getAbsolutePath(
370 pegasusHome, PEGASUS_SSLCLIENT_RANDOMFILE);
371 #endif
372
373 try
374 {
|
375 a.arora 1.32 _connectSSLContext.reset(
|
376 kumpf 1.28 new SSLContext(String::EMPTY, NULL, randFile));
|
377 kumpf 1.1 }
|
378 david.dillard 1.44 catch (const SSLException &)
|
379 kumpf 1.1 {
|
380 david.dillard 1.44 throw;
|
381 kumpf 1.1 }
382
|
383 a.arora 1.32 _connect();
|
384 kumpf 1.1 }
385 #endif
386 }
387
388
389 void CIMClientRep::disconnect()
390 {
|
391 kumpf 1.8 _disconnect();
392 _authenticator.clear();
|
393 kumpf 1.28 _connectSSLContext.reset();
|
394 kumpf 1.8 }
|
395 kumpf 1.1
|
396 david.dillard 1.42 Boolean CIMClientRep::isConnected() const throw()
|
397 marek 1.21 {
|
398 david.dillard 1.42 return _connected;
|
399 marek 1.21 }
400
|
401 kumpf 1.52 AcceptLanguageList CIMClientRep::getRequestAcceptLanguages() const
|
402 kumpf 1.1 {
403 return requestAcceptLanguages;
404 }
405
|
406 kumpf 1.52 ContentLanguageList CIMClientRep::getRequestContentLanguages() const
|
407 kumpf 1.1 {
408 return requestContentLanguages;
409 }
410
|
411 kumpf 1.52 ContentLanguageList CIMClientRep::getResponseContentLanguages() const
|
412 kumpf 1.1 {
413 return responseContentLanguages;
414 }
415
|
416 kumpf 1.52 void CIMClientRep::setRequestAcceptLanguages(const AcceptLanguageList& langs)
|
417 kumpf 1.1 {
418 requestAcceptLanguages = langs;
419 }
420
|
421 kumpf 1.52 void CIMClientRep::setRequestContentLanguages(const ContentLanguageList& langs)
|
422 kumpf 1.1 {
423 requestContentLanguages = langs;
424 }
425
426 void CIMClientRep::setRequestDefaultLanguages()
427 {
|
428 kumpf 1.51 requestAcceptLanguages = LanguageParser::getDefaultAcceptLanguages();
|
429 kumpf 1.1 }
430
431 CIMClass CIMClientRep::getClass(
432 const CIMNamespaceName& nameSpace,
433 const CIMName& className,
434 Boolean localOnly,
435 Boolean includeQualifiers,
436 Boolean includeClassOrigin,
|
437 kumpf 1.60 const CIMPropertyList& propertyList)
|
438 kumpf 1.1 {
|
439 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMGetClassRequestMessage(
|
440 kumpf 1.1 String::EMPTY,
441 nameSpace,
442 className,
443 localOnly,
444 includeQualifiers,
445 includeClassOrigin,
446 propertyList,
|
447 a.arora 1.31 QueueIdStack()));
|
448 kumpf 1.1
449 Message* message = _doRequest(request, CIM_GET_CLASS_RESPONSE_MESSAGE);
450
451 CIMGetClassResponseMessage* response =
452 (CIMGetClassResponseMessage*)message;
453
|
454 a.arora 1.31 AutoPtr<CIMGetClassResponseMessage> destroyer(response);
|
455 kumpf 1.1
|
456 kumpf 1.60 return response->cimClass;
|
457 kumpf 1.1 }
458
459 CIMInstance CIMClientRep::getInstance(
460 const CIMNamespaceName& nameSpace,
461 const CIMObjectPath& instanceName,
462 Boolean localOnly,
463 Boolean includeQualifiers,
464 Boolean includeClassOrigin,
|
465 kumpf 1.60 const CIMPropertyList& propertyList)
|
466 kumpf 1.1 {
|
467 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMGetInstanceRequestMessage(
|
468 kumpf 1.1 String::EMPTY,
469 nameSpace,
470 instanceName,
471 localOnly,
472 includeQualifiers,
473 includeClassOrigin,
474 propertyList,
|
475 a.arora 1.31 QueueIdStack()));
|
476 kumpf 1.1
477 Message* message = _doRequest(request, CIM_GET_INSTANCE_RESPONSE_MESSAGE);
478
479 CIMGetInstanceResponseMessage* response =
480 (CIMGetInstanceResponseMessage*)message;
481
|
482 a.arora 1.31 AutoPtr<CIMGetInstanceResponseMessage> destroyer(response);
|
483 kumpf 1.1
|
484 kumpf 1.60 return response->cimInstance;
|
485 kumpf 1.1 }
486
487 void CIMClientRep::deleteClass(
488 const CIMNamespaceName& nameSpace,
|
489 kumpf 1.60 const CIMName& className)
|
490 kumpf 1.1 {
|
491 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMDeleteClassRequestMessage(
|
492 kumpf 1.1 String::EMPTY,
493 nameSpace,
494 className,
|
495 a.arora 1.31 QueueIdStack()));
|
496 kumpf 1.1
497 Message* message = _doRequest(request, CIM_DELETE_CLASS_RESPONSE_MESSAGE);
498
499 CIMDeleteClassResponseMessage* response =
500 (CIMDeleteClassResponseMessage*)message;
501
|
502 a.arora 1.31 AutoPtr<CIMDeleteClassResponseMessage> destroyer(response);
|
503 kumpf 1.1 }
504
505 void CIMClientRep::deleteInstance(
506 const CIMNamespaceName& nameSpace,
|
507 kumpf 1.60 const CIMObjectPath& instanceName)
|
508 kumpf 1.1 {
|
509 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMDeleteInstanceRequestMessage(
|
510 kumpf 1.1 String::EMPTY,
511 nameSpace,
512 instanceName,
|
513 a.arora 1.31 QueueIdStack()));
|
514 kumpf 1.1
|
515 kumpf 1.60 Message* message =
516 _doRequest(request, CIM_DELETE_INSTANCE_RESPONSE_MESSAGE);
|
517 kumpf 1.1
518 CIMDeleteInstanceResponseMessage* response =
519 (CIMDeleteInstanceResponseMessage*)message;
520
|
521 a.arora 1.31 AutoPtr<CIMDeleteInstanceResponseMessage> destroyer(response);
|
522 kumpf 1.1 }
523
524 void CIMClientRep::createClass(
525 const CIMNamespaceName& nameSpace,
|
526 kumpf 1.60 const CIMClass& newClass)
|
527 kumpf 1.1 {
|
528 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMCreateClassRequestMessage(
|
529 kumpf 1.1 String::EMPTY,
530 nameSpace,
531 newClass,
|
532 a.arora 1.31 QueueIdStack()));
|
533 kumpf 1.1
534 Message* message = _doRequest(request, CIM_CREATE_CLASS_RESPONSE_MESSAGE);
535
536 CIMCreateClassResponseMessage* response =
537 (CIMCreateClassResponseMessage*)message;
538
|
539 a.arora 1.31 AutoPtr<CIMCreateClassResponseMessage> destroyer(response);
|
540 kumpf 1.1 }
541
542 CIMObjectPath CIMClientRep::createInstance(
543 const CIMNamespaceName& nameSpace,
|
544 kumpf 1.60 const CIMInstance& newInstance)
|
545 kumpf 1.1 {
|
546 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMCreateInstanceRequestMessage(
|
547 kumpf 1.1 String::EMPTY,
548 nameSpace,
549 newInstance,
|
550 a.arora 1.31 QueueIdStack()));
|
551 kumpf 1.1
|
552 kumpf 1.60 Message* message =
553 _doRequest(request, CIM_CREATE_INSTANCE_RESPONSE_MESSAGE);
|
554 kumpf 1.1
555 CIMCreateInstanceResponseMessage* response =
556 (CIMCreateInstanceResponseMessage*)message;
557
|
558 a.arora 1.31 AutoPtr<CIMCreateInstanceResponseMessage> destroyer(response);
|
559 kumpf 1.1
|
560 kumpf 1.60 return response->instanceName;
|
561 kumpf 1.1 }
562
563 void CIMClientRep::modifyClass(
564 const CIMNamespaceName& nameSpace,
|
565 kumpf 1.60 const CIMClass& modifiedClass)
|
566 kumpf 1.1 {
|
567 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMModifyClassRequestMessage(
|
568 kumpf 1.1 String::EMPTY,
569 nameSpace,
570 modifiedClass,
|
571 a.arora 1.31 QueueIdStack()));
|
572 kumpf 1.1
573 Message* message = _doRequest(request, CIM_MODIFY_CLASS_RESPONSE_MESSAGE);
574
575 CIMModifyClassResponseMessage* response =
576 (CIMModifyClassResponseMessage*)message;
577
|
578 a.arora 1.31 AutoPtr<CIMModifyClassResponseMessage> destroyer(response);
|
579 kumpf 1.1 }
580
581 void CIMClientRep::modifyInstance(
582 const CIMNamespaceName& nameSpace,
583 const CIMInstance& modifiedInstance,
584 Boolean includeQualifiers,
|
585 kumpf 1.60 const CIMPropertyList& propertyList)
|
586 kumpf 1.1 {
|
587 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMModifyInstanceRequestMessage(
|
588 kumpf 1.1 String::EMPTY,
589 nameSpace,
590 modifiedInstance,
591 includeQualifiers,
592 propertyList,
|
593 a.arora 1.31 QueueIdStack()));
|
594 kumpf 1.1
|
595 kumpf 1.60 Message* message =
596 _doRequest(request, CIM_MODIFY_INSTANCE_RESPONSE_MESSAGE);
|
597 kumpf 1.1
598 CIMModifyInstanceResponseMessage* response =
599 (CIMModifyInstanceResponseMessage*)message;
600
|
601 a.arora 1.31 AutoPtr<CIMModifyInstanceResponseMessage> destroyer(response);
|
602 kumpf 1.1 }
603
604 Array<CIMClass> CIMClientRep::enumerateClasses(
605 const CIMNamespaceName& nameSpace,
606 const CIMName& className,
607 Boolean deepInheritance,
608 Boolean localOnly,
609 Boolean includeQualifiers,
|
610 kumpf 1.60 Boolean includeClassOrigin)
|
611 kumpf 1.1 {
|
612 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMEnumerateClassesRequestMessage(
|
613 kumpf 1.1 String::EMPTY,
614 nameSpace,
615 className,
616 deepInheritance,
617 localOnly,
618 includeQualifiers,
619 includeClassOrigin,
|
620 a.arora 1.31 QueueIdStack()));
|
621 kumpf 1.1
|
622 kumpf 1.60 Message* message =
623 _doRequest(request, CIM_ENUMERATE_CLASSES_RESPONSE_MESSAGE);
|
624 kumpf 1.1
625 CIMEnumerateClassesResponseMessage* response =
626 (CIMEnumerateClassesResponseMessage*)message;
627
|
628 a.arora 1.31 AutoPtr<CIMEnumerateClassesResponseMessage> destroyer(response);
|
629 kumpf 1.1
|
630 kumpf 1.60 return response->cimClasses;
|
631 kumpf 1.1 }
632
633 Array<CIMName> CIMClientRep::enumerateClassNames(
634 const CIMNamespaceName& nameSpace,
635 const CIMName& className,
|
636 kumpf 1.60 Boolean deepInheritance)
|
637 kumpf 1.1 {
|
638 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMEnumerateClassNamesRequestMessage(
|
639 kumpf 1.1 String::EMPTY,
640 nameSpace,
641 className,
642 deepInheritance,
|
643 a.arora 1.31 QueueIdStack()));
|
644 kumpf 1.1
|
645 kumpf 1.60 Message* message =
646 _doRequest(request, CIM_ENUMERATE_CLASS_NAMES_RESPONSE_MESSAGE);
|
647 kumpf 1.1
648 CIMEnumerateClassNamesResponseMessage* response =
649 (CIMEnumerateClassNamesResponseMessage*)message;
650
|
651 a.arora 1.31 AutoPtr<CIMEnumerateClassNamesResponseMessage> destroyer(response);
|
652 kumpf 1.1
653 // Temporary code until internal structures use CIMName instead of String
654 Array<CIMName> classNameArray;
655 classNameArray.reserveCapacity(response->classNames.size());
656 for (Uint32 i=0; i<response->classNames.size(); i++)
657 {
658 classNameArray.append(response->classNames[i]);
659 }
|
660 kumpf 1.60 return classNameArray;
|
661 kumpf 1.1 }
662
663 Array<CIMInstance> CIMClientRep::enumerateInstances(
664 const CIMNamespaceName& nameSpace,
665 const CIMName& className,
666 Boolean deepInheritance,
667 Boolean localOnly,
668 Boolean includeQualifiers,
669 Boolean includeClassOrigin,
|
670 kumpf 1.60 const CIMPropertyList& propertyList)
|
671 kumpf 1.1 {
|
672 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMEnumerateInstancesRequestMessage(
|
673 kumpf 1.1 String::EMPTY,
674 nameSpace,
675 className,
676 deepInheritance,
677 localOnly,
678 includeQualifiers,
679 includeClassOrigin,
680 propertyList,
|
681 a.arora 1.31 QueueIdStack()));
|
682 kumpf 1.1
|
683 kumpf 1.60 Message* message =
684 _doRequest(request, CIM_ENUMERATE_INSTANCES_RESPONSE_MESSAGE);
|
685 kumpf 1.1
686 CIMEnumerateInstancesResponseMessage* response =
687 (CIMEnumerateInstancesResponseMessage*)message;
688
|
689 a.arora 1.31 AutoPtr<CIMEnumerateInstancesResponseMessage> destroyer(response);
|
690 kumpf 1.1
|
691 kumpf 1.60 return response->cimNamedInstances;
|
692 kumpf 1.1 }
693
694 Array<CIMObjectPath> CIMClientRep::enumerateInstanceNames(
695 const CIMNamespaceName& nameSpace,
|
696 kumpf 1.60 const CIMName& className)
|
697 kumpf 1.1 {
|
698 kumpf 1.60 AutoPtr<CIMRequestMessage> request(
699 new CIMEnumerateInstanceNamesRequestMessage(
700 String::EMPTY,
701 nameSpace,
702 className,
703 QueueIdStack()));
|
704 kumpf 1.1
|
705 kumpf 1.60 Message* message =
706 _doRequest(request, CIM_ENUMERATE_INSTANCE_NAMES_RESPONSE_MESSAGE);
|
707 kumpf 1.1
708 CIMEnumerateInstanceNamesResponseMessage* response =
709 (CIMEnumerateInstanceNamesResponseMessage*)message;
710
|
711 a.arora 1.31 AutoPtr<CIMEnumerateInstanceNamesResponseMessage> destroyer(response);
|
712 kumpf 1.1
|
713 kumpf 1.60 return response->instanceNames;
|
714 kumpf 1.1 }
715
716 Array<CIMObject> CIMClientRep::execQuery(
717 const CIMNamespaceName& nameSpace,
718 const String& queryLanguage,
|
719 kumpf 1.60 const String& query)
|
720 kumpf 1.1 {
|
721 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMExecQueryRequestMessage(
|
722 kumpf 1.1 String::EMPTY,
723 nameSpace,
724 queryLanguage,
725 query,
|
726 a.arora 1.31 QueueIdStack()));
|
727 kumpf 1.1
728 Message* message = _doRequest(request, CIM_EXEC_QUERY_RESPONSE_MESSAGE);
729
730 CIMExecQueryResponseMessage* response =
731 (CIMExecQueryResponseMessage*)message;
732
|
733 a.arora 1.31 AutoPtr<CIMExecQueryResponseMessage> destroyer(response);
|
734 kumpf 1.1
|
735 kumpf 1.60 return response->cimObjects;
|
736 kumpf 1.1 }
737
738 Array<CIMObject> CIMClientRep::associators(
739 const CIMNamespaceName& nameSpace,
740 const CIMObjectPath& objectName,
741 const CIMName& assocClass,
742 const CIMName& resultClass,
743 const String& role,
744 const String& resultRole,
745 Boolean includeQualifiers,
746 Boolean includeClassOrigin,
|
747 kumpf 1.60 const CIMPropertyList& propertyList)
|
748 kumpf 1.1 {
|
749 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMAssociatorsRequestMessage(
|
750 kumpf 1.1 String::EMPTY,
751 nameSpace,
752 objectName,
753 assocClass,
754 resultClass,
755 role,
756 resultRole,
757 includeQualifiers,
758 includeClassOrigin,
759 propertyList,
|
760 a.arora 1.31 QueueIdStack()));
|
761 kumpf 1.1
762 Message* message = _doRequest(request, CIM_ASSOCIATORS_RESPONSE_MESSAGE);
763
764 CIMAssociatorsResponseMessage* response =
765 (CIMAssociatorsResponseMessage*)message;
766
|
767 a.arora 1.31 AutoPtr<CIMAssociatorsResponseMessage> destroyer(response);
|
768 kumpf 1.1
|
769 kumpf 1.60 return response->cimObjects;
|
770 kumpf 1.1 }
771
772 Array<CIMObjectPath> CIMClientRep::associatorNames(
773 const CIMNamespaceName& nameSpace,
774 const CIMObjectPath& objectName,
775 const CIMName& assocClass,
776 const CIMName& resultClass,
777 const String& role,
|
778 kumpf 1.60 const String& resultRole)
|
779 kumpf 1.1 {
|
780 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMAssociatorNamesRequestMessage(
|
781 kumpf 1.1 String::EMPTY,
782 nameSpace,
783 objectName,
784 assocClass,
785 resultClass,
786 role,
787 resultRole,
|
788 a.arora 1.31 QueueIdStack()));
|
789 kumpf 1.1
|
790 kumpf 1.60 Message* message =
791 _doRequest(request, CIM_ASSOCIATOR_NAMES_RESPONSE_MESSAGE);
|
792 kumpf 1.1
793 CIMAssociatorNamesResponseMessage* response =
794 (CIMAssociatorNamesResponseMessage*)message;
795
|
796 a.arora 1.31 AutoPtr<CIMAssociatorNamesResponseMessage> destroyer(response);
|
797 kumpf 1.1
|
798 kumpf 1.60 return response->objectNames;
|
799 kumpf 1.1 }
800
801 Array<CIMObject> CIMClientRep::references(
802 const CIMNamespaceName& nameSpace,
803 const CIMObjectPath& objectName,
804 const CIMName& resultClass,
805 const String& role,
806 Boolean includeQualifiers,
807 Boolean includeClassOrigin,
|
808 kumpf 1.60 const CIMPropertyList& propertyList)
|
809 kumpf 1.1 {
|
810 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMReferencesRequestMessage(
|
811 kumpf 1.1 String::EMPTY,
812 nameSpace,
813 objectName,
814 resultClass,
815 role,
816 includeQualifiers,
817 includeClassOrigin,
818 propertyList,
|
819 a.arora 1.31 QueueIdStack()));
|
820 kumpf 1.1
821 Message* message = _doRequest(request, CIM_REFERENCES_RESPONSE_MESSAGE);
822
823 CIMReferencesResponseMessage* response =
824 (CIMReferencesResponseMessage*)message;
825
|
826 a.arora 1.31 AutoPtr<CIMReferencesResponseMessage> destroyer(response);
|
827 kumpf 1.1
|
828 kumpf 1.60 return response->cimObjects;
|
829 kumpf 1.1 }
830
831 Array<CIMObjectPath> CIMClientRep::referenceNames(
832 const CIMNamespaceName& nameSpace,
833 const CIMObjectPath& objectName,
834 const CIMName& resultClass,
|
835 kumpf 1.60 const String& role)
|
836 kumpf 1.1 {
|
837 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMReferenceNamesRequestMessage(
|
838 kumpf 1.1 String::EMPTY,
839 nameSpace,
840 objectName,
841 resultClass,
842 role,
|
843 a.arora 1.31 QueueIdStack()));
|
844 kumpf 1.1
|
845 kumpf 1.60 Message* message =
846 _doRequest(request, CIM_REFERENCE_NAMES_RESPONSE_MESSAGE);
|
847 kumpf 1.1
848 CIMReferenceNamesResponseMessage* response =
849 (CIMReferenceNamesResponseMessage*)message;
850
|
851 a.arora 1.31 AutoPtr<CIMReferenceNamesResponseMessage> destroyer(response);
|
852 kumpf 1.1
|
853 kumpf 1.60 return response->objectNames;
|
854 kumpf 1.1 }
855
856 CIMValue CIMClientRep::getProperty(
857 const CIMNamespaceName& nameSpace,
858 const CIMObjectPath& instanceName,
|
859 kumpf 1.60 const CIMName& propertyName)
|
860 kumpf 1.1 {
|
861 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMGetPropertyRequestMessage(
|
862 kumpf 1.1 String::EMPTY,
863 nameSpace,
864 instanceName,
865 propertyName,
|
866 a.arora 1.31 QueueIdStack()));
|
867 kumpf 1.1
868 Message* message = _doRequest(request, CIM_GET_PROPERTY_RESPONSE_MESSAGE);
869
870 CIMGetPropertyResponseMessage* response =
871 (CIMGetPropertyResponseMessage*)message;
872
|
873 a.arora 1.31 AutoPtr<CIMGetPropertyResponseMessage> destroyer(response);
|
874 kumpf 1.1
|
875 kumpf 1.60 return response->value;
|
876 kumpf 1.1 }
877
878 void CIMClientRep::setProperty(
879 const CIMNamespaceName& nameSpace,
880 const CIMObjectPath& instanceName,
881 const CIMName& propertyName,
|
882 kumpf 1.60 const CIMValue& newValue)
|
883 kumpf 1.1 {
|
884 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMSetPropertyRequestMessage(
|
885 kumpf 1.1 String::EMPTY,
886 nameSpace,
887 instanceName,
888 propertyName,
889 newValue,
|
890 a.arora 1.31 QueueIdStack()));
|
891 kumpf 1.1
892 Message* message = _doRequest(request, CIM_SET_PROPERTY_RESPONSE_MESSAGE);
893
894 CIMSetPropertyResponseMessage* response =
895 (CIMSetPropertyResponseMessage*)message;
896
|
897 a.arora 1.31 AutoPtr<CIMSetPropertyResponseMessage> destroyer(response);
|
898 kumpf 1.1 }
899
900 CIMQualifierDecl CIMClientRep::getQualifier(
901 const CIMNamespaceName& nameSpace,
|
902 kumpf 1.60 const CIMName& qualifierName)
|
903 kumpf 1.1 {
|
904 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMGetQualifierRequestMessage(
|
905 kumpf 1.1 String::EMPTY,
906 nameSpace,
907 qualifierName,
|
908 a.arora 1.31 QueueIdStack()));
|
909 kumpf 1.1
910 Message* message = _doRequest(request, CIM_GET_QUALIFIER_RESPONSE_MESSAGE);
911
912 CIMGetQualifierResponseMessage* response =
913 (CIMGetQualifierResponseMessage*)message;
914
|
915 a.arora 1.31 AutoPtr<CIMGetQualifierResponseMessage> destroyer(response);
|
916 kumpf 1.1
|
917 kumpf 1.60 return response->cimQualifierDecl;
|
918 kumpf 1.1 }
919
920 void CIMClientRep::setQualifier(
921 const CIMNamespaceName& nameSpace,
|
922 kumpf 1.60 const CIMQualifierDecl& qualifierDeclaration)
|
923 kumpf 1.1 {
|
924 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMSetQualifierRequestMessage(
|
925 kumpf 1.1 String::EMPTY,
926 nameSpace,
927 qualifierDeclaration,
|
928 a.arora 1.31 QueueIdStack()));
|
929 kumpf 1.1
930 Message* message = _doRequest(request, CIM_SET_QUALIFIER_RESPONSE_MESSAGE);
931
932 CIMSetQualifierResponseMessage* response =
933 (CIMSetQualifierResponseMessage*)message;
934
|
935 a.arora 1.31 AutoPtr<CIMSetQualifierResponseMessage> destroyer(response);
|
936 kumpf 1.1 }
937
938 void CIMClientRep::deleteQualifier(
939 const CIMNamespaceName& nameSpace,
|
940 kumpf 1.60 const CIMName& qualifierName)
|
941 kumpf 1.1 {
|
942 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMDeleteQualifierRequestMessage(
|
943 kumpf 1.1 String::EMPTY,
944 nameSpace,
945 qualifierName,
|
946 a.arora 1.31 QueueIdStack()));
|
947 kumpf 1.1
|
948 kumpf 1.60 Message* message =
949 _doRequest(request, CIM_DELETE_QUALIFIER_RESPONSE_MESSAGE);
|
950 kumpf 1.1
951 CIMDeleteQualifierResponseMessage* response =
952 (CIMDeleteQualifierResponseMessage*)message;
953
|
954 a.arora 1.31 AutoPtr<CIMDeleteQualifierResponseMessage> destroyer(response);
|
955 kumpf 1.1 }
956
957 Array<CIMQualifierDecl> CIMClientRep::enumerateQualifiers(
|
958 kumpf 1.60 const CIMNamespaceName& nameSpace)
|
959 kumpf 1.1 {
|
960 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMEnumerateQualifiersRequestMessage(
|
961 kumpf 1.1 String::EMPTY,
962 nameSpace,
|
963 a.arora 1.31 QueueIdStack()));
|
964 kumpf 1.1
|
965 kumpf 1.60 Message* message =
966 _doRequest(request, CIM_ENUMERATE_QUALIFIERS_RESPONSE_MESSAGE);
|
967 kumpf 1.1
968 CIMEnumerateQualifiersResponseMessage* response =
969 (CIMEnumerateQualifiersResponseMessage*)message;
970
|
971 a.arora 1.31 AutoPtr<CIMEnumerateQualifiersResponseMessage> destroyer(response);
|
972 kumpf 1.1
|
973 kumpf 1.60 return response->qualifierDeclarations;
|
974 kumpf 1.1 }
975
976 CIMValue CIMClientRep::invokeMethod(
977 const CIMNamespaceName& nameSpace,
978 const CIMObjectPath& instanceName,
979 const CIMName& methodName,
980 const Array<CIMParamValue>& inParameters,
|
981 kumpf 1.60 Array<CIMParamValue>& outParameters)
|
982 kumpf 1.1 {
983 // ATTN-RK-P2-20020301: Does it make sense to have a nameSpace parameter
984 // when the namespace should already be included in the instanceName?
985 // ATTN-RK-P3-20020301: Do we need to make sure the caller didn't specify
986 // a host name in the instanceName?
987
|
988 david.dillard 1.42 // solved with PEP#139 Stage1 as other CIMOMs contained in the object path
989 // will cause a TypeMisMatchException
|
990 marek 1.12
|
991 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMInvokeMethodRequestMessage(
|
992 kumpf 1.1 String::EMPTY,
993 nameSpace,
994 instanceName,
995 methodName,
996 inParameters,
|
997 a.arora 1.31 QueueIdStack()));
|
998 kumpf 1.1
999 Message* message = _doRequest(request, CIM_INVOKE_METHOD_RESPONSE_MESSAGE);
1000
1001 CIMInvokeMethodResponseMessage* response =
1002 (CIMInvokeMethodResponseMessage*)message;
1003
|
1004 a.arora 1.31 AutoPtr<CIMInvokeMethodResponseMessage> destroyer(response);
|
1005 kumpf 1.1
1006 outParameters = response->outParameters;
1007
|
1008 kumpf 1.60 return response->retValue;
|
1009 kumpf 1.1 }
1010
1011 Message* CIMClientRep::_doRequest(
|
1012 a.arora 1.31 AutoPtr<CIMRequestMessage>& request,
|
1013 kumpf 1.60 const Uint32 expectedResponseMessageType)
|
1014 kumpf 1.1 {
1015 if (!_connected)
1016 {
|
1017 a.arora 1.31 request.reset();
|
1018 kumpf 1.1 throw NotConnectedException();
1019 }
1020
1021 String messageId = XmlWriter::getNextMessageId();
1022 const_cast<String &>(request->messageId) = messageId;
1023
|
1024 kumpf 1.8 _authenticator.setRequestMessage(0);
|
1025 kumpf 1.1
1026 // ATTN-RK-P2-20020416: We should probably clear out the queue first.
1027 PEGASUS_ASSERT(getCount() == 0); // Shouldn't be any messages in our queue
1028
1029 //
|
1030 karl 1.2 // Set HTTP method in request to POST
|
1031 kumpf 1.1 //
|
1032 david.dillard 1.42 //Bug 478/418 - Change this to do post call, not mpost
|
1033 karl 1.2 request->setHttpMethod (HTTP_METHOD__POST);
|
1034 kumpf 1.1
1035 // Set the Accept-Languages and Content-Languages into
1036 // the request message
1037
|
1038 kumpf 1.60 request->operationContext.set(
1039 AcceptLanguageListContainer(requestAcceptLanguages));
1040 request->operationContext.set(
1041 ContentLanguageListContainer(requestContentLanguages));
|
1042 se.gupta 1.22
1043
|
1044 kumpf 1.60 //gathering statistical information about client operation
1045 perfDataStore.reset();
1046 perfDataStore.setOperationType(request->getType());
1047 perfDataStore.setMessageID(request->messageId);
|
1048 w.white 1.35
|
1049 kumpf 1.1 // Sending a new request, so clear out the response Content-Languages
|
1050 kumpf 1.51 responseContentLanguages.clear();
|
1051 kumpf 1.1
|
1052 a.arora 1.32 _requestEncoder->enqueue(request.get());
1053 request.release();
|
1054 kumpf 1.1
1055 Uint64 startMilliseconds = TimeValue::getCurrentTime().toMilliseconds();
1056 Uint64 nowMilliseconds = startMilliseconds;
1057 Uint64 stopMilliseconds = nowMilliseconds + _timeoutMilliseconds;
1058
1059 while (nowMilliseconds < stopMilliseconds)
1060 {
1061 //
1062 // Wait until the timeout expires or an event occurs:
1063 //
|
1064 kumpf 1.34 _monitor->run(Uint32(stopMilliseconds - nowMilliseconds));
|
1065 kumpf 1.1
1066 //
1067 // Check to see if incoming queue has a message
1068 //
1069
1070 Message* response = dequeue();
1071
1072 if (response)
1073 {
1074 // Shouldn't be any more messages in our queue
1075 PEGASUS_ASSERT(getCount() == 0);
1076
1077 //
|
1078 j.alex 1.47 // Reconnect to reset the connection
1079 // if Server response contained a Connection: Close Header
1080 //
|
1081 kumpf 1.60 if (response->getCloseConnect() == true)
1082 {
|
1083 j.alex 1.47 _reconnect();
|
1084 j.alex 1.48 response->setCloseConnect(false);
|
1085 j.alex 1.47 }
1086
1087 //
|
1088 kumpf 1.4 // Future: If M-POST is used and HTTP response is 501 Not
1089 // Implemented or 510 Not Extended, retry with POST method
|
1090 kumpf 1.1 //
1091
1092 if (response->getType() == CLIENT_EXCEPTION_MESSAGE)
1093 {
|
1094 j.alex 1.47
|
1095 kumpf 1.1 Exception* clientException =
1096 ((ClientExceptionMessage*)response)->clientException;
1097 delete response;
|
1098 kumpf 1.4
|
1099 a.arora 1.31 AutoPtr<Exception> d(clientException);
|
1100 kumpf 1.4
|
1101 david.dillard 1.42 // Make the ContentLanguage of the exception available through
1102 // the CIMClient API (its also available in the exception).
|
1103 kumpf 1.60 responseContentLanguages =
1104 clientException->getContentLanguages();
|
1105 chuck 1.27
|
1106 kumpf 1.4 //
1107 // Determine and throw the specific class of client exception
1108 //
1109
1110 CIMClientMalformedHTTPException* malformedHTTPException =
1111 dynamic_cast<CIMClientMalformedHTTPException*>(
1112 clientException);
1113 if (malformedHTTPException)
1114 {
1115 throw *malformedHTTPException;
1116 }
1117
1118 CIMClientHTTPErrorException* httpErrorException =
1119 dynamic_cast<CIMClientHTTPErrorException*>(
1120 clientException);
1121 if (httpErrorException)
1122 {
1123 throw *httpErrorException;
1124 }
1125
1126 CIMClientXmlException* xmlException =
1127 kumpf 1.4 dynamic_cast<CIMClientXmlException*>(clientException);
1128 if (xmlException)
1129 {
1130 throw *xmlException;
1131 }
1132
1133 CIMClientResponseException* responseException =
1134 dynamic_cast<CIMClientResponseException*>(clientException);
1135 if (responseException)
1136 {
1137 throw *responseException;
1138 }
1139
|
1140 david.dillard 1.42 CIMException* cimException =
|
1141 brian.campbell 1.25 dynamic_cast<CIMException*>(clientException);
1142 if (cimException)
1143 {
1144 throw *cimException;
1145 }
1146
|
1147 kumpf 1.1 throw *clientException;
1148 }
1149 else if (response->getType() == expectedResponseMessageType)
1150 {
1151 CIMResponseMessage* cimResponse = (CIMResponseMessage*)response;
1152
1153 if (cimResponse->messageId != messageId)
1154 {
1155 MessageLoaderParms mlParms(
1156 "Client.CIMClient.MISMATCHED_RESPONSE",
1157 "Mismatched response message ID: Got \"$0\", "
1158 "expected \"$1\".",
1159 cimResponse->messageId, messageId);
1160 String mlString(MessageLoader::getMessage(mlParms));
1161
1162 CIMClientResponseException responseException(mlString);
1163
1164 delete response;
1165 throw responseException;
1166 }
1167
|
1168 kumpf 1.60 // Get the Content-Languages from the response's
1169 // operationContext and make available through the
1170 // CIMClient API
1171 responseContentLanguages = ((ContentLanguageListContainer)
1172 cimResponse->operationContext.get(
1173 ContentLanguageListContainer::NAME)).getLanguages();
|
1174 kumpf 1.1
1175 if (cimResponse->cimException.getCode() != CIM_ERR_SUCCESS)
1176 {
|
1177 karl 1.59 CIMException cimException(cimResponse->cimException);
1178
|
1179 david.dillard 1.42 cimException.setContentLanguages(responseContentLanguages);
|
1180 kumpf 1.1 delete response;
1181 throw cimException;
1182 }
|
1183 w.white 1.37
|
1184 kumpf 1.60 // if execution gets here everytihng is working correctly
1185 // and a proper response was generated and received.
|
1186 w.white 1.37
|
1187 kumpf 1.60 // Check that client side statistics are valid before
1188 // handing them to the client application via a call back
1189 Boolean re_check = perfDataStore.checkMessageIDandType(
1190 cimResponse->messageId,
1191 cimResponse->getType());
1192
1193 if (re_check &&
1194 !perfDataStore.getStatError() &&
1195 perfDataStore.isClassRegistered())
|
1196 david.dillard 1.42 {
|
1197 kumpf 1.60 // If callback method throws an exception it will be seen
1198 // by the client no try/catch block is used here
1199 // intentionaly - because exceptions come from the client
1200 // application so client app. should handle them
1201 ClientOpPerformanceData item =
1202 perfDataStore.createPerfDataStruct();
1203 perfDataStore.handler_prt->handleClientOpPerformanceData(
1204 item);
|
1205 david.dillard 1.42
|
1206 w.white 1.37 }//end of if statmet that call the callback method
|
1207 kumpf 1.1 return response;
1208 }
|
1209 j.alex 1.48 else if (dynamic_cast<CIMRequestMessage*>(response) != 0)
1210 {
1211 // Respond to an authentication challenge
1212 _requestEncoder->enqueue(response);
1213 nowMilliseconds = TimeValue::getCurrentTime().toMilliseconds();
1214 stopMilliseconds = nowMilliseconds + _timeoutMilliseconds;
1215 continue;
1216 }
|
1217 kumpf 1.1 else
1218 {
1219 MessageLoaderParms mlParms(
|
1220 kumpf 1.60 "Client.CIMOperationResponseDecoder."
1221 "MISMATCHED_RESPONSE_TYPE",
|
1222 j.alex 1.48 "Mismatched response message type.");
|
1223 kumpf 1.1 String mlString(MessageLoader::getMessage(mlParms));
1224
1225 CIMClientResponseException responseException(mlString);
1226
1227 delete response;
1228 throw responseException;
1229 }
1230 }
1231
1232 nowMilliseconds = TimeValue::getCurrentTime().toMilliseconds();
|
1233 mike 1.58 Threads::yield();
|
1234 kumpf 1.1 }
1235
1236 //
1237 // Reconnect to reset the connection (disregard late response)
1238 //
1239 try
1240 {
1241 _reconnect();
1242 }
1243 catch (...)
1244 {
1245 }
1246
1247 //
1248 // Throw timed out exception:
1249 //
1250 throw ConnectionTimeoutException();
1251 }
1252
1253 String CIMClientRep::_getLocalHostName()
1254 {
|
1255 joyce.j 1.41 static String hostname;
1256
1257 if (!hostname.size())
1258 {
1259 hostname.assign(System::getHostName());
1260 }
|
1261 kumpf 1.1
1262 return hostname;
|
1263 marek 1.12 }
1264
|
1265 kumpf 1.60 void CIMClientRep::registerClientOpPerformanceDataHandler(
1266 ClientOpPerformanceDataHandler& handler)
|
1267 david.dillard 1.42 {
|
1268 kumpf 1.60 perfDataStore.handler_prt = &handler;
1269 perfDataStore.setClassRegistered(true);
|
1270 w.white 1.37 }
|
1271 david.dillard 1.42
|
1272 w.white 1.37 void CIMClientRep::deregisterClientOpPerformanceDataHandler()
1273 {
|
1274 a.dunfey 1.53 perfDataStore.handler_prt = NULL;
1275 perfDataStore.setClassRegistered(false);
|
1276 w.white 1.37 }
1277
|
1278 kumpf 1.1 PEGASUS_NAMESPACE_END
|