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 #include <cstdio>
34 #include <cstdarg>
35 #include <cctype>
36 #include <Pegasus/Common/System.h>
37 #include <Pegasus/Repository/SourceTypes.h>
38 #include "cimmofSourceConsumer.h"
39
|
40 mike 1.1.2.3 #define PEGASUS_LLD "%" PEGASUS_64BIT_CONVERSION_WIDTH "d"
41 #define PEGASUS_LLU "%" PEGASUS_64BIT_CONVERSION_WIDTH "u"
42
|
43 mike 1.1.2.1 PEGASUS_USING_STD;
44
45 PEGASUS_NAMESPACE_BEGIN
46
47 //==============================================================================
48 //
49 // Local routines:
50 //
51 //==============================================================================
52
53 static size_t _indent = 0;
54
55 class Str
56 {
57 public:
58 Str(const String& s) : _cstr(s.getCString()) { }
59 Str(const CIMName& n) : _cstr(n.getString().getCString()) { }
60 Str(const CIMNamespaceName& n) : _cstr(n.getString().getCString()) { }
61 Str(const Exception& e) : _cstr(e.getMessage().getCString()) { }
62 Str(const CIMDateTime& x) : _cstr(x.toString().getCString()) { }
63 Str(const CIMObjectPath& x) : _cstr(x.toString().getCString()) { }
64 mike 1.1.2.1 const char* operator*() const { return (const char*)_cstr; }
65 operator const char*() const { return (const char*)_cstr; }
66 private:
67 CString _cstr;
68 };
69
70 static void _vout(FILE* os, const char* format, va_list ap)
71 {
72 for (size_t i = 0; i < _indent; i++)
73 fprintf(os, " ");
74
75 vfprintf(os, format, ap);
76 }
77
78 PEGASUS_FORMAT(2, 3)
79 static void _throw(CIMStatusCode code, const char* format, ...)
80 {
81 char buffer[4096];
82
83 va_list ap;
84 va_start(ap, format);
85 mike 1.1.2.1 vsprintf(buffer, format, ap);
86 va_end(ap);
87 throw CIMException(code, format);
88 }
89
90 static void _line(FILE* os)
91 {
92 fprintf(os, "//");
93
94 for (size_t i = 0; i < 78; i++)
95 fputc('=', os);
96
97 fputc('\n', os);
98 }
99
100 PEGASUS_FORMAT(2, 3)
101 static void _box(FILE* os, const char* format, ...)
102 {
103 _line(os);
104
105 fprintf(os, "//\n");
106 mike 1.1.2.1
107 fprintf(os, "// ");
108
109 va_list ap;
110 va_start(ap, format);
111 vfprintf(os, format, ap);
112 va_end(ap);
113
114 fputc('\n', os);
115 fprintf(os, "//\n");
116
117 _line(os);
118 }
119
|
120 mike 1.1.2.3 static void _writeHeaderFile(const String& ns)
|
121 mike 1.1.2.1 {
|
122 mike 1.1.2.3 const char format[] =
123 "#ifndef _%s_namespace_h\n"
124 "#define _%s_namespace_h\n"
|
125 mike 1.1.2.1 "\n"
126 "#include <Pegasus/Repository/SourceTypes.h>\n"
127 "\n"
128 "PEGASUS_NAMESPACE_BEGIN\n"
129 "\n"
|
130 mike 1.1.2.3 "extern const SourceNameSpace %s_namespace;\n"
|
131 mike 1.1.2.1 "\n"
132 "PEGASUS_NAMESPACE_END\n"
133 "\n"
|
134 mike 1.1.2.3 "#endif /* _%s_namespace_h */\n"
|
135 mike 1.1.2.1 ;
136
|
137 mike 1.1.2.3 String path = ns + "_namespace.h";
138 FILE* os = fopen(*Str(path), "wb");
|
139 mike 1.1.2.1
140 if (!os)
141 {
|
142 mike 1.1.2.3 fprintf(stderr, "cimmofl: failed to open \"%s\" for write\n",
143 *Str(path));
|
144 mike 1.1.2.1 exit(1);
145 }
146
|
147 mike 1.1.2.3 fprintf(os, format, *Str(ns), *Str(ns), *Str(ns), *Str(ns));
|
148 mike 1.1.2.1
149 fclose(os);
150 }
151
152 static String _makeIdent(const String& str)
153 {
154 // Build a legal C identifier from str. Translate all illegal characters
155 // to underscores.
156
157 String r;
158
159 for (Uint32 i = 0; i < str.size(); i++)
160 {
161 Uint16 c = str[i];
162
163 if (c < 127 && (isalnum(c) || c == '_'))
164 r.append(c);
165 else
166 r.append('_');
167 }
168
169 mike 1.1.2.1 return r;
170 }
171
172
173 static const char* _typeNames[] =
174 {
175 "CIMTYPE_BOOLEAN",
176 "CIMTYPE_UINT8",
177 "CIMTYPE_SINT8",
178 "CIMTYPE_UINT16",
179 "CIMTYPE_SINT16",
180 "CIMTYPE_UINT32",
181 "CIMTYPE_SINT32",
182 "CIMTYPE_UINT64",
183 "CIMTYPE_SINT64",
184 "CIMTYPE_REAL32",
185 "CIMTYPE_REAL64",
186 "CIMTYPE_CHAR16",
187 "CIMTYPE_STRING",
188 "CIMTYPE_DATETIME",
189 "CIMTYPE_REFERENCE",
190 mike 1.1.2.1 "CIMTYPE_OBJECT",
191 "CIMTYPE_INSTANCE",
192 };
193
|
194 mike 1.1.2.3 static bool _is_printable(const char* s)
195 {
196 for (; *s; s++)
197 {
198 if (!isprint(*s))
199 return false;
200 }
201
202 return true;
203 }
204
|
205 mike 1.1.2.1 template<class C>
206 static void _writeFlags(
207 FILE* os,
208 const C& c,
209 bool isProperty,
210 bool isParameter)
211 {
212 // Build up flags mask:
213
214 Uint32 flags = 0;
215
216 if (isProperty)
217 flags |= PEGASUS_FLAG_READ;
218
219 if (isParameter)
220 flags |= PEGASUS_FLAG_IN;
221
222 for (Uint32 i = 0; i < c.getQualifierCount(); i++)
223 {
224 CIMConstQualifier cq = c.getQualifier(i);
225 const CIMName& qn = cq.getName();
226 mike 1.1.2.1
227 if (cq.getType() != CIMTYPE_BOOLEAN || cq.isArray())
228 continue;
229
230 Boolean x;
231 cq.getValue().get(x);
232
233
234 if (System::strcasecmp(*Str(qn), "KEY") == 0)
235 {
236 if (x)
237 flags |= PEGASUS_FLAG_KEY;
238 else
239 flags &= ~PEGASUS_FLAG_KEY;
240 }
|
241 mike 1.1.2.3 else if (System::strcasecmp(*Str(qn), "IN") == 0)
|
242 mike 1.1.2.1 {
243 if (x)
244 flags |= PEGASUS_FLAG_IN;
245 else
246 flags &= ~PEGASUS_FLAG_IN;
247 }
|
248 mike 1.1.2.3 else if (System::strcasecmp(*Str(qn), "OUT") == 0)
|
249 mike 1.1.2.1 {
250 if (x)
251 flags |= PEGASUS_FLAG_OUT;
252 else
253 flags &= ~PEGASUS_FLAG_OUT;
254 }
|
255 mike 1.1.2.3 else if (System::strcasecmp(*Str(qn), "ABSTRACT") == 0)
|
256 mike 1.1.2.1 {
257 if (x)
258 flags |= PEGASUS_FLAG_ABSTRACT;
259 else
260 flags &= ~PEGASUS_FLAG_ABSTRACT;
261 }
|
262 mike 1.1.2.3 else if (System::strcasecmp(*Str(qn), "AGGREGATE") == 0)
|
263 mike 1.1.2.1 {
264 if (x)
265 flags |= PEGASUS_FLAG_AGGREGATE;
266 else
267 flags &= ~PEGASUS_FLAG_AGGREGATE;
268 }
|
269 mike 1.1.2.3 else if (System::strcasecmp(*Str(qn), "AGGREGATION") == 0)
|
270 mike 1.1.2.1 {
271 if (x)
272 flags |= PEGASUS_FLAG_AGGREGATION;
273 else
274 flags &= ~PEGASUS_FLAG_AGGREGATION;
275 }
|
276 mike 1.1.2.3 else if (System::strcasecmp(*Str(qn), "COUNTER") == 0)
|
277 mike 1.1.2.1 {
278 if (x)
279 flags |= PEGASUS_FLAG_COUNTER;
280 else
281 flags &= ~PEGASUS_FLAG_COUNTER;
282 }
|
283 mike 1.1.2.3 else if (System::strcasecmp(*Str(qn), "DELETE") == 0)
|
284 mike 1.1.2.1 {
285 if (x)
286 flags |= PEGASUS_FLAG_DELETE;
287 else
288 flags &= ~PEGASUS_FLAG_DELETE;
289 }
|
290 mike 1.1.2.3 else if (System::strcasecmp(*Str(qn), "DN") == 0)
|
291 mike 1.1.2.1 {
292 if (x)
293 flags |= PEGASUS_FLAG_DN;
294 else
295 flags &= ~PEGASUS_FLAG_DN;
296 }
|
297 mike 1.1.2.3 else if (System::strcasecmp(*Str(qn), "EMBEDDEDOBJECT") == 0)
|
298 mike 1.1.2.1 {
299 if (x)
300 flags |= PEGASUS_FLAG_EMBEDDEDOBJECT;
301 else
302 flags &= ~PEGASUS_FLAG_EMBEDDEDOBJECT;
303 }
|
304 mike 1.1.2.3 else if (System::strcasecmp(*Str(qn), "EXPENSIVE") == 0)
|
305 mike 1.1.2.1 {
306 if (x)
307 flags |= PEGASUS_FLAG_EXPENSIVE;
308 else
309 flags &= ~PEGASUS_FLAG_EXPENSIVE;
310 }
|
311 mike 1.1.2.3 else if (System::strcasecmp(*Str(qn), "EXPERIMENTAL") == 0)
|
312 mike 1.1.2.1 {
313 if (x)
314 flags |= PEGASUS_FLAG_EXPERIMENTAL;
315 else
316 flags &= ~PEGASUS_FLAG_EXPERIMENTAL;
317 }
|
318 mike 1.1.2.3 else if (System::strcasecmp(*Str(qn), "GAUGE") == 0)
|
319 mike 1.1.2.1 {
320 if (x)
321 flags |= PEGASUS_FLAG_GAUGE;
322 else
323 flags &= ~PEGASUS_FLAG_GAUGE;
324 }
|
325 mike 1.1.2.3 else if (System::strcasecmp(*Str(qn), "IFDELETED") == 0)
|
326 mike 1.1.2.1 {
327 if (x)
328 flags |= PEGASUS_FLAG_IFDELETED;
329 else
330 flags &= ~PEGASUS_FLAG_IFDELETED;
331 }
|
332 mike 1.1.2.3 else if (System::strcasecmp(*Str(qn), "INVISIBLE") == 0)
|
333 mike 1.1.2.1 {
334 if (x)
335 flags |= PEGASUS_FLAG_INVISIBLE;
336 else
337 flags &= ~PEGASUS_FLAG_INVISIBLE;
338 }
|
339 mike 1.1.2.3 else if (System::strcasecmp(*Str(qn), "LARGE") == 0)
|
340 mike 1.1.2.1 {
341 if (x)
342 flags |= PEGASUS_FLAG_LARGE;
343 else
344 flags &= ~PEGASUS_FLAG_LARGE;
345 }
|
346 mike 1.1.2.3 else if (System::strcasecmp(*Str(qn), "OCTETSTRING") == 0)
|
347 mike 1.1.2.1 {
348 if (x)
349 flags |= PEGASUS_FLAG_OCTETSTRING;
350 else
351 flags &= ~PEGASUS_FLAG_OCTETSTRING;
352 }
|
353 mike 1.1.2.3 else if (System::strcasecmp(*Str(qn), "READ") == 0)
|
354 mike 1.1.2.1 {
355 if (x)
356 flags |= PEGASUS_FLAG_READ;
357 else
358 flags &= ~PEGASUS_FLAG_READ;
359 }
|
360 mike 1.1.2.3 else if (System::strcasecmp(*Str(qn), "REQUIRED") == 0)
|
361 mike 1.1.2.1 {
362 if (x)
363 flags |= PEGASUS_FLAG_REQUIRED;
364 else
365 flags &= ~PEGASUS_FLAG_REQUIRED;
366 }
|
367 mike 1.1.2.3 else if (System::strcasecmp(*Str(qn), "STATIC") == 0)
|
368 mike 1.1.2.1 {
369 if (x)
370 flags |= PEGASUS_FLAG_STATIC;
371 else
372 flags &= ~PEGASUS_FLAG_STATIC;
373 }
|
374 mike 1.1.2.3 else if (System::strcasecmp(*Str(qn), "TERMINAL") == 0)
|
375 mike 1.1.2.1 {
376 if (x)
377 flags |= PEGASUS_FLAG_TERMINAL;
378 else
379 flags &= ~PEGASUS_FLAG_TERMINAL;
380 }
|
381 mike 1.1.2.3 else if (System::strcasecmp(*Str(qn), "WEAK") == 0)
|
382 mike 1.1.2.1 {
383 if (x)
384 flags |= PEGASUS_FLAG_WEAK;
385 else
386 flags &= ~PEGASUS_FLAG_WEAK;
387 }
|
388 mike 1.1.2.3 else if (System::strcasecmp(*Str(qn), "WRITE") == 0)
|
389 mike 1.1.2.1 {
390 if (x)
391 flags |= PEGASUS_FLAG_WRITE;
392 else
393 flags &= ~PEGASUS_FLAG_WRITE;
394 }
|
395 mike 1.1.2.3 else
396 {
397 // ATTN: Composition qualifier not handled (no more room in mask).
398 }
|
399 mike 1.1.2.1 }
400
401 // Write flags mask:
402
403 if (flags & PEGASUS_FLAG_KEY)
404 fprintf(os, "|PEGASUS_FLAG_KEY");
405 if (flags && (flags & PEGASUS_FLAG_IN))
406 fprintf(os, "|PEGASUS_FLAG_IN");
407 if (flags && (flags & PEGASUS_FLAG_OUT))
408 fprintf(os, "|PEGASUS_FLAG_OUT");
409 if (flags & PEGASUS_FLAG_ABSTRACT)
410 fprintf(os, "|PEGASUS_FLAG_ABSTRACT");
411 if (flags & PEGASUS_FLAG_AGGREGATE)
412 fprintf(os, "|PEGASUS_FLAG_AGGREGATE");
413 if (flags & PEGASUS_FLAG_AGGREGATION)
414 fprintf(os, "|PEGASUS_FLAG_AGGREGATION");
415 if (flags & PEGASUS_FLAG_COUNTER)
416 fprintf(os, "|PEGASUS_FLAG_COUNTER");
417 if (flags & PEGASUS_FLAG_DELETE)
418 fprintf(os, "|PEGASUS_FLAG_DELETE");
419 if (flags & PEGASUS_FLAG_DN)
420 mike 1.1.2.1 fprintf(os, "|PEGASUS_FLAG_DN");
421 if (flags & PEGASUS_FLAG_EMBEDDEDOBJECT)
422 fprintf(os, "|PEGASUS_FLAG_EMBEDDEDOBJECT");
423 if (flags & PEGASUS_FLAG_EXPENSIVE)
424 fprintf(os, "|PEGASUS_FLAG_EXPENSIVE");
425 if (flags & PEGASUS_FLAG_EXPERIMENTAL)
426 fprintf(os, "|PEGASUS_FLAG_EXPERIMENTAL");
427 if (flags & PEGASUS_FLAG_GAUGE)
428 fprintf(os, "|PEGASUS_FLAG_GAUGE");
429 if (flags & PEGASUS_FLAG_IFDELETED)
430 fprintf(os, "|PEGASUS_FLAG_IFDELETED");
431 if (flags & PEGASUS_FLAG_INVISIBLE)
432 fprintf(os, "|PEGASUS_FLAG_INVISIBLE");
433 if (flags & PEGASUS_FLAG_LARGE)
434 fprintf(os, "|PEGASUS_FLAG_LARGE");
435 if (flags & PEGASUS_FLAG_OCTETSTRING)
436 fprintf(os, "|PEGASUS_FLAG_OCTETSTRING");
437 if (flags & PEGASUS_FLAG_READ)
438 fprintf(os, "|PEGASUS_FLAG_READ");
439 if (flags & PEGASUS_FLAG_REQUIRED)
440 fprintf(os, "|PEGASUS_FLAG_REQUIRED");
441 mike 1.1.2.1 if (flags & PEGASUS_FLAG_STATIC)
442 fprintf(os, "|PEGASUS_FLAG_STATIC");
443 if (flags & PEGASUS_FLAG_TERMINAL)
444 fprintf(os, "|PEGASUS_FLAG_TERMINAL");
445 if (flags & PEGASUS_FLAG_WEAK)
446 fprintf(os, "|PEGASUS_FLAG_WEAK");
447 if (flags & PEGASUS_FLAG_WRITE)
448 fprintf(os, "|PEGASUS_FLAG_WRITE");
449 }
450
|
451 mike 1.1.2.5 static bool _testBooleanQualifier(const CIMClass& cc, const CIMName& name)
|
452 mike 1.1.2.3 {
|
453 mike 1.1.2.5 Uint32 pos = cc.findQualifier(name);
|
454 mike 1.1.2.3
|
455 mike 1.1.2.5 if (pos == PEG_NOT_FOUND)
456 return false;
|
457 mike 1.1.2.3
|
458 mike 1.1.2.5 CIMConstQualifier cq = cc.getQualifier(pos);
|
459 mike 1.1.2.3
|
460 mike 1.1.2.5 if (cq.getType() != CIMTYPE_BOOLEAN || cq.isArray())
461 return false;
|
462 mike 1.1.2.3
|
463 mike 1.1.2.5 Boolean x;
464 cq.getValue().get(x);
465 return x;
|
466 mike 1.1.2.3 }
467
|
468 mike 1.1.2.5 static void _writeBoolean(FILE* os, Boolean x)
|
469 mike 1.1.2.3 {
|
470 mike 1.1.2.5 fprintf(os, "\\%03o", (int)x);
|
471 mike 1.1.2.4 }
472
|
473 mike 1.1.2.5 static void _writeUint8(FILE* os, Uint8 x)
|
474 mike 1.1.2.4 {
|
475 mike 1.1.2.5 fprintf(os, "\\%03o", (int)x);
476 }
|
477 mike 1.1.2.4
|
478 mike 1.1.2.5 static void _writeSint8(FILE* os, Sint8 x)
479 {
480 _writeUint8(os, Uint8(x));
481 }
|
482 mike 1.1.2.4
|
483 mike 1.1.2.5 static void _writeUint16(FILE* os, Uint16 x)
484 {
485 Uint16 x0 = (x >> 8) & 0x00FF;
486 Uint16 x1 = (x >> 0) & 0x00FF;
487 fprintf(os, "\\%03o", (int)x0);
488 fprintf(os, "\\%03o", (int)x1);
489 }
|
490 mike 1.1.2.4
|
491 mike 1.1.2.5 static void _writeSint16(FILE* os, Sint16 x)
492 {
493 _writeUint16(os, Uint16(x));
494 }
|
495 mike 1.1.2.4
|
496 mike 1.1.2.5 static void _writeUint32(FILE* os, Uint32 x)
497 {
498 Uint32 x0 = (x >> 24) & 0x000000FF;
499 Uint32 x1 = (x >> 16) & 0x000000FF;
500 Uint32 x2 = (x >> 8) & 0x000000FF;
501 Uint32 x3 = (x >> 0) & 0x000000FF;
502 fprintf(os, "\\%03o", (int)x0);
503 fprintf(os, "\\%03o", (int)x1);
504 fprintf(os, "\\%03o", (int)x2);
505 fprintf(os, "\\%03o", (int)x3);
506 }
|
507 mike 1.1.2.4
|
508 mike 1.1.2.5 static void _writeSint32(FILE* os, Sint32 x)
509 {
510 _writeUint32(os, Uint32(x));
511 }
|
512 mike 1.1.2.4
|
513 mike 1.1.2.5 static void _writeUint64(FILE* os, Uint64 x)
514 {
515 Uint64 x0 = (x >> 56) & 0x000000FF;
516 Uint64 x1 = (x >> 48) & 0x000000FF;
517 Uint64 x2 = (x >> 40) & 0x000000FF;
518 Uint64 x3 = (x >> 32) & 0x000000FF;
519 Uint64 x4 = (x >> 24) & 0x000000FF;
520 Uint64 x5 = (x >> 16) & 0x000000FF;
521 Uint64 x6 = (x >> 8) & 0x000000FF;
522 Uint64 x7 = (x >> 0) & 0x000000FF;
523 fprintf(os, "\\%03o", (int)x0);
524 fprintf(os, "\\%03o", (int)x1);
525 fprintf(os, "\\%03o", (int)x2);
526 fprintf(os, "\\%03o", (int)x3);
527 fprintf(os, "\\%03o", (int)x4);
528 fprintf(os, "\\%03o", (int)x5);
529 fprintf(os, "\\%03o", (int)x6);
530 fprintf(os, "\\%03o", (int)x7);
531 }
|
532 mike 1.1.2.4
|
533 mike 1.1.2.5 static void _writeSint64(FILE* os, Sint64 x)
534 {
535 _writeUint64(os, Uint64(x));
536 }
|
537 mike 1.1.2.4
|
538 mike 1.1.2.5 static void _writeReal32(FILE* os, Real32 x)
539 {
540 _writeUint32(os, *((Uint32*)&x));
541 }
|
542 mike 1.1.2.4
|
543 mike 1.1.2.5 static void _writeReal64(FILE* os, Real64 x)
544 {
545 _writeUint64(os, *((Uint64*)&x));
546 }
|
547 mike 1.1.2.4
|
548 mike 1.1.2.5 static void _writeChar16(FILE* os, const Char16& x)
549 {
550 _writeUint16(os, x);
551 }
|
552 mike 1.1.2.4
|
553 mike 1.1.2.5 static void _writeString(FILE* os, const char* s)
554 {
555 size_t n = strlen(s);
|
556 mike 1.1.2.4
|
557 mike 1.1.2.5 for (size_t i = 0; i < n; i++)
|
558 mike 1.1.2.4 {
|
559 mike 1.1.2.5 char c = s[i];
560
561 if (isprint(c) && c != '"')
562 fprintf(os, "%c", c);
|
563 mike 1.1.2.4 else
|
564 mike 1.1.2.5 fprintf(os, "\\%03o", c);
|
565 mike 1.1.2.3 }
566 }
567
|
568 mike 1.1.2.5 static void _writeString(FILE* os, const String& x)
|
569 mike 1.1.2.3 {
|
570 mike 1.1.2.5 _writeString(os, *Str(x));
571 }
|
572 mike 1.1.2.4
|
573 mike 1.1.2.5 static void _writeDateTime(FILE* os, const CIMDateTime& x)
574 {
575 _writeString(os, x.toString());
576 }
|
577 mike 1.1.2.3
|
578 mike 1.1.2.5 static int _writeValue(FILE* os, const CIMValue& cv, bool quote)
579 {
|
580 mike 1.1.2.3 if (cv.isNull())
581 {
|
582 mike 1.1.2.5 fprintf(os, "0");
583 return 0;
584 }
585
586 if (quote)
587 fputc('"', os);
|
588 mike 1.1.2.3
589 if (cv.isArray())
590 {
591 switch (cv.getType())
592 {
593 case CIMTYPE_BOOLEAN:
594 {
595 Array<Boolean> x;
596 cv.get(x);
597
|
598 mike 1.1.2.5 _writeUint16(os, x.size());
|
599 mike 1.1.2.3
|
600 mike 1.1.2.5 for (Uint32 i = 0; i < x.size(); i++)
601 _writeBoolean(os, x[i]);
|
602 mike 1.1.2.3 break;
603 }
604
605 case CIMTYPE_UINT8:
606 {
607 Array<Uint8> x;
608 cv.get(x);
609
|
610 mike 1.1.2.5 _writeUint16(os, x.size());
|
611 mike 1.1.2.3
|
612 mike 1.1.2.5 for (Uint32 i = 0; i < x.size(); i++)
613 _writeUint8(os, x[i]);
|
614 mike 1.1.2.3 break;
615 }
616
617 case CIMTYPE_SINT8:
618 {
619 Array<Sint8> x;
620 cv.get(x);
621
|
622 mike 1.1.2.5 _writeUint16(os, x.size());
|
623 mike 1.1.2.3
|
624 mike 1.1.2.5 for (Uint32 i = 0; i < x.size(); i++)
625 _writeSint8(os, x[i]);
|
626 mike 1.1.2.3 break;
627 }
628
629 case CIMTYPE_UINT16:
630 {
631 Array<Uint16> x;
632 cv.get(x);
633
|
634 mike 1.1.2.5 _writeUint16(os, x.size());
|
635 mike 1.1.2.3
|
636 mike 1.1.2.5 for (Uint32 i = 0; i < x.size(); i++)
637 _writeUint16(os, x[i]);
|
638 mike 1.1.2.3 break;
639 }
640
641 case CIMTYPE_SINT16:
642 {
643 Array<Sint16> x;
644 cv.get(x);
645
|
646 mike 1.1.2.5 _writeUint16(os, x.size());
|
647 mike 1.1.2.3
|
648 mike 1.1.2.5 for (Uint32 i = 0; i < x.size(); i++)
649 _writeSint16(os, x[i]);
|
650 mike 1.1.2.3 break;
651 }
652
653 case CIMTYPE_UINT32:
654 {
655 Array<Uint32> x;
656 cv.get(x);
657
|
658 mike 1.1.2.5 _writeUint16(os, x.size());
|
659 mike 1.1.2.3
|
660 mike 1.1.2.5 for (Uint32 i = 0; i < x.size(); i++)
661 _writeUint32(os, x[i]);
|
662 mike 1.1.2.3 break;
663 }
664
665 case CIMTYPE_SINT32:
666 {
667 Array<Sint32> x;
668 cv.get(x);
669
|
670 mike 1.1.2.5 _writeUint16(os, x.size());
|
671 mike 1.1.2.3
|
672 mike 1.1.2.5 for (Uint32 i = 0; i < x.size(); i++)
673 _writeSint32(os, x[i]);
|
674 mike 1.1.2.3 break;
675 }
676
677 case CIMTYPE_UINT64:
678 {
679 Array<Uint64> x;
680 cv.get(x);
681
|
682 mike 1.1.2.5 _writeUint16(os, x.size());
|
683 mike 1.1.2.3
|
684 mike 1.1.2.5 for (Uint32 i = 0; i < x.size(); i++)
685 _writeUint64(os, x[i]);
|
686 mike 1.1.2.3 break;
687 }
688
689 case CIMTYPE_SINT64:
690 {
691 Array<Sint64> x;
692 cv.get(x);
693
|
694 mike 1.1.2.5 _writeUint16(os, x.size());
|
695 mike 1.1.2.3
|
696 mike 1.1.2.5 for (Uint32 i = 0; i < x.size(); i++)
697 _writeSint64(os, x[i]);
|
698 mike 1.1.2.3 break;
699 }
700
701 case CIMTYPE_REAL32:
702 {
703 Array<Real32> x;
704 cv.get(x);
705
|
706 mike 1.1.2.5 _writeUint16(os, x.size());
|
707 mike 1.1.2.3
|
708 mike 1.1.2.5 for (Uint32 i = 0; i < x.size(); i++)
709 _writeReal32(os, x[i]);
|
710 mike 1.1.2.3 break;
711 }
712
713 case CIMTYPE_REAL64:
714 {
715 Array<Real64> x;
716 cv.get(x);
717
|
718 mike 1.1.2.5 _writeUint16(os, x.size());
|
719 mike 1.1.2.3
|
720 mike 1.1.2.5 for (Uint32 i = 0; i < x.size(); i++)
721 _writeReal64(os, x[i]);
|
722 mike 1.1.2.3 break;
723 }
724
725 case CIMTYPE_CHAR16:
726 {
727 Array<Char16> x;
728 cv.get(x);
729
|
730 mike 1.1.2.5 _writeUint16(os, x.size());
|
731 mike 1.1.2.3
|
732 mike 1.1.2.5 for (Uint32 i = 0; i < x.size(); i++)
733 _writeChar16(os, x[i]);
|
734 mike 1.1.2.3 break;
735 }
736
737 case CIMTYPE_STRING:
738 {
739 Array<String> x;
740 cv.get(x);
741
|
742 mike 1.1.2.5 _writeUint16(os, x.size());
743
744 for (Uint32 i = 0; i < x.size(); i++)
|
745 mike 1.1.2.3 {
|
746 mike 1.1.2.5 _writeString(os, x[i]);
747 _writeUint8(os, 0);
|
748 mike 1.1.2.3 }
|
749 mike 1.1.2.5 break;
750 }
751
752 case CIMTYPE_DATETIME:
753 {
754 Array<CIMDateTime> x;
755 cv.get(x);
|
756 mike 1.1.2.3
|
757 mike 1.1.2.5 _writeUint16(os, x.size());
758
759 for (Uint32 i = 0; i < x.size(); i++)
760 _writeDateTime(os, x[i]);
|
761 mike 1.1.2.3 break;
762 }
763
764 default:
|
765 mike 1.1.2.5 return -1;
|
766 mike 1.1.2.3 }
767 }
768 else
769 {
770 switch (cv.getType())
771 {
772 case CIMTYPE_BOOLEAN:
773 {
|
774 mike 1.1.2.5 Boolean x;
|
775 mike 1.1.2.3 cv.get(x);
|
776 mike 1.1.2.5 _writeBoolean(os, x);
|
777 mike 1.1.2.3 break;
778 }
779
780 case CIMTYPE_UINT8:
781 {
782 Uint8 x;
783 cv.get(x);
|
784 mike 1.1.2.5 _writeUint8(os, x);
|
785 mike 1.1.2.3 break;
786 }
787
788 case CIMTYPE_SINT8:
789 {
790 Sint8 x;
791 cv.get(x);
|
792 mike 1.1.2.5 _writeSint8(os, x);
|
793 mike 1.1.2.3 break;
794 }
795
796 case CIMTYPE_UINT16:
797 {
798 Uint16 x;
799 cv.get(x);
|
800 mike 1.1.2.5 _writeUint16(os, x);
|
801 mike 1.1.2.3 break;
802 }
803
804 case CIMTYPE_SINT16:
805 {
806 Sint16 x;
807 cv.get(x);
|
808 mike 1.1.2.5 _writeSint16(os, x);
|
809 mike 1.1.2.3 break;
810 }
811
812 case CIMTYPE_UINT32:
813 {
814 Uint32 x;
815 cv.get(x);
|
816 mike 1.1.2.5 _writeUint32(os, x);
|
817 mike 1.1.2.3 break;
818 }
819
820 case CIMTYPE_SINT32:
821 {
822 Sint32 x;
823 cv.get(x);
|
824 mike 1.1.2.5 _writeSint32(os, x);
|
825 mike 1.1.2.3 break;
826 }
827
828 case CIMTYPE_UINT64:
829 {
830 Uint64 x;
831 cv.get(x);
|
832 mike 1.1.2.5 _writeUint64(os, x);
|
833 mike 1.1.2.3 break;
834 }
835
836 case CIMTYPE_SINT64:
837 {
838 Sint64 x;
839 cv.get(x);
|
840 mike 1.1.2.5 _writeSint64(os, x);
|
841 mike 1.1.2.3 break;
842 }
843
844 case CIMTYPE_REAL32:
845 {
846 Real32 x;
847 cv.get(x);
|
848 mike 1.1.2.5 _writeReal32(os, x);
|
849 mike 1.1.2.3 break;
850 }
851
852 case CIMTYPE_REAL64:
853 {
854 Real64 x;
855 cv.get(x);
|
856 mike 1.1.2.5 _writeReal64(os, x);
|
857 mike 1.1.2.3 break;
858 }
859
860 case CIMTYPE_CHAR16:
861 {
862 Char16 x;
863 cv.get(x);
|
864 mike 1.1.2.5 _writeChar16(os, x);
|
865 mike 1.1.2.3 break;
866 }
867
868 case CIMTYPE_STRING:
869 {
870 String x;
871 cv.get(x);
|
872 mike 1.1.2.5 _writeString(os, x);
|
873 mike 1.1.2.3 break;
874 }
875
|
876 mike 1.1.2.5 case CIMTYPE_DATETIME:
|
877 mike 1.1.2.3 {
|
878 mike 1.1.2.5 CIMDateTime x;
879 cv.get(x);
880 _writeDateTime(os, x);
|
881 mike 1.1.2.3 break;
882 }
|
883 mike 1.1.2.5
884 default:
885 return -1;
|
886 mike 1.1.2.3 }
887 }
888
|
889 mike 1.1.2.5 if (quote)
890 fputc('"', os);
891
892 return 0;
893 }
894
895 //==============================================================================
896 //
897 // cimmofSourceConsumer
898 //
899 //==============================================================================
900
901 cimmofSourceConsumer::cimmofSourceConsumer(bool discard) :
902 _discard(discard), _os(0)
903 {
904 }
905
906 cimmofSourceConsumer::~cimmofSourceConsumer()
907 {
908 }
909
910 mike 1.1.2.5 void cimmofSourceConsumer::addClass(
911 const CIMNamespaceName& nameSpace,
912 CIMClass& cimClass)
913 {
914 if (_findClass(cimClass.getClassName()) != PEG_NOT_FOUND)
915 {
916 _throw(CIM_ERR_ALREADY_EXISTS, "class already defined: %s:%s",
917 *Str(nameSpace), *Str(cimClass.getClassName()));
918 }
919
920 _classes.append(cimClass);
921 }
922
923 void cimmofSourceConsumer::addQualifier(
924 const CIMNamespaceName& nameSpace,
925 CIMQualifierDecl& cimQualifierDecl)
926 {
927 if (_findQualifier(cimQualifierDecl.getName()) != PEG_NOT_FOUND)
928 {
929 _throw(CIM_ERR_ALREADY_EXISTS, "qualifier already defined: %s:%s",
930 *Str(nameSpace), *Str(cimQualifierDecl.getName()));
931 mike 1.1.2.5 }
932
933 _qualifiers.append(cimQualifierDecl);
934 }
935
936 void cimmofSourceConsumer::addInstance(
937 const CIMNamespaceName& nameSpace,
938 CIMInstance& instance)
939 {
940 // Ignore all instances!
941 }
942
943 CIMQualifierDecl cimmofSourceConsumer::getQualifierDecl(
944 const CIMNamespaceName& nameSpace,
945 const CIMName& qualifierName)
946 {
947 Uint32 pos = _findQualifier(qualifierName);
948
949 if (pos == PEG_NOT_FOUND)
950 {
951 _throw(CIM_ERR_NOT_FOUND,
952 mike 1.1.2.5 "undefined qualifier: %s:%s", *Str(nameSpace), *Str(qualifierName));
953 }
954
955 return _qualifiers[pos];
956 }
957
958 CIMClass cimmofSourceConsumer::getClass(
959 const CIMNamespaceName& nameSpace,
960 const CIMName& className)
961 {
962 Uint32 pos = _findClass(className);
963
964 if (pos == PEG_NOT_FOUND)
965 {
966 _throw(CIM_ERR_NOT_FOUND,
967 "undefined class: %s:%s", *Str(nameSpace), *Str(className));
968 }
969
970 return _classes[pos];
971 }
972
973 mike 1.1.2.5 void cimmofSourceConsumer::modifyClass(
974 const CIMNamespaceName& nameSpace,
975 CIMClass& cimClass)
976 {
977 Uint32 pos = _findClass(cimClass.getClassName());
978
979 if (pos == PEG_NOT_FOUND)
980 {
981 _throw(CIM_ERR_NOT_FOUND, "undefined class: %s:%s",
982 *Str(nameSpace), *Str(cimClass.getClassName()));
983 }
984
985 _classes[pos] = cimClass;
986 }
987
988 void cimmofSourceConsumer::createNameSpace(
989 const CIMNamespaceName& nameSpace)
990 {
991 if (_nameSpace == nameSpace)
992 {
993 _throw(CIM_ERR_ALREADY_EXISTS, "namespace already exists: %s",
994 mike 1.1.2.5 *Str(nameSpace));
995 }
996
997 if (!_nameSpace.isNull())
998 {
999 _throw(CIM_ERR_FAILED, "cannot create more than one namespace");
1000 }
1001
1002 _nameSpace = nameSpace;
1003 }
1004
1005 void cimmofSourceConsumer::start()
1006 {
1007 }
1008
1009 void cimmofSourceConsumer::finish()
1010 {
1011 String ns = _makeIdent(_nameSpace.getString());
1012
1013 // Write header file:
1014
1015 mike 1.1.2.5 _writeHeaderFile(ns);
1016
1017 // Open source file:
1018
1019 String path = ns + "_namespace.cpp";
1020 _os = fopen(*Str(path), "wb");
1021
1022 if (!_os)
1023 {
1024 fprintf(stderr, "cimmofl: failed to open \"%s\" for write\n",
1025 *Str(path));
1026 exit(1);
1027 }
1028
1029 // Write prologue:
1030
1031 _writeSourcePrologue();
1032
1033 // Write namespace:
1034
1035 _writeNameSpace(_nameSpace);
1036 mike 1.1.2.5
1037 // Write epilogue:
1038
1039 _writeSourceEpilogue();
1040
1041 // Close file:
1042
1043 fclose(_os);
1044
1045 // Write messages:
1046
1047 printf("Created %s_namespace.h\n", *Str(ns));
1048 printf("Created %s_namespace.cpp\n", *Str(ns));
1049 printf("\n");
1050 }
1051
1052 Uint32 cimmofSourceConsumer::_findClass(const CIMName& className) const
1053 {
1054 for (Uint32 i = 0; i < _classes.size(); i++)
1055 {
1056 if (_classes[i].getClassName() == className)
1057 mike 1.1.2.5 return i;
1058 }
1059
1060 // Not found!
1061 return PEG_NOT_FOUND;
1062 }
1063
1064 Uint32 cimmofSourceConsumer::_findQualifier(const CIMName& qualifierName) const
1065 {
1066 for (Uint32 i = 0; i < _qualifiers.size(); i++)
1067 {
1068 if (_qualifiers[i].getName() == qualifierName)
1069 return i;
1070 }
1071
1072 // Not found!
1073 return PEG_NOT_FOUND;
1074 }
1075
1076 void cimmofSourceConsumer::_writeSourcePrologue()
1077 {
1078 mike 1.1.2.5 String ns = _makeIdent(_nameSpace.getString());
1079 String path = ns + "_namespace.h";
1080
1081 _outn("#include \"%s\"", *Str(path));
1082 _nl();
1083 _outn("PEGASUS_NAMESPACE_BEGIN");
|
1084 mike 1.1.2.3 _nl();
1085 }
1086
|
1087 mike 1.1.2.5 void cimmofSourceConsumer::_writeSourceEpilogue()
1088 {
1089 _outn("PEGASUS_NAMESPACE_END");
1090 }
1091
1092 void cimmofSourceConsumer::_writeQualifier(
1093 const Array<CIMQualifierDecl>& qualifierDecls,
1094 const CIMConstQualifier& cq)
1095 {
1096 CIMName qn = cq.getName();
1097 CIMType qt = cq.getType();
1098 CIMValue qv = cq.getValue();
1099
1100 Uint32 pos = _findQualifier(qn);
1101
1102 if (pos == PEG_NOT_FOUND)
1103 _throw(CIM_ERR_FAILED, "undefined qualifier: %s", *Str(qn));
1104
1105 // Write the qualifier string literal:
1106
1107 _outn(" /* %s */", *Str(qn));
1108 mike 1.1.2.5 _out(" \"");
1109 _writeUint8(_os, pos);
1110 _writeValue(_os, qv, false);
1111 _outn("\",");
1112 }
1113
|
1114 mike 1.1.2.3 void cimmofSourceConsumer::_writeQualifierDecl(const CIMConstQualifierDecl& cq)
1115 {
1116 CIMName qn = cq.getName();
1117 CIMType qt = cq.getType();
1118 const CIMValue& cv = cq.getValue();
1119
|
1120 mike 1.1.2.4 // Write value definition (if any).
1121
1122 String path = "_" + qn.getString() + "_qualifier_decl";
|
1123 mike 1.1.2.3
1124 // Write SourceQualifierDecl header:
1125
|
1126 mike 1.1.2.4 _outn("static SourceQualifierDecl");
1127 _outn("%s =", *Str(path));
|
1128 mike 1.1.2.3 _outn("{");
1129
1130 // SourceQualifierDecl.name:
1131
|
1132 mike 1.1.2.5 _outn(" \"%s\", /* name */", *Str(qn));
|
1133 mike 1.1.2.3
1134 // SourceQualifierDecl.type:
1135
|
1136 mike 1.1.2.5 _outn(" %s, /* type */", _typeNames[qt]);
|
1137 mike 1.1.2.3
1138 // SourceQualifierDecl.subscript:
1139
1140 if (cq.isArray())
1141 {
1142 Uint32 n = cq.getArraySize();
|
1143 mike 1.1.2.5 _outn(" %u, /* subscript */", n);
|
1144 mike 1.1.2.3 }
1145 else
1146 {
|
1147 mike 1.1.2.5 _outn(" -1, /* subscript */");
|
1148 mike 1.1.2.3 }
1149
1150 // SourceQualifierDecl.scope:
1151 {
1152 CIMScope scope = cq.getScope();
1153 Array<String> scopes;
1154
1155 if (scope.hasScope(CIMScope::ANY))
1156 scopes.append("PEGASUS_SCOPE_ANY");
1157 else
1158 {
1159 if (scope.hasScope(CIMScope::CLASS))
1160 scopes.append("PEGASUS_SCOPE_CLASS");
1161 if (scope.hasScope(CIMScope::ASSOCIATION))
1162 scopes.append("PEGASUS_SCOPE_ASSOCIATION");
1163 if (scope.hasScope(CIMScope::INDICATION))
1164 scopes.append("PEGASUS_SCOPE_INDICATION");
1165 if (scope.hasScope(CIMScope::PROPERTY))
1166 scopes.append("PEGASUS_SCOPE_PROPERTY");
1167 if (scope.hasScope(CIMScope::REFERENCE))
1168 scopes.append("PEGASUS_SCOPE_REFERENCE");
1169 mike 1.1.2.3 if (scope.hasScope(CIMScope::METHOD))
1170 scopes.append("PEGASUS_SCOPE_METHOD");
1171 if (scope.hasScope(CIMScope::PARAMETER))
1172 scopes.append("PEGASUS_SCOPE_PARAMETER");
1173 }
1174
1175 _out(" ");
1176
1177 for (Uint32 i = 0; i < scopes.size(); i++)
1178 {
1179 _out("%s", *Str(scopes[i]));
1180
1181 if (i + 1 != scopes.size())
1182 _out("|");
1183 }
1184
1185 _outn(",");
1186 }
1187
1188 // SourceQualifierDecl.flavor:
1189 {
1190 mike 1.1.2.3 CIMFlavor flavor = cq.getFlavor();
1191 Array<String> flavors;
1192
1193 if (flavor.hasFlavor(CIMFlavor::OVERRIDABLE))
1194 flavors.append("PEGASUS_FLAVOR_OVERRIDABLE");
1195 if (flavor.hasFlavor(CIMFlavor::TOSUBCLASS))
1196 flavors.append("PEGASUS_FLAVOR_TOSUBCLASS");
1197 if (flavor.hasFlavor(CIMFlavor::TOINSTANCE))
1198 flavors.append("PEGASUS_FLAVOR_TOINSTANCE");
1199 if (flavor.hasFlavor(CIMFlavor::TRANSLATABLE))
1200 flavors.append("PEGASUS_FLAVOR_TRANSLATABLE");
1201 if (flavor.hasFlavor(CIMFlavor::DISABLEOVERRIDE))
1202 flavors.append("PEGASUS_FLAVOR_DISABLEOVERRIDE");
1203 if (flavor.hasFlavor(CIMFlavor::RESTRICTED))
1204 flavors.append("PEGASUS_FLAVOR_RESTRICTED");
1205
1206 _out(" ");
1207
1208 for (Uint32 i = 0; i < flavors.size(); i++)
1209 {
1210 _out("%s", *Str(flavors[i]));
1211 mike 1.1.2.3
1212 if (i + 1 != flavors.size())
1213 _out("|");
1214 }
1215
1216 _outn(",");
1217 }
1218
1219 // SourceQualifierDecl.value:
1220
|
1221 mike 1.1.2.5 _out(" ");
1222 _writeValue(_os, cv, true);
1223 _outn(",");
|
1224 mike 1.1.2.3
1225 _outn("};");
1226 _nl();
1227 }
1228
|
1229 mike 1.1.2.4 template<class C>
1230 Array<CIMConstQualifier> _Qualifiers(const C& c)
1231 {
1232 Array<CIMConstQualifier> tmp;
1233
1234 for (Uint32 i = 0; i < c.getQualifierCount(); i++)
1235 tmp.append(c.getQualifier(i));
1236
1237 return tmp;
1238 }
1239
1240 void cimmofSourceConsumer::_writeQualifierArray(
1241 const String& root,
1242 const Array<CIMConstQualifier>& qualifiers)
1243 {
|
1244 mike 1.1.2.5 _outn("static const char*");
|
1245 mike 1.1.2.4 _outn("%s_qualifiers[] =", *Str(root));
1246 _outn("{");
1247
1248 for (Uint32 i = 0; i < qualifiers.size(); i++)
1249 {
1250 CIMConstQualifier cq = qualifiers[i];
1251 CIMName qn = cq.getName();
|
1252 mike 1.1.2.5 CIMType qt = cq.getType();
|
1253 mike 1.1.2.4
1254 if (_discard && qn == "Description")
1255 continue;
1256
|
1257 mike 1.1.2.5 if (qt == CIMTYPE_BOOLEAN && !cq.isArray())
|
1258 mike 1.1.2.4 continue;
1259
|
1260 mike 1.1.2.5 _writeQualifier(_qualifiers, cq);
|
1261 mike 1.1.2.4 }
1262
|
1263 mike 1.1.2.5 // Write terminator:
|
1264 mike 1.1.2.4 _outn(" 0,");
1265
1266 _outn("};");
1267 _nl();
1268 }
1269
|
1270 mike 1.1.2.1 void cimmofSourceConsumer::_writeProperty(
1271 const CIMName& cn,
1272 const CIMConstProperty& cp)
1273 {
1274 CIMName pn = cp.getName();
1275 CIMType ct = cp.getType();
1276
|
1277 mike 1.1.2.4 String path = "_" + cn.getString() + "_" + pn.getString();
1278
1279 // Write qualifiers:
1280
1281 _writeQualifierArray(path, _Qualifiers(cp));
1282
1283 // Header:
1284
1285 _outn("static SourceProperty");
1286 _outn("%s =", *Str(path));
|
1287 mike 1.1.2.1 _outn("{");
1288 _indent++;
1289
1290 // SourceProperty.flags:
1291
1292 _out("PEGASUS_FLAG_PROPERTY");
1293 _writeFlags(_os, cp, true, false);
1294 fprintf(_os, ",\n");
1295
1296 // SourceProperty.name:
1297
1298 _outn("\"%s\", /* name */", *Str(pn));
1299
|
1300 mike 1.1.2.4 // SourceProperty.qualifiers:
|
1301 mike 1.1.2.3
|
1302 mike 1.1.2.4 _outn("%s_qualifiers, /* qualifiers */", *Str(path));
|
1303 mike 1.1.2.3
|
1304 mike 1.1.2.1 // SourceProperty.type:
1305
1306 _outn("%s, /* type */", _typeNames[ct]);
1307
1308 // SourceProperty.subscript:
1309
1310 if (cp.isArray())
1311 {
1312 Uint32 n = cp.getArraySize();
1313 _outn("%u, /* subscript */", n);
1314 }
1315 else
1316 {
1317 _outn("-1, /* subscript */");
1318 }
1319
1320 // SourceProperty.refClass:
1321
1322 if (ct == CIMTYPE_REFERENCE)
1323 {
1324 const CIMName& rcn = cp.getReferenceClassName();
|
1325 mike 1.1.2.3 _outn("&_%s, /* refClass */\n", *Str(rcn));
|
1326 mike 1.1.2.1 }
1327 else
1328 {
1329 _outn("0, /* refClass */");
1330 }
1331
1332 _indent--;
1333 _outn("};");
1334 _nl();
1335 }
1336
|
1337 mike 1.1.2.2 void cimmofSourceConsumer::_writeParameter(
1338 const CIMName& cn,
1339 const CIMName& mn,
1340 const CIMConstParameter& cp)
1341 {
1342 CIMName pn = cp.getName();
1343 CIMType ct = cp.getType();
1344
|
1345 mike 1.1.2.4 String path =
1346 "_" + cn.getString() + "_" + mn.getString() + "_" + pn.getString();
1347
1348 _writeQualifierArray(path, _Qualifiers(cp));
1349
1350 _outn("static SourceProperty");
1351 _outn("%s =", *Str(path));
|
1352 mike 1.1.2.2 _outn("{");
1353 _indent++;
1354
1355 // SourceProperty.flags:
1356
1357 _out("PEGASUS_FLAG_PROPERTY");
1358 _writeFlags(_os, cp, false, true);
1359 fprintf(_os, ",\n");
1360
1361 // SourceProperty.name:
1362
1363 _outn("\"%s\", /* name */", *Str(pn));
1364
|
1365 mike 1.1.2.4 // SourceProperty.qualifiers:
|
1366 mike 1.1.2.3
|
1367 mike 1.1.2.4 _outn("%s_qualifiers, /* qualifiers */", *Str(path));
|
1368 mike 1.1.2.3
|
1369 mike 1.1.2.2 // SourceProperty.type:
1370
1371 _outn("%s, /* type */", _typeNames[ct]);
1372
1373 // SourceProperty.subscript:
1374
1375 if (cp.isArray())
1376 {
1377 Uint32 n = cp.getArraySize();
1378 _outn("%u, /* subscript */", n);
1379 }
1380 else
1381 {
1382 _outn("-1, /* subscript */");
1383 }
1384
1385 // SourceProperty.refClass:
1386
1387 if (ct == CIMTYPE_REFERENCE)
1388 {
1389 const CIMName& rcn = cp.getReferenceClassName();
|
1390 mike 1.1.2.3 _outn("&_%s, /* refClass */\n", *Str(rcn));
|
1391 mike 1.1.2.2 }
1392 else
1393 {
1394 _outn("0, /* refClass */");
1395 }
1396
1397 _indent--;
1398 _outn("};");
1399 _nl();
1400 }
1401
1402 void cimmofSourceConsumer::_writeMethod(
1403 const CIMName& cn,
1404 const CIMConstMethod& cm)
1405 {
1406 CIMName mn = cm.getName();
1407
1408 // Write parameter definitions:
1409
1410 Array<CIMName> parameterNames;
1411
1412 mike 1.1.2.2 for (Uint32 i = 0; i < cm.getParameterCount(); i++)
1413 {
1414 CIMConstParameter cp = cm.getParameter(i);
|
1415 mike 1.1.2.3 _writeParameter(cn, mn, cp);
|
1416 mike 1.1.2.2 parameterNames.append(cp.getName());
1417 }
1418
1419 // Write parameters array:
1420
|
1421 mike 1.1.2.4 _outn("static SourceProperty*");
1422 _outn("_%s_%s_parameters[] =", *Str(cn), *Str(mn));
|
1423 mike 1.1.2.2 _outn("{");
1424 _indent++;
1425
1426 for (Uint32 i = 0; i < parameterNames.size(); i++)
1427 {
1428 const CIMName& pn = parameterNames[i];
|
1429 mike 1.1.2.3 _outn("&_%s_%s_%s,", *Str(cn), *Str(mn), *Str(pn));
|
1430 mike 1.1.2.2 }
1431
1432 _outn("0,");
1433 _indent--;
1434 _outn("};");
1435 _nl();
1436
1437 // Method header:
1438
|
1439 mike 1.1.2.4 String path = "_" + cn.getString() + "_" + mn.getString();
1440
1441 _writeQualifierArray(path, _Qualifiers(cm));
1442
1443 _outn("static SourceMethod");
1444 _outn("%s =", *Str(path));
|
1445 mike 1.1.2.2 _outn("{");
1446 _indent++;
1447
1448 // SourceMethod.flags:
1449
1450 _out("PEGASUS_FLAG_METHOD");
1451 _writeFlags(_os, cm, false, false);
1452 fprintf(_os, ",\n");
1453
1454 // SourceMethod.name:
1455
1456 _outn("\"%s\", /* name */", *Str(cn));
1457
|
1458 mike 1.1.2.4 // SourceMethod.qualifiers:
|
1459 mike 1.1.2.3
|
1460 mike 1.1.2.4 _outn("%s_qualifiers, /* qualifiers */", *Str(path));
|
1461 mike 1.1.2.2
1462 // SourceProperty.type:
1463
1464 _outn("%s, /* type */", _typeNames[cm.getType()]);
1465
1466 // SourceMethod.parameter:
1467
|
1468 mike 1.1.2.3 _outn("_%s_%s_parameters,", *Str(cn), *Str(mn));
|
1469 mike 1.1.2.2
1470 // Method footer:
1471
1472 _indent--;
1473 _outn("};");
1474 _nl();
1475 }
1476
|
1477 mike 1.1.2.1 void cimmofSourceConsumer::_writeClass(
1478 const CIMClass& cc)
1479 {
1480 CIMName cn = cc.getClassName();
1481
1482 // Write comment:
1483
|
1484 mike 1.1.2.3 _box(_os, "Class: %s", *Str(cn));
|
1485 mike 1.1.2.1 _nl();
1486
1487 // Write property definitions:
1488
1489 Array<CIMName> featureNames;
1490
1491 for (Uint32 i = 0; i < cc.getPropertyCount(); i++)
1492 {
1493 CIMConstProperty cp = cc.getProperty(i);
|
1494 mike 1.1.2.3 _writeProperty(cc.getClassName(), cp);
|
1495 mike 1.1.2.1 featureNames.append(cp.getName());
1496 }
1497
1498 // Write method definitions:
|
1499 mike 1.1.2.2
1500 for (Uint32 i = 0; i < cc.getMethodCount(); i++)
1501 {
1502 CIMConstMethod cm = cc.getMethod(i);
|
1503 mike 1.1.2.3 _writeMethod(cc.getClassName(), cm);
|
1504 mike 1.1.2.2 featureNames.append(cm.getName());
1505 }
|
1506 mike 1.1.2.1
1507 // Write feature array:
1508
|
1509 mike 1.1.2.4 _outn("static SourceFeature*");
1510 _outn("_%s_features[] =", *Str(cn));
|
1511 mike 1.1.2.1 _outn("{");
1512 _indent++;
1513
1514 for (Uint32 i = 0; i < featureNames.size(); i++)
1515 {
1516 const CIMName& fn = featureNames[i];
|
1517 mike 1.1.2.3 _outn("(SourceFeature*)&_%s_%s,", *Str(cn), *Str(fn));
|
1518 mike 1.1.2.1 }
1519
1520 _outn("0,");
1521 _indent--;
1522 _outn("};");
1523 _nl();
1524
1525 // Class header:
1526
|
1527 mike 1.1.2.4 String path = "_" + cn.getString();
1528
1529 _writeQualifierArray(path, _Qualifiers(cc));
1530
1531 _outn("static SourceClass");
1532 _outn("%s =", *Str(path));
|
1533 mike 1.1.2.1 _outn("{");
1534 _indent++;
1535
1536 // SourceClass.flags:
1537
1538 if (_testBooleanQualifier(cc, "Association"))
1539 _out("PEGASUS_FLAG_ASSOCIATION");
1540 else if (_testBooleanQualifier(cc, "Indication"))
1541 _out("PEGASUS_FLAG_INDICATION");
1542 else
1543 _out("PEGASUS_FLAG_CLASS");
1544
1545 _writeFlags(_os, cc, false, false);
1546 fprintf(_os, ",\n");
1547
1548 // SourceClass.name:
1549
1550 _outn("\"%s\", /* name */", *Str(cn));
1551
|
1552 mike 1.1.2.4 // SourceClass.qualifiers:
|
1553 mike 1.1.2.3
|
1554 mike 1.1.2.4 _outn("%s_qualifiers, /* qualifiers */", *Str(path));
|
1555 mike 1.1.2.3
|
1556 mike 1.1.2.1 // SourceClass.super:
1557
1558 const CIMName& scn = cc.getSuperClassName();
1559
1560 if (scn.isNull())
1561 _outn("0, /* super */");
1562 else
|
1563 mike 1.1.2.3 _outn("&_%s, /* super */", *Str(scn));
|
1564 mike 1.1.2.1
1565 // SourceClass.features:
1566
|
1567 mike 1.1.2.3 _outn("_%s_features,", *Str(cn));
|
1568 mike 1.1.2.1
1569 // Class footer:
1570
1571 _indent--;
1572 _outn("};");
1573 _nl();
1574 }
1575
1576 void cimmofSourceConsumer::_writeNameSpace(const CIMNamespaceName& nameSpace)
1577 {
|
1578 mike 1.1.2.2 String ns = _makeIdent(nameSpace.getString());
1579
|
1580 mike 1.1.2.3 // Write qualifiers:
1581
1582 _box(_os, "Qualifiers");
1583 _nl();
1584
1585 for (Uint32 i = 0; i < _qualifiers.size(); i++)
1586 {
1587 _writeQualifierDecl(_qualifiers[i]);
1588 }
1589
|
1590 mike 1.1.2.2 // Write classes:
1591
1592 for (Uint32 i = 0; i < _classes.size(); i++)
|
1593 mike 1.1.2.3 _writeClass(_classes[i]);
|
1594 mike 1.1.2.2
|
1595 mike 1.1.2.3 // Write qualifiers list:
1596
1597 _box(_os, "Qualifier array");
1598 _nl();
1599
|
1600 mike 1.1.2.4 _outn("static SourceQualifierDecl*");
1601 _outn("_qualifiers[] =");
|
1602 mike 1.1.2.3 _outn("{");
1603 _indent++;
|
1604 mike 1.1.2.2
|
1605 mike 1.1.2.3 for (Uint32 i = 0; i < _qualifiers.size(); i++)
1606 {
|
1607 mike 1.1.2.4 _outn("&_%s_qualifier_decl,", *Str(_qualifiers[i].getName()));
|
1608 mike 1.1.2.2 }
1609
|
1610 mike 1.1.2.3 _outn("0,");
1611
1612 _indent--;
1613 _outn("};");
1614 _nl();
1615
|
1616 mike 1.1.2.2 // Write classes list:
1617
|
1618 mike 1.1.2.3 _box(_os, "Class array");
1619 _nl();
1620
|
1621 mike 1.1.2.4 _outn("static SourceClass*");
1622 _outn("_classes[] =");
|
1623 mike 1.1.2.2 _outn("{");
1624 _indent++;
1625
|
1626 mike 1.1.2.1 for (Uint32 i = 0; i < _classes.size(); i++)
1627 {
|
1628 mike 1.1.2.3 _outn("&_%s,", *Str(_classes[i].getClassName()));
|
1629 mike 1.1.2.1 }
|
1630 mike 1.1.2.2
1631 _outn("0,");
1632
1633 _indent--;
1634 _outn("};");
1635 _nl();
1636
1637 // Write SourceNameSpace structure:
1638
|
1639 mike 1.1.2.3 _outn("const SourceNameSpace %s_namespace =", *Str(ns));
|
1640 mike 1.1.2.2 _outn("{");
1641 _outn(" \"%s\",", *Str(nameSpace));
|
1642 mike 1.1.2.3 _outn(" _qualifiers,");
1643 _outn(" _classes,");
|
1644 mike 1.1.2.2 _outn("};");
1645 _nl();
|
1646 mike 1.1.2.1 }
1647
1648 PEGASUS_FORMAT(2, 3)
1649 void cimmofSourceConsumer::_out(const char* format, ...)
1650 {
1651 va_list ap;
1652 va_start(ap, format);
1653 _vout(_os, format, ap);
1654 va_end(ap);
1655 }
1656
1657 PEGASUS_FORMAT(2, 3)
1658 void cimmofSourceConsumer::_outn(const char* format, ...)
1659 {
1660 va_list ap;
1661 va_start(ap, format);
1662 _vout(_os, format, ap);
1663 va_end(ap);
1664 fputc('\n', _os);
1665 }
1666
1667 mike 1.1.2.1 void cimmofSourceConsumer::_nl()
1668 {
1669 _out("\n");
1670 }
1671
1672 PEGASUS_NAMESPACE_END
|