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

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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2