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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2