diff -r 000000000000 -r dfb7c4ff071f datacommsserver/esockserver/ssock/ss_connprov.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/datacommsserver/esockserver/ssock/ss_connprov.cpp Thu Dec 17 09:22:25 2009 +0200 @@ -0,0 +1,215 @@ +// Copyright (c) 2004-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 SS_CONNPROV.CPP +*/ + +#include +#include +#include +#include +#include +#include "ss_connprov.h" +#include + +#include +#include + +#include +using namespace ESock; + +#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_ESockSSockscnprv, "ESockSSockscnprv"); +#endif + +using namespace Messages; +using namespace Factories; + +TConnectionInfo::TConnectionInfo(const TDesC8& /*aConnectionInfo*/ /*as passed to ::Bearer/::NoBearer*/) + { + } + +TBool TConnectionInfo::IsLocalBearer(const TDesC8& aConnectionInfo) + { + __ASSERT_DEBUG(aConnectionInfo.Length() >= KConnInfoPart, User::Panic(KSpecAssert_ESockSSockscnprv, 1)); + + TConnectionInfo info(0,0); + TPckg infoBuf(info); + + return (infoBuf.Right(KConnInfoPart) == aConnectionInfo.Right(KConnInfoPart)); + } + +EXPORT_C MFactoryQuery::TMatchResult XConnectionProviderInfoQuery::Match(TFactoryObjectInfo& aProviderInfo) + { + CConnectionProviderBase* prov = static_cast(aProviderInfo.iInfo.iFactoryObject); + const TProviderInfo& thePI = static_cast(prov->AccessPointConfig().FindExtensionL( + STypeId::CreateSTypeId(TProviderInfoExt::EUid, TProviderInfoExt::ETypeId))).iProviderInfo; + TBool isMatch = (thePI.TierId() == iProviderInfo.TierId()) && (thePI.APId() == iProviderInfo.APId()); + return (isMatch ? MFactoryQuery::EMatch : MFactoryQuery::EContinue); + } + + +EXPORT_C CConnectionFactoryContainer* CConnectionFactoryContainer::NewL() +/** Create a new instance of a connection factory container + +@exception Leaves in out of memory conditions +@return Pointer to new instance of a connection factory container +*/ + { + TCFLegacyMessage::RegisterL(); + return new (ELeave) CConnectionFactoryContainer(); + } + +CConnectionFactoryContainer::~CConnectionFactoryContainer() + { + TCFLegacyMessage::DeRegister(); + + LOG_NODE_DESTROY(KESockConnectionTag, CConnectionFactoryContainer); + } + +CConnectionFactoryContainer::CConnectionFactoryContainer() +:CCommsFactoryContainer((CCommsFactoryContainer::TContaineeType)CConnectionFactoryContainer::EId) +/** Empty connection factory container constructor */ + { + LOG_NODE_CREATE(KESockConnectionTag, CConnectionFactoryContainer); + } + + +CConnectionProviderFactoryBase* CConnectionFactoryContainer::Factory( TInt aIndex ) const + { + return static_cast(CCommsFactoryContainer::Factory(aIndex)); + } + + +void CConnectionFactoryContainer::ReceivedL(const TRuntimeCtxId& aSender, const TNodeId& /*aRecipient*/, TSignatureBase& aMessage) + { + + if (aMessage.IsMessage()) + { //rjl todo: inconsistency in this function across planes.. ensure that's intended + ACommsFactoryNodeId* factoryObject = CreateFactoryObjectNodeL (aMessage); + #ifndef __GCCXML__ + RClientInterface::OpenPostMessageClose(Id(), aSender, TCFFactory::TPeerFoundOrCreated(factoryObject->Id(), 0).CRef()); + #endif + } + else + { + NM_LOG_START_BLOCK(KESockMetaConnectionTag, _L8("CConnectionFactoryContainer::ReceivedL")); + NM_LOG((KESockMetaConnectionTag, _L8("ERROR: KErrNotSupported [this=0x%08x]"), this)); + NM_LOG_MESSAGE(KESockMetaConnectionTag, aMessage); + NM_LOG_END_BLOCK(KESockMetaConnectionTag, _L8("CConnectionFactoryContainer::ReceivedL")); + + __ASSERT_DEBUG(EFalse, User::Panic(KSpecAssert_ESockSSockscnprv, 2)); //For debug configurations + User::Leave(KErrNotSupported); //For release configurations + } + } + + +//========================================================== + +EXPORT_C CConnectionProviderFactoryBase::~CConnectionProviderFactoryBase() +/** Empty connection factory base destructor */ + { + } + +EXPORT_C CConnectionProviderFactoryBase::CConnectionProviderFactoryBase(TUid aFactoryId, CConnectionFactoryContainer& aParentContainer) +/** connection provider factory constructor + +@param aFactoryId Unique Integer Identifier of the connection provider factory +@param aParentContainer Container to add the factory to */ + : CCommsFactoryBase(aFactoryId, aParentContainer) + { + } + +EXPORT_C ACommsFactoryNodeId* CConnectionProviderFactoryBase::DoFindOrCreateObjectL(TFactoryQueryBase& aQuery) + { + ACommsFactoryNodeId* provider = static_cast(FindObject(aQuery)); + return provider ? provider : CreateL(aQuery); + } + + +EXPORT_C ACommsFactoryNodeId* CConnectionProviderFactoryBase::CreateL(TFactoryQueryBase& aQuery) +/** Create a new instance of connection provider + +@return Pointer to the created connection provider or NULL if there's a failure */ + { + CConnectionProviderBase* provider = static_cast(DoCreateObjectL(aQuery)); + CleanupStack::PushL(provider); + + const TDefaultConnectionFactoryQuery& query = static_cast(aQuery); + provider->AddClientL(address_cast(query.iMCprId), TClientType(TCFClientType::ECtrlProvider)); + + // Add the connectionProvider to it's factory + AddManagedObjectL(*provider); + + CleanupStack::Pop(provider); + return provider; + } + +EXPORT_C ACommsFactoryNodeId* CConnectionProviderFactoryBase::DoCreateObjectL(TFactoryQueryBase& /* aQuery */) + { + __ASSERT_DEBUG(EFalse, User::Panic(KSpecAssert_ESockSSockscnprv, 3)); + User::Leave(KErrNotSupported); + return NULL; + } + +//========================================================== + + +EXPORT_C CConnectionProviderBase::CConnectionProviderBase(CConnectionProviderFactoryBase& aFactory, + const MeshMachine::TNodeActivityMap& aActivityMap) +: CMMCommsProviderBase( aFactory,aActivityMap ) +/** Constructor for CConnectionProviderBase + +@param aFactory Parent container for the provider */ + { + LOG(ESockLog::Printf(KESockCtrlFactTag, _L("CConnectionProviderBase %08x:\tcreated [%d], factory Uid %08x"), + this, sizeof(CConnectionProviderBase), Factory().Uid().iUid)); + } + +EXPORT_C RNodeInterface* CConnectionProviderBase::NewClientInterfaceL(const TClientType& aClientType, TAny* aClientInfo) + { + if (aClientType.Type() & TCFClientType::ECtrl) + { + if (aClientInfo == NULL) + { // This is not CPR, probably CConnection, use min priority. + return new (ELeave) RCFNodePriorityInterface(KMaxTUint); + } + else + { + const TUint* priority = static_cast(aClientInfo); + return new (ELeave) RCFNodePriorityInterface(*priority); + } + } + else + { + return MeshMachine::AMMNodeBase::NewClientInterfaceL(aClientType, aClientInfo); + } + } + +EXPORT_C CConnectionProviderBase::~CConnectionProviderBase() +/** Destructor for CConnectionProviderBase. +*/ + { + LOG(ESockLog::Printf(KESockCtrlFactTag, _L("~CConnectionProviderBase %08x:\tfactory Uid %08x"), + this, Factory().Uid().iUid)); + } + + + + +