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