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

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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2