1 martin 1.4 //%LICENSE////////////////////////////////////////////////////////////////
|
2 martin 1.5 //
|
3 martin 1.4 // 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.5 //
|
10 martin 1.4 // 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.5 //
|
17 martin 1.4 // The above copyright notice and this permission notice shall be included
18 // in all copies or substantial portions of the Software.
|
19 martin 1.5 //
|
20 martin 1.4 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
21 martin 1.5 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
22 martin 1.4 // 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.5 //
|
28 martin 1.4 //////////////////////////////////////////////////////////////////////////
|
29 kumpf 1.2 //
30 //%/////////////////////////////////////////////////////////////////////////////
31
32 #ifndef Pegasus_WsmResponse_h
33 #define Pegasus_WsmResponse_h
34
35 #include <Pegasus/Common/Config.h>
36 #include <Pegasus/Common/ArrayInternal.h>
37 #include <Pegasus/Common/ContentLanguageList.h>
38 #include <Pegasus/WsmServer/WsmRequest.h>
39 #include <Pegasus/WsmServer/WsmFault.h>
40 #include <Pegasus/WsmServer/WsmInstance.h>
41 #include <Pegasus/WsmServer/WsmUtils.h>
42
43 PEGASUS_NAMESPACE_BEGIN
44
45 class WsmResponse
46 {
47 protected:
48
49 WsmResponse(
50 kumpf 1.2 WsmOperationType type,
51 const WsmRequest* request,
52 const ContentLanguageList& contentLanguages)
53 : _type(type),
54 _messageId(WsmUtils::getMessageId()),
55 _relatesTo(request->messageId),
56 _queueId(request->queueId),
57 _httpMethod(request->httpMethod),
58 _httpCloseConnect(request->httpCloseConnect),
59 _maxEnvelopeSize(request->maxEnvelopeSize),
60 _contentLanguages(contentLanguages)
61 {
62 }
63
64 WsmResponse(
65 WsmOperationType type,
66 const String& relatesTo,
67 Uint32 queueId,
68 HttpMethod httpMethod,
69 Boolean httpCloseConnect,
70 const ContentLanguageList& contentLanguages)
71 kumpf 1.2 : _type(type),
72 _messageId(WsmUtils::getMessageId()),
73 _relatesTo(relatesTo),
74 _queueId(queueId),
75 _httpMethod(httpMethod),
76 _httpCloseConnect(httpCloseConnect),
77 _maxEnvelopeSize(0),
78 _contentLanguages(contentLanguages)
79 {
80 }
81
82 public:
83
84 virtual ~WsmResponse()
85 {
86 }
87
88 WsmOperationType getType() const
89 {
90 return _type;
91 }
92 kumpf 1.2
93 String& getMessageId()
94 {
95 return _messageId;
96 }
97
98 String& getRelatesTo()
99 {
100 return _relatesTo;
101 }
102
103 Uint32 getQueueId() const
104 {
105 return _queueId;
106 }
107
108 HttpMethod getHttpMethod() const
109 {
110 return _httpMethod;
111 }
112
113 kumpf 1.2 Boolean getHttpCloseConnect() const
114 {
115 return _httpCloseConnect;
116 }
117
118 Uint32 getMaxEnvelopeSize() const
119 {
120 return _maxEnvelopeSize;
121 }
122
123 ContentLanguageList& getContentLanguages()
124 {
125 return _contentLanguages;
126 }
127
128 private:
129
130 WsmResponse(const WsmResponse&);
131 WsmResponse& operator=(const WsmResponse&);
132
133 WsmOperationType _type;
134 kumpf 1.2 String _messageId;
135 String _relatesTo;
136 Uint32 _queueId;
137 HttpMethod _httpMethod;
138 Boolean _httpCloseConnect;
139 Uint32 _maxEnvelopeSize;
140 ContentLanguageList _contentLanguages;
141 };
142
143 class WsmFaultResponse : public WsmResponse
144 {
145 public:
146
147 WsmFaultResponse(
148 const String& relatesTo,
149 Uint32 queueId,
150 HttpMethod httpMethod,
151 Boolean httpCloseConnect,
152 const WsmFault& fault)
153 : WsmResponse(
154 WSM_FAULT,
155 kumpf 1.2 relatesTo,
156 queueId,
157 httpMethod,
158 httpCloseConnect,
159 fault.getReasonLanguage()),
160 _fault(fault)
161 {
162 }
163
164 WsmFaultResponse(
165 const WsmRequest* request,
166 const WsmFault& fault)
167 : WsmResponse(
168 WSM_FAULT,
169 request,
170 fault.getReasonLanguage()),
171 _fault(fault)
172 {
173 }
174
175 ~WsmFaultResponse()
176 kumpf 1.2 {
177 }
178
179 WsmFault& getFault()
180 {
181 return _fault;
182 }
183
184 private:
185
186 WsmFault _fault;
187 };
188
189 class SoapFaultResponse : public WsmResponse
190 {
191 public:
192
193 SoapFaultResponse(
194 const String& relatesTo,
195 Uint32 queueId,
196 HttpMethod httpMethod,
197 kumpf 1.2 Boolean httpCloseConnect,
198 const SoapNotUnderstoodFault& fault)
199 : WsmResponse(
200 SOAP_FAULT,
201 relatesTo,
202 queueId,
203 httpMethod,
204 httpCloseConnect,
205 fault.getMessageLanguage()),
206 _fault(fault)
207 {
208 }
209
210 ~SoapFaultResponse()
211 {
212 }
213
214 SoapNotUnderstoodFault& getFault()
215 {
216 return _fault;
217 }
218 kumpf 1.2
219 private:
220
221 SoapNotUnderstoodFault _fault;
222 };
223
|
224 kumpf 1.3 class WxfGetResponse : public WsmResponse
|
225 kumpf 1.2 {
226 public:
227
|
228 kumpf 1.3 WxfGetResponse(
|
229 kumpf 1.2 const WsmInstance& inst,
|
230 kumpf 1.3 const WxfGetRequest* request,
|
231 kumpf 1.2 const ContentLanguageList& contentLanguages)
232 : WsmResponse(
233 WS_TRANSFER_GET,
234 request,
235 contentLanguages),
236 _instance(inst)
237 {
238 }
239
|
240 kumpf 1.3 ~WxfGetResponse()
|
241 kumpf 1.2 {
242 }
243
244 WsmInstance& getInstance()
245 {
246 return _instance;
247 }
248
249 private:
250
251 WsmInstance _instance;
252 };
253
|
254 kumpf 1.3 class WxfPutResponse : public WsmResponse
|
255 kumpf 1.2 {
256 public:
257
|
258 kumpf 1.3 WxfPutResponse(
259 const WxfPutRequest* request,
|
260 kumpf 1.2 const ContentLanguageList& contentLanguages)
261 : WsmResponse(
262 WS_TRANSFER_PUT,
263 request,
264 contentLanguages),
265 _reference(request->epr),
266 _requestedEPR(request->requestEpr)
267 {
268 }
269
|
270 kumpf 1.3 ~WxfPutResponse()
|
271 kumpf 1.2 {
272 }
273
274 WsmEndpointReference& getEPR()
275 {
276 return _reference;
277 }
278
279 Boolean getRequestedEPR()
280 {
281 return _requestedEPR;
282 }
283
284 private:
285
286 // The client can request the potentially updated EPR by specifying the
287 // wsman:RequestEPR header. CIM does not allow a ModifyInstance operation
288 // to change key values, though, so this will always be the same as the
289 // EPR in the request.
290 WsmEndpointReference _reference;
291 Boolean _requestedEPR;
292 kumpf 1.2 };
293
|
294 kumpf 1.3 class WxfCreateResponse : public WsmResponse
|
295 kumpf 1.2 {
296 public:
297
|
298 kumpf 1.3 WxfCreateResponse(
|
299 kumpf 1.2 const WsmEndpointReference& ref,
|
300 kumpf 1.3 const WxfCreateRequest* request,
|
301 kumpf 1.2 const ContentLanguageList& contentLanguages)
302 : WsmResponse(
303 WS_TRANSFER_CREATE,
304 request,
305 contentLanguages),
306 _reference(ref)
307 {
308 }
309
|
310 kumpf 1.3 ~WxfCreateResponse()
|
311 kumpf 1.2 {
312 }
313
314 WsmEndpointReference& getEPR()
315 {
316 return _reference;
317 }
318
319 private:
320
321 WsmEndpointReference _reference;
322 };
323
|
324 kumpf 1.3 class WxfDeleteResponse : public WsmResponse
|
325 kumpf 1.2 {
326 public:
327
|
328 kumpf 1.3 WxfDeleteResponse(
329 const WxfDeleteRequest* request,
|
330 kumpf 1.2 const ContentLanguageList& contentLanguages)
331 : WsmResponse(
332 WS_TRANSFER_DELETE,
333 request,
334 contentLanguages)
335 {
336 }
337
|
338 kumpf 1.3 ~WxfDeleteResponse()
339 {
340 }
341 };
342
343 class WsenEnumerationData
344 {
345 public:
346
347 WsenEnumerationData()
348 : enumerationMode(WSEN_EM_UNKNOWN)
349 {
350 }
|
351 kumpf 1.6 WsenEnumerationData(const Array<WsmInstance>& inst,
|
352 kumpf 1.3 const Array<WsmEndpointReference> EPRs,
353 WsmbPolymorphismMode pm, const String& uri)
354 : instances(inst),
355 eprs(EPRs),
356 enumerationMode(WSEN_EM_OBJECT_AND_EPR),
357 polymorphismMode(pm),
358 classUri(uri)
359 {
360 }
|
361 kumpf 1.6 WsenEnumerationData(const Array<WsmInstance>& inst,
|
362 kumpf 1.3 WsmbPolymorphismMode pm, const String& uri)
363 : instances(inst),
364 enumerationMode(WSEN_EM_OBJECT),
365 polymorphismMode(pm),
366 classUri(uri)
367 {
368 }
369 WsenEnumerationData(const Array<WsmEndpointReference>& epr)
370 : eprs(epr),
371 enumerationMode(WSEN_EM_EPR),
372 polymorphismMode(WSMB_PM_UNKNOWN)
373 {
374 }
375 WsenEnumerationData(const WsenEnumerationData& data)
376 : instances(data.instances),
377 eprs(data.eprs),
378 enumerationMode(data.enumerationMode),
379 polymorphismMode(data.polymorphismMode),
380 classUri(data.classUri)
381 {
382 }
383 kumpf 1.3 Uint32 getSize()
384 {
|
385 kumpf 1.6 if (enumerationMode == WSEN_EM_OBJECT ||
|
386 kumpf 1.3 enumerationMode == WSEN_EM_OBJECT_AND_EPR)
387 {
388 return instances.size();
389 }
390 else if (enumerationMode == WSEN_EM_EPR)
391 {
392 return eprs.size();
393 }
394 else
395 {
396 PEGASUS_ASSERT(0);
397 return 0;
398 }
399 }
400 void remove(Uint32 index, Uint32 size)
401 {
402 if (enumerationMode == WSEN_EM_OBJECT)
403 {
404 instances.remove(index, size);
405 }
406 else if (enumerationMode == WSEN_EM_EPR)
407 kumpf 1.3 {
408 eprs.remove(index, size);
409 }
410 else if (enumerationMode == WSEN_EM_OBJECT_AND_EPR)
411 {
412 instances.remove(index, size);
413 eprs.remove(index, size);
|
414 kumpf 1.6 }
|
415 kumpf 1.3 else
416 {
417 PEGASUS_ASSERT(0);
418 }
419 }
420 void merge(const WsenEnumerationData& data)
421 {
422 if (enumerationMode == WSEN_EM_OBJECT)
423 {
424 instances.appendArray(data.instances);
425 }
426 else if (enumerationMode == WSEN_EM_EPR)
427 {
428 eprs.appendArray(data.eprs);
429 }
430 else if (enumerationMode == WSEN_EM_OBJECT_AND_EPR)
431 {
432 instances.appendArray(data.instances);
433 eprs.appendArray(data.eprs);
434 }
435 else
436 kumpf 1.3 {
437 PEGASUS_ASSERT(0);
438 }
439 }
440 void split(WsenEnumerationData& data, Uint32 num)
441 {
442 data.enumerationMode = enumerationMode;
443 data.polymorphismMode = polymorphismMode;
444 data.classUri = classUri;
445
446 if (enumerationMode == WSEN_EM_OBJECT)
447 {
448 Uint32 i;
449 for (i = 0; i < num && i < instances.size(); i++)
450 {
451 data.instances.append(instances[i]);
452 }
453
454 if (i != 0)
455 {
456 instances.remove(0, i);
457 kumpf 1.3 }
458 }
459 else if (enumerationMode == WSEN_EM_EPR)
460 {
461 Uint32 i;
462 for (i = 0; i < num && i < eprs.size(); i++)
463 {
464 data.eprs.append(eprs[i]);
465 }
466 if (i != 0)
467 {
468 eprs.remove(0, i);
469 }
470 }
471 else if (enumerationMode == WSEN_EM_OBJECT_AND_EPR)
472 {
473 Uint32 i;
474 for (i = 0; i < num && i < instances.size(); i++)
475 {
476 data.instances.append(instances[i]);
477 data.eprs.append(eprs[i]);
478 kumpf 1.3 }
479
480 if (i != 0)
481 {
482 instances.remove(0, i);
483 eprs.remove(0, i);
484 }
485 }
486 else
487 {
488 PEGASUS_ASSERT(0);
489 }
490 }
491
492 Array<WsmInstance> instances;
493 Array<WsmEndpointReference> eprs;
494 WsenEnumerationMode enumerationMode;
495 WsmbPolymorphismMode polymorphismMode;
496 String classUri;
497 };
498
499 kumpf 1.3 class WsenPullResponse : public WsmResponse
500 {
501 public:
502
503 WsenPullResponse(
504 const WsenEnumerationData& data,
505 const WsenPullRequest* request,
506 const ContentLanguageList& contentLanguages)
507 : WsmResponse(
508 WS_ENUMERATION_PULL,
509 request,
510 contentLanguages),
511 _enumerationContext((Uint64) -1),
512 _isComplete(false),
513 _enumerationData(data)
514 {
515 }
516 ~WsenPullResponse()
517 {
518 }
519 Array<WsmInstance>& getInstances()
520 kumpf 1.3 {
521 return _enumerationData.instances;
522 }
523 Array<WsmEndpointReference>& getEPRs()
524 {
525 return _enumerationData.eprs;
526 }
527 WsenEnumerationData& getEnumerationData()
528 {
529 return _enumerationData;
530 }
531 Uint32 getSize()
532 {
533 return _enumerationData.getSize();
534 }
535 void remove(Uint32 index, Uint32 size)
536 {
537 _enumerationData.remove(index, size);
538 }
539 void setComplete()
540 {
541 kumpf 1.3 _isComplete = true;
542 }
543 Boolean isComplete()
544 {
545 return _isComplete;
546 }
547 WsenEnumerationMode getEnumerationMode()
548 {
549 return _enumerationData.enumerationMode;
550 }
551 Uint64 getEnumerationContext()
552 {
553 return _enumerationContext;
554 }
555 void setEnumerationContext(Uint64 context)
556 {
557 _enumerationContext = context;
558 }
559
560 private:
561
562 kumpf 1.3 Uint64 _enumerationContext;
563 Boolean _isComplete;
564 WsenEnumerationData _enumerationData;
565 };
566
567 class WsenEnumerateResponse : public WsmResponse
568 {
569 public:
570
571 WsenEnumerateResponse(
572 const Array<WsmInstance>& inst,
573 const Array<WsmEndpointReference>& epr,
574 Uint32 itemCount,
575 const WsenEnumerateRequest* request,
576 const ContentLanguageList& contentLanguages)
577 : WsmResponse(
578 WS_ENUMERATION_ENUMERATE,
579 request,
580 contentLanguages),
581 _enumerationContext((Uint64) -1),
582 _isComplete(false),
583 kumpf 1.3 _requestItemCount(request->requestItemCount),
584 _itemCount(itemCount),
585 _enumerationData(inst, epr, request->polymorphismMode,
586 request->epr.resourceUri)
587 {
588 PEGASUS_ASSERT(request->enumerationMode == WSEN_EM_OBJECT ||
589 request->enumerationMode == WSEN_EM_OBJECT_AND_EPR);
590 }
591 WsenEnumerateResponse(
592 const Array<WsmInstance>& inst,
593 Uint32 itemCount,
594 const WsenEnumerateRequest* request,
595 const ContentLanguageList& contentLanguages)
596 : WsmResponse(
597 WS_ENUMERATION_ENUMERATE,
598 request,
599 contentLanguages),
600 _enumerationContext((Uint64) -1),
601 _isComplete(false),
602 _requestItemCount(request->requestItemCount),
603 _itemCount(itemCount),
604 kumpf 1.3 _enumerationData(inst, request->polymorphismMode,
605 request->epr.resourceUri)
606 {
607 PEGASUS_ASSERT(request->enumerationMode == WSEN_EM_OBJECT);
608 }
609 WsenEnumerateResponse(
610 const Array<WsmEndpointReference>& epr,
611 Uint32 itemCount,
612 const WsenEnumerateRequest* request,
613 const ContentLanguageList& contentLanguages)
614 : WsmResponse(
615 WS_ENUMERATION_ENUMERATE,
616 request,
617 contentLanguages),
618 _enumerationContext((Uint64) -1),
619 _isComplete(false),
620 _requestItemCount(request->requestItemCount),
621 _itemCount(itemCount),
622 _enumerationData(epr)
623 {
624 PEGASUS_ASSERT(request->enumerationMode == WSEN_EM_EPR);
625 kumpf 1.3 }
626 WsenEnumerateResponse(
627 const WsenEnumerationData data,
628 Uint32 itemCount,
629 const WsenEnumerateRequest* request,
630 const ContentLanguageList& contentLanguages)
631 : WsmResponse(
632 WS_ENUMERATION_ENUMERATE,
633 request,
634 contentLanguages),
635 _enumerationContext((Uint64) -1),
636 _isComplete(false),
637 _requestItemCount(request->requestItemCount),
638 _itemCount(itemCount),
639 _enumerationData(data)
640 {
641 PEGASUS_ASSERT(request->enumerationMode == data.enumerationMode);
642 }
643 ~WsenEnumerateResponse()
644 {
645 }
646 kumpf 1.3 Array<WsmInstance>& getInstances()
647 {
648 return _enumerationData.instances;
649 }
650 Array<WsmEndpointReference>& getEPRs()
651 {
652 return _enumerationData.eprs;
653 }
654 WsenEnumerationData& getEnumerationData()
655 {
656 return _enumerationData;
657 }
658 Uint32 getSize()
659 {
660 return _enumerationData.getSize();
661 }
662 void merge(WsenEnumerateResponse* response)
663 {
|
664 kumpf 1.6 PEGASUS_ASSERT(_enumerationData.enumerationMode ==
|
665 kumpf 1.3 response->_enumerationData.enumerationMode);
666 _enumerationData.merge(response->getEnumerationData());
667 }
668 void merge(WsenPullResponse* response)
669 {
|
670 kumpf 1.6 PEGASUS_ASSERT(_enumerationData.enumerationMode ==
|
671 kumpf 1.3 response->getEnumerationData().enumerationMode);
672 _enumerationData.merge(response->getEnumerationData());
673 }
674 void remove(Uint32 index, Uint32 size)
675 {
676 _enumerationData.remove(index, size);
677 }
678 void setComplete()
679 {
680 _isComplete = true;
681 }
682 Boolean isComplete()
683 {
684 return _isComplete;
685 }
686 Boolean requestedItemCount()
687 {
688 return _requestItemCount;
689 }
690 void setItemCount(Uint32 count)
691 {
692 kumpf 1.3 _itemCount = count;
693 }
694 Uint32 getItemCount()
695 {
696 return _itemCount;
697 }
698 WsenEnumerationMode getEnumerationMode()
699 {
700 return _enumerationData.enumerationMode;
701 }
702 Uint64 getEnumerationContext()
703 {
704 return _enumerationContext;
705 }
706 void setEnumerationContext(Uint64 context)
707 {
708 _enumerationContext = context;
709 }
710
711 private:
712
713 kumpf 1.3 Uint64 _enumerationContext;
714 Boolean _isComplete;
715 Boolean _requestItemCount;
716 Uint32 _itemCount;
717 WsenEnumerationData _enumerationData;
718 };
719
720 class WsenReleaseResponse : public WsmResponse
721 {
722 public:
723
724 WsenReleaseResponse(
725 const WsenReleaseRequest* request,
726 const ContentLanguageList& contentLanguages)
727 : WsmResponse(
728 WS_ENUMERATION_RELEASE,
729 request,
730 contentLanguages)
731 {
732 }
733
734 kumpf 1.3 ~WsenReleaseResponse()
|
735 kumpf 1.2 {
736 }
737 };
738
739 PEGASUS_NAMESPACE_END
740
741 #endif /* Pegasus_WsmResponse_h */
|