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