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