(file) Return to CIMClient.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / Client

   1 mike  1.27 //%/////////////////////////////////////////////////////////////////////////////
   2            //
   3 kumpf 1.62 // Copyright (c) 2000, 2001, 2002 BMC Software, Hewlett-Packard Company, IBM,
   4 mike  1.31 // The Open Group, Tivoli Systems
   5 mike  1.27 //
   6            // Permission is hereby granted, free of charge, to any person obtaining a copy
   7            // of this software and associated documentation files (the "Software"), to
   8            // deal in the Software without restriction, including without limitation the
   9            // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  10            // sell copies of the Software, and to permit persons to whom the Software is
  11            // furnished to do so, subject to the following conditions:
  12 kumpf 1.62 // 
  13 mike  1.27 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
  14            // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
  15            // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
  16            // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
  17            // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  18            // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  19            // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  20            // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  21            //
  22            //==============================================================================
  23            //
  24            // Author: Mike Brasher (mbrasher@bmc.com)
  25            //
  26 mike  1.31 // Modified By: Nitin Upasani, Hewlett-Packard Company (Nitin_Upasani@hp.com)
  27            //              Yi Zhou, Hewlett-Packard Company (yi_zhou@hp.com)
  28            //              Nag Boranna, Hewlett-Packard Company (nagaraja_boranna@hp.com)
  29            //              Roger Kumpf, Hewlett-Packard Company (roger_kumpf@hp.com)
  30 kumpf 1.60 //              Carol Ann Krug Graves, Hewlett-Packard Company
  31            //                  (carolann_graves@hp.com)
  32 mike  1.27 //
  33            //%/////////////////////////////////////////////////////////////////////////////
  34            
  35            #include <Pegasus/Common/Config.h>
  36 kumpf 1.47 #include <Pegasus/Common/Constants.h>
  37 kumpf 1.63 #include <Pegasus/Common/FileSystem.h>
  38 kumpf 1.54 #include <Pegasus/Common/Monitor.h>
  39            #include <Pegasus/Common/HTTPConnector.h>
  40            #include <Pegasus/Common/CIMMessage.h>
  41 mike  1.31 #include <Pegasus/Common/HTTPConnection.h>
  42            #include <Pegasus/Common/Destroyer.h>
  43 mike  1.27 #include <Pegasus/Common/XmlWriter.h>
  44            #include <Pegasus/Common/TimeValue.h>
  45 kumpf 1.50 #include <Pegasus/Common/PegasusVersion.h>
  46            
  47 mike  1.31 #include "CIMOperationResponseDecoder.h"
  48            #include "CIMOperationRequestEncoder.h"
  49 kumpf 1.54 #include "ClientAuthenticator.h"
  50 mike  1.27 #include "CIMClient.h"
  51            
  52            #include <iostream>
  53 kumpf 1.78 #include <fstream>
  54 kumpf 1.33 #ifdef PEGASUS_PLATFORM_WIN32_IX86_MSVC
  55 mday  1.37 # include <windows.h>
  56 kumpf 1.33 #else
  57            # include <netinet/in.h>
  58            # include <arpa/inet.h>
  59            # include <sys/socket.h>
  60            #endif
  61 mike  1.27 
  62            PEGASUS_USING_STD;
  63            
  64            PEGASUS_NAMESPACE_BEGIN
  65            
  66 kumpf 1.54 ///////////////////////////////////////////////////////////////////////////////
  67            //
  68            // CIMClientRep
  69            //
  70            ///////////////////////////////////////////////////////////////////////////////
  71            
  72            class CIMClientRep : public MessageQueue
  73            {
  74            public:
  75            
  76                enum { DEFAULT_TIMEOUT_MILLISECONDS = 20000 };
  77            
  78 kumpf 1.55     // Timeout value defines the time the CIMClient will wait for a response
  79                // to an outstanding request.  If a request times out, the connection
  80                // gets reset (disconnected and reconnected).
  81 kumpf 1.68     CIMClientRep(Uint32 timeoutMilliseconds = DEFAULT_TIMEOUT_MILLISECONDS);
  82 kumpf 1.54 
  83                ~CIMClientRep();
  84            
  85                virtual void handleEnqueue();
  86            
  87 kumpf 1.68     Uint32 getTimeout() const
  88 kumpf 1.54     {
  89 kumpf 1.68 	return _timeoutMilliseconds;
  90 kumpf 1.54     }
  91            
  92 kumpf 1.68     void setTimeout(Uint32 timeoutMilliseconds)
  93 kumpf 1.54     {
  94 kumpf 1.68 	_timeoutMilliseconds = timeoutMilliseconds;
  95 kumpf 1.54     }
  96            
  97 kumpf 1.70     void connect(
  98 kumpf 1.75         const String& host,
  99                    const Uint32 portNumber,
 100 kumpf 1.72         const String& userName,
 101                    const String& password
 102 kumpf 1.70     );
 103 kumpf 1.54 
 104                void connect(
 105 kumpf 1.75         const String& host,
 106                    const Uint32 portNumber,
 107 kumpf 1.70         const SSLContext& sslContext,
 108 kumpf 1.72         const String& userName,
 109                    const String& password
 110 kumpf 1.65     );
 111 kumpf 1.54 
 112 kumpf 1.65     void connectLocal();
 113 kumpf 1.54 
 114                void disconnect();
 115            
 116                virtual CIMClass getClass(
 117 kumpf 1.64 	const CIMNamespaceName& nameSpace,
 118            	const CIMName& className,
 119 kumpf 1.54 	Boolean localOnly = true,
 120            	Boolean includeQualifiers = true,
 121            	Boolean includeClassOrigin = false,
 122            	const CIMPropertyList& propertyList = CIMPropertyList()
 123 kumpf 1.65     );
 124 kumpf 1.54 
 125                virtual CIMInstance getInstance(
 126 kumpf 1.64 	const CIMNamespaceName& nameSpace,
 127 kumpf 1.56 	const CIMObjectPath& instanceName,
 128 kumpf 1.54 	Boolean localOnly = true,
 129            	Boolean includeQualifiers = false,
 130            	Boolean includeClassOrigin = false,
 131            	const CIMPropertyList& propertyList = CIMPropertyList()
 132 kumpf 1.65     );
 133 kumpf 1.54 
 134                virtual void deleteClass(
 135 kumpf 1.64 	const CIMNamespaceName& nameSpace,
 136            	const CIMName& className
 137 kumpf 1.65     );
 138 kumpf 1.54 
 139                virtual void deleteInstance(
 140 kumpf 1.64 	const CIMNamespaceName& nameSpace,
 141 kumpf 1.56 	const CIMObjectPath& instanceName
 142 kumpf 1.65     );
 143 kumpf 1.54 
 144                virtual void createClass(
 145 kumpf 1.64 	const CIMNamespaceName& nameSpace,
 146 kumpf 1.54 	const CIMClass& newClass
 147 kumpf 1.65     );
 148 kumpf 1.54 
 149 kumpf 1.56     virtual CIMObjectPath createInstance(
 150 kumpf 1.64 	const CIMNamespaceName& nameSpace,
 151 kumpf 1.54 	const CIMInstance& newInstance
 152 kumpf 1.65     );
 153 kumpf 1.54 
 154                virtual void modifyClass(
 155 kumpf 1.64 	const CIMNamespaceName& nameSpace,
 156 kumpf 1.54 	const CIMClass& modifiedClass
 157 kumpf 1.65     );
 158 kumpf 1.54 
 159                virtual void modifyInstance(
 160 kumpf 1.64 	const CIMNamespaceName& nameSpace,
 161 kumpf 1.60 	const CIMInstance& modifiedInstance,
 162 kumpf 1.54 	Boolean includeQualifiers = true,
 163            	const CIMPropertyList& propertyList = CIMPropertyList()
 164 kumpf 1.65     );
 165 kumpf 1.54 
 166                virtual Array<CIMClass> enumerateClasses(
 167 kumpf 1.64 	const CIMNamespaceName& nameSpace,
 168            	const CIMName& className = CIMName(),
 169 kumpf 1.54 	Boolean deepInheritance = false,
 170            	Boolean localOnly = true,
 171            	Boolean includeQualifiers = true,
 172            	Boolean includeClassOrigin = false
 173 kumpf 1.65     );
 174 kumpf 1.54 
 175 kumpf 1.64     virtual Array<CIMName> enumerateClassNames(
 176            	const CIMNamespaceName& nameSpace,
 177            	const CIMName& className = CIMName(),
 178 kumpf 1.54 	Boolean deepInheritance = false
 179 kumpf 1.65     );
 180 kumpf 1.54 
 181 kumpf 1.60     virtual Array<CIMInstance> enumerateInstances(
 182 kumpf 1.64 	const CIMNamespaceName& nameSpace,
 183            	const CIMName& className,
 184 kumpf 1.54 	Boolean deepInheritance = true,
 185            	Boolean localOnly = true,
 186            	Boolean includeQualifiers = false,
 187            	Boolean includeClassOrigin = false,
 188            	const CIMPropertyList& propertyList = CIMPropertyList()
 189 kumpf 1.65     );
 190 kumpf 1.54 
 191 kumpf 1.56     virtual Array<CIMObjectPath> enumerateInstanceNames(
 192 kumpf 1.64 	const CIMNamespaceName& nameSpace,
 193            	const CIMName& className
 194 kumpf 1.65     );
 195 kumpf 1.54 
 196 kumpf 1.61     virtual Array<CIMObject> execQuery(
 197 kumpf 1.64 	const CIMNamespaceName& nameSpace,
 198 kumpf 1.54 	const String& queryLanguage,
 199            	const String& query
 200 kumpf 1.65     );
 201 kumpf 1.54 
 202 kumpf 1.61     virtual Array<CIMObject> associators(
 203 kumpf 1.64 	const CIMNamespaceName& nameSpace,
 204 kumpf 1.56 	const CIMObjectPath& objectName,
 205 kumpf 1.64 	const CIMName& assocClass = CIMName(),
 206            	const CIMName& resultClass = CIMName(),
 207 kumpf 1.54 	const String& role = String::EMPTY,
 208            	const String& resultRole = String::EMPTY,
 209            	Boolean includeQualifiers = false,
 210            	Boolean includeClassOrigin = false,
 211            	const CIMPropertyList& propertyList = CIMPropertyList()
 212 kumpf 1.65     );
 213 kumpf 1.54 
 214 kumpf 1.56     virtual Array<CIMObjectPath> associatorNames(
 215 kumpf 1.64 	const CIMNamespaceName& nameSpace,
 216 kumpf 1.56 	const CIMObjectPath& objectName,
 217 kumpf 1.64 	const CIMName& assocClass = CIMName(),
 218            	const CIMName& resultClass = CIMName(),
 219 kumpf 1.54 	const String& role = String::EMPTY,
 220            	const String& resultRole = String::EMPTY
 221 kumpf 1.65     );
 222 kumpf 1.54 
 223 kumpf 1.61     virtual Array<CIMObject> references(
 224 kumpf 1.64 	const CIMNamespaceName& nameSpace,
 225 kumpf 1.56 	const CIMObjectPath& objectName,
 226 kumpf 1.64 	const CIMName& resultClass = CIMName(),
 227 kumpf 1.54 	const String& role = String::EMPTY,
 228            	Boolean includeQualifiers = false,
 229            	Boolean includeClassOrigin = false,
 230            	const CIMPropertyList& propertyList = CIMPropertyList()
 231 kumpf 1.65     );
 232 kumpf 1.54 
 233 kumpf 1.56     virtual Array<CIMObjectPath> referenceNames(
 234 kumpf 1.64 	const CIMNamespaceName& nameSpace,
 235 kumpf 1.56 	const CIMObjectPath& objectName,
 236 kumpf 1.64 	const CIMName& resultClass = CIMName(),
 237 kumpf 1.54 	const String& role = String::EMPTY
 238 kumpf 1.65     );
 239 kumpf 1.54 
 240                virtual CIMValue getProperty(
 241 kumpf 1.64 	const CIMNamespaceName& nameSpace,
 242 kumpf 1.56 	const CIMObjectPath& instanceName,
 243 kumpf 1.64 	const CIMName& propertyName
 244 kumpf 1.65     );
 245 kumpf 1.54 
 246                virtual void setProperty(
 247 kumpf 1.64 	const CIMNamespaceName& nameSpace,
 248 kumpf 1.56 	const CIMObjectPath& instanceName,
 249 kumpf 1.64 	const CIMName& propertyName,
 250 kumpf 1.54 	const CIMValue& newValue = CIMValue()
 251 kumpf 1.65     );
 252 kumpf 1.54 
 253                virtual CIMQualifierDecl getQualifier(
 254 kumpf 1.64 	const CIMNamespaceName& nameSpace,
 255            	const CIMName& qualifierName
 256 kumpf 1.65     );
 257 kumpf 1.54 
 258                virtual void setQualifier(
 259 kumpf 1.64 	const CIMNamespaceName& nameSpace,
 260 kumpf 1.54 	const CIMQualifierDecl& qualifierDeclaration
 261 kumpf 1.65     );
 262 kumpf 1.54 
 263                virtual void deleteQualifier(
 264 kumpf 1.64 	const CIMNamespaceName& nameSpace,
 265            	const CIMName& qualifierName
 266 kumpf 1.65     );
 267 kumpf 1.54 
 268                virtual Array<CIMQualifierDecl> enumerateQualifiers(
 269 kumpf 1.64 	const CIMNamespaceName& nameSpace
 270 kumpf 1.65     );
 271 kumpf 1.54 
 272                virtual CIMValue invokeMethod(
 273 kumpf 1.64 	const CIMNamespaceName& nameSpace,
 274 kumpf 1.56 	const CIMObjectPath& instanceName,
 275 kumpf 1.64 	const CIMName& methodName,
 276 kumpf 1.54 	const Array<CIMParamValue>& inParameters,
 277            	Array<CIMParamValue>& outParameters
 278 kumpf 1.65     );
 279 kumpf 1.54 
 280            private:
 281            
 282 kumpf 1.70     void _connect();
 283 kumpf 1.54 
 284 kumpf 1.65     void _reconnect();
 285 kumpf 1.55 
 286 kumpf 1.54     Message* _doRequest(
 287                    CIMRequestMessage * request,
 288 kumpf 1.65 	const Uint32 expectedResponseMessageType);
 289 kumpf 1.54 
 290                String _getLocalHostName();
 291            
 292                Monitor* _monitor;
 293                HTTPConnector* _httpConnector;
 294                HTTPConnection* _httpConnection;
 295 kumpf 1.68     Uint32 _timeoutMilliseconds;
 296 kumpf 1.54     Boolean _connected;
 297                CIMOperationResponseDecoder* _responseDecoder;
 298                CIMOperationRequestEncoder* _requestEncoder;
 299                ClientAuthenticator _authenticator;
 300 kumpf 1.75     String _connectHost;
 301                Uint32 _connectPortNumber;
 302 kumpf 1.55     SSLContext* _connectSSLContext;
 303 kumpf 1.54 };
 304            
 305 kumpf 1.69 static Boolean verifyServerCertificate(SSLCertificateInfo &certInfo)
 306 kumpf 1.57 {
 307                //ATTN-NB-03-05132002: Add code to handle server certificate verification.
 308                return true;
 309            }
 310 kumpf 1.54 
 311 kumpf 1.68 CIMClientRep::CIMClientRep(Uint32 timeoutMilliseconds)
 312 mike  1.31     : 
 313 kumpf 1.47     MessageQueue(PEGASUS_QUEUENAME_CLIENT),
 314 kumpf 1.43     _httpConnection(0),
 315 kumpf 1.68     _timeoutMilliseconds(timeoutMilliseconds),
 316 mike  1.31     _connected(false),
 317                _responseDecoder(0),
 318 kumpf 1.70     _requestEncoder(0),
 319                _connectSSLContext(0)
 320 mike  1.29 {
 321 mike  1.31     //
 322 kumpf 1.39     // Create Monitor and HTTPConnector
 323                //
 324                _monitor = new Monitor();
 325                _httpConnector = new HTTPConnector(_monitor);
 326 mike  1.29 }
 327            
 328 kumpf 1.54 CIMClientRep::~CIMClientRep()
 329 mike  1.27 {
 330 kumpf 1.40    disconnect();
 331 kumpf 1.39    delete _httpConnector;
 332 kumpf 1.80    delete _monitor;
 333 mike  1.27 }
 334            
 335 kumpf 1.54 void CIMClientRep::handleEnqueue()
 336 mike  1.27 {
 337            
 338            }
 339            
 340 kumpf 1.70 void CIMClientRep::_connect()
 341 mike  1.27 {
 342 kumpf 1.40     //
 343 mike  1.31     // Create response decoder:
 344 kumpf 1.40     //
 345 mike  1.31     _responseDecoder = new CIMOperationResponseDecoder(
 346 kumpf 1.40         this, _requestEncoder, &_authenticator);
 347 mike  1.31     
 348 kumpf 1.40     //
 349 mike  1.31     // Attempt to establish a connection:
 350 kumpf 1.40     //
 351 mike  1.31     try
 352                {
 353 kumpf 1.75         _httpConnection = _httpConnector->connect(_connectHost,
 354                                                              _connectPortNumber,
 355 kumpf 1.70                                                   _connectSSLContext,
 356 kumpf 1.39                                                   _responseDecoder);
 357 mike  1.31     }
 358 kumpf 1.65     catch (CannotCreateSocketException& e)
 359 mike  1.31     {
 360 kumpf 1.49         delete _responseDecoder;
 361 kumpf 1.65         throw e;
 362 kumpf 1.49     }
 363 kumpf 1.65     catch (CannotConnectException& e)
 364 kumpf 1.49     {
 365                    delete _responseDecoder;
 366 kumpf 1.65         throw e;
 367 kumpf 1.49     }
 368 kumpf 1.65     catch (InvalidLocatorException& e)
 369 kumpf 1.49     {
 370                    delete _responseDecoder;
 371 kumpf 1.65         throw e;
 372 kumpf 1.49     }
 373 mike  1.31     
 374 kumpf 1.40     //
 375 mike  1.31     // Create request encoder:
 376 kumpf 1.40     //
 377 mike  1.31     _requestEncoder = new CIMOperationRequestEncoder(
 378 kumpf 1.40         _httpConnection, &_authenticator);
 379 mike  1.27 
 380 mike  1.31     _responseDecoder->setEncoderQueue(_requestEncoder);
 381 kumpf 1.40 
 382                _connected = true;
 383 kumpf 1.55 }
 384            
 385 kumpf 1.65 void CIMClientRep::_reconnect()
 386 kumpf 1.55 {
 387                disconnect();
 388 kumpf 1.70     _connect();
 389            }
 390            
 391            void CIMClientRep::connect(
 392 kumpf 1.75     const String& host,
 393                const Uint32 portNumber,
 394 kumpf 1.70     const String& userName,
 395                const String& password
 396            )
 397            {
 398                //
 399                // If already connected, bail out!
 400                //
 401                if (_connected)
 402            	throw AlreadyConnectedException();
 403            
 404                //
 405 kumpf 1.75     // If the host is empty, set hostName to "localhost"
 406 kumpf 1.70     //
 407 kumpf 1.75     String hostName = host;
 408                if (host == String::EMPTY)
 409                {
 410                    hostName = "localhost";
 411                }
 412 kumpf 1.70 
 413                //
 414                // Set authentication information
 415                //
 416                _authenticator.clearRequest(true);
 417                _authenticator.setAuthType(ClientAuthenticator::NONE);
 418            
 419                if (userName.size())
 420                {
 421                    _authenticator.setUserName(userName);
 422                }
 423            
 424                if (password.size())
 425                {
 426                    _authenticator.setPassword(password);
 427                }
 428            
 429                _connectSSLContext = 0;
 430 kumpf 1.75     _connectHost = hostName;
 431                _connectPortNumber = portNumber;
 432 kumpf 1.70 
 433                _connect();
 434 kumpf 1.40 }
 435            
 436 kumpf 1.70 
 437 kumpf 1.54 void CIMClientRep::connect(
 438 kumpf 1.75     const String& host,
 439                const Uint32 portNumber,
 440 kumpf 1.70     const SSLContext& sslContext,
 441 kumpf 1.40     const String& userName,
 442 kumpf 1.49     const String& password
 443 kumpf 1.65 )
 444 kumpf 1.40 {
 445                //
 446                // If already connected, bail out!
 447                //
 448                if (_connected)
 449 kumpf 1.65 	throw AlreadyConnectedException();
 450 kumpf 1.40 
 451                //
 452 kumpf 1.75     // If the host is empty, set hostName to "localhost"
 453 kumpf 1.40     //
 454 kumpf 1.75     String hostName = host;
 455                if (host == String::EMPTY)
 456                {
 457                    hostName = "localhost";
 458                }
 459 kumpf 1.40 
 460 kumpf 1.35     //
 461                // Set authentication information
 462                //
 463 kumpf 1.40     _authenticator.clearRequest(true);
 464 kumpf 1.53     _authenticator.setAuthType(ClientAuthenticator::NONE);
 465 kumpf 1.40 
 466 kumpf 1.35     if (userName.size())
 467                {
 468 kumpf 1.40         _authenticator.setUserName(userName);
 469 kumpf 1.35     }
 470            
 471                if (password.size())
 472                {
 473 kumpf 1.40         _authenticator.setPassword(password);
 474 kumpf 1.35     }
 475 kumpf 1.40 
 476 kumpf 1.70     _connectSSLContext = new SSLContext(sslContext);
 477 kumpf 1.75     _connectHost = hostName;
 478                _connectPortNumber = portNumber;
 479            
 480 kumpf 1.70 
 481                try
 482                {
 483                    _connect();
 484                }
 485                catch (Exception&)
 486                {
 487                    delete _connectSSLContext;
 488                    _connectSSLContext = 0;
 489                    throw;
 490                }
 491 mike  1.27 }
 492            
 493 kumpf 1.46 
 494 kumpf 1.65 void CIMClientRep::connectLocal()
 495 mike  1.27 {
 496 kumpf 1.40     //
 497                // If already connected, bail out!
 498                //
 499                if (_connected)
 500 kumpf 1.65 	throw AlreadyConnectedException();
 501 kumpf 1.40 
 502                //
 503 kumpf 1.57     // Set authentication type
 504 kumpf 1.40     //
 505 kumpf 1.57     _authenticator.clearRequest(true);
 506                _authenticator.setAuthType(ClientAuthenticator::LOCAL);
 507            
 508            #ifdef PEGASUS_LOCAL_DOMAIN_SOCKET
 509 kumpf 1.70     _connect();
 510 kumpf 1.57 #else
 511            
 512                try
 513                {
 514                    //
 515                    // Look up the WBEM HTTP port number for the local system
 516                    //
 517 kumpf 1.75         _connectPortNumber = System::lookupPort (WBEM_HTTP_SERVICE_NAME, 
 518                        WBEM_DEFAULT_HTTP_PORT);
 519 kumpf 1.57 
 520                    //
 521 kumpf 1.75         //  Assign host
 522 kumpf 1.57         //
 523 kumpf 1.75         _connectHost.assign(_getLocalHostName());
 524 kumpf 1.57 
 525 kumpf 1.70         _connectSSLContext = 0;
 526 kumpf 1.57 
 527 kumpf 1.70         _connect();
 528 kumpf 1.57     }
 529 kumpf 1.65     catch(CannotConnectException &e)
 530 kumpf 1.57     {
 531                    //
 532                    // Look up the WBEM HTTPS port number for the local system
 533                    //
 534 kumpf 1.75         _connectPortNumber = System::lookupPort (WBEM_HTTPS_SERVICE_NAME, 
 535                        WBEM_DEFAULT_HTTPS_PORT);
 536 kumpf 1.57 
 537                    //
 538 kumpf 1.75         //  Assign host
 539 kumpf 1.57         //
 540 kumpf 1.75         _connectHost.assign(_getLocalHostName());
 541 kumpf 1.57 
 542                    //
 543                    // Create SSLContext
 544                    //
 545            
 546                    const char* pegasusHome = getenv("PEGASUS_HOME");
 547            
 548 kumpf 1.63         String certpath = FileSystem::getAbsolutePath(
 549                        pegasusHome, PEGASUS_SSLCLIENT_CERTIFICATEFILE);
 550 kumpf 1.57 
 551                    String randFile = String::EMPTY;
 552 kumpf 1.33 
 553 kumpf 1.57 #ifdef PEGASUS_SSL_RANDOMFILE
 554 kumpf 1.63         randFile = FileSystem::getAbsolutePath(
 555                        pegasusHome, PEGASUS_SSLCLIENT_RANDOMFILE);
 556 kumpf 1.38 #endif
 557 kumpf 1.33 
 558 kumpf 1.59         try
 559                    {
 560 kumpf 1.70             _connectSSLContext =
 561 kumpf 1.77                 new SSLContext(certpath, verifyServerCertificate, randFile);
 562 kumpf 1.59         }
 563 kumpf 1.65         catch (SSLException &se)
 564 kumpf 1.59         {
 565 kumpf 1.65             throw se;
 566 kumpf 1.59         }
 567 kumpf 1.35 
 568 kumpf 1.70         try
 569                    {
 570                        _connect();
 571                    }
 572                    catch (Exception&)
 573                    {
 574                        delete _connectSSLContext;
 575                        _connectSSLContext = 0;
 576                        throw;
 577                    }
 578 kumpf 1.57     }
 579            #endif
 580 kumpf 1.35 }
 581            
 582 kumpf 1.54 void CIMClientRep::disconnect()
 583 kumpf 1.35 {
 584                if (_connected)
 585 mike  1.31     {
 586 kumpf 1.35         //
 587                    // destroy response decoder
 588                    //
 589                    if (_responseDecoder)
 590                    {
 591                        delete _responseDecoder;
 592 kumpf 1.40             _responseDecoder = 0;
 593 kumpf 1.35         }
 594            
 595                    //
 596 kumpf 1.49         // Close the connection
 597 kumpf 1.35         //
 598 kumpf 1.71         if (_httpConnector)
 599                    {
 600                        _httpConnector->disconnect(_httpConnection);
 601                    }
 602 kumpf 1.35 
 603                    //
 604                    // destroy request encoder
 605                    //
 606                    if (_requestEncoder)
 607                    {
 608                        delete _requestEncoder;
 609 kumpf 1.40             _requestEncoder = 0;
 610 kumpf 1.35         }
 611            
 612 kumpf 1.40         _authenticator.clearRequest(true);
 613 kumpf 1.35 
 614 kumpf 1.70         if (_connectSSLContext)
 615                    {
 616                        delete _connectSSLContext;
 617                        _connectSSLContext = 0;
 618                    }
 619            
 620 kumpf 1.35         _connected = false;
 621 mike  1.31     }
 622 kumpf 1.35 }
 623 mike  1.27 
 624            
 625 kumpf 1.54 CIMClass CIMClientRep::getClass(
 626 kumpf 1.64     const CIMNamespaceName& nameSpace,
 627                const CIMName& className,
 628 mike  1.27     Boolean localOnly,
 629                Boolean includeQualifiers,
 630                Boolean includeClassOrigin,
 631 kumpf 1.49     const CIMPropertyList& propertyList
 632 kumpf 1.65 )
 633 mike  1.27 {
 634 kumpf 1.48     CIMRequestMessage* request = new CIMGetClassRequestMessage(
 635            	String::EMPTY,
 636 mike  1.31 	nameSpace,
 637            	className,
 638            	localOnly,
 639            	includeQualifiers,
 640            	includeClassOrigin,
 641            	propertyList,
 642            	QueueIdStack());
 643                
 644 kumpf 1.48     Message* message = _doRequest(request, CIM_GET_CLASS_RESPONSE_MESSAGE);
 645 mike  1.31 
 646                CIMGetClassResponseMessage* response = 
 647                    (CIMGetClassResponseMessage*)message;
 648                
 649                Destroyer<CIMGetClassResponseMessage> destroyer(response);
 650                
 651                return(response->cimClass);
 652 mike  1.27 }
 653            
 654 kumpf 1.54 CIMInstance CIMClientRep::getInstance(
 655 kumpf 1.64     const CIMNamespaceName& nameSpace,
 656 kumpf 1.56     const CIMObjectPath& instanceName,
 657 mike  1.27     Boolean localOnly,
 658                Boolean includeQualifiers,
 659                Boolean includeClassOrigin,
 660 kumpf 1.49     const CIMPropertyList& propertyList
 661 kumpf 1.65 )
 662 mike  1.27 {
 663 kumpf 1.48     CIMRequestMessage* request = new CIMGetInstanceRequestMessage(
 664            	String::EMPTY,
 665 mike  1.31 	nameSpace,
 666            	instanceName,
 667            	localOnly,
 668            	includeQualifiers,
 669            	includeClassOrigin,
 670            	propertyList,
 671            	QueueIdStack());
 672                
 673 kumpf 1.48     Message* message = _doRequest(request, CIM_GET_INSTANCE_RESPONSE_MESSAGE);
 674 mike  1.31     
 675                CIMGetInstanceResponseMessage* response = 
 676                    (CIMGetInstanceResponseMessage*)message;
 677                
 678                Destroyer<CIMGetInstanceResponseMessage> destroyer(response);
 679                
 680                return(response->cimInstance);
 681 mike  1.27 }
 682            
 683 kumpf 1.54 void CIMClientRep::deleteClass(
 684 kumpf 1.64     const CIMNamespaceName& nameSpace,
 685                const CIMName& className
 686 kumpf 1.65 )
 687 mike  1.27 {
 688 kumpf 1.48     CIMRequestMessage* request = new CIMDeleteClassRequestMessage(
 689            	String::EMPTY,
 690 mike  1.31 	nameSpace,
 691            	className,
 692            	QueueIdStack());
 693                
 694 kumpf 1.48     Message* message = _doRequest(request, CIM_DELETE_CLASS_RESPONSE_MESSAGE);
 695 mike  1.31     
 696                CIMDeleteClassResponseMessage* response = 
 697                    (CIMDeleteClassResponseMessage*)message;
 698                
 699                Destroyer<CIMDeleteClassResponseMessage> destroyer(response);
 700 mike  1.27 }
 701            
 702 kumpf 1.54 void CIMClientRep::deleteInstance(
 703 kumpf 1.64     const CIMNamespaceName& nameSpace,
 704 kumpf 1.56     const CIMObjectPath& instanceName
 705 kumpf 1.65 )
 706 mike  1.27 {
 707 kumpf 1.48     CIMRequestMessage* request = new CIMDeleteInstanceRequestMessage(
 708            	String::EMPTY,
 709 mike  1.31 	nameSpace,
 710            	instanceName,
 711            	QueueIdStack());
 712                
 713 kumpf 1.48     Message* message = _doRequest(request, CIM_DELETE_INSTANCE_RESPONSE_MESSAGE);
 714 mike  1.31     
 715                CIMDeleteInstanceResponseMessage* response = 
 716                    (CIMDeleteInstanceResponseMessage*)message;
 717                
 718                Destroyer<CIMDeleteInstanceResponseMessage> destroyer(response);
 719 mike  1.27 }
 720            
 721 kumpf 1.54 void CIMClientRep::createClass(
 722 kumpf 1.64     const CIMNamespaceName& nameSpace,
 723 kumpf 1.49     const CIMClass& newClass
 724 kumpf 1.65 )
 725 mike  1.27 {
 726 kumpf 1.48     CIMRequestMessage* request = new CIMCreateClassRequestMessage(
 727            	String::EMPTY,
 728 mike  1.31 	nameSpace,
 729            	newClass,
 730            	QueueIdStack());
 731                
 732 kumpf 1.48     Message* message = _doRequest(request, CIM_CREATE_CLASS_RESPONSE_MESSAGE);
 733 mike  1.31     
 734                CIMCreateClassResponseMessage* response = 
 735                    (CIMCreateClassResponseMessage*)message;
 736                
 737                Destroyer<CIMCreateClassResponseMessage> destroyer(response);
 738 mike  1.27 }
 739            
 740 kumpf 1.56 CIMObjectPath CIMClientRep::createInstance(
 741 kumpf 1.64     const CIMNamespaceName& nameSpace,
 742 kumpf 1.49     const CIMInstance& newInstance
 743 kumpf 1.65 )
 744 mike  1.27 {
 745 kumpf 1.48     CIMRequestMessage* request = new CIMCreateInstanceRequestMessage(
 746            	String::EMPTY,
 747 mike  1.31 	nameSpace,
 748            	newInstance,
 749            	QueueIdStack());
 750                
 751 kumpf 1.48     Message* message = _doRequest(request, CIM_CREATE_INSTANCE_RESPONSE_MESSAGE);
 752 mike  1.31     
 753                CIMCreateInstanceResponseMessage* response = 
 754                    (CIMCreateInstanceResponseMessage*)message;
 755                
 756                Destroyer<CIMCreateInstanceResponseMessage> destroyer(response);
 757                
 758                return(response->instanceName);
 759 mike  1.27 }
 760            
 761 kumpf 1.54 void CIMClientRep::modifyClass(
 762 kumpf 1.64     const CIMNamespaceName& nameSpace,
 763 kumpf 1.49     const CIMClass& modifiedClass
 764 kumpf 1.65 )
 765 mike  1.27 {
 766 kumpf 1.48     CIMRequestMessage* request = new CIMModifyClassRequestMessage(
 767            	String::EMPTY,
 768 mike  1.31 	nameSpace,
 769            	modifiedClass,
 770            	QueueIdStack());
 771                
 772 kumpf 1.48     Message* message = _doRequest(request, CIM_MODIFY_CLASS_RESPONSE_MESSAGE);
 773 mike  1.31     
 774                CIMModifyClassResponseMessage* response = 
 775                    (CIMModifyClassResponseMessage*)message;
 776                
 777                Destroyer<CIMModifyClassResponseMessage> destroyer(response);
 778 mike  1.27 }
 779            
 780 kumpf 1.54 void CIMClientRep::modifyInstance(
 781 kumpf 1.64     const CIMNamespaceName& nameSpace,
 782 kumpf 1.60     const CIMInstance& modifiedInstance,
 783 mike  1.31     Boolean includeQualifiers,
 784 kumpf 1.49     const CIMPropertyList& propertyList
 785 kumpf 1.65 )
 786 mike  1.27 {
 787 kumpf 1.48     CIMRequestMessage* request = new CIMModifyInstanceRequestMessage(
 788            	String::EMPTY,
 789 mike  1.31 	nameSpace,
 790            	modifiedInstance,
 791            	includeQualifiers,
 792            	propertyList,
 793            	QueueIdStack());
 794                
 795 kumpf 1.48     Message* message = _doRequest(request, CIM_MODIFY_INSTANCE_RESPONSE_MESSAGE);
 796 mike  1.31     
 797                CIMModifyInstanceResponseMessage* response = 
 798                    (CIMModifyInstanceResponseMessage*)message;
 799                
 800                Destroyer<CIMModifyInstanceResponseMessage> destroyer(response);
 801 mike  1.27 }
 802            
 803 kumpf 1.54 Array<CIMClass> CIMClientRep::enumerateClasses(
 804 kumpf 1.64     const CIMNamespaceName& nameSpace,
 805                const CIMName& className,
 806 mike  1.27     Boolean deepInheritance,
 807                Boolean localOnly,
 808 mike  1.31     Boolean includeQualifiers,
 809 kumpf 1.49     Boolean includeClassOrigin
 810 kumpf 1.65 )
 811 mike  1.27 {
 812 kumpf 1.48     CIMRequestMessage* request = new CIMEnumerateClassesRequestMessage(
 813            	String::EMPTY,
 814 mike  1.31 	nameSpace,
 815            	className,
 816            	deepInheritance,
 817            	localOnly,
 818            	includeQualifiers,
 819            	includeClassOrigin,
 820            	QueueIdStack());
 821                
 822 kumpf 1.48     Message* message = _doRequest(request, CIM_ENUMERATE_CLASSES_RESPONSE_MESSAGE);
 823 mike  1.31     
 824                CIMEnumerateClassesResponseMessage* response = 
 825                    (CIMEnumerateClassesResponseMessage*)message;
 826                
 827                Destroyer<CIMEnumerateClassesResponseMessage> destroyer(response);
 828                
 829                return(response->cimClasses);
 830 mike  1.27 }
 831            
 832 kumpf 1.64 Array<CIMName> CIMClientRep::enumerateClassNames(
 833                const CIMNamespaceName& nameSpace,
 834                const CIMName& className,
 835 kumpf 1.49     Boolean deepInheritance
 836 kumpf 1.65 )
 837 mike  1.27 {
 838 kumpf 1.48     CIMRequestMessage* request = new CIMEnumerateClassNamesRequestMessage(
 839            	String::EMPTY,
 840 mike  1.31 	nameSpace,
 841            	className,
 842            	deepInheritance,
 843            	QueueIdStack());
 844                
 845 kumpf 1.48     Message* message = _doRequest(request, CIM_ENUMERATE_CLASS_NAMES_RESPONSE_MESSAGE);
 846 mike  1.31     
 847                CIMEnumerateClassNamesResponseMessage* response = 
 848                    (CIMEnumerateClassNamesResponseMessage*)message;
 849                
 850                Destroyer<CIMEnumerateClassNamesResponseMessage> destroyer(response);
 851                
 852 kumpf 1.64     // Temporary code until internal structures use CIMName instead of String
 853                Array<CIMName> classNameArray;
 854                classNameArray.reserveCapacity(response->classNames.size());
 855                for (Uint32 i=0; i<response->classNames.size(); i++)
 856                {
 857                    classNameArray.append(response->classNames[i]);
 858                }
 859                return(classNameArray);
 860 mike  1.27 }
 861            
 862 kumpf 1.60 Array<CIMInstance> CIMClientRep::enumerateInstances(
 863 kumpf 1.64     const CIMNamespaceName& nameSpace,
 864                const CIMName& className,
 865 mike  1.27     Boolean deepInheritance,
 866                Boolean localOnly,
 867                Boolean includeQualifiers,
 868                Boolean includeClassOrigin,
 869 kumpf 1.49     const CIMPropertyList& propertyList
 870 kumpf 1.65 )
 871 mike  1.27 {
 872 kumpf 1.48     CIMRequestMessage* request = new CIMEnumerateInstancesRequestMessage(
 873            	String::EMPTY,
 874 mike  1.31 	nameSpace,
 875            	className,
 876            	deepInheritance,
 877            	localOnly,
 878            	includeQualifiers,
 879            	includeClassOrigin,
 880            	propertyList,
 881            	QueueIdStack());
 882                
 883 kumpf 1.48     Message* message = _doRequest(request, CIM_ENUMERATE_INSTANCES_RESPONSE_MESSAGE);
 884 mike  1.31     
 885                CIMEnumerateInstancesResponseMessage* response = 
 886                    (CIMEnumerateInstancesResponseMessage*)message;
 887                
 888                Destroyer<CIMEnumerateInstancesResponseMessage> destroyer(response);
 889                
 890                return(response->cimNamedInstances);
 891 mike  1.27 }
 892            
 893 kumpf 1.56 Array<CIMObjectPath> CIMClientRep::enumerateInstanceNames(
 894 kumpf 1.64     const CIMNamespaceName& nameSpace,
 895                const CIMName& className
 896 kumpf 1.65 )
 897 mike  1.27 {
 898 kumpf 1.48     CIMRequestMessage* request = new CIMEnumerateInstanceNamesRequestMessage(
 899            	String::EMPTY,
 900 mike  1.31 	nameSpace,
 901            	className,
 902            	QueueIdStack());
 903                
 904 kumpf 1.48     Message* message = _doRequest(request, CIM_ENUMERATE_INSTANCE_NAMES_RESPONSE_MESSAGE);
 905 mike  1.31     
 906                CIMEnumerateInstanceNamesResponseMessage* response = 
 907                    (CIMEnumerateInstanceNamesResponseMessage*)message;
 908                
 909                Destroyer<CIMEnumerateInstanceNamesResponseMessage> destroyer(response);
 910                
 911                return(response->instanceNames);
 912 mike  1.27 }
 913            
 914 kumpf 1.61 Array<CIMObject> CIMClientRep::execQuery(
 915 kumpf 1.64     const CIMNamespaceName& nameSpace,
 916 mike  1.27     const String& queryLanguage,
 917 kumpf 1.49     const String& query
 918 kumpf 1.65 )
 919 mike  1.27 {
 920 kumpf 1.48     CIMRequestMessage* request = new CIMExecQueryRequestMessage(
 921            	String::EMPTY,
 922 kumpf 1.41 	nameSpace,
 923 mike  1.31 	queryLanguage,
 924            	query,
 925            	QueueIdStack());
 926                
 927 kumpf 1.48     Message* message = _doRequest(request, CIM_EXEC_QUERY_RESPONSE_MESSAGE);
 928 mike  1.31     
 929                CIMExecQueryResponseMessage* response = 
 930                    (CIMExecQueryResponseMessage*)message;
 931                
 932                Destroyer<CIMExecQueryResponseMessage> destroyer(response);
 933                
 934 kumpf 1.42     return(response->cimObjects);
 935 mike  1.27 }
 936            
 937 kumpf 1.61 Array<CIMObject> CIMClientRep::associators(
 938 kumpf 1.64     const CIMNamespaceName& nameSpace,
 939 kumpf 1.56     const CIMObjectPath& objectName,
 940 kumpf 1.64     const CIMName& assocClass,
 941                const CIMName& resultClass,
 942 mike  1.27     const String& role,
 943                const String& resultRole,
 944                Boolean includeQualifiers,
 945                Boolean includeClassOrigin,
 946 kumpf 1.49     const CIMPropertyList& propertyList
 947 kumpf 1.65 )
 948 mike  1.27 {
 949 kumpf 1.48     CIMRequestMessage* request = new CIMAssociatorsRequestMessage(
 950            	String::EMPTY,
 951 mike  1.31 	nameSpace,
 952            	objectName,
 953            	assocClass,
 954            	resultClass,
 955            	role,
 956            	resultRole,
 957            	includeQualifiers,
 958            	includeClassOrigin,
 959            	propertyList,
 960            	QueueIdStack());
 961                
 962 kumpf 1.48     Message* message = _doRequest(request, CIM_ASSOCIATORS_RESPONSE_MESSAGE);
 963 mike  1.31     
 964                CIMAssociatorsResponseMessage* response = 
 965                    (CIMAssociatorsResponseMessage*)message;
 966                
 967                Destroyer<CIMAssociatorsResponseMessage> destroyer(response);
 968                
 969                return(response->cimObjects);
 970 mike  1.27 }
 971            
 972 kumpf 1.56 Array<CIMObjectPath> CIMClientRep::associatorNames(
 973 kumpf 1.64     const CIMNamespaceName& nameSpace,
 974 kumpf 1.56     const CIMObjectPath& objectName,
 975 kumpf 1.64     const CIMName& assocClass,
 976                const CIMName& resultClass,
 977 mike  1.27     const String& role,
 978 kumpf 1.49     const String& resultRole
 979 kumpf 1.65 )
 980 mike  1.27 {
 981 kumpf 1.48     CIMRequestMessage* request = new CIMAssociatorNamesRequestMessage(
 982            	String::EMPTY,
 983 mike  1.31 	nameSpace,
 984            	objectName,
 985            	assocClass,
 986            	resultClass,
 987            	role,
 988            	resultRole,
 989            	QueueIdStack());
 990                
 991 kumpf 1.48     Message* message = _doRequest(request, CIM_ASSOCIATOR_NAMES_RESPONSE_MESSAGE);
 992 mike  1.31     
 993                CIMAssociatorNamesResponseMessage* response = 
 994                    (CIMAssociatorNamesResponseMessage*)message;
 995                
 996                Destroyer<CIMAssociatorNamesResponseMessage> destroyer(response);
 997                
 998                return(response->objectNames);
 999 mike  1.27 }
