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

File: [Pegasus] / pegasus / src / Pegasus / ProviderManager / Attic / OperationResponseHandler.h (download)
Revision: 1.23.4.1, Thu Feb 6 20:47:03 2003 UTC (21 years, 5 months ago) by mday
Branch: mday-2-0-patches
Changes since 1.23: +1293 -272 lines
merged IBM Director updates

//%//////////////////////////-*-c++-*-//////////////////////////////////////////
//
// Copyright (c) 2000, 2001, 2002 BMC Software, Hewlett-Packard Company, IBM,
// The Open Group, Tivoli Systems
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
//==============================================================================
//
// Author: Chip Vincent (cvincent@us.ibm.com)
//
// Modified By: Carol Ann Krug Graves, Hewlett-Packard Company
//                  (carolann_graves@hp.com)
//
//%/////////////////////////////////////////////////////////////////////////////

#ifndef Pegasus_OperationResponseHandler_h
#define Pegasus_OperationResponseHandler_h

#include <Pegasus/Common/Config.h>
#include <Pegasus/Server/Linkage.h>
#include <Pegasus/Common/CIMMessage.h>
#include <Pegasus/Common/MessageQueueService.h>
#include <Pegasus/Common/Constants.h>

#include <Pegasus/Common/CIMClass.h>
#include <Pegasus/Common/CIMInstance.h>
#include <Pegasus/Common/CIMIndication.h>
#include <Pegasus/Common/CIMValue.h>

#include <Pegasus/Common/ResponseHandler.h>
#include <Pegasus/Common/IPC.h>

PEGASUS_NAMESPACE_BEGIN

class ResponseHandlerState
{
   public:
      enum OP_STATE
      {
	 UNKNOWN,
	 INITIALIZED,
	 PROCESSING,
	 COMPLETE,
	 FAILED
      };
      

      ResponseHandlerState(void)
	 :_state(INITIALIZED)
      {
      }
      
      virtual ~ResponseHandlerState(void)
      {
      }
      
      
      Uint32 get_state(void)
      {
	 return _state.value();
      }
      
      void set_state(OP_STATE state)
      {
	 _state = state;
      }
      
      AtomicInt _state;
};


/* ------------------------------------------------------------------------- */
/* operation specific response handlers                                      */
/* ------------------------------------------------------------------------- */

class SimpleOperationResponseHandler : public ResponseHandler, virtual public ResponseHandlerState
{
   public:
      
      SimpleOperationResponseHandler(void)
      {
	 
      }
      
      virtual void processing(void)
      {
	 set_state(PROCESSING);
      }
      
      virtual void processing(OperationContext & context)
      {
	 processing();
      }
      
      virtual void complete(void)
      {
	 set_state(COMPLETE);
      }
      
      virtual void complete(OperationContext & context)
      {
	 complete();
      }
      
      virtual void setStatus(Uint32 code, const String & message = String::EMPTY)
      {
	 _status = code;
	 _msg = message;
      }
      
   private:
      Uint32 _status;
      String _msg;
      
};



class OperationResponseHandler : public ResponseHandler, virtual public ResponseHandlerState
{
   public:
      OperationResponseHandler(void)
	 : _request_ptr(0),
	   _response_ptr(0)
      {
      }
      
      OperationResponseHandler(
	 CIMRequestMessage *request, 
	 CIMResponseMessage *response)
	 : _request_ptr(request),
	   _response_ptr(response)
      {
	 
      }

      
      virtual void processing(void)
      {
	 set_state(PROCESSING);
      }
      
      virtual void processing(OperationContext & context)
      {
	 processing();
      }
      
      virtual void complete(void)
      {
	 set_state(COMPLETE);
      }
      
      virtual void complete(OperationContext & context)
      {
	 complete();
      }
      
      virtual void setStatus(Uint32 code, const String & message = String::EMPTY)
      {
	 if(_response_ptr)
	    _response_ptr->cimException = PEGASUS_CIM_EXCEPTION(CIMStatusCode(code), message);
	 
	 _status = code;
	 _msg = message;
      }
      
      CIMRequestMessage *getRequest(void)
      {
	 return _request_ptr;
      }
      
      CIMResponseMessage * getResponse(void)
      {
	 return _response_ptr;
      }
      
