1 r.kieninger 1.1 //%LICENSE////////////////////////////////////////////////////////////////
2 //
3 // 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 //
10 // 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 //
17 // The above copyright notice and this permission notice shall be included
18 // in all copies or substantial portions of the Software.
19 //
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
21 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 r.kieninger 1.1 // 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 //
28 //////////////////////////////////////////////////////////////////////////
29 //
30 //%/////////////////////////////////////////////////////////////////////////////
31
32 #include "CIMResponseData.h"
|
33 marek 1.2.2.5 #include <Pegasus/Common/Tracer.h>
34 #include <Pegasus/Common/XmlWriter.h>
35 #include <Pegasus/Common/SCMOXmlWriter.h>
36 #include <Pegasus/Common/XmlReader.h>
37 #include <Pegasus/Common/SCMOClassCache.h>
|
38 r.kieninger 1.1
39 PEGASUS_USING_STD;
40
41 PEGASUS_NAMESPACE_BEGIN
42
|
43 marek 1.2.2.5 // C++ objects interface handling
44
45 // Instance Names handling
46 Array<CIMObjectPath>& CIMResponseData::getInstanceNames()
47 {
48 PEGASUS_DEBUG_ASSERT(
49 (_dataType==RESP_INSTNAMES || _dataType==RESP_OBJECTPATHS));
50 _resolveToCIM();
51 PEGASUS_DEBUG_ASSERT(_encoding == RESP_ENC_CIM);
52 return _instanceNames;
53 }
54
55 // Instance handling
56 CIMInstance& CIMResponseData::getInstance()
57 {
58 PEGASUS_DEBUG_ASSERT(_dataType == RESP_INSTANCE);
59 _resolveToCIM();
60 PEGASUS_DEBUG_ASSERT(_encoding == RESP_ENC_CIM);
61 return _instances[0];
62 }
63
64 marek 1.2.2.5 // Instances handling
65 Array<CIMInstance>& CIMResponseData::getInstances()
66 {
67 PEGASUS_DEBUG_ASSERT(_dataType == RESP_INSTANCES);
68 _resolveToCIM();
69 PEGASUS_DEBUG_ASSERT(_encoding == RESP_ENC_CIM);
70 return _instances;
71 }
72
73 // Objects handling
74 Array<CIMObject>& CIMResponseData::getObjects()
75 {
76 PEGASUS_DEBUG_ASSERT(_dataType == RESP_OBJECTS);
77 _resolveToCIM();
78 PEGASUS_DEBUG_ASSERT(_encoding == RESP_ENC_CIM);
79 return _objects;
80 }
81
82 // SCMO representation, single instance stored as one element array
83 // object paths are represented as SCMOInstance
84 Array<SCMOInstance>& CIMResponseData::getSCMO()
85 marek 1.2.2.5 {
86 _resolveToSCMO();
87 PEGASUS_DEBUG_ASSERT(_encoding == RESP_ENC_SCMO);
88 return _scmoInstances;
89 }
90
|
91 marek 1.2.2.6 void CIMResponseData::setSCMO(const Array<SCMOInstance>& x)
92 {
93 // Just assignment bears danger of us being dependent on the original array
94 // content staying valid
95 // _scmoInstances=x;
96 for (Uint32 loop=0, max=x.size(); loop<max; loop++)
97 {
98 _scmoInstances.append(x[loop]);
99 }
100 // _scmoInstances.appendArray(x);
101 _encoding |= RESP_ENC_SCMO;
102 }
103
104
|
105 marek 1.2.2.5 // Binary data is just a data stream
106 Array<Uint8>& CIMResponseData::getBinary()
107 {
108 // TODO: Check if the following condition might come true
109 // One actually should resolve everything down to binary in here ...
110 return _binaryData;
111 }
112
113 bool CIMResponseData::setBinary(CIMBuffer& in, bool hasLen)
|
114 r.kieninger 1.2.2.1 {
115 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
116 marek 1.2.2.5 "CIMResponseData::setBinary");
|
117 r.kieninger 1.2.2.1
118 if (hasLen)
119 {
120 if (!in.getUint8A(_binaryData))
121 {
122 PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
123 "Failed to get binary object path data!");
124 PEG_METHOD_EXIT();
125 return false;
126 }
127 }
128 else
129 {
130 size_t remainingDataLength = in.capacity() - in.size();
131 _binaryData.append((Uint8*)in.getPtr(), remainingDataLength);
132 }
|
133 marek 1.2.2.5 _encoding |= RESP_ENC_BINARY;
|
134 r.kieninger 1.2.2.1 PEG_METHOD_EXIT();
135 return true;
|
136 marek 1.2.2.5 }
|
137 r.kieninger 1.2.2.1
|
138 marek 1.2.2.5 bool CIMResponseData::setXml(CIMBuffer& in)
|
139 r.kieninger 1.2.2.1 {
140 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
141 marek 1.2.2.5 "CIMResponseData::setXml");
|
142 r.kieninger 1.2.2.1
|
143 marek 1.2.2.5 if (_dataType == RESP_INSTNAMES)
|
144 r.kieninger 1.2.2.1 {
|
145 marek 1.2.2.5 Uint32 count;
|
146 marek 1.2.2.6
|
147 marek 1.2.2.5 if (!in.getUint32(count))
|
148 r.kieninger 1.2.2.1 {
149 PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
|
150 marek 1.2.2.5 "Failed to get XML objectpath data (number of paths)!");
|
151 r.kieninger 1.2.2.1 PEG_METHOD_EXIT();
152 return false;
153 }
|
154 marek 1.2.2.6
|
155 marek 1.2.2.5 for (Uint32 i = 0; i < count; i++)
|
156 r.kieninger 1.2.2.1 {
|
157 marek 1.2.2.5 Array<Sint8> ref;
158 CIMNamespaceName ns;
159 String host;
|
160 marek 1.2.2.6
|
161 marek 1.2.2.5 if (!in.getSint8A(ref))
162 {
163 PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
164 "Failed to get XML objectpath data (references)!");
165 PEG_METHOD_EXIT();
166 return false;
167 }
|
168 marek 1.2.2.6
|
169 marek 1.2.2.5 if (!in.getString(host))
170 {
171 PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
172 "Failed to get XML instance data (host)!");
173 PEG_METHOD_EXIT();
174 return false;
175 }
|
176 marek 1.2.2.6
|
177 marek 1.2.2.5 if (!in.getNamespaceName(ns))
178 {
179 PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
180 "Failed to get XML instance data (namespace)!");
181 PEG_METHOD_EXIT();
182 return false;
183 }
|
184 marek 1.2.2.6
|
185 marek 1.2.2.5 _referencesData.append(ref);
186 _hostsData.append(host);
187 _nameSpacesData.append(ns);
|
188 r.kieninger 1.2.2.1 }
189 }
|
190 marek 1.2.2.5 // TODO: Code the left out types
|
191 r.kieninger 1.2.2.1
|
192 marek 1.2.2.5 _encoding |= RESP_ENC_XML;
|
193 r.kieninger 1.2.2.1 PEG_METHOD_EXIT();
194 return true;
|
195 marek 1.2.2.5 }
196
197 // function used by OperationAggregator to aggregate response data in a
198 // single ResponseData object
199 void CIMResponseData::appendResponseData(const CIMResponseData & x)
200 {
201 // as the Messages set the data types, this should be impossible
202 PEGASUS_DEBUG_ASSERT(_dataType == x._dataType);
203 _encoding |= x._encoding;
204
205 // add all binary data
206 _binaryData.appendArray(x._binaryData);
|
207 r.kieninger 1.2.2.1
|
208 marek 1.2.2.5 // add all the C++ stuff
209 _instanceNames.appendArray(x._instanceNames);
210 _instances.appendArray(x._instances);
211 _objects.appendArray(x._objects);
|
212 r.kieninger 1.2.2.1
|
213 marek 1.2.2.5 // add the SCMO instances
214 _scmoInstances.appendArray(x._scmoInstances);
|
215 r.kieninger 1.2.2.1
|
216 marek 1.2.2.5 // add Xml encodings too
217 _referencesData.appendArray(x._referencesData);
218 _instanceData.appendArray(x._instanceData);
219 _hostsData.appendArray(x._hostsData);
220 _nameSpacesData.appendArray(x._nameSpacesData);
221 }
|
222 r.kieninger 1.2.2.1
|
223 marek 1.2.2.5 // Encoding responses into output format
224 void CIMResponseData::encodeBinaryResponse(CIMBuffer& out)
|
225 r.kieninger 1.2.2.1 {
226 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
227 marek 1.2.2.5 "CIMResponseData::encodeBinaryResponse");
|
228 r.kieninger 1.2.2.1
|
229 marek 1.2.2.5 // Need to do a complete job here by transferring all contained data
230 // into binary format and handing it out in the CIMBuffer
231 if (RESP_ENC_BINARY == (_encoding & RESP_ENC_BINARY))
|
232 r.kieninger 1.2.2.1 {
|
233 marek 1.2.2.5 // Binary does NOT need a marker as it consists of C++ and SCMO
|
234 r.kieninger 1.2.2.1 const Array<Uint8>& data = _binaryData;
235 out.putBytes(data.getData(), data.size());
236 }
|
237 marek 1.2.2.5 if (RESP_ENC_CIM == (_encoding & RESP_ENC_CIM))
|
238 r.kieninger 1.2.2.1 {
|
239 marek 1.2.2.6 // TODO: Set Marker for C++ data
|
240 marek 1.2.2.5 switch (_dataType)
|
241 r.kieninger 1.2.2.1 {
|
242 marek 1.2.2.5 case RESP_INSTNAMES:
243 {
244 out.putObjectPathA(_instanceNames, false);
245 break;
246 }
247 case RESP_INSTANCE:
248 {
249 if (0 != _instances.size())
250 {
251 out.putInstance(_instances[0], false, false);
252 }
253 break;
254 }
255 case RESP_INSTANCES:
256 {
257 out.putInstanceA(_instances, false);
258 break;
259 }
260 case RESP_OBJECTS:
261 {
262 out.putObjectA(_objects);
263 marek 1.2.2.5 break;
264 }
265 case RESP_OBJECTPATHS:
266 {
267 // TODO: Determine what to do here
268 break;
269 }
270 default:
271 {
272 // TODO:
273 // Argl, not nice, but not a problem yet, ignore this
274 }
|
275 r.kieninger 1.2.2.1 }
276 }
|
277 marek 1.2.2.5 if (RESP_ENC_SCMO == (_encoding & RESP_ENC_SCMO))
|
278 r.kieninger 1.2.2.1 {
|
279 marek 1.2.2.5 // TODO: Set Marker for SCMO data
|
280 r.kieninger 1.2.2.1
|
281 marek 1.2.2.5 // Call magic here to transform a SCMO object into binary format
282 fprintf(stderr, "Watch wat ya do'n! SCMO to binary ? NO OOP yet.\n");
283 fflush(stderr);
284 }
285 if (RESP_ENC_XML == (_encoding & RESP_ENC_XML))
|
286 r.kieninger 1.2.2.1 {
|
287 marek 1.2.2.5 // This actually should not happen following general code logic
288 PEGASUS_DEBUG_ASSERT(true);
|
289 r.kieninger 1.2.2.1 }
290
291 PEG_METHOD_EXIT();
292 }
293
|
294 marek 1.2.2.5 void CIMResponseData::encodeXmlResponse(Buffer& out)
|
295 r.kieninger 1.2.2.1 {
296 PEG_METHOD_ENTER(TRC_DISPATCHER,
|
297 marek 1.2.2.5 "CIMResponseData::encodeXmlResponse");
|
298 r.kieninger 1.2.2.1
|
299 marek 1.2.2.5 fprintf(
300 stderr,
301 "encodeXmlResponse(encoding=%X,content=%X)\n",
302 _encoding,
303 _dataType);
304 fflush(stderr);
|
305 r.kieninger 1.2.2.1
|
306 marek 1.2.2.5 if (RESP_ENC_XML == (_encoding & RESP_ENC_XML))
|
307 r.kieninger 1.2.2.1 {
|
308 marek 1.2.2.5 switch (_dataType)
|
309 r.kieninger 1.2.2.1 {
|
310 marek 1.2.2.5 case RESP_INSTNAMES:
311 {
312 const Array<ArraySint8>& a = _referencesData;
313 for (Uint32 i = 0, n = a.size(); i < n; i++)
314 {
315 out.append((char*)a[i].getData(), a[i].size() - 1);
316 }
317 break;
318 }
319 case RESP_INSTANCE:
320 {
321 out.append(
322 (char*)_instanceData.getData(),
323 _instanceData.size()-1);
324 break;
325 }
326 case RESP_INSTANCES:
327 {
328 const Array<ArraySint8>& a = _instanceData;
329 const Array<ArraySint8>& b = _referencesData;
|
330 r.kieninger 1.2.2.1
|
331 marek 1.2.2.5 for (Uint32 i = 0, n = a.size(); i < n; i++)
332 {
333 out << STRLIT("<VALUE.NAMEDINSTANCE>\n");
334 out.append((char*)b[i].getData(), b[i].size() - 1);
335 out.append((char*)a[i].getData(), a[i].size() - 1);
336 out << STRLIT("</VALUE.NAMEDINSTANCE>\n");
337 }
338 break;
339 }
340 case RESP_OBJECTS:
|
341 r.kieninger 1.2.2.1 {
|
342 marek 1.2.2.5 const Array<ArraySint8>& a = _instanceData;
343 const Array<ArraySint8>& b = _referencesData;
|
344 r.kieninger 1.2.2.1
|
345 marek 1.2.2.5 for (Uint32 i = 0, n = a.size(); i < n; i++)
346 {
347 out << STRLIT("<VALUE.OBJECTWITHPATH>\n");
348 out.append((char*)b[i].getData(), b[i].size() - 1);
349 out.append((char*)a[i].getData(), a[i].size() - 1);
350 out << STRLIT("</VALUE.OBJECTWITHPATH>\n");
351 }
352 break;
353 }
354 case RESP_OBJECTPATHS:
355 {
356 // TODO: Check what to do in this case
357 const Array<ArraySint8>& a = _instanceData;
358 const Array<ArraySint8>& b = _referencesData;
359
360 for (Uint32 i = 0, n = a.size(); i < n; i++)
361 {
362 out << STRLIT("<VALUE.OBJECTWITHPATH>\n");
363 out.append((char*)b[i].getData(), b[i].size() - 1);
364 out.append((char*)a[i].getData(), a[i].size() - 1);
365 out << STRLIT("</VALUE.OBJECTWITHPATH>\n");
366 marek 1.2.2.5 }
367 }
368 default:
369 {
370 // TODO:
371 // Argl, not nice, but not a problem yet, ignore this
|
372 r.kieninger 1.2.2.1 }
373 }
374 }
375
|
376 marek 1.2.2.5 if (RESP_ENC_CIM == (_encoding & RESP_ENC_CIM))
|
377 r.kieninger 1.2.2.1 {
|
378 marek 1.2.2.5 fprintf(stderr,"Got CIM data...\n");
379 fflush(stderr);
|
380 marek 1.2.2.6 // TODO: Set Marker for C++ data
|
381 marek 1.2.2.5 switch (_dataType)
|
382 r.kieninger 1.2.2.1 {
|
383 marek 1.2.2.5 case RESP_INSTNAMES:
384 {
385 for (Uint32 i = 0, n = _instanceNames.size(); i < n; i++)
386 {
387 XmlWriter::appendInstanceNameElement(out,_instanceNames[i]);
388 }
389 break;
390 }
391 case RESP_INSTANCE:
392 {
393 if (_instances.size()>0)
394 {
395 XmlWriter::appendInstanceElement(out, _instances[0]);
396 }
397 break;
398 }
399 case RESP_INSTANCES:
400 {
401 for (Uint32 i = 0, n = _instances.size(); i < n; i++)
402 {
403 XmlWriter::appendValueNamedInstanceElement(
404 marek 1.2.2.5 out, _instances[i]);
405 }
406 break;
407 }
408 case RESP_OBJECTS:
409 {
410 for (Uint32 i = 0; i < _objects.size(); i++)
411 {
412 XmlWriter::appendValueObjectWithPathElement(
413 out,
414 _objects[i]);
415 }
416 break;
417 }
418 case RESP_OBJECTPATHS:
419 {
420 for (Uint32 i = 0, n = _instanceNames.size(); i < n; i++)
421 {
422 out << "<OBJECTPATH>\n";
423 XmlWriter::appendValueReferenceElement(
424 out,
425 marek 1.2.2.5 _instanceNames[i],
426 false);
427 out << "</OBJECTPATH>\n";
428 }
429 break;
430 }
431 default:
432 {
433 // TODO:
434 // Argl, not nice, but not a problem yet, ignore this
435 }
|
436 r.kieninger 1.2.2.1 }
437 }
|
438 marek 1.2.2.5 if (RESP_ENC_SCMO == (_encoding & RESP_ENC_SCMO))
|
439 r.kieninger 1.2.2.1 {
|
440 marek 1.2.2.5 /*SCMODump dmp;
441 dmp.dumpSCMOInstanceKeyBindings(_scmoInstances[i]);
442 dmp.dumpInstanceProperties(_scmoInstances[i]);*/
|
443 marek 1.2.2.7 fprintf(
444 stderr,"encodeXmlResponse(SCMO)=%d instances...\n",
445 _scmoInstances.size());
446 fflush(stderr);
|
447 r.kieninger 1.1
|
448 marek 1.2.2.5 switch (_dataType)
|
449 r.kieninger 1.2 {
|
450 marek 1.2.2.5 case RESP_INSTNAMES:
451 {
452 for (Uint32 i = 0, n = _scmoInstances.size(); i < n; i++)
453 {
454 SCMOXmlWriter::appendInstanceNameElement(
455 out,
456 _scmoInstances[i]);
457 }
458 break;
459 }
460 case RESP_INSTANCE:
461 {
462 if (_scmoInstances.size() > 0)
463 {
464 SCMOXmlWriter::appendInstanceElement(out,_scmoInstances[0]);
465 }
466 break;
467 }
468 case RESP_INSTANCES:
469 {
470 for (Uint32 i = 0, n = _scmoInstances.size(); i < n; i++)
471 marek 1.2.2.5 {
472 SCMOXmlWriter::appendValueSCMOInstanceElement(
473 out,
474 _scmoInstances[i]);
475 }
476 break;
477 }
478 case RESP_OBJECTS:
479 {
480 for (Uint32 i = 0; i < _scmoInstances.size(); i++)
481 {
482 SCMOXmlWriter::appendValueObjectWithPathElement(
483 out,
484 _scmoInstances[i]);
485 }
486 break;
487 }
488 case RESP_OBJECTPATHS:
489 {
|
490 marek 1.2.2.7 for (Uint32 i = 0, n = _scmoInstances.size(); i < n; i++)
491 {
492 out << "<OBJECTPATH>\n";
493 SCMOXmlWriter::appendValueReferenceElement(
494 out,
495 _scmoInstances[i],
496 false);
497 out << "</OBJECTPATH>\n";
498 }
|
499 marek 1.2.2.5 break;
500 }
501 default:
502 {
503 // TODO:
504 // Argl, not nice, but not a problem yet, ignore this
505 }
|
506 r.kieninger 1.2 }
|
507 r.kieninger 1.1 }
|
508 marek 1.2.2.6 fprintf(
509 stderr,
510 "After XmlWrite()\n%s",
511 out.getData());
512 fflush(stderr);
|
513 marek 1.2.2.5 }
|
514 r.kieninger 1.1
|
515 marek 1.2.2.5 // contrary to encodeXmlResponse this function encodes the Xml in a format
516 // not usable by clients
517 void CIMResponseData::encodeInternalXmlResponse(CIMBuffer& out)
518 {
519 // TODO: Implement
520 // Need the full switch here again
521 // Should use the internal data available SCMO, C++ and InternalXML
522 // to generate the InternalXML by CIMInternalEncoder and SCMOInternalEncoder
523 fprintf(stderr, "Watch wat ya do'n! SCMO to InternalXml ? NO OOP yet.\n");
524 fflush(stderr);
525 }
|
526 r.kieninger 1.1
|
527 marek 1.2.2.5 void CIMResponseData::_resolveToCIM()
|
528 r.kieninger 1.1 {
|
529 marek 1.2.2.5 fprintf(
530 stderr,
531 "_resolveToCIM(encoding=%X,content=%X)\n",
532 _encoding,
533 _dataType);
534 fflush(stderr);
|
535 r.kieninger 1.1
|
536 marek 1.2.2.5 if (RESP_ENC_XML == (_encoding & RESP_ENC_XML))
|
537 r.kieninger 1.1 {
|
538 marek 1.2.2.5 _resolveXmlToCIM();
|
539 r.kieninger 1.1 }
|
540 marek 1.2.2.5 if (RESP_ENC_BINARY == (_encoding & RESP_ENC_BINARY))
|
541 r.kieninger 1.1 {
|
542 marek 1.2.2.5 _resolveBinary();
|
543 r.kieninger 1.1 }
|
544 marek 1.2.2.5 if (RESP_ENC_SCMO == (_encoding & RESP_ENC_SCMO))
|
545 r.kieninger 1.1 {
|
546 marek 1.2.2.5 _resolveSCMOToCIM();
|
547 r.kieninger 1.1 }
|
548 marek 1.2.2.5 PEGASUS_DEBUG_ASSERT(_encoding == RESP_ENC_CIM);
549 }
|
550 r.kieninger 1.1
|
551 marek 1.2.2.5 void CIMResponseData::_resolveToSCMO()
552 {
553 fprintf(
554 stderr,
555 "_resolveToSCMO(encoding=%X,content=%X)\n",
556 _encoding,
557 _dataType);
558 fflush(stderr);
|
559 marek 1.2.2.6
|
560 marek 1.2.2.5 if (RESP_ENC_XML == (_encoding & RESP_ENC_XML))
|
561 r.kieninger 1.1 {
|
562 marek 1.2.2.5 _resolveXmlToSCMO();
|
563 r.kieninger 1.1 }
|
564 marek 1.2.2.5 if (RESP_ENC_BINARY == (_encoding & RESP_ENC_BINARY))
|
565 r.kieninger 1.1 {
|
566 marek 1.2.2.5 _resolveBinary();
|
567 r.kieninger 1.1 }
|
568 marek 1.2.2.5 if (RESP_ENC_CIM == (_encoding & RESP_ENC_CIM))
|
569 r.kieninger 1.1 {
|
570 marek 1.2.2.5 _resolveCIMToSCMO();
|
571 r.kieninger 1.1 }
|
572 marek 1.2.2.5 PEGASUS_DEBUG_ASSERT(_encoding == RESP_ENC_SCMO);
|
573 r.kieninger 1.1 }
574
|
575 marek 1.2.2.5 // helper functions to transform different formats into one-another
576 // functions work on the internal data and calling of them should be
577 // avoided whenever possible
578 void CIMResponseData::_resolveBinary()
|
579 r.kieninger 1.1 {
|
580 marek 1.2.2.5 // Call magic here to resolve binary format
581 fprintf(stderr, "Watch wat ya do'n! binary ? NO OOP yet.\n");
582 fflush(stderr);
|
583 r.kieninger 1.1
|
584 marek 1.2.2.5 switch (_dataType)
|
585 r.kieninger 1.1 {
|
586 marek 1.2.2.5 case RESP_INSTNAMES:
587 {
588 break;
589 }
590 case RESP_INSTANCE:
591 {
592 break;
593 }
594 case RESP_INSTANCES:
595 {
596 break;
597 }
598 case RESP_OBJECTS:
599 {
600 break;
601 }
602 case RESP_OBJECTPATHS:
603 {
604 break;
605 }
606 default:
607 marek 1.2.2.5 {
608 // TODO:
609 // Argl, not nice, but not a problem yet, ignore this
610 }
|
611 r.kieninger 1.1 }
612 }
613
|
614 marek 1.2.2.5 void CIMResponseData::_resolveXmlToCIM()
|
615 r.kieninger 1.1 {
|
616 marek 1.2.2.5 switch (_dataType)
617 {
618 case RESP_INSTNAMES:
619 {
620 for (Uint32 i = 0; i < _referencesData.size(); i++)
621 {
622 CIMObjectPath cop;
623 // Deserialize path:
624 {
625 XmlParser parser((char*)_referencesData[i].getData());
626
627 if (XmlReader::getInstanceNameElement(parser, cop))
628 {
629 if (!_nameSpacesData[i].isNull())
630 cop.setNameSpace(_nameSpacesData[i]);
631
632 if (_hostsData[i].size())
633 cop.setHost(_hostsData[i]);
634 }
635 }
636 _instanceNames.append(cop);
637 marek 1.2.2.5 }
638 break;
639 }
640 case RESP_INSTANCE:
641 {
642 CIMInstance cimInstance;
643 // Deserialize instance:
644 {
645 XmlParser parser((char*)_instanceData[0].getData());
|
646 r.kieninger 1.1
|
647 marek 1.2.2.5 if (!XmlReader::getInstanceElement(parser, cimInstance))
648 {
649 cimInstance = CIMInstance();
650 PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
651 "Failed to resolve XML instance, parser error!");
652 }
653 }
654 // Deserialize path:
655 {
656 XmlParser parser((char*)_referencesData[0].getData());
657 CIMObjectPath cimObjectPath;
|
658 r.kieninger 1.1
|
659 marek 1.2.2.5 if (XmlReader::getValueReferenceElement(parser, cimObjectPath))
660 {
661 if (_hostsData.size())
662 {
663 cimObjectPath.setHost(_hostsData[0]);
664 }
665 if (!_nameSpacesData[0].isNull())
666 {
667 cimObjectPath.setNameSpace(_nameSpacesData[0]);
668 }
669 cimInstance.setPath(cimObjectPath);
670 // only if everything works we add the CIMInstance to the
671 // array
672 _instances.append(cimInstance);
673 }
674 }
675 break;
676 }
677 case RESP_INSTANCES:
678 {
679 for (Uint32 i = 0; i < _instanceData.size(); i++)
680 marek 1.2.2.5 {
681 CIMInstance cimInstance;
682 // Deserialize instance:
683 {
684 XmlParser parser((char*)_instanceData[i].getData());
685
686 if (!XmlReader::getInstanceElement(parser, cimInstance))
687 {
688 PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
689 "Failed to resolve XML instance."
690 " Creating empty instance!");
691 cimInstance = CIMInstance();
692 }
693 }
694
695 // Deserialize path:
696 {
697 XmlParser parser((char*)_referencesData[i].getData());
698 CIMObjectPath cimObjectPath;
699
700 if (XmlReader::getInstanceNameElement(parser,cimObjectPath))
701 marek 1.2.2.5 {
702 if (!_nameSpacesData[i].isNull())
703 cimObjectPath.setNameSpace(_nameSpacesData[i]);
704
705 if (_hostsData[i].size())
706 cimObjectPath.setHost(_hostsData[i]);
707
708 cimInstance.setPath(cimObjectPath);
709 }
710 }
|
711 r.kieninger 1.1
|
712 marek 1.2.2.5 _instances.append(cimInstance);
713 }
714 break;
715 }
716 case RESP_OBJECTS:
717 {
718 for (Uint32 i=0, n=_instanceData.size(); i<n; i++)
719 {
720 CIMObject cimObject;
721
722 // Deserialize Objects:
723 {
724 XmlParser parser((char*)_instanceData[i].getData());
725
726 CIMInstance cimInstance;
727 CIMClass cimClass;
728
729 if (XmlReader::getInstanceElement(parser, cimInstance))
730 {
731 cimObject = CIMObject(cimInstance);
732 }
733 marek 1.2.2.5 else if (XmlReader::getClassElement(parser, cimClass))
734 {
735 cimObject = CIMObject(cimClass);
736 }
737 else
738 {
739 PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
740 "Failed to get XML object data!");
741 }
742 }
743
744 // Deserialize paths:
745 {
746 XmlParser parser((char*)_referencesData[i].getData());
747 CIMObjectPath cimObjectPath;
748
749 if (XmlReader::getValueReferenceElement(
750 parser,
751 cimObjectPath))
752 {
753 if (!_nameSpacesData[i].isNull())
754 marek 1.2.2.5 cimObjectPath.setNameSpace(_nameSpacesData[i]);
755
756 if (_hostsData[i].size())
757 cimObjectPath.setHost(_hostsData[i]);
758
759 cimObject.setPath(cimObjectPath);
760 }
761 }
762 _objects.append(cimObject);
763 }
764 break;
765 }
766 case RESP_OBJECTPATHS:
767 {
768 // TODO: ????
769 }
770 default:
771 {
772 // TODO:
773 // Argl, not nice, but not a problem yet, ignore this
774 }
775 marek 1.2.2.5 }
776 // Xml was resolved, release Xml content now
777 _referencesData.clear();
778 _hostsData.clear();
779 _nameSpacesData.clear();
780 _instanceData.clear();
781 // remove Xml Encoding flag
782 _encoding &=(!RESP_ENC_XML);
783 // add CIM Encoding flag
784 _encoding |=RESP_ENC_CIM;
|
785 r.kieninger 1.1 }
786
|
787 marek 1.2.2.5 void CIMResponseData::_resolveXmlToSCMO()
|
788 r.kieninger 1.2.2.4 {
|
789 marek 1.2.2.5 // Not optimal, can probably be improved
790 // but on the other hand, since using the binary format this case should
791 // actually not ever happen.
792 _resolveXmlToCIM();
793 _resolveCIMToSCMO();
794 }
|
795 r.kieninger 1.2.2.4
|
796 marek 1.2.2.5 void CIMResponseData::_resolveSCMOToCIM()
797 {
798 switch(_dataType)
|
799 r.kieninger 1.2.2.4 {
|
800 marek 1.2.2.5 case RESP_INSTNAMES:
801 case RESP_OBJECTPATHS:
|
802 r.kieninger 1.1 {
|
803 marek 1.2.2.5 for (Uint32 x=0, n=_scmoInstances.size(); x < n; x++)
804 {
805 CIMObjectPath newObjectPath;
806 _scmoInstances[x].getCIMObjectPath(newObjectPath);
807 _instanceNames.append(newObjectPath);
808 }
809 break;
|
810 r.kieninger 1.1 }
|
811 marek 1.2.2.5 case RESP_INSTANCE:
|
812 r.kieninger 1.1 {
|
813 marek 1.2.2.5 CIMInstance newInstance;
814 _scmoInstances[0].getCIMInstance(newInstance);
815 _instances.append(newInstance);
816 break;
|
817 marek 1.2.2.2 }
|
818 marek 1.2.2.5 case RESP_INSTANCES:
|
819 r.kieninger 1.2 {
|
820 marek 1.2.2.5 for (Uint32 x=0, n=_scmoInstances.size(); x < n; x++)
|
821 r.kieninger 1.1 {
|
822 marek 1.2.2.5 CIMInstance newInstance;
823 _scmoInstances[x].getCIMInstance(newInstance);
824 _instances.append(newInstance);
|
825 r.kieninger 1.1 }
|
826 marek 1.2.2.5 break;
|
827 r.kieninger 1.1 }
|
828 marek 1.2.2.5 case RESP_OBJECTS:
|
829 r.kieninger 1.1 {
|
830 marek 1.2.2.5 for (Uint32 x=0, n=_scmoInstances.size(); x < n; x++)
|
831 r.kieninger 1.1 {
|
832 marek 1.2.2.5 CIMInstance newInstance;
833 _scmoInstances[x].getCIMInstance(newInstance);
834 _objects.append(CIMObject(newInstance));
|
835 r.kieninger 1.1 }
|
836 marek 1.2.2.5 break;
|
837 r.kieninger 1.1 }
|
838 marek 1.2.2.5 default:
|
839 r.kieninger 1.2.2.1 {
|
840 marek 1.2.2.5 // TODO:
841 // Argl, not nice, but not a problem yet, ignore this
|
842 r.kieninger 1.2.2.1 }
843 }
844
|
845 marek 1.2.2.5 _scmoInstances.clear();
846 // remove CIM Encoding flag
847 _encoding &=(!RESP_ENC_SCMO);
848 // add SCMO Encoding flag
849 _encoding |=RESP_ENC_CIM;
|
850 r.kieninger 1.2.2.1 }
851
|
852 marek 1.2.2.5 void CIMResponseData::_resolveCIMToSCMO()
|
853 r.kieninger 1.1 {
|
854 marek 1.2.2.5 switch (_dataType)
|
855 r.kieninger 1.2 {
|
856 marek 1.2.2.5 case RESP_INSTNAMES:
857 case RESP_OBJECTPATHS:
|
858 r.kieninger 1.2 {
|
859 marek 1.2.2.5 for (Uint32 i=0,n=_instanceNames.size();i<n;i++)
860 {
861 SCMOInstance addme =
862 _getSCMOFromCIMObjectPath(_instanceNames[i]);
863 _scmoInstances.append(addme);
864 }
865 break;
|
866 r.kieninger 1.2 }
|
867 marek 1.2.2.5 case RESP_INSTANCE:
|
868 r.kieninger 1.1 {
|
869 marek 1.2.2.5 SCMOInstance addme =
870 _getSCMOFromCIMInstance(_instances[0]);
871 _scmoInstances.append(addme);
872 break;
|
873 r.kieninger 1.1 }
|
874 marek 1.2.2.5 case RESP_INSTANCES:
|
875 r.kieninger 1.1 {
|
876 marek 1.2.2.5 for (Uint32 i=0,n=_instances.size();i<n;i++)
877 {
878 SCMOInstance addme =
879 _getSCMOFromCIMInstance(_instances[i]);
880 _scmoInstances.append(addme);
881 }
882 break;
|
883 r.kieninger 1.1 }
|
884 marek 1.2.2.5 case RESP_OBJECTS:
|
885 r.kieninger 1.1 {
|
886 marek 1.2.2.5 // TODO: Implement, but how ???
887 break;
|
888 r.kieninger 1.1 }
|
889 marek 1.2.2.5 default:
|
890 r.kieninger 1.1 {
|
891 marek 1.2.2.5 // TODO:
892 // Argl, not nice, but not a problem yet, ignore this
893 break;
|
894 r.kieninger 1.1 }
895 }
896
|
897 marek 1.2.2.5 // remove CIM Encoding flag
898 _encoding &=(!RESP_ENC_CIM);
899 // add SCMO Encoding flag
900 _encoding |=RESP_ENC_SCMO;
|
901 r.kieninger 1.1 }
902
|
903 marek 1.2.2.5
904 // Function to convert a CIMInstance into an SCMOInstance
905 SCMOInstance CIMResponseData::_getSCMOFromCIMInstance(
906 const CIMInstance& cimInst)
|
907 r.kieninger 1.1 {
|
908 marek 1.2.2.5 const CIMObjectPath& cimPath = cimInst.getPath();
|
909 r.kieninger 1.1
|
910 marek 1.2.2.5 const CString nameSpace = cimPath.getNameSpace().getString().getCString();
911 const CString className = cimPath.getClassName().getString().getCString();
912 // TODO: What do when either or both are 0 ?
|
913 r.kieninger 1.1
|
914 marek 1.2.2.5 SCMOClass * scmoClass = _getSCMOClass(
915 (const char*)nameSpace,
916 (const char*)className);
917 // TODO: What do when there is no such class ?
|
918 r.kieninger 1.1
|
919 marek 1.2.2.5 // TODO: Interrogate Thilo about need to call new
920 SCMOInstance scmoInst = SCMOInstance(*scmoClass, cimInst);
|
921 r.kieninger 1.1
|
922 marek 1.2.2.5 return scmoInst;
|
923 r.kieninger 1.1 }
924
|
925 marek 1.2.2.5 // Function to convert a CIMObjectPath into an SCMOInstance
926 SCMOInstance CIMResponseData::_getSCMOFromCIMObjectPath(
927 const CIMObjectPath& cimPath)
|
928 r.kieninger 1.1 {
|
929 marek 1.2.2.5 CString nameSpace = cimPath.getNameSpace().getString().getCString();
930 CString className = cimPath.getClassName().getString().getCString();
|
931 r.kieninger 1.1
|
932 marek 1.2.2.5 // TODO: What do when either or both are 0 ?
|
933 r.kieninger 1.1
|
934 marek 1.2.2.5 SCMOClass * scmoClass = _getSCMOClass(
935 (const char*)nameSpace,
936 (const char*)className);
|
937 r.kieninger 1.1
|
938 marek 1.2.2.5 // TODO: What do when there is no such class ?
|
939 r.kieninger 1.1
|
940 marek 1.2.2.5 // TODO: Interrogate Thilo about need to call new
941 SCMOInstance scmoRef = SCMOInstance(*scmoClass, cimPath);
|
942 r.kieninger 1.1
|
943 marek 1.2.2.5 return scmoRef;
|
944 r.kieninger 1.1 }
945
|
946 marek 1.2.2.5 SCMOClass* CIMResponseData::_getSCMOClass(
947 const char* nameSpace,
948 const char* cls)
|
949 r.kieninger 1.1 {
|
950 marek 1.2.2.5 SCMOClassCache* local = SCMOClassCache::getInstance();
951 return local->getSCMOClass(
952 nameSpace,
953 strlen(nameSpace),
954 cls,
955 strlen(cls));
|
956 r.kieninger 1.1 }
957
958 PEGASUS_NAMESPACE_END
|