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

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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2