   private:
      Uint32 _status;
      String _msg;
      
      CIMRequestMessage *_request_ptr;
      CIMResponseMessage *_response_ptr;
      
};



class SimpleInstanceResponseHandler: public InstanceResponseHandler, virtual public ResponseHandlerState
{
   public:
      SimpleInstanceResponseHandler(void)
      {
      }
      
      virtual void processing(void)
      {
	 set_state(PROCESSING);
      }
      
      virtual void processing(OperationContext & context)
      {
	 processing();
      }
      
      virtual void complete(void)
      {
	 set_state(COMPLETE);
      }
      
      virtual void complete(OperationContext & context)
      {
	 complete();
      }
      
      virtual void deliver(const CIMInstance & instance)
      {
	 _objects.append(instance);
      }
      
      virtual void deliver(const Array<CIMInstance> & instances)
      {
	 for(Uint32 i = 0, n = instances.size(); i < n; i++)
	 {
	    deliver(instances[i]);
	 }
      }
      
      const Array<CIMInstance> & getObjects(void) const
      {
	 return(_objects);
      }
      
      virtual void setStatus(Uint32 code, const String & message = String::EMPTY)
      {
	
      }
      
   private:
      Array<CIMInstance> _objects;
};



class GetInstanceResponseHandler: public InstanceResponseHandler, virtual public ResponseHandlerState
{
   public:
      GetInstanceResponseHandler(CIMGetInstanceRequestMessage *request,
				 CIMGetInstanceResponseMessage *response)
	 : _request_ptr(request),
	   _response_ptr(response)
      {
      }
      
      virtual void processing(void)
      {
	 set_state(PROCESSING);
      }
      
      virtual void processing(OperationContext & context)
      {
	 processing();
      }
      
      virtual void complete(void)
      {
	 set_state(COMPLETE);
	 if(getObjects().size() == 0)
	 {
            // error? provider claims success,
            // but did not deliver an instance.
            setStatus(CIM_ERR_NOT_FOUND);
	    
            return;
	 }

	 getResponse()->cimInstance = getObjects()[0];
	 
      }
      
      virtual void complete(OperationContext & context)
      {
	 complete();
      }
      
      virtual void deliver(const CIMInstance & instance)
      {
	 _objects.append(instance);
      }
      
      virtual void deliver(const Array<CIMInstance> & instances)
      {
	 for(Uint32 i = 0, n = instances.size(); i < n; i++)
	 {
	    deliver(instances[i]);
	 }
      }
      
      const Array<CIMInstance> & getObjects(void) const
      {
	 return(_objects);
      }
      
      virtual void setStatus(Uint32 code, const String & message = String::EMPTY)
      {
	 _response_ptr->cimException = PEGASUS_CIM_EXCEPTION(CIMStatusCode(code), message);
      }
      
      CIMGetInstanceRequestMessage *getRequest(void)
      {
	 return _request_ptr;
      }
      
      CIMGetInstanceResponseMessage * getResponse(void)
      {
	 return _response_ptr;
      }
      
   private:
      Array<CIMInstance> _objects;
      CIMGetInstanceRequestMessage * _request_ptr;
      CIMGetInstanceResponseMessage * _response_ptr;
};


class EnumerateInstancesResponseHandler: public InstanceResponseHandler, virtual public ResponseHandlerState
{
   public:
      EnumerateInstancesResponseHandler(CIMEnumerateInstancesRequestMessage * request,
					CIMEnumerateInstancesResponseMessage * response)
	 : _request_ptr(request),
	   _response_ptr(response)
      {
      }
      
      virtual void processing(void)
      {
	 set_state(PROCESSING);
      }
      
      virtual void processing(OperationContext & context)
      {
	 processing();
      }
      
      virtual void complete(void)
      {
	 set_state(COMPLETE);
	 getResponse()->cimNamedInstances = getObjects();
      }
      
      virtual void complete(OperationContext & context)
      {
	 complete();
      }
      
      virtual void deliver(const CIMInstance & instance)
      {
	 _objects.append(instance);
      }
      
      virtual void deliver(const Array<CIMInstance> & instances)
      {
	 for(Uint32 i = 0, n = instances.size(); i < n; i++)
	 {
	    deliver(instances[i]);
	 }
      }
      
