(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 thilo.boehm 1.2.2.19                 out.putObjectPathA(_instanceNames);
 324 marek       1.2.2.5                  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 r.kieninger 1.2.2.20                 out.putInstance(_instances[0], true, true);
 333 marek       1.2.2.5                  break;
 334                                  }
 335                                  case RESP_INSTANCES:
 336                                  {
 337 r.kieninger 1.2.2.20                 out.putInstanceA(_instances);
 338 marek       1.2.2.5                  break;
 339                                  }
 340                                  case RESP_OBJECTS:
 341                                  {
 342                                      out.putObjectA(_objects);
 343                                      break;
 344                                  }
 345                                  case RESP_OBJECTPATHS:
 346                                  {
 347 thilo.boehm 1.2.2.19                 out.putObjectPathA(_instanceNames);
 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 thilo.boehm 1.2.2.23     Uint32 len;
 374 marek       1.2.2.13     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 r.kieninger 1.2.2.18     if ((RESP_ENC_BINARY == (_encoding&RESP_ENC_BINARY)) && (len != 0))
 378                          {
 379 marek       1.2.2.21         _defaultNamespace = CIMNamespaceName(ns);
 380 r.kieninger 1.2.2.18     }
 381 marek       1.2.2.12     if (RESP_ENC_CIM == (_encoding & RESP_ENC_CIM))
 382                          {
 383                              CIMNamespaceName nsName(ns);
 384                              switch (_dataType)
 385                              {
 386                                  case RESP_INSTANCE:
 387                                  {
 388 marek       1.2.2.15                 if (_instances.size() > 0)
 389                                      {
 390 marek       1.2.2.12                     const CIMInstance& inst = _instances[0];
 391                                          CIMObjectPath& p =
 392                                              const_cast<CIMObjectPath&>(inst.getPath());
 393                                          if (p.getNameSpace().isNull())
 394                                          {
 395                                              p.setNameSpace(nsName);
 396                                          }
 397 marek       1.2.2.15                 }
 398 marek       1.2.2.12             }
 399                                  case RESP_INSTANCES:
 400                                  {
 401                                      for (Uint32 j = 0, n = _instances.size(); j < n; j++)
 402                                      {
 403                                          const CIMInstance& inst = _instances[j];
 404                                          CIMObjectPath& p =
 405                                              const_cast<CIMObjectPath&>(inst.getPath());
 406                                          if (p.getNameSpace().isNull())
 407                                          {
 408                                              p.setNameSpace(nsName);
 409                                          }
 410                                      }
 411                                      break;
 412                                  }
 413                                  case RESP_OBJECTS:
 414                                  {
 415                                      for (Uint32 j = 0, n = _objects.size(); j < n; j++)
 416                                      {
 417                                          const CIMObject& object = _objects[j];
 418                                          CIMObjectPath& p =
 419 marek       1.2.2.12                         const_cast<CIMObjectPath&>(object.getPath());
 420                                          if (p.getNameSpace().isNull())
 421                                          {
 422                                              p.setNameSpace(nsName);
 423                                          }
 424                                      }
 425                                      break;
 426                                  }
 427                                  case RESP_INSTNAMES:
 428                                  case RESP_OBJECTPATHS:
 429                                  {
 430                                      for (Uint32 j = 0, n = _instanceNames.size(); j < n; j++)
 431                                      {
 432                                          CIMObjectPath& p = _instanceNames[j];
 433                                          if (p.getNameSpace().isNull())
 434                                          {
 435                                              p.setNameSpace(nsName);
 436                                          }
 437                                      }
 438                                      break;
 439                                  }
 440 marek       1.2.2.12             default:
 441                                  {
 442                                      PEGASUS_DEBUG_ASSERT(false);
 443                                  }
 444                              }
 445                          }
 446                          if (RESP_ENC_SCMO == (_encoding & RESP_ENC_SCMO))
 447                          {
 448                              for (Uint32 j = 0, n = _scmoInstances.size(); j < n; j++)
 449                              {
 450                                  SCMOInstance & scmoInst=_scmoInstances[j];
 451                                  if (0 == scmoInst.getNameSpace())
 452                                  {
 453                                      scmoInst.setNameSpace_l(ns,len);
 454                                  }
 455                              }
 456                          }
 457                      }
 458                      
 459                      
 460 marek       1.2.2.9  void CIMResponseData::completeHostNameAndNamespace(
 461                          const String & hn,
 462                          const CIMNamespaceName & ns)
 463                      {
 464 marek       1.2.2.21     if (RESP_ENC_BINARY == (_encoding & RESP_ENC_BINARY))
 465                          {
 466                              // On binary need remember hostname and namespace in case someone
 467                              // builds C++ default objects or Xml types from it later on
 468                              // -> usage: See resolveBinary()
 469                              _defaultNamespace=ns;
 470                              _defaultHostname=hn;
 471                          }
 472                          // InternalXml does not support objectPath calls
 473                          if ((RESP_ENC_XML == (_encoding & RESP_ENC_XML)) &&
 474                                  (RESP_OBJECTS == _dataType))
 475                          {
 476                              for (Uint32 j = 0, n = _referencesData.size(); j < n; j++)
 477                              {
 478                                  if (0 == _hostsData[j].size())
 479                                  {
 480                                      _hostsData[j]=hn;
 481                                  }
 482                                  if (_nameSpacesData[j].isNull())
 483                                  {
 484                                      _nameSpacesData[j]=ns;
 485 marek       1.2.2.21             }
 486                              }
 487                          }
 488 marek       1.2.2.9      if (RESP_ENC_CIM == (_encoding & RESP_ENC_CIM))
 489                          {
 490                              switch (_dataType)
 491                              {
 492                                  case RESP_OBJECTS:
 493                                  {
 494                                      for (Uint32 j = 0, n = _objects.size(); j < n; j++)
 495                                      {
 496                                          const CIMObject& object = _objects[j];
 497                                          CIMObjectPath& p =
 498                                              const_cast<CIMObjectPath&>(object.getPath());
 499                                          if (p.getHost().size()==0)
 500                                          {
 501                                              p.setHost(hn);
 502                                          }
 503                                          if (p.getNameSpace().isNull())
 504                                          {
 505                                              p.setNameSpace(ns);
 506                                          }
 507                                      }
 508                                      break;
 509 marek       1.2.2.9              }
 510                                  case RESP_OBJECTPATHS:
 511                                  {
 512                                      for (Uint32 j = 0, n = _instanceNames.size(); j < n; j++)
 513                                      {
 514                                          CIMObjectPath& p = _instanceNames[j];
 515                                          if (p.getHost().size() == 0)
 516                                              p.setHost(hn);
 517                                          if (p.getNameSpace().isNull())
 518                                              p.setNameSpace(ns);
 519                                      }
 520                                      break;
 521                                  }
 522                                  default:
 523                                  {
 524                                      PEGASUS_DEBUG_ASSERT(false);
 525                                  }
 526                              }
 527                          }
 528                          if (RESP_ENC_SCMO == (_encoding & RESP_ENC_SCMO))
 529                          {
 530 marek       1.2.2.9          CString hnCString=hn.getCString();
 531                              const char* hnChars = hnCString;
 532                              Uint32 hnLen = strlen(hnChars);
 533                              CString nsCString=ns.getString().getCString();
 534                              const char* nsChars=nsCString;
 535                              Uint32 nsLen = strlen(nsChars);
 536                              switch (_dataType)
 537                              {
 538                                  case RESP_OBJECTS:
 539                                  case RESP_OBJECTPATHS:
 540                                  {
 541                                      for (Uint32 j = 0, n = _scmoInstances.size(); j < n; j++)
 542                                      {
 543                                          SCMOInstance & scmoInst=_scmoInstances[j];
 544                                          if (0 == scmoInst.getHostName())
 545                                          {
 546                                              scmoInst.setHostName_l(hnChars,hnLen);
 547                                          }
 548                                          if (0 == scmoInst.getNameSpace())
 549                                          {
 550                                              scmoInst.setNameSpace_l(nsChars,nsLen);
 551 marek       1.2.2.9                      }
 552                                      }
 553                                      break;
 554                                  }
 555                                  default:
 556                                  {
 557                                      PEGASUS_DEBUG_ASSERT(false);
 558                                  }
 559                              }
 560                          }
 561                      }
 562                      
 563 marek       1.2.2.5  void CIMResponseData::encodeXmlResponse(Buffer& out)
 564 r.kieninger 1.2.2.1  {
 565 marek       1.2.2.10     PEG_TRACE((TRC_XML, Tracer::LEVEL3,
 566                              "CIMResponseData::encodeXmlResponse(encoding=%X,content=%X)\n",
 567 marek       1.2.2.5          _encoding,
 568 marek       1.2.2.10         _dataType));
 569 r.kieninger 1.2.2.1  
 570 thilo.boehm 1.2.2.22     // already existing Internal XML does not need to be encoded further
 571                          // binary input is not actually impossible here, but we have an established
 572                          // fallback
 573                          if (RESP_ENC_BINARY == (_encoding & RESP_ENC_BINARY))
 574                          {
 575                              _resolveBinary();
 576                          }
 577                      
 578 marek       1.2.2.5      if (RESP_ENC_XML == (_encoding & RESP_ENC_XML))
 579 r.kieninger 1.2.2.1      {
 580 marek       1.2.2.5          switch (_dataType)
 581 r.kieninger 1.2.2.1          {
 582 marek       1.2.2.5              case RESP_INSTANCE:
 583                                  {
 584 marek       1.2.2.15                 const Array<ArraySint8>& a = _instanceData;
 585                                      out.append((char*)a[0].getData(), a[0].size() - 1);
 586 marek       1.2.2.5                  break;
 587                                  }
 588                                  case RESP_INSTANCES:
 589                                  {
 590                                      const Array<ArraySint8>& a = _instanceData;
 591                                      const Array<ArraySint8>& b = _referencesData;
 592 r.kieninger 1.2.2.1  
 593 marek       1.2.2.5                  for (Uint32 i = 0, n = a.size(); i < n; i++)
 594                                      {
 595                                          out << STRLIT("<VALUE.NAMEDINSTANCE>\n");
 596                                          out.append((char*)b[i].getData(), b[i].size() - 1);
 597                                          out.append((char*)a[i].getData(), a[i].size() - 1);
 598                                          out << STRLIT("</VALUE.NAMEDINSTANCE>\n");
 599                                      }
 600                                      break;
 601                                  }
 602                                  case RESP_OBJECTS:
 603 r.kieninger 1.2.2.1              {
 604 marek       1.2.2.5                  const Array<ArraySint8>& a = _instanceData;
 605                                      const Array<ArraySint8>& b = _referencesData;
 606                                      for (Uint32 i = 0, n = a.size(); i < n; i++)
 607                                      {
 608                                          out << STRLIT("<VALUE.OBJECTWITHPATH>\n");
 609 marek       1.2.2.21                     out << STRLIT("<INSTANCEPATH>\n");
 610                                          XmlWriter::appendNameSpacePathElement(
 611                                                  out,
 612                                                  _hostsData[i],
 613                                                  _nameSpacesData[i]);
 614                                          // Leave out the surrounding tags "<VALUE.REFERENCE>\n"
 615                                          // and "</VALUE.REFERENCE>\n" which are 18 and 19 characters
 616                                          // long
 617                                          out.append(
 618                                              ((char*)b[i].getData())+18,
 619                                              b[i].size() - 1 - 18 -19);
 620                                          out << STRLIT("</INSTANCEPATH>\n");
 621                                          // append instance body
 622 marek       1.2.2.5                      out.append((char*)a[i].getData(), a[i].size() - 1);
 623                                          out << STRLIT("</VALUE.OBJECTWITHPATH>\n");
 624                                      }
 625                                      break;
 626                                  }
 627 marek       1.2.2.15             // internal xml encoding of instance names and object paths not
 628                                  // done today
 629                                  case RESP_INSTNAMES:
 630 marek       1.2.2.5              case RESP_OBJECTPATHS:
 631                                  default:
 632                                  {
 633 marek       1.2.2.8                  PEGASUS_DEBUG_ASSERT(false);
 634 r.kieninger 1.2.2.1              }
 635                              }
 636                          }
 637                      
 638 marek       1.2.2.5      if (RESP_ENC_CIM == (_encoding & RESP_ENC_CIM))
 639 r.kieninger 1.2.2.1      {
 640 marek       1.2.2.5          switch (_dataType)
 641 r.kieninger 1.2.2.1          {
 642 marek       1.2.2.5              case RESP_INSTNAMES:
 643                                  {
 644                                      for (Uint32 i = 0, n = _instanceNames.size(); i < n; i++)
 645                                      {
 646                                          XmlWriter::appendInstanceNameElement(out,_instanceNames[i]);
 647                                      }
 648                                      break;
 649                                  }
 650                                  case RESP_INSTANCE:
 651                                  {
 652 marek       1.2.2.15                 if (_instances.size() > 0)
 653 marek       1.2.2.5                  {
 654                                          XmlWriter::appendInstanceElement(out, _instances[0]);
 655                                      }
 656                                      break;
 657                                  }
 658                                  case RESP_INSTANCES:
 659                                  {
 660                                      for (Uint32 i = 0, n = _instances.size(); i < n; i++)
 661                                      {
 662                                          XmlWriter::appendValueNamedInstanceElement(
 663                                              out, _instances[i]);
 664                                      }
 665                                      break;
 666                                  }
 667                                  case RESP_OBJECTS:
 668                                  {
 669                                      for (Uint32 i = 0; i < _objects.size(); i++)
 670                                      {
 671                                          XmlWriter::appendValueObjectWithPathElement(
 672                                              out,
 673                                              _objects[i]);
 674 marek       1.2.2.5                  }
 675                                      break;
 676                                  }
 677                                  case RESP_OBJECTPATHS:
 678                                  {
 679                                      for (Uint32 i = 0, n = _instanceNames.size(); i < n; i++)
 680                                      {
 681                                          out << "<OBJECTPATH>\n";
 682                                          XmlWriter::appendValueReferenceElement(
 683                                              out,
 684                                              _instanceNames[i],
 685                                              false);
 686                                          out << "</OBJECTPATH>\n";
 687                                      }
 688                                      break;
 689                                  }
 690                                  default:
 691                                  {
 692 marek       1.2.2.8                  PEGASUS_DEBUG_ASSERT(false);
 693 marek       1.2.2.5              }
 694 r.kieninger 1.2.2.1          }
 695                          }
 696 marek       1.2.2.5      if (RESP_ENC_SCMO == (_encoding & RESP_ENC_SCMO))
 697 r.kieninger 1.2.2.1      {
 698 marek       1.2.2.5          switch (_dataType)
 699 r.kieninger 1.2              {
 700 marek       1.2.2.5              case RESP_INSTNAMES:
 701                                  {
 702                                      for (Uint32 i = 0, n = _scmoInstances.size(); i < n; i++)
 703                                      {
 704                                          SCMOXmlWriter::appendInstanceNameElement(
 705                                              out,
 706                                              _scmoInstances[i]);
 707                                      }
 708                                      break;
 709                                  }
 710                                  case RESP_INSTANCE:
 711                                  {
 712                                      if (_scmoInstances.size() > 0)
 713                                      {
 714                                          SCMOXmlWriter::appendInstanceElement(out,_scmoInstances[0]);
 715                                      }
 716                                      break;
 717                                  }
 718                                  case RESP_INSTANCES:
 719                                  {
 720                                      for (Uint32 i = 0, n = _scmoInstances.size(); i < n; i++)
 721 marek       1.2.2.5                  {
 722                                          SCMOXmlWriter::appendValueSCMOInstanceElement(
 723                                              out,
 724                                              _scmoInstances[i]);
 725                                      }
 726                                      break;
 727                                  }
 728                                  case RESP_OBJECTS:
 729                                  {
 730                                      for (Uint32 i = 0; i < _scmoInstances.size(); i++)
 731                                      {
 732                                          SCMOXmlWriter::appendValueObjectWithPathElement(
 733                                              out,
 734                                              _scmoInstances[i]);
 735                                      }
 736                                      break;
 737                                  }
 738                                  case RESP_OBJECTPATHS:
 739                                  {
 740 marek       1.2.2.7                  for (Uint32 i = 0, n = _scmoInstances.size(); i < n; i++)
 741                                      {
 742                                          out << "<OBJECTPATH>\n";
 743                                          SCMOXmlWriter::appendValueReferenceElement(
 744                                              out,
 745                                              _scmoInstances[i],
 746                                              false);
 747                                          out << "</OBJECTPATH>\n";
 748                                      }
 749 marek       1.2.2.5                  break;
 750                                  }
 751                                  default:
 752                                  {
 753 marek       1.2.2.8                  PEGASUS_DEBUG_ASSERT(false);
 754 marek       1.2.2.5              }
 755 r.kieninger 1.2              }
 756 r.kieninger 1.1          }
 757 marek       1.2.2.5  }
 758 r.kieninger 1.1      
 759 marek       1.2.2.5  // contrary to encodeXmlResponse this function encodes the Xml in a format
 760                      // not usable by clients
 761                      void CIMResponseData::encodeInternalXmlResponse(CIMBuffer& out)
 762                      {
 763 r.kieninger 1.2.2.18     PEG_TRACE((TRC_XML, Tracer::LEVEL3,
 764                              "CIMResponseData::encodeInternalXmlResponse(encoding=%X,content=%X)\n",
 765                              _encoding,
 766                              _dataType));
 767                      
 768 r.kieninger 1.2.2.20     // For mixed (CIM+SCMO) responses, we need to tell the receiver the
 769                          // total number of instances. The totalSize variable is used to keep track
 770                          // of this.
 771                          Uint32 totalSize = 0;
 772                      
 773 marek       1.2.2.15     // already existing Internal XML does not need to be encoded further
 774                          // binary input is not actually impossible here, but we have an established
 775                          // fallback
 776                          if (RESP_ENC_BINARY == (_encoding & RESP_ENC_BINARY))
 777                          {
 778                              _resolveBinary();
 779                          }
 780 r.kieninger 1.2.2.18     if ((0 == _encoding) ||
 781                              (RESP_ENC_CIM == (_encoding & RESP_ENC_CIM)))
 782 marek       1.2.2.15     {
 783                              switch (_dataType)
 784                              {
 785                                  case RESP_INSTANCE:
 786                                  {
 787                                      if (0 == _instances.size())
 788                                      {
 789                                          _instances.append(CIMInstance());
 790                                      }
 791                                      CIMInternalXmlEncoder::_putXMLInstance(out, _instances[0]);
 792                                      break;
 793                                  }
 794                                  case RESP_INSTANCES:
 795                                  {
 796                                      Uint32 n = _instances.size();
 797 r.kieninger 1.2.2.20                 totalSize = n + _scmoInstances.size();
 798                                      out.putUint32(totalSize);
 799 marek       1.2.2.15                 for (Uint32 i = 0; i < n; i++)
 800                                      {
 801                                          CIMInternalXmlEncoder::_putXMLNamedInstance(
 802                                              out,
 803                                              _instances[i]);
 804                                      }
 805                                      break;
 806                                  }
 807                                  case RESP_OBJECTS:
 808                                  {
 809                                      Uint32 n = _objects.size();
 810 r.kieninger 1.2.2.20                 totalSize = n + _scmoInstances.size();
 811                                      out.putUint32(totalSize);
 812 marek       1.2.2.15                 for (Uint32 i = 0; i < n; i++)
 813                                      {
 814                                          CIMInternalXmlEncoder::_putXMLObject(out, _objects[i]);
 815                                      }
 816                                      break;
 817                                  }
 818                                  // internal xml encoding of instance names and object paths not
 819                                  // done today
 820                                  case RESP_INSTNAMES:
 821                                  case RESP_OBJECTPATHS:
 822                                  default:
 823                                  {
 824                                      PEGASUS_DEBUG_ASSERT(false);
 825                                  }
 826                              }
 827                          }
 828                          if (RESP_ENC_SCMO == (_encoding & RESP_ENC_SCMO))
 829                          {
 830                              switch (_dataType)
 831                              {
 832                                  case RESP_INSTANCE:
 833 marek       1.2.2.15             {
 834                                      if (0 == _scmoInstances.size())
 835                                      {
 836                                          _scmoInstances.append(SCMOInstance());
 837                                      }
 838                                      SCMOInternalXmlEncoder::_putXMLInstance(out, _scmoInstances[0]);
 839                                      break;
 840                                  }
 841                                  case RESP_INSTANCES:
 842                                  {
 843                                      Uint32 n = _scmoInstances.size();
 844 r.kieninger 1.2.2.20                 // Only put the size when not already done above
 845                                      if (0==totalSize)
 846                                      {
 847                                          out.putUint32(n);
 848                                      }
 849 marek       1.2.2.15                 for (Uint32 i = 0; i < n; i++)
 850                                      {
 851                                          SCMOInternalXmlEncoder::_putXMLNamedInstance(
 852                                                  out,
 853                                                  _scmoInstances[i]);
 854                                      }
 855                                      break;
 856                                  }
 857                                  case RESP_OBJECTS:
 858                                  {
 859                                      Uint32 n = _scmoInstances.size();
 860 r.kieninger 1.2.2.20                 // Only put the size when not already done above
 861                                      if (0==totalSize)
 862                                      {
 863                                          out.putUint32(n);
 864                                      }
 865 marek       1.2.2.15                 for (Uint32 i = 0; i < n; i++)
 866                                      {
 867                                          SCMOInternalXmlEncoder::_putXMLObject(
 868                                              out,
 869                                              _scmoInstances[i]);
 870                                      }
 871                                      break;
 872                                  }
 873                                  // internal xml encoding of instance names and object paths not
 874                                  // done today
 875                                  case RESP_INSTNAMES:
 876                                  case RESP_OBJECTPATHS:
 877                                  default:
 878                                  {
 879                                      PEGASUS_DEBUG_ASSERT(false);
 880                                  }
 881                              }
 882                          }
 883 marek       1.2.2.5  }
 884 r.kieninger 1.1      
 885 marek       1.2.2.5  void CIMResponseData::_resolveToCIM()
 886 r.kieninger 1.1      {
 887 marek       1.2.2.10     PEG_TRACE((TRC_XML, Tracer::LEVEL2,
 888                              "CIMResponseData::_resolveToCIM(encoding=%X,content=%X)\n",
 889 marek       1.2.2.5          _encoding,
 890 marek       1.2.2.10         _dataType));
 891                      
 892 marek       1.2.2.5      if (RESP_ENC_XML == (_encoding & RESP_ENC_XML))
 893 r.kieninger 1.1          {
 894 marek       1.2.2.5          _resolveXmlToCIM();
 895 r.kieninger 1.1          }
 896 marek       1.2.2.5      if (RESP_ENC_BINARY == (_encoding & RESP_ENC_BINARY))
 897 r.kieninger 1.1          {
 898 marek       1.2.2.5          _resolveBinary();
 899 r.kieninger 1.1          }
 900 marek       1.2.2.5      if (RESP_ENC_SCMO == (_encoding & RESP_ENC_SCMO))
 901 r.kieninger 1.1          {
 902 marek       1.2.2.5          _resolveSCMOToCIM();
 903 r.kieninger 1.1          }
 904 r.kieninger 1.2.2.16 
 905 marek       1.2.2.11     PEGASUS_DEBUG_ASSERT(_encoding == RESP_ENC_CIM || _encoding == 0);
 906 marek       1.2.2.5  }
 907 r.kieninger 1.1      
 908 marek       1.2.2.5  void CIMResponseData::_resolveToSCMO()
 909                      {
 910 marek       1.2.2.10     PEG_TRACE((TRC_XML, Tracer::LEVEL2,
 911                              "CIMResponseData::_resolveToSCMO(encoding=%X,content=%X)\n",
 912 marek       1.2.2.5          _encoding,
 913 marek       1.2.2.10         _dataType));
 914                      
 915 marek       1.2.2.5      if (RESP_ENC_XML == (_encoding & RESP_ENC_XML))
 916 r.kieninger 1.1          {
 917 marek       1.2.2.5          _resolveXmlToSCMO();
 918 r.kieninger 1.1          }
 919 marek       1.2.2.5      if (RESP_ENC_BINARY == (_encoding & RESP_ENC_BINARY))
 920 r.kieninger 1.1          {
 921 marek       1.2.2.5          _resolveBinary();
 922 r.kieninger 1.1          }
 923 marek       1.2.2.5      if (RESP_ENC_CIM == (_encoding & RESP_ENC_CIM))
 924 r.kieninger 1.1          {
 925 marek       1.2.2.5          _resolveCIMToSCMO();
 926 r.kieninger 1.1          }
 927 marek       1.2.2.11     PEGASUS_DEBUG_ASSERT(_encoding == RESP_ENC_SCMO || _encoding == 0);
 928 r.kieninger 1.1      }
 929                      
 930 marek       1.2.2.5  // helper functions to transform different formats into one-another
 931                      // functions work on the internal data and calling of them should be
 932                      // avoided whenever possible
 933                      void CIMResponseData::_resolveBinary()
 934 r.kieninger 1.1      {
 935 r.kieninger 1.2.2.16     PEG_METHOD_ENTER(TRC_DISPATCHER,
 936                              "CIMResponseData::_resolveBinary");
 937 r.kieninger 1.1      
 938 r.kieninger 1.2.2.16     CIMBuffer in((char*)_binaryData.getData(), _binaryData.size());
 939                      
 940                          while (in.more())
 941 r.kieninger 1.1          {
 942 r.kieninger 1.2.2.16         Uint32 binaryTypeMarker=0;
 943                              if(!in.getTypeMarker(binaryTypeMarker))
 944 marek       1.2.2.5          {
 945 r.kieninger 1.2.2.16             PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
 946                                      "Failed to get type marker for binary objects!");
 947                                  PEG_METHOD_EXIT();
 948                                  in.release();
 949                                  return;
 950 marek       1.2.2.5          }
 951 r.kieninger 1.2.2.16 
 952                              if (BIN_TYPE_MARKER_SCMO==binaryTypeMarker)
 953 marek       1.2.2.5          {
 954 r.kieninger 1.2.2.16             if (!in.getSCMOInstanceA(_scmoInstances))
 955                                  {
 956                                      _encoding &=(~RESP_ENC_BINARY);
 957                                      in.release();
 958                                      PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
 959                                          "Failed to resolve binary SCMOInstances!");
 960                                      PEG_METHOD_EXIT();
 961                                      return;
 962                                  }
 963                      
 964                                  _encoding |= RESP_ENC_SCMO;
 965 marek       1.2.2.5          }
 966 r.kieninger 1.2.2.16         else
 967 marek       1.2.2.5          {
 968 r.kieninger 1.2.2.16             switch (_dataType)
 969                                  {
 970                                      case RESP_INSTNAMES:
 971                                      case RESP_OBJECTPATHS:
 972                                      {
 973                                          if (!in.getObjectPathA(_instanceNames))
 974                                          {
 975                                              _encoding &=(~RESP_ENC_BINARY);
 976                                              in.release();
 977                                              PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
 978                                                  "Failed to resolve binary CIMObjectPaths!");
 979                                              PEG_METHOD_EXIT();
 980                                              return;
 981                                          }
 982                                          break;
 983                                      }
 984                                      case RESP_INSTANCE:
 985                                      {
 986                                          CIMInstance instance;
 987                                          if (!in.getInstance(instance))
 988                                          {
 989 r.kieninger 1.2.2.16                         _encoding &=(~RESP_ENC_BINARY);
 990                                              _encoding |= RESP_ENC_CIM;
 991                                              _instances.append(instance);
 992                                              in.release();
 993                                              PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
 994                                                  "Failed to resolve binary instance!");
 995                                              PEG_METHOD_EXIT();
 996                                              return;
 997                                          }
 998                      
 999                                          _instances.append(instance);
1000                                          break;
1001                                      }
1002                                      case RESP_INSTANCES:
1003                                      {
1004                                          if (!in.getInstanceA(_instances))
1005                                          {
1006                                              _encoding &=(~RESP_ENC_BINARY);
1007                                              in.release();
1008                                              PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
1009                                                  "Failed to resolve binary CIMInstances!");
1010 r.kieninger 1.2.2.16                         PEG_METHOD_EXIT();
1011                                              return;
1012                                          }
1013                                          break;
1014                                      }
1015                                      case RESP_OBJECTS:
1016                                      {
1017                                          if (!in.getObjectA(_objects))
1018                                          {
1019                                              in.release();
1020                                              _encoding &=(~RESP_ENC_BINARY);
1021                                              PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
1022                                                  "Failed to resolve binary CIMObjects!");
1023                                              PEG_METHOD_EXIT();
1024                                              return;
1025                                          }
1026                                          break;
1027                                      }
1028                                      default:
1029                                      {
1030                                          PEGASUS_DEBUG_ASSERT(false);
1031 r.kieninger 1.2.2.16                 }
1032                                  } // switch
1033                                  _encoding |= RESP_ENC_CIM;
1034                              } // else SCMO
1035 r.kieninger 1.1          }
1036 r.kieninger 1.2.2.16     _encoding &=(~RESP_ENC_BINARY);
1037 marek       1.2.2.21     // fix up the hostname and namespace for objects if defaults
1038                          // were set
1039                          if (_defaultHostname.size() > 0 && !_defaultNamespace.isNull())
1040                          {
1041                              completeHostNameAndNamespace(_defaultHostname, _defaultNamespace);
1042                          }
1043 r.kieninger 1.2.2.16     in.release();
1044                          PEG_METHOD_EXIT();
1045 r.kieninger 1.1      }
1046                      
1047 marek       1.2.2.5  void CIMResponseData::_resolveXmlToCIM()
1048 r.kieninger 1.1      {
1049 marek       1.2.2.5      switch (_dataType)
1050                          {
1051 marek       1.2.2.21         // Xml encoding for instance names and object paths not used
1052 marek       1.2.2.10         case RESP_OBJECTPATHS:
1053 marek       1.2.2.5          case RESP_INSTNAMES:
1054                              {
1055                                  break;
1056                              }
1057                              case RESP_INSTANCE:
1058                              {
1059                                  CIMInstance cimInstance;
1060                                  // Deserialize instance:
1061                                  {
1062                                      XmlParser parser((char*)_instanceData[0].getData());
1063 r.kieninger 1.1      
1064 marek       1.2.2.5                  if (!XmlReader::getInstanceElement(parser, cimInstance))
1065                                      {
1066                                          cimInstance = CIMInstance();
1067                                          PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
1068                                              "Failed to resolve XML instance, parser error!");
1069                                      }
1070                                  }
1071                                  // Deserialize path:
1072                                  {
1073                                      XmlParser parser((char*)_referencesData[0].getData());
1074                                      CIMObjectPath cimObjectPath;
1075 r.kieninger 1.1      
1076 marek       1.2.2.5                  if (XmlReader::getValueReferenceElement(parser, cimObjectPath))
1077                                      {
1078                                          if (_hostsData.size())
1079                                          {
1080                                              cimObjectPath.setHost(_hostsData[0]);
1081                                          }
1082                                          if (!_nameSpacesData[0].isNull())
1083                                          {
1084                                              cimObjectPath.setNameSpace(_nameSpacesData[0]);
1085                                          }
1086                                          cimInstance.setPath(cimObjectPath);
1087                                          // only if everything works we add the CIMInstance to the
1088                                          // array
1089                                          _instances.append(cimInstance);
1090                                      }
1091                                  }
1092                                  break;
1093                              }
1094                              case RESP_INSTANCES:
1095                              {
1096                                  for (Uint32 i = 0; i < _instanceData.size(); i++)
1097 marek       1.2.2.5              {
1098                                      CIMInstance cimInstance;
1099                                      // Deserialize instance:
1100                                      {
1101                                          XmlParser parser((char*)_instanceData[i].getData());
1102                      
1103                                          if (!XmlReader::getInstanceElement(parser, cimInstance))
1104                                          {
1105                                              PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
1106                                                  "Failed to resolve XML instance."
1107                                                      " Creating empty instance!");
1108                                              cimInstance = CIMInstance();
1109                                          }
1110                                      }
1111                      
1112                                      // Deserialize path:
1113                                      {
1114                                          XmlParser parser((char*)_referencesData[i].getData());
1115                                          CIMObjectPath cimObjectPath;
1116                      
1117                                          if (XmlReader::getInstanceNameElement(parser,cimObjectPath))
1118 marek       1.2.2.5                      {
1119                                              if (!_nameSpacesData[i].isNull())
1120                                                  cimObjectPath.setNameSpace(_nameSpacesData[i]);
1121                      
1122                                              if (_hostsData[i].size())
1123                                                  cimObjectPath.setHost(_hostsData[i]);
1124                      
1125                                              cimInstance.setPath(cimObjectPath);
1126                                          }
1127                                      }
1128 r.kieninger 1.1      
1129 marek       1.2.2.5                  _instances.append(cimInstance);
1130                                  }
1131                                  break;
1132                              }
1133                              case RESP_OBJECTS:
1134                              {
1135                                  for (Uint32 i=0, n=_instanceData.size(); i<n; i++)
1136                                  {
1137                                      CIMObject cimObject;
1138                      
1139                                      // Deserialize Objects:
1140                                      {
1141                                          XmlParser parser((char*)_instanceData[i].getData());
1142                      
1143                                          CIMInstance cimInstance;
1144                                          CIMClass cimClass;
1145                      
1146                                          if (XmlReader::getInstanceElement(parser, cimInstance))
1147                                          {
1148                                              cimObject = CIMObject(cimInstance);
1149                                          }
1150 marek       1.2.2.5                      else if (XmlReader::getClassElement(parser, cimClass))
1151                                          {
1152                                              cimObject = CIMObject(cimClass);
1153                                          }
1154                                          else
1155                                          {
1156                                              PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
1157                                                  "Failed to get XML object data!");
1158                                          }
1159                                      }
1160                      
1161                                      // Deserialize paths:
1162                                      {
1163                                          XmlParser parser((char*)_referencesData[i].getData());
1164                                          CIMObjectPath cimObjectPath;
1165                      
1166                                          if (XmlReader::getValueReferenceElement(
1167                                                  parser,
1168                                                  cimObjectPath))
1169                                          {
1170                                              if (!_nameSpacesData[i].isNull())
1171 marek       1.2.2.5                              cimObjectPath.setNameSpace(_nameSpacesData[i]);
1172                      
1173                                              if (_hostsData[i].size())
1174                                                  cimObjectPath.setHost(_hostsData[i]);
1175                      
1176                                              cimObject.setPath(cimObjectPath);
1177                                          }
1178                                      }
1179                                      _objects.append(cimObject);
1180                                  }
1181                                  break;
1182                              }
1183                              default:
1184                              {
1185 marek       1.2.2.8              PEGASUS_DEBUG_ASSERT(false);
1186 marek       1.2.2.5          }
1187                          }
1188                          // Xml was resolved, release Xml content now
1189                          _referencesData.clear();
1190                          _hostsData.clear();
1191                          _nameSpacesData.clear();
1192                          _instanceData.clear();
1193                          // remove Xml Encoding flag
1194 marek       1.2.2.8      _encoding &=(~RESP_ENC_XML);
1195 marek       1.2.2.5      // add CIM Encoding flag
1196                          _encoding |=RESP_ENC_CIM;
1197 r.kieninger 1.1      }
1198                      
1199 marek       1.2.2.5  void CIMResponseData::_resolveXmlToSCMO()
1200 r.kieninger 1.2.2.4  {
1201 marek       1.2.2.5      // Not optimal, can probably be improved
1202                          // but on the other hand, since using the binary format this case should
1203                          // actually not ever happen.
1204                          _resolveXmlToCIM();
1205                          _resolveCIMToSCMO();
1206                      }
1207 r.kieninger 1.2.2.4  
1208 marek       1.2.2.5  void CIMResponseData::_resolveSCMOToCIM()
1209                      {
1210                          switch(_dataType)
1211 r.kieninger 1.2.2.4      {
1212 marek       1.2.2.5          case RESP_INSTNAMES:
1213                              case RESP_OBJECTPATHS:
1214 r.kieninger 1.1              {
1215 marek       1.2.2.5              for (Uint32 x=0, n=_scmoInstances.size(); x < n; x++)
1216                                  {
1217                                      CIMObjectPath newObjectPath;
1218                                      _scmoInstances[x].getCIMObjectPath(newObjectPath);
1219                                      _instanceNames.append(newObjectPath);
1220                                  }
1221                                  break;
1222 r.kieninger 1.1              }
1223 marek       1.2.2.5          case RESP_INSTANCE:
1224 r.kieninger 1.1              {
1225 marek       1.2.2.8              if (_scmoInstances.size() > 0)
1226                                  {
1227                                      CIMInstance newInstance;
1228                                      _scmoInstances[0].getCIMInstance(newInstance);
1229                                      _instances.append(newInstance);
1230                                  }
1231 marek       1.2.2.5              break;
1232 marek       1.2.2.2          }
1233 marek       1.2.2.5          case RESP_INSTANCES:
1234 r.kieninger 1.2              {
1235 marek       1.2.2.5              for (Uint32 x=0, n=_scmoInstances.size(); x < n; x++)
1236 r.kieninger 1.1                  {
1237 marek       1.2.2.5                  CIMInstance newInstance;
1238                                      _scmoInstances[x].getCIMInstance(newInstance);
1239                                      _instances.append(newInstance);
1240 r.kieninger 1.1                  }
1241 marek       1.2.2.5              break;
1242 r.kieninger 1.1              }
1243 marek       1.2.2.5          case RESP_OBJECTS:
1244 r.kieninger 1.1              {
1245 marek       1.2.2.5              for (Uint32 x=0, n=_scmoInstances.size(); x < n; x++)
1246 r.kieninger 1.1                  {
1247 marek       1.2.2.5                  CIMInstance newInstance;
1248                                      _scmoInstances[x].getCIMInstance(newInstance);
1249                                      _objects.append(CIMObject(newInstance));
1250 r.kieninger 1.1                  }
1251 marek       1.2.2.5              break;
1252 r.kieninger 1.1              }
1253 marek       1.2.2.5          default:
1254 r.kieninger 1.2.2.1          {
1255 marek       1.2.2.8              PEGASUS_DEBUG_ASSERT(false);
1256 r.kieninger 1.2.2.1          }
1257                          }
1258 marek       1.2.2.5      _scmoInstances.clear();
1259                          // remove CIM Encoding flag
1260 marek       1.2.2.8      _encoding &=(~RESP_ENC_SCMO);
1261 marek       1.2.2.5      // add SCMO Encoding flag
1262                          _encoding |=RESP_ENC_CIM;
1263 r.kieninger 1.2.2.1  }
1264                      
1265 marek       1.2.2.5  void CIMResponseData::_resolveCIMToSCMO()
1266 r.kieninger 1.1      {
1267 marek       1.2.2.21     CString nsCString=_defaultNamespace.getString().getCString();
1268                          const char* _defNamespace = nsCString;
1269                          Uint32 _defNamespaceLen;
1270                          if (_defaultNamespace.isNull())
1271                          {
1272                              _defNamespaceLen=0;
1273                          }
1274                          else
1275                          {
1276                              _defNamespaceLen=strlen(_defNamespace);
1277                          }
1278 marek       1.2.2.5      switch (_dataType)
1279 r.kieninger 1.2          {
1280 marek       1.2.2.5          case RESP_INSTNAMES:
1281 r.kieninger 1.2              {
1282 marek       1.2.2.5              for (Uint32 i=0,n=_instanceNames.size();i<n;i++)
1283                                  {
1284 r.kieninger 1.2.2.18                 SCMOInstance addme(
1285                                          _instanceNames[i],
1286 marek       1.2.2.21                     _defNamespace,
1287                                          _defNamespaceLen);
1288 marek       1.2.2.5                  _scmoInstances.append(addme);
1289                                  }
1290 marek       1.2.2.8              _instanceNames.clear();
1291 marek       1.2.2.5              break;
1292 r.kieninger 1.2              }
1293 marek       1.2.2.5          case RESP_INSTANCE:
1294 r.kieninger 1.1              {
1295 marek       1.2.2.8              if (_instances.size() > 0)
1296                                  {
1297 r.kieninger 1.2.2.18                 SCMOInstance addme(
1298                                          _instances[0],
1299 marek       1.2.2.21                     _defNamespace,
1300                                          _defNamespaceLen);
1301 marek       1.2.2.15                 _scmoInstances.clear();
1302 marek       1.2.2.8                  _scmoInstances.append(addme);
1303                                      _instances.clear();
1304                                  }
1305 marek       1.2.2.5              break;
1306 r.kieninger 1.1              }
1307 marek       1.2.2.5          case RESP_INSTANCES:
1308 r.kieninger 1.1              {
1309 marek       1.2.2.5              for (Uint32 i=0,n=_instances.size();i<n;i++)
1310                                  {
1311 r.kieninger 1.2.2.18                 SCMOInstance addme(
1312                                          _instances[i],
1313 marek       1.2.2.21                     _defNamespace,
1314                                          _defNamespaceLen);
1315 marek       1.2.2.5                  _scmoInstances.append(addme);
1316                                  }
1317 marek       1.2.2.8              _instances.clear();
1318 marek       1.2.2.5              break;
1319 r.kieninger 1.1              }
1320 marek       1.2.2.5          case RESP_OBJECTS:
1321 r.kieninger 1.1              {
1322 marek       1.2.2.8              for (Uint32 i=0,n=_objects.size();i<n;i++)
1323                                  {
1324 r.kieninger 1.2.2.18                 SCMOInstance addme(
1325                                          _objects[i],
1326 marek       1.2.2.21                     _defNamespace,
1327                                          _defNamespaceLen);
1328 marek       1.2.2.8                  _scmoInstances.append(addme);
1329                                  }
1330                                  _objects.clear();
1331 marek       1.2.2.5              break;
1332 r.kieninger 1.1              }
1333 marek       1.2.2.9          case RESP_OBJECTPATHS:
1334                              {
1335                                  for (Uint32 i=0,n=_instanceNames.size();i<n;i++)
1336                                  {
1337 r.kieninger 1.2.2.18                 SCMOInstance addme(
1338                                          _instanceNames[i],
1339 marek       1.2.2.21                     _defNamespace,
1340                                          _defNamespaceLen);
1341 thilo.boehm 1.2.2.14                 // TODO: More description about this.
1342 marek       1.2.2.9                  if (0 == _instanceNames[i].getKeyBindings().size())
1343                                      {
1344                                          // if there is no keybinding, this is a class
1345                                          addme.setIsClassOnly(true);
1346                                      }
1347                                      _scmoInstances.append(addme);
1348                                  }
1349                                  _instanceNames.clear();
1350                                  break;
1351                              }
1352 marek       1.2.2.5          default:
1353 r.kieninger 1.1              {
1354 marek       1.2.2.8              PEGASUS_DEBUG_ASSERT(false);
1355 r.kieninger 1.1              }
1356                          }
1357                      
1358 marek       1.2.2.5      // remove CIM Encoding flag
1359 marek       1.2.2.8      _encoding &=(~RESP_ENC_CIM);
1360 marek       1.2.2.5      // add SCMO Encoding flag
1361                          _encoding |=RESP_ENC_SCMO;
1362 r.kieninger 1.1      }
1363                      
1364                      PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2