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