      const Array<CIMInstance> & getObjects(void) const
      {
	 return(_objects);
      }
      
      virtual void setStatus(Uint32 code, const String & message = String::EMPTY)
      {
	 _response_ptr->cimException = PEGASUS_CIM_EXCEPTION(CIMStatusCode(code), message);
      }
      
      CIMEnumerateInstancesRequestMessage *getRequest(void)
      {
	 return _request_ptr;
      }

      CIMEnumerateInstancesResponseMessage * getResponse(void)
      {
	 return _response_ptr;
      }
      
   private:
      Array<CIMInstance> _objects;
      CIMEnumerateInstancesRequestMessage * _request_ptr;
      CIMEnumerateInstancesResponseMessage * _response_ptr;

};

class SimpleObjectPathResponseHandler: public ObjectPathResponseHandler, virtual public ResponseHandlerState
{

   public:
      SimpleObjectPathResponseHandler(void)
      {
      }
      
      virtual void processing(void)
      {
	 set_state(PROCESSING);
      }
      
      virtual void processing(OperationContext & context)
      {
	 processing();
      }
      
      virtual void complete(void)
      {
	 set_state(COMPLETE);
      }
      
      virtual void complete(OperationContext & context)
      {
	 complete();
      }
      
      virtual void deliver(const CIMObjectPath & instance)
      {
	 _objects.append(instance);
      }
      
      virtual void deliver(const Array<CIMObjectPath> & instances)
      {
	 _objects.appendArray(instances);
      }
      
      const Array<CIMObjectPath> & getObjects(void) const
      {
	 return(_objects);
      }
      
      virtual void setStatus(Uint32 code, const String & message = String::EMPTY)
      {
	 _status = code;
	 _msg = message;
      }
      
   private:
      Uint32 _status;
      String _msg;
      Array<CIMObjectPath> _objects;
};



class EnumerateInstanceNamesResponseHandler: public ObjectPathResponseHandler, virtual public ResponseHandlerState
{
   public:
      EnumerateInstanceNamesResponseHandler(
	 CIMEnumerateInstanceNamesRequestMessage * request,
	 CIMEnumerateInstanceNamesResponseMessage * response)
	 : _request_ptr(request),
	   _response_ptr(response)
      {
      }
      
      virtual void processing(void)
      {
	 set_state(PROCESSING);
      }
      
      virtual void processing(OperationContext & context)
      {
	 processing();
      }
      
      virtual void complete(void)
      {
	 set_state(COMPLETE);
	 getResponse()->instanceNames = getObjects();
      }
      
      virtual void complete(OperationContext & context)
      {
	 complete();
      }
      
      virtual void deliver(const CIMObjectPath & instance)
      {
	 _objects.append(instance);
      }
      
      virtual void deliver(const Array<CIMObjectPath> & instances)
      {
	 for(Uint32 i = 0, n = instances.size(); i < n; i++)
	 {
	    deliver(instances[i]);
	 }
      }
      
      const Array<CIMObjectPath> & getObjects(void) const
      {
	 return(_objects);
      }
      
      virtual void setStatus(Uint32 code, const String & message = String::EMPTY)
      {
	 _response_ptr->cimException = PEGASUS_CIM_EXCEPTION(CIMStatusCode(code), message);
      }
      
       CIMEnumerateInstanceNamesRequestMessage *getRequest(void)
      {
	 return _request_ptr;
      }
      
      CIMEnumerateInstanceNamesResponseMessage *getResponse(void)
      {
	 return _response_ptr;
      }
      
   private:
      Array<CIMObjectPath> _objects;
      CIMEnumerateInstanceNamesRequestMessage * _request_ptr;
      CIMEnumerateInstanceNamesResponseMessage * _response_ptr;
};


class CreateInstanceResponseHandler: public ObjectPathResponseHandler, virtual public ResponseHandlerState
{
   public:
      CreateInstanceResponseHandler(
	 CIMCreateInstanceRequestMessage * request,
	 CIMCreateInstanceResponseMessage * response)
	 : _request_ptr(request),
	   _response_ptr(response)
      {
      }
      
