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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2