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