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