      virtual void processing(void)
      {
	 set_state(PROCESSING);
      }
      
      virtual void processing(OperationContext & context)
      {
	 processing();
      }
      
      virtual void complete(void)
      {
	 set_state(COMPLETE);
	 if (getObjects().size() == 0 )
	    return;
	 getResponse()->instanceName = getObjects()[0];
      }
      
      virtual void complete(OperationContext & context)
      {
	 complete();
      }
      
      virtual void deliver(const CIMObjectPath & instance)
      {
	 _objects.append(instance);
      }
      
      virtual void deliver(const Array<CIMObjectPath> & instances)
      {
	 for(Uint32 i = 0, n = instances.size(); i < n; i++)
	 {
	    deliver(instances[i]);
	 }
      }
      
      const Array<CIMObjectPath> & getObjects(void) const
      {
	 return(_objects);
      }
      
      virtual void setStatus(Uint32 code, const String & message = String::EMPTY)
      {
	 _response_ptr->cimException = PEGASUS_CIM_EXCEPTION(CIMStatusCode(code), message);
      }
      
      CIMCreateInstanceRequestMessage *getRequest(void)
      {
	 return _request_ptr;
      }
      
      CIMCreateInstanceResponseMessage *getResponse(void)
      {
	 return _response_ptr;
      }
      
   private:
      Array<CIMObjectPath> _objects;
      CIMCreateInstanceRequestMessage * _request_ptr;
      CIMCreateInstanceResponseMessage * _response_ptr;
};



class ModifyInstanceResponseHandler: virtual public ResponseHandler, virtual public ResponseHandlerState
{
   public:
      ModifyInstanceResponseHandler(
	 CIMModifyInstanceRequestMessage * request,
	 CIMModifyInstanceResponseMessage * response )
	 : _request_ptr(request),
	   _response_ptr(response)
      {
      }
      
      virtual void processing(void)
      {
	 set_state(PROCESSING);
      }
      
      virtual void processing(OperationContext & context)
      {
	 processing();
      }
      
      virtual void complete(void)
      {
	 set_state(COMPLETE);
      }
      
      virtual void complete(OperationContext & context)
      {
	 complete();
      }
      
      
      virtual void setStatus(Uint32 code, const String & message = String::EMPTY)
      {
	 _response_ptr->cimException = PEGASUS_CIM_EXCEPTION(CIMStatusCode(code), message);
      }
      
      CIMModifyInstanceRequestMessage *getRequest(void)
      {
	 return _request_ptr;
      }
      
      CIMModifyInstanceResponseMessage *getResponse(void)
      {
	 return _response_ptr;
      }
      
   private:
      CIMModifyInstanceRequestMessage * _request_ptr;
      CIMModifyInstanceResponseMessage * _response_ptr;
};


class DeleteInstanceResponseHandler: virtual public ResponseHandler, virtual public ResponseHandlerState
{
   public:
      
      DeleteInstanceResponseHandler(CIMDeleteInstanceRequestMessage * request,
				    CIMDeleteInstanceResponseMessage * response)
	 : _request_ptr(request),
	   _response_ptr(response)
      {
      }
      
      virtual void processing(void)
      {
	 set_state(PROCESSING);
      }
      
      virtual void processing(OperationContext & context)
      {
	 processing();
      }
      
      virtual void complete(void)
      {
	 set_state(COMPLETE);
      }
      
      virtual void complete(OperationContext & context)
      {
	 complete();
      }
      
      
      virtual void setStatus(Uint32 code, const String & message = String::EMPTY)
      {
	 _response_ptr->cimException = PEGASUS_CIM_EXCEPTION(CIMStatusCode(code), message);
      }
      
       CIMDeleteInstanceRequestMessage *getRequest(void)
      {
	 return _request_ptr;
      }
      
      CIMDeleteInstanceResponseMessage * getResponse(void)
      {
	 return _response_ptr;
      }
      
   private:

      CIMDeleteInstanceRequestMessage * _request_ptr;
      CIMDeleteInstanceResponseMessage * _response_ptr;
};



class GetPropertyResponseHandler: public ValueResponseHandler, virtual public ResponseHandlerState
{
   public:
      GetPropertyResponseHandler( 
	 CIMGetPropertyRequestMessage * request,
	 CIMGetPropertyResponseMessage * response)
	 : _request_ptr(request),
	   _response_ptr(response)
      {
      }
      
