diff -r 000000000000 -r dfb7c4ff071f commsfwsupport/commselements/NetInterfaces/inc/interfacetable_internal.h --- /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 + +const TInt KErrInterfaceNotSupported = -17204; // Requested interface is not supported by this object + +namespace NetInterfaces +{ + +template 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; + 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 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 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 +const TInterfaceControl::TFIEntry TIfStaticFetcher::iFIEntry = + { + TINTERFACE::KInterfaceId, + &TIfStaticFetcher::FetchL, + &TLINK::IFEntry + }; + +template +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 +const TInterfaceControl::TFIEntry TIfStaticFetcherLinkBase::iFIEntry = + { + TINTERFACE::KInterfaceId, + &TIfStaticFetcherLinkBase::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 + + +