(file) Return to OperationResponseHandler.h CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / ProviderManager2

  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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2