      virtual void processing(void)
      {
	 set_state(PROCESSING);
      }
      
      virtual void processing(OperationContext & context)
      {
	 processing();
      }
      
      virtual void complete(void)
      {
	 set_state(COMPLETE);
	 if(getObjects().size() == 0)
	 {
            // error? provider claims success,
            // but did not deliver an instance.
            setStatus(CIM_ERR_NOT_FOUND);
	    return;
	 }
	 
	 getResponse()->value = getObjects()[0];
      }
      
      virtual void complete(OperationContext & context)
      {
	 complete();
      }
      
      virtual void deliver(const CIMValue & instance)
      {
	 _objects.append(instance);
      }
      
      virtual void deliver(const Array<CIMValue> & instances)
      {
	 for(Uint32 i = 0, n = instances.size(); i < n; i++)
	 {
	    deliver(instances[i]);
	 }
      }
      
      const Array<CIMValue> & getObjects(void) const
      {
	 return(_objects);
      }
      
      virtual void setStatus(Uint32 code, const String & message = String::EMPTY)
      {
	 _response_ptr->cimException = PEGASUS_CIM_EXCEPTION(CIMStatusCode(code), message);
      }
      
      CIMGetPropertyRequestMessage *getRequest(void)
      {
	 return _request_ptr;
      }
      
      CIMGetPropertyResponseMessage * getResponse(void)
      {
	 return _response_ptr;
      }
      
   private:
      Array<CIMValue> _objects;
      CIMGetPropertyRequestMessage * _request_ptr;
      CIMGetPropertyResponseMessage * _response_ptr;
};


class SetPropertyResponseHandler: virtual public ResponseHandler, virtual public ResponseHandlerState
{
   public:
      SetPropertyResponseHandler(
	 CIMSetPropertyRequestMessage * request,
	 CIMSetPropertyResponseMessage * response)
	 : _request_ptr(request),
	   _response_ptr(response)
      {
      }
      
      virtual void processing(void)
      {
	 set_state(PROCESSING);
      }
      
      virtual void processing(OperationContext & context)
      {
	 processing();
      }
      
      virtual void complete(void)
      {
	 set_state(COMPLETE);
      }
      
      virtual void complete(OperationContext & context)
      {
	 complete();
      }
      
      virtual void setStatus(Uint32 code, const String & message = String::EMPTY)
      {
	 _response_ptr->cimException = PEGASUS_CIM_EXCEPTION(CIMStatusCode(code), message);
      }
      
      CIMSetPropertyRequestMessage *getRequest(void)
      {
	 return _request_ptr;
      }
      
      CIMSetPropertyResponseMessage * getResponse(void)
      {
	 return _response_ptr;
      }
      
   private:
      CIMSetPropertyRequestMessage *_request_ptr;
      CIMSetPropertyResponseMessage *_response_ptr;
};


class AssociatorNamesResponseHandler: public ObjectPathResponseHandler, virtual public ResponseHandlerState
{
   public:
      AssociatorNamesResponseHandler(
	 CIMAssociatorNamesRequestMessage * request,
	 CIMAssociatorNamesResponseMessage * response)
	 : _request_ptr(request),
	   _response_ptr(response)
      {
      }
      
      virtual void processing(void)
      {
	 set_state(PROCESSING);
      }
      
      virtual void processing(OperationContext & context)
      {
	 processing();
      }
      
      virtual void complete(void)
      {
	 set_state(COMPLETE);
	 getResponse()->objectNames.appendArray(getObjects());
      }
      
      virtual void complete(OperationContext & context)
      {
	 complete();
      }
      
      virtual void deliver(const CIMObjectPath & instance)
      {
	 _objects.append(instance);
      }
      
      virtual void deliver(const Array<CIMObjectPath> & instances)
      {
	 for(Uint32 i = 0, n = instances.size(); i < n; i++)
	 {
	    deliver(instances[i]);
	 }
      }
      
      const Array<CIMObjectPath> & getObjects(void) const
      {
	 return(_objects);
      }
      
