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