(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 chip   1.11 //
 17 schuur 1.1  // 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 chip   1.11 // Modified By:
 31             //      Carol Ann Krug Graves, Hewlett-Packard Company (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             //      Seema Gupta (gseema@in.ibm.com) for PEP135
 36             //      Brian G. Campbell, EMC (campbell_brian@emc.com) - PEP140/phase2
 37 schuur 1.1  //
 38             //%/////////////////////////////////////////////////////////////////////////////
 39             
 40             #ifndef Pegasus_OperationResponseHandler_h
 41             #define Pegasus_OperationResponseHandler_h
 42             
 43             #include <Pegasus/Common/Config.h>
 44             #include <Pegasus/Server/Linkage.h>
 45             #include <Pegasus/Common/CIMMessage.h>
 46             #include <Pegasus/Common/MessageQueueService.h>
 47             #include <Pegasus/Common/Constants.h>
 48             #include <Pegasus/Common/ContentLanguages.h>  // l10n
 49             
 50             #include <Pegasus/Common/CIMClass.h>
 51             #include <Pegasus/Common/CIMInstance.h>
 52             #include <Pegasus/Common/CIMIndication.h>
 53             #include <Pegasus/Common/CIMValue.h>
 54             
 55             #include <Pegasus/Common/ResponseHandler.h>
 56             #include <Pegasus/Common/Logger.h>
 57 kumpf  1.6  #include <Pegasus/Common/XmlWriter.h>
 58 schuur 1.1  
 59             #include <Pegasus/ProviderManager2/SimpleResponseHandler.h>
 60             #include <Pegasus/ProviderManager2/Linkage.h>
 61             
 62             PEGASUS_NAMESPACE_BEGIN
 63             
 64             class PEGASUS_PPM_LINKAGE OperationResponseHandler
 65             {
 66 chip   1.11     friend class SimpleResponseHandler;
 67 brian.campbell 1.9  
 68 schuur         1.1  public:
 69 chip           1.11     OperationResponseHandler(
 70                             CIMRequestMessage * request,
 71                             CIMResponseMessage * response);
 72 schuur         1.1  
 73 brian.campbell 1.9      virtual ~OperationResponseHandler(void);
 74 chip           1.11 
 75 schuur         1.1      CIMRequestMessage * getRequest(void) const
 76                         {
 77                             return(_request);
 78                         }
 79                     
 80                         CIMResponseMessage * getResponse(void) const
 81                         {
 82                             return(_response);
 83                         }
 84                     
 85 chip           1.11     virtual void setStatus(
 86                             const Uint32 code,
 87                             const String & message = String::EMPTY)
 88 schuur         1.1      {
 89                             _response->cimException = PEGASUS_CIM_EXCEPTION(CIMStatusCode(code), message);
 90                         }
 91                     
 92 chip           1.11     virtual void setStatus(
 93                             const Uint32 code,
 94                             const ContentLanguages & langs,
 95                             const String & message = String::EMPTY)
 96                         {
 97                             _response->cimException =
 98                                 PEGASUS_CIM_EXCEPTION_LANG(
 99                                 langs,
100                                 CIMStatusCode(code),
101                                 message);
102 schuur         1.1      }
103                     
104                     protected:
105 brian.campbell 1.9  
106 chip           1.11     // the default for all derived handlers. Some handlers may not apply
107                         // async behavior because their callers cannot handle partial responses.
108                         virtual Boolean isAsync(void) const
109                         {
110                             return(true);
111                         }
112 brian.campbell 1.9  
113 chip           1.11     // send (deliver) asynchronously
114                         virtual void send(Boolean isComplete);
115 brian.campbell 1.9  
116 chip           1.11     // transfer any objects from handler to response. this does not clear()
117                         virtual void transfer(void)
118                         {
119                         }
120 brian.campbell 1.9  
121 chip           1.11     // validate whatever is necessary before the transfer
122                         virtual void validate(void)
123                         {
124                         }
125 brian.campbell 1.9  
126 chip           1.11     virtual String getClass(void) const
127                         {
128                             return(String("OperationResponseHandler"));
129                         }
130 brian.campbell 1.9  
131 chip           1.11     Uint32 getResponseObjectTotal(void) const
132                         {
133                             return(_responseObjectTotal);
134                         }
135 brian.campbell 1.9  
136 chip           1.11     // there can be many objects per message (or none at all - i.e complete())
137                         Uint32 getResponseMessageTotal(void) const
138                         {
139                             return(_responseMessageTotal);
140                         }
141 brian.campbell 1.9  
142 chip           1.11     Uint32 getResponseObjectThreshold(void) const
143                         {
144                             return(_responseObjectThreshold);
145                         }
146 brian.campbell 1.9  
147 schuur         1.1      CIMRequestMessage * _request;
148                         CIMResponseMessage * _response;
149                     
150 brian.campbell 1.9  private:
151 chip           1.11     Uint32 _responseObjectTotal;
152                         Uint32 _responseMessageTotal;
153                         Uint32 _responseObjectThreshold;
154                     
155 schuur         1.1  };
156                     
157 chip           1.11 class GetInstanceResponseHandler : public OperationResponseHandler, public SimpleInstanceResponseHandler
158                     {
159                     public:
160                         GetInstanceResponseHandler(
161                             CIMGetInstanceRequestMessage * request,
162                             CIMGetInstanceResponseMessage * response)
163                         : OperationResponseHandler(request, response)
164                         {
165                         }
166 schuur         1.1  
167 chip           1.11     virtual String getClass(void) const
168                         {
169                             return(String("GetInstanceResponseHandler"));
170                         }
171                     
172                         virtual void transfer(void)
173                         {
174                             if(size() > 0)
175                             {
176                                 CIMGetInstanceResponseMessage & msg =
177                                     *static_cast<CIMGetInstanceResponseMessage *>(getResponse());
178                     
179                                 msg.cimInstance = getObjects()[0];
180                             }
181                         }
182                     
183                         virtual void validate(void)
184                         {
185                             if(getResponseObjectTotal() == 0)
186                             {
187                                 // error? provider claims success,
188 chip           1.11             // but did not deliver an instance.
189                                 setStatus(CIM_ERR_NOT_FOUND);
190                             }
191                         }
192 schuur         1.1  };
193                     
194                     class EnumerateInstancesResponseHandler : public OperationResponseHandler, public SimpleInstanceResponseHandler
195                     {
196                     public:
197 chip           1.11     EnumerateInstancesResponseHandler(
198                             CIMEnumerateInstancesRequestMessage * request,
199                             CIMEnumerateInstancesResponseMessage * response)
200                         : OperationResponseHandler(request, response)
201                         {
202                         }
203 schuur         1.1  
204 chip           1.11     virtual String getClass(void) const
205                         {
206                             return(String("EnumerateInstancesResponseHandler"));
207                         }
208                     
209                         virtual void transfer(void)
210                         {
211                             CIMEnumerateInstancesResponseMessage & msg =
212                                 *static_cast<CIMEnumerateInstancesResponseMessage *>(getResponse());
213                     
214                             msg.cimNamedInstances = getObjects();
215                         }
216 schuur         1.1  };
217                     
218                     class EnumerateInstanceNamesResponseHandler : public OperationResponseHandler, public SimpleObjectPathResponseHandler
219                     {
220                     public:
221 chip           1.11     EnumerateInstanceNamesResponseHandler(
222                             CIMEnumerateInstanceNamesRequestMessage * request,
223                             CIMEnumerateInstanceNamesResponseMessage * response)
224                         : OperationResponseHandler(request, response)
225                         {
226                         }
227                     
228                         virtual String getClass(void) const
229                         {
230                             return(String("EnumerateInstanceNamesResponseHandler"));
231                         }
232                     
233                         virtual void transfer(void)
234                         {
235                             CIMEnumerateInstanceNamesResponseMessage & msg =
236                                 *static_cast<CIMEnumerateInstanceNamesResponseMessage *>(getResponse());
237                     
238                             msg.instanceNames = getObjects();
239                         }
240 schuur         1.1  };
241                     
242                     class CreateInstanceResponseHandler : public OperationResponseHandler, public SimpleObjectPathResponseHandler
243                     {
244                     public:
245 chip           1.11     CreateInstanceResponseHandler(
246                             CIMCreateInstanceRequestMessage * request,
247                             CIMCreateInstanceResponseMessage * response)
248                         : OperationResponseHandler(request, response)
249                         {
250                         }
251                     
252                         virtual String getClass(void) const
253                         {
254                             return(String("CreateInstanceResponseHandler"));
255                         }
256                     
257 brian.campbell 1.9  #if 0
258 chip           1.11     // ATTN: is it an error to not return instance name?
259                         virtual void validate(void)
260                         {
261                             if(getResponseObjectTotal() == 0)
262                             {
263                                 setStatus(CIM_ERR_NOT_FOUND);
264                             }
265                         }
266 brian.campbell 1.9  #endif
267 schuur         1.1  
268 chip           1.11     virtual void transfer(void)
269                         {
270                             if(size() > 0)
271                             {
272                                 CIMCreateInstanceResponseMessage & msg =
273                                     *static_cast<CIMCreateInstanceResponseMessage *>(getResponse());
274                     
275                                 msg.instanceName = getObjects()[0];
276                             }
277                         }
278 schuur         1.1  };
279                     
280                     class ModifyInstanceResponseHandler : public OperationResponseHandler, public SimpleResponseHandler
281                     {
282                     public:
283 chip           1.11     ModifyInstanceResponseHandler(
284                             CIMModifyInstanceRequestMessage * request,
285                             CIMModifyInstanceResponseMessage * response)
286                         : OperationResponseHandler(request, response)
287                         {
288                         }
289                     
290                         virtual String getClass(void) const
291                         {
292                             return(String("ModifyInstanceResponseHandler"));
293                         }
294                     
295 schuur         1.1  };
296                     
297                     class DeleteInstanceResponseHandler : public OperationResponseHandler, public SimpleResponseHandler
298                     {
299                     public:
300 chip           1.11     DeleteInstanceResponseHandler(
301                             CIMDeleteInstanceRequestMessage * request,
302                             CIMDeleteInstanceResponseMessage * response)
303                         : OperationResponseHandler(request, response)
304                         {
305                         }
306                     
307                         virtual String getClass(void) const
308                         {
309                             return(String("DeleteInstanceResponseHandler"));
310                         }
311                     
312 schuur         1.1  };
313                     
314                     class GetPropertyResponseHandler : public OperationResponseHandler, public SimpleValueResponseHandler
315                     {
316                     public:
317 chip           1.11     GetPropertyResponseHandler(
318                             CIMGetPropertyRequestMessage * request,
319                             CIMGetPropertyResponseMessage * response)
320                         : OperationResponseHandler(request, response)
321                         {
322                         }
323                     
324                         virtual String getClass(void) const
325                         {
326                             return(String("GetPropertyResponseHandler"));
327                         }
328 schuur         1.1  
329 chip           1.11     virtual void transfer(void)
330                         {
331                             if(size() > 0)
332                             {
333                                 CIMGetPropertyResponseMessage & msg =
334                                     *static_cast<CIMGetPropertyResponseMessage *>(getResponse());
335                     
336                                 msg.value = getObjects()[0];
337                             }
338                         }
339                     
340                         virtual void validate(void)
341                         {
342                             // error? provider claims success,
343                             // but did not deliver an instance.
344                             if(getResponseObjectTotal() == 0)
345                             {
346                                 setStatus(CIM_ERR_NOT_FOUND);
347                             }
348                         }
349 schuur         1.1  };
350                     
351                     class SetPropertyResponseHandler : public OperationResponseHandler, public SimpleResponseHandler
352                     {
353                     public:
354 chip           1.11     SetPropertyResponseHandler(
355                             CIMSetPropertyRequestMessage * request,
356                             CIMSetPropertyResponseMessage * response)
357                         : OperationResponseHandler(request, response)
358                         {
359                         }
360                     
361                         virtual String getClass(void) const
362                         {
363                             return(String("SetPropertyResponseHandler"));
364                         }
365                     
366 schuur         1.1  };
367                     
368                     class ExecQueryResponseHandler : public OperationResponseHandler, public SimpleInstance2ObjectResponseHandler
369                     {
370                     public:
371 chip           1.11     ExecQueryResponseHandler(
372                             CIMExecQueryRequestMessage * request,
373                             CIMExecQueryResponseMessage * response)
374                         : OperationResponseHandler(request, response)
375                         {
376                         }
377 schuur         1.1  
378 chip           1.11     virtual String getClass(void) const
379                         {
380                             return(String("ExecQueryResponseHandler"));
381                         }
382 schuur         1.1  
383 chip           1.11     virtual void transfer(void)
384                         {
385                             CIMExecQueryResponseMessage & msg =
386                                 *static_cast<CIMExecQueryResponseMessage *>(getResponse());
387                     
388                             msg.cimObjects = getObjects();
389                         }
390                     
391                         // this handler will not send async
392                         virtual Boolean isAsync(void) const
393                         {
394                             return(false);
395                         }
396 schuur         1.1  };
397                     
398                     class AssociatorsResponseHandler : public OperationResponseHandler, public SimpleObjectResponseHandler
399                     {
400                     public:
401 chip           1.11     AssociatorsResponseHandler(
402                             CIMAssociatorsRequestMessage * request,
403                             CIMAssociatorsResponseMessage * response)
404                         : OperationResponseHandler(request, response)
405                         {
406                         }
407                     
408                         virtual String getClass(void) const
409                         {
410                             return(String("AssociatorsResponseHandler"));
411                         }
412 schuur         1.1  
413 chip           1.11     virtual void transfer(void)
414                         {
415                             CIMAssociatorsResponseMessage & msg =
416                                 *static_cast<CIMAssociatorsResponseMessage *>(getResponse());
417                     
418                             msg.cimObjects = getObjects();
419                         }
420 schuur         1.1  };
421                     
422                     class AssociatorNamesResponseHandler : public OperationResponseHandler, public SimpleObjectPathResponseHandler
423                     {
424                     public:
425 chip           1.11     AssociatorNamesResponseHandler(
426                             CIMAssociatorNamesRequestMessage * request,
427                             CIMAssociatorNamesResponseMessage * response)
428                         : OperationResponseHandler(request, response)
429                         {
430                         }
431                     
432                         virtual String getClass(void) const
433                         {
434                             return(String("AssociatorNamesResponseHandler"));
435                         }
436                     
437                         virtual void transfer(void)
438                         {
439                             CIMAssociatorNamesResponseMessage & msg =
440                                 *static_cast<CIMAssociatorNamesResponseMessage *>(getResponse());
441                     
442                             msg.objectNames = getObjects();
443                         }
444 schuur         1.1  };
445                     
446                     class ReferencesResponseHandler : public OperationResponseHandler, public SimpleObjectResponseHandler
447                     {
448                     public:
449 chip           1.11     ReferencesResponseHandler(
450                             CIMReferencesRequestMessage * request,
451                             CIMReferencesResponseMessage * response)
452                         : OperationResponseHandler(request, response)
453                         {
454                         }
455                     
456                         virtual String getClass(void) const
457                         {
458                             return(String("ReferencesResponseHandler"));
459                         }
460                     
461                         virtual void transfer(void)
462                         {
463                             CIMReferencesResponseMessage & msg =
464                                 *static_cast<CIMReferencesResponseMessage *>(getResponse());
465                     
466                             msg.cimObjects = getObjects();
467                         }
468 schuur         1.1  };
469                     
470                     class ReferenceNamesResponseHandler : public OperationResponseHandler, public SimpleObjectPathResponseHandler
471                     {
472                     public:
473 chip           1.11     ReferenceNamesResponseHandler(
474                             CIMReferenceNamesRequestMessage * request,
475                             CIMReferenceNamesResponseMessage * response)
476                         : OperationResponseHandler(request, response)
477                         {
478                         }
479                     
480                         virtual String getClass(void) const
481                         {
482                             return(String("ReferenceNamesResponseHandler"));
483                         }
484                     
485                         virtual void transfer(void)
486                         {
487                             CIMReferenceNamesResponseMessage & msg =
488                                 *static_cast<CIMReferenceNamesResponseMessage *>(getResponse());
489                     
490                             msg.objectNames = getObjects();
491                         }
492 schuur         1.1  };
493                     
494                     class InvokeMethodResponseHandler : public OperationResponseHandler, public SimpleMethodResultResponseHandler
495                     {
496                     public:
497 chip           1.11     InvokeMethodResponseHandler(
498                             CIMInvokeMethodRequestMessage * request,
499                             CIMInvokeMethodResponseMessage * response)
500                         : OperationResponseHandler(request, response)
501                         {
502                         }
503                     
504                         virtual String getClass(void) const
505                         {
506                             return(String("InvokeMethodResponseHandler"));
507                         }
508                     
509                         virtual void transfer(void)
510                         {
511                             CIMInvokeMethodResponseMessage & msg =
512                                 *static_cast<CIMInvokeMethodResponseMessage *>(getResponse());
513 schuur         1.1  
514 chip           1.11         msg.outParameters = getParamValues();
515                     
516                             // ATTN-RK-20020903: Is it legal for the return value to be null?
517                             // if not, then the check must be done here since deliver() works off the
518                             // virtual size, which refers to out parameters!
519                             msg.retValue = getReturnValue();
520                         }
521 schuur         1.1  };
522                     
523 brian.campbell 1.9  typedef void (*PEGASUS_INDICATION_CALLBACK)(CIMProcessIndicationRequestMessage*);
524 kumpf          1.2  
525 schuur         1.1  class EnableIndicationsResponseHandler : public OperationResponseHandler, public SimpleIndicationResponseHandler
526                     {
527                     public:
528 chip           1.11     EnableIndicationsResponseHandler(
529                             CIMEnableIndicationsRequestMessage * request,
530                             CIMEnableIndicationsResponseMessage * response,
531                             CIMInstance & provider,
532                             PEGASUS_INDICATION_CALLBACK indicationCallback)
533                         : OperationResponseHandler(request, response),
534                             _request_copy(*request),
535                             _response_copy(*response),
536                             _indicationCallback(indicationCallback)
537                         {
538                             _provider = provider;
539                         }
540                     
541                         virtual String getClass(void) const
542                         {
543                             return(String("EnableIndicationsResponseHandler"));
544                         }
545                     
546                         // this handler will not send async
547                         virtual Boolean isAsync(void) const
548                         {
549 chip           1.11         return(false);
550                         }
551                     
552                         virtual void deliver(const CIMIndication & cimIndication)
553                         {
554                             OperationContext context;
555                     
556                             Array<CIMObjectPath> subscriptionInstanceNames;
557                     
558                             context.insert(SubscriptionInstanceNamesContainer(subscriptionInstanceNames));
559                     
560                             deliver(context, cimIndication);
561                         }
562                     
563                         virtual void deliver(const OperationContext & context, const CIMIndication & cimIndication)
564                         {
565                             // ATTN: temporarily convert indication to instance
566                             CIMInstance cimInstance(cimIndication);
567                     
568                             //  Get list of subscription instance names from context
569                             Array<CIMObjectPath> subscriptionInstanceNames;
570 chip           1.11 
571                             try
572                             {
573                                 SubscriptionInstanceNamesContainer container =
574                                     context.get(SubscriptionInstanceNamesContainer::NAME);
575                     
576                                 subscriptionInstanceNames = container.getInstanceNames();
577                             }
578                             catch(Exception &)
579                             {
580                                 subscriptionInstanceNames.clear();
581                             }
582                     
583                             // l10n
584                             ContentLanguages contentLangs;
585                     
586                             try
587                             {
588                                 // Get the Content-Language for this indication.  The provider
589                                 // does not have to add specify a language for the indication.
590                                 ContentLanguageListContainer langContainer =
591 chip           1.11                 context.get(ContentLanguageListContainer::NAME);
592                     
593                                 contentLangs = langContainer.getLanguages();
594                             }
595                             catch(Exception &)
596                             {
597                                 // The provider did not explicitly set a Content-Language for
598                                 // the indication.  Fall back to the lang set in this object.
599                                 contentLangs = getLanguages();
600                             }
601                             // l10n -end
602                     
603                             // create message
604                             // l10n
605                             CIMProcessIndicationRequestMessage * request =
606                                 new CIMProcessIndicationRequestMessage(
607                                 XmlWriter::getNextMessageId(),
608                                 cimInstance.getPath().getNameSpace(),
609                                 cimInstance,
610                                 subscriptionInstanceNames,
611                                 _provider,
612 chip           1.11             QueueIdStack());  // Must be filled in by the callback function
613                     
614                             request->operationContext = context;
615                     
616                             try
617                             {
618                                 request->operationContext.set(ContentLanguageListContainer(contentLangs));
619                             }
620                             catch(Exception &)
621                             {
622                                 request->operationContext.insert(ContentLanguageListContainer(contentLangs));
623                             }
624                     
625                             _indicationCallback(request);
626                         }
627                     
628                         virtual void deliver(const Array<CIMIndication> & cimIndications)
629                         {
630                             OperationContext context;
631                     
632                             deliver(context, cimIndications);
633 chip           1.11     }
634                     
635                         virtual void deliver(const OperationContext & context, const Array<CIMIndication> & cimIndications)
636                         {
637                             for(Uint32 i = 0, n = cimIndications.size(); i < n; i++)
638                             {
639                                 deliver(context, cimIndications[i]);
640                             }
641                         }
642 brian.campbell 1.9  
643                     private:
644 chip           1.11     CIMEnableIndicationsRequestMessage _request_copy;
645                         CIMEnableIndicationsResponseMessage _response_copy;
646                         PEGASUS_INDICATION_CALLBACK _indicationCallback;
647 schuur         1.1  
648 brian.campbell 1.9  };
649 schuur         1.1  
650                     PEGASUS_NAMESPACE_END
651                     
652                     #endif

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2