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

   1 martin 1.8 //%LICENSE////////////////////////////////////////////////////////////////
   2 martin 1.9 //
   3 martin 1.8 // 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.9 //
  10 martin 1.8 // 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.9 //
  17 martin 1.8 // The above copyright notice and this permission notice shall be included
  18            // in all copies or substantial portions of the Software.
  19 martin 1.9 //
  20 martin 1.8 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  21 martin 1.9 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  22 martin 1.8 // 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.9 //
  28 martin 1.8 //////////////////////////////////////////////////////////////////////////
  29 kumpf  1.2 //
  30            //%////////////////////////////////////////////////////////////////////////////
  31            
  32            #include <cctype>
  33            #include <cstdio>
  34            #include <Pegasus/Common/Config.h>
  35            #include <Pegasus/Common/Tracer.h>
  36 dmitry.mikulin 1.3 #include <Pegasus/Common/String.h>
  37                    #include <Pegasus/Common/StringConversion.h>
  38 kumpf          1.2 #include <Pegasus/Common/MessageLoader.h>
  39                    #include <Pegasus/WsmServer/WsmConstants.h>
  40 mike           1.12 #include <Pegasus/WQL/WQLSelectStatement.h>
  41                     #include <Pegasus/WQL/WQLParser.h>
  42 karl           1.14 #include <Pegasus/Common/Tracer.h>
  43 kumpf          1.2  #include "CimToWsmResponseMapper.h"
  44                     
  45 carson.hovey   1.4  #ifdef PEGASUS_OS_VMS
  46                     # define PEGASUS_NAN "NaNQ"
  47                     # define PEGASUS_INF "Infinity"
  48                     # define PEGASUS_NEG_INF "-Infinity"
  49                     #else
  50                     # define PEGASUS_NAN "nan"
  51                     # define PEGASUS_INF "inf"
  52                     # define PEGASUS_NEG_INF "-inf"
  53                     #endif
  54                     
  55 dmitry.mikulin 1.3  PEGASUS_USING_STD;
  56 kumpf          1.2  PEGASUS_NAMESPACE_BEGIN
  57                     
  58                     CimToWsmResponseMapper::CimToWsmResponseMapper()
  59                     {
  60                     }
  61                     
  62                     CimToWsmResponseMapper::~CimToWsmResponseMapper()
  63                     {
  64                     }
  65                     
  66                     WsmResponse* CimToWsmResponseMapper::mapToWsmResponse(
  67                         const WsmRequest* wsmRequest,
  68                         const CIMResponseMessage* message)
  69                     {
  70 karl           1.14     PEG_METHOD_ENTER(TRC_WSMSERVER, "CimToWsmResponseMapper::mapToWsmResponse");
  71 kumpf          1.2      AutoPtr<WsmResponse> wsmResponse;
  72                     
  73                         if (message->cimException.getCode() != CIM_ERR_SUCCESS)
  74                         {
  75                             wsmResponse.reset(_mapToWsmFaultResponse(wsmRequest, message));
  76                         }
  77                         else
  78                         {
  79 kumpf          1.6          switch (wsmRequest->getType())
  80 kumpf          1.2          {
  81 kumpf          1.6              case WS_TRANSFER_GET:
  82                                     wsmResponse.reset(_mapToWxfGetResponse(
  83                                         (WxfGetRequest*) wsmRequest,
  84 kumpf          1.2                      (CIMGetInstanceResponseMessage*) message));
  85                                     break;
  86                     
  87 kumpf          1.6              case WS_TRANSFER_PUT:
  88                                     wsmResponse.reset(_mapToWxfPutResponse(
  89                                         (WxfPutRequest*) wsmRequest,
  90 kumpf          1.2                      (CIMModifyInstanceResponseMessage*) message));
  91                                     break;
  92                     
  93 kumpf          1.6              case WS_TRANSFER_CREATE:
  94                                     wsmResponse.reset(_mapToWxfCreateResponse(
  95                                         (WxfCreateRequest*) wsmRequest,
  96 kumpf          1.2                      (CIMCreateInstanceResponseMessage*) message));
  97                                     break;
  98                     
  99 kumpf          1.6              case WS_TRANSFER_DELETE:
 100                                     wsmResponse.reset(_mapToWxfDeleteResponse(
 101                                         (WxfDeleteRequest*) wsmRequest,
 102 kumpf          1.2                      (CIMDeleteInstanceResponseMessage*) message));
 103                                     break;
 104                     
 105 kumpf          1.6              case WS_ENUMERATION_ENUMERATE:
 106 karl           1.14                 // Test for no association filter
 107                                     if (((WsenEnumerateRequest*)wsmRequest)->
 108                                         wsmFilter.filterDialect != WsmFilter::ASSOCIATION)
 109 kumpf          1.6                  {
 110 karl           1.14                     if (((WsenEnumerateRequest*) wsmRequest)->enumerationMode ==
 111                                             WSEN_EM_OBJECT)
 112                                         {
 113                                             wsmResponse.reset(_mapToWsenEnumerateResponseObject(
 114                                                 (WsenEnumerateRequest*) wsmRequest,
 115                                                 (CIMEnumerateInstancesResponseMessage*) message));
 116                                         }
 117                                         else if (((WsenEnumerateRequest*)wsmRequest)->
 118                                                  enumerationMode ==
 119                                                      WSEN_EM_OBJECT_AND_EPR)
 120                                         {
 121                                             wsmResponse.reset(
 122                                                 _mapToWsenEnumerateResponseObjectAndEPR(
 123                                                   (WsenEnumerateRequest*) wsmRequest,
 124                                                   (CIMEnumerateInstancesResponseMessage*) message));
 125                                         }
 126                                         else if (((WsenEnumerateRequest*) wsmRequest)->
 127                                                  enumerationMode == WSEN_EM_EPR)
 128                                         {
 129                                             wsmResponse.reset(_mapToWsenEnumerateResponseEPR(
 130                                                 (WsenEnumerateRequest*) wsmRequest,
 131 karl           1.14                             (CIMEnumerateInstanceNamesResponseMessage*)
 132                                                     message));
 133                                         }
 134                                         else
 135                                         {
 136                                             PEGASUS_ASSERT(0);
 137                                         }
 138 kumpf          1.6                  }
 139 karl           1.14                 else // association or reference response expected
 140 kumpf          1.6                  {
 141 karl           1.14                     if (((WsenEnumerateRequest*)wsmRequest)->
 142                                             wsmFilter.AssocFilter.assocFilterType ==
 143                                                WsmFilter::ASSOCIATED_INSTANCES)
 144                                         {
 145                                             // Association responses
 146                                             if (((WsenEnumerateRequest*) wsmRequest)->
 147                                                 enumerationMode == WSEN_EM_OBJECT)
 148                                             {
 149                                                 wsmResponse.reset(
 150                                                     _mapToWsenEnumerateResponseObject(
 151                                                         (WsenEnumerateRequest*) wsmRequest,
 152                                                         (CIMAssociatorsResponseMessage*) message));
 153                                             }
 154                                             else if (((WsenEnumerateRequest*)
 155                                                           wsmRequest)->enumerationMode ==
 156                                                      WSEN_EM_OBJECT_AND_EPR)
 157                                             {
 158                                                 wsmResponse.reset(
 159                                                     _mapToWsenEnumerateResponseObjectAndEPR(
 160                                                         (WsenEnumerateRequest*) wsmRequest,
 161                                                         (CIMAssociatorsResponseMessage*) message));
 162 karl           1.14                         }
 163                                             else if (((WsenEnumerateRequest*) wsmRequest)->
 164                                                      enumerationMode == WSEN_EM_EPR)
 165                                             {
 166                                                 wsmResponse.reset(_mapToWsenEnumerateResponseEPR(
 167                                                     (WsenEnumerateRequest*) wsmRequest,
 168                                                     (CIMAssociatorNamesResponseMessage*) message));
 169                                             }
 170                                             else
 171                                             {
 172                                                 PEGASUS_ASSERT(0);
 173                                             }
 174                                         }
 175                                         else // references responses
 176                                         {
 177                                             if (((WsenEnumerateRequest*)
 178                                                  wsmRequest)->enumerationMode == WSEN_EM_OBJECT)
 179                                             {
 180                                                 wsmResponse.reset(_mapToWsenEnumerateResponseObject(
 181                                                     (WsenEnumerateRequest*) wsmRequest,
 182                                                     (CIMReferencesResponseMessage*) message));
 183 karl           1.14                         }
 184                                             else if (((WsenEnumerateRequest*)
 185                                                           wsmRequest)->enumerationMode ==
 186                                                      WSEN_EM_OBJECT_AND_EPR)
 187                                             {
 188                                                 wsmResponse.reset(
 189                                                     _mapToWsenEnumerateResponseObjectAndEPR(
 190                                                         (WsenEnumerateRequest*) wsmRequest,
 191                                                         (CIMReferencesResponseMessage*) message));
 192                                             }
 193                                             else if (((WsenEnumerateRequest*) wsmRequest)->
 194                                                      enumerationMode == WSEN_EM_EPR)
 195                                             {
 196                                                 wsmResponse.reset(_mapToWsenEnumerateResponseEPR(
 197                                                     (WsenEnumerateRequest*) wsmRequest,
 198                                                     (CIMReferenceNamesResponseMessage*) message));
 199                                             }
 200                                             else
 201                                             {
 202                                                 PEGASUS_ASSERT(0);
 203                                             }
 204 karl           1.14                     }
 205 kumpf          1.6                  }
 206                                     break;
 207                     
 208 mike           1.12             case WS_INVOKE:
 209                                 {
 210                                     wsmResponse.reset(_mapToWsInvokeResponse(
 211                                         (WsInvokeRequest*)wsmRequest,
 212                                         (CIMInvokeMethodResponseMessage*)message));
 213                                     break;
 214                                 }
 215                     
 216 kumpf          1.2              default:
 217                                     PEGASUS_ASSERT(0);
 218                                     break;
 219                             }
 220                         }
 221 karl           1.14     PEG_METHOD_EXIT();
 222 kumpf          1.2      return wsmResponse.release();
 223                     }
 224                     
 225                     WsmFaultResponse* CimToWsmResponseMapper::_mapToWsmFaultResponse(
 226                         const WsmRequest* wsmRequest,
 227                         const CIMResponseMessage* response)
 228                     {
 229                         WsmFault fault = mapCimExceptionToWsmFault(response->cimException);
 230                     
 231                         WsmFaultResponse* wsmResponse = new WsmFaultResponse(wsmRequest, fault);
 232                     
 233                         return wsmResponse;
 234                     }
 235                     
 236                     WsmFault CimToWsmResponseMapper::mapCimExceptionToWsmFault(
 237                         const CIMException& cimException)
 238                     {
 239                         WsmFault::Subcode subcode;
 240                         const ContentLanguageList& languageList =
 241                             cimException.getContentLanguages();
 242                         String reason = TraceableCIMException(cimException).getDescription();
 243 kumpf          1.2      String faultDetail;
 244                     
 245                         switch (cimException.getCode())
 246                         {
 247                             case CIM_ERR_FAILED:                // Too general to specify fault
 248                             case CIM_ERR_CLASS_HAS_CHILDREN:    // Only ModifyClass and DeleteClass
 249                             case CIM_ERR_CLASS_HAS_INSTANCES:   // Only ModifyClass and DeleteClass
 250                             case CIM_ERR_INVALID_SUPERCLASS:    // Only CreateClass and ModifyClass
 251                             // These could map to wsa_ActionNotSupported if InvokeMethod is
 252                             // supported through Custom Actions.
 253                             case CIM_ERR_METHOD_NOT_FOUND:      // Only InvokeMethod
 254                             case CIM_ERR_METHOD_NOT_AVAILABLE:  // Only InvokeMethod
 255                             case CIM_ERR_NO_SUCH_PROPERTY:      // Only GetProperty and SetProperty
 256                             case CIM_ERR_TYPE_MISMATCH:         // Only SetProperty
 257                                 subcode = WsmFault::wsman_InternalError;
 258                                 break;
 259                     
 260                             case CIM_ERR_ACCESS_DENIED:
 261                                 subcode = WsmFault::wsman_AccessDenied;
 262                                 break;
 263                     
 264 kumpf          1.2          case CIM_ERR_ALREADY_EXISTS:
 265                                 subcode = WsmFault::wsman_AlreadyExists;
 266                                 break;
 267                     
 268                             case CIM_ERR_INVALID_CLASS:
 269                                 subcode = WsmFault::wsa_DestinationUnreachable;
 270                                 faultDetail = WSMAN_FAULTDETAIL_INVALIDRESOURCEURI;
 271                                 break;
 272                     
 273                             case CIM_ERR_INVALID_NAMESPACE:
 274                                 // Consider wsman_InvalidSelectors?
 275                                 subcode = WsmFault::wsa_DestinationUnreachable;
 276                                 // faultDetail is not set to WSMAN_FAULTDETAIL_INVALIDRESOURCEURI
 277                                 // since this error reflects an incorrect Selector value rather
 278                                 // than an incorrect ResourceURI.
 279                                 break;
 280                     
 281                             case CIM_ERR_INVALID_PARAMETER:
 282                                 // For InvokeMethod, this would map to wsman_InvalidParameter.
 283                                 // It is difficult to discern the correct fault for other
 284                                 // operations.  It make sense to use wxf_InvalidRepresentation for
 285 kumpf          1.2              // Create and Put, and wsman_InvalidSelectors for Get and Put.
 286                                 subcode = WsmFault::wsman_InvalidParameter;
 287                                 break;
 288                     
 289                             case CIM_ERR_INVALID_QUERY:
 290                                 // Note that Enumerate operations have a different subcode:
 291                                 // wsen_CannotProcessFilter.
 292                                 subcode = WsmFault::wsen_CannotProcessFilter;
 293                                 break;
 294                     
 295                             case CIM_ERR_NOT_FOUND:
 296                                 // DSP0226 Table 10 of master faults calls for
 297 karl           1.14             // DestinationUnreachable in cases when the resource is not found.
 298 kumpf          1.2              subcode = WsmFault::wsa_DestinationUnreachable;
 299                                 break;
 300                     
 301                             case CIM_ERR_NOT_SUPPORTED:
 302                                 subcode = WsmFault::wsa_ActionNotSupported;
 303                                 faultDetail = WSMAN_FAULTDETAIL_ACTIONMISMATCH;
 304                                 break;
 305                     
 306                             case CIM_ERR_QUERY_LANGUAGE_NOT_SUPPORTED:
 307                                 // DSP0227 section 15.1.11 indicates that ExecuteQuery operations
 308                                 // through WS-Management use CQL filter dialect.  If this status
 309                                 // code results, it is fair to assume filtering is not supported
 310                                 // at all.  Another option would be to use
 311                                 // wsen_FilterDialectRequestedUnavailable.
 312                                 subcode = WsmFault::wsen_FilteringNotSupported;
 313                                 break;
 314                     
 315                             default:
 316 mike           1.12             // Initialize to prevent uninitialized subcode error.
 317                                 subcode = WsmFault::wsman_InternalError;
 318 kumpf          1.2              PEGASUS_ASSERT(0);
 319                         }
 320                     
 321                         return WsmFault(subcode, reason, languageList, faultDetail);
 322                     }
 323                     
 324 kumpf          1.6  WxfGetResponse* CimToWsmResponseMapper::_mapToWxfGetResponse(
 325                         const WxfGetRequest* wsmRequest,
 326 r.kieninger    1.11     CIMGetInstanceResponseMessage* response)
 327 kumpf          1.2  {
 328                         WsmInstance wsmInstance;
 329                     
 330 r.kieninger    1.11     convertCimToWsmInstance(
 331 mike           1.12         wsmRequest->epr.resourceUri,
 332 thilo.boehm    1.13         response->getResponseData().getInstance(),
 333 r.kieninger    1.11         wsmInstance,
 334 kumpf          1.6          wsmRequest->epr.getNamespace());
 335 kumpf          1.2  
 336 kumpf          1.6      WxfGetResponse* wsmResponse =
 337                             new WxfGetResponse(
 338 kumpf          1.2              wsmInstance,
 339                                 wsmRequest,
 340                                 _getContentLanguages(response->operationContext));
 341                     
 342                         return wsmResponse;
 343                     }
 344                     
 345 kumpf          1.6  WxfPutResponse* CimToWsmResponseMapper::_mapToWxfPutResponse(
 346                         const WxfPutRequest* wsmRequest,
 347 kumpf          1.2      const CIMModifyInstanceResponseMessage* response)
 348                     {
 349 kumpf          1.6      WxfPutResponse* wsmResponse =
 350                             new WxfPutResponse(
 351 kumpf          1.2              wsmRequest,
 352                                 _getContentLanguages(response->operationContext));
 353                     
 354                         return wsmResponse;
 355                     }
 356                     
 357 kumpf          1.6  WxfCreateResponse* CimToWsmResponseMapper::_mapToWxfCreateResponse(
 358                         const WxfCreateRequest* wsmRequest,
 359 kumpf          1.2      const CIMCreateInstanceResponseMessage* response)
 360                     {
 361                         WsmEndpointReference epr;
 362                     
 363 mike           1.12     convertObjPathToEPR(
 364                             wsmRequest->epr.resourceUri,
 365                             response->instanceName,
 366                             epr,
 367 kumpf          1.6          wsmRequest->epr.getNamespace());
 368 kumpf          1.2  
 369 kumpf          1.6      WxfCreateResponse* wsmResponse =
 370                             new WxfCreateResponse(
 371 kumpf          1.2              epr,
 372                                 wsmRequest,
 373                                 _getContentLanguages(response->operationContext));
 374                     
 375                         return wsmResponse;
 376                     }
 377                     
 378 kumpf          1.6  WxfDeleteResponse* CimToWsmResponseMapper::_mapToWxfDeleteResponse(
 379                         const WxfDeleteRequest* wsmRequest,
 380 kumpf          1.2      const CIMDeleteInstanceResponseMessage* response)
 381                     {
 382 kumpf          1.6      WxfDeleteResponse* wsmResponse =
 383                             new WxfDeleteResponse(
 384                                 wsmRequest,
 385                                 _getContentLanguages(response->operationContext));
 386                     
 387                         return wsmResponse;
 388                     }
 389                     
 390 kumpf          1.10 WsenEnumerateResponse*
 391 kumpf          1.6      CimToWsmResponseMapper::_mapToWsenEnumerateResponseObject(
 392                         const WsenEnumerateRequest* wsmRequest,
 393 r.kieninger    1.11     CIMEnumerateInstancesResponseMessage* response)
 394 kumpf          1.6  {
 395 karl           1.14     PEG_METHOD_ENTER(TRC_WSMSERVER,
 396                             "CimToWsmResponseMapper::_mapToWsenEnumerateResponseObject");
 397 kumpf          1.6      Array<WsmInstance> instances;
 398                         Array<WsmEndpointReference> EPRs;
 399 mike           1.12     Array<CIMInstance>& namedInstances =
 400 thilo.boehm    1.13         response->getResponseData().getInstances();
 401 mike           1.12 
 402 karl           1.14     PEG_TRACE((TRC_WSMSERVER, Tracer::LEVEL4,
 403                             "EnumerateInstances Returned %u instances",namedInstances.size() ));
 404                     
 405                         // if WQLFilter type
 406                         if (wsmRequest->wsmFilter.filterDialect == WsmFilter::WQL)
 407 kumpf          1.6      {
 408 mike           1.12         // Filter out unwanted instances:
 409                     
 410                             for (Uint32 i = 0; i < namedInstances.size(); i++)
 411                             {
 412                                 try
 413                                 {
 414 karl           1.14                 if (!wsmRequest->wsmFilter.WQLFilter.selectStatement->
 415                                             evaluate(namedInstances[i]))
 416                                     {
 417 mike           1.12                     continue;
 418 karl           1.14                 }
 419 mike           1.12             }
 420                                 catch (...)
 421                                 {
 422                                     // This error is unreportable since all other instance
 423                                     // would have to  be aborted.
 424                                     continue;
 425                                 }
 426                     
 427                                 CIMInstance instance = namedInstances[i].clone();
 428                     
 429                                 try
 430                                 {
 431 karl           1.14                 wsmRequest->wsmFilter.WQLFilter.selectStatement->
 432                                         applyProjection(instance, false);
 433 mike           1.12             }
 434                                 catch (...)
 435                                 {
 436                                     // Ignore missing properties.
 437                                     continue;
 438                                 }
 439                     
 440                                 WsmInstance wsmInstance;
 441                                 convertCimToWsmInstance(
 442                                     wsmRequest->epr.resourceUri,
 443                                     instance,
 444                                     wsmInstance,
 445                                     wsmRequest->epr.getNamespace());
 446                                 instances.append(wsmInstance);
 447                             }
 448                     
 449                             WsenEnumerateResponse* wsmResponse =
 450                                 new WsenEnumerateResponse(
 451                                     instances,
 452                                     instances.size(),
 453                                     wsmRequest,
 454 mike           1.12                 _getContentLanguages(response->operationContext));
 455 karl           1.14         PEG_METHOD_EXIT();
 456 mike           1.12         return wsmResponse;
 457 kumpf          1.6      }
 458 mike           1.12     else
 459                         {
 460                             for (Uint32 i = 0; i < namedInstances.size(); i++)
 461                             {
 462                                 WsmInstance wsmInstance;
 463                                 convertCimToWsmInstance(
 464                                     wsmRequest->epr.resourceUri,
 465                                     namedInstances[i],
 466                                     wsmInstance,
 467                                     wsmRequest->epr.getNamespace());
 468                                 instances.append(wsmInstance);
 469                             }
 470                     
 471                             WsenEnumerateResponse* wsmResponse =
 472                                 new WsenEnumerateResponse(
 473                                     instances,
 474                                     instances.size(),
 475                                     wsmRequest,
 476                                     _getContentLanguages(response->operationContext));
 477 kumpf          1.6  
 478 karl           1.14         PEG_METHOD_EXIT();
 479 mike           1.12         return wsmResponse;
 480                         }
 481 kumpf          1.6  }
 482                     
 483 kumpf          1.10 WsenEnumerateResponse*
 484 kumpf          1.6      CimToWsmResponseMapper::_mapToWsenEnumerateResponseObjectAndEPR(
 485                         const WsenEnumerateRequest* wsmRequest,
 486 r.kieninger    1.11     CIMEnumerateInstancesResponseMessage* response)
 487 kumpf          1.6  {
 488 karl           1.14     PEG_METHOD_ENTER(TRC_WSMSERVER,
 489                             "CimToWsmResponseMapper::_mapToWsenEnumerateResponseObjectAndEPR");
 490                     
 491 kumpf          1.6      Array<WsmInstance> instances;
 492                         Array<WsmEndpointReference> EPRs;
 493 r.kieninger    1.11     Array<CIMInstance>& namedInstances =
 494 thilo.boehm    1.13         response->getResponseData().getInstances();
 495 karl           1.14 
 496                         PEG_TRACE((TRC_WSMSERVER, Tracer::LEVEL4,
 497                             "EnumerateInstances Returned %u instances ",namedInstances.size() ));
 498                     
 499 r.kieninger    1.11     for (Uint32 i = 0; i < namedInstances.size(); i++)
 500 kumpf          1.6      {
 501                             WsmInstance wsmInstance;
 502 mike           1.12         convertCimToWsmInstance(
 503                                 wsmRequest->epr.resourceUri,
 504                                 namedInstances[i],
 505                                 wsmInstance,
 506 kumpf          1.6              wsmRequest->epr.getNamespace());
 507                             instances.append(wsmInstance);
 508                     
 509                             WsmEndpointReference epr;
 510 mike           1.12         convertObjPathToEPR(
 511                                 wsmRequest->epr.resourceUri,
 512                                 namedInstances[i].getPath(),
 513                                 epr,
 514 kumpf          1.6              wsmRequest->epr.getNamespace());
 515                             EPRs.append(epr);
 516                         }
 517                     
 518                         WsenEnumerateResponse* wsmResponse =
 519                             new WsenEnumerateResponse(
 520                                 instances,
 521                                 EPRs,
 522                                 instances.size(),
 523                                 wsmRequest,
 524                                 _getContentLanguages(response->operationContext));
 525 karl           1.14     PEG_METHOD_EXIT();
 526 kumpf          1.6      return wsmResponse;
 527                     }
 528                     
 529 karl           1.14 /****************************************************************************
 530                     **
 531                     **       _mapToWsenEnumerateResponse for enumerateInstances and
 532                     **           EnumerateInstanceNames responses
 533                     **
 534                     ******************************************************************************/
 535 kumpf          1.10 WsenEnumerateResponse*
 536 kumpf          1.6  CimToWsmResponseMapper::_mapToWsenEnumerateResponseEPR(
 537                         const WsenEnumerateRequest* wsmRequest,
 538 r.kieninger    1.11     CIMEnumerateInstanceNamesResponseMessage* response)
 539 kumpf          1.6  {
 540 karl           1.14     PEG_METHOD_ENTER(TRC_WSMSERVER,
 541                             "CimToWsmResponseMapper::_mapToWsenEnumerateResponseEPR");
 542                     
 543 kumpf          1.6      Array<WsmEndpointReference> EPRs;
 544 thilo.boehm    1.13     Array<CIMObjectPath>& instanceNames =
 545                             response->getResponseData().getInstanceNames();
 546 karl           1.14 
 547                         PEG_TRACE((TRC_WSMSERVER, Tracer::LEVEL4,
 548                             "EnumerateInstanceNames Returned %u instanceNames ",
 549                                    instanceNames.size() ));
 550                     
 551 thilo.boehm    1.13     for (Uint32 i = 0; i < instanceNames.size(); i++)
 552 kumpf          1.6      {
 553                             WsmEndpointReference epr;
 554 mike           1.12         convertObjPathToEPR(
 555                                 wsmRequest->epr.resourceUri,
 556 thilo.boehm    1.13             instanceNames[i],
 557 mike           1.12             epr,
 558 kumpf          1.6              wsmRequest->epr.getNamespace());
 559                             EPRs.append(epr);
 560                         }
 561                     
 562                         WsenEnumerateResponse* wsmResponse =
 563                             new WsenEnumerateResponse(
 564                                 EPRs,
 565                                 EPRs.size(),
 566 kumpf          1.2              wsmRequest,
 567                                 _getContentLanguages(response->operationContext));
 568 karl           1.14     PEG_METHOD_EXIT();
 569                         return wsmResponse;
 570                     }
 571                     
 572                     /****************************************************************************
 573                     **
 574                     **       _mapToWsenEnumerateResponse for CIM Reference and ReferenceNames
 575                     **           responses
 576                     **
 577                     ******************************************************************************/
 578                     WsenEnumerateResponse*
 579                         CimToWsmResponseMapper::_mapToWsenEnumerateResponseObject(
 580                         const WsenEnumerateRequest* wsmRequest,
 581                         CIMReferencesResponseMessage* response)
 582                     {
 583                         PEG_METHOD_ENTER(TRC_WSMSERVER,
 584                             "CimToWsmResponseMapper::_mapToWsenEnumerateResponseObject");
 585                     
 586                         Array<WsmInstance> instances;
 587                         Array<WsmEndpointReference> EPRs;
 588                         Array<CIMObject>& objects =
 589 karl           1.14         response->getResponseData().getObjects();
 590                     
 591                         PEG_TRACE((TRC_WSMSERVER, Tracer::LEVEL4,
 592                             "References Returned %u objects ",objects.size() ));
 593                     
 594                         for (Uint32 i = 0; i < objects.size(); i++)
 595                         {
 596                             WsmInstance wsmInstance;
 597                             convertCimToWsmInstance(
 598                                 wsmRequest->wsmFilter.AssocFilter.object.resourceUri,
 599                                 (CIMInstance)objects[i],
 600                                 wsmInstance,
 601                                 wsmRequest->wsmFilter.AssocFilter.object.getNamespace());
 602                             instances.append(wsmInstance);
 603                         }
 604                     
 605                         WsenEnumerateResponse* wsmResponse =
 606                             new WsenEnumerateResponse(
 607                                 instances,
 608                                 instances.size(),
 609                                 wsmRequest,
 610 karl           1.14             _getContentLanguages(response->operationContext));
 611 kumpf          1.2  
 612 karl           1.14     PEG_METHOD_EXIT();
 613                         return wsmResponse;
 614                     }
 615                     
 616                     WsenEnumerateResponse*
 617                         CimToWsmResponseMapper::_mapToWsenEnumerateResponseObjectAndEPR(
 618                         const WsenEnumerateRequest* wsmRequest,
 619                         CIMReferencesResponseMessage* response)
 620                     {
 621                         PEG_METHOD_ENTER(TRC_WSMSERVER,
 622                             "CimToWsmResponseMapper::_mapToWsenEnumerateResponseObjectAndEPR");
 623                     
 624                         Array<WsmInstance> instances;
 625                         Array<WsmEndpointReference> EPRs;
 626                         Array<CIMObject>& objects =
 627                             response->getResponseData().getObjects();
 628                     
 629                         PEG_TRACE((TRC_WSMSERVER, Tracer::LEVEL4,
 630                             "Returned %u objects from References ",objects.size() ));
 631                     
 632                         for (Uint32 i = 0; i < objects.size(); i++)
 633 karl           1.14     {
 634                             WsmInstance wsmInstance;
 635                     
 636                             convertCimToWsmInstance(
 637                                 wsmRequest->wsmFilter.AssocFilter.object.resourceUri,
 638                                 (CIMInstance)objects[i],
 639                                 wsmInstance,
 640                                 wsmRequest->wsmFilter.AssocFilter.object.getNamespace());
 641                             instances.append(wsmInstance);
 642                     
 643                             WsmEndpointReference epr;
 644                             convertObjPathToEPR(
 645                                 wsmRequest->wsmFilter.AssocFilter.object.resourceUri,
 646                                 objects[i].getPath(),
 647                                 epr,
 648                                 wsmRequest->wsmFilter.AssocFilter.object.getNamespace());
 649                             EPRs.append(epr);
 650                         }
 651                     
 652                         WsenEnumerateResponse* wsmResponse =
 653                             new WsenEnumerateResponse(
 654 karl           1.14             instances,
 655                                 EPRs,
 656                                 instances.size(),
 657                                 wsmRequest,
 658                                 _getContentLanguages(response->operationContext));
 659                         PEG_METHOD_EXIT();
 660                         return wsmResponse;
 661                     }
 662                     
 663                     WsenEnumerateResponse*
 664                     CimToWsmResponseMapper::_mapToWsenEnumerateResponseEPR(
 665                         const WsenEnumerateRequest* wsmRequest,
 666                         CIMReferenceNamesResponseMessage* response)
 667                     {
 668                         PEG_METHOD_ENTER(TRC_WSMSERVER,
 669                             "CimToWsmResponseMapper::_mapToWsenEnumerateResponseEPR");
 670                     
 671                         Array<WsmEndpointReference> EPRs;
 672                         Array<CIMObjectPath>& instanceNames =
 673                             response->getResponseData().getInstanceNames();
 674                     
 675 karl           1.14     PEG_TRACE((TRC_WSMSERVER, Tracer::LEVEL4,
 676                             "Returned %u names from ReferenceNames ",instanceNames.size() ));
 677                     
 678                         for (Uint32 i = 0; i < instanceNames.size(); i++)
 679                         {
 680                             WsmEndpointReference epr;
 681                     
 682                             convertObjPathToEPR(
 683                                 wsmRequest->wsmFilter.AssocFilter.object.resourceUri,
 684                                 instanceNames[i],
 685                                 epr,
 686                                 wsmRequest->wsmFilter.AssocFilter.object.getNamespace());
 687                             EPRs.append(epr);
 688                         }
 689                     
 690                         WsenEnumerateResponse* wsmResponse =
 691                             new WsenEnumerateResponse(
 692                                 EPRs,
 693                                 EPRs.size(),
 694                                 wsmRequest,
 695                                 _getContentLanguages(response->operationContext));
 696 karl           1.14     PEG_METHOD_EXIT();
 697                         return wsmResponse;
 698                     }
 699                     
 700                     /****************************************************************************
 701                     **
 702                     **       _mapToWsenEnumerateResponse for Associator and AssociatorNames
 703                     **           responses
 704                     **
 705                     ******************************************************************************/
 706                     WsenEnumerateResponse*
 707                         CimToWsmResponseMapper::_mapToWsenEnumerateResponseObject(
 708                         const WsenEnumerateRequest* wsmRequest,
 709                         CIMAssociatorsResponseMessage* response)
 710                     {
 711                         PEG_METHOD_ENTER(TRC_WSMSERVER,
 712                             "CimToWsmResponseMapper::_mapToWsenEnumerateResponseObject");
 713                         Array<WsmInstance> instances;
 714                         Array<WsmEndpointReference> EPRs;
 715                         Array<CIMObject>& objects =
 716                             response->getResponseData().getObjects();
 717 karl           1.14 
 718                         for (Uint32 i = 0; i < objects.size(); i++)
 719                         {
 720                             WsmInstance wsmInstance;
 721                             convertCimToWsmInstance(
 722                                 wsmRequest->epr.resourceUri,
 723                                 (CIMInstance)objects[i],
 724                                 wsmInstance,
 725                                 wsmRequest->epr.getNamespace());
 726                             instances.append(wsmInstance);
 727                         }
 728                     
 729                         WsenEnumerateResponse* wsmResponse =
 730                             new WsenEnumerateResponse(
 731                                 instances,
 732                                 instances.size(),
 733                                 wsmRequest,
 734                                 _getContentLanguages(response->operationContext));
 735                         PEG_METHOD_EXIT();
 736                         return wsmResponse;
 737                     }
 738 karl           1.14 
 739                     WsenEnumerateResponse*
 740                         CimToWsmResponseMapper::_mapToWsenEnumerateResponseObjectAndEPR(
 741                         const WsenEnumerateRequest* wsmRequest,
 742                         CIMAssociatorsResponseMessage* response)
 743                     {
 744                         PEG_METHOD_ENTER(TRC_WSMSERVER,
 745                             "CimToWsmResponseMapper::_mapToWsenEnumerateResponseObjectAndEPR");
 746                         Array<WsmInstance> instances;
 747                         Array<WsmEndpointReference> EPRs;
 748                         Array<CIMObject>& objects =
 749                             response->getResponseData().getObjects();
 750                     
 751                         PEG_TRACE((TRC_WSMSERVER, Tracer::LEVEL4,
 752                             "Returned %u objects from Associators",objects.size() ));
 753                     
 754                         for (Uint32 i = 0; i < objects.size(); i++)
 755                         {
 756                             WsmInstance wsmInstance;
 757                     
 758                             convertCimToWsmInstance(
 759 karl           1.14             wsmRequest->wsmFilter.AssocFilter.object.resourceUri,
 760                                 (CIMInstance)objects[i],
 761                                 wsmInstance,
 762                                 wsmRequest->wsmFilter.AssocFilter.object.getNamespace());
 763                             instances.append(wsmInstance);
 764                     
 765                             WsmEndpointReference epr;
 766                             convertObjPathToEPR(
 767                                 wsmRequest->wsmFilter.AssocFilter.object.resourceUri,
 768                                 objects[i].getPath(),
 769                                 epr,
 770                                 wsmRequest->wsmFilter.AssocFilter.object.getNamespace());
 771                             EPRs.append(epr);
 772                         }
 773                     
 774                         WsenEnumerateResponse* wsmResponse =
 775                             new WsenEnumerateResponse(
 776                                 instances,
 777                                 EPRs,
 778                                 instances.size(),
 779                                 wsmRequest,
 780 karl           1.14             _getContentLanguages(response->operationContext));
 781                     
 782                         PEG_METHOD_EXIT();
 783                         return wsmResponse;
 784                     }
 785                     
 786                     WsenEnumerateResponse*
 787                     CimToWsmResponseMapper::_mapToWsenEnumerateResponseEPR(
 788                         const WsenEnumerateRequest* wsmRequest,
 789                         CIMAssociatorNamesResponseMessage* response)
 790                     {
 791                         PEG_METHOD_ENTER(TRC_WSMSERVER,
 792                             "CimToWsmResponseMapper::_mapToWsenEnumerateResponseEPR");
 793                     
 794                         Array<WsmEndpointReference> EPRs;
 795                         Array<CIMObjectPath>& instanceNames =
 796                             response->getResponseData().getInstanceNames();
 797                     
 798                         PEG_TRACE((TRC_WSMSERVER, Tracer::LEVEL4,
 799                             "Returned %u instanceNames",instanceNames.size() ));
 800                     
 801 karl           1.14     for (Uint32 i = 0; i < instanceNames.size(); i++)
 802                         {
 803                             WsmEndpointReference epr;
 804                     
 805                             convertObjPathToEPR(
 806                                 wsmRequest->wsmFilter.AssocFilter.object.resourceUri,
 807                                 instanceNames[i],
 808                                 epr,
 809                                 wsmRequest->wsmFilter.AssocFilter.object.getNamespace());
 810                             EPRs.append(epr);
 811                         }
 812                     
 813                         WsenEnumerateResponse* wsmResponse =
 814                             new WsenEnumerateResponse(
 815                                 EPRs,
 816                                 EPRs.size(),
 817                                 wsmRequest,
 818                                 _getContentLanguages(response->operationContext));
 819                         PEG_METHOD_EXIT();
 820 kumpf          1.2      return wsmResponse;
 821                     }
 822                     
 823 mike           1.12 WsInvokeResponse* CimToWsmResponseMapper::_mapToWsInvokeResponse(
 824                         const WsInvokeRequest* wsmRequest,
 825                         const CIMInvokeMethodResponseMessage* response)
 826                     {
 827 karl           1.14     PEG_METHOD_ENTER(TRC_WSMSERVER,
 828                             "CimToWsmResponseMapper::_mapToWsInvokeResponse");
 829                     
 830 mike           1.12     WsmInstance wsmInstance;
 831                         String nameSpace = wsmRequest->epr.getNamespace();
 832                     
 833                         convertCimToWsmParameters(
 834                             wsmRequest->epr.resourceUri,
 835                             nameSpace,
 836                             response->outParameters,
 837                             response->retValue,
 838                             wsmInstance);
 839                     
 840                         WsInvokeResponse* wsmResponse =
 841                             new WsInvokeResponse(
 842                                 nameSpace,
 843                                 wsmRequest->className,
 844                                 response->methodName.getString(),
 845                                 wsmInstance,
 846                                 wsmRequest,
 847                                 _getContentLanguages(response->operationContext));
 848 karl           1.14     PEG_METHOD_EXIT();
 849 mike           1.12     return wsmResponse;
 850                     }
 851                     
 852 kumpf          1.2  void CimToWsmResponseMapper::convertCimToWsmInstance(
 853 mike           1.12     const String& resourceUri,
 854 kumpf          1.7      const CIMConstInstance& cimInstance,
 855 kumpf          1.6      WsmInstance& wsmInstance,
 856                         const String& nameSpace)
 857 kumpf          1.2  {
 858                         wsmInstance.setClassName(cimInstance.getClassName().getString());
 859                     
 860                         for (Uint32 i = 0, n = cimInstance.getPropertyCount(); i < n; i++)
 861                         {
 862                             CIMConstProperty cimProperty = cimInstance.getProperty(i);
 863                             const String& propertyName = cimProperty.getName().getString();
 864                             const CIMValue& cimValue = cimProperty.getValue();
 865                     
 866                             WsmValue wsmValue;
 867 mike           1.12         convertCimToWsmValue(resourceUri, cimValue, wsmValue, nameSpace);
 868 kumpf          1.2  
 869                             WsmProperty wsmProperty(propertyName, wsmValue);
 870                             wsmInstance.addProperty(wsmProperty);
 871                         }
 872                     }
 873                     
 874                     template<class T>
 875                     static void _convertCimToWsmArrayValue(
 876                         const CIMValue& cimValue,
 877                         WsmValue& wsmValue)
 878                     {
 879                         Array<T> arr;
 880                         Array<String> strs;
 881                     
 882                         cimValue.get(arr);
 883                         for (Uint32 i = 0, n = arr.size(); i < n; i++)
 884                         {
 885                             CIMValue val(arr[i]);
 886                             String str(val.toString());
 887                             if (val.getType() == CIMTYPE_BOOLEAN)
 888                             {
 889 kumpf          1.2              str.toLower();
 890                             }
 891                             strs.append(str);
 892                         }
 893                         wsmValue.set(strs);
 894                     }
 895                     
 896                     void CimToWsmResponseMapper::convertCimToWsmValue(
 897 mike           1.12      const String& resourceUri,
 898 kumpf          1.2       const CIMValue& cimValue,
 899 kumpf          1.6       WsmValue& wsmValue,
 900                          const String& nameSpace)
 901 kumpf          1.2  {
 902                         if (cimValue.isNull())
 903                         {
 904                             wsmValue.setNull();
 905                             return;
 906                         }
 907                     
 908                         if (cimValue.isArray())
 909                         {
 910                             switch (cimValue.getType())
 911                             {
 912                                 case CIMTYPE_BOOLEAN:
 913                                 {
 914                                     _convertCimToWsmArrayValue<Boolean>(cimValue, wsmValue);
 915                                     break;
 916                                 }
 917                     
 918                                 case CIMTYPE_UINT8:
 919                                 {
 920                                     _convertCimToWsmArrayValue<Uint8>(cimValue, wsmValue);
 921                                     break;
 922 kumpf          1.2              }
 923                     
 924                                 case CIMTYPE_SINT8:
 925                                 {
 926                                     _convertCimToWsmArrayValue<Sint8>(cimValue, wsmValue);
 927                                     break;
 928                                 }
 929                     
 930                                 case CIMTYPE_UINT16:
 931                                 {
 932                                     _convertCimToWsmArrayValue<Uint16>(cimValue, wsmValue);
 933                                     break;
 934                                 }
 935                     
 936                                 case CIMTYPE_SINT16:
 937                                 {
 938                                     _convertCimToWsmArrayValue<Sint16>(cimValue, wsmValue);
 939                                     break;
 940                                 }
 941                     
 942                                 case CIMTYPE_UINT32:
 943 kumpf          1.2              {
 944                                     _convertCimToWsmArrayValue<Uint32>(cimValue, wsmValue);
 945                                     break;
 946                                 }
 947                     
 948                                 case CIMTYPE_SINT32:
 949                                 {
 950                                     _convertCimToWsmArrayValue<Sint32>(cimValue, wsmValue);
 951                                     break;
 952                                 }
 953                     
 954                                 case CIMTYPE_UINT64:
 955                                 {
 956                                     _convertCimToWsmArrayValue<Uint64>(cimValue, wsmValue);
 957                                     break;
 958                                 }
 959                     
 960                                 case CIMTYPE_SINT64:
 961                                 {
 962                                     _convertCimToWsmArrayValue<Sint64>(cimValue, wsmValue);
 963                                     break;
 964 kumpf          1.2              }
 965                     
 966                                 case CIMTYPE_REAL32:
 967                                 {
 968                                     _convertCimToWsmArrayValue<Real32>(cimValue, wsmValue);
 969                                     break;
 970                                 }
 971                     
 972                                 case CIMTYPE_REAL64:
 973                                 {
 974                                     _convertCimToWsmArrayValue<Real64>(cimValue, wsmValue);
 975                                     break;
 976                                 }
 977                     
 978                                 case CIMTYPE_CHAR16:
 979                                 {
 980                                     _convertCimToWsmArrayValue<Char16>(cimValue, wsmValue);
 981                                     break;
 982                                 }
 983                     
 984                                 case CIMTYPE_STRING:
 985 kumpf          1.2              {
 986                                     _convertCimToWsmArrayValue<String>(cimValue, wsmValue);
 987                                     break;
 988                                 }
 989                     
 990                                 case CIMTYPE_DATETIME:
 991                                 {
 992                                     Array<CIMDateTime> dates;
 993                                     Array<String> strs;
 994                                     cimValue.get(dates);
 995                                     for (Uint32 i = 0, n = dates.size(); i < n; i++)
 996                                     {
 997 dmitry.mikulin 1.3                      String wsmDT;
 998                                         convertCimToWsmDatetime(dates[i], wsmDT);
 999                                         strs.append(wsmDT);
1000 kumpf          1.2                  }
1001                                     wsmValue.set(strs);
1002                                     break;
1003                                 }
1004                     
1005                                 case CIMTYPE_REFERENCE:
1006                                 {
1007                                     Array<WsmEndpointReference> eprs;
1008                                     Array<CIMObjectPath> objPaths;
1009                                     cimValue.get(objPaths);
1010                     
1011                                     for (Uint32 i = 0, n = objPaths.size(); i < n; i++)
1012                                     {
1013                                         WsmEndpointReference epr;
1014 mike           1.12                     convertObjPathToEPR(resourceUri, objPaths[i], epr,
1015                                             nameSpace);
1016 kumpf          1.2                      eprs.append(epr);
1017                                     }
1018                                     wsmValue.set(eprs);
1019                                     break;
1020                                 }
1021                     
1022                                 case CIMTYPE_OBJECT:
1023                                 {
1024                                     Array<WsmInstance> wsmInstances;
1025                                     Array<CIMObject> cimObjects;
1026                                     cimValue.get(cimObjects);
1027                                     for (Uint32 i = 0, n = cimObjects.size(); i < n; i++)
1028                                     {
1029                                         if (cimObjects[i].isInstance())
1030                                         {
1031                                             WsmInstance wsmInstance;
1032                                             convertCimToWsmInstance(
1033 mike           1.12                             resourceUri,
1034 kumpf          1.10                             CIMInstance(cimObjects[i]),
1035                                                 wsmInstance,
1036 kumpf          1.6                              nameSpace);
1037 kumpf          1.2                          wsmInstances.append(wsmInstance);
1038                                         }
1039                                         else
1040                                         {
1041                                             throw WsmFault(WsmFault::wsman_InternalError,
1042                                                 MessageLoaderParms(
1043                                                     "WsmServer.CimToWsmResponseMapper."
1044                                                         "EMBEDDED_CLASS_NOT_SUPPORTED",
1045                                                     "Embedded class objects in WS-Management "
1046                                                         "responses are not supported."));
1047                                         }
1048                                     }
1049                                     wsmValue.set(wsmInstances);
1050                                     break;
1051                                 }
1052                     
1053                                 case CIMTYPE_INSTANCE:
1054                                 {
1055                                     Array<WsmInstance> wsmInstances;
1056                                     Array<CIMInstance> cimInstances;
1057                                     cimValue.get(cimInstances);
1058 kumpf          1.2                  for (Uint32 i = 0, n = cimInstances.size(); i < n; i++)
1059                                     {
1060                                         WsmInstance wsmInstance;
1061 kumpf          1.6                      convertCimToWsmInstance(
1062 mike           1.12                         resourceUri,
1063                                             cimInstances[i],
1064                                             wsmInstance,
1065                                             nameSpace);
1066 kumpf          1.2                      wsmInstances.append(wsmInstance);
1067                                     }
1068                                     wsmValue.set(wsmInstances);
1069                                     break;
1070                                 }
1071                     
1072                                 default:
1073                                 {
1074                                     PEGASUS_ASSERT(0);
1075                                 }
1076                             }
1077                         }
1078                         else
1079                         {
1080                             switch (cimValue.getType())
1081                             {
1082                                 case CIMTYPE_BOOLEAN:
1083                                 {
1084                                     String str(cimValue.toString());
1085                                     str.toLower();
1086                                     wsmValue.set(str);
1087 kumpf          1.2                  break;
1088                                 }
1089                                 case CIMTYPE_UINT8:
1090                                 case CIMTYPE_SINT8:
1091                                 case CIMTYPE_UINT16:
1092                                 case CIMTYPE_SINT16:
1093                                 case CIMTYPE_UINT32:
1094                                 case CIMTYPE_SINT32:
1095                                 case CIMTYPE_UINT64:
1096                                 case CIMTYPE_SINT64:
1097 dmitry.mikulin 1.3              case CIMTYPE_CHAR16:
1098                                 case CIMTYPE_STRING:
1099                                 {
1100                                     wsmValue.set(cimValue.toString());
1101                                     break;
1102                                 }
1103 kumpf          1.2              case CIMTYPE_REAL32:
1104                                 case CIMTYPE_REAL64:
1105 dmitry.mikulin 1.3              {
1106                                     String str(cimValue.toString());
1107 carson.hovey   1.4                  if (String::compareNoCase(str, PEGASUS_NAN) == 0)
1108 dmitry.mikulin 1.3                      wsmValue.set("NaN");
1109 carson.hovey   1.4                  else if (String::compareNoCase(str, PEGASUS_INF) == 0)
1110 dmitry.mikulin 1.3                      wsmValue.set("INF");
1111 carson.hovey   1.4                  else if (String::compareNoCase(str, PEGASUS_NEG_INF) == 0)
1112 dmitry.mikulin 1.3                      wsmValue.set("-INF");
1113                                     else
1114                                         wsmValue.set(str);
1115                                     break;
1116                                 }
1117 kumpf          1.2              case CIMTYPE_DATETIME:
1118                                 {
1119 dmitry.mikulin 1.3                  String wsmDT;
1120                                     CIMDateTime cimDT;
1121                                     cimValue.get(cimDT);
1122                                     convertCimToWsmDatetime(cimDT, wsmDT);
1123                                     wsmValue.set(wsmDT);
1124 kumpf          1.2                  break;
1125                                 }
1126                                 case CIMTYPE_REFERENCE:
1127                                 {
1128                                     WsmEndpointReference epr;
1129                                     CIMObjectPath objPath;
1130                                     cimValue.get(objPath);
1131 mike           1.12                 convertObjPathToEPR(resourceUri, objPath, epr, nameSpace);
1132 kumpf          1.2                  wsmValue.set(epr);
1133                                     break;
1134                                 }
1135                                 case CIMTYPE_OBJECT:
1136                                 {
1137                                     CIMObject cimObject;
1138                                     cimValue.get(cimObject);
1139                                     if (cimObject.isInstance())
1140                                     {
1141                                         WsmInstance wsmInstance;
1142                                         convertCimToWsmInstance(
1143 mike           1.12                         resourceUri,
1144 kumpf          1.6                          CIMInstance(cimObject), wsmInstance, nameSpace);
1145 kumpf          1.2                      wsmValue.set(wsmInstance);
1146                                     }
1147                                     else
1148                                     {
1149                                         throw WsmFault(WsmFault::wsman_InternalError,
1150                                             MessageLoaderParms(
1151                                                 "WsmServer.CimToWsmResponseMapper."
1152                                                     "EMBEDDED_CLASS_NOT_SUPPORTED",
1153                                                 "Embedded class objects in WS-Management "
1154                                                     "responses are not supported"));
1155                                     }
1156                                     break;
1157                                 }
1158                                 case CIMTYPE_INSTANCE:
1159                                 {
1160                                     WsmInstance wsmInstance;
1161                                     CIMInstance cimInstance;
1162                                     cimValue.get(cimInstance);
1163 mike           1.12                 convertCimToWsmInstance(
1164                                         resourceUri, cimInstance, wsmInstance, nameSpace);
1165 kumpf          1.2                  wsmValue.set(wsmInstance);
1166                                     break;
1167                                 }
1168                                 default:
1169                                 {
1170                                     PEGASUS_ASSERT(0);
1171                                 }
1172                             }
1173                         }
1174                     }
1175                     
1176                     void CimToWsmResponseMapper::convertObjPathToEPR(
1177 mike           1.12     const String& resourceUri,
1178 kumpf          1.2      const CIMObjectPath& objPath,
1179 kumpf          1.6      WsmEndpointReference& epr,
1180                         const String& nameSpace)
1181 kumpf          1.2  {
1182                         // Since the connection protocol is unknown at this point, we assume
1183                         // it's http and form an EPR address by concatenating "http://" with
1184                         // the host name in the object path,  with "/wsman".
1185                         if (objPath.getHost().size() > 0)
1186                             epr.address = "http://" + objPath.getHost() + "/wsman";
1187                         else
1188                             epr.address = WSM_ADDRESS_ANONYMOUS;
1189                     
1190 mike           1.12     epr.resourceUri = WsmUtils::getRootResourceUri(resourceUri) + "/" +
1191 kumpf          1.2          objPath.getClassName().getString();
1192                     
1193                         CIMNamespaceName cimNS = objPath.getNameSpace();
1194                         if (!cimNS.isNull())
1195                         {
1196                             WsmSelector selector(String("__cimnamespace"), cimNS.getString());
1197                             epr.selectorSet->selectors.append(selector);
1198                         }
1199 kumpf          1.6      else
1200                         {
1201                             WsmSelector selector(String("__cimnamespace"), nameSpace);
1202                             epr.selectorSet->selectors.append(selector);
1203                         }
1204 kumpf          1.2  
1205                         const Array<CIMKeyBinding>& keyBindings = objPath.getKeyBindings();
1206                         for (Uint32 i = 0, n = keyBindings.size(); i < n; i++)
1207                         {
1208                             CIMKeyBinding binding = keyBindings[i];
1209                             if (binding.getType() == CIMKeyBinding::REFERENCE)
1210                             {
1211                                 CIMObjectPath cimRef = binding.getValue();
1212                                 WsmEndpointReference wsmRef;
1213 mike           1.12             convertObjPathToEPR(resourceUri, cimRef, wsmRef, nameSpace);
1214 kumpf          1.2              WsmSelector selector(binding.getName().getString(), wsmRef);
1215                                 epr.selectorSet->selectors.append(selector);
1216                             }
1217                             else
1218                             {
1219                                 WsmSelector selector(binding.getName().getString(),
1220                                     binding.getValue());
1221                                 epr.selectorSet->selectors.append(selector);
1222                             }
1223                         }
1224                     }
1225                     
1226 dmitry.mikulin 1.3  void CimToWsmResponseMapper::convertCimToWsmDatetime(
1227                         const CIMDateTime& cimDT, String& wsmDT)
1228                     {
1229                         char buffer[50];
1230                         Uint32 size;
1231                     
1232                         String cimStrDT = cimDT.toString();
1233                         CString cimCStrDT = cimStrDT.getCString();
1234                         const char* cimStr = (const char*) cimCStrDT;
1235                         Uint32 firstAsteriskPos = cimStrDT.find('*');
1236                     
1237 kumpf          1.10     // DSP0230.
1238 dmitry.mikulin 1.3      // 1. If CIM datetime string contains ":", use Interval cim:cimDateTime
1239                         // element.
1240                         // 2. If CIM datetime string contains "+" or "-" and does not contain any
1241                         // asterisks, use Datetime cim:cimDateTime element.
1242 kumpf          1.10     // 3. If CIM datetime string contains "+" or "-" and no asterisks in
1243 dmitry.mikulin 1.3      // the hhmmss.mmmmmm portion, and only asterisks in the yyyymmdd portion,
1244                         // ATTN: this makes no sense. yyyymmdd cannot be wildcarded unless
1245 kumpf          1.10     // previous sections are wildcarded.
1246 dmitry.mikulin 1.3      // use Time cim:cimDateTime element.
1247 kumpf          1.10     // 4. If CIM datetime string contains "+" or "-" and no asterisks in the
1248 dmitry.mikulin 1.3      // yyyymmdd portion, and only asterisks in the hhmmss.mmmmmm portion,
1249                         // use Date cim:cimDateTime element.
1250                         // 5. In all other cases use CIM_DateTime element.
1251                     
1252                         if (cimStr[21] == ':')
1253                         {
1254                             // Interval
1255                             Uint32 days = 0, hrs = 0, mins = 0, secs = 0, msecs = 0;
1256 kumpf          1.10         int conversions = sscanf(cimStr, "%8u%2u%2u%2u.%u:000",
1257 dmitry.mikulin 1.3              &days, &hrs, &mins, &secs, &msecs);
1258 kumpf          1.10         if (conversions == 0 && cimStr[0] == '*')
1259 dmitry.mikulin 1.3              days = 1;
1260                     
1261                             wsmDT = "P";
1262                             if (conversions >= 1 && days)
1263                             {
1264                                 wsmDT.append(Uint32ToString(buffer, days, size));
1265                                 wsmDT.append(Char16('D'));
1266                             }
1267 kumpf          1.10         if (conversions >= 2 )
1268 dmitry.mikulin 1.3          {
1269                                 wsmDT.append(Char16('T'));
1270                                 if (hrs)
1271                                 {
1272                                     wsmDT.append(Uint32ToString(buffer, hrs, size));
1273                                     wsmDT.append(Char16('H'));
1274                                 }
1275                             }
1276                             if (conversions >= 3 && mins)
1277                             {
1278                                 wsmDT.append(Uint32ToString(buffer, mins, size));
1279                                 wsmDT.append(Char16('M'));
1280                             }
1281 kumpf          1.10         if (conversions >= 4 && secs)
1282 dmitry.mikulin 1.3          {
1283                                 wsmDT.append(Uint32ToString(buffer, secs, size));
1284                                 if (conversions >= 5 && msecs)
1285                                 {
1286                                     wsmDT.append(Char16('.'));
1287                                     wsmDT.append(Uint32ToString(buffer, msecs, size));
1288                                 }
1289                                 wsmDT.append(Char16('S'));
1290                             }
1291 mike           1.12 
1292                             // According to spec, at least one number must be present, so if
1293                             // we end up with "PT", then convert to "PT0S".
1294                             if (wsmDT == "PT")
1295                                 wsmDT.append("0S");
1296 dmitry.mikulin 1.3      }
1297 kumpf          1.10     else if ((cimStr[21] == '+' || cimStr[21] == '-') &&
1298 dmitry.mikulin 1.3               firstAsteriskPos == PEG_NOT_FOUND)
1299                         {
1300                             // Datetime
1301                             Uint32 year = 0, month = 0, day = 0, utcoff = 0,
1302                                 hrs = 0, mins = 0, secs = 0, msecs = 0;
1303                             char sign;
1304 kumpf          1.10         int conversions = sscanf(cimStr,
1305                                 "%4u%2u%2u%2u%2u%2u.%6u%c%3u",
1306 dmitry.mikulin 1.3              &year, &month, &day, &hrs, &mins, &secs, &msecs, &sign, &utcoff);
1307                     
1308                             PEGASUS_ASSERT(conversions == 9);
1309                     
1310                             if (utcoff == 0)
1311                             {
1312                                 if (msecs)
1313                                 {
1314 kumpf          1.10                 sprintf(buffer, "%.4u-%.2u-%.2uT%.2u:%.2u:%.2u.%.6uZ",
1315 dmitry.mikulin 1.3                      year, month, day, hrs, mins, secs, msecs);
1316                                 }
1317                                 else
1318                                 {
1319 kumpf          1.10                 sprintf(buffer, "%.4u-%.2u-%.2uT%.2u:%.2u:%.2uZ",
1320 dmitry.mikulin 1.3                      year, month, day, hrs, mins, secs);
1321                                 }
1322                             }
1323                             else
1324                             {
1325                                 Uint32 utch = utcoff / 60;
1326                                 Uint32 utcm = utcoff % 60;
1327                                 if (msecs)
1328                                 {
1329                                     sprintf(buffer, "%.4u-%.2u-%.2uT%.2u:%.2u:%.2u.%.6u%c%.2u:%.2u",
1330 kumpf          1.10                     year, month, day, hrs, mins, secs, msecs,
1331 dmitry.mikulin 1.3                      sign, utch, utcm);
1332                                 }
1333                                 else
1334                                 {
1335 kumpf          1.10                 sprintf(buffer, "%.4u-%.2u-%.2uT%.2u:%.2u:%.2u%c%.2u:%.2u",
1336 dmitry.mikulin 1.3                      year, month, day, hrs, mins, secs, sign, utch, utcm);
1337                                 }
1338                             }
1339                             wsmDT = buffer;
1340                         }
1341 kumpf          1.10     else if ((cimStr[21] == '+' || cimStr[21] == '-') &&
1342 dmitry.mikulin 1.3               firstAsteriskPos == 8)
1343                         {
1344                             // Date
1345                             Uint32 year = 0, month = 0, day = 0, utcoff = 0;
1346                             char sign;
1347 kumpf          1.10         int conversions = sscanf(cimStr, "%4u%2u%2u******.******%c%3u",
1348 dmitry.mikulin 1.3              &year, &month, &day, &sign, &utcoff);
1349                     
1350                             PEGASUS_ASSERT(conversions == 5);
1351                     
1352                             if (utcoff == 0)
1353                             {
1354                                 sprintf(buffer, "%.4u-%.2u-%.2uZ", year, month, day);
1355                             }
1356                             else
1357                             {
1358                                 Uint32 utch = utcoff / 60;
1359                                 Uint32 utcm = utcoff % 60;
1360 kumpf          1.10             sprintf(buffer, "%.4u-%.2u-%.2u%c%.2u:%.2u",
1361 dmitry.mikulin 1.3                  year, month, day, sign, utch, utcm);
1362                             }
1363                             wsmDT = buffer;
1364                         }
1365                         else
1366                         {
1367                             // CIM_DateTime
1368                             wsmDT = cimStr;
1369                         }
1370                     }
1371 mike           1.12 
1372                     void CimToWsmResponseMapper::convertCimToWsmParameters(
1373                         const String& resourceUri,
1374                         const String& nameSpace,
1375                         const Array<CIMParamValue>& parameters,
1376                         const CIMValue& returnValue,
1377                         WsmInstance& wsmInstance)
1378                     {
1379                         // Convert output properties.
1380                     
1381                         for (Uint32 i = 0, n = parameters.size(); i < n; i++)
1382                         {
1383                             const CIMParamValue& cpv = parameters[i];
1384                             const String& name = cpv.getParameterName();
1385                             const CIMValue& value = cpv.getValue();
1386                     
1387                             WsmValue wvalue;
1388                             convertCimToWsmValue(resourceUri, value, wvalue, nameSpace);
1389                             wsmInstance.addProperty(WsmProperty(name, wvalue));
1390                         }
1391                     
1392 mike           1.12     // Convert return value.
1393                         {
1394                             WsmValue wvalue;
1395                             convertCimToWsmValue(resourceUri, returnValue, wvalue, nameSpace);
1396                             wsmInstance.addProperty(WsmProperty("ReturnValue", wvalue));
1397                         }
1398                     }
1399                     
1400 kumpf          1.2  PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2