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

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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2