1 mike 1.1.2.1 //%2006////////////////////////////////////////////////////////////////////////
2 //
3 // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
4 // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
5 // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
6 // IBM Corp.; EMC Corporation, The Open Group.
7 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
8 // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
9 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
10 // EMC Corporation; VERITAS Software Corporation; The Open Group.
11 // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
12 // EMC Corporation; Symantec Corporation; The Open Group.
13 //
14 // Permission is hereby granted, free of charge, to any person obtaining a copy
15 // of this software and associated documentation files (the "Software"), to
16 // deal in the Software without restriction, including without limitation the
17 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
18 // sell copies of the Software, and to permit persons to whom the Software is
19 // furnished to do so, subject to the following conditions:
20 //
21 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
22 mike 1.1.2.1 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
23 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
24 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
25 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
26 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
27 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 //
30 //==============================================================================
31 //
32 //%/////////////////////////////////////////////////////////////////////////////
33
34 #include <cstdarg>
35 #include <cassert>
36 #include "MetaRepository.h"
37 #include <Pegasus/Common/System.h>
|
38 mike 1.1.2.8 #include <Pegasus/Common/Once.h>
|
39 mike 1.1.2.7 #include "MetaTypes.h"
|
40 mike 1.1.2.1
41 PEGASUS_NAMESPACE_BEGIN
42
|
43 mike 1.1.2.8 typedef const MetaClass* ConstMetaClassPtr;
44 #define PEGASUS_ARRAY_T ConstMetaClassPtr
45 # include <Pegasus/Common/ArrayInter.h>
46 # include <Pegasus/Common/ArrayImpl.h>
47 #undef PEGASUS_ARRAY_T
48
|
49 mike 1.1.2.10 //
50 // Callback function and client data used to obtain namespaces from client.
51 //
52 static const MetaNameSpace* const* _nameSpaces;
|
53 mike 1.1.2.1
|
54 mike 1.1.2.11 static const size_t _MAX_FEATURES = 128;
55 static const size_t _MAX_QUALIFIERS = 128;
|
56 mike 1.1.2.1
|
57 mike 1.1.2.11 class ThrowContext
|
58 mike 1.1.2.5 {
|
59 mike 1.1.2.11 public:
|
60 mike 1.1.2.5
|
61 mike 1.1.2.11 PEGASUS_FORMAT(3, 4)
62 ThrowContext(CIMStatusCode code_, const char* format, ...) : code(code_)
63 {
64 char buffer[1024];
65 va_list ap;
66 va_start(ap, format);
67 vsprintf(buffer, format, ap);
68 va_end(ap);
69 msg = buffer;
70 }
71 CIMStatusCode code;
72 String msg;
73 };
74
75 #define Throw(ARGS) \
76 do \
77 { \
78 ThrowContext c ARGS; \
79 throw CIMException(c.code, c.msg); \
80 } \
81 while (0)
|
82 mike 1.1.2.5
83 static bool _eqi(const char* s1, const char* s2)
84 {
85 return System::strcasecmp(s1, s2) == 0;
86 }
87
|
88 mike 1.1.2.1 class Str
89 {
90 public:
91 Str(const String& s) : _cstr(s.getCString()) { }
92 Str(const CIMName& n) : _cstr(n.getString().getCString()) { }
93 Str(const CIMNamespaceName& n) : _cstr(n.getString().getCString()) { }
94 Str(const Exception& e) : _cstr(e.getMessage().getCString()) { }
95 Str(const CIMDateTime& x) : _cstr(x.toString().getCString()) { }
96 Str(const CIMObjectPath& x) : _cstr(x.toString().getCString()) { }
97 const char* operator*() const { return (const char*)_cstr; }
98 operator const char*() const { return (const char*)_cstr; }
99 private:
100 CString _cstr;
101 };
102
103 static const MetaNameSpace* _findNameSpace(const char* name)
104 {
|
105 mike 1.1.2.10 if (!_nameSpaces)
106 return 0;
107
108 for (const MetaNameSpace* const* p = _nameSpaces; *p; p++)
|
109 mike 1.1.2.1 {
|
110 mike 1.1.2.10 const MetaNameSpace* ns = *p;
111
112 if (_eqi(ns->name, name))
113 return ns;
|
114 mike 1.1.2.1 }
115
116 // Not found!
117 return 0;
118 }
119
120 static bool _isSubClass(const MetaClass* super, const MetaClass* sub)
121 {
122 if (!super)
123 return true;
124
125 for (MetaClass* p = sub->super; p; p = p->super)
126 {
127 if (p == super)
128 return true;
129 }
130
131 return false;
132 }
133
134 static inline bool _isDirectSubClass(
135 mike 1.1.2.1 const MetaClass* super,
136 const MetaClass* sub)
137 {
138 return sub->super == super;
139 }
140
|
141 mike 1.1.2.3 static char** _makePropertyList(const CIMPropertyList& propertyList)
142 {
143 if (propertyList.isNull())
144 return 0;
145
146 size_t size = propertyList.size();
147 char** pl = (char**)malloc(sizeof(char*) * (size + 1));
148
149 for (size_t i = 0; i < size; i++)
150 pl[i] = strdup(*Str(propertyList[i]));
151
152 pl[size] = 0;
153
154 return pl;
155 }
156
157 static void _freePropertyList(char** pl)
158 {
159 if (!pl)
160 return;
161
162 mike 1.1.2.3 for (size_t i = 0; pl[i]; i++)
163 {
164 free(pl[i]);
165 }
166
167 free(pl);
168 }
169
170 static void _printPropertyList(const char* const* pl)
171 {
172 if (!pl)
173 return;
174
175 for (size_t i = 0; pl[i]; i++)
176 printf("pl[%s]\n", pl[i]);
177 }
178
|
179 mike 1.1.2.8 static bool _contains(const Array<const MetaClass*>& x, const MetaClass* mc)
180 {
181 Uint32 n = x.size();
182 const MetaClass* const* p = x.getData();
183
184 while (n--)
185 {
186 if (*p++ == mc)
187 return true;
188 }
189
190 return false;
191 }
192
193 static void _associators(
194 const MetaNameSpace* ns,
195 const CIMName& className,
196 const CIMName& assocClass,
197 const CIMName& resultClass,
198 const String& role,
199 const String& resultRole,
200 mike 1.1.2.8 Array<const MetaClass*>& result)
201 {
202 // Lookup source class:
203
204 const MetaClass* mc = FindClass(ns, *Str(className));
205
206 if (!mc)
|
207 mike 1.1.2.11 Throw((CIM_ERR_NOT_FOUND, "unknown class: %s", *Str(className)));
|
208 mike 1.1.2.8
209
210 // Lookup result class (if any).
211
212 const MetaClass* rmc = 0;
213
214 if (!resultClass.isNull())
215 {
216 rmc = FindClass(ns, *Str(resultClass));
217
218 if (!rmc)
|
219 mike 1.1.2.11 Throw((CIM_ERR_NOT_FOUND, "unknown class: %s", *Str(resultClass)));
|
220 mike 1.1.2.8 }
221
222 // Convert these to UTF8 now to avoid doing so in loop below.
223
224 Str ac(assocClass);
225 Str r(role);
226 Str rr(resultRole);
227
228 // Process association classes:
229
230 for (size_t i = 0; ns->classes[i]; i++)
231 {
232 MetaClass* amc = ns->classes[i];
233
234 // Skip non-association classes:
235
236 if (!(amc->flags & META_FLAG_ASSOCIATION))
237 continue;
238
239 // Filter by assocClass parameter:
240
241 mike 1.1.2.8 if (!assocClass.isNull() && !_eqi(ac, amc->name))
242 continue;
243
244 // Process reference properties:
245
246 MetaFeatureInfo features[META_MAX_FEATURES];
247 size_t size = 0;
248 MergeFeatures(amc, false, META_FLAG_REFERENCE, features, size);
249
250 for (size_t j = 0; j < size; j++)
251 {
252 const MetaFeature* mf = features[j].mf;
253
254 // Skip non references:
255
256 if (!(mf->flags & META_FLAG_REFERENCE))
257 continue;
258
259 const MetaReference* mr = (const MetaReference*)mf;
260
261 // Filter by role parameter.
262 mike 1.1.2.8
263 if (role.size() && !_eqi(r, mf->name))
264 continue;
265
266 // Filter by source class:
267
268 if (!IsA(mr->ref, mc))
269 continue;
270
271 // Process result reference:
272
273 for (size_t k = 0; k < size; k++)
274 {
275 const MetaFeature* rmf = features[k].mf;
276
277 // Skip the feature under consideration:
278
279 if (rmf == mf)
280 continue;
281
282 // Skip non references:
283 mike 1.1.2.8
284 if (!(rmf->flags & META_FLAG_REFERENCE))
285 continue;
286
287 const MetaReference* rmr = (const MetaReference*)rmf;
288
289 // Filter by resultRole parameter.
290
291 if (resultRole.size() && !_eqi(rr, rmf->name))
292 continue;
293
294 // Skip references not of the result class kind:
295
296 if (rmc && !IsA(rmr->ref, rmc))
297 continue;
298
299 // ATTN: should we include entire class hierarchy under
300 // result class?
301
302 // If reached, then save this one.
303
304 mike 1.1.2.8 if (!_contains(result, rmr->ref))
305 result.append(rmr->ref);
306 }
307 }
308 }
309 }
310
311 static void _references(
312 const MetaNameSpace* ns,
313 const CIMName& className,
314 const CIMName& resultClass,
315 const String& role,
316 Array<const MetaClass*>& result)
317 {
318 // Lookup source class:
319
320 const MetaClass* mc = FindClass(ns, *Str(className));
321
322 if (!mc)
|
323 mike 1.1.2.11 Throw((CIM_ERR_NOT_FOUND, "unknown class: %s", *Str(className)));
|
324 mike 1.1.2.8
325 // Lookup result class (if any).
326
327 const MetaClass* rmc = 0;
328
329 if (!resultClass.isNull())
330 {
331 rmc = FindClass(ns, *Str(resultClass));
332
333 if (!rmc)
|
334 mike 1.1.2.11 Throw((CIM_ERR_NOT_FOUND, "unknown class: %s", *Str(resultClass)));
|
335 mike 1.1.2.8 }
336
337 // Convert these to UTF8 now to avoid doing so in loop below.
338
339 Str r(role);
340
341 // Process association classes:
342
343 for (size_t i = 0; ns->classes[i]; i++)
344 {
345 MetaClass* amc = ns->classes[i];
346
347 // Skip non-association classes:
348
349 if (!(amc->flags & META_FLAG_ASSOCIATION))
350 continue;
351
352 // Filter by result class:
353
354 if (rmc && !IsA(rmc, amc))
355 continue;
356 mike 1.1.2.8
357 // Process reference properties:
358
359 MetaFeatureInfo features[META_MAX_FEATURES];
360 size_t size = 0;
361 MergeFeatures(amc, false, META_FLAG_REFERENCE, features, size);
362
363 for (size_t j = 0; j < size; j++)
364 {
365 const MetaFeature* mf = features[j].mf;
366
367 // Skip non references:
368
369 if (!(mf->flags & META_FLAG_REFERENCE))
370 continue;
371
372 const MetaReference* mr = (const MetaReference*)mf;
373
374 // Filter by role parameter.
375
376 if (role.size() && !_eqi(r, mf->name))
377 mike 1.1.2.8 continue;
378
379 // Filter by source class:
380
381 if (!IsA(mr->ref, mc))
382 continue;
383
384 // Add this one to the output:
385
386 if (!_contains(result, amc))
387 result.append((MetaClass*)amc);
388 }
389 }
390 }
391
392 //==============================================================================
393 //
394 // _getHostName()
395 //
396 //==============================================================================
397
398 mike 1.1.2.8 static Once _once = PEGASUS_ONCE_INITIALIZER;
399 static const char* _hostName = 0;
400
401 static void _initHostName()
402 {
403 String hn = System::getHostName();
404 _hostName = strdup(*Str(hn));
405 }
406
407 static inline const char* _getHostName()
408 {
409 once(&_once, _initHostName);
410 return _hostName;
411 }
412
|
413 mike 1.1.2.1 //==============================================================================
414 //
415 // class MetaRepository
416 //
417 //==============================================================================
418
419 MetaRepository::MetaRepository()
420 {
421 }
422
423 MetaRepository::~MetaRepository()
424 {
425 }
426
427 CIMClass MetaRepository::getClass(
428 const CIMNamespaceName& nameSpace,
429 const CIMName& className,
430 Boolean localOnly,
431 Boolean includeQualifiers,
432 Boolean includeClassOrigin,
433 const CIMPropertyList& propertyList)
434 mike 1.1.2.1 {
|
435 mike 1.1.2.3 // Lookup namespace:
436
437 const MetaNameSpace* ns = _findNameSpace(*Str(nameSpace));
438
439 if (!ns)
|
440 mike 1.1.2.11 Throw((CIM_ERR_INVALID_NAMESPACE, "%s", *Str(nameSpace)));
|
441 mike 1.1.2.3
442 // Lookup class:
443
|
444 mike 1.1.2.8 const MetaClass* mc = FindClass(ns, *Str(className));
|
445 mike 1.1.2.3
446 if (!mc)
|
447 mike 1.1.2.11 {
448 Throw((CIM_ERR_NOT_FOUND, "unknown class: %s", *Str(className)));
449 }
|
450 mike 1.1.2.3
451 // Build property list:
452
453 char** pl = _makePropertyList(propertyList);
454
455 // Make class:
456
457 CIMClass cc;
458
|
459 mike 1.1.2.8 if (MakeClass(_getHostName(), ns, mc, localOnly, includeQualifiers,
460 includeClassOrigin, pl, cc) != 0)
|
461 mike 1.1.2.3 {
462 _freePropertyList(pl);
|
463 mike 1.1.2.11 Throw((CIM_ERR_FAILED, "conversion failed: %s", mc->name));
|
464 mike 1.1.2.3 }
465
466 _freePropertyList(pl);
467 return cc;
|
468 mike 1.1.2.1 }
469
470 Array<CIMClass> MetaRepository::enumerateClasses(
471 const CIMNamespaceName& nameSpace,
472 const CIMName& className,
473 Boolean deepInheritance,
474 Boolean localOnly,
475 Boolean includeQualifiers,
476 Boolean includeClassOrigin)
477 {
478 // Lookup namespace:
479
480 const MetaNameSpace* ns = _findNameSpace(*Str(nameSpace));
481
482 if (!ns)
|
483 mike 1.1.2.11 Throw((CIM_ERR_INVALID_NAMESPACE, "%s", *Str(nameSpace)));
|
484 mike 1.1.2.1
485 // Lookup class:
486
487 const MetaClass* super = 0;
488
489 if (!className.isNull())
490 {
|
491 mike 1.1.2.8 super = FindClass(ns, *Str(className));
|
492 mike 1.1.2.1
493 if (!super)
|
494 mike 1.1.2.11 Throw((CIM_ERR_NOT_FOUND, "unknown class: %s", *Str(className)));
|
495 mike 1.1.2.1 }
496
497 // Iterate all classes looking for matches:
498
499 Array<CIMClass> result;
500
501 for (size_t i = 0; ns->classes[i]; i++)
502 {
|
503 mike 1.1.2.3 MetaClass* mc = ns->classes[i];
|
504 mike 1.1.2.1
|
505 mike 1.1.2.3 bool flag = false;
|
506 mike 1.1.2.1
507 if (deepInheritance)
508 {
|
509 mike 1.1.2.3 if (_isSubClass(super, mc))
510 flag = true;
|
511 mike 1.1.2.1 }
512 else
513 {
|
514 mike 1.1.2.3 if (_isDirectSubClass(super, mc))
515 flag = true;
516 }
517
518 if (flag)
519 {
520 CIMClass cc;
|
521 mike 1.1.2.1
|
522 mike 1.1.2.8 if (MakeClass(_getHostName(), ns, mc, localOnly, includeQualifiers,
523 includeClassOrigin, 0, cc) != 0)
|
524 mike 1.1.2.3 {
|
525 mike 1.1.2.11 Throw((CIM_ERR_FAILED, "conversion failed: %s", mc->name));
|
526 mike 1.1.2.1 }
|
527 mike 1.1.2.8
528 result.append(cc);
|
529 mike 1.1.2.1 }
530 }
531
532 return result;
533 }
534
535 Array<CIMName> MetaRepository::enumerateClassNames(
536 const CIMNamespaceName& nameSpace,
537 const CIMName& className,
538 Boolean deepInheritance)
539 {
540 // Lookup namespace:
541
542 const MetaNameSpace* ns = _findNameSpace(*Str(nameSpace));
543
544 if (!ns)
|
545 mike 1.1.2.11 Throw((CIM_ERR_INVALID_NAMESPACE, "%s", *Str(nameSpace)));
|
546 mike 1.1.2.1
547 // Lookup class:
548
549 const MetaClass* super = 0;
550
551 if (!className.isNull())
552 {
|
553 mike 1.1.2.8 super = FindClass(ns, *Str(className));
|
554 mike 1.1.2.1
555 if (!super)
|
556 mike 1.1.2.11 Throw((CIM_ERR_NOT_FOUND, "unknown class: %s", *Str(className)));
|
557 mike 1.1.2.1 }
558
559 // Iterate all classes looking for matches:
560
561 Array<CIMName> result;
562
563 for (size_t i = 0; ns->classes[i]; i++)
564 {
|
565 mike 1.1.2.3 MetaClass* mc = ns->classes[i];
|
566 mike 1.1.2.1
567 if (deepInheritance)
568 {
|
569 mike 1.1.2.3 if (_isSubClass(super, mc))
570 result.append(mc->name);
|
571 mike 1.1.2.1 }
572 else
573 {
|
574 mike 1.1.2.3 if (_isDirectSubClass(super, mc))
575 result.append(mc->name);
|
576 mike 1.1.2.1 }
577 }
578
579 return result;
580 }
581
582 void MetaRepository::deleteClass(
583 const CIMNamespaceName& nameSpace,
584 const CIMName& className)
585 {
|
586 mike 1.1.2.11 Throw((CIM_ERR_NOT_SUPPORTED, "deleteClass()"));
|
587 mike 1.1.2.1 }
588
589 void MetaRepository::createClass(
590 const CIMNamespaceName& nameSpace,
591 const CIMClass& newClass)
592 {
|
593 mike 1.1.2.11 Throw((CIM_ERR_NOT_SUPPORTED, "createClass()"));
|
594 mike 1.1.2.1 }
595
596 void MetaRepository::modifyClass(
597 const CIMNamespaceName& nameSpace,
598 const CIMClass& newClass)
599 {
|
600 mike 1.1.2.11 Throw((CIM_ERR_NOT_SUPPORTED, "modifyClass()"));
|
601 mike 1.1.2.1 }
602
|
603 mike 1.1.2.4 void MetaRepository::getSubClassNames(
604 const CIMNamespaceName& nameSpace,
605 const CIMName& className,
606 Boolean deepInheritance,
607 Array<CIMName>& subClassNames)
608 {
609 subClassNames = MetaRepository::enumerateClassNames(
610 nameSpace, className, deepInheritance);
611 }
612
613 void MetaRepository::getSuperClassNames(
614 const CIMNamespaceName& nameSpace,
615 const CIMName& className,
616 Array<CIMName>& superClassNames)
617 {
618 superClassNames.clear();
619
620 // Lookup namespace:
621
622 const MetaNameSpace* ns = _findNameSpace(*Str(nameSpace));
623
624 mike 1.1.2.4 if (!ns)
|
625 mike 1.1.2.11 Throw((CIM_ERR_INVALID_NAMESPACE, "%s", *Str(nameSpace)));
|
626 mike 1.1.2.4
627 // Lookup class:
628
|
629 mike 1.1.2.8 const MetaClass* mc = FindClass(ns, *Str(className));
|
630 mike 1.1.2.4
631 if (!mc)
|
632 mike 1.1.2.11 Throw((CIM_ERR_NOT_FOUND, "unknown class: %s", *Str(className)));
|
633 mike 1.1.2.4
634 // Append superclass names:
635
636 for (const MetaClass* p = mc->super; p; p = p->super)
637 superClassNames.append(p->name);
638 }
639
640 void MetaRepository::createNameSpace(
641 const CIMNamespaceName& nameSpace,
642 const NameSpaceAttributes& attributes)
643 {
|
644 mike 1.1.2.11 Throw((CIM_ERR_NOT_SUPPORTED, "createNameSpace()"));
|
645 mike 1.1.2.4 }
646
647 void MetaRepository::modifyNameSpace(
648 const CIMNamespaceName& nameSpace,
649 const NameSpaceAttributes& attributes)
650 {
|
651 mike 1.1.2.11 Throw((CIM_ERR_NOT_SUPPORTED, "modifyNameSpace()"));
|
652 mike 1.1.2.4 }
653
654 Array<CIMNamespaceName> MetaRepository::enumerateNameSpaces()
655 {
|
656 mike 1.1.2.10 Array<CIMNamespaceName> result;
657
658 if (!_nameSpaces)
659 return Array<CIMNamespaceName>();
|
660 mike 1.1.2.4
|
661 mike 1.1.2.10 for (const MetaNameSpace* const* p = _nameSpaces; *p; p++)
662 {
663 const MetaNameSpace* ns = *p;
664 result.append(ns->name);
665 }
|
666 mike 1.1.2.4
|
667 mike 1.1.2.10 return result;
|
668 mike 1.1.2.4 }
669
670 void MetaRepository::deleteNameSpace(
671 const CIMNamespaceName& nameSpace)
672 {
|
673 mike 1.1.2.11 Throw((CIM_ERR_NOT_SUPPORTED, "deleteNameSpace()"));
|
674 mike 1.1.2.4 }
675
676 Boolean MetaRepository::getNameSpaceAttributes(
677 const CIMNamespaceName& nameSpace,
678 NameSpaceAttributes& attributes)
679 {
|
680 mike 1.1.2.11 Throw((CIM_ERR_NOT_SUPPORTED, "getNameSpaceAttributes()"));
|
681 mike 1.1.2.4
682 return false;
683 }
684
685 Boolean MetaRepository::isRemoteNameSpace(
686 const CIMNamespaceName& nameSpace,
687 String& remoteInfo)
688 {
689 return false;
690 }
691
692 CIMQualifierDecl MetaRepository::getQualifier(
693 const CIMNamespaceName& nameSpace,
694 const CIMName& qualifierName)
695 {
696 // Lookup namespace:
697
698 const MetaNameSpace* ns = _findNameSpace(*Str(nameSpace));
699
700 if (!ns)
|
701 mike 1.1.2.11 Throw((CIM_ERR_INVALID_NAMESPACE, "%s", *Str(nameSpace)));
|
702 mike 1.1.2.4
703 // Lookup qualifier:
704
|
705 mike 1.1.2.8 const MetaQualifierDecl* mqd = FindQualifierDecl(ns, *Str(qualifierName));
|
706 mike 1.1.2.4
707 if (!mqd)
|
708 mike 1.1.2.11 Throw((CIM_ERR_NOT_FOUND,
709 "unknown qualifier: %s", *Str(qualifierName)));
|
710 mike 1.1.2.4
711 // Make the qualifier declaration:
712
713 CIMQualifierDecl cqd;
714
|
715 mike 1.1.2.5 if (MakeQualifierDecl(ns, mqd, cqd) != 0)
|
716 mike 1.1.2.4 {
|
717 mike 1.1.2.11 Throw((CIM_ERR_FAILED, "conversion failed: %s", mqd->name));
|
718 mike 1.1.2.4 }
719
720 return cqd;
721 }
722
723 void MetaRepository::setQualifier(
724 const CIMNamespaceName& nameSpace,
725 const CIMQualifierDecl& qualifierDecl)
726 {
|
727 mike 1.1.2.11 Throw((CIM_ERR_NOT_SUPPORTED, "setQualifier()"));
|
728 mike 1.1.2.4
729 }
730
731 void MetaRepository::deleteQualifier(
732 const CIMNamespaceName& nameSpace,
733 const CIMName& qualifierName)
734 {
|
735 mike 1.1.2.11 Throw((CIM_ERR_NOT_SUPPORTED, "deleteQualifier()"));
|
736 mike 1.1.2.4 }
737
738 Array<CIMQualifierDecl> MetaRepository::enumerateQualifiers(
739 const CIMNamespaceName& nameSpace)
740 {
741 // Lookup namespace:
742
743 const MetaNameSpace* ns = _findNameSpace(*Str(nameSpace));
744
745 if (!ns)
|
746 mike 1.1.2.11 Throw((CIM_ERR_INVALID_NAMESPACE, "%s", *Str(nameSpace)));
|
747 mike 1.1.2.4
748 // Build the array of qualifier declarations:
749
750 Array<CIMQualifierDecl> result;
751
752 for (size_t i = 0; ns->qualifiers[i]; i++)
753 {
754 const MetaQualifierDecl* mqd = ns->qualifiers[i];
755 CIMQualifierDecl cqd;
756
|
757 mike 1.1.2.5 if (MakeQualifierDecl(ns, mqd, cqd) != 0)
|
758 mike 1.1.2.4 {
|
759 mike 1.1.2.11 Throw((CIM_ERR_FAILED, "conversion failed: %s", mqd->name));
|
760 mike 1.1.2.4 }
761
762 result.append(cqd);
763 }
764
765 return result;
766 }
767
|
768 mike 1.1.2.8 Array<CIMObjectPath> MetaRepository::associatorClassPaths(
769 const CIMNamespaceName& nameSpace,
770 const CIMName& className,
771 const CIMName& assocClass,
772 const CIMName& resultClass,
773 const String& role,
774 const String& resultRole)
775 {
776 // Lookup namespace:
777
778 const MetaNameSpace* ns = _findNameSpace(*Str(nameSpace));
779
780 if (!ns)
|
781 mike 1.1.2.11 Throw((CIM_ERR_INVALID_NAMESPACE, "%s", *Str(nameSpace)));
|
782 mike 1.1.2.8
783 // Get associator meta-classes:
784
785 Array<const MetaClass*> mcs;
786 _associators(ns, className, assocClass, resultClass, role, resultRole, mcs);
787
788 // Convert meta-classes to object names:
789
790 Array<CIMObjectPath> result;
791
792 for (Uint32 i = 0; i < mcs.size(); i++)
793 result.append(CIMObjectPath(_getHostName(), nameSpace, mcs[i]->name));
794
795 return result;
796 }
797
798 Array<CIMObject> MetaRepository::associatorClasses(
799 const CIMNamespaceName& nameSpace,
800 const CIMName& className,
801 const CIMName& assocClass,
802 const CIMName& resultClass,
803 mike 1.1.2.8 const String& role,
804 const String& resultRole,
805 Boolean includeQualifiers,
806 Boolean includeClassOrigin,
807 const CIMPropertyList& propertyList)
808 {
809 // Lookup namespace:
810
811 const MetaNameSpace* ns = _findNameSpace(*Str(nameSpace));
812
813 if (!ns)
|
814 mike 1.1.2.11 Throw((CIM_ERR_INVALID_NAMESPACE, "%s", *Str(nameSpace)));
|
815 mike 1.1.2.8
816 // Get associator meta-classes:
817
818 Array<const MetaClass*> mcs;
819 _associators(ns, className, assocClass, resultClass, role, resultRole, mcs);
820
821 // Convert meta-classes to classes.
822
823 Array<CIMObject> result;
824
825 char** pl = _makePropertyList(propertyList);
826
827 for (Uint32 i = 0; i < mcs.size(); i++)
828 {
829 const MetaClass* mc = mcs[i];
830 CIMClass cc;
831
832 if (MakeClass(_getHostName(), ns, mc, false, includeQualifiers,
833 includeClassOrigin, pl, cc) != 0)
834 {
835 _freePropertyList(pl);
|
836 mike 1.1.2.11 Throw((CIM_ERR_FAILED, "conversion failed: %s", mc->name));
|
837 mike 1.1.2.8 }
838
839 result.append(cc);
840 }
841
842 _freePropertyList(pl);
843 return result;
844 }
845
846 Array<CIMObject> MetaRepository::referenceClasses(
847 const CIMNamespaceName& nameSpace,
848 const CIMName& className,
849 const CIMName& resultClass,
850 const String& role,
851 Boolean includeQualifiers,
852 Boolean includeClassOrigin,
853 const CIMPropertyList& propertyList)
854 {
855 // Lookup namespace:
856
857 const MetaNameSpace* ns = _findNameSpace(*Str(nameSpace));
858 mike 1.1.2.8
859 if (!ns)
|
860 mike 1.1.2.11 Throw((CIM_ERR_INVALID_NAMESPACE, "%s", *Str(nameSpace)));
|
861 mike 1.1.2.8
862 // Get reference meta-classes:
863
864 Array<const MetaClass*> mcs;
865 _references(ns, className, resultClass, role, mcs);
866
867 // Convert meta-classes to classes.
868
869 Array<CIMObject> result;
870
871 char** pl = _makePropertyList(propertyList);
872
873 for (Uint32 i = 0; i < mcs.size(); i++)
874 {
875 const MetaClass* mc = mcs[i];
876 CIMClass cc;
877
878 if (MakeClass(_getHostName(), ns, mc, false, includeQualifiers,
879 includeClassOrigin, pl, cc) != 0)
880 {
881 _freePropertyList(pl);
|
882 mike 1.1.2.11 Throw((CIM_ERR_FAILED, "conversion failed: %s", mc->name));
|
883 mike 1.1.2.8 }
884
885 result.append(cc);
886 }
887
888 _freePropertyList(pl);
889 return result;
890 }
891
892 Array<CIMObjectPath> MetaRepository::referenceClassPaths(
893 const CIMNamespaceName& nameSpace,
894 const CIMName& className,
895 const CIMName& resultClass,
896 const String& role)
897 {
898 // Lookup namespace:
899
900 const MetaNameSpace* ns = _findNameSpace(*Str(nameSpace));
901
902 if (!ns)
|
903 mike 1.1.2.11 Throw((CIM_ERR_INVALID_NAMESPACE, "%s", *Str(nameSpace)));
|
904 mike 1.1.2.8
905 // Get reference meta-classes:
906
907 Array<const MetaClass*> mcs;
908 _references(ns, className, resultClass, role, mcs);
909
910 // Convert meta-classes to object paths.
911
912 Array<CIMObjectPath> result;
913
914 for (Uint32 i = 0; i < mcs.size(); i++)
915 result.append(CIMObjectPath(_getHostName(), nameSpace, mcs[i]->name));
916
917 return result;
918 }
919
|
920 mike 1.1.2.9 const MetaClass* MetaRepository::findMetaClass(
921 const char* nameSpace,
922 const char* className)
923 {
924 // Lookup namespace:
925
926 const MetaNameSpace* ns = _findNameSpace(nameSpace);
927
928 if (!ns)
929 return 0;
930
931 return FindClass(ns, className);
932 }
933
|
934 mike 1.1.2.10 void MetaRepository::installNameSpaces(const MetaNameSpace* const* nameSpaces)
935 {
936 _nameSpaces = nameSpaces;
937 }
938
|
939 mike 1.1.2.1 PEGASUS_NAMESPACE_END
|