      virtual void setStatus(Uint32 code, const String & message = String::EMPTY)
      {
	 _response_ptr->cimException = PEGASUS_CIM_EXCEPTION(CIMStatusCode(code), message);
      }
      
      CIMAssociatorNamesRequestMessage *getRequest(void)
      {
	 return _request_ptr;
      }
      
      CIMAssociatorNamesResponseMessage * getResponse(void)
      {
	 return _response_ptr;
      }
      
   private:
      Array<CIMObjectPath> _objects;
      CIMAssociatorNamesRequestMessage *_request_ptr;
      CIMAssociatorNamesResponseMessage *_response_ptr;
};


class ReferencesResponseHandler: public ObjectResponseHandler, virtual public ResponseHandlerState
{
   public:
      ReferencesResponseHandler(
	 CIMReferencesRequestMessage *request,
	 CIMReferencesResponseMessage *response)
	 : _request_ptr(request),
	   _response_ptr(response)
      {
      }
      
      virtual void processing(void)
      {
	 set_state(PROCESSING);
      }
      
      virtual void processing(OperationContext & context)
      {
	 processing();
      }
      
      virtual void complete(void)
      {
	 set_state(COMPLETE);
	 getResponse()->cimObjects = getObjects();
      }
      
      virtual void complete(OperationContext & context)
      {
	 complete();
      }
      
      virtual void deliver(const CIMObject & instance)
      {
	 _objects.append(instance);
      }
      
      virtual void deliver(const Array<CIMObject> & instances)
      {
	 for(Uint32 i = 0, n = instances.size(); i < n; i++)
	 {
	    deliver(instances[i]);
	 }
      }
      
      const Array<CIMObject> & getObjects(void) const
      {
	 return(_objects);
      }
      
      virtual void setStatus(Uint32 code, const String & message = String::EMPTY)
      {
	 _response_ptr->cimException = PEGASUS_CIM_EXCEPTION(CIMStatusCode(code), message);
      }
      
      CIMReferencesRequestMessage *getRequest(void)
      {
	 return _request_ptr;
      }
      
      CIMReferencesResponseMessage * getResponse(void)
      {
	 return _response_ptr;
      }
      
   private:
      Array<CIMObject> _objects;
      CIMReferencesRequestMessage *_request_ptr;
      CIMReferencesResponseMessage *_response_ptr;
};



class ReferenceNamesResponseHandler: public ObjectPathResponseHandler, virtual public ResponseHandlerState
{
   public:
      ReferenceNamesResponseHandler( 
	 CIMReferenceNamesRequestMessage *request,
	 CIMReferenceNamesResponseMessage *response)
	 : _request_ptr(request),
	   _response_ptr(response)
      {
      }
      
      virtual void processing(void)
      {
	 set_state(PROCESSING);
      }
      
      virtual void processing(OperationContext & context)
      {
	 processing();
      }
      
      virtual void complete(void)
      {
	 set_state(COMPLETE);
	 getResponse()->objectNames.appendArray(getObjects());
      }
      
      virtual void complete(OperationContext & context)
      {
	 complete();
      }
      
      virtual void deliver(const CIMObjectPath & instance)
      {
	 _objects.append(instance);
      }
      
      virtual void deliver(const Array<CIMObjectPath> & instances)
      {
	 for(Uint32 i = 0, n = instances.size(); i < n; i++)
	 {
	    deliver(instances[i]);
	 }
      }
      
      const Array<CIMObjectPath> & getObjects(void) const
      {
	 return(_objects);
      }
      
      virtual void setStatus(Uint32 code, const String & message = String::EMPTY)
      {
	 _response_ptr->cimException = PEGASUS_CIM_EXCEPTION(CIMStatusCode(code), message);
      }
      
      CIMReferenceNamesRequestMessage *getRequest(void)
      {
	 return _request_ptr;
      }
      
      CIMReferenceNamesResponseMessage *getResponse(void)
      {
	 return _response_ptr;
      }
      
   private:
      Array<CIMObjectPath> _objects;
      CIMReferenceNamesRequestMessage *_request_ptr;
      CIMReferenceNamesResponseMessage *_response_ptr;
};

class SimpleMethodResultResponseHandler: public MethodResultResponseHandler, virtual public ResponseHandlerState
{
   public:
      SimpleMethodResultResponseHandler(void) 
      {
      }
      
