1 martin 1.8 //%LICENSE////////////////////////////////////////////////////////////////
|
2 martin 1.9 //
|
3 martin 1.8 // Licensed to The Open Group (TOG) under one or more contributor license
4 // agreements. Refer to the OpenPegasusNOTICE.txt file distributed with
5 // this work for additional information regarding copyright ownership.
6 // Each contributor licenses this file to you under the OpenPegasus Open
7 // Source License; you may not use this file except in compliance with the
8 // License.
|
9 martin 1.9 //
|
10 martin 1.8 // Permission is hereby granted, free of charge, to any person obtaining a
11 // copy of this software and associated documentation files (the "Software"),
12 // to deal in the Software without restriction, including without limitation
13 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
14 // and/or sell copies of the Software, and to permit persons to whom the
15 // Software is furnished to do so, subject to the following conditions:
|
16 martin 1.9 //
|
17 martin 1.8 // The above copyright notice and this permission notice shall be included
18 // in all copies or substantial portions of the Software.
|
19 martin 1.9 //
|
20 martin 1.8 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
21 martin 1.9 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
22 martin 1.8 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
23 // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
24 // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
25 // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
26 // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
27 martin 1.9 //
|
28 martin 1.8 //////////////////////////////////////////////////////////////////////////
|
29 kumpf 1.2 //
30 //%////////////////////////////////////////////////////////////////////////////
31
32 #include <cctype>
33 #include <cstdio>
34 #include <Pegasus/Common/Config.h>
35 #include <Pegasus/Common/Tracer.h>
|
36 dmitry.mikulin 1.3 #include <Pegasus/Common/String.h>
37 #include <Pegasus/Common/StringConversion.h>
|
38 kumpf 1.2 #include <Pegasus/Common/MessageLoader.h>
39 #include <Pegasus/WsmServer/WsmConstants.h>
|
40 mike 1.12 #include <Pegasus/WQL/WQLSelectStatement.h>
41 #include <Pegasus/WQL/WQLParser.h>
|
42 karl 1.14 #include <Pegasus/Common/Tracer.h>
|
43 kumpf 1.2 #include "CimToWsmResponseMapper.h"
44
|
45 carson.hovey 1.4 #ifdef PEGASUS_OS_VMS
46 # define PEGASUS_NAN "NaNQ"
47 # define PEGASUS_INF "Infinity"
48 # define PEGASUS_NEG_INF "-Infinity"
49 #else
50 # define PEGASUS_NAN "nan"
51 # define PEGASUS_INF "inf"
52 # define PEGASUS_NEG_INF "-inf"
53 #endif
54
|
55 dmitry.mikulin 1.3 PEGASUS_USING_STD;
|
56 kumpf 1.2 PEGASUS_NAMESPACE_BEGIN
57
58 CimToWsmResponseMapper::CimToWsmResponseMapper()
59 {
60 }
61
62 CimToWsmResponseMapper::~CimToWsmResponseMapper()
63 {
64 }
65
66 WsmResponse* CimToWsmResponseMapper::mapToWsmResponse(
67 const WsmRequest* wsmRequest,
68 const CIMResponseMessage* message)
69 {
|
70 karl 1.14 PEG_METHOD_ENTER(TRC_WSMSERVER, "CimToWsmResponseMapper::mapToWsmResponse");
|
71 kumpf 1.2 AutoPtr<WsmResponse> wsmResponse;
72
73 if (message->cimException.getCode() != CIM_ERR_SUCCESS)
74 {
75 wsmResponse.reset(_mapToWsmFaultResponse(wsmRequest, message));
76 }
77 else
78 {
|
79 kumpf 1.6 switch (wsmRequest->getType())
|
80 kumpf 1.2 {
|
81 kumpf 1.6 case WS_TRANSFER_GET:
82 wsmResponse.reset(_mapToWxfGetResponse(
83 (WxfGetRequest*) wsmRequest,
|
84 kumpf 1.2 (CIMGetInstanceResponseMessage*) message));
85 break;
86
|
87 kumpf 1.6 case WS_TRANSFER_PUT:
88 wsmResponse.reset(_mapToWxfPutResponse(
89 (WxfPutRequest*) wsmRequest,
|
90 kumpf 1.2 (CIMModifyInstanceResponseMessage*) message));
91 break;
92
|
93 kumpf 1.6 case WS_TRANSFER_CREATE:
94 wsmResponse.reset(_mapToWxfCreateResponse(
95 (WxfCreateRequest*) wsmRequest,
|
96 kumpf 1.2 (CIMCreateInstanceResponseMessage*) message));
97 break;
98
|
99 kumpf 1.6 case WS_TRANSFER_DELETE:
100 wsmResponse.reset(_mapToWxfDeleteResponse(
101 (WxfDeleteRequest*) wsmRequest,
|
102 kumpf 1.2 (CIMDeleteInstanceResponseMessage*) message));
103 break;
104
|
105 kumpf 1.6 case WS_ENUMERATION_ENUMERATE:
|
106 karl 1.14 // Test for no association filter
107 if (((WsenEnumerateRequest*)wsmRequest)->
108 wsmFilter.filterDialect != WsmFilter::ASSOCIATION)
|
109 kumpf 1.6 {
|
110 karl 1.14 if (((WsenEnumerateRequest*) wsmRequest)->enumerationMode ==
111 WSEN_EM_OBJECT)
112 {
113 wsmResponse.reset(_mapToWsenEnumerateResponseObject(
114 (WsenEnumerateRequest*) wsmRequest,
115 (CIMEnumerateInstancesResponseMessage*) message));
116 }
117 else if (((WsenEnumerateRequest*)wsmRequest)->
118 enumerationMode ==
119 WSEN_EM_OBJECT_AND_EPR)
120 {
121 wsmResponse.reset(
122 _mapToWsenEnumerateResponseObjectAndEPR(
123 (WsenEnumerateRequest*) wsmRequest,
124 (CIMEnumerateInstancesResponseMessage*) message));
125 }
126 else if (((WsenEnumerateRequest*) wsmRequest)->
127 enumerationMode == WSEN_EM_EPR)
128 {
129 wsmResponse.reset(_mapToWsenEnumerateResponseEPR(
130 (WsenEnumerateRequest*) wsmRequest,
131 karl 1.14 (CIMEnumerateInstanceNamesResponseMessage*)
132 message));
133 }
134 else
135 {
136 PEGASUS_ASSERT(0);
137 }
|
138 kumpf 1.6 }
|
139 karl 1.14 else // association or reference response expected
|
140 kumpf 1.6 {
|
141 karl 1.14 if (((WsenEnumerateRequest*)wsmRequest)->
142 wsmFilter.AssocFilter.assocFilterType ==
143 WsmFilter::ASSOCIATED_INSTANCES)
144 {
145 // Association responses
146 if (((WsenEnumerateRequest*) wsmRequest)->
147 enumerationMode == WSEN_EM_OBJECT)
148 {
149 wsmResponse.reset(
150 _mapToWsenEnumerateResponseObject(
151 (WsenEnumerateRequest*) wsmRequest,
152 (CIMAssociatorsResponseMessage*) message));
153 }
154 else if (((WsenEnumerateRequest*)
155 wsmRequest)->enumerationMode ==
156 WSEN_EM_OBJECT_AND_EPR)
157 {
158 wsmResponse.reset(
159 _mapToWsenEnumerateResponseObjectAndEPR(
160 (WsenEnumerateRequest*) wsmRequest,
161 (CIMAssociatorsResponseMessage*) message));
162 karl 1.14 }
163 else if (((WsenEnumerateRequest*) wsmRequest)->
164 enumerationMode == WSEN_EM_EPR)
165 {
166 wsmResponse.reset(_mapToWsenEnumerateResponseEPR(
167 (WsenEnumerateRequest*) wsmRequest,
168 (CIMAssociatorNamesResponseMessage*) message));
169 }
170 else
171 {
172 PEGASUS_ASSERT(0);
173 }
174 }
175 else // references responses
176 {
177 if (((WsenEnumerateRequest*)
178 wsmRequest)->enumerationMode == WSEN_EM_OBJECT)
179 {
180 wsmResponse.reset(_mapToWsenEnumerateResponseObject(
181 (WsenEnumerateRequest*) wsmRequest,
182 (CIMReferencesResponseMessage*) message));
183 karl 1.14 }
184 else if (((WsenEnumerateRequest*)
185 wsmRequest)->enumerationMode ==
186 WSEN_EM_OBJECT_AND_EPR)
187 {
188 wsmResponse.reset(
189 _mapToWsenEnumerateResponseObjectAndEPR(
190 (WsenEnumerateRequest*) wsmRequest,
191 (CIMReferencesResponseMessage*) message));
192 }
193 else if (((WsenEnumerateRequest*) wsmRequest)->
194 enumerationMode == WSEN_EM_EPR)
195 {
196 wsmResponse.reset(_mapToWsenEnumerateResponseEPR(
197 (WsenEnumerateRequest*) wsmRequest,
198 (CIMReferenceNamesResponseMessage*) message));
199 }
200 else
201 {
202 PEGASUS_ASSERT(0);
203 }
204 karl 1.14 }
|
205 kumpf 1.6 }
206 break;
207
|
208 mike 1.12 case WS_INVOKE:
209 {
210 wsmResponse.reset(_mapToWsInvokeResponse(
211 (WsInvokeRequest*)wsmRequest,
212 (CIMInvokeMethodResponseMessage*)message));
213 break;
214 }
215
|
216 kumpf 1.2 default:
217 PEGASUS_ASSERT(0);
218 break;
219 }
220 }
|
221 karl 1.14 PEG_METHOD_EXIT();
|
222 kumpf 1.2 return wsmResponse.release();
223 }
224
225 WsmFaultResponse* CimToWsmResponseMapper::_mapToWsmFaultResponse(
226 const WsmRequest* wsmRequest,
227 const CIMResponseMessage* response)
228 {
229 WsmFault fault = mapCimExceptionToWsmFault(response->cimException);
230
231 WsmFaultResponse* wsmResponse = new WsmFaultResponse(wsmRequest, fault);
232
233 return wsmResponse;
234 }
235
236 WsmFault CimToWsmResponseMapper::mapCimExceptionToWsmFault(
237 const CIMException& cimException)
238 {
239 WsmFault::Subcode subcode;
240 const ContentLanguageList& languageList =
241 cimException.getContentLanguages();
242 String reason = TraceableCIMException(cimException).getDescription();
243 kumpf 1.2 String faultDetail;
244
245 switch (cimException.getCode())
246 {
247 case CIM_ERR_FAILED: // Too general to specify fault
248 case CIM_ERR_CLASS_HAS_CHILDREN: // Only ModifyClass and DeleteClass
249 case CIM_ERR_CLASS_HAS_INSTANCES: // Only ModifyClass and DeleteClass
250 case CIM_ERR_INVALID_SUPERCLASS: // Only CreateClass and ModifyClass
251 // These could map to wsa_ActionNotSupported if InvokeMethod is
252 // supported through Custom Actions.
253 case CIM_ERR_METHOD_NOT_FOUND: // Only InvokeMethod
254 case CIM_ERR_METHOD_NOT_AVAILABLE: // Only InvokeMethod
255 case CIM_ERR_NO_SUCH_PROPERTY: // Only GetProperty and SetProperty
256 case CIM_ERR_TYPE_MISMATCH: // Only SetProperty
257 subcode = WsmFault::wsman_InternalError;
258 break;
259
260 case CIM_ERR_ACCESS_DENIED:
261 subcode = WsmFault::wsman_AccessDenied;
262 break;
263
264 kumpf 1.2 case CIM_ERR_ALREADY_EXISTS:
265 subcode = WsmFault::wsman_AlreadyExists;
266 break;
267
268 case CIM_ERR_INVALID_CLASS:
269 subcode = WsmFault::wsa_DestinationUnreachable;
270 faultDetail = WSMAN_FAULTDETAIL_INVALIDRESOURCEURI;
271 break;
272
273 case CIM_ERR_INVALID_NAMESPACE:
274 // Consider wsman_InvalidSelectors?
275 subcode = WsmFault::wsa_DestinationUnreachable;
276 // faultDetail is not set to WSMAN_FAULTDETAIL_INVALIDRESOURCEURI
277 // since this error reflects an incorrect Selector value rather
278 // than an incorrect ResourceURI.
279 break;
280
281 case CIM_ERR_INVALID_PARAMETER:
282 // For InvokeMethod, this would map to wsman_InvalidParameter.
283 // It is difficult to discern the correct fault for other
284 // operations. It make sense to use wxf_InvalidRepresentation for
285 kumpf 1.2 // Create and Put, and wsman_InvalidSelectors for Get and Put.
286 subcode = WsmFault::wsman_InvalidParameter;
287 break;
288
289 case CIM_ERR_INVALID_QUERY:
290 // Note that Enumerate operations have a different subcode:
291 // wsen_CannotProcessFilter.
292 subcode = WsmFault::wsen_CannotProcessFilter;
293 break;
294
295 case CIM_ERR_NOT_FOUND:
296 // DSP0226 Table 10 of master faults calls for
|
297 karl 1.14 // DestinationUnreachable in cases when the resource is not found.
|
298 kumpf 1.2 subcode = WsmFault::wsa_DestinationUnreachable;
299 break;
300
301 case CIM_ERR_NOT_SUPPORTED:
302 subcode = WsmFault::wsa_ActionNotSupported;
303 faultDetail = WSMAN_FAULTDETAIL_ACTIONMISMATCH;
304 break;
305
306 case CIM_ERR_QUERY_LANGUAGE_NOT_SUPPORTED:
307 // DSP0227 section 15.1.11 indicates that ExecuteQuery operations
308 // through WS-Management use CQL filter dialect. If this status
309 // code results, it is fair to assume filtering is not supported
310 // at all. Another option would be to use
311 // wsen_FilterDialectRequestedUnavailable.
312 subcode = WsmFault::wsen_FilteringNotSupported;
313 break;
314
315 default:
|
316 mike 1.12 // Initialize to prevent uninitialized subcode error.
317 subcode = WsmFault::wsman_InternalError;
|
318 kumpf 1.2 PEGASUS_ASSERT(0);
319 }
320
321 return WsmFault(subcode, reason, languageList, faultDetail);
322 }
323
|
324 kumpf 1.6 WxfGetResponse* CimToWsmResponseMapper::_mapToWxfGetResponse(
325 const WxfGetRequest* wsmRequest,
|
326 r.kieninger 1.11 CIMGetInstanceResponseMessage* response)
|
327 kumpf 1.2 {
328 WsmInstance wsmInstance;
329
|
330 r.kieninger 1.11 convertCimToWsmInstance(
|
331 mike 1.12 wsmRequest->epr.resourceUri,
|
332 thilo.boehm 1.13 response->getResponseData().getInstance(),
|
333 r.kieninger 1.11 wsmInstance,
|
334 kumpf 1.6 wsmRequest->epr.getNamespace());
|
335 kumpf 1.2
|
336 kumpf 1.6 WxfGetResponse* wsmResponse =
337 new WxfGetResponse(
|
338 kumpf 1.2 wsmInstance,
339 wsmRequest,
340 _getContentLanguages(response->operationContext));
341
342 return wsmResponse;
343 }
344
|
345 kumpf 1.6 WxfPutResponse* CimToWsmResponseMapper::_mapToWxfPutResponse(
346 const WxfPutRequest* wsmRequest,
|
347 kumpf 1.2 const CIMModifyInstanceResponseMessage* response)
348 {
|
349 kumpf 1.6 WxfPutResponse* wsmResponse =
350 new WxfPutResponse(
|
351 kumpf 1.2 wsmRequest,
352 _getContentLanguages(response->operationContext));
353
354 return wsmResponse;
355 }
356
|
357 kumpf 1.6 WxfCreateResponse* CimToWsmResponseMapper::_mapToWxfCreateResponse(
358 const WxfCreateRequest* wsmRequest,
|
359 kumpf 1.2 const CIMCreateInstanceResponseMessage* response)
360 {
361 WsmEndpointReference epr;
362
|
363 mike 1.12 convertObjPathToEPR(
364 wsmRequest->epr.resourceUri,
365 response->instanceName,
366 epr,
|
367 kumpf 1.6 wsmRequest->epr.getNamespace());
|
368 kumpf 1.2
|
369 kumpf 1.6 WxfCreateResponse* wsmResponse =
370 new WxfCreateResponse(
|
371 kumpf 1.2 epr,
372 wsmRequest,
373 _getContentLanguages(response->operationContext));
374
375 return wsmResponse;
376 }
377
|
378 kumpf 1.6 WxfDeleteResponse* CimToWsmResponseMapper::_mapToWxfDeleteResponse(
379 const WxfDeleteRequest* wsmRequest,
|
380 kumpf 1.2 const CIMDeleteInstanceResponseMessage* response)
381 {
|
382 kumpf 1.6 WxfDeleteResponse* wsmResponse =
383 new WxfDeleteResponse(
384 wsmRequest,
385 _getContentLanguages(response->operationContext));
386
387 return wsmResponse;
388 }
389
|
390 kumpf 1.10 WsenEnumerateResponse*
|
391 kumpf 1.6 CimToWsmResponseMapper::_mapToWsenEnumerateResponseObject(
392 const WsenEnumerateRequest* wsmRequest,
|
393 r.kieninger 1.11 CIMEnumerateInstancesResponseMessage* response)
|
394 kumpf 1.6 {
|
395 karl 1.14 PEG_METHOD_ENTER(TRC_WSMSERVER,
396 "CimToWsmResponseMapper::_mapToWsenEnumerateResponseObject");
|
397 kumpf 1.6 Array<WsmInstance> instances;
398 Array<WsmEndpointReference> EPRs;
|
399 mike 1.12 Array<CIMInstance>& namedInstances =
|
400 thilo.boehm 1.13 response->getResponseData().getInstances();
|
401 mike 1.12
|
402 karl 1.14 PEG_TRACE((TRC_WSMSERVER, Tracer::LEVEL4,
403 "EnumerateInstances Returned %u instances",namedInstances.size() ));
404
405 // if WQLFilter type
406 if (wsmRequest->wsmFilter.filterDialect == WsmFilter::WQL)
|
407 kumpf 1.6 {
|
408 mike 1.12 // Filter out unwanted instances:
409
410 for (Uint32 i = 0; i < namedInstances.size(); i++)
411 {
412 try
413 {
|
414 karl 1.14 if (!wsmRequest->wsmFilter.WQLFilter.selectStatement->
415 evaluate(namedInstances[i]))
416 {
|
417 mike 1.12 continue;
|
418 karl 1.14 }
|
419 mike 1.12 }
420 catch (...)
421 {
422 // This error is unreportable since all other instance
423 // would have to be aborted.
424 continue;
425 }
426
427 CIMInstance instance = namedInstances[i].clone();
428
429 try
430 {
|
431 karl 1.14 wsmRequest->wsmFilter.WQLFilter.selectStatement->
432 applyProjection(instance, false);
|
433 mike 1.12 }
434 catch (...)
435 {
436 // Ignore missing properties.
437 continue;
438 }
439
440 WsmInstance wsmInstance;
441 convertCimToWsmInstance(
442 wsmRequest->epr.resourceUri,
443 instance,
444 wsmInstance,
445 wsmRequest->epr.getNamespace());
446 instances.append(wsmInstance);
447 }
448
449 WsenEnumerateResponse* wsmResponse =
450 new WsenEnumerateResponse(
451 instances,
452 instances.size(),
453 wsmRequest,
454 mike 1.12 _getContentLanguages(response->operationContext));
|
455 karl 1.14 PEG_METHOD_EXIT();
|
456 mike 1.12 return wsmResponse;
|
457 kumpf 1.6 }
|
458 mike 1.12 else
459 {
460 for (Uint32 i = 0; i < namedInstances.size(); i++)
461 {
462 WsmInstance wsmInstance;
463 convertCimToWsmInstance(
464 wsmRequest->epr.resourceUri,
465 namedInstances[i],
466 wsmInstance,
467 wsmRequest->epr.getNamespace());
468 instances.append(wsmInstance);
469 }
470
471 WsenEnumerateResponse* wsmResponse =
472 new WsenEnumerateResponse(
473 instances,
474 instances.size(),
475 wsmRequest,
476 _getContentLanguages(response->operationContext));
|
477 kumpf 1.6
|
478 karl 1.14 PEG_METHOD_EXIT();
|
479 mike 1.12 return wsmResponse;
480 }
|
481 kumpf 1.6 }
482
|
483 kumpf 1.10 WsenEnumerateResponse*
|
484 kumpf 1.6 CimToWsmResponseMapper::_mapToWsenEnumerateResponseObjectAndEPR(
485 const WsenEnumerateRequest* wsmRequest,
|
486 r.kieninger 1.11 CIMEnumerateInstancesResponseMessage* response)
|
487 kumpf 1.6 {
|
488 karl 1.14 PEG_METHOD_ENTER(TRC_WSMSERVER,
489 "CimToWsmResponseMapper::_mapToWsenEnumerateResponseObjectAndEPR");
490
|
491 kumpf 1.6 Array<WsmInstance> instances;
492 Array<WsmEndpointReference> EPRs;
|
493 r.kieninger 1.11 Array<CIMInstance>& namedInstances =
|
494 thilo.boehm 1.13 response->getResponseData().getInstances();
|
495 karl 1.14
496 PEG_TRACE((TRC_WSMSERVER, Tracer::LEVEL4,
497 "EnumerateInstances Returned %u instances ",namedInstances.size() ));
498
|
499 r.kieninger 1.11 for (Uint32 i = 0; i < namedInstances.size(); i++)
|
500 kumpf 1.6 {
501 WsmInstance wsmInstance;
|
502 mike 1.12 convertCimToWsmInstance(
503 wsmRequest->epr.resourceUri,
504 namedInstances[i],
505 wsmInstance,
|
506 kumpf 1.6 wsmRequest->epr.getNamespace());
507 instances.append(wsmInstance);
508
509 WsmEndpointReference epr;
|
510 mike 1.12 convertObjPathToEPR(
511 wsmRequest->epr.resourceUri,
512 namedInstances[i].getPath(),
513 epr,
|
514 kumpf 1.6 wsmRequest->epr.getNamespace());
515 EPRs.append(epr);
516 }
517
518 WsenEnumerateResponse* wsmResponse =
519 new WsenEnumerateResponse(
520 instances,
521 EPRs,
522 instances.size(),
523 wsmRequest,
524 _getContentLanguages(response->operationContext));
|
525 karl 1.14 PEG_METHOD_EXIT();
|
526 kumpf 1.6 return wsmResponse;
527 }
528
|
529 karl 1.14 /****************************************************************************
530 **
531 ** _mapToWsenEnumerateResponse for enumerateInstances and
532 ** EnumerateInstanceNames responses
533 **
534 ******************************************************************************/
|
535 kumpf 1.10 WsenEnumerateResponse*
|
536 kumpf 1.6 CimToWsmResponseMapper::_mapToWsenEnumerateResponseEPR(
537 const WsenEnumerateRequest* wsmRequest,
|
538 r.kieninger 1.11 CIMEnumerateInstanceNamesResponseMessage* response)
|
539 kumpf 1.6 {
|
540 karl 1.14 PEG_METHOD_ENTER(TRC_WSMSERVER,
541 "CimToWsmResponseMapper::_mapToWsenEnumerateResponseEPR");
542
|
543 kumpf 1.6 Array<WsmEndpointReference> EPRs;
|
544 thilo.boehm 1.13 Array<CIMObjectPath>& instanceNames =
545 response->getResponseData().getInstanceNames();
|
546 karl 1.14
547 PEG_TRACE((TRC_WSMSERVER, Tracer::LEVEL4,
548 "EnumerateInstanceNames Returned %u instanceNames ",
549 instanceNames.size() ));
550
|
551 thilo.boehm 1.13 for (Uint32 i = 0; i < instanceNames.size(); i++)
|
552 kumpf 1.6 {
553 WsmEndpointReference epr;
|
554 mike 1.12 convertObjPathToEPR(
555 wsmRequest->epr.resourceUri,
|
556 thilo.boehm 1.13 instanceNames[i],
|
557 mike 1.12 epr,
|
558 kumpf 1.6 wsmRequest->epr.getNamespace());
559 EPRs.append(epr);
560 }
561
562 WsenEnumerateResponse* wsmResponse =
563 new WsenEnumerateResponse(
564 EPRs,
565 EPRs.size(),
|
566 kumpf 1.2 wsmRequest,
567 _getContentLanguages(response->operationContext));
|
568 karl 1.14 PEG_METHOD_EXIT();
569 return wsmResponse;
570 }
571
572 /****************************************************************************
573 **
574 ** _mapToWsenEnumerateResponse for CIM Reference and ReferenceNames
575 ** responses
576 **
577 ******************************************************************************/
578 WsenEnumerateResponse*
579 CimToWsmResponseMapper::_mapToWsenEnumerateResponseObject(
580 const WsenEnumerateRequest* wsmRequest,
581 CIMReferencesResponseMessage* response)
582 {
583 PEG_METHOD_ENTER(TRC_WSMSERVER,
584 "CimToWsmResponseMapper::_mapToWsenEnumerateResponseObject");
585
586 Array<WsmInstance> instances;
587 Array<WsmEndpointReference> EPRs;
588 Array<CIMObject>& objects =
589 karl 1.14 response->getResponseData().getObjects();
590
591 PEG_TRACE((TRC_WSMSERVER, Tracer::LEVEL4,
592 "References Returned %u objects ",objects.size() ));
593
594 for (Uint32 i = 0; i < objects.size(); i++)
595 {
596 WsmInstance wsmInstance;
597 convertCimToWsmInstance(
598 wsmRequest->wsmFilter.AssocFilter.object.resourceUri,
599 (CIMInstance)objects[i],
600 wsmInstance,
601 wsmRequest->wsmFilter.AssocFilter.object.getNamespace());
602 instances.append(wsmInstance);
603 }
604
605 WsenEnumerateResponse* wsmResponse =
606 new WsenEnumerateResponse(
607 instances,
608 instances.size(),
609 wsmRequest,
610 karl 1.14 _getContentLanguages(response->operationContext));
|
611 kumpf 1.2
|
612 karl 1.14 PEG_METHOD_EXIT();
613 return wsmResponse;
614 }
615
616 WsenEnumerateResponse*
617 CimToWsmResponseMapper::_mapToWsenEnumerateResponseObjectAndEPR(
618 const WsenEnumerateRequest* wsmRequest,
619 CIMReferencesResponseMessage* response)
620 {
621 PEG_METHOD_ENTER(TRC_WSMSERVER,
622 "CimToWsmResponseMapper::_mapToWsenEnumerateResponseObjectAndEPR");
623
624 Array<WsmInstance> instances;
625 Array<WsmEndpointReference> EPRs;
626 Array<CIMObject>& objects =
627 response->getResponseData().getObjects();
628
629 PEG_TRACE((TRC_WSMSERVER, Tracer::LEVEL4,
630 "Returned %u objects from References ",objects.size() ));
631
632 for (Uint32 i = 0; i < objects.size(); i++)
633 karl 1.14 {
634 WsmInstance wsmInstance;
635
636 convertCimToWsmInstance(
637 wsmRequest->wsmFilter.AssocFilter.object.resourceUri,
638 (CIMInstance)objects[i],
639 wsmInstance,
640 wsmRequest->wsmFilter.AssocFilter.object.getNamespace());
641 instances.append(wsmInstance);
642
643 WsmEndpointReference epr;
644 convertObjPathToEPR(
645 wsmRequest->wsmFilter.AssocFilter.object.resourceUri,
646 objects[i].getPath(),
647 epr,
648 wsmRequest->wsmFilter.AssocFilter.object.getNamespace());
649 EPRs.append(epr);
650 }
651
652 WsenEnumerateResponse* wsmResponse =
653 new WsenEnumerateResponse(
654 karl 1.14 instances,
655 EPRs,
656 instances.size(),
657 wsmRequest,
658 _getContentLanguages(response->operationContext));
659 PEG_METHOD_EXIT();
660 return wsmResponse;
661 }
662
663 WsenEnumerateResponse*
664 CimToWsmResponseMapper::_mapToWsenEnumerateResponseEPR(
665 const WsenEnumerateRequest* wsmRequest,
666 CIMReferenceNamesResponseMessage* response)
667 {
668 PEG_METHOD_ENTER(TRC_WSMSERVER,
669 "CimToWsmResponseMapper::_mapToWsenEnumerateResponseEPR");
670
671 Array<WsmEndpointReference> EPRs;
672 Array<CIMObjectPath>& instanceNames =
673 response->getResponseData().getInstanceNames();
674
675 karl 1.14 PEG_TRACE((TRC_WSMSERVER, Tracer::LEVEL4,
676 "Returned %u names from ReferenceNames ",instanceNames.size() ));
677
678 for (Uint32 i = 0; i < instanceNames.size(); i++)
679 {
680 WsmEndpointReference epr;
681
682 convertObjPathToEPR(
683 wsmRequest->wsmFilter.AssocFilter.object.resourceUri,
684 instanceNames[i],
685 epr,
686 wsmRequest->wsmFilter.AssocFilter.object.getNamespace());
687 EPRs.append(epr);
688 }
689
690 WsenEnumerateResponse* wsmResponse =
691 new WsenEnumerateResponse(
692 EPRs,
693 EPRs.size(),
694 wsmRequest,
695 _getContentLanguages(response->operationContext));
696 karl 1.14 PEG_METHOD_EXIT();
697 return wsmResponse;
698 }
699
700 /****************************************************************************
701 **
702 ** _mapToWsenEnumerateResponse for Associator and AssociatorNames
703 ** responses
704 **
705 ******************************************************************************/
706 WsenEnumerateResponse*
707 CimToWsmResponseMapper::_mapToWsenEnumerateResponseObject(
708 const WsenEnumerateRequest* wsmRequest,
709 CIMAssociatorsResponseMessage* response)
710 {
711 PEG_METHOD_ENTER(TRC_WSMSERVER,
712 "CimToWsmResponseMapper::_mapToWsenEnumerateResponseObject");
713 Array<WsmInstance> instances;
714 Array<WsmEndpointReference> EPRs;
715 Array<CIMObject>& objects =
716 response->getResponseData().getObjects();
717 karl 1.14
718 for (Uint32 i = 0; i < objects.size(); i++)
719 {
720 WsmInstance wsmInstance;
721 convertCimToWsmInstance(
722 wsmRequest->epr.resourceUri,
723 (CIMInstance)objects[i],
724 wsmInstance,
725 wsmRequest->epr.getNamespace());
726 instances.append(wsmInstance);
727 }
728
729 WsenEnumerateResponse* wsmResponse =
730 new WsenEnumerateResponse(
731 instances,
732 instances.size(),
733 wsmRequest,
734 _getContentLanguages(response->operationContext));
735 PEG_METHOD_EXIT();
736 return wsmResponse;
737 }
738 karl 1.14
739 WsenEnumerateResponse*
740 CimToWsmResponseMapper::_mapToWsenEnumerateResponseObjectAndEPR(
741 const WsenEnumerateRequest* wsmRequest,
742 CIMAssociatorsResponseMessage* response)
743 {
744 PEG_METHOD_ENTER(TRC_WSMSERVER,
745 "CimToWsmResponseMapper::_mapToWsenEnumerateResponseObjectAndEPR");
746 Array<WsmInstance> instances;
747 Array<WsmEndpointReference> EPRs;
748 Array<CIMObject>& objects =
749 response->getResponseData().getObjects();
750
751 PEG_TRACE((TRC_WSMSERVER, Tracer::LEVEL4,
752 "Returned %u objects from Associators",objects.size() ));
753
754 for (Uint32 i = 0; i < objects.size(); i++)
755 {
756 WsmInstance wsmInstance;
757
758 convertCimToWsmInstance(
759 karl 1.14 wsmRequest->wsmFilter.AssocFilter.object.resourceUri,
760 (CIMInstance)objects[i],
761 wsmInstance,
762 wsmRequest->wsmFilter.AssocFilter.object.getNamespace());
763 instances.append(wsmInstance);
764
765 WsmEndpointReference epr;
766 convertObjPathToEPR(
767 wsmRequest->wsmFilter.AssocFilter.object.resourceUri,
768 objects[i].getPath(),
769 epr,
770 wsmRequest->wsmFilter.AssocFilter.object.getNamespace());
771 EPRs.append(epr);
772 }
773
774 WsenEnumerateResponse* wsmResponse =
775 new WsenEnumerateResponse(
776 instances,
777 EPRs,
778 instances.size(),
779 wsmRequest,
780 karl 1.14 _getContentLanguages(response->operationContext));
781
782 PEG_METHOD_EXIT();
783 return wsmResponse;
784 }
785
786 WsenEnumerateResponse*
787 CimToWsmResponseMapper::_mapToWsenEnumerateResponseEPR(
788 const WsenEnumerateRequest* wsmRequest,
789 CIMAssociatorNamesResponseMessage* response)
790 {
791 PEG_METHOD_ENTER(TRC_WSMSERVER,
792 "CimToWsmResponseMapper::_mapToWsenEnumerateResponseEPR");
793
794 Array<WsmEndpointReference> EPRs;
795 Array<CIMObjectPath>& instanceNames =
796 response->getResponseData().getInstanceNames();
797
798 PEG_TRACE((TRC_WSMSERVER, Tracer::LEVEL4,
799 "Returned %u instanceNames",instanceNames.size() ));
800
801 karl 1.14 for (Uint32 i = 0; i < instanceNames.size(); i++)
802 {
803 WsmEndpointReference epr;
804
805 convertObjPathToEPR(
806 wsmRequest->wsmFilter.AssocFilter.object.resourceUri,
807 instanceNames[i],
808 epr,
809 wsmRequest->wsmFilter.AssocFilter.object.getNamespace());
810 EPRs.append(epr);
811 }
812
813 WsenEnumerateResponse* wsmResponse =
814 new WsenEnumerateResponse(
815 EPRs,
816 EPRs.size(),
817 wsmRequest,
818 _getContentLanguages(response->operationContext));
819 PEG_METHOD_EXIT();
|
820 kumpf 1.2 return wsmResponse;
821 }
822
|
823 mike 1.12 WsInvokeResponse* CimToWsmResponseMapper::_mapToWsInvokeResponse(
824 const WsInvokeRequest* wsmRequest,
825 const CIMInvokeMethodResponseMessage* response)
826 {
|
827 karl 1.14 PEG_METHOD_ENTER(TRC_WSMSERVER,
828 "CimToWsmResponseMapper::_mapToWsInvokeResponse");
829
|
830 mike 1.12 WsmInstance wsmInstance;
831 String nameSpace = wsmRequest->epr.getNamespace();
832
833 convertCimToWsmParameters(
834 wsmRequest->epr.resourceUri,
835 nameSpace,
836 response->outParameters,
837 response->retValue,
838 wsmInstance);
839
840 WsInvokeResponse* wsmResponse =
841 new WsInvokeResponse(
842 nameSpace,
843 wsmRequest->className,
844 response->methodName.getString(),
845 wsmInstance,
846 wsmRequest,
847 _getContentLanguages(response->operationContext));
|
848 karl 1.14 PEG_METHOD_EXIT();
|
849 mike 1.12 return wsmResponse;
850 }
851
|
852 kumpf 1.2 void CimToWsmResponseMapper::convertCimToWsmInstance(
|
853 mike 1.12 const String& resourceUri,
|
854 kumpf 1.7 const CIMConstInstance& cimInstance,
|
855 kumpf 1.6 WsmInstance& wsmInstance,
856 const String& nameSpace)
|
857 kumpf 1.2 {
858 wsmInstance.setClassName(cimInstance.getClassName().getString());
859
860 for (Uint32 i = 0, n = cimInstance.getPropertyCount(); i < n; i++)
861 {
862 CIMConstProperty cimProperty = cimInstance.getProperty(i);
863 const String& propertyName = cimProperty.getName().getString();
864 const CIMValue& cimValue = cimProperty.getValue();
865
866 WsmValue wsmValue;
|
867 mike 1.12 convertCimToWsmValue(resourceUri, cimValue, wsmValue, nameSpace);
|
868 kumpf 1.2
869 WsmProperty wsmProperty(propertyName, wsmValue);
870 wsmInstance.addProperty(wsmProperty);
871 }
872 }
873
874 template<class T>
875 static void _convertCimToWsmArrayValue(
876 const CIMValue& cimValue,
877 WsmValue& wsmValue)
878 {
879 Array<T> arr;
880 Array<String> strs;
881
882 cimValue.get(arr);
883 for (Uint32 i = 0, n = arr.size(); i < n; i++)
884 {
885 CIMValue val(arr[i]);
886 String str(val.toString());
887 if (val.getType() == CIMTYPE_BOOLEAN)
888 {
889 kumpf 1.2 str.toLower();
890 }
891 strs.append(str);
892 }
893 wsmValue.set(strs);
894 }
895
896 void CimToWsmResponseMapper::convertCimToWsmValue(
|
897 mike 1.12 const String& resourceUri,
|
898 kumpf 1.2 const CIMValue& cimValue,
|
899 kumpf 1.6 WsmValue& wsmValue,
900 const String& nameSpace)
|
901 kumpf 1.2 {
902 if (cimValue.isNull())
903 {
904 wsmValue.setNull();
905 return;
906 }
907
908 if (cimValue.isArray())
909 {
910 switch (cimValue.getType())
911 {
912 case CIMTYPE_BOOLEAN:
913 {
914 _convertCimToWsmArrayValue<Boolean>(cimValue, wsmValue);
915 break;
916 }
917
918 case CIMTYPE_UINT8:
919 {
920 _convertCimToWsmArrayValue<Uint8>(cimValue, wsmValue);
921 break;
922 kumpf 1.2 }
923
924 case CIMTYPE_SINT8:
925 {
926 _convertCimToWsmArrayValue<Sint8>(cimValue, wsmValue);
927 break;
928 }
929
930 case CIMTYPE_UINT16:
931 {
932 _convertCimToWsmArrayValue<Uint16>(cimValue, wsmValue);
933 break;
934 }
935
936 case CIMTYPE_SINT16:
937 {
938 _convertCimToWsmArrayValue<Sint16>(cimValue, wsmValue);
939 break;
940 }
941
942 case CIMTYPE_UINT32:
943 kumpf 1.2 {
944 _convertCimToWsmArrayValue<Uint32>(cimValue, wsmValue);
945 break;
946 }
947
948 case CIMTYPE_SINT32:
949 {
950 _convertCimToWsmArrayValue<Sint32>(cimValue, wsmValue);
951 break;
952 }
953
954 case CIMTYPE_UINT64:
955 {
956 _convertCimToWsmArrayValue<Uint64>(cimValue, wsmValue);
957 break;
958 }
959
960 case CIMTYPE_SINT64:
961 {
962 _convertCimToWsmArrayValue<Sint64>(cimValue, wsmValue);
963 break;
964 kumpf 1.2 }
965
966 case CIMTYPE_REAL32:
967 {
968 _convertCimToWsmArrayValue<Real32>(cimValue, wsmValue);
969 break;
970 }
971
972 case CIMTYPE_REAL64:
973 {
974 _convertCimToWsmArrayValue<Real64>(cimValue, wsmValue);
975 break;
976 }
977
978 case CIMTYPE_CHAR16:
979 {
980 _convertCimToWsmArrayValue<Char16>(cimValue, wsmValue);
981 break;
982 }
983
984 case CIMTYPE_STRING:
985 kumpf 1.2 {
986 _convertCimToWsmArrayValue<String>(cimValue, wsmValue);
987 break;
988 }
989
990 case CIMTYPE_DATETIME:
991 {
992 Array<CIMDateTime> dates;
993 Array<String> strs;
994 cimValue.get(dates);
995 for (Uint32 i = 0, n = dates.size(); i < n; i++)
996 {
|
997 dmitry.mikulin 1.3 String wsmDT;
998 convertCimToWsmDatetime(dates[i], wsmDT);
999 strs.append(wsmDT);
|
1000 kumpf 1.2 }
1001 wsmValue.set(strs);
1002 break;
1003 }
1004
1005 case CIMTYPE_REFERENCE:
1006 {
1007 Array<WsmEndpointReference> eprs;
1008 Array<CIMObjectPath> objPaths;
1009 cimValue.get(objPaths);
1010
1011 for (Uint32 i = 0, n = objPaths.size(); i < n; i++)
1012 {
1013 WsmEndpointReference epr;
|
1014 mike 1.12 convertObjPathToEPR(resourceUri, objPaths[i], epr,
1015 nameSpace);
|
1016 kumpf 1.2 eprs.append(epr);
1017 }
1018 wsmValue.set(eprs);
1019 break;
1020 }
1021
1022 case CIMTYPE_OBJECT:
1023 {
1024 Array<WsmInstance> wsmInstances;
1025 Array<CIMObject> cimObjects;
1026 cimValue.get(cimObjects);
1027 for (Uint32 i = 0, n = cimObjects.size(); i < n; i++)
1028 {
1029 if (cimObjects[i].isInstance())
1030 {
1031 WsmInstance wsmInstance;
1032 convertCimToWsmInstance(
|
1033 mike 1.12 resourceUri,
|
1034 kumpf 1.10 CIMInstance(cimObjects[i]),
1035 wsmInstance,
|
1036 kumpf 1.6 nameSpace);
|
1037 kumpf 1.2 wsmInstances.append(wsmInstance);
1038 }
1039 else
1040 {
1041 throw WsmFault(WsmFault::wsman_InternalError,
1042 MessageLoaderParms(
1043 "WsmServer.CimToWsmResponseMapper."
1044 "EMBEDDED_CLASS_NOT_SUPPORTED",
1045 "Embedded class objects in WS-Management "
1046 "responses are not supported."));
1047 }
1048 }
1049 wsmValue.set(wsmInstances);
1050 break;
1051 }
1052
1053 case CIMTYPE_INSTANCE:
1054 {
1055 Array<WsmInstance> wsmInstances;
1056 Array<CIMInstance> cimInstances;
1057 cimValue.get(cimInstances);
1058 kumpf 1.2 for (Uint32 i = 0, n = cimInstances.size(); i < n; i++)
1059 {
1060 WsmInstance wsmInstance;
|
1061 kumpf 1.6 convertCimToWsmInstance(
|
1062 mike 1.12 resourceUri,
1063 cimInstances[i],
1064 wsmInstance,
1065 nameSpace);
|
1066 kumpf 1.2 wsmInstances.append(wsmInstance);
1067 }
1068 wsmValue.set(wsmInstances);
1069 break;
1070 }
1071
1072 default:
1073 {
1074 PEGASUS_ASSERT(0);
1075 }
1076 }
1077 }
1078 else
1079 {
1080 switch (cimValue.getType())
1081 {
1082 case CIMTYPE_BOOLEAN:
1083 {
1084 String str(cimValue.toString());
1085 str.toLower();
1086 wsmValue.set(str);
1087 kumpf 1.2 break;
1088 }
1089 case CIMTYPE_UINT8:
1090 case CIMTYPE_SINT8:
1091 case CIMTYPE_UINT16:
1092 case CIMTYPE_SINT16:
1093 case CIMTYPE_UINT32:
1094 case CIMTYPE_SINT32:
1095 case CIMTYPE_UINT64:
1096 case CIMTYPE_SINT64:
|
1097 dmitry.mikulin 1.3 case CIMTYPE_CHAR16:
1098 case CIMTYPE_STRING:
1099 {
1100 wsmValue.set(cimValue.toString());
1101 break;
1102 }
|
1103 kumpf 1.2 case CIMTYPE_REAL32:
1104 case CIMTYPE_REAL64:
|
1105 dmitry.mikulin 1.3 {
1106 String str(cimValue.toString());
|
1107 carson.hovey 1.4 if (String::compareNoCase(str, PEGASUS_NAN) == 0)
|
1108 dmitry.mikulin 1.3 wsmValue.set("NaN");
|
1109 carson.hovey 1.4 else if (String::compareNoCase(str, PEGASUS_INF) == 0)
|
1110 dmitry.mikulin 1.3 wsmValue.set("INF");
|
1111 carson.hovey 1.4 else if (String::compareNoCase(str, PEGASUS_NEG_INF) == 0)
|
1112 dmitry.mikulin 1.3 wsmValue.set("-INF");
1113 else
1114 wsmValue.set(str);
1115 break;
1116 }
|
1117 kumpf 1.2 case CIMTYPE_DATETIME:
1118 {
|
1119 dmitry.mikulin 1.3 String wsmDT;
1120 CIMDateTime cimDT;
1121 cimValue.get(cimDT);
1122 convertCimToWsmDatetime(cimDT, wsmDT);
1123 wsmValue.set(wsmDT);
|
1124 kumpf 1.2 break;
1125 }
1126 case CIMTYPE_REFERENCE:
1127 {
1128 WsmEndpointReference epr;
1129 CIMObjectPath objPath;
1130 cimValue.get(objPath);
|
1131 mike 1.12 convertObjPathToEPR(resourceUri, objPath, epr, nameSpace);
|
1132 kumpf 1.2 wsmValue.set(epr);
1133 break;
1134 }
1135 case CIMTYPE_OBJECT:
1136 {
1137 CIMObject cimObject;
1138 cimValue.get(cimObject);
1139 if (cimObject.isInstance())
1140 {
1141 WsmInstance wsmInstance;
1142 convertCimToWsmInstance(
|
1143 mike 1.12 resourceUri,
|
1144 kumpf 1.6 CIMInstance(cimObject), wsmInstance, nameSpace);
|
1145 kumpf 1.2 wsmValue.set(wsmInstance);
1146 }
1147 else
1148 {
1149 throw WsmFault(WsmFault::wsman_InternalError,
1150 MessageLoaderParms(
1151 "WsmServer.CimToWsmResponseMapper."
1152 "EMBEDDED_CLASS_NOT_SUPPORTED",
1153 "Embedded class objects in WS-Management "
1154 "responses are not supported"));
1155 }
1156 break;
1157 }
1158 case CIMTYPE_INSTANCE:
1159 {
1160 WsmInstance wsmInstance;
1161 CIMInstance cimInstance;
1162 cimValue.get(cimInstance);
|
1163 mike 1.12 convertCimToWsmInstance(
1164 resourceUri, cimInstance, wsmInstance, nameSpace);
|
1165 kumpf 1.2 wsmValue.set(wsmInstance);
1166 break;
1167 }
1168 default:
1169 {
1170 PEGASUS_ASSERT(0);
1171 }
1172 }
1173 }
1174 }
1175
1176 void CimToWsmResponseMapper::convertObjPathToEPR(
|
1177 mike 1.12 const String& resourceUri,
|
1178 kumpf 1.2 const CIMObjectPath& objPath,
|
1179 kumpf 1.6 WsmEndpointReference& epr,
1180 const String& nameSpace)
|
1181 kumpf 1.2 {
1182 // Since the connection protocol is unknown at this point, we assume
1183 // it's http and form an EPR address by concatenating "http://" with
1184 // the host name in the object path, with "/wsman".
1185 if (objPath.getHost().size() > 0)
1186 epr.address = "http://" + objPath.getHost() + "/wsman";
1187 else
1188 epr.address = WSM_ADDRESS_ANONYMOUS;
1189
|
1190 mike 1.12 epr.resourceUri = WsmUtils::getRootResourceUri(resourceUri) + "/" +
|
1191 kumpf 1.2 objPath.getClassName().getString();
1192
1193 CIMNamespaceName cimNS = objPath.getNameSpace();
1194 if (!cimNS.isNull())
1195 {
1196 WsmSelector selector(String("__cimnamespace"), cimNS.getString());
1197 epr.selectorSet->selectors.append(selector);
1198 }
|
1199 kumpf 1.6 else
1200 {
1201 WsmSelector selector(String("__cimnamespace"), nameSpace);
1202 epr.selectorSet->selectors.append(selector);
1203 }
|
1204 kumpf 1.2
1205 const Array<CIMKeyBinding>& keyBindings = objPath.getKeyBindings();
1206 for (Uint32 i = 0, n = keyBindings.size(); i < n; i++)
1207 {
1208 CIMKeyBinding binding = keyBindings[i];
1209 if (binding.getType() == CIMKeyBinding::REFERENCE)
1210 {
1211 CIMObjectPath cimRef = binding.getValue();
1212 WsmEndpointReference wsmRef;
|
1213 mike 1.12 convertObjPathToEPR(resourceUri, cimRef, wsmRef, nameSpace);
|
1214 kumpf 1.2 WsmSelector selector(binding.getName().getString(), wsmRef);
1215 epr.selectorSet->selectors.append(selector);
1216 }
1217 else
1218 {
1219 WsmSelector selector(binding.getName().getString(),
1220 binding.getValue());
1221 epr.selectorSet->selectors.append(selector);
1222 }
1223 }
1224 }
1225
|
1226 dmitry.mikulin 1.3 void CimToWsmResponseMapper::convertCimToWsmDatetime(
1227 const CIMDateTime& cimDT, String& wsmDT)
1228 {
1229 char buffer[50];
1230 Uint32 size;
1231
1232 String cimStrDT = cimDT.toString();
1233 CString cimCStrDT = cimStrDT.getCString();
1234 const char* cimStr = (const char*) cimCStrDT;
1235 Uint32 firstAsteriskPos = cimStrDT.find('*');
1236
|
1237 kumpf 1.10 // DSP0230.
|
1238 dmitry.mikulin 1.3 // 1. If CIM datetime string contains ":", use Interval cim:cimDateTime
1239 // element.
1240 // 2. If CIM datetime string contains "+" or "-" and does not contain any
1241 // asterisks, use Datetime cim:cimDateTime element.
|
1242 kumpf 1.10 // 3. If CIM datetime string contains "+" or "-" and no asterisks in
|
1243 dmitry.mikulin 1.3 // the hhmmss.mmmmmm portion, and only asterisks in the yyyymmdd portion,
1244 // ATTN: this makes no sense. yyyymmdd cannot be wildcarded unless
|
1245 kumpf 1.10 // previous sections are wildcarded.
|
1246 dmitry.mikulin 1.3 // use Time cim:cimDateTime element.
|
1247 kumpf 1.10 // 4. If CIM datetime string contains "+" or "-" and no asterisks in the
|
1248 dmitry.mikulin 1.3 // yyyymmdd portion, and only asterisks in the hhmmss.mmmmmm portion,
1249 // use Date cim:cimDateTime element.
1250 // 5. In all other cases use CIM_DateTime element.
1251
1252 if (cimStr[21] == ':')
1253 {
1254 // Interval
1255 Uint32 days = 0, hrs = 0, mins = 0, secs = 0, msecs = 0;
|
1256 kumpf 1.10 int conversions = sscanf(cimStr, "%8u%2u%2u%2u.%u:000",
|
1257 dmitry.mikulin 1.3 &days, &hrs, &mins, &secs, &msecs);
|
1258 kumpf 1.10 if (conversions == 0 && cimStr[0] == '*')
|
1259 dmitry.mikulin 1.3 days = 1;
1260
1261 wsmDT = "P";
1262 if (conversions >= 1 && days)
1263 {
1264 wsmDT.append(Uint32ToString(buffer, days, size));
1265 wsmDT.append(Char16('D'));
1266 }
|
1267 kumpf 1.10 if (conversions >= 2 )
|
1268 dmitry.mikulin 1.3 {
1269 wsmDT.append(Char16('T'));
1270 if (hrs)
1271 {
1272 wsmDT.append(Uint32ToString(buffer, hrs, size));
1273 wsmDT.append(Char16('H'));
1274 }
1275 }
1276 if (conversions >= 3 && mins)
1277 {
1278 wsmDT.append(Uint32ToString(buffer, mins, size));
1279 wsmDT.append(Char16('M'));
1280 }
|
1281 kumpf 1.10 if (conversions >= 4 && secs)
|
1282 dmitry.mikulin 1.3 {
1283 wsmDT.append(Uint32ToString(buffer, secs, size));
1284 if (conversions >= 5 && msecs)
1285 {
1286 wsmDT.append(Char16('.'));
1287 wsmDT.append(Uint32ToString(buffer, msecs, size));
1288 }
1289 wsmDT.append(Char16('S'));
1290 }
|
1291 mike 1.12
1292 // According to spec, at least one number must be present, so if
1293 // we end up with "PT", then convert to "PT0S".
1294 if (wsmDT == "PT")
1295 wsmDT.append("0S");
|
1296 dmitry.mikulin 1.3 }
|
1297 kumpf 1.10 else if ((cimStr[21] == '+' || cimStr[21] == '-') &&
|
1298 dmitry.mikulin 1.3 firstAsteriskPos == PEG_NOT_FOUND)
1299 {
1300 // Datetime
1301 Uint32 year = 0, month = 0, day = 0, utcoff = 0,
1302 hrs = 0, mins = 0, secs = 0, msecs = 0;
1303 char sign;
|
1304 kumpf 1.10 int conversions = sscanf(cimStr,
1305 "%4u%2u%2u%2u%2u%2u.%6u%c%3u",
|
1306 dmitry.mikulin 1.3 &year, &month, &day, &hrs, &mins, &secs, &msecs, &sign, &utcoff);
1307
1308 PEGASUS_ASSERT(conversions == 9);
1309
1310 if (utcoff == 0)
1311 {
1312 if (msecs)
1313 {
|
1314 kumpf 1.10 sprintf(buffer, "%.4u-%.2u-%.2uT%.2u:%.2u:%.2u.%.6uZ",
|
1315 dmitry.mikulin 1.3 year, month, day, hrs, mins, secs, msecs);
1316 }
1317 else
1318 {
|
1319 kumpf 1.10 sprintf(buffer, "%.4u-%.2u-%.2uT%.2u:%.2u:%.2uZ",
|
1320 dmitry.mikulin 1.3 year, month, day, hrs, mins, secs);
1321 }
1322 }
1323 else
1324 {
1325 Uint32 utch = utcoff / 60;
1326 Uint32 utcm = utcoff % 60;
1327 if (msecs)
1328 {
1329 sprintf(buffer, "%.4u-%.2u-%.2uT%.2u:%.2u:%.2u.%.6u%c%.2u:%.2u",
|
1330 kumpf 1.10 year, month, day, hrs, mins, secs, msecs,
|
1331 dmitry.mikulin 1.3 sign, utch, utcm);
1332 }
1333 else
1334 {
|
1335 kumpf 1.10 sprintf(buffer, "%.4u-%.2u-%.2uT%.2u:%.2u:%.2u%c%.2u:%.2u",
|
1336 dmitry.mikulin 1.3 year, month, day, hrs, mins, secs, sign, utch, utcm);
1337 }
1338 }
1339 wsmDT = buffer;
1340 }
|
1341 kumpf 1.10 else if ((cimStr[21] == '+' || cimStr[21] == '-') &&
|
1342 dmitry.mikulin 1.3 firstAsteriskPos == 8)
1343 {
1344 // Date
1345 Uint32 year = 0, month = 0, day = 0, utcoff = 0;
1346 char sign;
|
1347 kumpf 1.10 int conversions = sscanf(cimStr, "%4u%2u%2u******.******%c%3u",
|
1348 dmitry.mikulin 1.3 &year, &month, &day, &sign, &utcoff);
1349
1350 PEGASUS_ASSERT(conversions == 5);
1351
1352 if (utcoff == 0)
1353 {
1354 sprintf(buffer, "%.4u-%.2u-%.2uZ", year, month, day);
1355 }
1356 else
1357 {
1358 Uint32 utch = utcoff / 60;
1359 Uint32 utcm = utcoff % 60;
|
1360 kumpf 1.10 sprintf(buffer, "%.4u-%.2u-%.2u%c%.2u:%.2u",
|
1361 dmitry.mikulin 1.3 year, month, day, sign, utch, utcm);
1362 }
1363 wsmDT = buffer;
1364 }
1365 else
1366 {
1367 // CIM_DateTime
1368 wsmDT = cimStr;
1369 }
1370 }
|
1371 mike 1.12
1372 void CimToWsmResponseMapper::convertCimToWsmParameters(
1373 const String& resourceUri,
1374 const String& nameSpace,
1375 const Array<CIMParamValue>& parameters,
1376 const CIMValue& returnValue,
1377 WsmInstance& wsmInstance)
1378 {
1379 // Convert output properties.
1380
1381 for (Uint32 i = 0, n = parameters.size(); i < n; i++)
1382 {
1383 const CIMParamValue& cpv = parameters[i];
1384 const String& name = cpv.getParameterName();
1385 const CIMValue& value = cpv.getValue();
1386
1387 WsmValue wvalue;
1388 convertCimToWsmValue(resourceUri, value, wvalue, nameSpace);
1389 wsmInstance.addProperty(WsmProperty(name, wvalue));
1390 }
1391
1392 mike 1.12 // Convert return value.
1393 {
1394 WsmValue wvalue;
1395 convertCimToWsmValue(resourceUri, returnValue, wvalue, nameSpace);
1396 wsmInstance.addProperty(WsmProperty("ReturnValue", wvalue));
1397 }
1398 }
1399
|
1400 kumpf 1.2 PEGASUS_NAMESPACE_END
|