commsfwsupport/commselements/serverden/inc/sd_apiextensionclient.h
changeset 0 dfb7c4ff071f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commsfwsupport/commselements/serverden/inc/sd_apiextensionclient.h	Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,262 @@
+// Copyright (c) 2008-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
+ @internalTechnology
+*/
+
+#ifndef SYMBIAN_DEN_APIEXTENSION_CLIENT_H
+#define SYMBIAN_DEN_APIEXTENSION_CLIENT_H
+
+#include <elements/metavirtctor.h>
+#include <elements/sd_std.h>
+#include <elements/h_trbuf.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_ElemSvrDenApiXCH, "ElemSvrDenApiXCH");
+#endif
+
+namespace NetInterfaces
+{
+class TInterfaceControl;
+}
+
+namespace Elements
+{
+class RResponseMsg;
+}
+
+namespace Den
+{
+
+class TApiExtIdentification : public TBuf8<0x10> //flags, interface id, scope id plus reserved for future use
+/**
+@internalTechnology
+*/
+	{
+public:
+	//We only use this one ctr by design.
+	//When used with no params the structure is not initialised and InterfaceId() reads 0.
+	inline explicit TApiExtIdentification(TInt aInterfaceId = 0, TInt aScopeId = 0)
+		{
+		Append(reinterpret_cast<const TUint8*>(&aInterfaceId), sizeof(aInterfaceId));
+		Append(reinterpret_cast<const TUint8*>(&aScopeId), sizeof(aScopeId));
+		}
+
+	inline TInt InterfaceId() const
+		{
+		__ASSERT_DEBUG(Length()>=2*sizeof(TInt), User::Panic(KSpecAssert_ElemSvrDenApiXCH, 1));
+		return *reinterpret_cast<const TInt*>(Ptr());
+		}
+
+	inline TInt ScopeId() const
+		{
+		__ASSERT_DEBUG(Length()>=2*sizeof(TInt), User::Panic(KSpecAssert_ElemSvrDenApiXCH, 2));
+		return *(reinterpret_cast<const TInt*>(Ptr())+1);
+		}
+	};
+
+class RApiExtSubSessionBase;
+class RApiExtSessionBase;
+
+//-=========================================================
+//
+// Messages
+//
+//-=========================================================
+
+class TApiExtReqMsg : public Meta::SMetaDataNetCtor
+/**
+	A self routing API extension request message.
+
+	@internalTechnology
+*/
+	{
+public:
+	//[MZ]: Please consult before thinking of increasing any of these
+	//values or classification.
+
+	/**
+		Used for in-place (on the stack) reconstruction of the message
+		@internalTechnology
+	*/
+	static const TUint KMaxApiExtIpcMsgExternalisedSize = 512;
+
+	/**
+		Used for in-place (on the stack) reconstruction of the message.
+		Usually slightly bigger than the externalised form (empty buffers
+		by value, compression, etc).
+		@internalTechnology
+	*/
+	static const TUint KMaxApiExtIpcMsgStructureSize = KMaxApiExtIpcMsgExternalisedSize + 256;
+	};
+
+class TApiExtSubSessionReqMsg : public TApiExtReqMsg
+/**
+	A subsession API extension request message.
+
+	@internalTechnology
+*/
+	{
+public:
+	EXPORT_TYPEID_TABLE
+
+public:
+	virtual void DispatchL(NetInterfaces::TInterfaceControl& aIntfCtl,
+	                       TSubSessionUniqueId aClientUniqueId,
+	                       Elements::RResponseMsg& aResponseMsg) = 0;
+	};
+
+class TApiExtSessionReqMsg : public TApiExtReqMsg
+/**
+	A session API extension request message.
+
+	@internalTechnology
+*/
+	{
+public:
+	EXPORT_TYPEID_TABLE
+
+public:
+	virtual void DispatchL(NetInterfaces::TInterfaceControl& aIntfCtl,
+	                       TSessionUniqueId aClientUniqueId,
+	                       Elements::RResponseMsg& aResponseMsg) = 0;
+	};
+
+class TApiExtRespMsg : public Meta::SMetaDataECom
+/**	API extension response message.
+
+	@internalTechnology
+*/
+	{
+public:
+	EXPORT_TYPEID_TABLE
+
+public:
+	/** Creates a new API extension message using ECOM.
+
+    @param aTypeId Id of the class (Composed of Uid of the implementation and an integer sub-type).
+    @return a generic pointer to a specific message if successful, otherwise leaves with system error code.
+    */
+	IMPORT_C static TApiExtRespMsg* NewL(const Meta::STypeId& aTypeId);
+
+	/** Creates a new API extension message using ECOM.
+
+    @param aMsgBuffer a buffer containing the serialised form of the message object.
+    @return a generic pointer to a specific event if successful, otherwise leaves with system error code.
+    */
+	IMPORT_C static TApiExtRespMsg* NewL(const TDesC8& aMsgBuffer);
+	};
+
+//-=========================================================
+//
+// Client Side APIs
+//
+//-=========================================================
+class RApiExtCommonBase
+/**
+	API extension base class
+
+	Provides buffer management for asynchronous IPC calls.
+
+	@internalTechnology
+*/
+	{
+	friend class RApiExtSubSessionBase; //to access iIdentification
+	friend class RApiExtSessionBase; //to access iIdentification
+
+protected:
+	TInt PrepareForSending(TApiExtReqMsg& aRequestMsg, Elements::TRBuf8*& aBuffer) const;
+	void Close();
+
+protected:
+	TApiExtIdentification iIdentification; //Interface id, scope id, etc
+
+private:
+	mutable RPointerArray<Elements::TRBuf8> iBuffers;
+	};
+
+class RExtendableSubSessionBase : public RSubSessionBase
+/**
+	Base class for client SubSessions supporting extensions.
+
+	@internalTechnology
+*/
+	{
+	friend class RApiExtSubSessionBase;
+	};
+
+class RApiExtSubSessionBase : public RApiExtCommonBase
+/**
+	Base class for client extension interfaces, opened on RExtendableSubSessionBase
+
+	@internalTechnology
+*/
+	{
+public:
+	IMPORT_C void Close();
+
+protected:
+	IMPORT_C TInt Open(RExtendableSubSessionBase& aExtendableInterface, TInt aInterfaceId);
+	IMPORT_C void SendReceive(TApiExtReqMsg& aMsg, TDes8& aReqAndRespBuf, TRequestStatus& aStatus) const;
+	IMPORT_C void SendReceive(TApiExtReqMsg& aMsg, TDes8& aReqAndRespBuf, TDes8& aReqAndRespBuf2, TRequestStatus& aStatus) const;
+	IMPORT_C void Send(TApiExtReqMsg& aMsg, TRequestStatus& aStatus) const;
+	IMPORT_C void Send(TApiExtReqMsg& aMsg, TDes8& aReqAndRespBuf2, TRequestStatus& aStatus) const;
+	IMPORT_C void Send(TApiExtReqMsg& aMsg, const RHandleBase& aHandleBase, TRequestStatus& aStatus) const;
+
+protected:
+	RExtendableSubSessionBase iSubSession;
+	};
+
+class RExtendableSessionBase : public RSessionBase
+/**
+	Base class for client Sessions supporting extensions.
+
+	@internalTechnology
+*/
+	{
+	friend class RApiExtSessionBase;
+	};
+
+class RApiExtSessionBase : public RApiExtCommonBase
+/**
+	Base class for client extension interfaces, opened on RExtendableSessionBase
+
+	@internalTechnology
+*/
+	{
+public:
+	IMPORT_C void Close();
+
+protected:
+	IMPORT_C TInt Open(RExtendableSessionBase& aExtendableInterface, TInt aInterfaceId);
+	IMPORT_C void SendReceive(TApiExtReqMsg& aMsg, TDes8& aReqAndRespBuf, TRequestStatus& aStatus) const;
+	IMPORT_C void SendReceive(TApiExtReqMsg& aMsg, TDes8& aReqAndRespBuf, TDes8& aReqAndRespBuf2, TRequestStatus& aStatus) const;
+	IMPORT_C void Send(TApiExtReqMsg& aMsg, TRequestStatus& aStatus) const;
+	IMPORT_C void Send(TApiExtReqMsg& aMsg, TDes8& aReqAndRespBuf2, TRequestStatus& aStatus) const;
+	IMPORT_C void Send(TApiExtReqMsg& aMsg, const RHandleBase& aHandleBase, TRequestStatus& aStatus) const;
+
+protected:
+	RExtendableSessionBase iSession;
+	};
+
+} //namespace Den
+
+#endif //SYMBIAN_DEN_APIEXTENSION_CLIENT_H
+