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
55 schuur 1.1 #include <Pegasus/ProviderManager2/SimpleResponseHandler.h>
56
57 #include <Pegasus/ProviderManager2/Linkage.h>
58
59 PEGASUS_NAMESPACE_BEGIN
60
61 class PEGASUS_PPM_LINKAGE OperationResponseHandler
62 {
63 public:
64 OperationResponseHandler(CIMRequestMessage * request, CIMResponseMessage * response)
65 : _request(request), _response(response)
66 {
67 }
68
69 virtual ~OperationResponseHandler(void)
70 {
71 }
72
73 CIMRequestMessage * getRequest(void) const
74 {
75 return(_request);
76 schuur 1.1 }
77
78 CIMResponseMessage * getResponse(void) const
79 {
80 return(_response);
81 }
82
83 virtual void setStatus(const Uint32 code, const String & message = String::EMPTY)
84 {
85 _response->cimException = PEGASUS_CIM_EXCEPTION(CIMStatusCode(code), message);
86 }
87
88 virtual void setStatus(const Uint32 code,
89 const ContentLanguages & langs,
90 const String & message = String::EMPTY)
91 {
92 _response->cimException = PEGASUS_CIM_EXCEPTION_LANG(
93 langs,
94 CIMStatusCode(code),
95 message);
96 }
97 schuur 1.1
98 protected:
99 CIMRequestMessage * _request;
100 CIMResponseMessage * _response;
101
102 };
103
104
105 /* ------------------------------------------------------------------------- */
106 /* operation specific response handlers */
107 /* ------------------------------------------------------------------------- */
108
109 class GetInstanceResponseHandler: public OperationResponseHandler, public SimpleInstanceResponseHandler
110 {
111 public:
112 GetInstanceResponseHandler(
113 CIMGetInstanceRequestMessage * request,
114 CIMGetInstanceResponseMessage * response)
115 : OperationResponseHandler(request, response)
116 {
117 }
118 schuur 1.1
119 virtual void complete()
120 {
121 Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
122 "OperationResponseHandler: complete()");
123
124 if(getObjects().size() == 0)
125 {
126 // error? provider claims success,
127 // but did not deliver an instance.
128 setStatus(CIM_ERR_NOT_FOUND);
129
130 return;
131 }
132
133 static_cast<CIMGetInstanceResponseMessage *>(
134 getResponse())->cimInstance = getObjects()[0];
135
136 // l10n
137 getResponse()->contentLanguages = getLanguages();
|
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 getResponse()->contentLanguages = getLanguages();
|
162 se.gupta 1.3 getResponse()->operationContext.set(ContentLanguageListContainer(getLanguages()));
|
163 schuur 1.1 }
164
165 };
166
167 class EnumerateInstanceNamesResponseHandler : public OperationResponseHandler, public SimpleObjectPathResponseHandler
168 {
169 public:
170 EnumerateInstanceNamesResponseHandler(
171 CIMEnumerateInstanceNamesRequestMessage * request,
172 CIMEnumerateInstanceNamesResponseMessage * response)
173 : OperationResponseHandler(request, response)
174 {
175 }
176
177 virtual void complete()
178 {
179 Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
180 "OperationResponseHandler: complete()");
181
182 static_cast<CIMEnumerateInstanceNamesResponseMessage *>(
183 getResponse())->instanceNames = getObjects();
184 schuur 1.1
185 // l10n
186 getResponse()->contentLanguages = getLanguages();
|
187 se.gupta 1.3 getResponse()->operationContext.set(ContentLanguageListContainer(getLanguages()));
|
188 schuur 1.1 }
189
190 };
191
192 class CreateInstanceResponseHandler : public OperationResponseHandler, public SimpleObjectPathResponseHandler
193 {
194 public:
195 CreateInstanceResponseHandler(
196 CIMCreateInstanceRequestMessage * request,
197 CIMCreateInstanceResponseMessage * response)
198 : OperationResponseHandler(request, response)
199 {
200 }
201
202 virtual void complete()
203 {
204 Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
205 "OperationResponseHandler: complete()");
206
207 if(getObjects().size() == 0)
208 {
209 schuur 1.1 // ATTN: is it an error to not return instance name?
210 return;
211 }
212
213 static_cast<CIMCreateInstanceResponseMessage *>(
214 getResponse())->instanceName = getObjects()[0];
215
216 // l10n
217 getResponse()->contentLanguages = getLanguages();
|
218 se.gupta 1.3 getResponse()->operationContext.set(ContentLanguageListContainer(getLanguages()));
|
219 schuur 1.1 }
220
221 };
222
223 class ModifyInstanceResponseHandler : public OperationResponseHandler, public SimpleResponseHandler
224 {
225 public:
226 ModifyInstanceResponseHandler(
227 CIMModifyInstanceRequestMessage * request,
228 CIMModifyInstanceResponseMessage * response)
229 : OperationResponseHandler(request, response)
230 {
231 }
232
233 };
234
235 class DeleteInstanceResponseHandler : public OperationResponseHandler, public SimpleResponseHandler
236 {
237 public:
238 DeleteInstanceResponseHandler(
239 CIMDeleteInstanceRequestMessage * request,
240 schuur 1.1 CIMDeleteInstanceResponseMessage * response)
241 : OperationResponseHandler(request, response)
242 {
243 }
244
245 };
246
247 class GetPropertyResponseHandler : public OperationResponseHandler, public SimpleValueResponseHandler
248 {
249 public:
250 GetPropertyResponseHandler(
251 CIMGetPropertyRequestMessage * request,
252 CIMGetPropertyResponseMessage * response)
253 : OperationResponseHandler(request, response)
254 {
255 }
256
257 virtual void complete()
258 {
259 Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
260 "OperationResponseHandler: complete()");
261 schuur 1.1
262 if(getObjects().size() == 0)
263 {
264 // error? provider claims success,
265 // but did not deliver an instance.
266 setStatus(CIM_ERR_NOT_FOUND);
267
268 return;
269 }
270
271 static_cast<CIMGetPropertyResponseMessage *>(
272 getResponse())->value = getObjects()[0];
273
274 // l10n
275 getResponse()->contentLanguages = getLanguages();
|
276 se.gupta 1.3 getResponse()->operationContext.set(ContentLanguageListContainer(getLanguages()));
|
277 schuur 1.1 }
278 };
279
280 class SetPropertyResponseHandler : public OperationResponseHandler, public SimpleResponseHandler
281 {
282 public:
283 SetPropertyResponseHandler(
284 CIMSetPropertyRequestMessage * request,
285 CIMSetPropertyResponseMessage * response)
286 : OperationResponseHandler(request, response)
287 {
288 }
289
290 };
291
292 class ExecQueryResponseHandler : public OperationResponseHandler, public SimpleInstance2ObjectResponseHandler
293 {
294 public:
295 ExecQueryResponseHandler(
296 CIMExecQueryRequestMessage * request,
297 CIMExecQueryResponseMessage * response)
298 schuur 1.1 : OperationResponseHandler(request, response)
299 {
300 }
301
302 virtual void complete()
303 {
304 Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
305 "OperationResponseHandler: complete()");
306
307 static_cast<CIMExecQueryResponseMessage *>(
308 getResponse())->cimObjects = getObjects();
309
310 // l10n
311 getResponse()->contentLanguages = getLanguages();
|
312 se.gupta 1.3 getResponse()->operationContext.set(ContentLanguageListContainer(getLanguages()));
|
313 schuur 1.1 }
314
315 };
316
317
318 class AssociatorsResponseHandler : public OperationResponseHandler, public SimpleObjectResponseHandler
319 {
320 public:
321 AssociatorsResponseHandler(
322 CIMAssociatorsRequestMessage * request,
323 CIMAssociatorsResponseMessage * response)
324 : OperationResponseHandler(request, response)
325 {
326 }
327
328 virtual void complete()
329 {
330 Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
331 "OperationResponseHandler: complete()");
332
333 static_cast<CIMAssociatorsResponseMessage *>(
334 schuur 1.1 getResponse())->cimObjects = getObjects();
335
336 // l10n
337 getResponse()->contentLanguages = getLanguages();
|
338 se.gupta 1.3 getResponse()->operationContext.set(ContentLanguageListContainer(getLanguages()));
|
339 schuur 1.1 }
340
341 };
342
343 class AssociatorNamesResponseHandler : public OperationResponseHandler, public SimpleObjectPathResponseHandler
344 {
345 public:
346 AssociatorNamesResponseHandler(
347 CIMAssociatorNamesRequestMessage * request,
348 CIMAssociatorNamesResponseMessage * response)
349 : OperationResponseHandler(request, response)
350 {
351 }
352
353 virtual void complete()
354 {
355 Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
356 "OperationResponseHandler: complete()");
357
358 static_cast<CIMAssociatorNamesResponseMessage *>(
359 getResponse())->objectNames.appendArray(getObjects());
360 schuur 1.1
361 // l10n
362 getResponse()->contentLanguages = getLanguages();
|
363 se.gupta 1.3 getResponse()->operationContext.set(ContentLanguageListContainer(getLanguages()));
|
364 schuur 1.1 }
365
366 };
367
368 class ReferencesResponseHandler : public OperationResponseHandler, public SimpleObjectResponseHandler
369 {
370 public:
371 ReferencesResponseHandler(
372 CIMReferencesRequestMessage * request,
373 CIMReferencesResponseMessage * response)
374 : OperationResponseHandler(request, response)
375 {
376 }
377
378 virtual void complete()
379 {
380 Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
381 "OperationResponseHandler: complete()");
382
383 static_cast<CIMReferencesResponseMessage *>(
384 getResponse())->cimObjects = getObjects();
385 schuur 1.1
386 // l10n
387 getResponse()->contentLanguages = getLanguages();
|
388 se.gupta 1.3 getResponse()->operationContext.set(ContentLanguageListContainer(getLanguages()));
|
389 schuur 1.1 }
390
391 };
392
393 class ReferenceNamesResponseHandler : public OperationResponseHandler, public SimpleObjectPathResponseHandler
394 {
395 public:
396 ReferenceNamesResponseHandler(
397 CIMReferenceNamesRequestMessage * request,
398 CIMReferenceNamesResponseMessage * response)
399 : OperationResponseHandler(request, response)
400 {
401 }
402
403 virtual void complete()
404 {
405 Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
406 "OperationResponseHandler: complete()");
407
408 static_cast<CIMReferenceNamesResponseMessage *>(
409 getResponse())->objectNames.appendArray(getObjects());
410 schuur 1.1
411 // l10n
412 getResponse()->contentLanguages = getLanguages();
|
413 se.gupta 1.3 getResponse()->operationContext.set(ContentLanguageListContainer(getLanguages()));
|
414 schuur 1.1 }
415
416 };
417
418 class InvokeMethodResponseHandler : public OperationResponseHandler, public SimpleMethodResultResponseHandler
419 {
420 public:
421 InvokeMethodResponseHandler(
422 CIMInvokeMethodRequestMessage * request,
423 CIMInvokeMethodResponseMessage * response)
424 : OperationResponseHandler(request, response)
425 {
426 }
427
428 virtual void complete()
429 {
430 Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
431 "OperationResponseHandler: complete()");
432
433 // ATTN-RK-20020903: Is it legal for the return value to be null?
434 //if(getReturnValue().isNull())
435 schuur 1.1 //{
436 // ATTN: error? provider claims success, but did not deliver a CIMValue.
437 // return;
438 //}
439
440 static_cast<CIMInvokeMethodResponseMessage *>(
441 getResponse())->outParameters = getParamValues();
442
443 static_cast<CIMInvokeMethodResponseMessage *>(
444 getResponse())->retValue = getReturnValue();
445
446 // l10n
447 getResponse()->contentLanguages = getLanguages();
|
448 se.gupta 1.3 getResponse()->operationContext.set(ContentLanguageListContainer(getLanguages()));
|
449 schuur 1.1 }
450
451 };
452
453
|
454 kumpf 1.2 typedef void (*PEGASUS_INDICATION_CALLBACK)(
455 CIMProcessIndicationRequestMessage*);
456
|
457 schuur 1.1 class EnableIndicationsResponseHandler : public OperationResponseHandler, public SimpleIndicationResponseHandler
458 {
459 public:
460 EnableIndicationsResponseHandler(
461 CIMEnableIndicationsRequestMessage * request,
462 CIMEnableIndicationsResponseMessage * response,
463 CIMInstance & provider,
|
464 kumpf 1.2 PEGASUS_INDICATION_CALLBACK indicationCallback)
|
465 schuur 1.1 : OperationResponseHandler(request, response),
|
466 kumpf 1.2 _request_copy(*request),
467 _response_copy(*response),
468 _indicationCallback(indicationCallback)
|
469 schuur 1.1 {
470 _provider = provider;
471 }
472
473 virtual void deliver(const CIMIndication & cimIndication)
474 {
475 OperationContext context;
476
477 Array<CIMObjectPath> subscriptionInstanceNames;
478
479 context.insert(SubscriptionInstanceNamesContainer
480 (subscriptionInstanceNames));
481
482 deliver(context, cimIndication);
483 }
484
485 virtual void deliver(const OperationContext & context, const CIMIndication & cimIndication)
486 {
487 Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
488 "OperationResponseHandler: deliver()");
489 // ATTN: temporarily convert indication to instance
490 schuur 1.1 CIMInstance cimInstance(cimIndication);
491
492 //
493 // Get list of subscription instance names from context
494 //
495 Array<CIMObjectPath> subscriptionInstanceNames;
496 try
497 {
498 SubscriptionInstanceNamesContainer container = context.get
499 (SubscriptionInstanceNamesContainer::NAME);
500
501 subscriptionInstanceNames =
502 container.getInstanceNames();
503 }
|
504 kumpf 1.2 catch (Exception&)
|
505 schuur 1.1 {
506 subscriptionInstanceNames.clear();
507 }
508
509 // l10n
|
510 kumpf 1.2 ContentLanguages contentLangs;
511 try
512 {
513 // Get the Content-Language for this indication. The provider
514 // does not have to add specify a language for the indication.
515 ContentLanguageListContainer langContainer = context.get
516 (ContentLanguageListContainer::NAME);
517
518 contentLangs = langContainer.getLanguages();
519 }
520 catch (Exception&)
521 {
522 // The provider did not explicitly set a Content-Language for
523 // the indication. Fall back to the lang set in this object.
524 contentLangs = getLanguages();
525 }
526 // l10n -end
|
527 schuur 1.1
528 // create message
529 // l10n
530 CIMProcessIndicationRequestMessage * request =
531 new CIMProcessIndicationRequestMessage(
532 _request_copy.messageId,
533 cimInstance.getPath().getNameSpace(),
534 cimInstance,
535 subscriptionInstanceNames,
536 _provider,
|
537 kumpf 1.2 QueueIdStack(), // Must be filled in by the callback function
|
538 schuur 1.1 contentLangs);
539 request->operationContext = context;
540
|
541 kumpf 1.2 _indicationCallback(request);
|
542 schuur 1.1 }
543
544 virtual void deliver(const Array<CIMIndication> & cimIndications)
545 {
546 OperationContext context;
547
548 deliver(context, cimIndications);
549 }
550
551 virtual void deliver(const OperationContext & context, const Array<CIMIndication> & cimIndications)
552 {
553 for(Uint32 i = 0, n = cimIndications.size(); i < n; i++)
554 {
555 deliver(context, cimIndications[i]);
556 }
557 }
558
559 private:
560 CIMEnableIndicationsRequestMessage _request_copy;
561 CIMEnableIndicationsResponseMessage _response_copy;
|
562 kumpf 1.2 PEGASUS_INDICATION_CALLBACK _indicationCallback;
|
563 schuur 1.1 };
564
565 PEGASUS_NAMESPACE_END
566
567 #endif
|