(file) Return to dinstance.cpp CVS log (file) (dir) Up to [OMI] / omi / micxx

   1 mike  1.1 /*
   2           **==============================================================================
   3           **
   4           ** Open Management Infrastructure (OMI)
   5           **
   6           ** Copyright (c) Microsoft Corporation
   7           ** 
   8           ** Licensed under the Apache License, Version 2.0 (the "License"); you may not 
   9           ** use this file except in compliance with the License. You may obtain a copy 
  10           ** of the License at 
  11           **
  12           **     http://www.apache.org/licenses/LICENSE-2.0 
  13           **
  14           ** THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  15           ** KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED 
  16           ** WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, 
  17           ** MERCHANTABLITY OR NON-INFRINGEMENT. 
  18           **
  19           ** See the Apache 2 License for the specific language governing permissions 
  20           ** and limitations under the License.
  21           **
  22 mike  1.1 **==============================================================================
  23           */
  24           
  25           #include "dinstance.h"
  26           #include <cctype>
  27           #include <base/instance.h>
  28           #include <base/strings.h>
  29           #include <base/naming.h>
  30           #include <base/schemadecl.h>
  31           #include <base/helpers.h>
  32           
  33           // ATTN: work on object size reduction of this module.
  34           
  35           #define T MI_T
  36           
  37           MI_BEGIN_NAMESPACE
  38           
  39           static MI_Uint32 _FindPropertyDecl(
  40               const MI_ClassDecl* cd,
  41               const MI_Char* name)
  42           {
  43 mike  1.1     MI_PropertyDecl** start = cd->properties;
  44               MI_PropertyDecl** end = start + cd->numProperties;
  45               MI_PropertyDecl** p = start;
  46               MI_Uint32 code;
  47           
  48               code = Hash(name);
  49           
  50               while (p != end) 
  51               {
  52                   if ((*p)->code == code && Zcasecmp((*p)->name, name) == 0)
  53                       return (MI_Uint32)(p - start);
  54                   p++;
  55               }
  56           
  57               return (MI_Uint32)-1;
  58           }
  59           
  60           void DInstance::COW()
  61           {
  62               DEBUG_ASSERT(m_self);
  63               InstanceHeader* h = ((InstanceHeader*)m_self) - 1;
  64 mike  1.1 
  65               if (h->u.refs != 1)
  66               {
  67                   MI_Instance* self = m_self;
  68                   MI_Result r = MI_Instance_Clone(self, &m_self);
  69                   DEBUG_ASSERT(r == MI_RESULT_OK);
  70                   __MI_Instance_Unref(self);
  71                   MI_UNUSED(r);
  72               }
  73           }
  74           
  75           DInstance::DInstance(const String& className, DInstance::MetaType metaType)
  76           {
  77               MI_Uint32 mt = 0;
  78           
  79               switch (metaType)
  80               {
  81                   case CLASS:
  82                       mt = MI_FLAG_CLASS;
  83                       break;
  84                   case ASSOCIATION:
  85 mike  1.1             mt = MI_FLAG_ASSOCIATION;
  86                       break;
  87                   case INDICATION:
  88                       mt = MI_FLAG_INDICATION;
  89                       break;
  90                   case METHOD:
  91                       mt = MI_FLAG_METHOD;
  92                       break;
  93               }
  94           
  95               MI_Result r = Instance_NewDynamic(&m_self, className.Str(), mt, 0);
  96               DEBUG_ASSERT(r == MI_RESULT_OK);
  97               MI_UNUSED(r);
  98           }
  99           
 100           DInstance::DInstance()
 101           {
 102               MI_Result r = Instance_NewDynamic(&m_self, MI_T("DInstance"), 
 103                   MI_FLAG_CLASS, 0);
 104               DEBUG_ASSERT(r == MI_RESULT_OK);
 105               MI_UNUSED(r);
 106 mike  1.1 }
 107           
 108           DInstance::DInstance(const DInstance& a)
 109           {
 110               __MI_Instance_Ref(m_self = a.m_self);
 111           }
 112           
 113           DInstance::~DInstance()
 114           {
 115               if (m_self)
 116                   __MI_Instance_Unref(m_self);
 117           }
 118           
 119           DInstance& DInstance::operator=(const DInstance& a)
 120           {
 121               if (m_self != a.m_self)
 122               {
 123                   __MI_Instance_Unref(m_self);
 124                   __MI_Instance_Ref(m_self = a.m_self);
 125               }
 126           
 127 mike  1.1     return *this;
 128           }
 129           
 130           void DInstance::Swap(DInstance& a)
 131           {
 132               MI_Instance* tmp = m_self;
 133               m_self = a.m_self;
 134               a.m_self = tmp;
 135           }
 136           
 137           const MI_ClassDecl* DInstance::GetClassDecl() const
 138           {
 139               return m_self->classDecl;
 140           }
 141           
 142           #if defined(GetClassName)
 143           # undef GetClassName
 144           #endif
 145           
 146           String DInstance::GetClassName() const
 147           {
 148 mike  1.1     return String(m_self->classDecl->name);
 149           }
 150           
 151           void DInstance::SetClassName(const String& className)
 152           {
 153               COW();
 154               MI_Result r = Instance_SetClassName(m_self, className.Str());
 155               DEBUG_ASSERT(r == MI_RESULT_OK);
 156               MI_UNUSED(r);
 157           }
 158           
 159           String DInstance::GetNamespace() const
 160           {
 161               const MI_Char* nameSpace;
 162               MI_Result r = MI_Instance_GetNameSpace(m_self, &nameSpace);
 163               DEBUG_ASSERT(r == MI_RESULT_OK);
 164               MI_UNUSED(r);
 165           
 166               return String(nameSpace);
 167           }
 168           
 169 mike  1.1 void DInstance::SetNamespace(const String& nameSpace)
 170           {
 171               COW();
 172               MI_Result r = MI_Instance_SetNameSpace(m_self, nameSpace.Str());
 173               DEBUG_ASSERT(r == MI_RESULT_OK);
 174               MI_UNUSED(r);
 175           }
 176           
 177           Uint32 DInstance::Count() const
 178           {
 179               return m_self->classDecl->numProperties;
 180           }
 181           
 182           Uint32 DInstance::Find(const String& name) const
 183           {
 184               Uint32 i;
 185               Uint32 count = Count();
 186           
 187               for (i = 0; i < count; i++)
 188               {
 189                   const MI_Char* tmpName;
 190 mike  1.1         MI_Result r;
 191                   r = MI_Instance_GetElementAt(m_self, i, &tmpName, NULL, NULL, NULL);
 192           
 193                   if (r != MI_RESULT_OK)
 194                       return (Uint32)-1;
 195           
 196                   if (name == tmpName)
 197                       return i;
 198               }
 199           
 200               return (Uint32)-1;
 201           }
 202           
 203           bool DInstance::GetType(Uint32 index, Type& type) const
 204           {
 205               MI_Result r;
 206               r = MI_Instance_GetElementAt(m_self, index, NULL, NULL, &type, NULL);
 207               return r == MI_RESULT_OK ? true : false;
 208           }
 209           
 210           bool DInstance::GetName(Uint32 index, String& name) const
 211 mike  1.1 {
 212               MI_Result r;
 213               const MI_Char* tmpName;
 214               r = MI_Instance_GetElementAt(m_self, index, &tmpName, NULL, NULL, NULL);
 215               if (r != MI_RESULT_OK)
 216                   return false;
 217           
 218               name = String(tmpName);
 219               return true;
 220           }
 221           
 222           bool DInstance::GetFlags(Uint32 index, Uint32& flags) const
 223           {
 224               MI_Result r;
 225               r = MI_Instance_GetElementAt(m_self, index, NULL, NULL, NULL, &flags);
 226               return r == MI_RESULT_OK ? true : false;
 227           }
 228           
 229           bool DInstance::Clear(const String& name)
 230           {
 231               COW();
 232 mike  1.1     MI_Result r;
 233               r = MI_Instance_ClearElement(m_self, name.Str());
 234               return (r == MI_RESULT_OK) ? true : false;
 235           }
 236           
 237           void DInstance::Print(
 238               FILE* os, 
 239               MI_Uint32 level,
 240               bool showNulls) const
 241           {
 242               MI_Result r = Instance_Print(m_self, os, level, 
 243                   showNulls ? MI_TRUE : MI_FALSE);
 244               DEBUG_ASSERT(r == MI_RESULT_OK);
 245               MI_UNUSED(r);
 246           }
 247           
 248           DInstance::DInstance(MI_Instance* self, DInstance::AdoptTag) : m_self(self)
 249           {
 250               DEBUG_ASSERT(m_self != 0);
 251           }
 252           
 253 mike  1.1 DInstance::DInstance(MI_Instance* self, DInstance::CloneTag)
 254           {
 255               MI_Result r = MI_Instance_Clone(self, &m_self);
 256               DEBUG_ASSERT(r == MI_RESULT_OK);
 257               MI_UNUSED(r);
 258           }
 259           
 260           bool DInstance::AddValue(
 261               const String& name, 
 262               const MI_Value* value, 
 263               Type type,
 264               bool null,
 265               bool key)
 266           {
 267               COW();
 268               MI_Result r;
 269               MI_Uint32 flags = 0;
 270           
 271               if (key)
 272                   flags |= MI_FLAG_KEY;
 273           
 274 mike  1.1     if (!value || null)
 275                   flags |= MI_FLAG_NULL;
 276           
 277               r = MI_Instance_AddElement(m_self, name.Str(), value, type, flags);
 278               return r == MI_RESULT_OK ? true : false;
 279           }
 280           
 281           bool DInstance::SetValue(
 282               const String& name, 
 283               const MI_Value* value, 
 284               Type type,
 285               bool null)
 286           {
 287               COW();
 288               MI_Result r;
 289               MI_Uint32 flags = 0;
 290           
 291               if (!value || null)
 292                   flags |= MI_FLAG_NULL;
 293           
 294               r = MI_Instance_SetElement(m_self, name.Str(), value, type, flags);
 295 mike  1.1     return r == MI_RESULT_OK ? true : false;
 296           }
 297           
 298           bool DInstance::GetValue(
 299               const String& name, 
 300               MI_Value* value, 
 301               Type& type,
 302               bool& null,
 303               bool& key) const
 304           {
 305               if (!value)
 306                   return false;
 307           
 308               MI_Uint32 f;
 309               MI_Result r;
 310           
 311               r = MI_Instance_GetElement(m_self, name.Str(), value, &type, &f, 0);
 312           
 313               if (r != MI_RESULT_OK)
 314                   return false;
 315           
 316 mike  1.1     key = (f & MI_FLAG_KEY) ? true : false;
 317               null = (f & MI_FLAG_NULL) ? true : false;
 318           
 319               return true;
 320           }
 321           
 322           bool DInstance::GetValueAsType(
 323               const String& name, 
 324               MI_Value* value, 
 325               Type expectedType,
 326               bool& null,
 327               bool& key) const
 328           {
 329               MI_Type type;
 330           
 331               if (GetValue(name, value, type, null, key) != MI_RESULT_OK)
 332                   return false;
 333           
 334               return type == expectedType;
 335           }
 336           
 337 mike  1.1 bool DInstance::GetBoolean(
 338               const String& name, 
 339               Boolean& a,
 340               bool& null,
 341               bool& key) const
 342           {
 343               MI_Value v;
 344           
 345               if (GetValueAsType(name, &v, MI_BOOLEAN, null, key) == MI_RESULT_OK)
 346               {
 347                   a = Boolean(v.boolean);
 348                   return true;
 349               }
 350               return false;
 351           }
 352           
 353           bool DInstance::GetBooleanA(
 354               const String& name, 
 355               BooleanA& a,
 356               bool& null,
 357               bool& key) const
 358 mike  1.1 {
 359               MI_Value v;
 360           
 361               if (GetValueAsType(name, &v, MI_BOOLEANA, null, key) == MI_RESULT_OK)
 362               {
 363                   a = BooleanA((Boolean*)v.booleana.data, v.booleana.size);
 364                   return true;
 365               }
 366               return false;
 367           }
 368           
 369           bool DInstance::GetUint8(
 370               const String& name, 
 371               Uint8& a,
 372               bool& null,
 373               bool& key) const
 374           {
 375               MI_Value v;
 376           
 377               if (GetValueAsType(name, &v, MI_UINT8, null, key) == MI_RESULT_OK)
 378               {
 379 mike  1.1         a = Uint8(v.uint8);
 380                   return true;
 381               }
 382               return false;
 383           }
 384           
 385           bool DInstance::GetUint8A(
 386               const String& name, 
 387               Uint8A& a,
 388               bool& null,
 389               bool& key) const
 390           {
 391               MI_Value v;
 392           
 393               if (GetValueAsType(name, &v, MI_UINT8A, null, key) == MI_RESULT_OK)
 394               {
 395                   a = Uint8A((Uint8*)v.uint8a.data, v.uint8a.size);
 396                   return true;
 397               }
 398               return false;
 399           }
 400 mike  1.1 
 401           bool DInstance::GetSint8(
 402               const String& name, 
 403               Sint8& a,
 404               bool& null,
 405               bool& key) const
 406           {
 407               MI_Value v;
 408           
 409               if (GetValueAsType(name, &v, MI_SINT8, null, key) == MI_RESULT_OK)
 410               {
 411                   a = Sint8(v.sint8);
 412                   return true;
 413               }
 414               return false;
 415           }
 416           
 417           bool DInstance::GetSint8A(
 418               const String& name, 
 419               Sint8A& a,
 420               bool& null,
 421 mike  1.1     bool& key) const
 422           {
 423               MI_Value v;
 424           
 425               if (GetValueAsType(name, &v, MI_SINT8A, null, key) == MI_RESULT_OK)
 426               {
 427                   a = Sint8A((Sint8*)v.sint8a.data, v.sint8a.size);
 428                   return true;
 429               }
 430               return false;
 431           }
 432           
 433           bool DInstance::GetUint16(
 434               const String& name, 
 435               Uint16& a,
 436               bool& null,
 437               bool& key) const
 438           {
 439               MI_Value v;
 440           
 441               if (GetValueAsType(name, &v, MI_UINT16, null, key) == MI_RESULT_OK)
 442 mike  1.1     {
 443                   a = Uint16(v.uint16);
 444                   return true;
 445               }
 446               return false;
 447           }
 448           
 449           bool DInstance::GetUint16A(
 450               const String& name, 
 451               Uint16A& a,
 452               bool& null,
 453               bool& key) const
 454           {
 455               MI_Value v;
 456           
 457               if (GetValueAsType(name, &v, MI_UINT16A, null, key) == MI_RESULT_OK)
 458               {
 459                   a = Uint16A((Uint16*)v.uint16a.data, v.uint16a.size);
 460                   return true;
 461               }
 462               return false;
 463 mike  1.1 }
 464           
 465           bool DInstance::GetSint16(
 466               const String& name, 
 467               Sint16& a,
 468               bool& null,
 469               bool& key) const
 470           {
 471               MI_Value v;
 472           
 473               if (GetValueAsType(name, &v, MI_SINT16, null, key) == MI_RESULT_OK)
 474               {
 475                   a = Sint16(v.sint16);
 476                   return true;
 477               }
 478               return false;
 479           }
 480           
 481           bool DInstance::GetSint16A(
 482               const String& name, 
 483               Sint16A& a,
 484 mike  1.1     bool& null,
 485               bool& key) const
 486           {
 487               MI_Value v;
 488           
 489               if (GetValueAsType(name, &v, MI_SINT16A, null, key) == MI_RESULT_OK)
 490               {
 491                   a = Sint16A((Sint16*)v.sint16a.data, v.sint16a.size);
 492                   return true;
 493               }
 494               return false;
 495           }
 496           
 497           bool DInstance::GetUint32(
 498               const String& name, 
 499               Uint32& a,
 500               bool& null,
 501               bool& key) const
 502           {
 503               MI_Value v;
 504           
 505 mike  1.1     if (GetValueAsType(name, &v, MI_UINT32, null, key) == MI_RESULT_OK)
 506               {
 507                   a = Uint32(v.uint32);
 508                   return true;
 509               }
 510               return false;
 511           }
 512           
 513           bool DInstance::GetUint32A(
 514               const String& name, 
 515               Uint32A& a,
 516               bool& null,
 517               bool& key) const
 518           {
 519               MI_Value v;
 520           
 521               if (GetValueAsType(name, &v, MI_UINT32A, null, key) == MI_RESULT_OK)
 522               {
 523                   a = Uint32A((Uint32*)v.uint32a.data, v.uint32a.size);
 524                   return true;
 525               }
 526 mike  1.1     return false;
 527           }
 528           
 529           bool DInstance::GetSint32(
 530               const String& name, 
 531               Sint32& a,
 532               bool& null,
 533               bool& key) const
 534           {
 535               MI_Value v;
 536           
 537               if (GetValueAsType(name, &v, MI_SINT32, null, key) == MI_RESULT_OK)
 538               {
 539                   a = Sint32(v.sint32);
 540                   return true;
 541               }
 542               return false;
 543           }
 544           
 545           bool DInstance::GetSint32A(
 546               const String& name, 
 547 mike  1.1     Sint32A& a,
 548               bool& null,
 549               bool& key) const
 550           {
 551               MI_Value v;
 552           
 553               if (GetValueAsType(name, &v, MI_SINT32A, null, key) == MI_RESULT_OK)
 554               {
 555                   a = Sint32A((Sint32*)v.sint32a.data, v.sint32a.size);
 556                   return true;
 557               }
 558               return false;
 559           }
 560           
 561           bool DInstance::GetUint64(
 562               const String& name, 
 563               Uint64& a,
 564               bool& null,
 565               bool& key) const
 566           {
 567               MI_Value v;
 568 mike  1.1 
 569               if (GetValueAsType(name, &v, MI_UINT64, null, key) == MI_RESULT_OK)
 570               {
 571                   a = Uint64(v.uint64);
 572                   return true;
 573               }
 574               return false;
 575           }
 576           
 577           bool DInstance::GetUint64A(
 578               const String& name, 
 579               Uint64A& a,
 580               bool& null,
 581               bool& key) const
 582           {
 583               MI_Value v;
 584           
 585               if (GetValueAsType(name, &v, MI_UINT64A, null, key) == MI_RESULT_OK)
 586               {
 587                   a = Uint64A((Uint64*)v.uint64a.data, v.uint64a.size);
 588                   return true;
 589 mike  1.1     }
 590               return false;
 591           }
 592           
 593           bool DInstance::GetSint64(
 594               const String& name, 
 595               Sint64& a,
 596               bool& null,
 597               bool& key) const
 598           {
 599               MI_Value v;
 600           
 601               if (GetValueAsType(name, &v, MI_SINT64, null, key) == MI_RESULT_OK)
 602               {
 603                   a = Sint64(v.sint64);
 604                   return true;
 605               }
 606               return false;
 607           }
 608           
 609           bool DInstance::GetSint64A(
 610 mike  1.1     const String& name, 
 611               Sint64A& a,
 612               bool& null,
 613               bool& key) const
 614           {
 615               MI_Value v;
 616           
 617               if (GetValueAsType(name, &v, MI_SINT64A, null, key) == MI_RESULT_OK)
 618               {
 619                   a = Sint64A((Sint64*)v.sint64a.data, v.sint64a.size);
 620                   return true;
 621               }
 622               return false;
 623           }
 624           
 625           bool DInstance::GetReal32(
 626               const String& name, 
 627               Real32& a,
 628               bool& null,
 629               bool& key) const
 630           {
 631 mike  1.1     MI_Value v;
 632           
 633               if (GetValueAsType(name, &v, MI_REAL32, null, key) == MI_RESULT_OK)
 634               {
 635                   a = Real32(v.real32);
 636                   return true;
 637               }
 638               return false;
 639           }
 640           
 641           bool DInstance::GetReal32A(
 642               const String& name, 
 643               Real32A& a,
 644               bool& null,
 645               bool& key) const
 646           {
 647               MI_Value v;
 648           
 649               if (GetValueAsType(name, &v, MI_REAL32A, null, key) == MI_RESULT_OK)
 650               {
 651                   a = Real32A((Real32*)v.real32a.data, v.real32a.size);
 652 mike  1.1         return true;
 653               }
 654               return false;
 655           }
 656           
 657           bool DInstance::GetReal64(
 658               const String& name, 
 659               Real64& a,
 660               bool& null,
 661               bool& key) const
 662           {
 663               MI_Value v;
 664           
 665               if (GetValueAsType(name, &v, MI_REAL64, null, key) == MI_RESULT_OK)
 666               {
 667                   a = Real64(v.real64);
 668                   return true;
 669               }
 670               return false;
 671           }
 672           
 673 mike  1.1 bool DInstance::GetReal64A(
 674               const String& name, 
 675               Real64A& a,
 676               bool& null,
 677               bool& key) const
 678           {
 679               MI_Value v;
 680           
 681               if (GetValueAsType(name, &v, MI_REAL64A, null, key) == MI_RESULT_OK)
 682               {
 683                   a = Real64A((Real64*)v.real64a.data, v.real64a.size);
 684                   return true;
 685               }
 686               return false;
 687           }
 688           
 689           bool DInstance::GetChar16(
 690               const String& name, 
 691               Char16& a,
 692               bool& null,
 693               bool& key) const
 694 mike  1.1 {
 695               MI_Value v;
 696           
 697               if (GetValueAsType(name, &v, MI_CHAR16, null, key) == MI_RESULT_OK)
 698               {
 699                   a = Char16(v.char16);
 700                   return true;
 701               }
 702               return false;
 703           }
 704           
 705           bool DInstance::GetChar16A(
 706               const String& name, 
 707               Char16A& a,
 708               bool& null,
 709               bool& key) const
 710           {
 711               MI_Value v;
 712           
 713               if (GetValueAsType(name, &v, MI_CHAR16A, null, key) == MI_RESULT_OK)
 714               {
 715 mike  1.1         a = Char16A((Char16*)v.char16a.data, v.char16a.size);
 716                   return true;
 717               }
 718               return false;
 719           }
 720           
 721           bool DInstance::GetDatetime(
 722               const String& name, 
 723               Datetime& a,
 724               bool& null,
 725               bool& key) const
 726           {
 727               MI_Value v;
 728           
 729               if (GetValueAsType(name, &v, MI_DATETIME, null, key) == MI_RESULT_OK)
 730               {
 731                   a = Datetime(v.datetime);
 732                   return true;
 733               }
 734               return false;
 735           }
 736 mike  1.1 
 737           bool DInstance::GetDatetimeA(
 738               const String& name, 
 739               DatetimeA& a,
 740               bool& null,
 741               bool& key) const
 742           {
 743               MI_Value v;
 744           
 745               if (GetValueAsType(name, &v, MI_DATETIMEA, null, key) == MI_RESULT_OK)
 746               {
 747                   a = DatetimeA((Datetime*)v.datetimea.data, v.datetimea.size);
 748                   return true;
 749               }
 750               return false;
 751           }
 752           
 753           bool DInstance::GetString(
 754               const String& name, 
 755               String& a,
 756               bool& null,
 757 mike  1.1     bool& key) const
 758           {
 759               MI_Value v;
 760           
 761               if (GetValueAsType(name, &v, MI_STRING, null, key) == MI_RESULT_OK)
 762               {
 763                   a = String(v.string);
 764                   return true;
 765               }
 766               return false;
 767           }
 768           
 769           bool DInstance::GetStringA(
 770               const String& name, 
 771               StringA& a,
 772               bool& null,
 773               bool& key) const
 774           {
 775               MI_Value v;
 776           
 777               if (GetValueAsType(name, &v, MI_STRINGA, null, key) == MI_RESULT_OK)
 778 mike  1.1     {
 779                   a.Clear();
 780                   for (MI_Uint32 i = 0; i < v.stringa.size; i++)
 781                       a.PushBack(v.stringa.data[i]);
 782                   return true;
 783               }
 784               return false;
 785           }
 786           
 787           bool DInstance::GetReference(
 788               const String& name, 
 789               DInstance& a,
 790               bool& null,
 791               bool& key) const
 792           {
 793               MI_Value v;
 794           
 795               if (GetValueAsType(name, &v, MI_REFERENCE, null, key) == MI_RESULT_OK)
 796               {
 797                   __MI_Instance_Ref(v.reference);
 798                   a = DInstance(v.reference, ADOPT);
 799 mike  1.1         return true;
 800               }
 801               return false;
 802           }
 803           
 804           bool DInstance::GetReferenceA(
 805               const String& name, 
 806               DInstanceA& a,
 807               bool& null,
 808               bool& key) const
 809           {
 810               MI_Value v;
 811           
 812               if (GetValueAsType(name, &v, MI_REFERENCEA, null, key) == MI_RESULT_OK)
 813               {
 814                   a.Clear();
 815                   for (MI_Uint32 i = 0; i < v.referencea.size; i++)
 816                   {
 817                       MI_Instance* tmp = v.referencea.data[i];
 818                       __MI_Instance_Ref(tmp);
 819                       a.PushBack(DInstance(tmp, ADOPT));
 820 mike  1.1         }
 821                   return true;
 822               }
 823               return false;
 824           }
 825           
 826           bool DInstance::GetInstance(
 827               const String& name, 
 828               DInstance& a,
 829               bool& null,
 830               bool& key) const
 831           {
 832               MI_Value v;
 833           
 834               if (GetValueAsType(name, &v, MI_INSTANCE, null, key) == MI_RESULT_OK)
 835               {
 836                   __MI_Instance_Ref(v.instance);
 837                   a = DInstance(v.instance, ADOPT);
 838                   return true;
 839               }
 840               return false;
 841 mike  1.1 }
 842           
 843           bool DInstance::GetInstanceA(
 844               const String& name, 
 845               DInstanceA& a,
 846               bool& null,
 847               bool& key) const
 848           {
 849               MI_Value v;
 850           
 851               if (GetValueAsType(name, &v, MI_INSTANCEA, null, key) == MI_RESULT_OK)
 852               {
 853                   a.Clear();
 854           
 855                   for (MI_Uint32 i = 0; i < v.instancea.size; i++)
 856                   {
 857                       MI_Instance* tmp = v.instancea.data[i];
 858                       __MI_Instance_Ref(tmp);
 859                       a.PushBack(DInstance(tmp, ADOPT));
 860                   }
 861               }
 862 mike  1.1     return false;
 863           }
 864           
 865           bool DInstance::DynamicToStatic(
 866               const DInstance& dinst,
 867               bool keysOnly,
 868               bool ignoreUnknownProperties,
 869               Instance& sinst)
 870           {
 871               if (!sinst.m_instance)
 872               {
 873                   TRACE;
 874                   return false;
 875               }
 876           
 877               const MI_ClassDecl* cd = sinst.m_instance->classDecl;
 878           
 879               if (!cd)
 880               {
 881                   TRACE;
 882                   return false;
 883 mike  1.1     }
 884           
 885               // Get the property count.
 886               Uint32 count;
 887               
 888               if (MI_Instance_GetElementCount(dinst.m_self, &count) != MI_RESULT_OK)
 889               {
 890                   TRACE;
 891                   return false;
 892               }
 893           
 894               // For each property in the dynamic instance.
 895               for (Uint32 i = 0; i < count; i++)
 896               {
 897                   const MI_Char* name;
 898                   MI_Value value;
 899                   MI_Type type;
 900                   MI_Uint32 flags;
 901           
 902                   // Get the i-th property.
 903                   if (MI_Instance_GetElementAt(
 904 mike  1.1             dinst.m_self, i, &name, &value, &type, &flags) != MI_RESULT_OK)
 905                   {
 906                       TRACE;
 907                       return false;
 908                   }
 909           
 910                   // Find the index of the property with same name in target instance.
 911                   MI_PropertyDecl* pd;
 912                   {
 913                       MI_Uint32 index = _FindPropertyDecl(cd, name);
 914           
 915                       if (index == (MI_Uint32)-1)
 916                       {
 917                           if (ignoreUnknownProperties)
 918                               continue;
 919           
 920                           TRACE;
 921                           return false;
 922                       }
 923           
 924                       pd = cd->properties[index];
 925 mike  1.1         }
 926           
 927                   // Get offset to field:
 928                   size_t off = pd->offset;
 929           
 930                   // Skip non-key properties if so requested.
 931                   if (!(pd->flags & MI_FLAG_KEY) && keysOnly)
 932                   {
 933                       continue;
 934                   }
 935           
 936                   // Set the property in the target instanced.
 937                   if (type == (MI_Type)pd->type)
 938                   {
 939                       if (flags & MI_FLAG_NULL)
 940                       {
 941                           switch (type)
 942                           {
 943                               case MI_BOOLEAN:
 944                               {
 945                                   sinst.GetField<Boolean>(off).Clear();
 946 mike  1.1                         break;
 947                               }
 948                               case MI_BOOLEANA:
 949                                   sinst.GetField<BooleanA>(off).Clear();
 950                                   break;
 951                               case MI_UINT8:
 952                                   sinst.GetField<Uint8>(off).Clear();
 953                                   break;
 954                               case MI_UINT8A:
 955                                   sinst.GetField<Uint8A>(off).Clear();
 956                                   break;
 957                               case MI_SINT8:
 958                                   sinst.GetField<Sint8>(off).Clear();
 959                                   break;
 960                               case MI_SINT8A:
 961                                   sinst.GetField<Sint8A>(off).Clear();
 962                                   break;
 963                               case MI_UINT16:
 964                                   sinst.GetField<Uint16>(off).Clear();
 965                                   break;
 966                               case MI_UINT16A:
 967 mike  1.1                         sinst.GetField<Uint16A>(off).Clear();
 968                                   break;
 969                               case MI_SINT16:
 970                                   sinst.GetField<Sint16>(off).Clear();
 971                                   break;
 972                               case MI_SINT16A:
 973                                   sinst.GetField<Sint16A>(off).Clear();
 974                                   break;
 975                               case MI_UINT32:
 976                                   sinst.GetField<Uint32>(off).Clear();
 977                                   break;
 978                               case MI_UINT32A:
 979                                   sinst.GetField<Uint32A>(off).Clear();
 980                                   break;
 981                               case MI_SINT32:
 982                                   sinst.GetField<Sint32>(off).Clear();
 983                                   break;
 984                               case MI_SINT32A:
 985                                   sinst.GetField<Sint32A>(off).Clear();
 986                                   break;
 987                               case MI_UINT64:
 988 mike  1.1                         sinst.GetField<Uint64>(off).Clear();
 989                                   break;
 990                               case MI_UINT64A:
 991                                   sinst.GetField<Uint64A>(off).Clear();
 992                                   break;
 993                               case MI_SINT64:
 994                                   sinst.GetField<Sint64>(off).Clear();
 995                                   break;
 996                               case MI_SINT64A:
 997                                   sinst.GetField<Sint64A>(off).Clear();
 998                                   break;
 999                               case MI_REAL32:
1000                                   sinst.GetField<Real32>(off).Clear();
1001                                   break;
1002                               case MI_REAL32A:
1003                                   sinst.GetField<Real32A>(off).Clear();
1004                                   break;
1005                               case MI_REAL64:
1006                                   sinst.GetField<Real64>(off).Clear();
1007                                   break;
1008                               case MI_REAL64A:
1009 mike  1.1                         sinst.GetField<Real64A>(off).Clear();
1010                                   break;
1011                               case MI_CHAR16:
1012                                   sinst.GetField<Char16>(off).Clear();
1013                                   break;
1014                               case MI_CHAR16A:
1015                                   sinst.GetField<Char16A>(off).Clear();
1016                                   break;
1017                               case MI_DATETIME:
1018                                   sinst.GetField<Datetime>(off).Clear();
1019                                   break;
1020                               case MI_DATETIMEA:
1021                                   sinst.GetField<DatetimeA>(off).Clear();
1022                                   break;
1023                               case MI_STRING:
1024                                   sinst.GetField<String>(off).Clear();
1025                                   break;
1026                               case MI_STRINGA:
1027                                   sinst.GetField<StringA>(off).Clear();
1028                                   break;
1029                               case MI_REFERENCE:
1030 mike  1.1                     case MI_INSTANCE:
1031                                   sinst.GetField<Instance>(off).Clear();
1032                                   break;
1033                               case MI_REFERENCEA:
1034                               case MI_INSTANCEA:
1035                                   sinst.GetField<InstanceA>(off).Clear();
1036                                   break;
1037                           }
1038                       }
1039                       else
1040                       {
1041                           switch (type)
1042                           {
1043                               case MI_BOOLEAN:
1044                                   sinst.GetField<Uint8>(off).Set(value.uint8);
1045                                   break;
1046                               case MI_UINT8:
1047                                   sinst.GetField<Uint8>(off).Set(value.uint8);
1048                                   break;
1049                               case MI_SINT8:
1050                                   sinst.GetField<Sint8>(off).Set(value.sint8);
1051 mike  1.1                         break;
1052                               case MI_UINT16:
1053                                   sinst.GetField<Uint16>(off).Set(value.uint16);
1054                                   break;
1055                               case MI_SINT16:
1056                                   sinst.GetField<Sint16>(off).Set(value.sint16);
1057                                   break;
1058                               case MI_UINT32:
1059                                   sinst.GetField<Uint32>(off).Set(value.uint32);
1060                                   break;
1061                               case MI_SINT32:
1062                                   sinst.GetField<Sint32>(off).Set(value.sint32);
1063                                   break;
1064                               case MI_UINT64:
1065                                   sinst.GetField<Uint64>(off).Set(value.uint64);
1066                                   break;
1067                               case MI_SINT64:
1068                                   sinst.GetField<Sint64>(off).Set(value.sint64);
1069                                   break;
1070                               case MI_REAL32:
1071                                   sinst.GetField<Real32>(off).Set(value.real32);
1072 mike  1.1                         break;
1073                               case MI_REAL64:
1074                                   sinst.GetField<Real64>(off).Set(value.real64);
1075                                   break;
1076                               case MI_CHAR16:
1077                                   sinst.GetField<Char16>(off).Set(value.char16);
1078                                   break;
1079                               case MI_DATETIME:
1080                                   sinst.GetField<Datetime>(off).Set(value.datetime);
1081                                   break;
1082                               case MI_STRING:
1083                                   sinst.GetField<String>(off).Set(value.string);
1084                                   break;
1085                               case MI_REFERENCE:
1086                               case MI_INSTANCE:
1087                               {
1088                                   if (!value.instance)
1089                                   {
1090                                       TRACE;
1091                                       return false;
1092                                   }
1093 mike  1.1 
1094                                   const MI_ClassDecl* tcd = SchemaDecl_FindClassDecl(
1095                                       cd->schema,  pd->className);
1096           
1097                                   if (!tcd)
1098                                   {
1099                                       TRACE;
1100                                       return false;
1101                                   }
1102           
1103                                   // ATTN: optimize: avoid cloning.
1104                                   DInstance tdinst(value.instance, CLONE);
1105                                   Instance x(tcd);
1106           
1107                                   if (!DynamicToStatic(tdinst, keysOnly, 
1108                                       ignoreUnknownProperties, x))
1109                                   {
1110                                       TRACE;
1111                                       return false;
1112                                   }
1113           
1114 mike  1.1                         sinst.GetField<Instance>(off).Set(x);
1115                                   break;
1116                               }
1117                               case MI_BOOLEANA:
1118                               {
1119                                   BooleanA a(value.booleana.data, value.booleana.size);
1120                                   sinst.GetField<BooleanA>(off).Set(a);
1121                                   break;
1122                               }
1123                               case MI_UINT8A:
1124                               {
1125                                   Uint8A a(value.uint8a.data, value.uint8a.size);
1126                                   sinst.GetField<Uint8A>(off).Set(a);
1127                                   break;
1128                               }
1129                               case MI_SINT8A:
1130                               {
1131                                   Sint8A a(value.sint8a.data, value.sint8a.size);
1132                                   sinst.GetField<Sint8A>(off).Set(a);
1133                                   break;
1134                               }
1135 mike  1.1                     case MI_UINT16A:
1136                               {
1137                                   Uint16A a(value.uint16a.data, value.uint16a.size);
1138                                   sinst.GetField<Uint16A>(off).Set(a);
1139                                   break;
1140                               }
1141                               case MI_SINT16A:
1142                               {
1143                                   Sint16A a(value.sint16a.data, value.sint16a.size);
1144                                   sinst.GetField<Sint16A>(off).Set(a);
1145                                   break;
1146                               }
1147                               case MI_UINT32A:
1148                               {
1149                                   Uint32A a(value.uint32a.data, value.uint32a.size);
1150                                   sinst.GetField<Uint32A>(off).Set(a);
1151                                   break;
1152                               }
1153                               case MI_SINT32A:
1154                               {
1155                                   Sint32A a(value.sint32a.data, value.sint32a.size);
1156 mike  1.1                         sinst.GetField<Sint32A>(off).Set(a);
1157                                   break;
1158                               }
1159                               case MI_UINT64A:
1160                               {
1161                                   Uint64A a(value.uint64a.data, value.uint64a.size);
1162                                   sinst.GetField<Uint64A>(off).Set(a);
1163                                   break;
1164                               }
1165                               case MI_SINT64A:
1166                               {
1167                                   Sint64A a(value.sint64a.data, value.sint64a.size);
1168                                   sinst.GetField<Sint64A>(off).Set(a);
1169                                   break;
1170                               }
1171                               case MI_REAL32A:
1172                               {
1173                                   Real32A a(value.real32a.data, value.real32a.size);
1174                                   sinst.GetField<Real32A>(off).Set(a);
1175                                   break;
1176                               }
1177 mike  1.1                     case MI_REAL64A:
1178                               {
1179                                   Real64A a(value.real64a.data, value.real64a.size);
1180                                   sinst.GetField<Real64A>(off).Set(a);
1181                                   break;
1182                               }
1183                               case MI_CHAR16A:
1184                               {
1185                                   Char16A a(value.char16a.data, value.char16a.size);
1186                                   sinst.GetField<Char16A>(off).Set(a);
1187                                   break;
1188                               }
1189                               case MI_DATETIMEA:
1190                               {
1191                                   DatetimeA a(
1192                                       reinterpret_cast<Datetime*>(value.datetimea.data), 
1193                                       value.datetimea.size);
1194                                   sinst.GetField<DatetimeA>(off).Set(a);
1195                                   break;
1196                               }
1197                               case MI_STRINGA:
1198 mike  1.1                     {
1199                                   StringA a;
1200           
1201                                   for (Uint32 j = 0; j < value.stringa.size; j++)
1202                                       a.PushBack(String(value.stringa.data[j]));
1203           
1204                                   sinst.GetField<StringA>(off).Set(a);
1205                                   break;
1206                               }
1207                               case MI_REFERENCEA:
1208                               case MI_INSTANCEA:
1209                               {
1210                                   if (!value.instancea.data)
1211                                   {
1212                                       TRACE;
1213                                       return false;
1214                                   }
1215           
1216                                   const MI_ClassDecl* tcd = SchemaDecl_FindClassDecl(
1217                                       cd->schema,  pd->className);
1218           
1219 mike  1.1                         if (!tcd)
1220                                   {
1221                                       TRACE;
1222                                       return false;
1223                                   }
1224           
1225                                   InstanceA a;
1226           
1227                                   for (Uint32 j = 0; j < value.instancea.size; j++)
1228                                   {
1229                                       if (!value.instancea.data[j])
1230                                       {
1231                                           TRACE;
1232                                           return false;
1233                                       }
1234           
1235                                       DInstance tdinst(value.instancea.data[j], CLONE);
1236                                       Instance x(tcd);
1237           
1238                                       if (!DynamicToStatic(tdinst, keysOnly, 
1239                                           ignoreUnknownProperties, x))
1240 mike  1.1                             {
1241                                           TRACE;
1242                                           return false;
1243                                       }
1244           
1245                                       a.PushBack(x);
1246                                   }
1247           
1248                                   sinst.GetField<InstanceA>(off).Set(a);
1249                                   break;
1250                               }
1251                           }
1252                       }
1253                   }
1254                   else if (type == MI_STRING)
1255                   {
1256                       // Convert string to type of target property.
1257                       switch (pd->type)
1258                       {
1259                           case MI_BOOLEAN:
1260                           {
1261 mike  1.1                     Boolean x;
1262           
1263                               if (StrToBoolean(value.string, &x) != 0)
1264                                   return false;
1265           
1266                               sinst.GetField<Boolean>(off).Set(x);
1267                               break;
1268                           }
1269                           case MI_UINT8:
1270                           {
1271                               Uint8 x;
1272           
1273                               if (StrToUint8(value.string, &x) != 0)
1274                                   return false;
1275           
1276                               sinst.GetField<Uint8>(off).Set(x);
1277                               break;
1278                           }
1279                           case MI_SINT8:
1280                           {
1281                               Sint8 x;
1282 mike  1.1 
1283                               if (StrToSint8(value.string, &x) != 0)
1284                                   return false;
1285           
1286                               sinst.GetField<Sint8>(off).Set(x);
1287                               break;
1288                           }
1289                           case MI_UINT16:
1290                           {
1291                               Uint16 x;
1292           
1293                               if (StrToUint16(value.string, &x) != 0)
1294                                   return false;
1295           
1296                               sinst.GetField<Uint16>(off).Set(x);
1297                               break;
1298                           }
1299                           case MI_SINT16:
1300                           {
1301                               Sint16 x;
1302           
1303 mike  1.1                     if (StrToSint16(value.string, &x) != 0)
1304                                   return false;
1305           
1306                               sinst.GetField<Sint16>(off).Set(x);
1307                               break;
1308                           }
1309                           case MI_UINT32:
1310                           {
1311                               Uint32 x;
1312           
1313                               if (StrToUint32(value.string, &x) != 0)
1314                                   return false;
1315           
1316                               sinst.GetField<Uint32>(off).Set(x);
1317                               break;
1318                           }
1319                           case MI_SINT32:
1320                           {
1321                               Sint32 x;
1322           
1323                               if (StrToSint32(value.string, &x) != 0)
1324 mike  1.1                         return false;
1325           
1326                               sinst.GetField<Sint32>(off).Set(x);
1327                               break;
1328                           }
1329                           case MI_UINT64:
1330                           {
1331                               Uint64 x;
1332           
1333                               if (StrToUint64(value.string, &x) != 0)
1334                                   return false;
1335           
1336                               sinst.GetField<Uint64>(off).Set(x);
1337                               break;
1338                           }
1339                           case MI_SINT64:
1340                           {
1341                               Sint64 x;
1342           
1343                               if (StrToSint64(value.string, &x) != 0)
1344                                   return false;
1345 mike  1.1 
1346                               sinst.GetField<Sint64>(off).Set(x);
1347                               break;
1348                           }
1349                           case MI_REAL32:
1350                           {
1351                               Real32 x;
1352           
1353                               if (StrToReal32(value.string, &x) != 0)
1354                                   return false;
1355           
1356                               sinst.GetField<Real32>(off).Set(x);
1357                               break;
1358                           }
1359                           case MI_REAL64:
1360                           {
1361                               Real64 x;
1362           
1363                               if (StrToReal64(value.string, &x) != 0)
1364                                   return false;
1365           
1366 mike  1.1                     sinst.GetField<Real64>(off).Set(x);
1367                               break;
1368                           }
1369                           case MI_CHAR16:
1370                           {
1371                               Char16 x;
1372           
1373                               if (StrToChar16(value.string, &x) != 0)
1374                                   return false;
1375           
1376                               sinst.GetField<Char16>(off).Set(x);
1377                               break;
1378                           }
1379                           case MI_DATETIME:
1380                           {
1381                               MI_Datetime x;
1382           
1383                               if (StrToDatetime(value.string, &x) != 0)
1384                                   return false;
1385           
1386                               sinst.GetField<Datetime>(off).Set(Datetime(x));
1387 mike  1.1                     break;
1388                           }
1389                           default:
1390                           {
1391                               // Conversion to string to this type is unsupported!
1392                               return false;
1393                           }
1394                       }
1395                   }
1396                   else if (type == MI_STRINGA)
1397                   {
1398                       switch (pd->type)
1399                       {
1400                           case MI_BOOLEANA:
1401                           {
1402                               Array<Boolean> a;
1403           
1404                               for (Uint32 j = 0; j < value.stringa.size; j++)
1405                               {
1406                                   MI_Boolean x;
1407           
1408 mike  1.1                         if (StrToBoolean(value.stringa.data[j], &x) != 0)
1409                                       return false;
1410           
1411                                   a.PushBack(x);
1412                               }
1413           
1414                               sinst.GetField<BooleanA>(off).Set(a);
1415                               break;
1416                           }
1417                           case MI_UINT8A:
1418                           {
1419                               Array<Uint8> a;
1420           
1421                               for (Uint32 j = 0; j < value.stringa.size; j++)
1422                               {
1423                                   MI_Uint8 x;
1424           
1425                                   if (StrToUint8(value.stringa.data[j], &x) != 0)
1426                                       return false;
1427           
1428                                   a.PushBack(x);
1429 mike  1.1                     }
1430           
1431                               sinst.GetField<Uint8A>(off).Set(a);
1432                               break;
1433                           }
1434                           case MI_SINT8A:
1435                           {
1436                               Array<Sint8> a;
1437           
1438                               for (Uint32 j = 0; j < value.stringa.size; j++)
1439                               {
1440                                   MI_Sint8 x;
1441           
1442                                   if (StrToSint8(value.stringa.data[j], &x) != 0)
1443                                       return false;
1444           
1445                                   a.PushBack(x);
1446                               }
1447           
1448                               sinst.GetField<Sint8A>(off).Set(a);
1449                               break;
1450 mike  1.1                 }
1451                           case MI_UINT16A:
1452                           {
1453                               Array<Uint16> a;
1454           
1455                               for (Uint32 j = 0; j < value.stringa.size; j++)
1456                               {
1457                                   MI_Uint16 x;
1458           
1459                                   if (StrToUint16(value.stringa.data[j], &x) != 0)
1460                                       return false;
1461           
1462                                   a.PushBack(x);
1463                               }
1464           
1465                               sinst.GetField<Uint16A>(off).Set(a);
1466                               break;
1467                           }
1468                           case MI_SINT16A:
1469                           {
1470                               Array<Sint16> a;
1471 mike  1.1 
1472                               for (Uint32 j = 0; j < value.stringa.size; j++)
1473                               {
1474                                   MI_Sint16 x;
1475           
1476                                   if (StrToSint16(value.stringa.data[j], &x) != 0)
1477                                       return false;
1478           
1479                                   a.PushBack(x);
1480                               }
1481           
1482                               sinst.GetField<Sint16A>(off).Set(a);
1483                               break;
1484                           }
1485                           case MI_UINT32A:
1486                           {
1487                               Array<Uint32> a;
1488           
1489                               for (Uint32 j = 0; j < value.stringa.size; j++)
1490                               {
1491                                   MI_Uint32 x;
1492 mike  1.1 
1493                                   if (StrToUint32(value.stringa.data[j], &x) != 0)
1494                                       return false;
1495           
1496                                   a.PushBack(x);
1497                               }
1498           
1499                               sinst.GetField<Uint32A>(off).Set(a);
1500                               break;
1501                           }
1502                           case MI_SINT32A:
1503                           {
1504                               Array<Sint32> a;
1505           
1506                               for (Uint32 j = 0; j < value.stringa.size; j++)
1507                               {
1508                                   MI_Sint32 x;
1509           
1510                                   if (StrToSint32(value.stringa.data[j], &x) != 0)
1511                                       return false;
1512           
1513 mike  1.1                         a.PushBack(x);
1514                               }
1515           
1516                               sinst.GetField<Sint32A>(off).Set(a);
1517                               break;
1518                           }
1519                           case MI_UINT64A:
1520                           {
1521                               Array<Uint64> a;
1522           
1523                               for (Uint32 j = 0; j < value.stringa.size; j++)
1524                               {
1525                                   MI_Uint64 x;
1526           
1527                                   if (StrToUint64(value.stringa.data[j], &x) != 0)
1528                                       return false;
1529           
1530                                   a.PushBack(x);
1531                               }
1532           
1533                               sinst.GetField<Uint64A>(off).Set(a);
1534 mike  1.1                     break;
1535                           }
1536                           case MI_SINT64A:
1537                           {
1538                               Array<Sint64> a;
1539           
1540                               for (Uint32 j = 0; j < value.stringa.size; j++)
1541                               {
1542                                   MI_Sint64 x;
1543           
1544                                   if (StrToSint64(value.stringa.data[j], &x) != 0)
1545                                       return false;
1546           
1547                                   a.PushBack(x);
1548                               }
1549           
1550                               sinst.GetField<Sint64A>(off).Set(a);
1551                               break;
1552                           }
1553                           case MI_REAL32A:
1554                           {
1555 mike  1.1                     Array<Real32> a;
1556           
1557                               for (Uint32 j = 0; j < value.stringa.size; j++)
1558                               {
1559                                   MI_Real32 x;
1560           
1561                                   if (StrToReal32(value.stringa.data[j], &x) != 0)
1562                                       return false;
1563           
1564                                   a.PushBack(x);
1565                               }
1566           
1567                               sinst.GetField<Real32A>(off).Set(a);
1568                               break;
1569                           }
1570                           case MI_REAL64A:
1571                           {
1572                               Array<Real64> a;
1573           
1574                               for (Uint32 j = 0; j < value.stringa.size; j++)
1575                               {
1576 mike  1.1                         MI_Real64 x;
1577           
1578                                   if (StrToReal64(value.stringa.data[j], &x) != 0)
1579                                       return false;
1580           
1581                                   a.PushBack(x);
1582                               }
1583           
1584                               sinst.GetField<Real64A>(off).Set(a);
1585                               break;
1586                           }
1587                           case MI_CHAR16A:
1588                           {
1589                               Array<Char16> a;
1590           
1591                               for (Uint32 j = 0; j < value.stringa.size; j++)
1592                               {
1593                                   MI_Char16 x;
1594           
1595                                   if (StrToChar16(value.stringa.data[j], &x) != 0)
1596                                       return false;
1597 mike  1.1 
1598                                   a.PushBack(x);
1599                               }
1600           
1601                               sinst.GetField<Char16A>(off).Set(a);
1602                               break;
1603                           }
1604                           case MI_DATETIMEA:
1605                           {
1606                               Array<Datetime> a;
1607           
1608                               for (Uint32 j = 0; j < value.stringa.size; j++)
1609                               {
1610                                   MI_Datetime x;
1611           
1612                                   if (StrToDatetime(value.stringa.data[j], &x) != 0)
1613                                       return false;
1614           
1615                                   a.PushBack(x);
1616                               }
1617           
1618 mike  1.1                     sinst.GetField<DatetimeA>(off).Set(a);
1619                               break;
1620                           }
1621                           default:
1622                           {
1623                               // Conversion to string to this type is unsupported!
1624                               return false;
1625                           }
1626                       }
1627                   }
1628                   else
1629                   {
1630                       return false;
1631                   }
1632               }
1633           
1634               return true;
1635           }
1636           
1637           bool DInstance::StaticToDynamic(
1638               const Instance& sinst,
1639 mike  1.1     bool keysOnly,
1640               DInstance& dinst)
1641           {
1642               // Reject if static instance has no internal instance.
1643               if (!sinst.m_instance)
1644               {
1645                   TRACE;
1646                   return false;
1647               }
1648           
1649               // Get class declaration from static instance.
1650               const MI_ClassDecl* cd = sinst.m_instance->classDecl;
1651               if (!cd)
1652               {
1653                   TRACE;
1654                   return false;
1655               }
1656           
1657               // Create new instance with given class name.
1658               {
1659                   MetaType mt;
1660 mike  1.1         memset(&mt, 0, sizeof(mt));
1661           
1662                   if (cd->flags & MI_FLAG_ASSOCIATION)
1663                       mt = ASSOCIATION;
1664                   else if (cd->flags & MI_FLAG_INDICATION)
1665                       mt = INDICATION;
1666                   else if (cd->flags & MI_FLAG_METHOD)
1667                       mt = METHOD;
1668                   else if (cd->flags & MI_FLAG_CLASS)
1669                       mt = CLASS;
1670           
1671                   dinst = DInstance(cd->name, mt);
1672               }
1673           
1674               // Convert each property.
1675               for (Uint32 i = 0; i < cd->numProperties; i++)
1676               {
1677                   MI_PropertyDecl* pd = cd->properties[i];
1678                   bool key = (pd->flags & MI_FLAG_KEY) != 0;
1679           
1680                   if (!key && keysOnly)
1681 mike  1.1             continue;
1682           
1683                   switch (pd->type)
1684                   {
1685                       case MI_BOOLEAN:
1686                       {
1687                           dinst.AddBoolean(
1688                               pd->name, 
1689                               sinst.GetField<Boolean>(pd->offset).value,
1690                               !sinst.GetField<Boolean>(pd->offset).exists,
1691                               key);
1692                           break;
1693                       }
1694                       case MI_UINT8:
1695                       {
1696                           dinst.AddUint8(
1697                               pd->name, 
1698                               sinst.GetField<Uint8>(pd->offset).value,
1699                               !sinst.GetField<Uint8>(pd->offset).exists,
1700                               key);
1701                           break;
1702 mike  1.1             }
1703                       case MI_SINT8:
1704                       {
1705                           dinst.AddSint8(
1706                               pd->name, 
1707                               sinst.GetField<Sint8>(pd->offset).value,
1708                               !sinst.GetField<Sint8>(pd->offset).exists,
1709                               key);
1710                           break;
1711                       }
1712                       case MI_UINT16:
1713                       {
1714                           dinst.AddUint16(
1715                               pd->name, 
1716                               sinst.GetField<Uint16>(pd->offset).value,
1717                               !sinst.GetField<Uint16>(pd->offset).exists,
1718                               key);
1719                           break;
1720                       }
1721                       case MI_SINT16:
1722                       {
1723 mike  1.1                 dinst.AddSint16(
1724                               pd->name, 
1725                               sinst.GetField<Sint16>(pd->offset).value,
1726                               !sinst.GetField<Sint16>(pd->offset).exists,
1727                               key);
1728                           break;
1729                       }
1730                       case MI_UINT32:
1731                       {
1732                           dinst.AddUint32(
1733                               pd->name, 
1734                               sinst.GetField<Uint32>(pd->offset).value,
1735                               !sinst.GetField<Uint32>(pd->offset).exists,
1736                               key);
1737                           break;
1738                       }
1739                       case MI_SINT32:
1740                       {
1741                           dinst.AddSint32(
1742                               pd->name, 
1743                               sinst.GetField<Sint32>(pd->offset).value,
1744 mike  1.1                     !sinst.GetField<Sint32>(pd->offset).exists,
1745                               key);
1746                           break;
1747                       }
1748                       case MI_UINT64:
1749                       {
1750                           dinst.AddUint64(
1751                               pd->name, 
1752                               sinst.GetField<Uint64>(pd->offset).value,
1753                               !sinst.GetField<Uint64>(pd->offset).exists,
1754                               key);
1755                           break;
1756                       }
1757                       case MI_SINT64:
1758                       {
1759                           dinst.AddSint64(
1760                               pd->name, 
1761                               sinst.GetField<Sint64>(pd->offset).value,
1762                               !sinst.GetField<Sint64>(pd->offset).exists,
1763                               key);
1764                           break;
1765 mike  1.1             }
1766                       case MI_REAL32:
1767                       {
1768                           dinst.AddReal32(
1769                               pd->name, 
1770                               sinst.GetField<Real32>(pd->offset).value,
1771                               !sinst.GetField<Real32>(pd->offset).exists,
1772                               key);
1773                           break;
1774                       }
1775                       case MI_REAL64:
1776                       {
1777                           dinst.AddReal64(
1778                               pd->name, 
1779                               sinst.GetField<Real64>(pd->offset).value,
1780                               !sinst.GetField<Real64>(pd->offset).exists,
1781                               key);
1782                           break;
1783                       }
1784                       case MI_CHAR16:
1785                       {
1786 mike  1.1                 dinst.AddChar16(
1787                               pd->name, 
1788                               sinst.GetField<Char16>(pd->offset).value,
1789                               !sinst.GetField<Char16>(pd->offset).exists,
1790                               key);
1791                           break;
1792                       }
1793                       case MI_DATETIME:
1794                       {
1795                           dinst.AddDatetime(
1796                               pd->name, 
1797                               sinst.GetField<Datetime>(pd->offset).value,
1798                               !sinst.GetField<Datetime>(pd->offset).exists,
1799                               key);
1800                           break;
1801                       }
1802                       case MI_STRING:
1803                       {
1804                           dinst.AddString(
1805                               pd->name, 
1806                               sinst.GetField<String>(pd->offset).value,
1807 mike  1.1                     !sinst.GetField<String>(pd->offset).exists,
1808                               key);
1809                           break;
1810                       }
1811                       case MI_REFERENCE:
1812                       case MI_INSTANCE:
1813                       {
1814                           DInstance x;
1815           
1816                           if (!DInstance::StaticToDynamic(
1817                               sinst.GetField<Instance>(pd->offset).value,
1818                               keysOnly,
1819                               x))
1820                           {
1821                               return false;
1822                           }
1823           
1824                           dinst.AddInstance(
1825                               pd->name, 
1826                               x,
1827                               !sinst.GetField<Instance>(pd->offset).exists,
1828 mike  1.1                     key);
1829                           break;
1830                       }
1831                       case MI_BOOLEANA:
1832                       {
1833                           dinst.AddBooleanA(
1834                               pd->name, 
1835                               sinst.GetField<BooleanA>(pd->offset).value,
1836                               !sinst.GetField<BooleanA>(pd->offset).exists,
1837                               key);
1838                           break;
1839                       }
1840                       case MI_UINT8A:
1841                       {
1842                           dinst.AddUint8A(
1843                               pd->name, 
1844                               sinst.GetField<Uint8A>(pd->offset).value,
1845                               !sinst.GetField<Uint8A>(pd->offset).exists,
1846                               key);
1847                           break;
1848                       }
1849 mike  1.1             case MI_SINT8A:
1850                       {
1851                           dinst.AddSint8A(
1852                               pd->name, 
1853                               sinst.GetField<Sint8A>(pd->offset).value,
1854                               !sinst.GetField<Sint8A>(pd->offset).exists,
1855                               key);
1856                           break;
1857                       }
1858                       case MI_UINT16A:
1859                       {
1860                           dinst.AddUint16A(
1861                               pd->name, 
1862                               sinst.GetField<Uint16A>(pd->offset).value,
1863                               !sinst.GetField<Uint16A>(pd->offset).exists,
1864                               key);
1865                           break;
1866                       }
1867                       case MI_SINT16A:
1868                       {
1869                           dinst.AddSint16A(
1870 mike  1.1                     pd->name, 
1871                               sinst.GetField<Sint16A>(pd->offset).value,
1872                               !sinst.GetField<Sint16A>(pd->offset).exists,
1873                               key);
1874                           break;
1875                       }
1876                       case MI_UINT32A:
1877                       {
1878                           dinst.AddUint32A(
1879                               pd->name, 
1880                               sinst.GetField<Uint32A>(pd->offset).value,
1881                               !sinst.GetField<Uint32A>(pd->offset).exists,
1882                               key);
1883                           break;
1884                       }
1885                       case MI_SINT32A:
1886                       {
1887                           dinst.AddSint32A(
1888                               pd->name, 
1889                               sinst.GetField<Sint32A>(pd->offset).value,
1890                               !sinst.GetField<Sint32A>(pd->offset).exists,
1891 mike  1.1                     key);
1892                           break;
1893                       }
1894                       case MI_UINT64A:
1895                       {
1896                           dinst.AddUint64A(
1897                               pd->name, 
1898                               sinst.GetField<Uint64A>(pd->offset).value,
1899                               !sinst.GetField<Uint64A>(pd->offset).exists,
1900                               key);
1901                           break;
1902                       }
1903                       case MI_SINT64A:
1904                       {
1905                           dinst.AddSint64A(
1906                               pd->name, 
1907                               sinst.GetField<Sint64A>(pd->offset).value,
1908                               !sinst.GetField<Sint64A>(pd->offset).exists,
1909                               key);
1910                           break;
1911                       }
1912 mike  1.1             case MI_REAL32A:
1913                       {
1914                           dinst.AddReal32A(
1915                               pd->name, 
1916                               sinst.GetField<Real32A>(pd->offset).value,
1917                               !sinst.GetField<Real32A>(pd->offset).exists,
1918                               key);
1919                           break;
1920                       }
1921                       case MI_REAL64A:
1922                       {
1923                           dinst.AddReal64A(
1924                               pd->name, 
1925                               sinst.GetField<Real64A>(pd->offset).value,
1926                               !sinst.GetField<Real64A>(pd->offset).exists,
1927                               key);
1928                           break;
1929                       }
1930                       case MI_CHAR16A:
1931                       {
1932                           dinst.AddChar16A(
1933 mike  1.1                     pd->name, 
1934                               sinst.GetField<Char16A>(pd->offset).value,
1935                               !sinst.GetField<Char16A>(pd->offset).exists,
1936                               key);
1937                           break;
1938                       }
1939                       case MI_DATETIMEA:
1940                       {
1941                           dinst.AddDatetimeA(
1942                               pd->name, 
1943                               sinst.GetField<DatetimeA>(pd->offset).value,
1944                               !sinst.GetField<DatetimeA>(pd->offset).exists,
1945                               key);
1946                           break;
1947                       }
1948                       case MI_STRINGA:
1949                       {
1950                           dinst.AddStringA(
1951                               pd->name, 
1952                               sinst.GetField<StringA>(pd->offset).value,
1953                               !sinst.GetField<StringA>(pd->offset).exists,
1954 mike  1.1                     key);
1955                           break;
1956                       }
1957                       case MI_REFERENCEA:
1958                       case MI_INSTANCEA:
1959                       {
1960                           Array<DInstance> da;
1961                           const Array<Instance>& sa = 
1962                               sinst.GetField<InstanceA>(pd->offset).value;
1963           
1964                           for (Uint32 index = 0; index < sa.GetSize(); index++)
1965                           {
1966                               DInstance x;
1967           
1968                               if (!DInstance::StaticToDynamic( sa[index], keysOnly, x))
1969                                   return false;
1970           
1971                               da.PushBack(x);
1972                           }
1973           
1974                           dinst.AddInstanceA(
1975 mike  1.1                     pd->name, 
1976                               da,
1977                               !sinst.GetField<InstanceA>(pd->offset).exists,
1978                               key);
1979                           break;
1980                       }
1981                       default:
1982                           break;
1983                   }
1984               }
1985           
1986               return true;
1987           }
1988           
1989           MI_END_NAMESPACE

ViewCVS 0.9.2