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

   1 r.kieninger 1.1 //%LICENSE////////////////////////////////////////////////////////////////
   2                 //
   3                 // 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                 //
  10                 // 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                 //
  17                 // The above copyright notice and this permission notice shall be included
  18                 // in all copies or substantial portions of the Software.
  19                 //
  20                 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  21                 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  22 r.kieninger 1.1 // 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                 //
  28                 //////////////////////////////////////////////////////////////////////////
  29                 //
  30                 //%/////////////////////////////////////////////////////////////////////////////
  31                 
  32                 #include "CIMResponseData.h"
  33 marek       1.2.2.5 #include <Pegasus/Common/Tracer.h>
  34                     #include <Pegasus/Common/XmlWriter.h>
  35                     #include <Pegasus/Common/SCMOXmlWriter.h>
  36                     #include <Pegasus/Common/XmlReader.h>
  37 marek       1.2.2.15 #include <Pegasus/Common/CIMInternalXmlEncoder.h>
  38                      #include <Pegasus/Common/SCMOInternalXmlEncoder.h>
  39 r.kieninger 1.1      
  40                      PEGASUS_USING_STD;
  41                      
  42                      PEGASUS_NAMESPACE_BEGIN
  43                      
  44 marek       1.2.2.5  // C++ objects interface handling
  45                      
  46                      // Instance Names handling
  47                      Array<CIMObjectPath>& CIMResponseData::getInstanceNames()
  48                      {
  49                          PEGASUS_DEBUG_ASSERT(
  50                          (_dataType==RESP_INSTNAMES || _dataType==RESP_OBJECTPATHS));
  51                          _resolveToCIM();
  52 marek       1.2.2.11     PEGASUS_DEBUG_ASSERT(_encoding==RESP_ENC_CIM || _encoding == 0);
  53 marek       1.2.2.5      return _instanceNames;
  54                      }
  55                      
  56                      // Instance handling
  57                      CIMInstance& CIMResponseData::getInstance()
  58                      {
  59                          PEGASUS_DEBUG_ASSERT(_dataType == RESP_INSTANCE);
  60                          _resolveToCIM();
  61 marek       1.2.2.15     if (0 == _instances.size())
  62                          {
  63                              _instances.append(CIMInstance());
  64                          }
  65 marek       1.2.2.5      return _instances[0];
  66                      }
  67                      
  68                      // Instances handling
  69                      Array<CIMInstance>& CIMResponseData::getInstances()
  70                      {
  71                          PEGASUS_DEBUG_ASSERT(_dataType == RESP_INSTANCES);
  72                          _resolveToCIM();
  73                          return _instances;
  74                      }
  75                      
  76                      // Objects handling
  77                      Array<CIMObject>& CIMResponseData::getObjects()
  78                      {
  79                          PEGASUS_DEBUG_ASSERT(_dataType == RESP_OBJECTS);
  80                          _resolveToCIM();
  81                          return _objects;
  82                      }
  83                      
  84                      // SCMO representation, single instance stored as one element array
  85                      // object paths are represented as SCMOInstance
  86 marek       1.2.2.5  Array<SCMOInstance>& CIMResponseData::getSCMO()
  87                      {
  88                          _resolveToSCMO();
  89                          return _scmoInstances;
  90                      }
  91                      
  92 marek       1.2.2.6  void CIMResponseData::setSCMO(const Array<SCMOInstance>& x)
  93                      {
  94 marek       1.2.2.8      _scmoInstances=x;
  95 marek       1.2.2.6      _encoding |= RESP_ENC_SCMO;
  96                      }
  97                      
  98                      
  99 marek       1.2.2.5  // Binary data is just a data stream
 100                      Array<Uint8>& CIMResponseData::getBinary()
 101                      {
 102 marek       1.2.2.11     PEGASUS_DEBUG_ASSERT(_encoding == RESP_ENC_BINARY || _encoding == 0);
 103 marek       1.2.2.5      return _binaryData;
 104                      }
 105                      
 106                      bool CIMResponseData::setBinary(CIMBuffer& in, bool hasLen)
 107 r.kieninger 1.2.2.1  {
 108                          PEG_METHOD_ENTER(TRC_DISPATCHER,
 109 marek       1.2.2.5          "CIMResponseData::setBinary");
 110 r.kieninger 1.2.2.1  
 111                          if (hasLen)
 112                          {
 113                              if (!in.getUint8A(_binaryData))
 114                              {
 115                                  PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
 116                                      "Failed to get binary object path data!");
 117                                  PEG_METHOD_EXIT();
 118                                  return false;
 119                              }
 120                          }
 121                          else
 122                          {
 123                              size_t remainingDataLength = in.capacity() - in.size();
 124                              _binaryData.append((Uint8*)in.getPtr(), remainingDataLength);
 125                          }
 126 marek       1.2.2.5      _encoding |= RESP_ENC_BINARY;
 127 r.kieninger 1.2.2.1      PEG_METHOD_EXIT();
 128                          return true;
 129 marek       1.2.2.5  }
 130 r.kieninger 1.2.2.1  
 131 marek       1.2.2.5  bool CIMResponseData::setXml(CIMBuffer& in)
 132 r.kieninger 1.2.2.1  {
 133 marek       1.2.2.15     switch (_dataType)
 134 r.kieninger 1.2.2.1      {
 135 marek       1.2.2.15         case RESP_INSTANCE:
 136 r.kieninger 1.2.2.1          {
 137 marek       1.2.2.15             Array<Sint8> inst;
 138 marek       1.2.2.5              Array<Sint8> ref;
 139                                  CIMNamespaceName ns;
 140                                  String host;
 141 marek       1.2.2.15             if (!in.getSint8A(inst))
 142                                  {
 143                                      PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
 144                                          "Failed to get XML instance data!");
 145                                      return false;
 146                                  }
 147                                  _instanceData.insert(0,inst);
 148 marek       1.2.2.5              if (!in.getSint8A(ref))
 149                                  {
 150                                      PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
 151 marek       1.2.2.15                     "Failed to get XML instance data (reference)!");
 152 marek       1.2.2.5                  return false;
 153                                  }
 154 marek       1.2.2.15             _referencesData.insert(0,ref);
 155 marek       1.2.2.5              if (!in.getString(host))
 156                                  {
 157                                      PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
 158                                          "Failed to get XML instance data (host)!");
 159                                      return false;
 160                                  }
 161 marek       1.2.2.15             _hostsData.insert(0,host);
 162 marek       1.2.2.5              if (!in.getNamespaceName(ns))
 163                                  {
 164                                      PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
 165                                          "Failed to get XML instance data (namespace)!");
 166                                      return false;
 167                                  }
 168 marek       1.2.2.15             _nameSpacesData.insert(0,ns);
 169                                  break;
 170                              }
 171                              case RESP_INSTANCES:
 172                              {
 173                                  Uint32 count;
 174                                  if (!in.getUint32(count))
 175                                  {
 176                                      PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
 177                                          "Failed to get XML instance data (number of instance)!");
 178                                      return false;
 179                                  }
 180                                  for (Uint32 i = 0; i < count; i++)
 181                                  {
 182                                      Array<Sint8> inst;
 183                                      Array<Sint8> ref;
 184                                      CIMNamespaceName ns;
 185                                      String host;
 186                                      if (!in.getSint8A(inst))
 187                                      {
 188                                          PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
 189 marek       1.2.2.15                         "Failed to get XML instance data (instances)!");
 190                                          return false;
 191                                      }
 192                                      if (!in.getSint8A(ref))
 193                                      {
 194                                          PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
 195                                              "Failed to get XML instance data (references)!");
 196                                          return false;
 197                                      }
 198                                      if (!in.getString(host))
 199                                      {
 200                                          PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
 201                                              "Failed to get XML instance data (host)!");
 202                                          return false;
 203                                      }
 204                                      if (!in.getNamespaceName(ns))
 205                                      {
 206                                          PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
 207                                              "Failed to get XML instance data (namespace)!");
 208                                          return false;
 209                                      }
 210 marek       1.2.2.15                 _instanceData.append(inst);
 211                                      _referencesData.append(ref);
 212                                      _hostsData.append(host);
 213                                      _nameSpacesData.append(ns);
 214                                  }
 215                                  break;
 216                              }
 217                              case RESP_OBJECTS:
 218                              {
 219                                  Uint32 count;
 220                                  if (!in.getUint32(count))
 221                                  {
 222                                      PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
 223                                          "Failed to get XML object data (number of objects)!");
 224                                      return false;
 225                                  }
 226                                  for (Uint32 i = 0; i < count; i++)
 227                                  {
 228                                      Array<Sint8> obj;
 229                                      Array<Sint8> ref;
 230                                      CIMNamespaceName ns;
 231 marek       1.2.2.15                 String host;
 232                                      if (!in.getSint8A(obj))
 233                                      {
 234                                          PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
 235                                              "Failed to get XML object data (object)!");
 236                                          return false;
 237                                      }
 238                                      if (!in.getSint8A(ref))
 239                                      {
 240                                          PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
 241                                              "Failed to get XML object data (reference)!");
 242                                          return false;
 243                                      }
 244                                      if (!in.getString(host))
 245                                      {
 246                                          PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
 247                                              "Failed to get XML object data (host)!");
 248                                          return false;
 249                                      }
 250                                      if (!in.getNamespaceName(ns))
 251                                      {
 252 marek       1.2.2.15                     PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
 253                                              "Failed to get XML object data (namespace)!");
 254                                          return false;
 255                                      }
 256                                      _instanceData.append(obj);
 257                                      _referencesData.append(ref);
 258                                      _hostsData.append(host);
 259                                      _nameSpacesData.append(ns);
 260                                  }
 261                                  break;
 262                              }
 263                              // internal xml encoding of instance names and object paths not
 264                              // done today
 265                              case RESP_INSTNAMES:
 266                              case RESP_OBJECTPATHS:
 267                              default:
 268                              {
 269                                  PEGASUS_DEBUG_ASSERT(false);
 270 r.kieninger 1.2.2.1          }
 271                          }
 272 marek       1.2.2.5      _encoding |= RESP_ENC_XML;
 273 r.kieninger 1.2.2.1      return true;
 274 marek       1.2.2.5  }
 275                      
 276                      // function used by OperationAggregator to aggregate response data in a
 277                      // single ResponseData object
 278                      void CIMResponseData::appendResponseData(const CIMResponseData & x)
 279                      {
 280                          // as the Messages set the data types, this should be impossible
 281                          PEGASUS_DEBUG_ASSERT(_dataType == x._dataType);
 282                          _encoding |= x._encoding;
 283                      
 284                          // add all binary data
 285                          _binaryData.appendArray(x._binaryData);
 286 r.kieninger 1.2.2.1  
 287 marek       1.2.2.5      // add all the C++ stuff
 288                          _instanceNames.appendArray(x._instanceNames);
 289                          _instances.appendArray(x._instances);
 290                          _objects.appendArray(x._objects);
 291 r.kieninger 1.2.2.1  
 292 marek       1.2.2.5      // add the SCMO instances
 293                          _scmoInstances.appendArray(x._scmoInstances);
 294 r.kieninger 1.2.2.1  
 295 marek       1.2.2.5      // add Xml encodings too
 296                          _referencesData.appendArray(x._referencesData);
 297                          _instanceData.appendArray(x._instanceData);
 298                          _hostsData.appendArray(x._hostsData);
 299                          _nameSpacesData.appendArray(x._nameSpacesData);
 300                      }
 301 r.kieninger 1.2.2.1  
 302 marek       1.2.2.5  // Encoding responses into output format
 303                      void CIMResponseData::encodeBinaryResponse(CIMBuffer& out)
 304 r.kieninger 1.2.2.1  {
 305                          PEG_METHOD_ENTER(TRC_DISPATCHER,
 306 marek       1.2.2.5          "CIMResponseData::encodeBinaryResponse");
 307 r.kieninger 1.2.2.1  
 308 marek       1.2.2.5      // Need to do a complete job here by transferring all contained data
 309                          // into binary format and handing it out in the CIMBuffer
 310                          if (RESP_ENC_BINARY == (_encoding & RESP_ENC_BINARY))
 311 r.kieninger 1.2.2.1      {
 312 marek       1.2.2.5          // Binary does NOT need a marker as it consists of C++ and SCMO
 313 r.kieninger 1.2.2.1          const Array<Uint8>& data = _binaryData;
 314                              out.putBytes(data.getData(), data.size());
 315                          }
 316 marek       1.2.2.5      if (RESP_ENC_CIM == (_encoding & RESP_ENC_CIM))
 317 r.kieninger 1.2.2.1      {
 318 r.kieninger 1.2.2.16         out.putTypeMarker(BIN_TYPE_MARKER_CPPD);
 319 marek       1.2.2.5          switch (_dataType)
 320 r.kieninger 1.2.2.1          {
 321 marek       1.2.2.5              case RESP_INSTNAMES:
 322                                  {
 323                                      out.putObjectPathA(_instanceNames, false);
 324                                      break;
 325                                  }
 326                                  case RESP_INSTANCE:
 327                                  {
 328 marek       1.2.2.15                 if (0 == _instances.size())
 329 marek       1.2.2.5                  {
 330 marek       1.2.2.15                     _instances.append(CIMInstance());
 331 marek       1.2.2.5                  }
 332 marek       1.2.2.15                 out.putInstance(_instances[0], false, false);
 333 marek       1.2.2.5                  break;
 334                                  }
 335                                  case RESP_INSTANCES:
 336                                  {
 337                                      out.putInstanceA(_instances, false);
 338                                      break;
 339                                  }
 340                                  case RESP_OBJECTS:
 341                                  {
 342                                      out.putObjectA(_objects);
 343                                      break;
 344                                  }
 345                                  case RESP_OBJECTPATHS:
 346                                  {
 347 r.kieninger 1.2.2.16                 out.putObjectPathA(_instanceNames, false);
 348 marek       1.2.2.5                  break;
 349                                  }
 350                                  default:
 351                                  {
 352 marek       1.2.2.8                  PEGASUS_DEBUG_ASSERT(false);
 353 marek       1.2.2.5              }
 354 r.kieninger 1.2.2.1          }
 355                          }
 356 marek       1.2.2.5      if (RESP_ENC_SCMO == (_encoding & RESP_ENC_SCMO))
 357 r.kieninger 1.2.2.1      {
 358 r.kieninger 1.2.2.16         out.putTypeMarker(BIN_TYPE_MARKER_SCMO);
 359                              out.putSCMOInstanceA(_scmoInstances);
 360 marek       1.2.2.5      }
 361                          if (RESP_ENC_XML == (_encoding & RESP_ENC_XML))
 362 r.kieninger 1.2.2.1      {
 363 marek       1.2.2.5          // This actually should not happen following general code logic
 364 marek       1.2.2.8          PEGASUS_DEBUG_ASSERT(false);
 365 r.kieninger 1.2.2.1      }
 366                      
 367                          PEG_METHOD_EXIT();
 368                      }
 369                      
 370 marek       1.2.2.13 void CIMResponseData::completeNamespace(const SCMOInstance * x)
 371 marek       1.2.2.12 {
 372 marek       1.2.2.13     const char * ns;
 373                          Uint64 len;
 374                          ns = x->getNameSpace_l(len);
 375 marek       1.2.2.12     // Both internal XML as well as binary always contain a namespace
 376                          // don't have to do anything for those two encodings
 377                          if (RESP_ENC_CIM == (_encoding & RESP_ENC_CIM))
 378                          {
 379                              CIMNamespaceName nsName(ns);
 380                              switch (_dataType)
 381                              {
 382                                  case RESP_INSTANCE:
 383                                  {
 384 marek       1.2.2.15                 if (_instances.size() > 0)
 385                                      {
 386 marek       1.2.2.12                     const CIMInstance& inst = _instances[0];
 387                                          CIMObjectPath& p =
 388                                              const_cast<CIMObjectPath&>(inst.getPath());
 389                                          if (p.getNameSpace().isNull())
 390                                          {
 391                                              p.setNameSpace(nsName);
 392                                          }
 393 marek       1.2.2.15                 }
 394 marek       1.2.2.12             }
 395                                  case RESP_INSTANCES:
 396                                  {
 397                                      for (Uint32 j = 0, n = _instances.size(); j < n; j++)
 398                                      {
 399                                          const CIMInstance& inst = _instances[j];
 400                                          CIMObjectPath& p =
 401                                              const_cast<CIMObjectPath&>(inst.getPath());
 402                                          if (p.getNameSpace().isNull())
 403                                          {
 404                                              p.setNameSpace(nsName);
 405                                          }
 406                                      }
 407                                      break;
 408                                  }
 409                                  case RESP_OBJECTS:
 410                                  {
 411                                      for (Uint32 j = 0, n = _objects.size(); j < n; j++)
 412                                      {
 413                                          const CIMObject& object = _objects[j];
 414                                          CIMObjectPath& p =
 415 marek       1.2.2.12                         const_cast<CIMObjectPath&>(object.getPath());
 416                                          if (p.getNameSpace().isNull())
 417                                          {
 418                                              p.setNameSpace(nsName);
 419                                          }
 420                                      }
 421                                      break;
 422                                  }
 423                                  case RESP_INSTNAMES:
 424                                  case RESP_OBJECTPATHS:
 425                                  {
 426                                      for (Uint32 j = 0, n = _instanceNames.size(); j < n; j++)
 427                                      {
 428                                          CIMObjectPath& p = _instanceNames[j];
 429                                          if (p.getNameSpace().isNull())
 430                                          {
 431                                              p.setNameSpace(nsName);
 432                                          }
 433                                      }
 434                                      break;
 435                                  }
 436 marek       1.2.2.12             default:
 437                                  {
 438                                      PEGASUS_DEBUG_ASSERT(false);
 439                                  }
 440                              }
 441                          }
 442                          if (RESP_ENC_SCMO == (_encoding & RESP_ENC_SCMO))
 443                          {
 444                              for (Uint32 j = 0, n = _scmoInstances.size(); j < n; j++)
 445                              {
 446                                  SCMOInstance & scmoInst=_scmoInstances[j];
 447                                  if (0 == scmoInst.getNameSpace())
 448                                  {
 449                                      scmoInst.setNameSpace_l(ns,len);
 450                                  }
 451                              }
 452                          }
 453                      }
 454                      
 455                      
 456 marek       1.2.2.9  void CIMResponseData::completeHostNameAndNamespace(
 457                          const String & hn,
 458                          const CIMNamespaceName & ns)
 459                      {
 460                          // Internal XML always has host name and namespace
 461 marek       1.2.2.12     // binary data should not ever be present here
 462 marek       1.2.2.9      PEGASUS_DEBUG_ASSERT((RESP_ENC_BINARY != (_encoding & RESP_ENC_BINARY)));
 463                      
 464                          if (RESP_ENC_CIM == (_encoding & RESP_ENC_CIM))
 465                          {
 466                              switch (_dataType)
 467                              {
 468                                  case RESP_OBJECTS:
 469                                  {
 470                                      for (Uint32 j = 0, n = _objects.size(); j < n; j++)
 471                                      {
 472                                          const CIMObject& object = _objects[j];
 473                                          CIMObjectPath& p =
 474                                              const_cast<CIMObjectPath&>(object.getPath());
 475                                          if (p.getHost().size()==0)
 476                                          {
 477                                              p.setHost(hn);
 478                                          }
 479                                          if (p.getNameSpace().isNull())
 480                                          {
 481                                              p.setNameSpace(ns);
 482                                          }
 483 marek       1.2.2.9                  }
 484                                      break;
 485                                  }
 486                                  case RESP_OBJECTPATHS:
 487                                  {
 488                                      for (Uint32 j = 0, n = _instanceNames.size(); j < n; j++)
 489                                      {
 490                                          CIMObjectPath& p = _instanceNames[j];
 491                                          if (p.getHost().size() == 0)
 492                                              p.setHost(hn);
 493                                          if (p.getNameSpace().isNull())
 494                                              p.setNameSpace(ns);
 495                                      }
 496                                      break;
 497                                  }
 498                                  default:
 499                                  {
 500                                      PEGASUS_DEBUG_ASSERT(false);
 501                                  }
 502                              }
 503                          }
 504 marek       1.2.2.9      if (RESP_ENC_SCMO == (_encoding & RESP_ENC_SCMO))
 505                          {
 506                              CString hnCString=hn.getCString();
 507                              const char* hnChars = hnCString;
 508                              Uint32 hnLen = strlen(hnChars);
 509                              CString nsCString=ns.getString().getCString();
 510                              const char* nsChars=nsCString;
 511                              Uint32 nsLen = strlen(nsChars);
 512                              switch (_dataType)
 513                              {
 514                                  case RESP_OBJECTS:
 515                                  case RESP_OBJECTPATHS:
 516                                  {
 517                                      for (Uint32 j = 0, n = _scmoInstances.size(); j < n; j++)
 518                                      {
 519                                          SCMOInstance & scmoInst=_scmoInstances[j];
 520                                          if (0 == scmoInst.getHostName())
 521                                          {
 522                                              scmoInst.setHostName_l(hnChars,hnLen);
 523                                          }
 524                                          if (0 == scmoInst.getNameSpace())
 525 marek       1.2.2.9                      {
 526                                              scmoInst.setNameSpace_l(nsChars,nsLen);
 527                                          }
 528                                      }
 529                                      break;
 530                                  }
 531                                  default:
 532                                  {
 533                                      PEGASUS_DEBUG_ASSERT(false);
 534                                  }
 535                              }
 536                          }
 537                      }
 538                      
 539 marek       1.2.2.5  void CIMResponseData::encodeXmlResponse(Buffer& out)
 540 r.kieninger 1.2.2.1  {
 541 marek       1.2.2.10     PEG_TRACE((TRC_XML, Tracer::LEVEL3,
 542                              "CIMResponseData::encodeXmlResponse(encoding=%X,content=%X)\n",
 543 marek       1.2.2.5          _encoding,
 544 marek       1.2.2.10         _dataType));
 545 r.kieninger 1.2.2.1  
 546 marek       1.2.2.5      if (RESP_ENC_XML == (_encoding & RESP_ENC_XML))
 547 r.kieninger 1.2.2.1      {
 548 marek       1.2.2.5          switch (_dataType)
 549 r.kieninger 1.2.2.1          {
 550 marek       1.2.2.5              case RESP_INSTANCE:
 551                                  {
 552 marek       1.2.2.15                 const Array<ArraySint8>& a = _instanceData;
 553                                      out.append((char*)a[0].getData(), a[0].size() - 1);
 554 marek       1.2.2.5                  break;
 555                                  }
 556                                  case RESP_INSTANCES:
 557                                  {
 558                                      const Array<ArraySint8>& a = _instanceData;
 559                                      const Array<ArraySint8>& b = _referencesData;
 560 r.kieninger 1.2.2.1  
 561 marek       1.2.2.5                  for (Uint32 i = 0, n = a.size(); i < n; i++)
 562                                      {
 563                                          out << STRLIT("<VALUE.NAMEDINSTANCE>\n");
 564                                          out.append((char*)b[i].getData(), b[i].size() - 1);
 565                                          out.append((char*)a[i].getData(), a[i].size() - 1);
 566                                          out << STRLIT("</VALUE.NAMEDINSTANCE>\n");
 567                                      }
 568                                      break;
 569                                  }
 570                                  case RESP_OBJECTS:
 571 r.kieninger 1.2.2.1              {
 572 marek       1.2.2.5                  const Array<ArraySint8>& a = _instanceData;
 573                                      const Array<ArraySint8>& b = _referencesData;
 574 r.kieninger 1.2.2.1  
 575 marek       1.2.2.5                  for (Uint32 i = 0, n = a.size(); i < n; i++)
 576                                      {
 577                                          out << STRLIT("<VALUE.OBJECTWITHPATH>\n");
 578                                          out.append((char*)b[i].getData(), b[i].size() - 1);
 579                                          out.append((char*)a[i].getData(), a[i].size() - 1);
 580                                          out << STRLIT("</VALUE.OBJECTWITHPATH>\n");
 581                                      }
 582                                      break;
 583                                  }
 584 marek       1.2.2.15             // internal xml encoding of instance names and object paths not
 585                                  // done today
 586                                  case RESP_INSTNAMES:
 587 marek       1.2.2.5              case RESP_OBJECTPATHS:
 588                                  default:
 589                                  {
 590 marek       1.2.2.8                  PEGASUS_DEBUG_ASSERT(false);
 591 r.kieninger 1.2.2.1              }
 592                              }
 593                          }
 594                      
 595 marek       1.2.2.5      if (RESP_ENC_CIM == (_encoding & RESP_ENC_CIM))
 596 r.kieninger 1.2.2.1      {
 597 marek       1.2.2.5          switch (_dataType)
 598 r.kieninger 1.2.2.1          {
 599 marek       1.2.2.5              case RESP_INSTNAMES:
 600                                  {
 601                                      for (Uint32 i = 0, n = _instanceNames.size(); i < n; i++)
 602                                      {
 603                                          XmlWriter::appendInstanceNameElement(out,_instanceNames[i]);
 604                                      }
 605                                      break;
 606                                  }
 607                                  case RESP_INSTANCE:
 608                                  {
 609 marek       1.2.2.15                 if (_instances.size() > 0)
 610 marek       1.2.2.5                  {
 611                                          XmlWriter::appendInstanceElement(out, _instances[0]);
 612                                      }
 613                                      break;
 614                                  }
 615                                  case RESP_INSTANCES:
 616                                  {
 617                                      for (Uint32 i = 0, n = _instances.size(); i < n; i++)
 618                                      {
 619                                          XmlWriter::appendValueNamedInstanceElement(
 620                                              out, _instances[i]);
 621                                      }
 622                                      break;
 623                                  }
 624                                  case RESP_OBJECTS:
 625                                  {
 626                                      for (Uint32 i = 0; i < _objects.size(); i++)
 627                                      {
 628                                          XmlWriter::appendValueObjectWithPathElement(
 629                                              out,
 630                                              _objects[i]);
 631 marek       1.2.2.5                  }
 632                                      break;
 633                                  }
 634                                  case RESP_OBJECTPATHS:
 635                                  {
 636                                      for (Uint32 i = 0, n = _instanceNames.size(); i < n; i++)
 637                                      {
 638                                          out << "<OBJECTPATH>\n";
 639                                          XmlWriter::appendValueReferenceElement(
 640                                              out,
 641                                              _instanceNames[i],
 642                                              false);
 643                                          out << "</OBJECTPATH>\n";
 644                                      }
 645                                      break;
 646                                  }
 647                                  default:
 648                                  {
 649 marek       1.2.2.8                  PEGASUS_DEBUG_ASSERT(false);
 650 marek       1.2.2.5              }
 651 r.kieninger 1.2.2.1          }
 652                          }
 653 marek       1.2.2.5      if (RESP_ENC_SCMO == (_encoding & RESP_ENC_SCMO))
 654 r.kieninger 1.2.2.1      {
 655 marek       1.2.2.5          switch (_dataType)
 656 r.kieninger 1.2              {
 657 marek       1.2.2.5              case RESP_INSTNAMES:
 658                                  {
 659                                      for (Uint32 i = 0, n = _scmoInstances.size(); i < n; i++)
 660                                      {
 661                                          SCMOXmlWriter::appendInstanceNameElement(
 662                                              out,
 663                                              _scmoInstances[i]);
 664                                      }
 665                                      break;
 666                                  }
 667                                  case RESP_INSTANCE:
 668                                  {
 669                                      if (_scmoInstances.size() > 0)
 670                                      {
 671                                          SCMOXmlWriter::appendInstanceElement(out,_scmoInstances[0]);
 672                                      }
 673                                      break;
 674                                  }
 675                                  case RESP_INSTANCES:
 676                                  {
 677                                      for (Uint32 i = 0, n = _scmoInstances.size(); i < n; i++)
 678 marek       1.2.2.5                  {
 679                                          SCMOXmlWriter::appendValueSCMOInstanceElement(
 680                                              out,
 681                                              _scmoInstances[i]);
 682                                      }
 683                                      break;
 684                                  }
 685                                  case RESP_OBJECTS:
 686                                  {
 687                                      for (Uint32 i = 0; i < _scmoInstances.size(); i++)
 688                                      {
 689                                          SCMOXmlWriter::appendValueObjectWithPathElement(
 690                                              out,
 691                                              _scmoInstances[i]);
 692                                      }
 693                                      break;
 694                                  }
 695                                  case RESP_OBJECTPATHS:
 696                                  {
 697 marek       1.2.2.7                  for (Uint32 i = 0, n = _scmoInstances.size(); i < n; i++)
 698                                      {
 699                                          out << "<OBJECTPATH>\n";
 700                                          SCMOXmlWriter::appendValueReferenceElement(
 701                                              out,
 702                                              _scmoInstances[i],
 703                                              false);
 704                                          out << "</OBJECTPATH>\n";
 705                                      }
 706 marek       1.2.2.5                  break;
 707                                  }
 708                                  default:
 709                                  {
 710 marek       1.2.2.8                  PEGASUS_DEBUG_ASSERT(false);
 711 marek       1.2.2.5              }
 712 r.kieninger 1.2              }
 713 r.kieninger 1.1          }
 714 marek       1.2.2.5  }
 715 r.kieninger 1.1      
 716 marek       1.2.2.5  // contrary to encodeXmlResponse this function encodes the Xml in a format
 717                      // not usable by clients
 718                      void CIMResponseData::encodeInternalXmlResponse(CIMBuffer& out)
 719                      {
 720 marek       1.2.2.15     // already existing Internal XML does not need to be encoded further
 721                          // binary input is not actually impossible here, but we have an established
 722                          // fallback
 723                          if (RESP_ENC_BINARY == (_encoding & RESP_ENC_BINARY))
 724                          {
 725                              _resolveBinary();
 726                          }
 727                          if (RESP_ENC_CIM == (_encoding & RESP_ENC_CIM))
 728                          {
 729                              switch (_dataType)
 730                              {
 731                                  case RESP_INSTANCE:
 732                                  {
 733                                      if (0 == _instances.size())
 734                                      {
 735                                          _instances.append(CIMInstance());
 736                                      }
 737                                      CIMInternalXmlEncoder::_putXMLInstance(out, _instances[0]);
 738                                      break;
 739                                  }
 740                                  case RESP_INSTANCES:
 741 marek       1.2.2.15             {
 742                                      Uint32 n = _instances.size();
 743                                      out.putUint32(n);
 744                                      for (Uint32 i = 0; i < n; i++)
 745                                      {
 746                                          CIMInternalXmlEncoder::_putXMLNamedInstance(
 747                                              out,
 748                                              _instances[i]);
 749                                      }
 750                                      break;
 751                                  }
 752                                  case RESP_OBJECTS:
 753                                  {
 754                                      Uint32 n = _objects.size();
 755                                      out.putUint32(n);
 756                                      for (Uint32 i = 0; i < n; i++)
 757                                      {
 758                                          CIMInternalXmlEncoder::_putXMLObject(out, _objects[i]);
 759                                      }
 760                                      break;
 761                                  }
 762 marek       1.2.2.15             // internal xml encoding of instance names and object paths not
 763                                  // done today
 764                                  case RESP_INSTNAMES:
 765                                  case RESP_OBJECTPATHS:
 766                                  default:
 767                                  {
 768                                      PEGASUS_DEBUG_ASSERT(false);
 769                                  }
 770                              }
 771                          }
 772                          if (RESP_ENC_SCMO == (_encoding & RESP_ENC_SCMO))
 773                          {
 774                              switch (_dataType)
 775                              {
 776                                  case RESP_INSTANCE:
 777                                  {
 778                                      if (0 == _scmoInstances.size())
 779                                      {
 780                                          _scmoInstances.append(SCMOInstance());
 781                                      }
 782                                      SCMOInternalXmlEncoder::_putXMLInstance(out, _scmoInstances[0]);
 783 marek       1.2.2.15                 break;
 784                                  }
 785                                  case RESP_INSTANCES:
 786                                  {
 787                                      Uint32 n = _scmoInstances.size();
 788                                      out.putUint32(n);
 789                                      for (Uint32 i = 0; i < n; i++)
 790                                      {
 791                                          SCMOInternalXmlEncoder::_putXMLNamedInstance(
 792                                                  out,
 793                                                  _scmoInstances[i]);
 794                                      }
 795                                      break;
 796                                  }
 797                                  case RESP_OBJECTS:
 798                                  {
 799                                      Uint32 n = _scmoInstances.size();
 800                                      out.putUint32(n);
 801                                      for (Uint32 i = 0; i < n; i++)
 802                                      {
 803                                          SCMOInternalXmlEncoder::_putXMLObject(
 804 marek       1.2.2.15                         out,
 805                                              _scmoInstances[i]);
 806                                      }
 807                                      break;
 808                                  }
 809                                  // internal xml encoding of instance names and object paths not
 810                                  // done today
 811                                  case RESP_INSTNAMES:
 812                                  case RESP_OBJECTPATHS:
 813                                  default:
 814                                  {
 815                                      PEGASUS_DEBUG_ASSERT(false);
 816                                  }
 817                              }
 818                          }
 819 marek       1.2.2.5  }
 820 r.kieninger 1.1      
 821 marek       1.2.2.5  void CIMResponseData::_resolveToCIM()
 822 r.kieninger 1.1      {
 823 marek       1.2.2.10     PEG_TRACE((TRC_XML, Tracer::LEVEL2,
 824                              "CIMResponseData::_resolveToCIM(encoding=%X,content=%X)\n",
 825 marek       1.2.2.5          _encoding,
 826 marek       1.2.2.10         _dataType));
 827                      
 828 marek       1.2.2.5      if (RESP_ENC_XML == (_encoding & RESP_ENC_XML))
 829 r.kieninger 1.1          {
 830 marek       1.2.2.5          _resolveXmlToCIM();
 831 r.kieninger 1.1          }
 832 marek       1.2.2.5      if (RESP_ENC_BINARY == (_encoding & RESP_ENC_BINARY))
 833 r.kieninger 1.1          {
 834 marek       1.2.2.5          _resolveBinary();
 835 r.kieninger 1.1          }
 836 marek       1.2.2.5      if (RESP_ENC_SCMO == (_encoding & RESP_ENC_SCMO))
 837 r.kieninger 1.1          {
 838 marek       1.2.2.5          _resolveSCMOToCIM();
 839 r.kieninger 1.1          }
 840 r.kieninger 1.2.2.16 
 841 marek       1.2.2.11     PEGASUS_DEBUG_ASSERT(_encoding == RESP_ENC_CIM || _encoding == 0);
 842 marek       1.2.2.5  }
 843 r.kieninger 1.1      
 844 marek       1.2.2.5  void CIMResponseData::_resolveToSCMO()
 845                      {
 846 marek       1.2.2.10     PEG_TRACE((TRC_XML, Tracer::LEVEL2,
 847                              "CIMResponseData::_resolveToSCMO(encoding=%X,content=%X)\n",
 848 marek       1.2.2.5          _encoding,
 849 marek       1.2.2.10         _dataType));
 850                      
 851 marek       1.2.2.5      if (RESP_ENC_XML == (_encoding & RESP_ENC_XML))
 852 r.kieninger 1.1          {
 853 marek       1.2.2.5          _resolveXmlToSCMO();
 854 r.kieninger 1.1          }
 855 marek       1.2.2.5      if (RESP_ENC_BINARY == (_encoding & RESP_ENC_BINARY))
 856 r.kieninger 1.1          {
 857 marek       1.2.2.5          _resolveBinary();
 858 r.kieninger 1.1          }
 859 marek       1.2.2.5      if (RESP_ENC_CIM == (_encoding & RESP_ENC_CIM))
 860 r.kieninger 1.1          {
 861 marek       1.2.2.5          _resolveCIMToSCMO();
 862 r.kieninger 1.1          }
 863 marek       1.2.2.11     PEGASUS_DEBUG_ASSERT(_encoding == RESP_ENC_SCMO || _encoding == 0);
 864 r.kieninger 1.1      }
 865                      
 866 marek       1.2.2.5  // helper functions to transform different formats into one-another
 867                      // functions work on the internal data and calling of them should be
 868                      // avoided whenever possible
 869                      void CIMResponseData::_resolveBinary()
 870 r.kieninger 1.1      {
 871 r.kieninger 1.2.2.16     PEG_METHOD_ENTER(TRC_DISPATCHER,
 872                              "CIMResponseData::_resolveBinary");
 873 r.kieninger 1.1      
 874 r.kieninger 1.2.2.16     CIMBuffer in((char*)_binaryData.getData(), _binaryData.size());
 875                      
 876                          while (in.more())
 877 r.kieninger 1.1          {
 878 r.kieninger 1.2.2.16         Uint32 binaryTypeMarker=0;
 879                              if(!in.getTypeMarker(binaryTypeMarker))
 880 marek       1.2.2.5          {
 881 r.kieninger 1.2.2.16             PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
 882                                      "Failed to get type marker for binary objects!");
 883                                  PEG_METHOD_EXIT();
 884                                  in.release();
 885                                  return;
 886 marek       1.2.2.5          }
 887 r.kieninger 1.2.2.16 
 888                              if (BIN_TYPE_MARKER_SCMO==binaryTypeMarker)
 889 marek       1.2.2.5          {
 890 r.kieninger 1.2.2.16             if (!in.getSCMOInstanceA(_scmoInstances))
 891                                  {
 892                                      _encoding &=(~RESP_ENC_BINARY);
 893                                      in.release();
 894                                      PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
 895                                          "Failed to resolve binary SCMOInstances!");
 896                                      PEG_METHOD_EXIT();
 897                                      return;
 898                                  }
 899                      
 900                                  _encoding |= RESP_ENC_SCMO;
 901 marek       1.2.2.5          }
 902 r.kieninger 1.2.2.16         else
 903 marek       1.2.2.5          {
 904 r.kieninger 1.2.2.16             switch (_dataType)
 905                                  {
 906                                      // TODO: Decide what to decode based on marker
 907                                      case RESP_INSTNAMES:
 908                                      case RESP_OBJECTPATHS:
 909                                      {
 910                                          if (!in.getObjectPathA(_instanceNames))
 911                                          {
 912                                              _encoding &=(~RESP_ENC_BINARY);
 913                                              in.release();
 914                                              PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
 915                                                  "Failed to resolve binary CIMObjectPaths!");
 916                                              PEG_METHOD_EXIT();
 917                                              return;
 918                                          }
 919                                          break;
 920                                      }
 921                                      case RESP_INSTANCE:
 922                                      {
 923                                          CIMInstance instance;
 924                                          if (!in.getInstance(instance))
 925 r.kieninger 1.2.2.16                     {
 926                                              _encoding &=(~RESP_ENC_BINARY);
 927                                              _encoding |= RESP_ENC_CIM;
 928                                              _instances.append(instance);
 929                                              in.release();
 930                                              PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
 931                                                  "Failed to resolve binary instance!");
 932                                              PEG_METHOD_EXIT();
 933                                              return;
 934                                          }
 935                      
 936                                          _instances.append(instance);
 937                                          break;
 938                                      }
 939                                      case RESP_INSTANCES:
 940                                      {
 941                                          if (!in.getInstanceA(_instances))
 942                                          {
 943                                              _encoding &=(~RESP_ENC_BINARY);
 944                                              in.release();
 945                                              PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
 946 r.kieninger 1.2.2.16                             "Failed to resolve binary CIMInstances!");
 947                                              PEG_METHOD_EXIT();
 948                                              return;
 949                                          }
 950                                          break;
 951                                      }
 952                                      case RESP_OBJECTS:
 953                                      {
 954                                          if (!in.getObjectA(_objects))
 955                                          {
 956                                              in.release();
 957                                              _encoding &=(~RESP_ENC_BINARY);
 958                                              PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
 959                                                  "Failed to resolve binary CIMObjects!");
 960                                              PEG_METHOD_EXIT();
 961                                              return;
 962                                          }
 963                                          break;
 964                                      }
 965                                      default:
 966                                      {
 967 r.kieninger 1.2.2.16                     PEGASUS_DEBUG_ASSERT(false);
 968                                      }
 969                                  } // switch
 970                                  _encoding |= RESP_ENC_CIM;
 971                              } // else SCMO
 972 r.kieninger 1.1          }
 973 r.kieninger 1.2.2.16 
 974                          _encoding &=(~RESP_ENC_BINARY);
 975                      
 976                          in.release();
 977                          PEG_METHOD_EXIT();
 978 r.kieninger 1.1      }
 979                      
 980 marek       1.2.2.5  void CIMResponseData::_resolveXmlToCIM()
 981 r.kieninger 1.1      {
 982 marek       1.2.2.5      switch (_dataType)
 983                          {
 984 marek       1.2.2.10         // same encoding for instance names and object paths
 985                              case RESP_OBJECTPATHS:
 986 marek       1.2.2.5          case RESP_INSTNAMES:
 987                              {
 988                                  for (Uint32 i = 0; i < _referencesData.size(); i++)
 989                                  {
 990                                      CIMObjectPath cop;
 991                                      // Deserialize path:
 992                                      {
 993                                          XmlParser parser((char*)_referencesData[i].getData());
 994                      
 995                                          if (XmlReader::getInstanceNameElement(parser, cop))
 996                                          {
 997                                              if (!_nameSpacesData[i].isNull())
 998                                                  cop.setNameSpace(_nameSpacesData[i]);
 999                      
1000                                              if (_hostsData[i].size())
1001                                                  cop.setHost(_hostsData[i]);
1002                                          }
1003                                      }
1004                                      _instanceNames.append(cop);
1005                                  }
1006                                  break;
1007 marek       1.2.2.5          }
1008                              case RESP_INSTANCE:
1009                              {
1010                                  CIMInstance cimInstance;
1011                                  // Deserialize instance:
1012                                  {
1013                                      XmlParser parser((char*)_instanceData[0].getData());
1014 r.kieninger 1.1      
1015 marek       1.2.2.5                  if (!XmlReader::getInstanceElement(parser, cimInstance))
1016                                      {
1017                                          cimInstance = CIMInstance();
1018                                          PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
1019                                              "Failed to resolve XML instance, parser error!");
1020                                      }
1021                                  }
1022                                  // Deserialize path:
1023                                  {
1024                                      XmlParser parser((char*)_referencesData[0].getData());
1025                                      CIMObjectPath cimObjectPath;
1026 r.kieninger 1.1      
1027 marek       1.2.2.5                  if (XmlReader::getValueReferenceElement(parser, cimObjectPath))
1028                                      {
1029                                          if (_hostsData.size())
1030                                          {
1031                                              cimObjectPath.setHost(_hostsData[0]);
1032                                          }
1033                                          if (!_nameSpacesData[0].isNull())
1034                                          {
1035                                              cimObjectPath.setNameSpace(_nameSpacesData[0]);
1036                                          }
1037                                          cimInstance.setPath(cimObjectPath);
1038                                          // only if everything works we add the CIMInstance to the
1039                                          // array
1040                                          _instances.append(cimInstance);
1041                                      }
1042                                  }
1043                                  break;
1044                              }
1045                              case RESP_INSTANCES:
1046                              {
1047                                  for (Uint32 i = 0; i < _instanceData.size(); i++)
1048 marek       1.2.2.5              {
1049                                      CIMInstance cimInstance;
1050                                      // Deserialize instance:
1051                                      {
1052                                          XmlParser parser((char*)_instanceData[i].getData());
1053                      
1054                                          if (!XmlReader::getInstanceElement(parser, cimInstance))
1055                                          {
1056                                              PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
1057                                                  "Failed to resolve XML instance."
1058                                                      " Creating empty instance!");
1059                                              cimInstance = CIMInstance();
1060                                          }
1061                                      }
1062                      
1063                                      // Deserialize path:
1064                                      {
1065                                          XmlParser parser((char*)_referencesData[i].getData());
1066                                          CIMObjectPath cimObjectPath;
1067                      
1068                                          if (XmlReader::getInstanceNameElement(parser,cimObjectPath))
1069 marek       1.2.2.5                      {
1070                                              if (!_nameSpacesData[i].isNull())
1071                                                  cimObjectPath.setNameSpace(_nameSpacesData[i]);
1072                      
1073                                              if (_hostsData[i].size())
1074                                                  cimObjectPath.setHost(_hostsData[i]);
1075                      
1076                                              cimInstance.setPath(cimObjectPath);
1077                                          }
1078                                      }
1079 r.kieninger 1.1      
1080 marek       1.2.2.5                  _instances.append(cimInstance);
1081                                  }
1082                                  break;
1083                              }
1084                              case RESP_OBJECTS:
1085                              {
1086                                  for (Uint32 i=0, n=_instanceData.size(); i<n; i++)
1087                                  {
1088                                      CIMObject cimObject;
1089                      
1090                                      // Deserialize Objects:
1091                                      {
1092                                          XmlParser parser((char*)_instanceData[i].getData());
1093                      
1094                                          CIMInstance cimInstance;
1095                                          CIMClass cimClass;
1096                      
1097                                          if (XmlReader::getInstanceElement(parser, cimInstance))
1098                                          {
1099                                              cimObject = CIMObject(cimInstance);
1100                                          }
1101 marek       1.2.2.5                      else if (XmlReader::getClassElement(parser, cimClass))
1102                                          {
1103                                              cimObject = CIMObject(cimClass);
1104                                          }
1105                                          else
1106                                          {
1107                                              PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
1108                                                  "Failed to get XML object data!");
1109                                          }
1110                                      }
1111                      
1112                                      // Deserialize paths:
1113                                      {
1114                                          XmlParser parser((char*)_referencesData[i].getData());
1115                                          CIMObjectPath cimObjectPath;
1116                      
1117                                          if (XmlReader::getValueReferenceElement(
1118                                                  parser,
1119                                                  cimObjectPath))
1120                                          {
1121                                              if (!_nameSpacesData[i].isNull())
1122 marek       1.2.2.5                              cimObjectPath.setNameSpace(_nameSpacesData[i]);
1123                      
1124                                              if (_hostsData[i].size())
1125                                                  cimObjectPath.setHost(_hostsData[i]);
1126                      
1127                                              cimObject.setPath(cimObjectPath);
1128                                          }
1129                                      }
1130                                      _objects.append(cimObject);
1131                                  }
1132                                  break;
1133                              }
1134                              default:
1135                              {
1136 marek       1.2.2.8              PEGASUS_DEBUG_ASSERT(false);
1137 marek       1.2.2.5          }
1138                          }
1139                          // Xml was resolved, release Xml content now
1140                          _referencesData.clear();
1141                          _hostsData.clear();
1142                          _nameSpacesData.clear();
1143                          _instanceData.clear();
1144                          // remove Xml Encoding flag
1145 marek       1.2.2.8      _encoding &=(~RESP_ENC_XML);
1146 marek       1.2.2.5      // add CIM Encoding flag
1147                          _encoding |=RESP_ENC_CIM;
1148 r.kieninger 1.1      }
1149                      
1150 marek       1.2.2.5  void CIMResponseData::_resolveXmlToSCMO()
1151 r.kieninger 1.2.2.4  {
1152 marek       1.2.2.5      // Not optimal, can probably be improved
1153                          // but on the other hand, since using the binary format this case should
1154                          // actually not ever happen.
1155                          _resolveXmlToCIM();
1156                          _resolveCIMToSCMO();
1157                      }
1158 r.kieninger 1.2.2.4  
1159 marek       1.2.2.5  void CIMResponseData::_resolveSCMOToCIM()
1160                      {
1161                          switch(_dataType)
1162 r.kieninger 1.2.2.4      {
1163 marek       1.2.2.5          case RESP_INSTNAMES:
1164                              case RESP_OBJECTPATHS:
1165 r.kieninger 1.1              {
1166 marek       1.2.2.5              for (Uint32 x=0, n=_scmoInstances.size(); x < n; x++)
1167                                  {
1168                                      CIMObjectPath newObjectPath;
1169                                      _scmoInstances[x].getCIMObjectPath(newObjectPath);
1170                                      _instanceNames.append(newObjectPath);
1171                                  }
1172                                  break;
1173 r.kieninger 1.1              }
1174 marek       1.2.2.5          case RESP_INSTANCE:
1175 r.kieninger 1.1              {
1176 marek       1.2.2.8              if (_scmoInstances.size() > 0)
1177                                  {
1178                                      CIMInstance newInstance;
1179                                      _scmoInstances[0].getCIMInstance(newInstance);
1180                                      _instances.append(newInstance);
1181                                  }
1182 marek       1.2.2.5              break;
1183 marek       1.2.2.2          }
1184 marek       1.2.2.5          case RESP_INSTANCES:
1185 r.kieninger 1.2              {
1186 marek       1.2.2.5              for (Uint32 x=0, n=_scmoInstances.size(); x < n; x++)
1187 r.kieninger 1.1                  {
1188 marek       1.2.2.5                  CIMInstance newInstance;
1189                                      _scmoInstances[x].getCIMInstance(newInstance);
1190                                      _instances.append(newInstance);
1191 r.kieninger 1.1                  }
1192 marek       1.2.2.5              break;
1193 r.kieninger 1.1              }
1194 marek       1.2.2.5          case RESP_OBJECTS:
1195 r.kieninger 1.1              {
1196 marek       1.2.2.5              for (Uint32 x=0, n=_scmoInstances.size(); x < n; x++)
1197 r.kieninger 1.1                  {
1198 marek       1.2.2.5                  CIMInstance newInstance;
1199                                      _scmoInstances[x].getCIMInstance(newInstance);
1200                                      _objects.append(CIMObject(newInstance));
1201 r.kieninger 1.1                  }
1202 marek       1.2.2.5              break;
1203 r.kieninger 1.1              }
1204 marek       1.2.2.5          default:
1205 r.kieninger 1.2.2.1          {
1206 marek       1.2.2.8              PEGASUS_DEBUG_ASSERT(false);
1207 r.kieninger 1.2.2.1          }
1208                          }
1209 marek       1.2.2.5      _scmoInstances.clear();
1210                          // remove CIM Encoding flag
1211 marek       1.2.2.8      _encoding &=(~RESP_ENC_SCMO);
1212 marek       1.2.2.5      // add SCMO Encoding flag
1213                          _encoding |=RESP_ENC_CIM;
1214 r.kieninger 1.2.2.1  }
1215                      
1216 marek       1.2.2.5  void CIMResponseData::_resolveCIMToSCMO()
1217 r.kieninger 1.1      {
1218 marek       1.2.2.5      switch (_dataType)
1219 r.kieninger 1.2          {
1220 marek       1.2.2.5          case RESP_INSTNAMES:
1221 r.kieninger 1.2              {
1222 marek       1.2.2.5              for (Uint32 i=0,n=_instanceNames.size();i<n;i++)
1223                                  {
1224 thilo.boehm 1.2.2.14                 SCMOInstance addme(_instanceNames[i]);
1225 marek       1.2.2.5                  _scmoInstances.append(addme);
1226                                  }
1227 marek       1.2.2.8              _instanceNames.clear();
1228 marek       1.2.2.5              break;
1229 r.kieninger 1.2              }
1230 marek       1.2.2.5          case RESP_INSTANCE:
1231 r.kieninger 1.1              {
1232 marek       1.2.2.8              if (_instances.size() > 0)
1233                                  {
1234 thilo.boehm 1.2.2.14                 SCMOInstance addme(_instances[0]);
1235 marek       1.2.2.15                 _scmoInstances.clear();
1236 marek       1.2.2.8                  _scmoInstances.append(addme);
1237                                      _instances.clear();
1238                                  }
1239 marek       1.2.2.5              break;
1240 r.kieninger 1.1              }
1241 marek       1.2.2.5          case RESP_INSTANCES:
1242 r.kieninger 1.1              {
1243 marek       1.2.2.5              for (Uint32 i=0,n=_instances.size();i<n;i++)
1244                                  {
1245 thilo.boehm 1.2.2.14                 SCMOInstance addme(_instances[i]);
1246 marek       1.2.2.5                  _scmoInstances.append(addme);
1247                                  }
1248 marek       1.2.2.8              _instances.clear();
1249 marek       1.2.2.5              break;
1250 r.kieninger 1.1              }
1251 marek       1.2.2.5          case RESP_OBJECTS:
1252 r.kieninger 1.1              {
1253 marek       1.2.2.8              for (Uint32 i=0,n=_objects.size();i<n;i++)
1254                                  {
1255 thilo.boehm 1.2.2.14                 SCMOInstance addme(_objects[i]);
1256 marek       1.2.2.8                  _scmoInstances.append(addme);
1257                                  }
1258                                  _objects.clear();
1259 marek       1.2.2.5              break;
1260 r.kieninger 1.1              }
1261 marek       1.2.2.9          case RESP_OBJECTPATHS:
1262                              {
1263                                  for (Uint32 i=0,n=_instanceNames.size();i<n;i++)
1264                                  {
1265 thilo.boehm 1.2.2.14                 SCMOInstance addme(_instanceNames[i]);
1266                                      // TODO: More description about this.
1267 marek       1.2.2.9                  if (0 == _instanceNames[i].getKeyBindings().size())
1268                                      {
1269                                          // if there is no keybinding, this is a class
1270                                          addme.setIsClassOnly(true);
1271                                      }
1272                                      _scmoInstances.append(addme);
1273                                  }
1274                                  _instanceNames.clear();
1275                                  break;
1276                              }
1277 marek       1.2.2.5          default:
1278 r.kieninger 1.1              {
1279 marek       1.2.2.8              PEGASUS_DEBUG_ASSERT(false);
1280 r.kieninger 1.1              }
1281                          }
1282                      
1283 marek       1.2.2.5      // remove CIM Encoding flag
1284 marek       1.2.2.8      _encoding &=(~RESP_ENC_CIM);
1285 marek       1.2.2.5      // add SCMO Encoding flag
1286                          _encoding |=RESP_ENC_SCMO;
1287 r.kieninger 1.1      }
1288                      
1289                      PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2