commsfwsupport/commselements/NetInterfaces/inc/interfacetable_internal.h
changeset 0 dfb7c4ff071f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commsfwsupport/commselements/NetInterfaces/inc/interfacetable_internal.h	Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,231 @@
+// Copyright (c) 2007-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:
+// interfacetable.h
+// THIS WHOLE FILE IS INTERNAL TECHNOLOGY - DO NOT ADD NON-INTERNAL ITEMS
+// 
+//
+
+/**
+ @file
+ @internalTechnology
+*/
+
+#ifndef SYMBIAN_INTERFACETABLE_INTERNAL_H
+#define SYMBIAN_INTERFACETABLE_INTERNAL_H
+
+#include <e32std.h>
+
+const TInt KErrInterfaceNotSupported = -17204;	// Requested interface is not supported by this object
+
+namespace NetInterfaces
+{
+
+template<class TINTERFACE> struct TIfStaticFetcherFirstInHierarchy;
+class TInterfaceIter;
+
+class TInterfaceControl
+/**
+This class provides a base for an API extension implementer.
+It implements an interface towards the ESock server.
+
+*/
+	{
+	friend class TIfStaticFetcherFirstInHierarchy<TInterfaceControl>;
+	friend class TInterfaceIter;
+
+public:
+	struct TFIEntry
+		{
+		typedef TAny* (*TStaticFetch)(TInterfaceControl*);
+		typedef const TFIEntry* (*TStaticNext)();
+		TInt iIfId;
+		TStaticFetch iFetchFnL;
+		TStaticNext iNextFn;
+		};
+
+public:
+	IMPORT_C TAny* FetchInterfaceL(TInt aInterfaceId);
+	IMPORT_C TAny* FetchInterface(TInt aInterfaceId);
+
+protected:
+	inline TInterfaceControl();
+
+private:
+	TAny* DoFetchInterface(TInt aInterfaceId);
+
+private:
+	const TFIEntry* iHead;
+	};
+
+TInterfaceControl::TInterfaceControl()
+:	iHead(NULL)
+	{
+	}
+
+/**
+	Simple iterator for all the interfaces available via a specified
+	TInterfaceControl.
+
+*/
+class TInterfaceIter
+	{
+public:
+	IMPORT_C TInterfaceIter(const TInterfaceControl& aItfControl);
+
+	inline TInt ItfId() const
+		{
+		return iCurrent? iCurrent->iIfId : 0;
+		}
+
+	inline TAny* operator++(TInt /*aInd*/)	// postfix
+	    {
+	    return Next();
+		}
+
+	IMPORT_C TAny* operator[](TInt aInd);
+
+private:
+	IMPORT_C TAny* Next();
+
+private:
+    const TInterfaceControl& iItfControl;
+    const TInterfaceControl::TFIEntry* iCurrent;
+	};
+
+template <class TINTERFACE>
+class TIfStaticFetcherFirstInHierarchy
+/**
+This class provides a base for the templated hierarchy of
+interface fetchers.
+
+*/
+	{
+public:
+    inline static const TInterfaceControl::TFIEntry* IFEntry()
+		{
+		return NULL;
+		}
+
+protected:
+	inline explicit TIfStaticFetcherFirstInHierarchy(TInterfaceControl* aInterfaceControl, const TInterfaceControl::TFIEntry* aHead)
+		{
+		aInterfaceControl->iHead = aHead; //This class is a friend of TInterfaceControl so we can do this
+		}
+	};
+
+template <class TBASE, class TCLIENT, class TINTERFACE, class TLINK = TBASE>
+class TIfStaticFetcher : protected TBASE
+/**
+Helper templated class used to build a static const linked list of
+supported calls to ReturnInterfacePtrL().
+
+*/
+	{
+public:
+	inline static const TInterfaceControl::TFIEntry* IFEntry()
+		{
+		return &iFIEntry;
+		}
+
+protected:
+	inline explicit TIfStaticFetcher(TInterfaceControl* aInterfaceControl, const TInterfaceControl::TFIEntry* aHead = NULL)
+	:	TBASE(aInterfaceControl,(aHead)?aHead:&iFIEntry)
+		{
+		}
+
+private:
+	inline static TAny* FetchL(TInterfaceControl* aInterfaceControl)
+		{
+		TINTERFACE* interface;
+		TCLIENT* cl = (TCLIENT*)aInterfaceControl;
+		cl->ReturnInterfacePtrL(interface);
+		return interface;
+		}
+	static const TInterfaceControl::TFIEntry iFIEntry;
+	};
+
+template <class TBASE, class TCLIENT, class TINTERFACE, class TLINK>
+const TInterfaceControl::TFIEntry TIfStaticFetcher<TBASE,TCLIENT,TINTERFACE,TLINK>::iFIEntry =
+	{
+	TINTERFACE::KInterfaceId,
+	&TIfStaticFetcher<TBASE,TCLIENT,TINTERFACE,TLINK>::FetchL,
+	&TLINK::IFEntry
+	};
+
+template <class TBASE, class TCLIENT, class TINTERFACE>
+class TIfStaticFetcherLinkBase : protected TBASE
+/**
+This template works like TIfStaticFetcher, but doesn't use a TLINK. This means that in the
+template name TLINK will not be expanded twice. The double expansion was causing linking problems
+with armlink. By using this class in ITFHIERARCHY_LINK_1, the final expansion will be shortened,
+and the linker bug will be avoided.
+This code is only here because of this bug.
+-IBK
+
+*/
+	{
+public:
+	inline static const TInterfaceControl::TFIEntry* IFEntry()
+		{
+		return &iFIEntry;
+		}
+
+protected:
+	inline explicit TIfStaticFetcherLinkBase(TInterfaceControl* aInterfaceControl, const TInterfaceControl::TFIEntry* aHead = NULL)
+	:	TBASE(aInterfaceControl,(aHead)?aHead:&iFIEntry)
+		{
+		}
+
+private:
+	inline static TAny* FetchL(TInterfaceControl* aInterfaceControl)
+		{
+		TINTERFACE* interface;
+		TCLIENT* cl = (TCLIENT*)aInterfaceControl;
+		cl->ReturnInterfacePtrL(interface);
+		return interface;
+		}
+	static const TInterfaceControl::TFIEntry iFIEntry;
+	};
+
+template <class TBASE, class TCLIENT, class TINTERFACE>
+const TInterfaceControl::TFIEntry TIfStaticFetcherLinkBase<TBASE,TCLIENT,TINTERFACE>::iFIEntry =
+	{
+	TINTERFACE::KInterfaceId,
+	&TIfStaticFetcherLinkBase<TBASE,TCLIENT,TINTERFACE>::FetchL,
+	&TBASE::IFEntry
+	};
+
+
+
+class AApiExtBase
+/**
+*/
+	{
+public:
+	IMPORT_C NetInterfaces::TInterfaceControl* FetchExtInterfaceControlL(TInt aInterfaceId);
+	IMPORT_C TAny* FetchExtInterfaceL(TInt aInterfaceId); //Never returns NULL
+	IMPORT_C TAny* FetchExtInterface(TInt aInterfaceId); //May return NULL
+	IMPORT_C TBool SupportsExtInterface(TInt aInterfaceId) const;
+	
+protected:
+	IMPORT_C virtual NetInterfaces::TInterfaceControl* DoFetchInterfaceControlL(TInt aInterfaceId);
+	};
+
+}	// namespace NetInterfaces
+
+#endif
+	//SYMBIAN_INTERFACETABLE_INTERNAL_H
+
+
+