      virtual void processing(void)
      {
	 set_state(PROCESSING);
      }
      
      virtual void processing(OperationContext & context)
      {
	 processing();
      }
      
      virtual void complete(void)
      {
	 set_state(COMPLETE);
      }
      
      virtual void complete(OperationContext & context)
      {
	 complete();
      }

      void deliverParamValue(const CIMParamValue & outParamValue)
      {
	 _params.append(outParamValue);
      }
      

      void deliverParamValue(const Array<CIMParamValue> & outParamValues)
      {
	 _params.appendArray(outParamValues);
      }
      
      virtual void deliver(const CIMValue & instance)
      {
	 _objects.append(instance);
      }
      
      virtual void deliver(const Array<CIMValue> & instances)
      {
	 _objects.appendArray(instances);
      }
      
      const Array<CIMValue> & getObjects(void) const
      {
	 return(_objects);
      }
      
      const Array<CIMParamValue> & getParamValues(void) const
      {
	 return(_params);
      }
      
      const CIMValue & getReturnValue(void) const
      {
	 return _objects[0];
      }
      
      virtual void setStatus(Uint32 code, const String & message = String::EMPTY)
      {
	 _status = code;
	 _msg = message;
      }
   private:
      Uint32 _status;
      String _msg;
      Array<CIMParamValue> _params;
      Array<CIMValue> _objects;
};

class InvokeMethodResponseHandler: public MethodResultResponseHandler, virtual public ResponseHandlerState
{
   public:
      InvokeMethodResponseHandler( 
	 CIMInvokeMethodRequestMessage * request,
	 CIMInvokeMethodResponseMessage * response)
	 : _request_ptr(request),
	   _response_ptr(response)
      {
      }
      
      virtual void processing(void)
      {
	 set_state(PROCESSING);
      }
      
      virtual void processing(OperationContext & context)
      {
	 processing();
      }
      
      virtual void complete(void)
      {
	 set_state(COMPLETE);
	 if(getObjects().size() == 0 )
	    return;
	 
	 getResponse()->outParameters = getObjects();
      }
      
      virtual void complete(OperationContext & context)
      {
	 complete();
      }

      void deliverParamValue(const CIMParamValue & outParamValue)
      {
	 _params.append(outParamValue);
      }
      

      void deliverParamValue(const Array<CIMParamValue> & outParamValues)
      {
	 _params.appendArray(outParamValues);
      }
      
      virtual void deliver(const CIMValue & instance)
      {
	 _objects.append(instance);
      }
      
      virtual void deliver(const Array<CIMValue> & instances)
      {
	 _objects.appendArray(instances);
      }
      
      const Array<CIMParamValue> & getObjects(void) const
      {
	 return(_params);
      }
      
      virtual void setStatus(Uint32 code, const String & message = String::EMPTY)
      {
	 _response_ptr->cimException = PEGASUS_CIM_EXCEPTION(CIMStatusCode(code), message);
      }
      
      CIMInvokeMethodRequestMessage *getRequest(void)
      {
	 return _request_ptr;
      }
      
      CIMInvokeMethodResponseMessage * getResponse(void)
      {
	 return _response_ptr;
      }
      
   private:
      Array<CIMParamValue> _params;
      Array<CIMValue> _objects;
      CIMInvokeMethodRequestMessage * _request_ptr;
      CIMInvokeMethodResponseMessage * _response_ptr;
};

class HandleIndicationResponseHandler: public IndicationResponseHandler, virtual public ResponseHandlerState
{
   public:
      HandleIndicationResponseHandler(void)
      {
      }
      virtual void processing(void)
      {
	 set_state(PROCESSING);
      }
      
      virtual void processing(OperationContext & context)
      {
	 processing();
      }
      
      virtual void complete(void)
      {
	 set_state(COMPLETE);
      }
      
      virtual void complete(OperationContext & context)
      {
	 complete();
      }
      
      const Array<CIMIndication> & getObjects(void) const
      {
	 return(_objects);

      }

      virtual void deliver(const CIMIndication & indication)
      {
	 _objects.append(indication);
      }

