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 #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.53
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 j.alex 1.54.10.1
336 // Temporary ..need to fix the DISABLE SOCKET
337 #ifdef PEGASUS_OS_TYPE_WINDOWS
338 _connectSSLContext.reset();
339 _connectHost = String::EMPTY;
340 _connectPortNumber = 0;
341 _connect();
|
342 w.white 1.54.10.3 /*#endif WW //this needs to change when we figure out PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
|
343 w.white 1.54.10.2 /*
|
344 h.sterling 1.43 #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
|
345 a.arora 1.31 _connectSSLContext.reset();
|
346 kumpf 1.30 _connectHost = String::EMPTY;
347 _connectPortNumber = 0;
|
348 w.white 1.54.10.2 _connect(); */
|
349 j.alex 1.54.10.1
|
350 kumpf 1.1 #else
351
352 try
353 {
354 //
355 // Look up the WBEM HTTP port number for the local system
356 //
357 _connectPortNumber = System::lookupPort (WBEM_HTTP_SERVICE_NAME,
358 WBEM_DEFAULT_HTTP_PORT);
359
360 //
361 // Assign host
362 //
363 _connectHost.assign(_getLocalHostName());
364
|
365 a.arora 1.31 _connectSSLContext.reset();
|
366 kumpf 1.1
|
367 a.arora 1.32 _connect();
|
368 kumpf 1.1 }
|
369 david.dillard 1.42 catch(const CannotConnectException &)
|
370 kumpf 1.1 {
371 //
372 // Look up the WBEM HTTPS port number for the local system
373 //
374 _connectPortNumber = System::lookupPort (WBEM_HTTPS_SERVICE_NAME,
375 WBEM_DEFAULT_HTTPS_PORT);
376
377 //
378 // Assign host
379 //
380 _connectHost.assign(_getLocalHostName());
381
382 //
383 // Create SSLContext
384 //
385 #ifdef PEGASUS_OS_OS400
386 #pragma convert(37)
387 const char* env = getenv("PEGASUS_HOME");
388 #pragma convert(0)
389 char pegasusHome[256] = {0};
390 if (env != NULL && strlen(env) < 256)
391 kumpf 1.1 {
392 strcpy(pegasusHome, env);
393 EtoA(pegasusHome);
394 }
395 #else
396 const char* pegasusHome = getenv("PEGASUS_HOME");
397 #endif
398
399 String randFile = String::EMPTY;
400
401 #ifdef PEGASUS_SSL_RANDOMFILE
402 randFile = FileSystem::getAbsolutePath(
403 pegasusHome, PEGASUS_SSLCLIENT_RANDOMFILE);
404 #endif
405
406 try
407 {
|
408 a.arora 1.32 _connectSSLContext.reset(
|
409 kumpf 1.28 new SSLContext(String::EMPTY, NULL, randFile));
|
410 kumpf 1.1 }
|
411 david.dillard 1.44 catch (const SSLException &)
|
412 kumpf 1.1 {
|
413 david.dillard 1.44 throw;
|
414 kumpf 1.1 }
415
|
416 a.arora 1.32 _connect();
|
417 kumpf 1.1 }
418 #endif
419 }
420
421
422 void CIMClientRep::disconnect()
423 {
|
424 kumpf 1.8 _disconnect();
425 _authenticator.clear();
|
426 kumpf 1.28 _connectSSLContext.reset();
|
427 kumpf 1.8 }
|
428 kumpf 1.1
|
429 david.dillard 1.42 Boolean CIMClientRep::isConnected() const throw()
|
430 marek 1.21 {
|
431 david.dillard 1.42 return _connected;
|
432 marek 1.21 }
433
434
|
435 kumpf 1.1 // l10n start
|
436 kumpf 1.52 AcceptLanguageList CIMClientRep::getRequestAcceptLanguages() const
|
437 kumpf 1.1 {
438 return requestAcceptLanguages;
439 }
440
|
441 kumpf 1.52 ContentLanguageList CIMClientRep::getRequestContentLanguages() const
|
442 kumpf 1.1 {
443 return requestContentLanguages;
444 }
445
|
446 kumpf 1.52 ContentLanguageList CIMClientRep::getResponseContentLanguages() const
|
447 kumpf 1.1 {
448 return responseContentLanguages;
449 }
450
|
451 kumpf 1.52 void CIMClientRep::setRequestAcceptLanguages(const AcceptLanguageList& langs)
|
452 kumpf 1.1 {
453 requestAcceptLanguages = langs;
454 }
455
|
456 kumpf 1.52 void CIMClientRep::setRequestContentLanguages(const ContentLanguageList& langs)
|
457 kumpf 1.1 {
458 requestContentLanguages = langs;
459 }
460
461 void CIMClientRep::setRequestDefaultLanguages()
462 {
|
463 kumpf 1.51 requestAcceptLanguages = LanguageParser::getDefaultAcceptLanguages();
|
464 kumpf 1.1 }
465
466 // l10n end
467
468 CIMClass CIMClientRep::getClass(
469 const CIMNamespaceName& nameSpace,
470 const CIMName& className,
471 Boolean localOnly,
472 Boolean includeQualifiers,
473 Boolean includeClassOrigin,
474 const CIMPropertyList& propertyList
475 )
476 {
|
477 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMGetClassRequestMessage(
|
478 kumpf 1.1 String::EMPTY,
479 nameSpace,
480 className,
481 localOnly,
482 includeQualifiers,
483 includeClassOrigin,
484 propertyList,
|
485 a.arora 1.31 QueueIdStack()));
|
486 kumpf 1.1
487 Message* message = _doRequest(request, CIM_GET_CLASS_RESPONSE_MESSAGE);
488
489 CIMGetClassResponseMessage* response =
490 (CIMGetClassResponseMessage*)message;
491
|
492 a.arora 1.31 AutoPtr<CIMGetClassResponseMessage> destroyer(response);
|
493 kumpf 1.1
494 return(response->cimClass);
495 }
496
497 CIMInstance CIMClientRep::getInstance(
498 const CIMNamespaceName& nameSpace,
499 const CIMObjectPath& instanceName,
500 Boolean localOnly,
501 Boolean includeQualifiers,
502 Boolean includeClassOrigin,
503 const CIMPropertyList& propertyList
504 )
505 {
|
506 david.dillard 1.42 compareObjectPathtoCurrentConnection(instanceName);
|
507 marek 1.12
|
508 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMGetInstanceRequestMessage(
|
509 kumpf 1.1 String::EMPTY,
510 nameSpace,
511 instanceName,
512 localOnly,
513 includeQualifiers,
514 includeClassOrigin,
515 propertyList,
|
516 a.arora 1.31 QueueIdStack()));
|
517 kumpf 1.1
518 Message* message = _doRequest(request, CIM_GET_INSTANCE_RESPONSE_MESSAGE);
519
520 CIMGetInstanceResponseMessage* response =
521 (CIMGetInstanceResponseMessage*)message;
522
|
523 a.arora 1.31 AutoPtr<CIMGetInstanceResponseMessage> destroyer(response);
|
524 kumpf 1.1
525 return(response->cimInstance);
526 }
527
528 void CIMClientRep::deleteClass(
529 const CIMNamespaceName& nameSpace,
530 const CIMName& className
531 )
532 {
|
533 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMDeleteClassRequestMessage(
|
534 kumpf 1.1 String::EMPTY,
535 nameSpace,
536 className,
|
537 a.arora 1.31 QueueIdStack()));
|
538 kumpf 1.1
539 Message* message = _doRequest(request, CIM_DELETE_CLASS_RESPONSE_MESSAGE);
540
541 CIMDeleteClassResponseMessage* response =
542 (CIMDeleteClassResponseMessage*)message;
543
|
544 a.arora 1.31 AutoPtr<CIMDeleteClassResponseMessage> destroyer(response);
|
545 kumpf 1.1 }
546
547 void CIMClientRep::deleteInstance(
548 const CIMNamespaceName& nameSpace,
549 const CIMObjectPath& instanceName
550 )
551 {
|
552 david.dillard 1.42 compareObjectPathtoCurrentConnection(instanceName);
|
553 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMDeleteInstanceRequestMessage(
|
554 kumpf 1.1 String::EMPTY,
555 nameSpace,
556 instanceName,
|
557 a.arora 1.31 QueueIdStack()));
|
558 kumpf 1.1
559 Message* message = _doRequest(request, CIM_DELETE_INSTANCE_RESPONSE_MESSAGE);
560
561 CIMDeleteInstanceResponseMessage* response =
562 (CIMDeleteInstanceResponseMessage*)message;
563
|
564 a.arora 1.31 AutoPtr<CIMDeleteInstanceResponseMessage> destroyer(response);
|
565 kumpf 1.1 }
566
567 void CIMClientRep::createClass(
568 const CIMNamespaceName& nameSpace,
569 const CIMClass& newClass
570 )
571 {
|
572 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMCreateClassRequestMessage(
|
573 kumpf 1.1 String::EMPTY,
574 nameSpace,
575 newClass,
|
576 a.arora 1.31 QueueIdStack()));
|
577 kumpf 1.1
578 Message* message = _doRequest(request, CIM_CREATE_CLASS_RESPONSE_MESSAGE);
579
580 CIMCreateClassResponseMessage* response =
581 (CIMCreateClassResponseMessage*)message;
582
|
583 a.arora 1.31 AutoPtr<CIMCreateClassResponseMessage> destroyer(response);
|
584 kumpf 1.1 }
585
586 CIMObjectPath CIMClientRep::createInstance(
587 const CIMNamespaceName& nameSpace,
588 const CIMInstance& newInstance
589 )
590 {
|
591 david.dillard 1.42 compareObjectPathtoCurrentConnection(newInstance.getPath());
|
592 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMCreateInstanceRequestMessage(
|
593 kumpf 1.1 String::EMPTY,
594 nameSpace,
595 newInstance,
|
596 a.arora 1.31 QueueIdStack()));
|
597 kumpf 1.1
598 Message* message = _doRequest(request, CIM_CREATE_INSTANCE_RESPONSE_MESSAGE);
599
600 CIMCreateInstanceResponseMessage* response =
601 (CIMCreateInstanceResponseMessage*)message;
602
|
603 a.arora 1.31 AutoPtr<CIMCreateInstanceResponseMessage> destroyer(response);
|
604 kumpf 1.1
605 return(response->instanceName);
606 }
607
608 void CIMClientRep::modifyClass(
609 const CIMNamespaceName& nameSpace,
610 const CIMClass& modifiedClass
611 )
612 {
|
613 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMModifyClassRequestMessage(
|
614 kumpf 1.1 String::EMPTY,
615 nameSpace,
616 modifiedClass,
|
617 a.arora 1.31 QueueIdStack()));
|
618 kumpf 1.1
619 Message* message = _doRequest(request, CIM_MODIFY_CLASS_RESPONSE_MESSAGE);
620
621 CIMModifyClassResponseMessage* response =
622 (CIMModifyClassResponseMessage*)message;
623
|
624 a.arora 1.31 AutoPtr<CIMModifyClassResponseMessage> destroyer(response);
|
625 kumpf 1.1 }
626
627 void CIMClientRep::modifyInstance(
628 const CIMNamespaceName& nameSpace,
629 const CIMInstance& modifiedInstance,
630 Boolean includeQualifiers,
631 const CIMPropertyList& propertyList
632 )
633 {
|
634 david.dillard 1.42 compareObjectPathtoCurrentConnection(modifiedInstance.getPath());
|
635 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMModifyInstanceRequestMessage(
|
636 kumpf 1.1 String::EMPTY,
637 nameSpace,
638 modifiedInstance,
639 includeQualifiers,
640 propertyList,
|
641 a.arora 1.31 QueueIdStack()));
|
642 kumpf 1.1
643 Message* message = _doRequest(request, CIM_MODIFY_INSTANCE_RESPONSE_MESSAGE);
644
645 CIMModifyInstanceResponseMessage* response =
646 (CIMModifyInstanceResponseMessage*)message;
647
|
648 a.arora 1.31 AutoPtr<CIMModifyInstanceResponseMessage> destroyer(response);
|
649 kumpf 1.1 }
650
651 Array<CIMClass> CIMClientRep::enumerateClasses(
652 const CIMNamespaceName& nameSpace,
653 const CIMName& className,
654 Boolean deepInheritance,
655 Boolean localOnly,
656 Boolean includeQualifiers,
657 Boolean includeClassOrigin
658 )
659 {
|
660 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMEnumerateClassesRequestMessage(
|
661 kumpf 1.1 String::EMPTY,
662 nameSpace,
663 className,
664 deepInheritance,
665 localOnly,
666 includeQualifiers,
667 includeClassOrigin,
|
668 a.arora 1.31 QueueIdStack()));
|
669 kumpf 1.1
670 Message* message = _doRequest(request, CIM_ENUMERATE_CLASSES_RESPONSE_MESSAGE);
671
672 CIMEnumerateClassesResponseMessage* response =
673 (CIMEnumerateClassesResponseMessage*)message;
674
|
675 a.arora 1.31 AutoPtr<CIMEnumerateClassesResponseMessage> destroyer(response);
|
676 kumpf 1.1
677 return(response->cimClasses);
678 }
679
680 Array<CIMName> CIMClientRep::enumerateClassNames(
681 const CIMNamespaceName& nameSpace,
682 const CIMName& className,
683 Boolean deepInheritance
684 )
685 {
|
686 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMEnumerateClassNamesRequestMessage(
|
687 kumpf 1.1 String::EMPTY,
688 nameSpace,
689 className,
690 deepInheritance,
|
691 a.arora 1.31 QueueIdStack()));
|
692 kumpf 1.1
693 Message* message = _doRequest(request, CIM_ENUMERATE_CLASS_NAMES_RESPONSE_MESSAGE);
694
695 CIMEnumerateClassNamesResponseMessage* response =
696 (CIMEnumerateClassNamesResponseMessage*)message;
697
|
698 a.arora 1.31 AutoPtr<CIMEnumerateClassNamesResponseMessage> destroyer(response);
|
699 kumpf 1.1
700 // Temporary code until internal structures use CIMName instead of String
701 Array<CIMName> classNameArray;
702 classNameArray.reserveCapacity(response->classNames.size());
703 for (Uint32 i=0; i<response->classNames.size(); i++)
704 {
705 classNameArray.append(response->classNames[i]);
706 }
707 return(classNameArray);
708 }
709
710 Array<CIMInstance> CIMClientRep::enumerateInstances(
711 const CIMNamespaceName& nameSpace,
712 const CIMName& className,
713 Boolean deepInheritance,
714 Boolean localOnly,
715 Boolean includeQualifiers,
716 Boolean includeClassOrigin,
717 const CIMPropertyList& propertyList
718 )
719 {
|
720 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMEnumerateInstancesRequestMessage(
|
721 kumpf 1.1 String::EMPTY,
722 nameSpace,
723 className,
724 deepInheritance,
725 localOnly,
726 includeQualifiers,
727 includeClassOrigin,
728 propertyList,
|
729 a.arora 1.31 QueueIdStack()));
|
730 kumpf 1.1
731 Message* message = _doRequest(request, CIM_ENUMERATE_INSTANCES_RESPONSE_MESSAGE);
732
733 CIMEnumerateInstancesResponseMessage* response =
734 (CIMEnumerateInstancesResponseMessage*)message;
735
|
736 a.arora 1.31 AutoPtr<CIMEnumerateInstancesResponseMessage> destroyer(response);
|
737 kumpf 1.1
738 return(response->cimNamedInstances);
739 }
740
741 Array<CIMObjectPath> CIMClientRep::enumerateInstanceNames(
742 const CIMNamespaceName& nameSpace,
743 const CIMName& className
744 )
745 {
|
746 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMEnumerateInstanceNamesRequestMessage(
|
747 kumpf 1.1 String::EMPTY,
748 nameSpace,
749 className,
|
750 a.arora 1.31 QueueIdStack()));
|
751 kumpf 1.1
752 Message* message = _doRequest(request, CIM_ENUMERATE_INSTANCE_NAMES_RESPONSE_MESSAGE);
753
754 CIMEnumerateInstanceNamesResponseMessage* response =
755 (CIMEnumerateInstanceNamesResponseMessage*)message;
756
|
757 a.arora 1.31 AutoPtr<CIMEnumerateInstanceNamesResponseMessage> destroyer(response);
|
758 kumpf 1.1
759 return(response->instanceNames);
760 }
761
762 Array<CIMObject> CIMClientRep::execQuery(
763 const CIMNamespaceName& nameSpace,
764 const String& queryLanguage,
765 const String& query
766 )
767 {
|
768 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMExecQueryRequestMessage(
|
769 kumpf 1.1 String::EMPTY,
770 nameSpace,
771 queryLanguage,
772 query,
|
773 a.arora 1.31 QueueIdStack()));
|
774 kumpf 1.1
775 Message* message = _doRequest(request, CIM_EXEC_QUERY_RESPONSE_MESSAGE);
776
777 CIMExecQueryResponseMessage* response =
778 (CIMExecQueryResponseMessage*)message;
779
|
780 a.arora 1.31 AutoPtr<CIMExecQueryResponseMessage> destroyer(response);
|
781 kumpf 1.1
782 return(response->cimObjects);
783 }
784
785 Array<CIMObject> CIMClientRep::associators(
786 const CIMNamespaceName& nameSpace,
787 const CIMObjectPath& objectName,
788 const CIMName& assocClass,
789 const CIMName& resultClass,
790 const String& role,
791 const String& resultRole,
792 Boolean includeQualifiers,
793 Boolean includeClassOrigin,
794 const CIMPropertyList& propertyList
795 )
796 {
|
797 david.dillard 1.42 compareObjectPathtoCurrentConnection(objectName);
|
798 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMAssociatorsRequestMessage(
|
799 kumpf 1.1 String::EMPTY,
800 nameSpace,
801 objectName,
802 assocClass,
803 resultClass,
804 role,
805 resultRole,
806 includeQualifiers,
807 includeClassOrigin,
808 propertyList,
|
809 a.arora 1.31 QueueIdStack()));
|
810 kumpf 1.1
811 Message* message = _doRequest(request, CIM_ASSOCIATORS_RESPONSE_MESSAGE);
812
813 CIMAssociatorsResponseMessage* response =
814 (CIMAssociatorsResponseMessage*)message;
815
|
816 a.arora 1.31 AutoPtr<CIMAssociatorsResponseMessage> destroyer(response);
|
817 kumpf 1.1
818 return(response->cimObjects);
819 }
820
821 Array<CIMObjectPath> CIMClientRep::associatorNames(
822 const CIMNamespaceName& nameSpace,
823 const CIMObjectPath& objectName,
824 const CIMName& assocClass,
825 const CIMName& resultClass,
826 const String& role,
827 const String& resultRole
828 )
829 {
|
830 david.dillard 1.42 compareObjectPathtoCurrentConnection(objectName);
|
831 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMAssociatorNamesRequestMessage(
|
832 kumpf 1.1 String::EMPTY,
833 nameSpace,
834 objectName,
835 assocClass,
836 resultClass,
837 role,
838 resultRole,
|
839 a.arora 1.31 QueueIdStack()));
|
840 kumpf 1.1
841 Message* message = _doRequest(request, CIM_ASSOCIATOR_NAMES_RESPONSE_MESSAGE);
842
843 CIMAssociatorNamesResponseMessage* response =
844 (CIMAssociatorNamesResponseMessage*)message;
845
|
846 a.arora 1.31 AutoPtr<CIMAssociatorNamesResponseMessage> destroyer(response);
|
847 kumpf 1.1
848 return(response->objectNames);
849 }
850
851 Array<CIMObject> CIMClientRep::references(
852 const CIMNamespaceName& nameSpace,
853 const CIMObjectPath& objectName,
854 const CIMName& resultClass,
855 const String& role,
856 Boolean includeQualifiers,
857 Boolean includeClassOrigin,
858 const CIMPropertyList& propertyList
859 )
860 {
|
861 david.dillard 1.42 compareObjectPathtoCurrentConnection(objectName);
|
862 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMReferencesRequestMessage(
|
863 kumpf 1.1 String::EMPTY,
864 nameSpace,
865 objectName,
866 resultClass,
867 role,
868 includeQualifiers,
869 includeClassOrigin,
870 propertyList,
|
871 a.arora 1.31 QueueIdStack()));
|
872 kumpf 1.1
873 Message* message = _doRequest(request, CIM_REFERENCES_RESPONSE_MESSAGE);
874
875 CIMReferencesResponseMessage* response =
876 (CIMReferencesResponseMessage*)message;
877
|
878 a.arora 1.31 AutoPtr<CIMReferencesResponseMessage> destroyer(response);
|
879 kumpf 1.1
880 return(response->cimObjects);
881 }
882
883 Array<CIMObjectPath> CIMClientRep::referenceNames(
884 const CIMNamespaceName& nameSpace,
885 const CIMObjectPath& objectName,
886 const CIMName& resultClass,
887 const String& role
888 )
889 {
|
890 david.dillard 1.42 compareObjectPathtoCurrentConnection(objectName);
|
891 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMReferenceNamesRequestMessage(
|
892 kumpf 1.1 String::EMPTY,
893 nameSpace,
894 objectName,
895 resultClass,
896 role,
|
897 a.arora 1.31 QueueIdStack()));
|
898 kumpf 1.1
899 Message* message = _doRequest(request, CIM_REFERENCE_NAMES_RESPONSE_MESSAGE);
900
901 CIMReferenceNamesResponseMessage* response =
902 (CIMReferenceNamesResponseMessage*)message;
903
|
904 a.arora 1.31 AutoPtr<CIMReferenceNamesResponseMessage> destroyer(response);
|
905 kumpf 1.1
906 return(response->objectNames);
907 }
908
909 CIMValue CIMClientRep::getProperty(
910 const CIMNamespaceName& nameSpace,
911 const CIMObjectPath& instanceName,
912 const CIMName& propertyName
913 )
914 {
|
915 david.dillard 1.42 compareObjectPathtoCurrentConnection(instanceName);
|
916 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMGetPropertyRequestMessage(
|
917 kumpf 1.1 String::EMPTY,
918 nameSpace,
919 instanceName,
920 propertyName,
|
921 a.arora 1.31 QueueIdStack()));
|
922 kumpf 1.1
923 Message* message = _doRequest(request, CIM_GET_PROPERTY_RESPONSE_MESSAGE);
924
925 CIMGetPropertyResponseMessage* response =
926 (CIMGetPropertyResponseMessage*)message;
927
|
928 a.arora 1.31 AutoPtr<CIMGetPropertyResponseMessage> destroyer(response);
|
929 kumpf 1.1
930 return(response->value);
931 }
932
933 void CIMClientRep::setProperty(
934 const CIMNamespaceName& nameSpace,
935 const CIMObjectPath& instanceName,
936 const CIMName& propertyName,
937 const CIMValue& newValue
938 )
939 {
|
940 david.dillard 1.42 compareObjectPathtoCurrentConnection(instanceName);
|
941 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMSetPropertyRequestMessage(
|
942 kumpf 1.1 String::EMPTY,
943 nameSpace,
944 instanceName,
945 propertyName,
946 newValue,
|
947 a.arora 1.31 QueueIdStack()));
|
948 kumpf 1.1
949 Message* message = _doRequest(request, CIM_SET_PROPERTY_RESPONSE_MESSAGE);
950
951 CIMSetPropertyResponseMessage* response =
952 (CIMSetPropertyResponseMessage*)message;
953
|
954 a.arora 1.31 AutoPtr<CIMSetPropertyResponseMessage> destroyer(response);
|
955 kumpf 1.1 }
956
957 CIMQualifierDecl CIMClientRep::getQualifier(
958 const CIMNamespaceName& nameSpace,
959 const CIMName& qualifierName
960 )
961 {
|
962 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMGetQualifierRequestMessage(
|
963 kumpf 1.1 String::EMPTY,
964 nameSpace,
965 qualifierName,
|
966 a.arora 1.31 QueueIdStack()));
|
967 kumpf 1.1
968 Message* message = _doRequest(request, CIM_GET_QUALIFIER_RESPONSE_MESSAGE);
969
970 CIMGetQualifierResponseMessage* response =
971 (CIMGetQualifierResponseMessage*)message;
972
|
973 a.arora 1.31 AutoPtr<CIMGetQualifierResponseMessage> destroyer(response);
|
974 kumpf 1.1
975 return(response->cimQualifierDecl);
976 }
977
978 void CIMClientRep::setQualifier(
979 const CIMNamespaceName& nameSpace,
980 const CIMQualifierDecl& qualifierDeclaration
981 )
982 {
|
983 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMSetQualifierRequestMessage(
|
984 kumpf 1.1 String::EMPTY,
985 nameSpace,
986 qualifierDeclaration,
|
987 a.arora 1.31 QueueIdStack()));
|
988 kumpf 1.1
989 Message* message = _doRequest(request, CIM_SET_QUALIFIER_RESPONSE_MESSAGE);
990
991 CIMSetQualifierResponseMessage* response =
992 (CIMSetQualifierResponseMessage*)message;
993
|
994 a.arora 1.31 AutoPtr<CIMSetQualifierResponseMessage> destroyer(response);
|
995 kumpf 1.1 }
996
997 void CIMClientRep::deleteQualifier(
998 const CIMNamespaceName& nameSpace,
999 const CIMName& qualifierName
1000 )
1001 {
|
1002 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMDeleteQualifierRequestMessage(
|
1003 kumpf 1.1 String::EMPTY,
1004 nameSpace,
1005 qualifierName,
|
1006 a.arora 1.31 QueueIdStack()));
|
1007 kumpf 1.1
1008 Message* message = _doRequest(request, CIM_DELETE_QUALIFIER_RESPONSE_MESSAGE);
1009
1010 CIMDeleteQualifierResponseMessage* response =
1011 (CIMDeleteQualifierResponseMessage*)message;
1012
|
1013 a.arora 1.31 AutoPtr<CIMDeleteQualifierResponseMessage> destroyer(response);
|
1014 kumpf 1.1 }
1015
1016 Array<CIMQualifierDecl> CIMClientRep::enumerateQualifiers(
1017 const CIMNamespaceName& nameSpace
1018 )
1019 {
|
1020 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMEnumerateQualifiersRequestMessage(
|
1021 kumpf 1.1 String::EMPTY,
1022 nameSpace,
|
1023 a.arora 1.31 QueueIdStack()));
|
1024 kumpf 1.1
1025 Message* message = _doRequest(request, CIM_ENUMERATE_QUALIFIERS_RESPONSE_MESSAGE);
1026
1027 CIMEnumerateQualifiersResponseMessage* response =
1028 (CIMEnumerateQualifiersResponseMessage*)message;
1029
|
1030 a.arora 1.31 AutoPtr<CIMEnumerateQualifiersResponseMessage> destroyer(response);
|
1031 kumpf 1.1
1032 return(response->qualifierDeclarations);
1033 }
1034
1035 CIMValue CIMClientRep::invokeMethod(
1036 const CIMNamespaceName& nameSpace,
1037 const CIMObjectPath& instanceName,
1038 const CIMName& methodName,
1039 const Array<CIMParamValue>& inParameters,
1040 Array<CIMParamValue>& outParameters
1041 )
1042 {
1043 // ATTN-RK-P2-20020301: Does it make sense to have a nameSpace parameter
1044 // when the namespace should already be included in the instanceName?
1045 // ATTN-RK-P3-20020301: Do we need to make sure the caller didn't specify
1046 // a host name in the instanceName?
1047
|
1048 david.dillard 1.42 // solved with PEP#139 Stage1 as other CIMOMs contained in the object path
1049 // will cause a TypeMisMatchException
|
1050 marek 1.12
|
1051 david.dillard 1.42 compareObjectPathtoCurrentConnection(instanceName);
|
1052 a.arora 1.31 AutoPtr<CIMRequestMessage> request(new CIMInvokeMethodRequestMessage(
|
1053 kumpf 1.1 String::EMPTY,
1054 nameSpace,
1055 instanceName,
1056 methodName,
1057 inParameters,
|
1058 a.arora 1.31 QueueIdStack()));
|
1059 kumpf 1.1
1060 Message* message = _doRequest(request, CIM_INVOKE_METHOD_RESPONSE_MESSAGE);
1061
1062 CIMInvokeMethodResponseMessage* response =
1063 (CIMInvokeMethodResponseMessage*)message;
1064
|
1065 a.arora 1.31 AutoPtr<CIMInvokeMethodResponseMessage> destroyer(response);
|
1066 kumpf 1.1
1067 outParameters = response->outParameters;
1068
1069 return(response->retValue);
1070 }
1071
1072 Message* CIMClientRep::_doRequest(
|
1073 a.arora 1.31 AutoPtr<CIMRequestMessage>& request,
|
1074 kumpf 1.1 const Uint32 expectedResponseMessageType
1075 )
1076 {
1077 if (!_connected)
1078 {
|
1079 a.arora 1.31 request.reset();
|
1080 kumpf 1.1 throw NotConnectedException();
1081 }
1082
1083 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 Message* response = dequeue();
1132
1133 if (response)
1134 {
1135 // Shouldn't be any more messages in our queue
1136 PEGASUS_ASSERT(getCount() == 0);
1137
1138 //
|
1139 j.alex 1.47 // Reconnect to reset the connection
1140 // if Server response contained a Connection: Close Header
1141 //
|
1142 j.alex 1.48 if (response->getCloseConnect() == true){
|
1143 j.alex 1.47 _reconnect();
|
1144 j.alex 1.48 response->setCloseConnect(false);
|
1145 j.alex 1.47 }
1146
1147 //
|
1148 kumpf 1.4 // Future: If M-POST is used and HTTP response is 501 Not
1149 // Implemented or 510 Not Extended, retry with POST method
|
1150 kumpf 1.1 //
1151
1152 if (response->getType() == CLIENT_EXCEPTION_MESSAGE)
1153 {
|
1154 j.alex 1.47
|
1155 kumpf 1.1 Exception* clientException =
1156 ((ClientExceptionMessage*)response)->clientException;
1157 delete response;
|
1158 kumpf 1.4
|
1159 a.arora 1.31 AutoPtr<Exception> d(clientException);
|
1160 kumpf 1.4
|
1161 david.dillard 1.42 // Make the ContentLanguage of the exception available through
1162 // the CIMClient API (its also available in the exception).
1163 responseContentLanguages = clientException->getContentLanguages();
|
1164 chuck 1.27
|
1165 kumpf 1.4 //
1166 // Determine and throw the specific class of client exception
1167 //
1168
1169 CIMClientMalformedHTTPException* malformedHTTPException =
1170 dynamic_cast<CIMClientMalformedHTTPException*>(
1171 clientException);
1172 if (malformedHTTPException)
1173 {
1174 throw *malformedHTTPException;
1175 }
1176
1177 CIMClientHTTPErrorException* httpErrorException =
1178 dynamic_cast<CIMClientHTTPErrorException*>(
1179 clientException);
1180 if (httpErrorException)
1181 {
1182 throw *httpErrorException;
1183 }
1184
1185 CIMClientXmlException* xmlException =
1186 kumpf 1.4 dynamic_cast<CIMClientXmlException*>(clientException);
1187 if (xmlException)
1188 {
1189 throw *xmlException;
1190 }
1191
1192 CIMClientResponseException* responseException =
1193 dynamic_cast<CIMClientResponseException*>(clientException);
1194 if (responseException)
1195 {
1196 throw *responseException;
1197 }
1198
|
1199 david.dillard 1.42 CIMException* cimException =
|
1200 brian.campbell 1.25 dynamic_cast<CIMException*>(clientException);
1201 if (cimException)
1202 {
1203 throw *cimException;
1204 }
1205
|
1206 kumpf 1.1 throw *clientException;
1207 }
1208 else if (response->getType() == expectedResponseMessageType)
1209 {
1210 CIMResponseMessage* cimResponse = (CIMResponseMessage*)response;
1211
1212 if (cimResponse->messageId != messageId)
1213 {
1214 // l10n
1215
1216 // CIMClientResponseException responseException(
1217 // String("Mismatched response message ID: Got \"") +
1218 // cimResponse->messageId + "\", expected \"" +
1219 // messageId + "\".");
1220
1221 MessageLoaderParms mlParms(
1222 "Client.CIMClient.MISMATCHED_RESPONSE",
1223 "Mismatched response message ID: Got \"$0\", "
1224 "expected \"$1\".",
1225 cimResponse->messageId, messageId);
1226 String mlString(MessageLoader::getMessage(mlParms));
1227 kumpf 1.1
1228 CIMClientResponseException responseException(mlString);
1229
1230 delete response;
1231 throw responseException;
1232 }
1233
|
1234 david.dillard 1.42 // l10n
|
1235 se.gupta 1.24 // Get the Content-Languages from the response's operationContext
|
1236 david.dillard 1.42 // and make available through the CIMClient API
|
1237 chuck 1.27 responseContentLanguages =
|
1238 david.dillard 1.42 ((ContentLanguageListContainer)cimResponse->operationContext.get
1239 (ContentLanguageListContainer::NAME)).getLanguages();
|
1240 kumpf 1.1
1241 if (cimResponse->cimException.getCode() != CIM_ERR_SUCCESS)
1242 {
1243 CIMException cimException(
1244 cimResponse->cimException.getCode(),
1245 cimResponse->cimException.getMessage());
|
1246 david.dillard 1.42 cimException.setContentLanguages(responseContentLanguages);
|
1247 kumpf 1.1 delete response;
1248 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.1 return response;
1269 }
|
1270 j.alex 1.48 else if (dynamic_cast<CIMRequestMessage*>(response) != 0)
1271 {
1272 // Respond to an authentication challenge
1273 _requestEncoder->enqueue(response);
1274 nowMilliseconds = TimeValue::getCurrentTime().toMilliseconds();
1275 stopMilliseconds = nowMilliseconds + _timeoutMilliseconds;
1276 continue;
1277 }
|
1278 kumpf 1.1 else
1279 {
1280 // l10n
1281
1282 // CIMClientResponseException responseException(
1283 // "Mismatched response message type.");
1284 MessageLoaderParms mlParms(
|
1285 j.alex 1.48 "Client.CIMOperationResponseDecoder.MISMATCHED_RESPONSE_TYPE",
1286 "Mismatched response message type.");
|
1287 kumpf 1.1 String mlString(MessageLoader::getMessage(mlParms));
1288
1289 CIMClientResponseException responseException(mlString);
1290
1291 delete response;
1292 throw responseException;
1293 }
1294 }
1295
1296 nowMilliseconds = TimeValue::getCurrentTime().toMilliseconds();
1297 pegasus_yield();
1298 }
1299
1300 //
1301 // Reconnect to reset the connection (disregard late response)
1302 //
1303 try
1304 {
1305 _reconnect();
1306 }
1307 catch (...)
1308 kumpf 1.1 {
1309 }
1310
1311 //
1312 // Throw timed out exception:
1313 //
1314 throw ConnectionTimeoutException();
1315 }
1316
1317 String CIMClientRep::_getLocalHostName()
1318 {
|
1319 joyce.j 1.41 static String hostname;
1320
1321 if (!hostname.size())
1322 {
1323 hostname.assign(System::getHostName());
1324 }
|
1325 kumpf 1.1
1326 return hostname;
|
1327 marek 1.12 }
1328
|
1329 david.dillard 1.42 void CIMClientRep::compareObjectPathtoCurrentConnection(const CIMObjectPath& obj)
|
1330 marek 1.12 {
1331
|
1332 david.dillard 1.42 String ObjHost = obj.getHost();
1333 // test if a host is given at all, if not everything is fine and we leave it at that
1334 if (ObjHost==String::EMPTY)
1335 {
1336 return;
1337 }
1338
|
1339 marek 1.17 MessageLoaderParms typeMismatchMessage;
|
1340 david.dillard 1.42 // splitting the port from hostname as we have to compare both separate
|
1341 david.dillard 1.45 int i = ObjHost.find(":");
1342 String ObjPort = String::EMPTY;
1343 // only if there is a ":" we should split a port address from hostname string
1344 if (i > 0)
1345 {
1346 ObjPort = ObjHost.subString(i+1);
1347 ObjHost.remove(i);
|
1348 david.dillard 1.42
|
1349 david.dillard 1.45 // lets see who we are really connected to
1350 // should stand in UInt32 _connectPortNumber and String _connectHost;
|
1351 david.dillard 1.42
|
1352 david.dillard 1.45 // comparing the stuff
1353 // first the easy part, comparing the ports
1354 Uint32 objectport = strtoul((const char*) ObjPort.getCString(), NULL, 0);
|
1355 david.dillard 1.42
1356 // if port in object path does not equal port of connection throw a TypeMismatch Exception
1357 if (objectport != _connectPortNumber)
1358 {
1359 typeMismatchMessage = MessageLoaderParms("Client.CIMClientRep.TYPEMISMATCH_PORTMISMATCH",
1360 "Failed validation of CIM object path: port of CIMClient connection($0) and port of object path($1) not equal",
1361 _connectPortNumber, objectport);
1362 throw TypeMismatchException(typeMismatchMessage);
1363 }
1364 }
|
1365 marek 1.12 }
1366
|
1367 w.white 1.37
1368 void CIMClientRep::registerClientOpPerformanceDataHandler(ClientOpPerformanceDataHandler & handler)
|
1369 david.dillard 1.42 {
|
1370 a.dunfey 1.53 perfDataStore.handler_prt = &handler;
1371 perfDataStore.setClassRegistered(true);
|
1372 w.white 1.37 }
|
1373 david.dillard 1.42
|
1374 w.white 1.37
1375 void CIMClientRep::deregisterClientOpPerformanceDataHandler()
1376 {
|
1377 a.dunfey 1.53 perfDataStore.handler_prt = NULL;
1378 perfDataStore.setClassRegistered(false);
|
1379 w.white 1.37 }
1380
1381
|
1382 kumpf 1.1 PEGASUS_NAMESPACE_END
|