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

   1 mike  1.1 #include <stdlib.h>
   2           #include "Sharable.h"
   3           #include "CIMBuffer.h"
   4           #include "CIMPropertyRep.h"
   5           #include "CIMInstanceRep.h"
   6           #include "CIMClassRep.h"
   7           #include "CIMQualifierRep.h"
   8           #include "CIMParameterRep.h"
   9           #include "CIMMethodRep.h"
  10           #include "CIMPropertyList.h"
  11           #include "CIMParamValueRep.h"
  12           #include "CIMKeyBindingRep.h"
  13           #include "CIMObjectPathRep.h"
  14           #include "CIMPropertyListRep.h"
  15           #include "StringRep.h"
  16           
  17           #define INSTANCE_MAGIC 0xD6EF2219
  18           #define CLASS_MAGIC 0xA8D7DE41
  19           #define OBJECT_MAGIC 0xA8D7DE41
  20           #define OBJECT_PATH_MAGIC 0x92320710
  21           #define PROPERTY_MAGIC 0xBFEAA215
  22 mike  1.1 #define VALUE_MAGIC 0xE83E360A
  23           #define PRESENT_MAGIC 0xF55A7330
  24           #define ABSENT_MAGIC 0x77A0A639
  25           
  26           PEGASUS_USING_STD;
  27           
  28           PEGASUS_NAMESPACE_BEGIN
  29           
  30           CIMBuffer::CIMBuffer(size_t size)
  31           {
  32               if (size < 1024)
  33                   size = 1024;
  34           
  35               _data = (char*)malloc(size);
  36           
  37               if (!_data)
  38               {
  39                   throw PEGASUS_STD(bad_alloc)();
  40               }
  41           
  42               _end = _data + size;
  43 mike  1.1     _ptr = _data;
  44           }
  45           
  46           CIMBuffer::~CIMBuffer()
  47           {
  48               free(_data);
  49           }
  50           
  51           void CIMBuffer::_grow(size_t size)
  52           {
  53               size_t n = _end - _data;
  54               size_t m = _ptr - _data;
  55               size_t cap = n * 2;
  56           
  57               // Double the size of the buffer (n * 2). If size is greater than n, then
  58               // we will need yet more space so we increment cap by size.
  59           
  60               if (size > n)
  61                   cap += size;
  62           
  63               _data = (char*)realloc(_data, cap);
  64 mike  1.1 
  65               if (!_data)
  66               {
  67                   throw PEGASUS_STD(bad_alloc)();
  68               }
  69           
  70               _end = _data + cap;
  71               _ptr = _data + m;
  72           }
  73           
  74           bool CIMBuffer::getString(String& x)
  75           {
  76               Uint32 n;
  77           
  78               if (!getUint32(n))
  79                   return false;
  80           
  81               size_t r = round(n * sizeof(Char16));
  82           
  83               if (_end - _ptr < ptrdiff_t(r))
  84                   return false;
  85 mike  1.1 
  86               if (n)
  87               {
  88                   x.assign((Char16*)_ptr, n);
  89               }
  90           
  91               _ptr += r;
  92               return true;
  93           }
  94           
  95           void CIMBuffer::putValue(const CIMValue& x)
  96           {
  97           #if defined(PEGASUS_USE_EMBEDDED_VALUES)
  98               CIMValueRep* rep = ((CIMValueRep*)&x);
  99           #else
 100               CIMValueRep* rep = *((CIMValueRep**)&x);
 101           #endif
 102           
 103               _putMagic(VALUE_MAGIC);
 104               putUint32(rep->type);
 105               putBoolean(rep->isArray);
 106 mike  1.1 
 107               if (rep->type == CIMTYPE_INSTANCE && !rep->isArray)
 108               {
 109                   const CIMInstance& ci = *((CIMInstance*)rep->u._instanceValue);
 110           
 111                   if (ci.isUninitialized())
 112                   {
 113                       putBoolean(rep->isNull);
 114                       return;
 115                   }
 116               }
 117           
 118               putBoolean(rep->isNull);
 119           
 120               if (rep->isNull)
 121                   return;
 122           
 123               if (rep->isArray)
 124               {
 125                   switch (rep->type)
 126                   {
 127 mike  1.1             case CIMTYPE_BOOLEAN:
 128                           putBooleanA(*((Array<Boolean>*)&rep->u));
 129                           break;
 130                       case CIMTYPE_UINT8:
 131                           putUint8A(*((Array<Uint8>*)&rep->u));
 132                           break;
 133                       case CIMTYPE_SINT8:
 134                           putSint8A(*((Array<Sint8>*)&rep->u));
 135                           break;
 136                       case CIMTYPE_UINT16:
 137                           putUint16A(*((Array<Uint16>*)&rep->u));
 138                           break;
 139                       case CIMTYPE_SINT16:
 140                           putSint16A(*((Array<Sint16>*)&rep->u));
 141                           break;
 142                       case CIMTYPE_UINT32:
 143                           putUint32A(*((Array<Uint32>*)&rep->u));
 144                           break;
 145                       case CIMTYPE_SINT32:
 146                           putSint32A(*((Array<Sint32>*)&rep->u));
 147                           break;
 148 mike  1.1             case CIMTYPE_UINT64:
 149                           putUint64A(*((Array<Uint64>*)&rep->u));
 150                           break;
 151                       case CIMTYPE_SINT64:
 152                           putSint64A(*((Array<Sint64>*)&rep->u));
 153                           break;
 154                       case CIMTYPE_REAL32:
 155                           putReal32A(*((Array<Real32>*)&rep->u));
 156                           break;
 157                       case CIMTYPE_REAL64:
 158                           putReal64A(*((Array<Real64>*)&rep->u));
 159                           break;
 160                       case CIMTYPE_CHAR16:
 161                           putChar16A(*((Array<Char16>*)&rep->u));
 162                           break;
 163                       case CIMTYPE_STRING:
 164                           putStringA(*((Array<String>*)&rep->u));
 165                           break;
 166                       case CIMTYPE_DATETIME:
 167                           putDateTimeA(*((Array<CIMDateTime>*)&rep->u));
 168                           break;
 169 mike  1.1             case CIMTYPE_REFERENCE:
 170                           putObjectPathA(*((Array<CIMObjectPath>*)&rep->u));
 171                           break;
 172                       case CIMTYPE_INSTANCE:
 173                           putInstanceA(*((Array<CIMInstance>*)&rep->u));
 174                           break;
 175                       case CIMTYPE_OBJECT:
 176                           putObjectA(*((Array<CIMObject>*)&rep->u));
 177                           break;
 178                       default:
 179                           PEGASUS_ASSERT(0);
 180                           break;
 181                   }
 182               }
 183               else
 184               {
 185                   switch (rep->type)
 186                   {
 187                       case CIMTYPE_BOOLEAN:
 188                           putBoolean(rep->u._booleanValue);
 189                           break;
 190 mike  1.1             case CIMTYPE_UINT8:
 191                           putUint8(rep->u._uint8Value);
 192                           break;
 193                       case CIMTYPE_SINT8:
 194                           putSint8(rep->u._sint8Value);
 195                           break;
 196                       case CIMTYPE_UINT16:
 197                           putUint16(rep->u._uint16Value);
 198                           break;
 199                       case CIMTYPE_SINT16:
 200                           putSint16(rep->u._sint16Value);
 201                           break;
 202                       case CIMTYPE_UINT32:
 203                           putUint32(rep->u._uint32Value);
 204                           break;
 205                       case CIMTYPE_SINT32:
 206                           putSint32(rep->u._sint32Value);
 207                           break;
 208                       case CIMTYPE_UINT64:
 209                           putUint64(rep->u._uint64Value);
 210                           break;
 211 mike  1.1             case CIMTYPE_SINT64:
 212                           putSint64(rep->u._sint64Value);
 213                           break;
 214                       case CIMTYPE_REAL32:
 215                           putReal32(rep->u._real32Value);
 216                           break;
 217                       case CIMTYPE_REAL64:
 218                           putReal64(rep->u._real64Value);
 219                           break;
 220                       case CIMTYPE_CHAR16:
 221                           putChar16(rep->u._char16Value);
 222                           break;
 223                       case CIMTYPE_STRING:
 224                           putString(*((String*)rep->u._stringValue));
 225                           break;
 226                       case CIMTYPE_DATETIME:
 227                           putDateTime(*((CIMDateTime*)rep->u._dateTimeValue));
 228                           break;
 229                       case CIMTYPE_REFERENCE:
 230                           putObjectPath(*((CIMObjectPath*)rep->u._referenceValue));
 231                           break;
 232 mike  1.1             case CIMTYPE_INSTANCE:
 233                           putInstance(*((CIMInstance*)rep->u._instanceValue));
 234                           break;
 235                       case CIMTYPE_OBJECT:
 236                           putObject(*((CIMObject*)rep->u._instanceValue));
 237                           break;
 238                       default:
 239                           PEGASUS_ASSERT(0);
 240                           break;
 241                   }
 242               }
 243           }
 244           
 245           bool CIMBuffer::getValue(CIMValue& x)
 246           {
 247               Uint32 type;
 248               Boolean isArray;
 249               Boolean isNull;
 250           
 251               if (!_testMagic(VALUE_MAGIC))
 252                   return false;
 253 mike  1.1 
 254               if (!getUint32(type) || !getBoolean(isArray) || !getBoolean(isNull))
 255                   return false;
 256           
 257               if (isNull)
 258               {
 259                   x.setNullValue(CIMType(type), isArray, 0);
 260                   return true;
 261               }
 262           
 263               if (isArray)
 264               {
 265                   switch (type)
 266                   {
 267                       case CIMTYPE_BOOLEAN:
 268                       {
 269                           Array<Boolean> tmp;
 270                           if (!getBooleanA(tmp))
 271                               return false;
 272                           x.set(tmp);
 273                           return true;
 274 mike  1.1             }
 275                       case CIMTYPE_UINT8:
 276                       {
 277                           Array<Uint8> tmp;
 278                           if (!getUint8A(tmp))
 279                               return false;
 280                           x.set(tmp);
 281                           return true;
 282                       }
 283                       case CIMTYPE_SINT8:
 284                       {
 285                           Array<Sint8> tmp;
 286                           if (!getSint8A(tmp))
 287                               return false;
 288                           x.set(tmp);
 289                           return true;
 290                       }
 291                       case CIMTYPE_UINT16:
 292                       {
 293                           Array<Uint16> tmp;
 294                           if (!getUint16A(tmp))
 295 mike  1.1                     return false;
 296                           x.set(tmp);
 297                           return true;
 298                       }
 299                       case CIMTYPE_SINT16:
 300                       {
 301                           Array<Sint16> tmp;
 302                           if (!getSint16A(tmp))
 303                               return false;
 304                           x.set(tmp);
 305                           return true;
 306                       }
 307                       case CIMTYPE_UINT32:
 308                       {
 309                           Array<Uint32> tmp;
 310                           if (!getUint32A(tmp))
 311                               return false;
 312                           x.set(tmp);
 313                           return true;
 314                       }
 315                       case CIMTYPE_SINT32:
 316 mike  1.1             {
 317                           Array<Sint32> tmp;
 318                           if (!getSint32A(tmp))
 319                               return false;
 320                           x.set(tmp);
 321                           return true;
 322                       }
 323                       case CIMTYPE_UINT64:
 324                       {
 325                           Array<Uint64> tmp;
 326                           if (!getUint64A(tmp))
 327                               return false;
 328                           x.set(tmp);
 329                           return true;
 330                       }
 331                       case CIMTYPE_SINT64:
 332                       {
 333                           Array<Sint64> tmp;
 334                           if (!getSint64A(tmp))
 335                               return false;
 336                           x.set(tmp);
 337 mike  1.1                 return true;
 338                       }
 339                       case CIMTYPE_REAL32:
 340                       {
 341                           Array<Real32> tmp;
 342                           if (!getReal32A(tmp))
 343                               return false;
 344                           x.set(tmp);
 345                           return true;
 346                       }
 347                       case CIMTYPE_REAL64:
 348                       {
 349                           Array<Real64> tmp;
 350                           if (!getReal64A(tmp))
 351                               return false;
 352                           x.set(tmp);
 353                           return true;
 354                       }
 355                       case CIMTYPE_CHAR16:
 356                       {
 357                           Array<Char16> tmp;
 358 mike  1.1                 if (!getChar16A(tmp))
 359                               return false;
 360                           x.set(tmp);
 361                           return true;
 362                       }
 363                       case CIMTYPE_STRING:
 364                       {
 365                           Array<String> tmp;
 366                           if (!getStringA(tmp))
 367                               return false;
 368                           x.set(tmp);
 369                           return true;
 370                       }
 371                       case CIMTYPE_DATETIME:
 372                       {
 373                           Array<CIMDateTime> tmp;
 374                           if (!getDateTimeA(tmp))
 375                               return false;
 376                           x.set(tmp);
 377                           return true;
 378                       }
 379 mike  1.1             case CIMTYPE_REFERENCE:
 380                       {
 381                           Array<CIMObjectPath> tmp;
 382                           if (!getObjectPathA(tmp))
 383                               return false;
 384                           x.set(tmp);
 385                           return true;
 386                       }
 387                       case CIMTYPE_INSTANCE:
 388                       {
 389                           Array<CIMInstance> tmp;
 390                           if (!getInstanceA(tmp))
 391                               return false;
 392                           x.set(tmp);
 393                           return true;
 394                       }
 395                       case CIMTYPE_OBJECT:
 396                       {
 397                           Array<CIMObject> tmp;
 398                           if (!getObjectA(tmp))
 399                               return false;
 400 mike  1.1                 x.set(tmp);
 401                           return true;
 402                       }
 403                       default:
 404                           PEGASUS_ASSERT(0);
 405                           break;
 406                   }
 407               }
 408               else
 409               {
 410                   switch (type)
 411                   {
 412                       case CIMTYPE_BOOLEAN:
 413                       {
 414                           Boolean tmp;
 415                           if (!getBoolean(tmp))
 416                               return false;
 417                           x.set(tmp);
 418                           return true;
 419                       }
 420                       case CIMTYPE_UINT8:
 421 mike  1.1             {
 422                           Uint8 tmp;
 423                           if (!getUint8(tmp))
 424                               return false;
 425                           x.set(tmp);
 426                           return true;
 427                       }
 428                       case CIMTYPE_SINT8:
 429                       {
 430                           Sint8 tmp;
 431                           if (!getSint8(tmp))
 432                               return false;
 433                           x.set(tmp);
 434                           return true;
 435                       }
 436                       case CIMTYPE_UINT16:
 437                       {
 438                           Uint16 tmp;
 439                           if (!getUint16(tmp))
 440                               return false;
 441                           x.set(tmp);
 442 mike  1.1                 return true;
 443                       }
 444                       case CIMTYPE_SINT16:
 445                       {
 446                           Sint16 tmp;
 447                           if (!getSint16(tmp))
 448                               return false;
 449                           x.set(tmp);
 450                           return true;
 451                       }
 452                       case CIMTYPE_UINT32:
 453                       {
 454                           Uint32 tmp;
 455                           if (!getUint32(tmp))
 456                               return false;
 457                           x.set(tmp);
 458                           return true;
 459                       }
 460                       case CIMTYPE_SINT32:
 461                       {
 462                           Sint32 tmp;
 463 mike  1.1                 if (!getSint32(tmp))
 464                               return false;
 465                           x.set(tmp);
 466                           return true;
 467                       }
 468                       case CIMTYPE_UINT64:
 469                       {
 470                           Uint64 tmp;
 471                           if (!getUint64(tmp))
 472                               return false;
 473                           x.set(tmp);
 474                           return true;
 475                       }
 476                       case CIMTYPE_SINT64:
 477                       {
 478                           Sint64 tmp;
 479                           if (!getSint64(tmp))
 480                               return false;
 481                           x.set(tmp);
 482                           return true;
 483                       }
 484 mike  1.1             case CIMTYPE_REAL32:
 485                       {
 486                           Real32 tmp;
 487                           if (!getReal32(tmp))
 488                               return false;
 489                           x.set(tmp);
 490                           return true;
 491                       }
 492                       case CIMTYPE_REAL64:
 493                       {
 494                           Real64 tmp;
 495                           if (!getReal64(tmp))
 496                               return false;
 497                           x.set(tmp);
 498                           return true;
 499                       }
 500                       case CIMTYPE_CHAR16:
 501                       {
 502                           Char16 tmp;
 503                           if (!getChar16(tmp))
 504                               return false;
 505 mike  1.1                 x.set(tmp);
 506                           return true;
 507                       }
 508                       case CIMTYPE_STRING:
 509                       {
 510                           String tmp;
 511                           if (!getString(tmp))
 512                               return false;
 513                           x.set(tmp);
 514                           return true;
 515                       }
 516                       case CIMTYPE_DATETIME:
 517                       {
 518                           CIMDateTime tmp;
 519                           if (!getDateTime(tmp))
 520                               return false;
 521                           x.set(tmp);
 522                           return true;
 523                       }
 524                       case CIMTYPE_REFERENCE:
 525                       {
 526 mike  1.1                 CIMObjectPath tmp;
 527                           if (!getObjectPath(tmp))
 528                               return false;
 529                           x.set(tmp);
 530                           return true;
 531                       }
 532                       case CIMTYPE_INSTANCE:
 533                       {
 534                           CIMInstance tmp;
 535                           if (!getInstance(tmp))
 536                               return false;
 537                           x.set(tmp);
 538                           return true;
 539                       }
 540                       case CIMTYPE_OBJECT:
 541                       {
 542                           CIMObject tmp;
 543                           if (!getObject(tmp))
 544                               return false;
 545                           x.set(tmp);
 546                           return true;
 547 mike  1.1             }
 548                       default:
 549                           PEGASUS_ASSERT(0);
 550                           break;
 551                   }
 552               }
 553           
 554               // Unreachable!
 555               return false;
 556           }
 557           
 558           void CIMBuffer::putKeyBinding(const CIMKeyBinding& x)
 559           {
 560               const CIMKeyBindingRep* kb = *(const CIMKeyBindingRep**)&x;
 561               putString(kb->_name.getString());
 562               putString(kb->_value);
 563               putUint32(kb->_type);
 564           }
 565           
 566           bool CIMBuffer::getKeyBinding(CIMKeyBinding& x)
 567           {
 568 mike  1.1     String name;
 569               String value;
 570               Uint32 type;
 571           
 572               if (!getString(name) || !getString(value) || !getUint32(type))
 573                   return false;
 574           
 575               x.~CIMKeyBinding();
 576               new(&x) CIMKeyBinding(_CIMNameCast(name), value, CIMKeyBinding::Type(type));
 577           
 578               return true;
 579           }
 580           
 581           void CIMBuffer::putObjectPath(const CIMObjectPath& x)
 582           {
 583               const CIMObjectPathRep* rep = *((const CIMObjectPathRep**)&x);
 584           
 585               _putMagic(OBJECT_PATH_MAGIC);
 586           
 587               if (x.getClassName().isNull())
 588               {
 589 mike  1.1         putBoolean(false);
 590                   return;
 591               }
 592               else
 593                   putBoolean(true);
 594           
 595               putString(rep->_host);
 596               putString(rep->_nameSpace.getString());
 597               putString(rep->_className.getString());
 598               putUint32(rep->_keyBindings.size());
 599           
 600               for (Uint32 i = 0, n = rep->_keyBindings.size(); i < n; i++)
 601               {
 602                   putKeyBinding(rep->_keyBindings[i]);
 603               }
 604           }
 605           
 606           bool CIMBuffer::getObjectPath(CIMObjectPath& x)
 607           {
 608               String host;
 609               String nameSpace;
 610 mike  1.1     String className;
 611               Uint32 size;
 612               Array<CIMKeyBinding> kbs;
 613           
 614               if (!_testMagic(OBJECT_PATH_MAGIC))
 615                   return false;
 616           
 617               Boolean initialized;
 618           
 619               if (!getBoolean(initialized))
 620                   return false;
 621           
 622               if (!initialized)
 623               {
 624                   x = CIMObjectPath();
 625                   return true;
 626               }
 627           
 628               if (!getString(host) || !getString(nameSpace) || !getString(className))
 629                   return false;
 630           
 631 mike  1.1     if (!getUint32(size))
 632                   return false;
 633           
 634               for (Uint32 i = 0; i < size; i++)
 635               {
 636                   CIMKeyBinding kb;
 637           
 638                   if (!getKeyBinding(kb))
 639                       return false;
 640           
 641                   kbs.append(kb);
 642               }
 643           
 644               x.set(host, *((CIMNamespaceName*)&nameSpace), _CIMNameCast(className), kbs);
 645           
 646               return true;
 647           }
 648           
 649           void CIMBuffer::putQualifier(const CIMQualifier& x)
 650           {
 651               const CIMQualifierRep* rep = *((const CIMQualifierRep**)&x);
 652 mike  1.1 
 653               putString(rep->_name.getString());
 654               putValue(rep->_value);
 655               putUint32(*((Uint32*)&rep->_flavor));
 656               putBoolean(rep->_propagated);
 657           }
 658           
 659           bool CIMBuffer::getQualifier(CIMQualifier& x)
 660           {
 661               String name;
 662               CIMValue value;
 663               Uint32 flavor;
 664               Boolean propagated;
 665           
 666               if (!getString(name))
 667                   return false;
 668           
 669               if (!getValue(value))
 670                   return false;
 671           
 672               if (!getUint32(flavor))
 673 mike  1.1         return false;
 674           
 675               if (!getBoolean(propagated))
 676                   return false;
 677           
 678               x.~CIMQualifier();
 679           
 680               new(&x) CIMQualifier(
 681                   _CIMNameCast(name),
 682                   value,
 683                   *((CIMFlavor*)&flavor),
 684                   propagated);
 685           
 686               return true;
 687           }
 688           
 689           void CIMBuffer::putQualifierList(const CIMQualifierList& x)
 690           {
 691               Uint32 n = x.getCount();
 692               putUint32(n);
 693           
 694 mike  1.1     for (Uint32 i = 0; i < n; i++)
 695                   putQualifier(x.getQualifier(i));
 696           }
 697           
 698           bool CIMBuffer::getQualifierList(CIMQualifierList& x)
 699           {
 700               Uint32 n;
 701           
 702               if (!getUint32(n))
 703                   return false;
 704           
 705               for (Uint32 i = 0; i < n; i++)
 706               {
 707                   CIMQualifier tmp;
 708           
 709                   if (!getQualifier(tmp))
 710                       return false;
 711           
 712                   x.addUnchecked(tmp);
 713               }
 714           
 715 mike  1.1     return true;
 716           }
 717           
 718           void CIMBuffer::putProperty(const CIMProperty& x)
 719           {
 720               const CIMPropertyRep* rep = *((const CIMPropertyRep**)&x);
 721           
 722               // PROPERTY_MAGIC
 723               _putMagic(PROPERTY_MAGIC);
 724           
 725               // CIMProperty.name
 726               putString(rep->_name.getString());
 727           
 728               // CIMProperty.value
 729               putValue(rep->_value);
 730           
 731               // CIMProperty.arraySize
 732               putUint32(rep->_arraySize);
 733           
 734               // CIMProperty.referenceClassName
 735               putString(rep->_referenceClassName.getString());
 736 mike  1.1 
 737               // CIMProperty.classOrigin
 738               putString(rep->_classOrigin.getString());
 739           
 740               // CIMProperty.propagated
 741               putBoolean(rep->_propagated);
 742           
 743               // CIMProperty.qualifiers
 744               putQualifierList(rep->_qualifiers);
 745           }
 746           
 747           bool CIMBuffer::getProperty(CIMProperty& x)
 748           {
 749               String name;
 750               CIMValue value;
 751               Uint32 arraySize;
 752               String referenceClassName;
 753               String classOrigin;
 754               Boolean propagated;
 755           
 756               if (!_testMagic(PROPERTY_MAGIC))
 757 mike  1.1         return false;
 758           
 759               // CIMProperty.name
 760               if (!getString(name))
 761                   return false;
 762           
 763               // CIMProperty.value
 764               if (!getValue(value))
 765                   return false;
 766           
 767               // CIMProperty.arraySize
 768               if (!getUint32(arraySize))
 769                   return false;
 770           
 771               // CIMProperty.referenceClassName
 772               if (!getString(referenceClassName))
 773                   return false;
 774           
 775               // CIMProperty.classOrigin
 776               if (!getString(classOrigin))
 777                   return false;
 778 mike  1.1 
 779               // CIMProperty.propagated
 780               if (!getBoolean(propagated))
 781                   return false;
 782           
 783               x.~CIMProperty();
 784           
 785               new(&x) CIMProperty(
 786                   _CIMNameCast(name),
 787                   value,
 788                   arraySize,
 789                   _CIMNameCast(referenceClassName),
 790                   _CIMNameCast(classOrigin),
 791                   propagated);
 792           
 793               CIMPropertyRep* rep = *((CIMPropertyRep**)&x);
 794           
 795               // CIMProperty.qualifiers
 796               if (!getQualifierList(rep->_qualifiers))
 797                   return false;
 798           
 799 mike  1.1     return true;
 800           }
 801           
 802           void CIMBuffer::putInstance(const CIMInstance& x)
 803           {
 804               const CIMInstanceRep* rep = *((const CIMInstanceRep**)&x);
 805           
 806               // INSTANCE_MAGIC:
 807               _putMagic(INSTANCE_MAGIC);
 808           
 809               // CIMInstance.initialized:
 810           
 811               if (x.isUninitialized())
 812               {
 813                   putBoolean(false);
 814                   return;
 815               }
 816               else
 817                   putBoolean(true);
 818           
 819               // CIMInstance.reference:
 820 mike  1.1     putObjectPath(rep->_reference);
 821           
 822               // CIMInstance.qualifiers:
 823               putQualifierList(rep->_qualifiers);
 824           
 825               // CIMInstance.properties:
 826               {
 827                   Uint32 n = rep->_properties.size();
 828                   putUint32(n);
 829           
 830                   for (Uint32 i = 0; i < n; i++)
 831                       putProperty(rep->_properties[i]);
 832               }
 833           }
 834           
 835           bool CIMBuffer::getInstance(CIMInstance& x)
 836           {
 837               CIMInstanceRep* rep;
 838           
 839               // INSTANCE_MAGIC:
 840           
 841 mike  1.1     if (!_testMagic(INSTANCE_MAGIC))
 842                   return false;
 843           
 844               // initialized:
 845           
 846               Boolean initialized;
 847           
 848               if (!getBoolean(initialized))
 849                   return false;
 850           
 851               if (!initialized)
 852               {
 853                   x = CIMInstance();
 854                   return true;
 855               }
 856           
 857               // CIMIntsance.reference:
 858           
 859               CIMObjectPath reference;
 860           
 861               if (!getObjectPath(reference))
 862 mike  1.1         return false;
 863           
 864               rep = new CIMInstanceRep(reference);
 865           
 866               // CIMInstance.qualifiers:
 867           
 868               if (!getQualifierList(rep->_qualifiers))
 869                   return false;
 870           
 871               // CIMInstance.properties:
 872               {
 873                   Uint32 n;
 874           
 875                   if (!getUint32(n))
 876                       return false;
 877           
 878                   for (Uint32 i = 0; i < n; i++)
 879                   {
 880                       CIMProperty tmp;
 881           
 882                       if (!getProperty(tmp))
 883 mike  1.1             {
 884                           return false;
 885                       }
 886           
 887                       rep->_properties.append(tmp);
 888                   }
 889               }
 890           
 891               // Replace rep:
 892               CIMInstanceRep*& tmp = *((CIMInstanceRep**)&x);
 893           
 894               if (tmp)
 895                   tmp->Dec();
 896           
 897               tmp = rep;
 898           
 899               return true;
 900           }
 901           
 902           void CIMBuffer::putClass(const CIMClass& x)
 903           {
 904 mike  1.1     const CIMClassRep* rep = *((const CIMClassRep**)&x);
 905           
 906               // CLASS_MAGIC:
 907               _putMagic(CLASS_MAGIC);
 908           
 909               // CIMClass.initialized:
 910           
 911               if (x.isUninitialized())
 912               {
 913                   putBoolean(false);
 914                   return;
 915               }
 916               else
 917                   putBoolean(true);
 918           
 919               // CIMInstance.reference:
 920               putObjectPath(rep->_reference);
 921           
 922               // CIMClass.superClassName:
 923               putString(rep->_superClassName.getString());
 924           
 925 mike  1.1     // CIMClass.qualifiers:
 926               putQualifierList(rep->_qualifiers);
 927           
 928               // CIMClass.properties:
 929               {
 930                   Uint32 n = rep->_properties.size();
 931                   putUint32(n);
 932           
 933                   for (Uint32 i = 0; i < n; i++)
 934                       putProperty(rep->_properties[i]);
 935               }
 936           
 937               // CIMClass.methods:
 938               {
 939                   Uint32 n = rep->_methods.size();
 940                   putUint32(n);
 941           
 942                   for (Uint32 i = 0; i < n; i++)
 943                       putMethod(rep->_methods[i]);
 944               }
 945           }
 946 mike  1.1 
 947           bool CIMBuffer::getClass(CIMClass& x)
 948           {
 949               CIMClassRep* rep;
 950               String className;
 951               String superClassName;
 952           
 953               // CLASS_MAGIC:
 954           
 955               if (!_testMagic(CLASS_MAGIC))
 956                   return false;
 957           
 958               // initialized:
 959           
 960               Boolean initialized;
 961           
 962               if (!getBoolean(initialized))
 963                   return false;
 964           
 965               if (!initialized)
 966               {
 967 mike  1.1         x = CIMClass();
 968                   return true;
 969               }
 970           
 971               // CIMIntsance.reference:
 972           
 973               CIMObjectPath reference;
 974           
 975               if (!getObjectPath(reference))
 976                   return false;
 977           
 978               // CIMIntsance.superClassName:
 979           
 980               if (!getString(superClassName))
 981                   return false;
 982           
 983               rep = new CIMClassRep(reference.getClassName(), 
 984                   _CIMNameCast(superClassName));
 985           
 986               rep->_reference = reference;
 987           
 988 mike  1.1     // CIMClass.qualifiers:
 989           
 990               if (!getQualifierList(rep->_qualifiers))
 991                   return false;
 992           
 993               // CIMClass.properties:
 994               {
 995                   Uint32 n;
 996           
 997                   if (!getUint32(n))
 998                       return false;
 999           
1000                   for (Uint32 i = 0; i < n; i++)
1001                   {
1002                       CIMProperty tmp;
1003           
1004                       if (!getProperty(tmp))
1005                           return false;
1006           
1007                       rep->_properties.append(tmp);
1008                   }
1009 mike  1.1     }
1010           
1011               // CIMClass.methods:
1012               {
1013                   Uint32 n;
1014           
1015                   if (!getUint32(n))
1016                       return false;
1017           
1018                   for (Uint32 i = 0; i < n; i++)
1019                   {
1020                       CIMMethod tmp;
1021           
1022                       if (!getMethod(tmp))
1023                           return false;
1024           
1025                       rep->_methods.append(tmp);
1026                   }
1027               }
1028           
1029               // Replace rep:
1030 mike  1.1     CIMClassRep*& tmp = *((CIMClassRep**)&x);
1031           
1032               if (tmp)
1033                   tmp->Dec();
1034           
1035               tmp = rep;
1036           
1037               return true;
1038           }
1039           
1040           void CIMBuffer::putParameter(const CIMParameter& x)
1041           {
1042               const CIMParameterRep* rep = *((const CIMParameterRep**)&x);
1043           
1044               // CIMParameter.name
1045               putString(rep->_name.getString());
1046           
1047               // CIMParameter.type
1048               putUint32(rep->_type);
1049           
1050               // CIMParameter.isArray
1051 mike  1.1     putBoolean(rep->_isArray);
1052           
1053               // CIMParameter.arraySize
1054               putUint32(rep->_arraySize);
1055           
1056               // CIMParameter.referenceClassName
1057               putString(rep->_referenceClassName.getString());
1058           
1059               // CIMParameter.qualifiers
1060               putQualifierList(rep->_qualifiers);
1061           }
1062           
1063           bool CIMBuffer::getParameter(CIMParameter& x)
1064           {
1065               String name;
1066               Uint32 type;
1067               Boolean isArray;
1068               Uint32 arraySize;
1069               String referenceClassName;
1070           
1071               // CIMParameter.name
1072 mike  1.1     if (!getString(name))
1073                   return false;
1074           
1075               // CIMParameter.type
1076               if (!getUint32(type))
1077                   return false;
1078           
1079               // CIMParameter.isArray
1080               if (!getBoolean(isArray))
1081                   return false;
1082           
1083               // CIMParameter.arraySize
1084               if (!getUint32(arraySize))
1085                   return false;
1086           
1087               // CIMParameter.referenceClassName
1088               if (!getString(referenceClassName))
1089                   return false;
1090           
1091               x.~CIMParameter();
1092           
1093 mike  1.1     new(&x) CIMParameter(
1094                   _CIMNameCast(name),
1095                   CIMType(type),
1096                   isArray,
1097                   arraySize,
1098                   _CIMNameCast(referenceClassName));
1099           
1100               CIMParameterRep* rep = *((CIMParameterRep**)&x);
1101           
1102               // CIMParameter.qualifiers
1103               if (!getQualifierList(rep->_qualifiers))
1104                   return false;
1105           
1106               return true;
1107           }
1108           
1109           void CIMBuffer::putMethod(const CIMMethod& x)
1110           {
1111               const CIMMethodRep* rep = *((const CIMMethodRep**)&x);
1112           
1113               // CIMParameter.name
1114 mike  1.1     putString(rep->_name.getString());
1115           
1116               // CIMParameter.type
1117               putUint32(rep->_type);
1118           
1119               // CIMProperty.classOrigin
1120               putString(rep->_classOrigin.getString());
1121           
1122               // CIMProperty.propagated
1123               putBoolean(rep->_propagated);
1124           
1125               // CIMMethod.qualifiers:
1126               putQualifierList(rep->_qualifiers);
1127           
1128               // CIMMethod.parameters:
1129               {
1130                   Uint32 n = rep->_parameters.size();
1131                   putUint32(n);
1132           
1133                   for (Uint32 i = 0; i < n; i++)
1134                       putParameter(rep->_parameters[i]);
1135 mike  1.1     }
1136           }
1137           
1138           bool CIMBuffer::getMethod(CIMMethod& x)
1139           {
1140               CIMMethodRep* rep;
1141           
1142               String name;
1143               Uint32 type;
1144               String classOrigin;
1145               Boolean propagated;
1146           
1147               // CIMMethod.name
1148               if (!getString(name))
1149                   return false;
1150           
1151               // CIMMethod.type
1152               if (!getUint32(type))
1153                   return false;
1154           
1155               // CIMParameter.classOrigin
1156 mike  1.1     if (!getString(classOrigin))
1157                   return false;
1158           
1159               // CIMParameter.propagated
1160               if (!getBoolean(propagated))
1161                   return false;
1162           
1163               rep = new CIMMethodRep(name, CIMType(type), classOrigin, propagated);
1164           
1165               // CIMMethod.qualifiers:
1166               if (!getQualifierList(rep->_qualifiers))
1167                   return false;
1168           
1169               // CIMMethod.parameters:
1170               {
1171                   Uint32 n;
1172           
1173                   if (!getUint32(n))
1174                       return false;
1175           
1176                   for (Uint32 i = 0; i < n; i++)
1177 mike  1.1         {
1178                       CIMParameter tmp;
1179           
1180                       if (!getParameter(tmp))
1181                           return false;
1182           
1183                       rep->_parameters.append(tmp);
1184                   }
1185               }
1186           
1187               // Replace rep:
1188           
1189               CIMMethodRep*& tmp = *((CIMMethodRep**)&x);
1190           
1191               if (tmp)
1192                   tmp->Dec();
1193           
1194               tmp = rep;
1195           
1196               return true;
1197           }
1198 mike  1.1 
1199           void CIMBuffer::putPropertyList(const CIMPropertyList& x)
1200           {
1201               CIMPropertyListRep* rep = *((CIMPropertyListRep**)&x);
1202           
1203               putBoolean(rep->isNull);
1204           
1205               if (!rep->isNull)
1206               {
1207                   Uint32 n = rep->propertyNames.size();
1208                   putUint32(n);
1209           
1210                   for (Uint32 i = 0; i < n; i++)
1211                       putString(rep->propertyNames[i].getString());
1212               }
1213           }
1214           
1215           bool CIMBuffer::getPropertyList(CIMPropertyList& x)
1216           {
1217               Boolean isNull;
1218           
1219 mike  1.1     if (!getBoolean(isNull))
1220                   return false;
1221           
1222               if (isNull)
1223               {
1224                   x.~CIMPropertyList();
1225                   new(&x) CIMPropertyList();
1226               }
1227               else
1228               {
1229                   Array<CIMName> names;
1230           
1231                   Uint32 n;
1232           
1233                   if (!getUint32(n))
1234                       return false;
1235           
1236                   for (Uint32 i = 0; i < n; i++)
1237                   {
1238                       String name;
1239           
1240 mike  1.1             if (!getString(name))
1241                           return false;
1242           
1243                       names.append(_CIMNameCast(name));
1244                   }
1245           
1246                   x.~CIMPropertyList();
1247                   new(&x) CIMPropertyList(names);
1248               }
1249           
1250               return true;
1251           }
1252           
1253           void CIMBuffer::putObject(const CIMObject& x)
1254           {
1255               _putMagic(OBJECT_MAGIC);
1256           
1257               if (x.isUninitialized())
1258               {
1259                   putBoolean(false);
1260                   return;
1261 mike  1.1     }
1262               else
1263                   putBoolean(true);
1264           
1265               if (x.isInstance())
1266               {
1267                   putUint8('I');
1268                   putInstance(CIMInstance(x));
1269               }
1270               else
1271               {
1272                   putUint8('C');
1273                   putClass(CIMClass(x));
1274               }
1275           }
1276           
1277           bool CIMBuffer::getObject(CIMObject& x)
1278           {
1279               Boolean initialized;
1280               Uint8 tag;
1281           
1282 mike  1.1     if (!_testMagic(OBJECT_MAGIC))
1283                   return false;
1284           
1285               if (!getBoolean(initialized))
1286                   return false;
1287           
1288               if (!initialized)
1289               {
1290                   x = CIMObject();
1291                   return true;
1292               }
1293           
1294               if (!getUint8(tag))
1295                   return false;
1296           
1297               if (tag == 'I')
1298               {
1299                   CIMInstance tmp;
1300           
1301                   if (!getInstance(tmp))
1302                       return false;
1303 mike  1.1 
1304                   x.~CIMObject();
1305                   new(&x) CIMObject(tmp);
1306                   return true;
1307               }
1308               else if (tag == 'C')
1309               {
1310                   CIMClass tmp;
1311           
1312                   if (!getClass(tmp))
1313                       return false;
1314           
1315                   x.~CIMObject();
1316                   new(&x) CIMObject(tmp);
1317                   return true;
1318               }
1319               else
1320                   return false;
1321           
1322           }
1323           
1324 mike  1.1 void CIMBuffer::putParamValue(const CIMParamValue& x)
1325           {
1326               const CIMParamValueRep* rep = *((const CIMParamValueRep**)&x);
1327           
1328               // CIMParamValue.parameterName:
1329               putString(rep->_parameterName);
1330           
1331               // CIMParamValue.value:
1332               putValue(rep->_value);
1333           
1334               // CIMParamValue.isTyped:
1335               putBoolean(rep->_isTyped);
1336           }
1337           
1338           bool CIMBuffer::getParamValue(CIMParamValue& x)
1339           {
1340               String parameterName;
1341               CIMValue value;
1342               Boolean isTyped;
1343           
1344               // CIMParamValue.parameterName:
1345 mike  1.1     if (!getString(parameterName))
1346                   return false;
1347           
1348               // CIMParamValue.value:
1349               if (!getValue(value))
1350                   return false;
1351           
1352               // CIMParamValue.isTyped:
1353               if (!getBoolean(isTyped))
1354                   return false;
1355           
1356               x.~CIMParamValue();
1357               new(&x) CIMParamValue(parameterName, value, isTyped);
1358           
1359               return true;
1360           }
1361           
1362           void CIMBuffer::putPresent(Boolean flag)
1363           {
1364               if (flag)
1365                   putUint32(PRESENT_MAGIC);
1366 mike  1.1     else
1367                   putUint32(ABSENT_MAGIC);
1368           }
1369           
1370           bool CIMBuffer::getPresent(Boolean& flag)
1371           {
1372               Uint32 tmp;
1373           
1374               if (!getUint32(tmp))
1375                   return false;
1376           
1377               if (tmp == PRESENT_MAGIC)
1378               {
1379                   flag = true;
1380                   return true;
1381               }
1382               else if (tmp == ABSENT_MAGIC)
1383               {
1384                   flag = false;
1385                   return true;
1386               }
1387 mike  1.1 
1388               return false;
1389           }
1390           
1391           PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2