      virtual void deliver(const Array<CIMIndication> & indications)
      {
	 _objects.appendArray(indications);
      }
      

      virtual void deliver(const OperationContext & context, 
			   const CIMIndication & indication)
      {
	 deliver(indication);
      }

      virtual void deliver(const OperationContext & context,
			   const Array<CIMIndication> & indications)
      {
	 deliver(indications);
      }

      virtual void setStatus(Uint32 code, const String & message = String::EMPTY)
      {
	 _status = code;
	 _msg = message;
      }
      
   private:

      Uint32  _status;
      String _msg;
      
      Array<CIMIndication> _objects;      
};



class EnableIndicationsResponseHandler: public IndicationResponseHandler, virtual public ResponseHandlerState
{
   public:
      EnableIndicationsResponseHandler(
	 CIMEnableIndicationsRequestMessage *request,
	 CIMEnableIndicationsResponseMessage *response,
	 MessageQueueService * source,
	 MessageQueueService * target = 0)
	 : _source(source),
	   _target(target),
	   _request_copy(*request),
	   _response_copy(*response)
      {

	 PEGASUS_ASSERT(_source != 0);
	 
	 // get indication service
	 if(_target == 0)
	 {
            Array<Uint32> serviceIds;
	    
            _source->find_services(PEGASUS_QUEUENAME_ESERVER_INDICATIONSERVICE, 0, 0, &serviceIds);
	    
            PEGASUS_ASSERT(serviceIds.size() != 0);
	    
            _target = dynamic_cast<MessageQueueService *>(MessageQueue::lookup(serviceIds[0]));
	    
            PEGASUS_ASSERT(_target != 0);
	 }
      }
      
      virtual void processing(void)
      {
	 set_state(PROCESSING);
      }
      
      virtual void processing(OperationContext & context)
      {
	 processing();
      }
      
      virtual void complete(void)
      {
	 set_state(COMPLETE);
      }
      
      virtual void complete(OperationContext & context)
      {
	 complete();
      }
      
      virtual void deliver(const CIMIndication & cimIndication)
      {
        // ATTN: temporarily convert indication to instance
        CIMInstance cimInstance(cimIndication);

        // create message
        CIMProcessIndicationRequestMessage * request =
	   new CIMProcessIndicationRequestMessage(
	      _request_copy.messageId,
	      cimInstance.getPath().getNameSpace(),
	      cimInstance,
	      QueueIdStack(_target->getQueueId(), _source->getQueueId()));

        // send message
        AsyncLegacyOperationStart * asyncRequest =
            new AsyncLegacyOperationStart(
            _source->get_next_xid(),
            0,
            _target->getQueueId(),
            request,
            _target->getQueueId());

        PEGASUS_ASSERT(asyncRequest != 0);

        _source->SendForget(asyncRequest);

      }

      virtual void deliver(const OperationContext & context,
			   const CIMIndication & cimIndication)
      {
	 deliver(cimIndication);
      }
      
      
      virtual void deliver(const Array<CIMIndication> & instances)
      {
	 for(Uint32 i = 0, n = instances.size(); i < n; i++)
	 {
	    deliver(instances[i]);
	 }
      }
      
      virtual void deliver(const OperationContext & context, 
			   const Array<CIMIndication> & instances)
      {
	 deliver(instances);
      }

      const Array<CIMIndication> & getObjects(void) const
      {
	 return(_objects);
      }
      
      virtual void setStatus(Uint32 code, const String & message = String::EMPTY)
      {
	 _response_copy.cimException = PEGASUS_CIM_EXCEPTION(CIMStatusCode(code), message);
      }
      
      CIMEnableIndicationsRequestMessage *getRequest(void)
      {
	 return new CIMEnableIndicationsRequestMessage(_request_copy);
      }
      
      CIMEnableIndicationsResponseMessage * getResponse(void)
      {
	 return new CIMEnableIndicationsResponseMessage(_response_copy);
      }

protected:
      MessageQueueService * _source;
      MessageQueueService * _target;
      
   private:
      Array<CIMIndication> _objects;
      CIMEnableIndicationsRequestMessage _request_copy;
      CIMEnableIndicationsResponseMessage _response_copy;
};



PEGASUS_NAMESPACE_END

#endif

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2