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