1000            
1001 kumpf 1.61 Array<CIMObject> CIMClientRep::references(
1002 kumpf 1.64     const CIMNamespaceName& nameSpace,
1003 kumpf 1.56     const CIMObjectPath& objectName,
1004 kumpf 1.64     const CIMName& resultClass,
1005 mike  1.27     const String& role,
1006                Boolean includeQualifiers,
1007                Boolean includeClassOrigin,
1008 kumpf 1.49     const CIMPropertyList& propertyList
1009 kumpf 1.65 )
1010 mike  1.27 {
1011 kumpf 1.48     CIMRequestMessage* request = new CIMReferencesRequestMessage(
1012            	String::EMPTY,
1013 mike  1.31 	nameSpace,
1014            	objectName,
1015            	resultClass,
1016            	role,
1017            	includeQualifiers,
1018            	includeClassOrigin,
1019            	propertyList,
1020            	QueueIdStack());
1021                
1022 kumpf 1.48     Message* message = _doRequest(request, CIM_REFERENCES_RESPONSE_MESSAGE);
1023 mike  1.31     
1024                CIMReferencesResponseMessage* response = 
1025                    (CIMReferencesResponseMessage*)message;
1026                
1027                Destroyer<CIMReferencesResponseMessage> destroyer(response);
1028                
1029                return(response->cimObjects);
1030 mike  1.27 }
1031            
1032 kumpf 1.56 Array<CIMObjectPath> CIMClientRep::referenceNames(
1033 kumpf 1.64     const CIMNamespaceName& nameSpace,
1034 kumpf 1.56     const CIMObjectPath& objectName,
1035 kumpf 1.64     const CIMName& resultClass,
1036 kumpf 1.49     const String& role
1037 kumpf 1.65 )
1038 mike  1.27 {
1039 kumpf 1.48     CIMRequestMessage* request = new CIMReferenceNamesRequestMessage(
1040            	String::EMPTY,
1041 mike  1.31 	nameSpace,
1042            	objectName,
1043            	resultClass,
1044            	role,
1045            	QueueIdStack());
1046                
1047 kumpf 1.48     Message* message = _doRequest(request, CIM_REFERENCE_NAMES_RESPONSE_MESSAGE);
1048 mike  1.31     
1049                CIMReferenceNamesResponseMessage* response = 
1050                    (CIMReferenceNamesResponseMessage*)message;
1051                
1052                Destroyer<CIMReferenceNamesResponseMessage> destroyer(response);
1053                
1054                return(response->objectNames);
1055 mike  1.27 }
1056            
1057 kumpf 1.54 CIMValue CIMClientRep::getProperty(
1058 kumpf 1.64     const CIMNamespaceName& nameSpace,
1059 kumpf 1.56     const CIMObjectPath& instanceName,
1060 kumpf 1.64     const CIMName& propertyName
1061 kumpf 1.65 )
1062 mike  1.27 {
1063 kumpf 1.48     CIMRequestMessage* request = new CIMGetPropertyRequestMessage(
1064            	String::EMPTY,
1065 mike  1.31 	nameSpace,
1066            	instanceName,
1067            	propertyName,
1068            	QueueIdStack());
1069                
1070 kumpf 1.48     Message* message = _doRequest(request, CIM_GET_PROPERTY_RESPONSE_MESSAGE);
1071 mike  1.31     
1072                CIMGetPropertyResponseMessage* response = 
1073                    (CIMGetPropertyResponseMessage*)message;
1074                
1075                Destroyer<CIMGetPropertyResponseMessage> destroyer(response);
1076                
1077                return(response->value);
1078 mike  1.27 }
1079            
1080 kumpf 1.54 void CIMClientRep::setProperty(
1081 kumpf 1.64     const CIMNamespaceName& nameSpace,
1082 kumpf 1.56     const CIMObjectPath& instanceName,
1083 kumpf 1.64     const CIMName& propertyName,
1084 kumpf 1.49     const CIMValue& newValue
1085 kumpf 1.65 )
1086 mike  1.27 {
1087 kumpf 1.48     CIMRequestMessage* request = new CIMSetPropertyRequestMessage(
1088            	String::EMPTY,
1089 mike  1.31 	nameSpace,
1090            	instanceName,
1091            	propertyName,
1092            	newValue,
1093            	QueueIdStack());
1094                
1095 kumpf 1.48     Message* message = _doRequest(request, CIM_SET_PROPERTY_RESPONSE_MESSAGE);
1096 mike  1.31     
1097                CIMSetPropertyResponseMessage* response = 
1098                    (CIMSetPropertyResponseMessage*)message;
1099                
1100                Destroyer<CIMSetPropertyResponseMessage> destroyer(response);
1101 mike  1.27 }
1102            
1103 kumpf 1.54 CIMQualifierDecl CIMClientRep::getQualifier(
1104 kumpf 1.64     const CIMNamespaceName& nameSpace,
1105                const CIMName& qualifierName
1106 kumpf 1.65 )
1107 mike  1.27 {
1108 kumpf 1.48     CIMRequestMessage* request = new CIMGetQualifierRequestMessage(
1109            	String::EMPTY,
1110 mike  1.31 	nameSpace,
1111            	qualifierName,
1112            	QueueIdStack());
1113                
1114 kumpf 1.48     Message* message = _doRequest(request, CIM_GET_QUALIFIER_RESPONSE_MESSAGE);
1115 mike  1.31     
1116                CIMGetQualifierResponseMessage* response = 
1117                    (CIMGetQualifierResponseMessage*)message;
1118                
1119                Destroyer<CIMGetQualifierResponseMessage> destroyer(response);
1120                
1121                return(response->cimQualifierDecl);
1122 mike  1.27 }
1123            
1124 kumpf 1.54 void CIMClientRep::setQualifier(
1125 kumpf 1.64     const CIMNamespaceName& nameSpace,
1126 kumpf 1.49     const CIMQualifierDecl& qualifierDeclaration
1127 kumpf 1.65 )
1128 mike  1.27 {
1129 kumpf 1.48     CIMRequestMessage* request = new CIMSetQualifierRequestMessage(
1130            	String::EMPTY,
1131 mike  1.31 	nameSpace,
1132            	qualifierDeclaration,
1133            	QueueIdStack());
1134                
1135 kumpf 1.48     Message* message = _doRequest(request, CIM_SET_QUALIFIER_RESPONSE_MESSAGE);
1136 mike  1.31     
1137                CIMSetQualifierResponseMessage* response = 
1138                    (CIMSetQualifierResponseMessage*)message;
1139                
1140                Destroyer<CIMSetQualifierResponseMessage> destroyer(response);
1141 mike  1.27 }
1142            
1143 kumpf 1.54 void CIMClientRep::deleteQualifier(
1144 kumpf 1.64     const CIMNamespaceName& nameSpace,
1145                const CIMName& qualifierName
1146 kumpf 1.65 )
1147 mike  1.27 {
1148 kumpf 1.48     CIMRequestMessage* request = new CIMDeleteQualifierRequestMessage(
1149            	String::EMPTY,
1150 mike  1.31 	nameSpace,
1151            	qualifierName,
1152            	QueueIdStack());
1153                
1154 kumpf 1.48     Message* message = _doRequest(request, CIM_DELETE_QUALIFIER_RESPONSE_MESSAGE);
1155 mike  1.31     
1156                CIMDeleteQualifierResponseMessage* response = 
1157                    (CIMDeleteQualifierResponseMessage*)message;
1158                
1159                Destroyer<CIMDeleteQualifierResponseMessage> destroyer(response);
1160 mike  1.27 }
1161            
1162 kumpf 1.54 Array<CIMQualifierDecl> CIMClientRep::enumerateQualifiers(
1163 kumpf 1.64     const CIMNamespaceName& nameSpace
1164 kumpf 1.65 )
1165 mike  1.27 {
1166 kumpf 1.48     CIMRequestMessage* request = new CIMEnumerateQualifiersRequestMessage(
1167            	String::EMPTY,
1168 mike  1.31 	nameSpace,
1169            	QueueIdStack());
1170                
1171 kumpf 1.48     Message* message = _doRequest(request, CIM_ENUMERATE_QUALIFIERS_RESPONSE_MESSAGE);
1172 mike  1.31     
1173                CIMEnumerateQualifiersResponseMessage* response = 
1174                    (CIMEnumerateQualifiersResponseMessage*)message;
1175                
1176                Destroyer<CIMEnumerateQualifiersResponseMessage> destroyer(response);
1177                
1178                return(response->qualifierDeclarations);
1179            }
1180            
1181 kumpf 1.54 CIMValue CIMClientRep::invokeMethod(
1182 kumpf 1.64     const CIMNamespaceName& nameSpace,
1183 kumpf 1.56     const CIMObjectPath& instanceName,
1184 kumpf 1.64     const CIMName& methodName,
1185 mike  1.31     const Array<CIMParamValue>& inParameters,
1186 kumpf 1.49     Array<CIMParamValue>& outParameters
1187 kumpf 1.65 )
1188 mike  1.31 {
1189 kumpf 1.34     // ATTN-RK-P2-20020301: Does it make sense to have a nameSpace parameter
1190                // when the namespace should already be included in the instanceName?
1191                // ATTN-RK-P3-20020301: Do we need to make sure the caller didn't specify
1192                // a host name in the instanceName?
1193            
1194 kumpf 1.48     CIMRequestMessage* request = new CIMInvokeMethodRequestMessage(
1195            	String::EMPTY,
1196 mike  1.31 	nameSpace,
1197            	instanceName,
1198            	methodName,
1199            	inParameters,
1200            	QueueIdStack());
1201                
1202 kumpf 1.48     Message* message = _doRequest(request, CIM_INVOKE_METHOD_RESPONSE_MESSAGE);
1203 mike  1.31     
1204                CIMInvokeMethodResponseMessage* response = 
1205                    (CIMInvokeMethodResponseMessage*)message;
1206                
1207                Destroyer<CIMInvokeMethodResponseMessage> destroyer(response);
1208                
1209                outParameters = response->outParameters;
1210                
1211                return(response->retValue);
1212            }
1213            
1214 kumpf 1.54 Message* CIMClientRep::_doRequest(
1215 kumpf 1.48     CIMRequestMessage * request,
1216 kumpf 1.49     const Uint32 expectedResponseMessageType
1217 kumpf 1.65 )
1218 mike  1.31 {
1219                if (!_connected)
1220 kumpf 1.48     {
1221                    delete request;
1222 kumpf 1.65 	throw NotConnectedException();
1223 kumpf 1.48     }
1224 mike  1.31     
1225 kumpf 1.48     String messageId = XmlWriter::getNextMessageId();
1226                const_cast<String &>(request->messageId) = messageId;
1227            
1228                _authenticator.clearRequest();
1229            
1230 kumpf 1.49     // ATTN-RK-P2-20020416: We should probably clear out the queue first.
1231 kumpf 1.48     PEGASUS_ASSERT(getCount() == 0);  // Shouldn't be any messages in our queue
1232 mike  1.27 
1233 kumpf 1.79     //
1234                //  Set HTTP method in request to M-POST
1235                //
1236                request->setHttpMethod (HTTP_METHOD_M_POST);
1237            
1238 kumpf 1.48     _requestEncoder->enqueue(request);
1239            
1240 kumpf 1.51     Uint64 startMilliseconds = TimeValue::getCurrentTime().toMilliseconds();
1241                Uint64 nowMilliseconds = startMilliseconds;
1242 kumpf 1.68     Uint64 stopMilliseconds = nowMilliseconds + _timeoutMilliseconds;
1243 kumpf 1.48 
1244                while (nowMilliseconds < stopMilliseconds)
1245 mike  1.31     {
1246            	//
1247            	// Wait until the timeout expires or an event occurs:
1248            	//
1249            
1250 mday  1.58        _monitor->run(Uint32(stopMilliseconds - nowMilliseconds));
1251                   
1252 mike  1.31 	//
1253 kumpf 1.48 	// Check to see if incoming queue has a message
1254 mike  1.31 	//
1255 mike  1.27 
1256 kumpf 1.48 	Message* response = dequeue();
1257 mike  1.31 
1258 kumpf 1.48 	if (response)
1259 mike  1.31 	{
1260 kumpf 1.48             // Shouldn't be any more messages in our queue
1261                        PEGASUS_ASSERT(getCount() == 0);
1262 kumpf 1.79 
1263                        //
1264                        //  ATTN-CAKG-20021001: If HTTP response is 501 Not Implemented
1265                        //  or 510 Not Extended, retry with POST method
1266                        //
1267 mike  1.27 
1268 kumpf 1.49             if (response->getType() == CLIENT_EXCEPTION_MESSAGE)
1269 kumpf 1.48             {
1270 kumpf 1.65                 Exception* clientException =
1271 kumpf 1.52                     ((ClientExceptionMessage*)response)->clientException;
1272 kumpf 1.48                 delete response;
1273 kumpf 1.65                 Destroyer<Exception> d(clientException);
1274 kumpf 1.52                 throw *clientException;
1275 kumpf 1.48             }
1276                        else if (response->getType() == expectedResponseMessageType)
1277                        {
1278                            CIMResponseMessage* cimResponse = (CIMResponseMessage*)response;
1279                            if (cimResponse->messageId != messageId)
1280                            {
1281 kumpf 1.49                     CIMClientResponseException responseException(
1282                                    String("Mismatched response message ID:  Got \"") +
1283                                    cimResponse->messageId + "\", expected \"" +
1284                                    messageId + "\".");
1285                                delete response;
1286            	            throw responseException;
1287 kumpf 1.48                 }
1288                            if (cimResponse->cimException.getCode() != CIM_ERR_SUCCESS)
1289                            {
1290 kumpf 1.66                     CIMException cimException(
1291 kumpf 1.49                         cimResponse->cimException.getCode(),
1292                                    cimResponse->cimException.getMessage());
1293 kumpf 1.48                     delete response;
1294            	            throw cimException;
1295                            }
1296                            return response;
1297                        }
1298                        else
1299                        {
1300 kumpf 1.49                 CIMClientResponseException responseException(
1301                                "Mismatched response message type.");
1302                            delete response;
1303            	        throw responseException;
1304 kumpf 1.48             }
1305 mike  1.31 	}
1306 mike  1.27 
1307 kumpf 1.48         nowMilliseconds = TimeValue::getCurrentTime().toMilliseconds();
1308 mday  1.58 	pegasus_yield();
1309 mike  1.31     }
1310 mike  1.27 
1311 mike  1.31     //
1312 kumpf 1.55     // Reconnect to reset the connection (disregard late response)
1313                //
1314                try
1315                {
1316                    _reconnect();
1317                }
1318                catch (...)
1319                {
1320                }
1321            
1322                //
1323 mike  1.31     // Throw timed out exception:
1324                //
1325 kumpf 1.65     throw ConnectionTimeoutException();
1326 kumpf 1.33 }
1327            
1328 kumpf 1.54 String CIMClientRep::_getLocalHostName()
1329 kumpf 1.33 {
1330                static String hostname;
1331            
1332                if (!hostname.size())
1333                {
1334                    hostname.assign(System::getHostName());
1335                }
1336            
1337                return hostname;
1338 kumpf 1.54 }
1339            
1340            
1341            ///////////////////////////////////////////////////////////////////////////////
1342            //
1343            // CIMClient
1344            //
1345            ///////////////////////////////////////////////////////////////////////////////
1346            
1347 kumpf 1.68 CIMClient::CIMClient()
1348 kumpf 1.54 {
1349 kumpf 1.68     _rep = new CIMClientRep();
1350 kumpf 1.54 }
1351            
1352            CIMClient::~CIMClient()
1353            {
1354                delete _rep;
1355            }
1356            
1357 kumpf 1.68 Uint32 CIMClient::getTimeout() const
1358 kumpf 1.54 {
1359 kumpf 1.68     return _rep->getTimeout();
1360 kumpf 1.54 }
1361            
1362 kumpf 1.68 void CIMClient::setTimeout(Uint32 timeoutMilliseconds)
1363 kumpf 1.54 {
1364 kumpf 1.68     _rep->setTimeout(timeoutMilliseconds);
1365 kumpf 1.54 }
1366            
1367            void CIMClient::connect(
1368 kumpf 1.75     const String& host,
1369                const Uint32 portNumber,
1370 kumpf 1.54     const String& userName,
1371                const String& password
1372 kumpf 1.65 )
1373 kumpf 1.54 {
1374 kumpf 1.75     _rep->connect(host, portNumber, userName, password);
1375 kumpf 1.54 }
1376            
1377            void CIMClient::connect(
1378 kumpf 1.75     const String& host,
1379                const Uint32 portNumber,
1380 kumpf 1.70     const SSLContext& sslContext,
1381 kumpf 1.54     const String& userName,
1382                const String& password
1383 kumpf 1.65 )
1384 kumpf 1.54 {
1385 kumpf 1.75     _rep->connect(host, portNumber, sslContext, userName, password);
1386 kumpf 1.54 }
1387            
1388 kumpf 1.74 #ifndef PEGASUS_REMOVE_DEPRECATED
1389            void CIMClient::connect(
1390 kumpf 1.76     const String& address,
1391                const String& userName,
1392                const String& password
1393 kumpf 1.74 )
1394            {
1395 kumpf 1.75     Uint32 index = address.find (':');
1396                String host = address.subString (0, index);
1397                Uint32 portNumber = 0;
1398                if (index != PEG_NOT_FOUND)
1399                {
1400                    String portStr = address.subString (index + 1, address.size ());
1401                    sscanf (portStr.getCString (), "%u", &portNumber);
1402                }
1403                else
1404 karl  1.80.6.1         throw InvalidLocatorException ("Invalid address, no port separator" + address);
1405 kumpf 1.76         _rep->connect (host, portNumber, userName, password);
1406 kumpf 1.74     }
1407                
1408                void CIMClient::connect(
1409                    const String& address,
1410 kumpf 1.76         const SSLContext& sslContext,
1411                    const String& userName,
1412                    const String& password
1413 kumpf 1.74     )
1414                {
1415 kumpf 1.75         Uint32 index = address.find (':');
1416                    String host = address.subString (0, index);
1417                    Uint32 portNumber = 0;
1418                    if (index != PEG_NOT_FOUND)
1419                    {
1420                        String portStr = address.subString (index + 1, address.size ());
1421                        sscanf (portStr.getCString (), "%u", &portNumber);
1422                    }
1423                    else
1424                        throw InvalidLocatorException (address);
1425 kumpf 1.76         _rep->connect (host, portNumber, sslContext, userName, password);
1426 kumpf 1.74     }
1427                #endif
1428                
1429 kumpf 1.65     void CIMClient::connectLocal()
1430 kumpf 1.54     {
1431 kumpf 1.57         _rep->connectLocal();
1432 kumpf 1.54     }
1433                
1434                void CIMClient::disconnect()
1435                {
1436                    _rep->disconnect();
1437                }
1438                
1439                
1440                CIMClass CIMClient::getClass(
1441 kumpf 1.64         const CIMNamespaceName& nameSpace,
1442                    const CIMName& className,
1443 kumpf 1.54         Boolean localOnly,
1444                    Boolean includeQualifiers,
1445                    Boolean includeClassOrigin,
1446                    const CIMPropertyList& propertyList
1447 kumpf 1.65     )
1448 kumpf 1.54     {
1449                    return _rep->getClass(
1450                        nameSpace,
1451                        className,
1452                        localOnly,
1453                        includeQualifiers,
1454                        includeClassOrigin,
1455                        propertyList);
1456                }
1457                
1458                CIMInstance CIMClient::getInstance(
1459 kumpf 1.64         const CIMNamespaceName& nameSpace,
1460 kumpf 1.56         const CIMObjectPath& instanceName,
1461 kumpf 1.54         Boolean localOnly,
1462                    Boolean includeQualifiers,
1463                    Boolean includeClassOrigin,
1464                    const CIMPropertyList& propertyList
1465 kumpf 1.65     )
1466 kumpf 1.54     {
1467                    return _rep->getInstance(
1468                        nameSpace,
1469                        instanceName,
1470                        localOnly,
1471                        includeQualifiers,
1472                        includeClassOrigin,
1473                        propertyList);
1474                }
1475                
1476                void CIMClient::deleteClass(
1477 kumpf 1.64         const CIMNamespaceName& nameSpace,
1478                    const CIMName& className
1479 kumpf 1.65     )
1480 kumpf 1.54     {
1481                    _rep->deleteClass(
1482                        nameSpace,
1483                        className);
1484                }
1485                
1486                void CIMClient::deleteInstance(
1487 kumpf 1.64         const CIMNamespaceName& nameSpace,
1488 kumpf 1.56         const CIMObjectPath& instanceName
1489 kumpf 1.65     )
1490 kumpf 1.54     {
1491                    _rep->deleteInstance(
1492                        nameSpace,
1493                        instanceName);
1494                }
1495                
1496                void CIMClient::createClass(
1497 kumpf 1.64         const CIMNamespaceName& nameSpace,
1498 kumpf 1.54         const CIMClass& newClass
1499 kumpf 1.65     )
1500 kumpf 1.54     {
1501                    _rep->createClass(
1502                        nameSpace,
1503                        newClass);
1504                }
1505                
1506 kumpf 1.56     CIMObjectPath CIMClient::createInstance(
1507 kumpf 1.64         const CIMNamespaceName& nameSpace,
1508 kumpf 1.54         const CIMInstance& newInstance
1509 kumpf 1.65     )
1510 kumpf 1.54     {
1511                    return _rep->createInstance(
1512                        nameSpace,
1513                        newInstance);
1514                }
1515                
1516                void CIMClient::modifyClass(
1517 kumpf 1.64         const CIMNamespaceName& nameSpace,
1518 kumpf 1.54         const CIMClass& modifiedClass
1519 kumpf 1.65     )
1520 kumpf 1.54     {
1521                    _rep->modifyClass(
1522                        nameSpace,
1523                        modifiedClass);
1524                }
1525                
1526                void CIMClient::modifyInstance(
1527 kumpf 1.64         const CIMNamespaceName& nameSpace,
1528 kumpf 1.60         const CIMInstance& modifiedInstance,
1529 kumpf 1.54         Boolean includeQualifiers,
1530                    const CIMPropertyList& propertyList
1531 kumpf 1.65     )
1532 kumpf 1.54     {
1533                    _rep->modifyInstance(
1534                        nameSpace,
1535                        modifiedInstance,
1536                        includeQualifiers,
1537                        propertyList);
1538                }
1539                
1540                Array<CIMClass> CIMClient::enumerateClasses(
1541 kumpf 1.64         const CIMNamespaceName& nameSpace,
1542                    const CIMName& className,
1543 kumpf 1.54         Boolean deepInheritance,
1544                    Boolean localOnly,
1545                    Boolean includeQualifiers,
1546                    Boolean includeClassOrigin
1547 kumpf 1.65     )
1548 kumpf 1.54     {
1549                    return _rep->enumerateClasses(
1550                        nameSpace,
1551                        className,
1552                        deepInheritance,
1553                        localOnly,
1554                        includeQualifiers,
1555                        includeClassOrigin);
1556                }
1557                
1558 kumpf 1.64     Array<CIMName> CIMClient::enumerateClassNames(
1559                    const CIMNamespaceName& nameSpace,
1560                    const CIMName& className,
1561 kumpf 1.54         Boolean deepInheritance
1562 kumpf 1.65     )
1563 kumpf 1.54     {
1564                    return _rep->enumerateClassNames(
1565                        nameSpace,
1566                        className,
1567                        deepInheritance);
1568                }
1569                
1570 kumpf 1.60     Array<CIMInstance> CIMClient::enumerateInstances(
1571 kumpf 1.64         const CIMNamespaceName& nameSpace,
1572                    const CIMName& className,
1573 kumpf 1.54         Boolean deepInheritance,
1574                    Boolean localOnly,
1575                    Boolean includeQualifiers,
1576                    Boolean includeClassOrigin,
1577                    const CIMPropertyList& propertyList
1578 kumpf 1.65     )
1579 kumpf 1.54     {
1580                    return _rep->enumerateInstances(
1581                        nameSpace,
1582                        className,
1583                        deepInheritance,
1584                        localOnly,
1585                        includeQualifiers,
1586                        includeClassOrigin,
1587                        propertyList);
1588                }
1589                
1590 kumpf 1.56     Array<CIMObjectPath> CIMClient::enumerateInstanceNames(
1591 kumpf 1.64         const CIMNamespaceName& nameSpace,
1592                    const CIMName& className
1593 kumpf 1.65     )
1594 kumpf 1.54     {
1595                    return _rep->enumerateInstanceNames(
1596                        nameSpace,
1597                        className);
1598                }
1599                
1600 kumpf 1.61     Array<CIMObject> CIMClient::execQuery(
1601 kumpf 1.64         const CIMNamespaceName& nameSpace,
1602 kumpf 1.54         const String& queryLanguage,
1603                    const String& query
1604 kumpf 1.65     )
1605 kumpf 1.54     {
1606                    return _rep->execQuery(
1607                        nameSpace,
1608                        queryLanguage,
1609                        query);
1610                }
1611                
1612 kumpf 1.61     Array<CIMObject> CIMClient::associators(
1613 kumpf 1.64         const CIMNamespaceName& nameSpace,
1614 kumpf 1.56         const CIMObjectPath& objectName,
1615 kumpf 1.64         const CIMName& assocClass,
1616                    const CIMName& resultClass,
1617 kumpf 1.54         const String& role,
1618                    const String& resultRole,
1619                    Boolean includeQualifiers,
1620                    Boolean includeClassOrigin,
1621                    const CIMPropertyList& propertyList
1622 kumpf 1.65     )
1623 kumpf 1.54     {
1624                    return _rep->associators(
1625                        nameSpace,
1626                        objectName,
1627                        assocClass,
1628                        resultClass,
1629                        role,
1630                        resultRole,
1631                        includeQualifiers,
1632                        includeClassOrigin,
1633                        propertyList);
1634                }
1635                
1636 kumpf 1.56     Array<CIMObjectPath> CIMClient::associatorNames(
1637 kumpf 1.64         const CIMNamespaceName& nameSpace,
1638 kumpf 1.56         const CIMObjectPath& objectName,
1639 kumpf 1.64         const CIMName& assocClass,
1640                    const CIMName& resultClass,
1641 kumpf 1.54         const String& role,
1642                    const String& resultRole
1643 kumpf 1.65     )
1644 kumpf 1.54     {
1645                    return _rep->associatorNames(
1646                        nameSpace,
1647                        objectName,
1648                        assocClass,
1649                        resultClass,
1650                        role,
1651                        resultRole);
1652                }
1653                
1654 kumpf 1.61     Array<CIMObject> CIMClient::references(
1655 kumpf 1.64         const CIMNamespaceName& nameSpace,
1656 kumpf 1.56         const CIMObjectPath& objectName,
1657 kumpf 1.64         const CIMName& resultClass,
1658 kumpf 1.54         const String& role,
1659                    Boolean includeQualifiers,
1660                    Boolean includeClassOrigin,
1661                    const CIMPropertyList& propertyList
1662 kumpf 1.65     )
1663 kumpf 1.54     {
1664                    return _rep->references(
1665                        nameSpace,
1666                        objectName,
1667                        resultClass,
1668                        role,
1669                        includeQualifiers,
1670                        includeClassOrigin,
1671                        propertyList);
1672                }
1673                
1674 kumpf 1.56     Array<CIMObjectPath> CIMClient::referenceNames(
1675 kumpf 1.64         const CIMNamespaceName& nameSpace,
1676 kumpf 1.56         const CIMObjectPath& objectName,
1677 kumpf 1.64         const CIMName& resultClass,
1678 kumpf 1.54         const String& role
1679 kumpf 1.65     )
1680 kumpf 1.54     {
1681                    return _rep->referenceNames(
1682                        nameSpace,
1683                        objectName,
1684                        resultClass,
1685                        role);
1686                }
1687                
1688                CIMValue CIMClient::getProperty(
1689 kumpf 1.64         const CIMNamespaceName& nameSpace,
1690 kumpf 1.56         const CIMObjectPath& instanceName,
1691 kumpf 1.64         const CIMName& propertyName
1692 kumpf 1.65     )
1693 kumpf 1.54     {
1694                    return _rep->getProperty(
1695                        nameSpace,
1696                        instanceName,
1697                        propertyName);
1698                }
1699                
1700                void CIMClient::setProperty(
1701 kumpf 1.64         const CIMNamespaceName& nameSpace,
1702 kumpf 1.56         const CIMObjectPath& instanceName,
1703 kumpf 1.64         const CIMName& propertyName,
1704 kumpf 1.54         const CIMValue& newValue
1705 kumpf 1.65     )
1706 kumpf 1.54     {
1707                    _rep->setProperty(
1708                        nameSpace,
1709                        instanceName,
1710                        propertyName,
1711                        newValue);
1712                }
1713                
1714                CIMQualifierDecl CIMClient::getQualifier(
1715 kumpf 1.64         const CIMNamespaceName& nameSpace,
1716                    const CIMName& qualifierName
1717 kumpf 1.65     )
1718 kumpf 1.54     {
1719                    return _rep->getQualifier(
1720                        nameSpace,
1721                        qualifierName);
1722                }
1723                
1724                void CIMClient::setQualifier(
1725 kumpf 1.64         const CIMNamespaceName& nameSpace,
1726 kumpf 1.54         const CIMQualifierDecl& qualifierDeclaration
1727 kumpf 1.65     )
1728 kumpf 1.54     {
1729                    _rep->setQualifier(
1730                        nameSpace,
1731                        qualifierDeclaration);
1732                }
1733                
1734                void CIMClient::deleteQualifier(
1735 kumpf 1.64         const CIMNamespaceName& nameSpace,
1736                    const CIMName& qualifierName
1737 kumpf 1.65     )
1738 kumpf 1.54     {
1739                    _rep->deleteQualifier(
1740                        nameSpace,
1741                        qualifierName);
1742                }
1743                
1744                Array<CIMQualifierDecl> CIMClient::enumerateQualifiers(
1745 kumpf 1.64         const CIMNamespaceName& nameSpace
1746 kumpf 1.65     )
1747 kumpf 1.54     {
1748                    return _rep->enumerateQualifiers(
1749                        nameSpace);
1750                }
1751                
1752                CIMValue CIMClient::invokeMethod(
1753 kumpf 1.64         const CIMNamespaceName& nameSpace,
1754 kumpf 1.56         const CIMObjectPath& instanceName,
1755 kumpf 1.64         const CIMName& methodName,
1756 kumpf 1.54         const Array<CIMParamValue>& inParameters,
1757                    Array<CIMParamValue>& outParameters
1758 kumpf 1.65     )
1759 kumpf 1.54     {
1760                    return _rep->invokeMethod(
1761                        nameSpace,
1762                        instanceName,
1763                        methodName,
1764                        inParameters,
1765                        outParameters);
1766 mike  1.27     }
1767                
1768                PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2