williamr@4: // Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). williamr@4: // All rights reserved. williamr@4: // This component and the accompanying materials are made available williamr@4: // under the terms of "Eclipse Public License v1.0" williamr@4: // which accompanies this distribution, and is available williamr@4: // at the URL "http://www.eclipse.org/legal/epl-v10.html". williamr@4: // williamr@4: // Initial Contributors: williamr@4: // Nokia Corporation - initial contribution. williamr@4: // williamr@4: // Contributors: williamr@4: // williamr@4: // Description: williamr@4: // williamr@4: williamr@4: /** williamr@4: @file williamr@4: @internalComponent williamr@4: */ williamr@4: williamr@4: #if !defined(__SS_CONNPROV_H__) williamr@4: #define __SS_CONNPROV_H__ williamr@4: williamr@4: #include williamr@4: #include williamr@4: #include williamr@4: #include williamr@4: #include //TNifProgressBuf & co williamr@4: #include //TConnStartType &co williamr@4: #include williamr@4: #include //For TProviderInfo which may need to be moved to a different header in case of a circular dep. williamr@4: #include williamr@4: #include williamr@4: williamr@4: #include williamr@4: #include williamr@4: #include williamr@4: williamr@4: namespace ESock williamr@4: { williamr@4: williamr@4: const TInt KConnInfoPart = 8; //TODO: delete with TConnectionInfo williamr@4: williamr@4: class CConnection; williamr@4: class CCommsFactoryBase; williamr@4: class CConnectionProviderBase; williamr@4: class CSubConnectionProviderBase; williamr@4: williamr@4: const TInt KProtocolAny = 0xffffff1; //cooked-up constant for any protocol williamr@4: const TInt KConnectionFactoryInterfaceUid = 0x102070EE; williamr@4: williamr@4: class XConnectionProviderInfoQuery : public Factories::MFactoryQuery williamr@4: /** Class implementing MCommsFactoryQuery to find a connection provider by williamr@4: * using iProviderInfo williamr@4: williamr@4: @internalTechnology williamr@4: */ williamr@4: { williamr@4: public: williamr@4: explicit XConnectionProviderInfoQuery(const TProviderInfo aProviderInfo) williamr@4: : iProviderInfo(aProviderInfo) williamr@4: { williamr@4: } williamr@4: explicit XConnectionProviderInfoQuery(const TUint32 aAPid) williamr@4: : iAPid(aAPid) williamr@4: { williamr@4: } williamr@4: williamr@4: IMPORT_C virtual TMatchResult Match(Factories::TFactoryObjectInfo& aProviderInfo); williamr@4: williamr@4: TProviderInfo iProviderInfo; williamr@4: TUint32 iAPid; williamr@4: williamr@4: protected: williamr@4: explicit XConnectionProviderInfoQuery() williamr@4: : iProviderInfo(TProviderInfo::NullProviderInfo()) williamr@4: { williamr@4: } williamr@4: }; williamr@4: williamr@4: class CConnectionProviderFactoryBase; williamr@4: class CConnectionProviderBase; williamr@4: class CConnectionFactoryContainer : public CCommsFactoryContainer williamr@4: /** Container for connection provider factories. williamr@4: Note that there is a 1-1 mapping between aProtocolId and aFactoryId at the moment williamr@4: williamr@4: @internalTechnology williamr@4: @released Since 9.1 */ williamr@4: { williamr@4: friend class CConnectionProviderFactoryBase; williamr@4: #ifdef __X86GCC__ williamr@4: protected: williamr@4: // gcc-mingw does not support declaring friends from different namespaces so we define proxy williamr@4: // functions to do the cast. williamr@4: friend CConnectionProviderBase* __x86gcc_connection_provider_base_cast(Factories::AFactoryObject* aFactoryObject); williamr@4: friend const CConnectionProviderBase* __x86gcc_connection_provider_base_cast(const Factories::AFactoryObject* aFactoryObject); williamr@4: williamr@4: enum williamr@4: { williamr@4: EId = EConnectionFactoryContainer williamr@4: }; williamr@4: #elif defined(__GCCXML__) williamr@4: public: williamr@4: enum williamr@4: { williamr@4: EId = EConnectionFactoryContainer williamr@4: }; williamr@4: #else williamr@4: protected: williamr@4: friend CConnectionProviderBase* Factories::factoryobject_cast(Factories::AFactoryObject* aFactoryObject); williamr@4: friend const CConnectionProviderBase* Factories::factoryobject_cast(const Factories::AFactoryObject* aFactoryObject); williamr@4: williamr@4: enum williamr@4: { williamr@4: EId = EConnectionFactoryContainer williamr@4: }; williamr@4: #endif williamr@4: williamr@4: public: williamr@4: IMPORT_C static CConnectionFactoryContainer* NewL(); williamr@4: williamr@4: CConnectionProviderFactoryBase* Factory( TInt aIndex ) const; williamr@4: IMPORT_C static CConnectionFactoryContainer& Singleton(); williamr@4: virtual ~CConnectionFactoryContainer(); williamr@4: williamr@4: protected: williamr@4: CConnectionFactoryContainer(); williamr@4: virtual void ReceivedL(const Messages::TRuntimeCtxId& aSender, const Messages::TNodeId& aRecipient, Messages::TSignatureBase& aMessage); williamr@4: }; williamr@4: williamr@4: class CConnectionProviderBase; williamr@4: class CConnectionProviderFactoryBase : public CCommsFactoryBase williamr@4: /** Base class for all connection provider factories. Specifies the interface williamr@4: that all connection provider factories must implement. It also providers the williamr@4: ECOM framework (via CCommsFactoryBase) to load connection provider factories williamr@4: from other Dynamic Linked Libraries. williamr@4: williamr@4: @internalTechnology williamr@4: @released Since 9.1 */ williamr@4: { williamr@4: friend class CConnectionProviderBase; williamr@4: public: williamr@4: IMPORT_C static CConnectionProviderFactoryBase* NewL(const TDesC8& aName, CConnectionFactoryContainer& aParentContainer); williamr@4: IMPORT_C virtual ~CConnectionProviderFactoryBase(); williamr@4: williamr@4: IMPORT_C ACommsFactoryNodeId* CreateL(TFactoryQueryBase& aQuery); //sync williamr@4: williamr@4: protected: williamr@4: IMPORT_C CConnectionProviderFactoryBase(TUid aFactoryId, CConnectionFactoryContainer& aParentContainer); williamr@4: williamr@4: IMPORT_C ACommsFactoryNodeId* DoFindOrCreateObjectL(TFactoryQueryBase& aQuery); williamr@4: /** Override this to create a new instance of CConnectionProviderBase williamr@4: williamr@4: @return Pointer to the newly created provider williamr@4: @exception Leaves in out of memory conditions */ williamr@4: IMPORT_C virtual ACommsFactoryNodeId* DoCreateObjectL(TFactoryQueryBase& aQuery); williamr@4: williamr@4: protected: williamr@4: struct TInternalData williamr@4: { williamr@4: }; williamr@4: williamr@4: protected: williamr@4: TInternalData* iInternalData; williamr@4: }; williamr@4: williamr@4: // williamr@4: // CConnectionProviderBase williamr@4: class CConnectionSettings; williamr@4: class CConnectionProviderBase : public CMMCommsProviderBase, public TCFCpr williamr@4: /** Base class specifying the interfaces required to implement a connection provider. williamr@4: Contains collections of control and data clients and defines operations on them williamr@4: williamr@4: @internalTechnology williamr@4: @released Since 9.1 */ williamr@4: { williamr@4: friend class CConnectionProviderFactoryBase; williamr@4: #ifdef __X86GCC__ williamr@4: // gcc-mingw does not support declaring friends from different namespaces so we define proxy williamr@4: // functions to do the cast. williamr@4: friend CConnectionProviderBase* __x86gcc_connection_provider_base_cast(Messages::ANode* aNode); williamr@4: friend CConnectionProviderBase& __x86gcc_connection_provider_base_cast(Messages::ANode& aNode); williamr@4: #elif !defined(__GCCXML__) williamr@4: friend CConnectionProviderBase* mcfnode_cast(Messages::ANode* aNode); williamr@4: friend CConnectionProviderBase& mcfnode_cast(Messages::ANode& aNode); williamr@4: #endif williamr@4: williamr@4: public: williamr@4: inline const TProviderInfo& ProviderInfo() const williamr@4: { williamr@4: const TProviderInfoExt* providerInfo = static_cast(AccessPointConfig().FindExtension( williamr@4: STypeId::CreateSTypeId(TProviderInfoExt::EUid, TProviderInfoExt::ETypeId))); williamr@4: ASSERT(providerInfo); williamr@4: return providerInfo->iProviderInfo; williamr@4: } williamr@4: williamr@4: Messages::RNodeInterface* DefaultSubConnectionProvider() const williamr@4: { williamr@4: return MeshMachine::AMMNodeBase::GetFirstClient(Messages::TClientType(TCFClientType::EData,TCFClientType::EDefault)); williamr@4: } williamr@4: williamr@4: protected: williamr@4: IMPORT_C CConnectionProviderBase(CConnectionProviderFactoryBase& aFactory, williamr@4: const MeshMachine::TNodeActivityMap& aActivityMap); williamr@4: IMPORT_C virtual Messages::RNodeInterface* NewClientInterfaceL(const Messages::TClientType& aClientType, TAny* aClientInfo = NULL); williamr@4: IMPORT_C ~CConnectionProviderBase(); williamr@4: }; williamr@4: williamr@4: #ifdef __X86GCC__ williamr@4: // gcc-mingw does not support declaring friends from different namespaces so we define proxy williamr@4: // functions to do the cast... williamr@4: williamr@4: inline CConnectionProviderBase* __x86gcc_connection_provider_base_cast(Messages::ANode* aNode) williamr@4: { williamr@4: return static_cast(aNode); williamr@4: } williamr@4: williamr@4: inline CConnectionProviderBase& __x86gcc_connection_provider_base_cast(Messages::ANode& aNode) williamr@4: { williamr@4: return static_cast(aNode); williamr@4: } williamr@4: williamr@4: inline CConnectionProviderBase* __x86gcc_connection_provider_base_cast(Factories::AFactoryObject* aFactoryObject) williamr@4: { williamr@4: return ESock::CConnectionFactoryContainer::EId == static_cast(aFactoryObject->Factory().ParentContainer()).iId? williamr@4: static_cast(aFactoryObject) : NULL; williamr@4: } williamr@4: williamr@4: inline const CConnectionProviderBase* __x86gcc_connection_provider_base_cast(const Factories::AFactoryObject* aFactoryObject) williamr@4: { williamr@4: return ESock::CConnectionFactoryContainer::EId == static_cast(aFactoryObject->Factory().ParentContainer()).iId? williamr@4: static_cast(aFactoryObject) : NULL; williamr@4: } williamr@4: #endif williamr@4: }//namespace ESock williamr@4: williamr@4: williamr@4: #ifdef __X86GCC__ williamr@4: namespace Messages williamr@4: { williamr@4: // gcc-mingw does not support declaring friends from different namespaces so we define proxy williamr@4: // functions to do the cast. williamr@4: template <> williamr@4: inline ESock::CConnectionProviderBase* mnode_cast(Messages::ANode* aNode) williamr@4: { williamr@4: return ESock::__x86gcc_connection_provider_base_cast(aNode); williamr@4: } williamr@4: williamr@4: template <> williamr@4: inline ESock::CConnectionProviderBase& mnode_cast(Messages::ANode& aNode) williamr@4: { williamr@4: return ESock::__x86gcc_connection_provider_base_cast(aNode); williamr@4: } williamr@4: } williamr@4: #endif williamr@4: williamr@4: williamr@4: namespace Factories williamr@4: { williamr@4: williamr@4: #ifdef __X86GCC__ williamr@4: // gcc-mingw does not support declaring friends from different namespaces so we define proxy williamr@4: // functions to do the cast. williamr@4: template<> williamr@4: inline ESock::CConnectionProviderBase* factoryobject_cast(Factories::AFactoryObject* aFactoryObject) williamr@4: { williamr@4: return ESock::__x86gcc_connection_provider_base_cast(aFactoryObject); williamr@4: } williamr@4: williamr@4: template<> williamr@4: inline const ESock::CConnectionProviderBase* factoryobject_cast(const Factories::AFactoryObject* aFactoryObject) williamr@4: { williamr@4: return ESock::__x86gcc_connection_provider_base_cast(aFactoryObject); williamr@4: } williamr@4: #else williamr@4: // RVCT does not allow the specialisation of template functions in a different namespace from the original williamr@4: // so we declare them in the Factories namespace. williamr@4: template<> williamr@4: inline ESock::CConnectionProviderBase* factoryobject_cast(Factories::AFactoryObject* aFactoryObject) williamr@4: { williamr@4: return ESock::CConnectionFactoryContainer::EId == static_cast(aFactoryObject->Factory().ParentContainer()).iId? williamr@4: static_cast(aFactoryObject) : NULL; williamr@4: } williamr@4: williamr@4: template<> williamr@4: inline const ESock::CConnectionProviderBase* factoryobject_cast(const Factories::AFactoryObject* aFactoryObject) williamr@4: { williamr@4: return ESock::CConnectionFactoryContainer::EId == static_cast(aFactoryObject->Factory().ParentContainer()).iId? williamr@4: static_cast(aFactoryObject) : NULL; williamr@4: } williamr@4: #endif williamr@4: williamr@4: }//namespace Factories williamr@4: williamr@4: #endif // __SS_CONNPROV_H__ williamr@4: williamr@4: williamr@4: