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

   1 martin 1.6 //%LICENSE////////////////////////////////////////////////////////////////
   2 martin 1.7 //
   3 martin 1.6 // Licensed to The Open Group (TOG) under one or more contributor license
   4            // agreements.  Refer to the OpenPegasusNOTICE.txt file distributed with
   5            // this work for additional information regarding copyright ownership.
   6            // Each contributor licenses this file to you under the OpenPegasus Open
   7            // Source License; you may not use this file except in compliance with the
   8            // License.
   9 martin 1.7 //
  10 martin 1.6 // Permission is hereby granted, free of charge, to any person obtaining a
  11            // copy of this software and associated documentation files (the "Software"),
  12            // to deal in the Software without restriction, including without limitation
  13            // the rights to use, copy, modify, merge, publish, distribute, sublicense,
  14            // and/or sell copies of the Software, and to permit persons to whom the
  15            // Software is furnished to do so, subject to the following conditions:
  16 martin 1.7 //
  17 martin 1.6 // The above copyright notice and this permission notice shall be included
  18            // in all copies or substantial portions of the Software.
  19 martin 1.7 //
  20 martin 1.6 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  21 martin 1.7 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  22 martin 1.6 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  23            // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
  24            // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  25            // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  26            // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  27 martin 1.7 //
  28 martin 1.6 //////////////////////////////////////////////////////////////////////////
  29 mike   1.1 #include <stdlib.h>
  30            #include "Sharable.h"
  31            #include "CIMBuffer.h"
  32            #include "CIMPropertyRep.h"
  33            #include "CIMInstanceRep.h"
  34            #include "CIMClassRep.h"
  35            #include "CIMQualifierRep.h"
  36 mike   1.5 #include "CIMQualifierDeclRep.h"
  37 mike   1.1 #include "CIMParameterRep.h"
  38            #include "CIMMethodRep.h"
  39            #include "CIMPropertyList.h"
  40            #include "CIMParamValueRep.h"
  41            #include "CIMKeyBindingRep.h"
  42            #include "CIMObjectPathRep.h"
  43            #include "CIMPropertyListRep.h"
  44            #include "StringRep.h"
  45 mike   1.2 #include "CIMValueRep.h"
  46 mike   1.5 #include "StringRep.h"
  47            #include "StringInline.h"
  48            #include "Buffer.h"
  49            #include "BinaryCodec.h"
  50 r.kieninger 1.8.4.1 #include "SCMOStreamer.h"
  51 mike        1.1     
  52                     #define INSTANCE_MAGIC 0xD6EF2219
  53                     #define CLASS_MAGIC 0xA8D7DE41
  54                     #define OBJECT_MAGIC 0xA8D7DE41
  55                     #define OBJECT_PATH_MAGIC 0x92320710
  56                     #define PROPERTY_MAGIC 0xBFEAA215
  57                     #define VALUE_MAGIC 0xE83E360A
  58                     #define PRESENT_MAGIC 0xF55A7330
  59                     #define ABSENT_MAGIC 0x77A0A639
  60                     
  61 mike        1.5     #define FLAG_IS_NULL             (1 << 0)
  62                     #define FLAG_IS_ARRAY            (1 << 1)
  63                     #define FLAG_IS_PROPAGATED       (1 << 2)
  64                     #define FLAG_HAS_CLASS_ORIGIN    (1 << 3)
  65                     #define FLAG_HAS_REFERENCE_CLASS (1 << 4)
  66                     #define FLAG_HAS_QUALIFIERS      (1 << 5)
  67                     
  68 mike        1.1     PEGASUS_USING_STD;
  69                     
  70                     PEGASUS_NAMESPACE_BEGIN
  71                     
  72 mike        1.5     static bool _validString(const Uint16* p, size_t n)
  73                     {
  74                         const Uint16* start = p;
  75                     
  76                         while (n >= 8 && ((p[0]|p[1]|p[2]|p[3]|p[4]|p[5]|p[6]|p[7]) & 0xFF80) == 0)
  77                         {
  78                             p += 8;
  79                             n -= 8;
  80                         }
  81                     
  82                         while (n >= 4 && ((p[0]|p[1]|p[2]|p[3]) & 0xFF80) == 0)
  83                         {
  84                             p += 4;
  85                             n -= 4;
  86                         }
  87                     
  88                         while (n)
  89                         {
  90                             Uint16 c = *p;
  91                     
  92                             if (c >= 128)
  93 mike        1.5             {
  94                                 if (c == 0xFFFE || c == 0xFFFF || (c >= 0xFDD0 && c <= 0xFDEF))
  95                                     return false;
  96                     
  97                                 if (c >= 0xD800 && c <= 0xDBFF)
  98                                 {
  99                                     if (n == 1 || !(p[1] >= 0xDC00 && p[1] <= 0xDFFF))
 100                                         return false;
 101                                 }
 102                     
 103                                 if (c >= 0xDC00 && c <= 0xDFFF)
 104                                 {
 105                                     if (p == start || !(p[-1] >= 0xD800  && p[-1] <= 0xDBFF))
 106                                         return false;
 107                                 }
 108                             }
 109                     
 110                             n--;
 111                             p++;
 112                         }
 113                     
 114 mike        1.5         return true;
 115                     }
 116                     
 117                     static inline bool _validName(const String& str)
 118                     {
 119                         if (str.size() == 0)
 120                             return true;
 121                     
 122                         return CIMName::legal(str);
 123                     }
 124                     
 125                     static inline bool _validNamespaceName(const String& str)
 126                     {
 127                         if (str.size() == 0)
 128                             return true;
 129                     
 130                         return CIMNamespaceName::legal(str);
 131                     }
 132                     
 133                     void CIMBuffer::_create(size_t size)
 134 mike        1.1     {
 135                         if (size < 1024)
 136                             size = 1024;
 137                     
 138 mike        1.3     #if defined(PEGASUS_TEST_VALGRIND)
 139                         // Valgrind complains that we leave uninitialized bytes in this buffer so
 140                         _data = (char*)calloc(1, size);
 141                     #else
 142 mike        1.1         _data = (char*)malloc(size);
 143 mike        1.3     #endif
 144 mike        1.1     
 145 mike        1.5     #if defined(PEGASUS_DEBUG)
 146                         memset(_data, 0xAA, size);
 147                     #endif
 148                     
 149 mike        1.1         if (!_data)
 150                         {
 151                             throw PEGASUS_STD(bad_alloc)();
 152                         }
 153                     
 154                         _end = _data + size;
 155                         _ptr = _data;
 156                     }
 157                     
 158 mike        1.5     CIMBuffer::CIMBuffer(size_t size) : _swap(0), _validate(0)
 159                     {
 160                         _create(size);
 161                     }
 162                     
 163                     CIMBuffer::CIMBuffer() : _data(0), _end(0), _ptr(0), _swap(0), _validate(0)
 164                     {
 165                     }
 166                     
 167 mike        1.1     CIMBuffer::~CIMBuffer()
 168                     {
 169                         free(_data);
 170                     }
 171                     
 172                     void CIMBuffer::_grow(size_t size)
 173                     {
 174                         size_t n = _end - _data;
 175                         size_t m = _ptr - _data;
 176                         size_t cap = n * 2;
 177                     
 178 mike        1.5         if (cap <= 4096)
 179                             cap = 4096;
 180                     
 181 mike        1.1         // Double the size of the buffer (n * 2). If size is greater than n, then
 182                         // we will need yet more space so we increment cap by size.
 183                     
 184                         if (size > n)
 185                             cap += size;
 186                     
 187                         _data = (char*)realloc(_data, cap);
 188                     
 189                         if (!_data)
 190                         {
 191                             throw PEGASUS_STD(bad_alloc)();
 192                         }
 193                     
 194                         _end = _data + cap;
 195                         _ptr = _data + m;
 196 mike        1.5     
 197                     #if defined(PEGASUS_DEBUG)
 198                         memset(_ptr, 0xAA, _end - _ptr);
 199                     #elif defined(PEGASUS_TEST_VALGRIND)
 200 mike        1.3         // Valgrind complains that we leave uninitialized bytes in this buffer so
 201                         // we clear all newly allocated memory when testing with Valgrind.
 202                         memset(_ptr, 0, _end - _ptr);
 203                     #endif
 204 mike        1.5     
 205 mike        1.1     }
 206                     
 207                     bool CIMBuffer::getString(String& x)
 208                     {
 209                         Uint32 n;
 210                     
 211                         if (!getUint32(n))
 212                             return false;
 213                     
 214                         size_t r = round(n * sizeof(Char16));
 215                     
 216                         if (_end - _ptr < ptrdiff_t(r))
 217                             return false;
 218                     
 219 mike        1.5         if (_swap)
 220                         {
 221                             _swapUint16Data((Uint16*)_ptr, n);
 222                         }
 223                     
 224                         if (_validate)
 225                         {
 226                             if (!_validString((Uint16*)_ptr, n))
 227                                 return false;
 228                         }
 229                     
 230 mike        1.1         if (n)
 231 mike        1.5             x.assign((Char16*)_ptr, n);
 232                     
 233                         _ptr += r;
 234                         return true;
 235                     }
 236                     
 237                     bool CIMBuffer::getName(CIMName& x)
 238                     {
 239                         String tmp;
 240                     
 241                         if (_validate)
 242                         {
 243                             // Get string without validation since we will validate name below.
 244                     
 245                             _validate = false;
 246                     
 247                             if (!getString(tmp))
 248                                 return false;
 249                     
 250                             _validate = true;
 251                     
 252 mike        1.5             if (!_validName(tmp))
 253                                 return false;
 254                         }
 255                         else
 256                         {
 257                             if (!getString(tmp))
 258                                 return false;
 259                         }
 260                     
 261                         x = CIMNameCast(tmp);
 262                         return true;
 263                     }
 264                     
 265                     bool CIMBuffer::getNamespaceName(CIMNamespaceName& x)
 266                     {
 267                         String tmp;
 268                     
 269                         if (_validate)
 270                         {
 271                             // Get string without validation since we will validate namespace below.
 272                     
 273 mike        1.5             _validate = false;
 274                     
 275                             if (!getString(tmp))
 276                                 return false;
 277                     
 278                             _validate = true;
 279                     
 280                             if (!_validNamespaceName(tmp))
 281                                 return false;
 282                         }
 283                         else
 284 mike        1.1         {
 285 mike        1.5             if (!getString(tmp))
 286                                 return false;
 287 mike        1.1         }
 288                     
 289 mike        1.5         x = CIMNamespaceNameCast(tmp);
 290 mike        1.1         return true;
 291                     }
 292                     
 293                     void CIMBuffer::putValue(const CIMValue& x)
 294                     {
 295                         CIMValueRep* rep = *((CIMValueRep**)&x);
 296                     
 297 mike        1.5         // Resolve null flag:
 298                     
 299                         bool isNull = rep->isNull;
 300 mike        1.1     
 301 mike        1.5         if (!isNull && rep->type == CIMTYPE_INSTANCE && !rep->isArray)
 302 mike        1.1         {
 303                             const CIMInstance& ci = *((CIMInstance*)rep->u._instanceValue);
 304                     
 305                             if (ci.isUninitialized())
 306                             {
 307 mike        1.5                 isNull = true;
 308 mike        1.1             }
 309                         }
 310                     
 311 mike        1.5         // Magic:
 312                         _putMagic(VALUE_MAGIC);
 313                     
 314                         // Put flags:
 315                         {
 316                             Uint32 flags = 0;
 317                     
 318                             if (isNull)
 319                                 flags |= FLAG_IS_NULL;
 320                     
 321                             if (rep->isArray)
 322                                 flags |= FLAG_IS_ARRAY;
 323                     
 324                             putUint32(flags);
 325                         }
 326                     
 327                         // Type:
 328                         putUint32(rep->type);
 329 mike        1.1     
 330 mike        1.5         if (isNull)
 331 mike        1.1             return;
 332                     
 333 mike        1.5         // Put value:
 334                     
 335 mike        1.1         if (rep->isArray)
 336                         {
 337                             switch (rep->type)
 338                             {
 339                                 case CIMTYPE_BOOLEAN:
 340 kumpf       1.4                     putBooleanA(*(reinterpret_cast<Array<Boolean>*>(&rep->u)));
 341 mike        1.1                     break;
 342                                 case CIMTYPE_UINT8:
 343 kumpf       1.4                     putUint8A(*(reinterpret_cast<Array<Uint8>*>(&rep->u)));
 344 mike        1.1                     break;
 345                                 case CIMTYPE_SINT8:
 346 kumpf       1.4                     putSint8A(*(reinterpret_cast<Array<Sint8>*>(&rep->u)));
 347 mike        1.1                     break;
 348                                 case CIMTYPE_UINT16:
 349 kumpf       1.4                     putUint16A(*(reinterpret_cast<Array<Uint16>*>(&rep->u)));
 350 mike        1.1                     break;
 351                                 case CIMTYPE_SINT16:
 352 kumpf       1.4                     putSint16A(*(reinterpret_cast<Array<Sint16>*>(&rep->u)));
 353 mike        1.1                     break;
 354                                 case CIMTYPE_UINT32:
 355 kumpf       1.4                     putUint32A(*(reinterpret_cast<Array<Uint32>*>(&rep->u)));
 356 mike        1.1                     break;
 357                                 case CIMTYPE_SINT32:
 358 kumpf       1.4                     putSint32A(*(reinterpret_cast<Array<Sint32>*>(&rep->u)));
 359 mike        1.1                     break;
 360                                 case CIMTYPE_UINT64:
 361 kumpf       1.4                     putUint64A(*(reinterpret_cast<Array<Uint64>*>(&rep->u)));
 362 mike        1.1                     break;
 363                                 case CIMTYPE_SINT64:
 364 kumpf       1.4                     putSint64A(*(reinterpret_cast<Array<Sint64>*>(&rep->u)));
 365 mike        1.1                     break;
 366                                 case CIMTYPE_REAL32:
 367 kumpf       1.4                     putReal32A(*(reinterpret_cast<Array<Real32>*>(&rep->u)));
 368 mike        1.1                     break;
 369                                 case CIMTYPE_REAL64:
 370 kumpf       1.4                     putReal64A(*(reinterpret_cast<Array<Real64>*>(&rep->u)));
 371 mike        1.1                     break;
 372                                 case CIMTYPE_CHAR16:
 373 kumpf       1.4                     putChar16A(*(reinterpret_cast<Array<Char16>*>(&rep->u)));
 374 mike        1.1                     break;
 375                                 case CIMTYPE_STRING:
 376 kumpf       1.4                     putStringA(*(reinterpret_cast<Array<String>*>(&rep->u)));
 377 mike        1.1                     break;
 378                                 case CIMTYPE_DATETIME:
 379 kumpf       1.4                     putDateTimeA(*(reinterpret_cast<Array<CIMDateTime>*>(&rep->u)));
 380 mike        1.1                     break;
 381                                 case CIMTYPE_REFERENCE:
 382 kumpf       1.4                     putObjectPathA(
 383                                         *(reinterpret_cast<Array<CIMObjectPath>*>(&rep->u)));
 384 mike        1.1                     break;
 385                                 case CIMTYPE_INSTANCE:
 386 kumpf       1.8                     putInstanceA(*(reinterpret_cast<Array<CIMInstance>*>(&rep->u)),
 387 mike        1.5                         false, false);
 388 mike        1.1                     break;
 389                                 case CIMTYPE_OBJECT:
 390 mike        1.5                     putObjectA(*(reinterpret_cast<Array<CIMObject>*>(&rep->u)),
 391                                         false, false);
 392 mike        1.1                     break;
 393                                 default:
 394                                     PEGASUS_ASSERT(0);
 395                                     break;
 396                             }
 397                         }
 398                         else
 399                         {
 400                             switch (rep->type)
 401                             {
 402                                 case CIMTYPE_BOOLEAN:
 403                                     putBoolean(rep->u._booleanValue);
 404                                     break;
 405                                 case CIMTYPE_UINT8:
 406                                     putUint8(rep->u._uint8Value);
 407                                     break;
 408                                 case CIMTYPE_SINT8:
 409                                     putSint8(rep->u._sint8Value);
 410                                     break;
 411                                 case CIMTYPE_UINT16:
 412                                     putUint16(rep->u._uint16Value);
 413 mike        1.1                     break;
 414                                 case CIMTYPE_SINT16:
 415                                     putSint16(rep->u._sint16Value);
 416                                     break;
 417                                 case CIMTYPE_UINT32:
 418                                     putUint32(rep->u._uint32Value);
 419                                     break;
 420                                 case CIMTYPE_SINT32:
 421                                     putSint32(rep->u._sint32Value);
 422                                     break;
 423                                 case CIMTYPE_UINT64:
 424                                     putUint64(rep->u._uint64Value);
 425                                     break;
 426                                 case CIMTYPE_SINT64:
 427                                     putSint64(rep->u._sint64Value);
 428                                     break;
 429                                 case CIMTYPE_REAL32:
 430                                     putReal32(rep->u._real32Value);
 431                                     break;
 432                                 case CIMTYPE_REAL64:
 433                                     putReal64(rep->u._real64Value);
 434 mike        1.1                     break;
 435                                 case CIMTYPE_CHAR16:
 436                                     putChar16(rep->u._char16Value);
 437                                     break;
 438                                 case CIMTYPE_STRING:
 439                                     putString(*((String*)rep->u._stringValue));
 440                                     break;
 441                                 case CIMTYPE_DATETIME:
 442                                     putDateTime(*((CIMDateTime*)rep->u._dateTimeValue));
 443                                     break;
 444                                 case CIMTYPE_REFERENCE:
 445                                     putObjectPath(*((CIMObjectPath*)rep->u._referenceValue));
 446                                     break;
 447                                 case CIMTYPE_INSTANCE:
 448 mike        1.5                     putInstance(*((CIMInstance*)rep->u._instanceValue),false,false);
 449 mike        1.1                     break;
 450                                 case CIMTYPE_OBJECT:
 451 mike        1.5                     putObject(*((CIMObject*)rep->u._instanceValue), false, false);
 452 mike        1.1                     break;
 453                                 default:
 454                                     PEGASUS_ASSERT(0);
 455                                     break;
 456                             }
 457                         }
 458                     }
 459                     
 460                     bool CIMBuffer::getValue(CIMValue& x)
 461                     {
 462                         Uint32 type;
 463 mike        1.5         Boolean isNull;
 464 mike        1.1         Boolean isArray;
 465                     
 466 mike        1.5         // Magic:
 467 mike        1.1         if (!_testMagic(VALUE_MAGIC))
 468                             return false;
 469                     
 470 mike        1.5         // Flags:
 471                         Uint32 flags;
 472                     
 473                         if (!getUint32(flags))
 474                             return false;
 475                     
 476                         isNull = flags & FLAG_IS_NULL;
 477                         isArray = flags & FLAG_IS_ARRAY;
 478                     
 479                         // Type:
 480                         if (!getUint32(type))
 481 mike        1.1             return false;
 482                     
 483                         if (isNull)
 484                         {
 485                             x.setNullValue(CIMType(type), isArray, 0);
 486                             return true;
 487                         }
 488                     
 489                         if (isArray)
 490                         {
 491                             switch (type)
 492                             {
 493                                 case CIMTYPE_BOOLEAN:
 494                                 {
 495                                     Array<Boolean> tmp;
 496                                     if (!getBooleanA(tmp))
 497                                         return false;
 498                                     x.set(tmp);
 499                                     return true;
 500                                 }
 501                                 case CIMTYPE_UINT8:
 502 mike        1.1                 {
 503                                     Array<Uint8> tmp;
 504                                     if (!getUint8A(tmp))
 505                                         return false;
 506                                     x.set(tmp);
 507                                     return true;
 508                                 }
 509                                 case CIMTYPE_SINT8:
 510                                 {
 511                                     Array<Sint8> tmp;
 512                                     if (!getSint8A(tmp))
 513                                         return false;
 514                                     x.set(tmp);
 515                                     return true;
 516                                 }
 517                                 case CIMTYPE_UINT16:
 518                                 {
 519                                     Array<Uint16> tmp;
 520                                     if (!getUint16A(tmp))
 521                                         return false;
 522                                     x.set(tmp);
 523 mike        1.1                     return true;
 524                                 }
 525                                 case CIMTYPE_SINT16:
 526                                 {
 527                                     Array<Sint16> tmp;
 528                                     if (!getSint16A(tmp))
 529                                         return false;
 530                                     x.set(tmp);
 531                                     return true;
 532                                 }
 533                                 case CIMTYPE_UINT32:
 534                                 {
 535                                     Array<Uint32> tmp;
 536                                     if (!getUint32A(tmp))
 537                                         return false;
 538                                     x.set(tmp);
 539                                     return true;
 540                                 }
 541                                 case CIMTYPE_SINT32:
 542                                 {
 543                                     Array<Sint32> tmp;
 544 mike        1.1                     if (!getSint32A(tmp))
 545                                         return false;
 546                                     x.set(tmp);
 547                                     return true;
 548                                 }
 549                                 case CIMTYPE_UINT64:
 550                                 {
 551                                     Array<Uint64> tmp;
 552                                     if (!getUint64A(tmp))
 553                                         return false;
 554                                     x.set(tmp);
 555                                     return true;
 556                                 }
 557                                 case CIMTYPE_SINT64:
 558                                 {
 559                                     Array<Sint64> tmp;
 560                                     if (!getSint64A(tmp))
 561                                         return false;
 562                                     x.set(tmp);
 563                                     return true;
 564                                 }
 565 mike        1.1                 case CIMTYPE_REAL32:
 566                                 {
 567                                     Array<Real32> tmp;
 568                                     if (!getReal32A(tmp))
 569                                         return false;
 570                                     x.set(tmp);
 571                                     return true;
 572                                 }
 573                                 case CIMTYPE_REAL64:
 574                                 {
 575                                     Array<Real64> tmp;
 576                                     if (!getReal64A(tmp))
 577                                         return false;
 578                                     x.set(tmp);
 579                                     return true;
 580                                 }
 581                                 case CIMTYPE_CHAR16:
 582                                 {
 583                                     Array<Char16> tmp;
 584                                     if (!getChar16A(tmp))
 585                                         return false;
 586 mike        1.1                     x.set(tmp);
 587                                     return true;
 588                                 }
 589                                 case CIMTYPE_STRING:
 590                                 {
 591                                     Array<String> tmp;
 592                                     if (!getStringA(tmp))
 593                                         return false;
 594                                     x.set(tmp);
 595                                     return true;
 596                                 }
 597                                 case CIMTYPE_DATETIME:
 598                                 {
 599                                     Array<CIMDateTime> tmp;
 600                                     if (!getDateTimeA(tmp))
 601                                         return false;
 602                                     x.set(tmp);
 603                                     return true;
 604                                 }
 605                                 case CIMTYPE_REFERENCE:
 606                                 {
 607 mike        1.1                     Array<CIMObjectPath> tmp;
 608                                     if (!getObjectPathA(tmp))
 609                                         return false;
 610                                     x.set(tmp);
 611                                     return true;
 612                                 }
 613                                 case CIMTYPE_INSTANCE:
 614                                 {
 615                                     Array<CIMInstance> tmp;
 616                                     if (!getInstanceA(tmp))
 617                                         return false;
 618                                     x.set(tmp);
 619                                     return true;
 620                                 }
 621                                 case CIMTYPE_OBJECT:
 622                                 {
 623                                     Array<CIMObject> tmp;
 624                                     if (!getObjectA(tmp))
 625                                         return false;
 626                                     x.set(tmp);
 627                                     return true;
 628 mike        1.1                 }
 629                                 default:
 630                                     PEGASUS_ASSERT(0);
 631                                     break;
 632                             }
 633                         }
 634                         else
 635                         {
 636                             switch (type)
 637                             {
 638                                 case CIMTYPE_BOOLEAN:
 639                                 {
 640                                     Boolean tmp;
 641                                     if (!getBoolean(tmp))
 642                                         return false;
 643                                     x.set(tmp);
 644                                     return true;
 645                                 }
 646                                 case CIMTYPE_UINT8:
 647                                 {
 648                                     Uint8 tmp;
 649 mike        1.1                     if (!getUint8(tmp))
 650                                         return false;
 651                                     x.set(tmp);
 652                                     return true;
 653                                 }
 654                                 case CIMTYPE_SINT8:
 655                                 {
 656                                     Sint8 tmp;
 657                                     if (!getSint8(tmp))
 658                                         return false;
 659                                     x.set(tmp);
 660                                     return true;
 661                                 }
 662                                 case CIMTYPE_UINT16:
 663                                 {
 664                                     Uint16 tmp;
 665                                     if (!getUint16(tmp))
 666                                         return false;
 667                                     x.set(tmp);
 668                                     return true;
 669                                 }
 670 mike        1.1                 case CIMTYPE_SINT16:
 671                                 {
 672                                     Sint16 tmp;
 673                                     if (!getSint16(tmp))
 674                                         return false;
 675                                     x.set(tmp);
 676                                     return true;
 677                                 }
 678                                 case CIMTYPE_UINT32:
 679                                 {
 680                                     Uint32 tmp;
 681                                     if (!getUint32(tmp))
 682                                         return false;
 683                                     x.set(tmp);
 684                                     return true;
 685                                 }
 686                                 case CIMTYPE_SINT32:
 687                                 {
 688                                     Sint32 tmp;
 689                                     if (!getSint32(tmp))
 690                                         return false;
 691 mike        1.1                     x.set(tmp);
 692                                     return true;
 693                                 }
 694                                 case CIMTYPE_UINT64:
 695                                 {
 696                                     Uint64 tmp;
 697                                     if (!getUint64(tmp))
 698                                         return false;
 699                                     x.set(tmp);
 700                                     return true;
 701                                 }
 702                                 case CIMTYPE_SINT64:
 703                                 {
 704                                     Sint64 tmp;
 705                                     if (!getSint64(tmp))
 706                                         return false;
 707                                     x.set(tmp);
 708                                     return true;
 709                                 }
 710                                 case CIMTYPE_REAL32:
 711                                 {
 712 mike        1.1                     Real32 tmp;
 713                                     if (!getReal32(tmp))
 714                                         return false;
 715                                     x.set(tmp);
 716                                     return true;
 717                                 }
 718                                 case CIMTYPE_REAL64:
 719                                 {
 720                                     Real64 tmp;
 721                                     if (!getReal64(tmp))
 722                                         return false;
 723                                     x.set(tmp);
 724                                     return true;
 725                                 }
 726                                 case CIMTYPE_CHAR16:
 727                                 {
 728                                     Char16 tmp;
 729                                     if (!getChar16(tmp))
 730                                         return false;
 731                                     x.set(tmp);
 732                                     return true;
 733 mike        1.1                 }
 734                                 case CIMTYPE_STRING:
 735                                 {
 736                                     String tmp;
 737                                     if (!getString(tmp))
 738                                         return false;
 739                                     x.set(tmp);
 740                                     return true;
 741                                 }
 742                                 case CIMTYPE_DATETIME:
 743                                 {
 744                                     CIMDateTime tmp;
 745                                     if (!getDateTime(tmp))
 746                                         return false;
 747                                     x.set(tmp);
 748                                     return true;
 749                                 }
 750                                 case CIMTYPE_REFERENCE:
 751                                 {
 752                                     CIMObjectPath tmp;
 753                                     if (!getObjectPath(tmp))
 754 mike        1.1                         return false;
 755                                     x.set(tmp);
 756                                     return true;
 757                                 }
 758                                 case CIMTYPE_INSTANCE:
 759                                 {
 760                                     CIMInstance tmp;
 761                                     if (!getInstance(tmp))
 762                                         return false;
 763                                     x.set(tmp);
 764                                     return true;
 765                                 }
 766                                 case CIMTYPE_OBJECT:
 767                                 {
 768                                     CIMObject tmp;
 769                                     if (!getObject(tmp))
 770                                         return false;
 771                                     x.set(tmp);
 772                                     return true;
 773                                 }
 774                                 default:
 775 mike        1.1                     PEGASUS_ASSERT(0);
 776                                     break;
 777                             }
 778                         }
 779                     
 780                         // Unreachable!
 781                         return false;
 782                     }
 783                     
 784                     void CIMBuffer::putKeyBinding(const CIMKeyBinding& x)
 785                     {
 786                         const CIMKeyBindingRep* kb = *(const CIMKeyBindingRep**)&x;
 787 mike        1.5         putName(kb->_name);
 788 mike        1.1         putString(kb->_value);
 789                         putUint32(kb->_type);
 790                     }
 791                     
 792                     bool CIMBuffer::getKeyBinding(CIMKeyBinding& x)
 793                     {
 794 mike        1.5         CIMName name;
 795 mike        1.1         String value;
 796                         Uint32 type;
 797                     
 798 mike        1.5         if (!getName(name) || !getString(value) || !getUint32(type))
 799 mike        1.1             return false;
 800                     
 801                         x.~CIMKeyBinding();
 802 mike        1.5         new(&x) CIMKeyBinding(name, value, CIMKeyBinding::Type(type));
 803 mike        1.1     
 804                         return true;
 805                     }
 806                     
 807 mike        1.5     void CIMBuffer::putObjectPath(
 808 kumpf       1.8         const CIMObjectPath& x,
 809 mike        1.5         bool includeHostAndNamespace,
 810                         bool includeKeyBindings)
 811 mike        1.1     {
 812                         const CIMObjectPathRep* rep = *((const CIMObjectPathRep**)&x);
 813                     
 814                         _putMagic(OBJECT_PATH_MAGIC);
 815                     
 816                         if (x.getClassName().isNull())
 817                         {
 818                             putBoolean(false);
 819                             return;
 820                         }
 821                         else
 822                             putBoolean(true);
 823                     
 824                     
 825 mike        1.5         if (includeHostAndNamespace)
 826                         {
 827                             putString(rep->_host);
 828                             putNamespaceName(rep->_nameSpace);
 829                         }
 830                         else
 831 mike        1.1         {
 832 mike        1.5             putString(String());
 833                             putString(String());
 834                         }
 835                     
 836                         putName(rep->_className);
 837                     
 838                         if (includeKeyBindings)
 839                         {
 840                             putUint32(rep->_keyBindings.size());
 841                     
 842                             for (Uint32 i = 0, n = rep->_keyBindings.size(); i < n; i++)
 843                             {
 844                                 putKeyBinding(rep->_keyBindings[i]);
 845                             }
 846 mike        1.1         }
 847 mike        1.5         else
 848                             putUint32(0);
 849 mike        1.1     }
 850                     
 851                     bool CIMBuffer::getObjectPath(CIMObjectPath& x)
 852                     {
 853                         String host;
 854 mike        1.5         CIMNamespaceName nameSpace;
 855                         CIMName className;
 856 mike        1.1         Uint32 size;
 857                         Array<CIMKeyBinding> kbs;
 858                     
 859                         if (!_testMagic(OBJECT_PATH_MAGIC))
 860                             return false;
 861                     
 862                         Boolean initialized;
 863                     
 864                         if (!getBoolean(initialized))
 865                             return false;
 866                     
 867                         if (!initialized)
 868                         {
 869                             x = CIMObjectPath();
 870                             return true;
 871                         }
 872                     
 873 mike        1.5         if (!getString(host) || !getNamespaceName(nameSpace) || !getName(className))
 874 mike        1.1             return false;
 875                     
 876                         if (!getUint32(size))
 877                             return false;
 878                     
 879                         for (Uint32 i = 0; i < size; i++)
 880                         {
 881                             CIMKeyBinding kb;
 882                     
 883                             if (!getKeyBinding(kb))
 884                                 return false;
 885                     
 886                             kbs.append(kb);
 887                         }
 888                     
 889 kumpf       1.4         x.set(
 890                             host,
 891                             *(reinterpret_cast<CIMNamespaceName*>(&nameSpace)),
 892 mike        1.5             className,
 893 kumpf       1.4             kbs);
 894 mike        1.1     
 895                         return true;
 896                     }
 897                     
 898                     void CIMBuffer::putQualifier(const CIMQualifier& x)
 899                     {
 900                         const CIMQualifierRep* rep = *((const CIMQualifierRep**)&x);
 901                     
 902 mike        1.5         putName(rep->_name);
 903 mike        1.1         putValue(rep->_value);
 904                         putUint32(*((Uint32*)&rep->_flavor));
 905                         putBoolean(rep->_propagated);
 906                     }
 907                     
 908                     bool CIMBuffer::getQualifier(CIMQualifier& x)
 909                     {
 910 mike        1.5         CIMName name;
 911 mike        1.1         CIMValue value;
 912                         Uint32 flavor;
 913                         Boolean propagated;
 914                     
 915 mike        1.5         if (!getName(name))
 916 mike        1.1             return false;
 917                     
 918                         if (!getValue(value))
 919                             return false;
 920                     
 921                         if (!getUint32(flavor))
 922                             return false;
 923                     
 924                         if (!getBoolean(propagated))
 925                             return false;
 926                     
 927                         x.~CIMQualifier();
 928                     
 929                         new(&x) CIMQualifier(
 930 mike        1.5             name,
 931 mike        1.1             value,
 932 kumpf       1.4             *(reinterpret_cast<CIMFlavor*>(&flavor)),
 933 mike        1.1             propagated);
 934                     
 935                         return true;
 936                     }
 937                     
 938                     void CIMBuffer::putQualifierList(const CIMQualifierList& x)
 939                     {
 940                         Uint32 n = x.getCount();
 941                         putUint32(n);
 942                     
 943                         for (Uint32 i = 0; i < n; i++)
 944                             putQualifier(x.getQualifier(i));
 945                     }
 946                     
 947                     bool CIMBuffer::getQualifierList(CIMQualifierList& x)
 948                     {
 949                         Uint32 n;
 950                     
 951                         if (!getUint32(n))
 952                             return false;
 953                     
 954 mike        1.1         for (Uint32 i = 0; i < n; i++)
 955                         {
 956                             CIMQualifier tmp;
 957                     
 958                             if (!getQualifier(tmp))
 959                                 return false;
 960                     
 961                             x.addUnchecked(tmp);
 962                         }
 963                     
 964                         return true;
 965                     }
 966                     
 967 mike        1.5     void CIMBuffer::putQualifierDecl(const CIMQualifierDecl& x)
 968                     {
 969                         const CIMQualifierDeclRep* rep = *((const CIMQualifierDeclRep**)&x);
 970                     
 971                         putName(rep->_name);
 972                         putValue(rep->_value);
 973                         putUint32(*((Uint32*)&rep->_scope));
 974                         putUint32(*((Uint32*)&rep->_flavor));
 975                         putUint32(rep->_arraySize);
 976                     }
 977                     
 978                     bool CIMBuffer::getQualifierDecl(CIMQualifierDecl& x)
 979                     {
 980                         CIMName name;
 981                         CIMValue value;
 982                         Uint32 scope;
 983                         Uint32 flavor;
 984                         Uint32 arraySize;
 985                     
 986                         if (!getName(name))
 987                             return false;
 988 mike        1.5     
 989                         if (!getValue(value))
 990                             return false;
 991                     
 992                         if (!getUint32(scope))
 993                             return false;
 994                     
 995                         if (!getUint32(flavor))
 996                             return false;
 997                     
 998                         if (!getUint32(arraySize))
 999                             return false;
1000                     
1001                         x.~CIMQualifierDecl();
1002                     
1003                         new(&x) CIMQualifierDecl(
1004                             name,
1005                             value,
1006                             *(reinterpret_cast<CIMScope*>(&scope)),
1007                             *(reinterpret_cast<CIMFlavor*>(&flavor)),
1008                             arraySize);
1009 mike        1.5     
1010                         return true;
1011                     }
1012                     
1013 mike        1.1     void CIMBuffer::putProperty(const CIMProperty& x)
1014                     {
1015                         const CIMPropertyRep* rep = *((const CIMPropertyRep**)&x);
1016                         // PROPERTY_MAGIC
1017                         _putMagic(PROPERTY_MAGIC);
1018                     
1019 mike        1.5         // Flags
1020                         Uint32 flags = 0;
1021                         {
1022                             // CIMProperty.arraySize
1023                             if (rep->_arraySize)
1024                             {
1025                                 flags |= FLAG_IS_ARRAY;
1026                             }
1027                     
1028                             // CIMProperty.referenceClassName
1029                             if (rep->_referenceClassName.getString().size())
1030                             {
1031                                 flags |= FLAG_HAS_REFERENCE_CLASS;
1032                             }
1033                     
1034                             // CIMProperty.classOrigin
1035                             if (rep->_classOrigin.getString().size())
1036                             {
1037                                 flags |= FLAG_HAS_CLASS_ORIGIN;
1038                             }
1039                     
1040 mike        1.5             // CIMProperty.propagated
1041                             if (rep->_propagated)
1042                             {
1043                                 flags |= FLAG_IS_PROPAGATED;
1044                             }
1045                     
1046                             // CIMProperty.qualifiers
1047                             if (rep->_qualifiers.getCount())
1048                             {
1049                                 flags |= FLAG_HAS_QUALIFIERS;
1050                             }
1051                     
1052                             putUint32(flags);
1053                         }
1054                     
1055 mike        1.1         // CIMProperty.name
1056 mike        1.5         putName(rep->_name);
1057 mike        1.1     
1058                         // CIMProperty.value
1059                         putValue(rep->_value);
1060                     
1061                         // CIMProperty.arraySize
1062 mike        1.5         if (flags & FLAG_IS_ARRAY)
1063                         {
1064                             putUint32(rep->_arraySize);
1065                         }
1066 mike        1.1     
1067                         // CIMProperty.referenceClassName
1068 mike        1.5         if (flags & FLAG_HAS_REFERENCE_CLASS)
1069                         {
1070                             putName(rep->_referenceClassName);
1071                         }
1072 mike        1.1     
1073                         // CIMProperty.classOrigin
1074 mike        1.5         if (flags & FLAG_HAS_CLASS_ORIGIN)
1075                         {
1076                             putName(rep->_classOrigin);
1077                         }
1078 mike        1.1     
1079                         // CIMProperty.qualifiers
1080 mike        1.5         if (flags & FLAG_HAS_QUALIFIERS)
1081                         {
1082                             putQualifierList(rep->_qualifiers);
1083                             flags |= FLAG_HAS_QUALIFIERS;
1084                         }
1085 mike        1.1     }
1086                     
1087                     bool CIMBuffer::getProperty(CIMProperty& x)
1088                     {
1089 mike        1.5         CIMName name;
1090 mike        1.1         CIMValue value;
1091                         Uint32 arraySize;
1092 mike        1.5         CIMName referenceClassName;
1093                         CIMName classOrigin;
1094 mike        1.1         Boolean propagated;
1095                     
1096                         if (!_testMagic(PROPERTY_MAGIC))
1097                             return false;
1098                     
1099 mike        1.5         // Flags:
1100                         Uint32 flags;
1101                     
1102                         if (!getUint32(flags))
1103                             return false;
1104                     
1105 mike        1.1         // CIMProperty.name
1106 mike        1.5         if (!getName(name))
1107 mike        1.1             return false;
1108                     
1109                         // CIMProperty.value
1110                         if (!getValue(value))
1111                             return false;
1112                     
1113                         // CIMProperty.arraySize
1114 mike        1.5     
1115                         if (flags & FLAG_IS_ARRAY)
1116                         {
1117                             if (!getUint32(arraySize))
1118                                 return false;
1119                         }
1120                         else
1121                             arraySize = 0;
1122 mike        1.1     
1123                         // CIMProperty.referenceClassName
1124 mike        1.5     
1125                         if (flags & FLAG_HAS_REFERENCE_CLASS)
1126                         {
1127                             if (!getName(referenceClassName))
1128                                 return false;
1129                         }
1130 mike        1.1     
1131                         // CIMProperty.classOrigin
1132 mike        1.5     
1133                         if (flags & FLAG_HAS_CLASS_ORIGIN)
1134                         {
1135                             if (!getName(classOrigin))
1136                                 return false;
1137                         }
1138 mike        1.1     
1139                         // CIMProperty.propagated
1140 mike        1.5         propagated = flags & FLAG_IS_PROPAGATED;
1141                     
1142                         // Create property:
1143 mike        1.1     
1144                         x.~CIMProperty();
1145                     
1146                         new(&x) CIMProperty(
1147 mike        1.5             name,
1148 mike        1.1             value,
1149                             arraySize,
1150 mike        1.5             referenceClassName,
1151                             classOrigin,
1152 mike        1.1             propagated);
1153                     
1154                         CIMPropertyRep* rep = *((CIMPropertyRep**)&x);
1155                     
1156                         // CIMProperty.qualifiers
1157 mike        1.5     
1158                         if (flags & FLAG_HAS_QUALIFIERS)
1159                         {
1160                             if (!getQualifierList(rep->_qualifiers))
1161                                 return false;
1162                         }
1163 mike        1.1     
1164                         return true;
1165                     }
1166                     
1167 mike        1.5     void CIMBuffer::putInstance(
1168 kumpf       1.8         const CIMInstance& x,
1169 mike        1.5         bool includeHostAndNamespace,
1170                         bool includeKeyBindings)
1171 mike        1.1     {
1172                         const CIMInstanceRep* rep = *((const CIMInstanceRep**)&x);
1173                     
1174                         // INSTANCE_MAGIC:
1175                         _putMagic(INSTANCE_MAGIC);
1176                     
1177                         // CIMInstance.initialized:
1178                     
1179                         if (x.isUninitialized())
1180                         {
1181                             putBoolean(false);
1182                             return;
1183                         }
1184                         else
1185                             putBoolean(true);
1186                     
1187                         // CIMInstance.reference:
1188 mike        1.5         putObjectPath(rep->_reference, includeHostAndNamespace, includeKeyBindings);
1189 mike        1.1     
1190                         // CIMInstance.qualifiers:
1191                         putQualifierList(rep->_qualifiers);
1192                     
1193                         // CIMInstance.properties:
1194                         {
1195                             Uint32 n = rep->_properties.size();
1196                             putUint32(n);
1197                     
1198                             for (Uint32 i = 0; i < n; i++)
1199                                 putProperty(rep->_properties[i]);
1200                         }
1201                     }
1202                     
1203                     bool CIMBuffer::getInstance(CIMInstance& x)
1204                     {
1205                         CIMInstanceRep* rep;
1206                     
1207                         // INSTANCE_MAGIC:
1208                     
1209                         if (!_testMagic(INSTANCE_MAGIC))
1210 mike        1.1             return false;
1211                     
1212                         // initialized:
1213                     
1214                         Boolean initialized;
1215                     
1216                         if (!getBoolean(initialized))
1217                             return false;
1218                     
1219                         if (!initialized)
1220                         {
1221                             x = CIMInstance();
1222                             return true;
1223                         }
1224                     
1225                         // CIMIntsance.reference:
1226                     
1227                         CIMObjectPath reference;
1228                     
1229                         if (!getObjectPath(reference))
1230                             return false;
1231 mike        1.1     
1232                         rep = new CIMInstanceRep(reference);
1233                     
1234                         // CIMInstance.qualifiers:
1235                     
1236                         if (!getQualifierList(rep->_qualifiers))
1237                             return false;
1238                     
1239                         // CIMInstance.properties:
1240                         {
1241                             Uint32 n;
1242                     
1243                             if (!getUint32(n))
1244                                 return false;
1245                     
1246                             for (Uint32 i = 0; i < n; i++)
1247                             {
1248                                 CIMProperty tmp;
1249                     
1250                                 if (!getProperty(tmp))
1251                                 {
1252 mike        1.1                     return false;
1253                                 }
1254                     
1255                                 rep->_properties.append(tmp);
1256                             }
1257                         }
1258                     
1259                         // Replace rep:
1260                         CIMInstanceRep*& tmp = *((CIMInstanceRep**)&x);
1261                     
1262                         if (tmp)
1263                             tmp->Dec();
1264                     
1265                         tmp = rep;
1266                     
1267                         return true;
1268                     }
1269                     
1270                     void CIMBuffer::putClass(const CIMClass& x)
1271                     {
1272                         const CIMClassRep* rep = *((const CIMClassRep**)&x);
1273 mike        1.1     
1274                         // CLASS_MAGIC:
1275                         _putMagic(CLASS_MAGIC);
1276                     
1277                         // CIMClass.initialized:
1278                     
1279                         if (x.isUninitialized())
1280                         {
1281                             putBoolean(false);
1282                             return;
1283                         }
1284                         else
1285                             putBoolean(true);
1286                     
1287                         // CIMInstance.reference:
1288                         putObjectPath(rep->_reference);
1289                     
1290                         // CIMClass.superClassName:
1291 mike        1.5         putName(rep->_superClassName);
1292 mike        1.1     
1293                         // CIMClass.qualifiers:
1294                         putQualifierList(rep->_qualifiers);
1295                     
1296                         // CIMClass.properties:
1297                         {
1298                             Uint32 n = rep->_properties.size();
1299                             putUint32(n);
1300                     
1301                             for (Uint32 i = 0; i < n; i++)
1302                                 putProperty(rep->_properties[i]);
1303                         }
1304                     
1305                         // CIMClass.methods:
1306                         {
1307                             Uint32 n = rep->_methods.size();
1308                             putUint32(n);
1309                     
1310                             for (Uint32 i = 0; i < n; i++)
1311                                 putMethod(rep->_methods[i]);
1312                         }
1313 mike        1.1     }
1314                     
1315                     bool CIMBuffer::getClass(CIMClass& x)
1316                     {
1317                         CIMClassRep* rep;
1318 mike        1.5         CIMName superClassName;
1319 mike        1.1     
1320                         // CLASS_MAGIC:
1321                     
1322                         if (!_testMagic(CLASS_MAGIC))
1323                             return false;
1324                     
1325                         // initialized:
1326                     
1327                         Boolean initialized;
1328                     
1329                         if (!getBoolean(initialized))
1330                             return false;
1331                     
1332                         if (!initialized)
1333                         {
1334                             x = CIMClass();
1335                             return true;
1336                         }
1337                     
1338                         // CIMIntsance.reference:
1339                     
1340 mike        1.1         CIMObjectPath reference;
1341                     
1342                         if (!getObjectPath(reference))
1343                             return false;
1344                     
1345                         // CIMIntsance.superClassName:
1346                     
1347 mike        1.5         if (!getName(superClassName))
1348 mike        1.1             return false;
1349                     
1350 kumpf       1.8         rep = new CIMClassRep(reference.getClassName(),
1351 mike        1.5             superClassName);
1352 mike        1.1     
1353                         rep->_reference = reference;
1354                     
1355                         // CIMClass.qualifiers:
1356                     
1357                         if (!getQualifierList(rep->_qualifiers))
1358                             return false;
1359                     
1360                         // CIMClass.properties:
1361                         {
1362                             Uint32 n;
1363                     
1364                             if (!getUint32(n))
1365                                 return false;
1366                     
1367                             for (Uint32 i = 0; i < n; i++)
1368                             {
1369                                 CIMProperty tmp;
1370                     
1371                                 if (!getProperty(tmp))
1372                                     return false;
1373 mike        1.1     
1374                                 rep->_properties.append(tmp);
1375                             }
1376                         }
1377                     
1378                         // CIMClass.methods:
1379                         {
1380                             Uint32 n;
1381                     
1382                             if (!getUint32(n))
1383                                 return false;
1384                     
1385                             for (Uint32 i = 0; i < n; i++)
1386                             {
1387                                 CIMMethod tmp;
1388                     
1389                                 if (!getMethod(tmp))
1390                                     return false;
1391                     
1392                                 rep->_methods.append(tmp);
1393                             }
1394 mike        1.1         }
1395                     
1396                         // Replace rep:
1397                         CIMClassRep*& tmp = *((CIMClassRep**)&x);
1398                     
1399                         if (tmp)
1400                             tmp->Dec();
1401                     
1402                         tmp = rep;
1403                     
1404                         return true;
1405                     }
1406                     
1407                     void CIMBuffer::putParameter(const CIMParameter& x)
1408                     {
1409                         const CIMParameterRep* rep = *((const CIMParameterRep**)&x);
1410                     
1411                         // CIMParameter.name
1412 mike        1.5         putName(rep->_name);
1413 mike        1.1     
1414                         // CIMParameter.type
1415                         putUint32(rep->_type);
1416                     
1417                         // CIMParameter.isArray
1418                         putBoolean(rep->_isArray);
1419                     
1420                         // CIMParameter.arraySize
1421                         putUint32(rep->_arraySize);
1422                     
1423                         // CIMParameter.referenceClassName
1424 mike        1.5         putName(rep->_referenceClassName);
1425 mike        1.1     
1426                         // CIMParameter.qualifiers
1427                         putQualifierList(rep->_qualifiers);
1428                     }
1429                     
1430                     bool CIMBuffer::getParameter(CIMParameter& x)
1431                     {
1432 mike        1.5         CIMName name;
1433 mike        1.1         Uint32 type;
1434                         Boolean isArray;
1435                         Uint32 arraySize;
1436 mike        1.5         CIMName referenceClassName;
1437 mike        1.1     
1438                         // CIMParameter.name
1439 mike        1.5         if (!getName(name))
1440 mike        1.1             return false;
1441                     
1442                         // CIMParameter.type
1443                         if (!getUint32(type))
1444                             return false;
1445                     
1446                         // CIMParameter.isArray
1447                         if (!getBoolean(isArray))
1448                             return false;
1449                     
1450                         // CIMParameter.arraySize
1451                         if (!getUint32(arraySize))
1452                             return false;
1453                     
1454                         // CIMParameter.referenceClassName
1455 mike        1.5         if (!getName(referenceClassName))
1456 mike        1.1             return false;
1457                     
1458                         x.~CIMParameter();
1459                     
1460                         new(&x) CIMParameter(
1461 mike        1.5             name,
1462 mike        1.1             CIMType(type),
1463                             isArray,
1464                             arraySize,
1465 mike        1.5             referenceClassName);
1466 mike        1.1     
1467                         CIMParameterRep* rep = *((CIMParameterRep**)&x);
1468                     
1469                         // CIMParameter.qualifiers
1470                         if (!getQualifierList(rep->_qualifiers))
1471                             return false;
1472                     
1473                         return true;
1474                     }
1475                     
1476                     void CIMBuffer::putMethod(const CIMMethod& x)
1477                     {
1478                         const CIMMethodRep* rep = *((const CIMMethodRep**)&x);
1479                     
1480                         // CIMParameter.name
1481 mike        1.5         putName(rep->_name);
1482 mike        1.1     
1483                         // CIMParameter.type
1484                         putUint32(rep->_type);
1485                     
1486                         // CIMProperty.classOrigin
1487 mike        1.5         putName(rep->_classOrigin);
1488 mike        1.1     
1489                         // CIMProperty.propagated
1490                         putBoolean(rep->_propagated);
1491                     
1492                         // CIMMethod.qualifiers:
1493                         putQualifierList(rep->_qualifiers);
1494                     
1495                         // CIMMethod.parameters:
1496                         {
1497                             Uint32 n = rep->_parameters.size();
1498                             putUint32(n);
1499                     
1500                             for (Uint32 i = 0; i < n; i++)
1501                                 putParameter(rep->_parameters[i]);
1502                         }
1503                     }
1504                     
1505                     bool CIMBuffer::getMethod(CIMMethod& x)
1506                     {
1507                         CIMMethodRep* rep;
1508 mike        1.5         CIMName name;
1509 mike        1.1         Uint32 type;
1510 mike        1.5         CIMName classOrigin;
1511 mike        1.1         Boolean propagated;
1512                     
1513                         // CIMMethod.name
1514 mike        1.5         if (!getName(name))
1515 mike        1.1             return false;
1516                     
1517                         // CIMMethod.type
1518                         if (!getUint32(type))
1519                             return false;
1520                     
1521                         // CIMParameter.classOrigin
1522 mike        1.5         if (!getName(classOrigin))
1523 mike        1.1             return false;
1524                     
1525                         // CIMParameter.propagated
1526                         if (!getBoolean(propagated))
1527                             return false;
1528                     
1529 mike        1.5         rep = new CIMMethodRep(
1530                             name, CIMType(type), classOrigin, propagated);
1531 mike        1.1     
1532                         // CIMMethod.qualifiers:
1533                         if (!getQualifierList(rep->_qualifiers))
1534                             return false;
1535                     
1536                         // CIMMethod.parameters:
1537                         {
1538                             Uint32 n;
1539                     
1540                             if (!getUint32(n))
1541                                 return false;
1542                     
1543                             for (Uint32 i = 0; i < n; i++)
1544                             {
1545                                 CIMParameter tmp;
1546                     
1547                                 if (!getParameter(tmp))
1548                                     return false;
1549                     
1550                                 rep->_parameters.append(tmp);
1551                             }
1552 mike        1.1         }
1553                     
1554                         // Replace rep:
1555                     
1556                         CIMMethodRep*& tmp = *((CIMMethodRep**)&x);
1557                     
1558                         if (tmp)
1559                             tmp->Dec();
1560                     
1561                         tmp = rep;
1562                     
1563                         return true;
1564                     }
1565                     
1566                     void CIMBuffer::putPropertyList(const CIMPropertyList& x)
1567                     {
1568                         CIMPropertyListRep* rep = *((CIMPropertyListRep**)&x);
1569                     
1570                         putBoolean(rep->isNull);
1571                     
1572                         if (!rep->isNull)
1573 mike        1.1         {
1574                             Uint32 n = rep->propertyNames.size();
1575                             putUint32(n);
1576                     
1577                             for (Uint32 i = 0; i < n; i++)
1578 mike        1.5                 putName(rep->propertyNames[i]);
1579 mike        1.1         }
1580                     }
1581                     
1582                     bool CIMBuffer::getPropertyList(CIMPropertyList& x)
1583                     {
1584                         Boolean isNull;
1585                     
1586                         if (!getBoolean(isNull))
1587                             return false;
1588                     
1589                         if (isNull)
1590                         {
1591                             x.~CIMPropertyList();
1592                             new(&x) CIMPropertyList();
1593                         }
1594                         else
1595                         {
1596                             Array<CIMName> names;
1597                     
1598                             Uint32 n;
1599                     
1600 mike        1.1             if (!getUint32(n))
1601                                 return false;
1602                     
1603                             for (Uint32 i = 0; i < n; i++)
1604                             {
1605 mike        1.5                 CIMName name;
1606 mike        1.1     
1607 mike        1.5                 if (!getName(name))
1608 mike        1.1                     return false;
1609                     
1610 mike        1.5                 names.append(name);
1611 mike        1.1             }
1612                     
1613                             x.~CIMPropertyList();
1614                             new(&x) CIMPropertyList(names);
1615                         }
1616                     
1617                         return true;
1618                     }
1619                     
1620 mike        1.5     void CIMBuffer::putObject(
1621                         const CIMObject& x,
1622                         bool includeHostAndNamespace,
1623                         bool includeKeyBindings)
1624 mike        1.1     {
1625                         _putMagic(OBJECT_MAGIC);
1626                     
1627                         if (x.isUninitialized())
1628                         {
1629                             putBoolean(false);
1630                             return;
1631                         }
1632                         else
1633                             putBoolean(true);
1634                     
1635                         if (x.isInstance())
1636                         {
1637                             putUint8('I');
1638 mike        1.5             putInstance(
1639                                 CIMInstance(x), includeHostAndNamespace, includeKeyBindings);
1640 mike        1.1         }
1641                         else
1642                         {
1643                             putUint8('C');
1644                             putClass(CIMClass(x));
1645                         }
1646                     }
1647                     
1648                     bool CIMBuffer::getObject(CIMObject& x)
1649                     {
1650                         Boolean initialized;
1651                         Uint8 tag;
1652                     
1653                         if (!_testMagic(OBJECT_MAGIC))
1654                             return false;
1655                     
1656                         if (!getBoolean(initialized))
1657                             return false;
1658                     
1659                         if (!initialized)
1660                         {
1661 mike        1.1             x = CIMObject();
1662                             return true;
1663                         }
1664                     
1665                         if (!getUint8(tag))
1666                             return false;
1667                     
1668                         if (tag == 'I')
1669                         {
1670                             CIMInstance tmp;
1671                     
1672                             if (!getInstance(tmp))
1673                                 return false;
1674                     
1675                             x.~CIMObject();
1676                             new(&x) CIMObject(tmp);
1677                             return true;
1678                         }
1679                         else if (tag == 'C')
1680                         {
1681                             CIMClass tmp;
1682 mike        1.1     
1683                             if (!getClass(tmp))
1684                                 return false;
1685                     
1686                             x.~CIMObject();
1687                             new(&x) CIMObject(tmp);
1688                             return true;
1689                         }
1690                         else
1691                             return false;
1692                     
1693                     }
1694                     
1695                     void CIMBuffer::putParamValue(const CIMParamValue& x)
1696                     {
1697                         const CIMParamValueRep* rep = *((const CIMParamValueRep**)&x);
1698                     
1699                         // CIMParamValue.parameterName:
1700                         putString(rep->_parameterName);
1701                     
1702                         // CIMParamValue.value:
1703 mike        1.1         putValue(rep->_value);
1704                     
1705                         // CIMParamValue.isTyped:
1706                         putBoolean(rep->_isTyped);
1707                     }
1708                     
1709                     bool CIMBuffer::getParamValue(CIMParamValue& x)
1710                     {
1711                         String parameterName;
1712                         CIMValue value;
1713                         Boolean isTyped;
1714                     
1715                         // CIMParamValue.parameterName:
1716                         if (!getString(parameterName))
1717                             return false;
1718                     
1719                         // CIMParamValue.value:
1720                         if (!getValue(value))
1721                             return false;
1722                     
1723                         // CIMParamValue.isTyped:
1724 mike        1.1         if (!getBoolean(isTyped))
1725                             return false;
1726                     
1727                         x.~CIMParamValue();
1728                         new(&x) CIMParamValue(parameterName, value, isTyped);
1729                     
1730                         return true;
1731                     }
1732                     
1733                     void CIMBuffer::putPresent(Boolean flag)
1734                     {
1735                         if (flag)
1736                             putUint32(PRESENT_MAGIC);
1737                         else
1738                             putUint32(ABSENT_MAGIC);
1739                     }
1740                     
1741                     bool CIMBuffer::getPresent(Boolean& flag)
1742                     {
1743                         Uint32 tmp;
1744                     
1745 mike        1.1         if (!getUint32(tmp))
1746                             return false;
1747                     
1748                         if (tmp == PRESENT_MAGIC)
1749                         {
1750                             flag = true;
1751                             return true;
1752                         }
1753                         else if (tmp == ABSENT_MAGIC)
1754                         {
1755                             flag = false;
1756                             return true;
1757                         }
1758                     
1759                         return false;
1760                     }
1761                     
1762 mike        1.5     void CIMBuffer::putInstanceA(
1763 kumpf       1.8         const Array<CIMInstance>& x,
1764 mike        1.5         bool includeHostAndNamespace,
1765                         bool includeKeyBindings)
1766                     {
1767                         Uint32 n = x.size();
1768                         putUint32(n);
1769                     
1770                         for (size_t i = 0; i < n; i++)
1771                             putInstance(x[i], includeHostAndNamespace, includeKeyBindings);
1772                     }
1773                     
1774 thilo.boehm 1.8.4.3 
1775                     void CIMBuffer::putSCMOClass(const SCMOClass& scmoClass)
1776                     {
1777                         SCMOStreamer::serializeClass(*this, scmoClass);
1778                     }
1779                     
1780                     bool CIMBuffer::getSCMOClass(SCMOClass& scmoClass)
1781                     {
1782                         return SCMOStreamer::deserializeClass(*this, scmoClass);
1783                     }
1784                     
1785                     
1786 r.kieninger 1.8.4.1 void CIMBuffer::putSCMOInstanceA(Array<SCMOInstance>& x)
1787                     {
1788                         Uint32 n = x.size();
1789 r.kieninger 1.8.4.2     _grow(n<<13);
1790                     
1791 r.kieninger 1.8.4.1     putUint32(n);
1792                     
1793 r.kieninger 1.8.4.2 
1794 r.kieninger 1.8.4.1     SCMOStreamer scmoStreamer(*this,x);
1795                         scmoStreamer.serialize();
1796                     }
1797                     
1798                     bool CIMBuffer::getSCMOInstanceA(Array<SCMOInstance>& x)
1799                     {
1800                         Uint32 n;
1801                     
1802                         if (!getUint32(n))
1803                             return false;
1804                     
1805                         SCMOStreamer scmoStreamer(*this,x);
1806                         return scmoStreamer.deserialize();
1807                     }
1808                     
1809                     
1810                     
1811 mike        1.1     PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2