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

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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2