diff -r 39bb7c3571e9 -r 052078dda061 networkcontrol/ipcprshim/src/shimcprfactory.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/networkcontrol/ipcprshim/src/shimcprfactory.cpp Tue Jun 29 19:20:22 2010 +0530 @@ -0,0 +1,256 @@ +// Copyright (c) 2005-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: +// SHIMCPRFACTORY.H +// +// + +#include +#include +#include "shimcprfactory.h" // for CConnectionProviderFactoryShim + +#include "connectionSelectorShim.h" +#include "shimcpr.h" +#include "shimnifmansconn.h" +#include "idquerynetmsg.h" +#include +#ifdef SYMBIAN_NETWORKING_UMTSR5 +#include +#endif // #ifdef SYMBIAN_NETWORKING_UMTSR5 + + +const TUint KShimConnectionProviderImplementationUid = 0x102070FF; +/** +Data required for instantiating ECOM Plugin +*/ +const TImplementationProxy ImplementationTable[] = + { + IMPLEMENTATION_PROXY_ENTRY(KShimConnectionProviderImplementationUid, CConnectionProviderFactoryShim::NewL), + }; + + +/** +ECOM Implementation Factory +*/ +EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount) + { + aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy); + + return ImplementationTable; + } + +CConnectionProviderFactoryShim* CConnectionProviderFactoryShim::NewL(TAny* aConstructionParameters) + { + CConnectionProviderFactoryShim* ptr = new (ELeave) CConnectionProviderFactoryShim(KShimConnectionProviderFactoryId, *(reinterpret_cast(aConstructionParameters))); + CleanupStack::PushL(ptr); + ptr->ConstructL(); + CleanupStack::Pop(ptr); + return ptr; + } + +void CConnectionProviderFactoryShim::ConstructL() + {//create a provider session for global tasks (enumerate connections/all interface notification....) + iNifmanSession = Nif::NewConnectionL(this, 0); + iNifmanSession->AllInterfaceNotificationL(); + } +// Destructor +CConnectionProviderFactoryShim::~CConnectionProviderFactoryShim() + { + delete iNifmanSession; + } + +// Constructor +CConnectionProviderFactoryShim::CConnectionProviderFactoryShim(TUint aFactoryId, CConnectionFactoryContainer& aParentContainer) : + CConnectionProviderFactoryBase( aFactoryId, aParentContainer ) + { + } + +#ifdef SYMBIAN_NETWORKING_UMTSR5 +// Sets the IAP lock status +void CConnectionProviderFactoryShim::SetIAPLockStatus(TBool aLockStatus, TInt aLockedIAP) + { + iIsIAPLocked = aLockStatus; + iLockedIAP = aLockedIAP; + } +// Gets the IAP lock status +void CConnectionProviderFactoryShim::GetIAPLockStatus(TBool &aLockStatus, TInt &aLockedIAP) + { + aLockStatus = iIsIAPLocked; + aLockedIAP = iLockedIAP; + } + +#endif // #ifdef SYMBIAN_NETWORKING_UMTSR5 + +CConnectionProviderBase* CConnectionProviderFactoryShim::DoCreateProviderL() + { +#ifdef SYMBIAN_NETWORKING_UMTSR5 + CConnectionProviderShim * shimProv = CConnectionProviderShim::NewL(*this); + shimProv->SetFactoryIfactory(this); + return shimProv; +#else + return CConnectionProviderShim::NewL(*this); +#endif // #ifdef SYMBIAN_NETWORKING_UMTSR5 + } + +MProviderSelector* CConnectionProviderFactoryShim::DoSelectProvider( Meta::SMetaData& aPreferences, ISelectionNotify& aSelectionNotify, const RMessagePtr2* aMessage ) + { + //create self-destructing object + CConnectionSelectorShim* selector = new CConnectionSelectorShim(aSelectionNotify); + if (!selector) + { + aSelectionNotify.SelectComplete(NULL,KErrNoMemory); + aSelectionNotify.Detach(); + } + else + { + #ifdef SYMBIAN_NETWORKING_UMTSR5 + selector->SetFactoryIface(this); + #endif + if ( selector->Select(aPreferences, aMessage) != KErrNone ) + { + selector = NULL; + } + } + + + return selector; + } + +MProviderSelector* CConnectionProviderFactoryShim::DoSelectNextLayerProvider( Meta::SMetaData& /*aPreferences*/, ISelectionNotify& /*aSelectionNotify*/, const RMessagePtr2* /*aMessage*/ ) + { + return NULL; + } + +void CConnectionProviderFactoryShim::DoEnumerateConnectionsL(RPointerArray& aConnectionInfoPtrArray) + { + iNifmanSession->EnumerateConnectionsL(aConnectionInfoPtrArray); + } + +//MConnectionNotify interface to catch the global events +void CConnectionProviderFactoryShim::SelectionComplete(TInt /*aError*/, const TDesC8& /*aSelectionInfo*/) + { + + ASSERT(NULL);//it's never to happen + } + +void CConnectionProviderFactoryShim::ConnectionError(TInt /*aError*/) + { + ASSERT(NULL);//it's never to happen + } + +void CConnectionProviderFactoryShim::LinkLayerOpen(TInt /*aError*/) + { + ASSERT(NULL);//it's never to happen + } + +void CConnectionProviderFactoryShim::LinkLayerClosed(TInt /*aError*/) + { + ASSERT(NULL);//it's never to happen + } + +void CConnectionProviderFactoryShim::ProgressNotification(TInt /*aStage*/, TInt /*aError*/) + { + ASSERT(NULL);//it's never to happen + } + +void CConnectionProviderFactoryShim::ProgressNotification(TSubConnectionUniqueId /*aSubConnectionUniqueId*/, TInt /*aStage*/, TInt /*aError*/) + { + ASSERT(NULL);//it's never to happen + } + +void CConnectionProviderFactoryShim::ServiceChangeNotification(TUint32 /*aId*/, const TDesC& /*aType*/) + { + ASSERT(NULL);//it's never to happen + } + +void CConnectionProviderFactoryShim::InterfaceStateChangeNotification(TDesC8& aInfo) + { + TInt count = iConnectionFactoryNotify.Count(); + for (TInt n = 0; n < count; n++) + { + iConnectionFactoryNotify[n].InterfaceStateChange(aInfo); + } + } + +void CConnectionProviderFactoryShim::NotifyDataSent(TSubConnectionUniqueId /*aSubConnectionUniqueId*/, TUint /*aUplinkVolume*/) + { + ASSERT(NULL);//it's never to happen + } + +void CConnectionProviderFactoryShim::NotifyDataReceived(TSubConnectionUniqueId /*aSubConnectionUniqueId*/, TUint /*aDownlinkVolume*/) + { + ASSERT(NULL);//it's never to happen + } + +void CConnectionProviderFactoryShim::SubConnectionEvent(const TSubConnectionEvent& /*aSubConnectionEvent*/) + { + ASSERT(NULL);//it's never to happen + } + + +/** +Define the factory query to find out particular CSubConnectionLinkShimClient object based on CConnection address +*/ + +class XShimFactoryQuery : public MCommsFactoryQuery + { + friend class CConnectionProviderFactoryShim; + +public: + explicit XShimFactoryQuery( NetMessages::CTypeIdQuery& aQuery ) : + iQuery(aQuery), + iClient(NULL) + { + } + +protected: + NetMessages::CTypeIdQuery& iQuery; + CSubConnectionLinkShimClient* iClient; + +public: + virtual TMatchResult Match( TFactoryObjectInfo& aInfo ); + }; + +//This method is called for each instance of particular class being managed by CommsFactory framework +MCommsFactoryQuery::TMatchResult XShimFactoryQuery::Match( TFactoryObjectInfo& aInfo ) + { + CConnectionProviderShim* connectionProvider = static_cast(aInfo.iInfo.iFactoryObject); + ASSERT(connectionProvider); + //call the CNifManSubConnectionShim interface to do the job + iClient = connectionProvider->QuerySubSessions(iQuery.iTypeId, reinterpret_cast (iQuery.iHandle)); + + return iClient ? MCommsFactoryQuery::EMatch : MCommsFactoryQuery::EContinue; + } + +/** Handles incoming messages + +@param aNetMessage Messsge reference +@return KErrNone|KErrNotFound|KErrNotSupported +@return if object found passes its pointer to the aNetMessasge object +*/ +TInt CConnectionProviderFactoryShim::DoReceiveMessage( NetMessages::CMessage& aNetMessage ) +{ +STypeId tid = STypeId::CreateSTypeId(NetMessages::KInterfaceUid, NetMessages::ETypeIdQueryId); +NetMessages::CTypeIdQuery& query = static_cast(aNetMessage); +TInt ret = KErrNotSupported; +if (aNetMessage.GetTypeId() == tid && query.iUid == KShimCommsUid) + { + XShimFactoryQuery q(query); + ret = FindObject(q) ? KErrNone : KErrNotFound; + //carry the result back + query.iHandle = (TInt)(static_cast(q.iClient)); + } +return ret; +} + +