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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2