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