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