1 schuur 1.1 //%2003////////////////////////////////////////////////////////////////////////
2 //
3 // Copyright (c) 2000, 2001, 2002 BMC Software, Hewlett-Packard Development
4 // Company, L. P., IBM Corp., The Open Group, Tivoli Systems.
5 // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L. P.;
6 // IBM Corp.; EMC Corporation, The Open Group.
7 //
8 // Permission is hereby granted, free of charge, to any person obtaining a copy
9 // of this software and associated documentation files (the "Software"), to
10 // deal in the Software without restriction, including without limitation the
11 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
12 // sell copies of the Software, and to permit persons to whom the Software is
13 // furnished to do so, subject to the following conditions:
14 //
15 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
16 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
17 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
18 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
19 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
20 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
21 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22 schuur 1.1 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 //
24 //==============================================================================
25 //
26 // Author: Chip Vincent (cvincent@us.ibm.com)
27 //
28 // Modified By: Carol Ann Krug Graves, Hewlett-Packard Company
29 // (carolann_graves@hp.com)
30 // Dave Rosckes (rosckes@us.ibm.com)
31 // Yi Zhou, Hewlett-Packard Company (yi_zhou@hp.com)
32 // Adrian Schuur (schuur@de.ibm.com)
|
33 se.gupta 1.3 // Seema Gupta (gseema@in.ibm.com) for PEP135
|
34 schuur 1.1 //
35 //%/////////////////////////////////////////////////////////////////////////////
36
37 #ifndef Pegasus_OperationResponseHandler_h
38 #define Pegasus_OperationResponseHandler_h
39
40 #include <Pegasus/Common/Config.h>
41 #include <Pegasus/Server/Linkage.h>
42 #include <Pegasus/Common/CIMMessage.h>
43 #include <Pegasus/Common/MessageQueueService.h>
44 #include <Pegasus/Common/Constants.h>
45 #include <Pegasus/Common/ContentLanguages.h> // l10n
46
47 #include <Pegasus/Common/CIMClass.h>
48 #include <Pegasus/Common/CIMInstance.h>
49 #include <Pegasus/Common/CIMIndication.h>
50 #include <Pegasus/Common/CIMValue.h>
51
52 #include <Pegasus/Common/ResponseHandler.h>
53 #include <Pegasus/Common/Logger.h>
|
54 kumpf 1.6 #include <Pegasus/Common/XmlWriter.h>
|
55 schuur 1.1
56 #include <Pegasus/ProviderManager2/SimpleResponseHandler.h>
57
58 #include <Pegasus/ProviderManager2/Linkage.h>
59
60 PEGASUS_NAMESPACE_BEGIN
61
62 class PEGASUS_PPM_LINKAGE OperationResponseHandler
63 {
64 public:
65 OperationResponseHandler(CIMRequestMessage * request, CIMResponseMessage * response)
66 : _request(request), _response(response)
67 {
68 }
69
70 virtual ~OperationResponseHandler(void)
71 {
72 }
73
74 CIMRequestMessage * getRequest(void) const
75 {
76 schuur 1.1 return(_request);
77 }
78
79 CIMResponseMessage * getResponse(void) const
80 {
81 return(_response);
82 }
83
84 virtual void setStatus(const Uint32 code, const String & message = String::EMPTY)
85 {
86 _response->cimException = PEGASUS_CIM_EXCEPTION(CIMStatusCode(code), message);
87 }
88
89 virtual void setStatus(const Uint32 code,
90 const ContentLanguages & langs,
91 const String & message = String::EMPTY)
92 {
93 _response->cimException = PEGASUS_CIM_EXCEPTION_LANG(
94 langs,
95 CIMStatusCode(code),
96 message);
97 schuur 1.1 }
98
99 protected:
100 CIMRequestMessage * _request;
101 CIMResponseMessage * _response;
102
103 };
104
105
106 /* ------------------------------------------------------------------------- */
107 /* operation specific response handlers */
108 /* ------------------------------------------------------------------------- */
109
110 class GetInstanceResponseHandler: public OperationResponseHandler, public SimpleInstanceResponseHandler
111 {
112 public:
113 GetInstanceResponseHandler(
114 CIMGetInstanceRequestMessage * request,
115 CIMGetInstanceResponseMessage * response)
116 : OperationResponseHandler(request, response)
117 {
118 schuur 1.1 }
119
120 virtual void complete()
121 {
122 Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
123 "OperationResponseHandler: complete()");
124
125 if(getObjects().size() == 0)
126 {
127 // error? provider claims success,
128 // but did not deliver an instance.
129 setStatus(CIM_ERR_NOT_FOUND);
130
131 return;
132 }
133
134 static_cast<CIMGetInstanceResponseMessage *>(
135 getResponse())->cimInstance = getObjects()[0];
136
137 // l10n
|
138 se.gupta 1.3 getResponse()->operationContext.set(ContentLanguageListContainer(getLanguages()));
|
139 schuur 1.1 }
140 };
141
142 class EnumerateInstancesResponseHandler : public OperationResponseHandler, public SimpleInstanceResponseHandler
143 {
144 public:
145 EnumerateInstancesResponseHandler(
146 CIMEnumerateInstancesRequestMessage * request,
147 CIMEnumerateInstancesResponseMessage * response)
148 : OperationResponseHandler(request, response)
149 {
150 }
151
152 virtual void complete()
153 {
154 Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
155 "OperationResponseHandler: complete()");
156
157 static_cast<CIMEnumerateInstancesResponseMessage *>(
158 getResponse())->cimNamedInstances = getObjects();
159
160 schuur 1.1 // l10n
|
161 se.gupta 1.3 getResponse()->operationContext.set(ContentLanguageListContainer(getLanguages()));
|
162 schuur 1.1 }
163
164 };
165
166 class EnumerateInstanceNamesResponseHandler : public OperationResponseHandler, public SimpleObjectPathResponseHandler
167 {
168 public:
169 EnumerateInstanceNamesResponseHandler(
170 CIMEnumerateInstanceNamesRequestMessage * request,
171 CIMEnumerateInstanceNamesResponseMessage * response)
172 : OperationResponseHandler(request, response)
173 {
174 }
175
176 virtual void complete()
177 {
178 Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
179 "OperationResponseHandler: complete()");
180
181 static_cast<CIMEnumerateInstanceNamesResponseMessage *>(
182 getResponse())->instanceNames = getObjects();
183 schuur 1.1
184 // l10n
|
185 se.gupta 1.3 getResponse()->operationContext.set(ContentLanguageListContainer(getLanguages()));
|
186 schuur 1.1 }
187
188 };
189
190 class CreateInstanceResponseHandler : public OperationResponseHandler, public SimpleObjectPathResponseHandler
191 {
192 public:
193 CreateInstanceResponseHandler(
194 CIMCreateInstanceRequestMessage * request,
195 CIMCreateInstanceResponseMessage * response)
196 : OperationResponseHandler(request, response)
197 {
198 }
199
200 virtual void complete()
201 {
202 Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
203 "OperationResponseHandler: complete()");
204
205 if(getObjects().size() == 0)
206 {
207 schuur 1.1 // ATTN: is it an error to not return instance name?
208 return;
209 }
210
211 static_cast<CIMCreateInstanceResponseMessage *>(
212 getResponse())->instanceName = getObjects()[0];
213
214 // l10n
|
215 se.gupta 1.3 getResponse()->operationContext.set(ContentLanguageListContainer(getLanguages()));
|
216 schuur 1.1 }
217
218 };
219
220 class ModifyInstanceResponseHandler : public OperationResponseHandler, public SimpleResponseHandler
221 {
222 public:
223 ModifyInstanceResponseHandler(
224 CIMModifyInstanceRequestMessage * request,
225 CIMModifyInstanceResponseMessage * response)
226 : OperationResponseHandler(request, response)
227 {
228 }
229
230 };
231
232 class DeleteInstanceResponseHandler : public OperationResponseHandler, public SimpleResponseHandler
233 {
234 public:
235 DeleteInstanceResponseHandler(
236 CIMDeleteInstanceRequestMessage * request,
237 schuur 1.1 CIMDeleteInstanceResponseMessage * response)
238 : OperationResponseHandler(request, response)
239 {
240 }
241
242 };
243
244 class GetPropertyResponseHandler : public OperationResponseHandler, public SimpleValueResponseHandler
245 {
246 public:
247 GetPropertyResponseHandler(
248 CIMGetPropertyRequestMessage * request,
249 CIMGetPropertyResponseMessage * response)
250 : OperationResponseHandler(request, response)
251 {
252 }
253
254 virtual void complete()
255 {
256 Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
257 "OperationResponseHandler: complete()");
258 schuur 1.1
259 if(getObjects().size() == 0)
260 {
261 // error? provider claims success,
262 // but did not deliver an instance.
263 setStatus(CIM_ERR_NOT_FOUND);
264
265 return;
266 }
267
268 static_cast<CIMGetPropertyResponseMessage *>(
269 getResponse())->value = getObjects()[0];
270
271 // l10n
|
272 se.gupta 1.3 getResponse()->operationContext.set(ContentLanguageListContainer(getLanguages()));
|
273 schuur 1.1 }
274 };
275
276 class SetPropertyResponseHandler : public OperationResponseHandler, public SimpleResponseHandler
277 {
278 public:
279 SetPropertyResponseHandler(
280 CIMSetPropertyRequestMessage * request,
281 CIMSetPropertyResponseMessage * response)
282 : OperationResponseHandler(request, response)
283 {
284 }
285
286 };
287
288 class ExecQueryResponseHandler : public OperationResponseHandler, public SimpleInstance2ObjectResponseHandler
289 {
290 public:
291 ExecQueryResponseHandler(
292 CIMExecQueryRequestMessage * request,
293 CIMExecQueryResponseMessage * response)
294 schuur 1.1 : OperationResponseHandler(request, response)
295 {
296 }
297
298 virtual void complete()
299 {
300 Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
301 "OperationResponseHandler: complete()");
302
303 static_cast<CIMExecQueryResponseMessage *>(
304 getResponse())->cimObjects = getObjects();
305
306 // l10n
|
307 se.gupta 1.3 getResponse()->operationContext.set(ContentLanguageListContainer(getLanguages()));
|
308 schuur 1.1 }
309
310 };
311
312
313 class AssociatorsResponseHandler : public OperationResponseHandler, public SimpleObjectResponseHandler
314 {
315 public:
316 AssociatorsResponseHandler(
317 CIMAssociatorsRequestMessage * request,
318 CIMAssociatorsResponseMessage * response)
319 : OperationResponseHandler(request, response)
320 {
321 }
322
323 virtual void complete()
324 {
325 Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
326 "OperationResponseHandler: complete()");
327
328 static_cast<CIMAssociatorsResponseMessage *>(
329 schuur 1.1 getResponse())->cimObjects = getObjects();
330
331 // l10n
|
332 se.gupta 1.3 getResponse()->operationContext.set(ContentLanguageListContainer(getLanguages()));
|
333 schuur 1.1 }
334
335 };
336
337 class AssociatorNamesResponseHandler : public OperationResponseHandler, public SimpleObjectPathResponseHandler
338 {
339 public:
340 AssociatorNamesResponseHandler(
341 CIMAssociatorNamesRequestMessage * request,
342 CIMAssociatorNamesResponseMessage * response)
343 : OperationResponseHandler(request, response)
344 {
345 }
346
347 virtual void complete()
348 {
349 Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
350 "OperationResponseHandler: complete()");
351
352 static_cast<CIMAssociatorNamesResponseMessage *>(
353 getResponse())->objectNames.appendArray(getObjects());
354 schuur 1.1
355 // l10n
|
356 se.gupta 1.3 getResponse()->operationContext.set(ContentLanguageListContainer(getLanguages()));
|
357 schuur 1.1 }
358
359 };
360
361 class ReferencesResponseHandler : public OperationResponseHandler, public SimpleObjectResponseHandler
362 {
363 public:
364 ReferencesResponseHandler(
365 CIMReferencesRequestMessage * request,
366 CIMReferencesResponseMessage * response)
367 : OperationResponseHandler(request, response)
368 {
369 }
370
371 virtual void complete()
372 {
373 Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
374 "OperationResponseHandler: complete()");
375
376 static_cast<CIMReferencesResponseMessage *>(
377 getResponse())->cimObjects = getObjects();
378 schuur 1.1
379 // l10n
|
380 se.gupta 1.3 getResponse()->operationContext.set(ContentLanguageListContainer(getLanguages()));
|
381 schuur 1.1 }
382
383 };
384
385 class ReferenceNamesResponseHandler : public OperationResponseHandler, public SimpleObjectPathResponseHandler
386 {
387 public:
388 ReferenceNamesResponseHandler(
389 CIMReferenceNamesRequestMessage * request,
390 CIMReferenceNamesResponseMessage * response)
391 : OperationResponseHandler(request, response)
392 {
393 }
394
395 virtual void complete()
396 {
397 Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
398 "OperationResponseHandler: complete()");
399
400 static_cast<CIMReferenceNamesResponseMessage *>(
401 getResponse())->objectNames.appendArray(getObjects());
402 schuur 1.1
403 // l10n
|
404 se.gupta 1.3 getResponse()->operationContext.set(ContentLanguageListContainer(getLanguages()));
|
405 schuur 1.1 }
406
407 };
408
409 class InvokeMethodResponseHandler : public OperationResponseHandler, public SimpleMethodResultResponseHandler
410 {
411 public:
412 InvokeMethodResponseHandler(
413 CIMInvokeMethodRequestMessage * request,
414 CIMInvokeMethodResponseMessage * response)
415 : OperationResponseHandler(request, response)
416 {
417 }
418
419 virtual void complete()
420 {
421 Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
422 "OperationResponseHandler: complete()");
423
424 // ATTN-RK-20020903: Is it legal for the return value to be null?
425 //if(getReturnValue().isNull())
426 schuur 1.1 //{
427 // ATTN: error? provider claims success, but did not deliver a CIMValue.
428 // return;
429 //}
430
431 static_cast<CIMInvokeMethodResponseMessage *>(
432 getResponse())->outParameters = getParamValues();
433
434 static_cast<CIMInvokeMethodResponseMessage *>(
435 getResponse())->retValue = getReturnValue();
436
437 // l10n
|
438 se.gupta 1.3 getResponse()->operationContext.set(ContentLanguageListContainer(getLanguages()));
|
439 schuur 1.1 }
440
441 };
442
443
|
444 kumpf 1.2 typedef void (*PEGASUS_INDICATION_CALLBACK)(
445 CIMProcessIndicationRequestMessage*);
446
|
447 schuur 1.1 class EnableIndicationsResponseHandler : public OperationResponseHandler, public SimpleIndicationResponseHandler
448 {
449 public:
450 EnableIndicationsResponseHandler(
451 CIMEnableIndicationsRequestMessage * request,
452 CIMEnableIndicationsResponseMessage * response,
453 CIMInstance & provider,
|
454 kumpf 1.2 PEGASUS_INDICATION_CALLBACK indicationCallback)
|
455 schuur 1.1 : OperationResponseHandler(request, response),
|
456 kumpf 1.2 _request_copy(*request),
457 _response_copy(*response),
458 _indicationCallback(indicationCallback)
|
459 schuur 1.1 {
460 _provider = provider;
461 }
462
463 virtual void deliver(const CIMIndication & cimIndication)
464 {
465 OperationContext context;
466
467 Array<CIMObjectPath> subscriptionInstanceNames;
468
469 context.insert(SubscriptionInstanceNamesContainer
470 (subscriptionInstanceNames));
471
472 deliver(context, cimIndication);
473 }
474
475 virtual void deliver(const OperationContext & context, const CIMIndication & cimIndication)
476 {
477 Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
478 "OperationResponseHandler: deliver()");
479 // ATTN: temporarily convert indication to instance
480 schuur 1.1 CIMInstance cimInstance(cimIndication);
481
482 //
483 // Get list of subscription instance names from context
484 //
485 Array<CIMObjectPath> subscriptionInstanceNames;
486 try
487 {
488 SubscriptionInstanceNamesContainer container = context.get
489 (SubscriptionInstanceNamesContainer::NAME);
490
491 subscriptionInstanceNames =
492 container.getInstanceNames();
493 }
|
494 kumpf 1.2 catch (Exception&)
|
495 schuur 1.1 {
496 subscriptionInstanceNames.clear();
497 }
498
499 // l10n
|
500 kumpf 1.2 ContentLanguages contentLangs;
501 try
502 {
503 // Get the Content-Language for this indication. The provider
504 // does not have to add specify a language for the indication.
505 ContentLanguageListContainer langContainer = context.get
506 (ContentLanguageListContainer::NAME);
507
508 contentLangs = langContainer.getLanguages();
509 }
510 catch (Exception&)
511 {
512 // The provider did not explicitly set a Content-Language for
513 // the indication. Fall back to the lang set in this object.
514 contentLangs = getLanguages();
515 }
516 // l10n -end
|
517 schuur 1.1
518 // create message
519 // l10n
520 CIMProcessIndicationRequestMessage * request =
521 new CIMProcessIndicationRequestMessage(
|
522 kumpf 1.6 XmlWriter::getNextMessageId(),
|
523 schuur 1.1 cimInstance.getPath().getNameSpace(),
524 cimInstance,
525 subscriptionInstanceNames,
526 _provider,
|
527 se.gupta 1.5 QueueIdStack()); // Must be filled in by the callback function
|
528 schuur 1.1 request->operationContext = context;
|
529 se.gupta 1.4 try
530 {
531 request->operationContext.set(ContentLanguageListContainer(contentLangs));
532 }catch(Exception &e)
533 {
534 request->operationContext.insert(ContentLanguageListContainer(contentLangs));
535 }
|
536 schuur 1.1
|
537 kumpf 1.2 _indicationCallback(request);
|
538 schuur 1.1 }
539
540 virtual void deliver(const Array<CIMIndication> & cimIndications)
541 {
542 OperationContext context;
543
544 deliver(context, cimIndications);
545 }
546
547 virtual void deliver(const OperationContext & context, const Array<CIMIndication> & cimIndications)
548 {
549 for(Uint32 i = 0, n = cimIndications.size(); i < n; i++)
550 {
551 deliver(context, cimIndications[i]);
552 }
553 }
554
555 private:
556 CIMEnableIndicationsRequestMessage _request_copy;
557 CIMEnableIndicationsResponseMessage _response_copy;
|
558 kumpf 1.2 PEGASUS_INDICATION_CALLBACK _indicationCallback;
|
559 schuur 1.1 };
560
561 PEGASUS_NAMESPACE_END
562
563 #endif
|