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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2