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

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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2