datacommsserver/esockserver/inc/es_commsdataobject.h
changeset 0 dfb7c4ff071f
child 23 cbb19216b74d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/datacommsserver/esockserver/inc/es_commsdataobject.h	Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,328 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+/**
+ @file
+ @publishedPartner
+ @released
+*/
+
+#ifndef ES_COMMSDATAOBJECT_H
+#define ES_COMMSDATAOBJECT_H
+
+
+#include <es_sock.h>
+#include <comms-infras/api_ext_list.h>
+#include <comms-infras/metacontainer.h>
+#include <comms-infras/metatype.h>
+
+
+#ifdef _DEBUG
+// Panic category for "absolutely impossible!" vanilla ASSERT()-type panics from this module
+// (if it could happen through user error then you should give it an explicit, documented, category + code)
+_LIT(KSpecAssert_ESocks_cmsdtbjct, "ESocks_cmsdtbjct");
+#endif
+
+namespace ESock
+{
+class CConnection;
+class MPlatsecApiExt;
+class TGetOrSetParameters;
+
+
+/**
+The base class for any CommsDataObject. 
+
+A CommsDataObject is a serializable data holding object that knows how
+it should be persisted within the comms framework when dispatched on a
+node with a supported interface.
+
+Depending on the specific implementation of the object it can be used to
+store or retrieve information from one or more nodes in the stack of
+connection providers.
+
+Note: A CommsDataObject has no connection to the similarly named CommsDat
+database or any of its associated classes.
+*/
+class XCommsDataObject : public Meta::SMetaDataECom
+	{
+	friend class ::RConnection;
+	friend class ESock::CConnection;
+	friend class ESock::TGetOrSetParameters;
+	
+public:
+	inline TUint RequiredItfExtId() const
+		{
+		return iReqItfExtId;
+		}
+
+	inline TBool IsGetSupported() const
+		{
+		return (iFlags & EGetSupported) == EGetSupported;
+		}
+		
+	inline TBool IsSetSupported() const
+		{
+		return (iFlags & ESetSupported) == ESetSupported;
+		}
+	
+	inline TBool IsProgressive() const
+		{
+		return (iFlags & EProgressive) == EProgressive;
+		}
+	
+protected:
+    /**
+    Indicates the action to be taken by the framework after the
+    CommsDataObject has been dispatched. 
+    */
+	enum TProgressAction
+		{
+		/** The selected operation is finished and the client should be completed.
+		This should always be returned if the CommsDataObject does not support the
+		EProgressive operation */
+		EComplete,
+		
+		/** The selected operation has more work to do and framework should continue
+		to forward the CommsDataObject to the next provider */
+		EContinue,
+		};
+
+	/**
+	Flags that identify the client requested operation. These are set
+	on the CommsDataObject internally and should only be used in the
+	implementation of a CommsDataObject when comparing the result of
+	OperationMode().
+	*/
+	enum 
+		{
+		/** Client requested that the object store its data on a provider */
+		EOperationSet = 0,
+
+		/** Client requested that the object retreive data from a provider */
+		EOperationGet = 1
+		};
+
+	
+	/**
+	Flags that identify the operations that a CommsDataObject supports.
+	The framework will not allow requests for unsupported operations.
+	*/
+	enum
+		{
+		/** The CommsDataObject supports storing its data on a provider */
+		ESetSupported = 1,
+
+		/** The CommsDataObject supports retreiving data from a provider */
+		EGetSupported = 2,
+
+		/** The CommsDataObject is required to progressively be dispatched
+		on all providers supporting the required interface. When this flag
+		is present the framework will listen to the TProgressAction returned
+		by the DispatchL() method */
+		EProgressive = 4,
+		
+		/**
+		Mask that covers all operation flags
+		*/
+		EOperationSupportMask = ESetSupported | EGetSupported,
+		
+		/**
+		Mask that covers all currently used flags
+		*/
+		EAllFlags = ESetSupported | EGetSupported | EProgressive,
+		};
+
+	
+	/**
+	Constructor for the CommsDataObject.
+	
+	This version of the constructor will default to providing a 
+	MAccessPointConfigApi interface when the CommsDataObject is dispatched.
+	
+	@param aFlags Flags that identify the operations supported by, and
+	desired framework handling of the CommsDataObject. Only use flags
+	supported by XCommsDataObject. The CommsDataObject must support at
+	least the Get or Set operation.
+	
+	@see MAccessPointConfigApi
+	*/
+	XCommsDataObject(TUint aFlags)
+		: iReqItfExtId((TUint)EAccessPointConfigApi), iFlags(aFlags)
+		{
+		__ASSERT_DEBUG((aFlags & ~EAllFlags) == 0, User::Panic(KSpecAssert_ESocks_cmsdtbjct, 1));
+		__ASSERT_DEBUG((aFlags & EOperationSupportMask) != 0, User::Panic(KSpecAssert_ESocks_cmsdtbjct, 2));
+		}
+
+	
+	/**
+	Constructor for the CommsDataObject.
+	
+	@param aFlags Flags that identify the operations supported by, and
+	desired framework handling of the CommsDataObject. Only use flags
+	supported by XCommsDataObject. The CommsDataObject must support at
+	least the Get or Set operation.
+	
+	@param aReqItfExtId An interface identifier from TSupportedCommsApiExt.
+	*/
+	XCommsDataObject(TUint aFlags, TUint aReqItfExtId)
+		: iReqItfExtId(aReqItfExtId), iFlags(aFlags)
+		{
+		__ASSERT_DEBUG((aFlags & ~EAllFlags) == 0, User::Panic(KSpecAssert_ESocks_cmsdtbjct, 3));
+		__ASSERT_DEBUG((aFlags & EOperationSupportMask) != 0, User::Panic(KSpecAssert_ESocks_cmsdtbjct, 4));
+		}
+
+	
+	/**
+	Called by the framework. Needs to be implemented by the CommsDataObject to perform
+	the operation indicated by OperationMode().
+	
+	@param aItfPtr A pointer to the interface that the CommsDataObject has requested.
+	@param aItfPtr A pointer to a ESock::MPlatsecApiExt interface to be used for any
+	required platsec checks.
+	
+	@return A value from TProgressAction indicating whether or not the CommsDataObject
+	has finished its operation. Should always be EComplete if the object does not support
+	the EProgressive operation.
+	
+	@see ESock::MPlatsecApiExt
+	*/
+	virtual TProgressAction DispatchL(TAny* aItfPtr, ESock::MPlatsecApiExt* aPlatsecItf) = 0;
+
+	/**
+	@return The operation requested by the client.
+	*/
+	inline TUint OperationMode() const
+		{
+		return iOperationMode;
+		}
+		
+	/**
+	@return The supported operation flags
+	*/
+	inline TUint Flags() const
+		{
+		return iFlags;
+		}
+
+private:		
+    /**
+	Used internally to set the operation mode requested by the client.
+	*/
+	inline void SetOperationMode(TUint aMode)
+		{
+		iOperationMode = aMode;
+		}
+	
+protected:
+	EXPORT_DATA_VTABLE_AND_FN	
+	
+private:
+	TUint iOperationMode;
+	TUint iReqItfExtId;
+	TUint iFlags;
+	};
+
+
+/**
+Container class for the XCommsDataObject. Responsible for
+owning, serialising, and deserialising the CommsDataObject during API
+calls
+
+Note: A CommsDataObject has no connection to the similarly named CommsDat
+database or any of its associated classes.
+
+@see XCommsDataObject
+*/
+class CCommsDataObjectBase : public CBase, public Meta::MMetaType
+	{
+	friend class ::RConnection;	
+	
+public:
+	/**
+	NewL for the CCommsDataObject class.
+	@param aDataObject A ptr to the data object to take ownership of
+	*/
+	IMPORT_C static CCommsDataObjectBase* NewL(XCommsDataObject* aDataObject);
+	IMPORT_C static CCommsDataObjectBase* LoadL(TPtrC8& aBuffer);
+	
+	/**
+	@D'tor for the CCommsDataObject class
+	*/
+	IMPORT_C ~CCommsDataObjectBase();
+
+	// From  Meta::MetaType
+	IMPORT_C virtual TInt Load(TPtrC8& aBuffer);
+	IMPORT_C virtual TInt Store(TDes8& aBuffer) const;
+    IMPORT_C virtual void Copy(const TAny* aData);
+	IMPORT_C virtual TInt Length() const;
+	
+protected:
+	/**
+	C'tor for the CCommsDataObject class.
+	@param aDataObject A ptr to the data object to take ownership of
+	*/
+	IMPORT_C CCommsDataObjectBase(XCommsDataObject* aDataObject);
+
+protected:
+	XCommsDataObject* iDataObject;
+	};
+
+
+/**
+Thin wrapper template class to provide type safety around CCommsDataObjectBase
+*/
+template<class SUBCLASS, class XCLASS>
+class CCommsDataObject : public CCommsDataObjectBase
+	{
+public:	
+	inline static SUBCLASS* NewL(XCLASS* aDataObject)
+		{
+		__ASSERT_DEBUG(aDataObject, User::Panic(KSpecAssert_ESocks_cmsdtbjct, 5));
+		if (XCLASS::TypeId() != aDataObject->GetTypeId()) 
+			{
+			User::Leave(KErrArgument);
+			}
+		return static_cast<SUBCLASS*>(CCommsDataObjectBase::NewL(aDataObject));
+		}
+		
+	inline static SUBCLASS* LoadL(TPtrC8& aBuffer)
+		{
+		TPtrC8 typeCheckPtr(aBuffer);
+		STypeId typeId = STypeId::CreateSTypeId(typeCheckPtr);
+		if (XCLASS::TypeId() != typeId) 
+			{
+			User::Leave(KErrCorrupt);
+			}
+		return static_cast<SUBCLASS*>(CCommsDataObjectBase::LoadL(aBuffer));
+		}
+
+    inline XCLASS& DataObject()
+        {
+        return static_cast<XCLASS&>(*iDataObject);
+        }
+
+protected:
+    inline CCommsDataObject(XCommsDataObject* aDataObject)
+        : CCommsDataObjectBase(aDataObject)
+        {
+        }
+	};
+
+} // namespace ESock
+
+#endif
+// ES_COMMSDATAOBJECT_H
+