networkcontrol/ipcprshim/src/shimcprfactory.cpp
changeset 37 052078dda061
--- /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 <ecom/ecom.h>
+#include <implementationproxy.h>
+#include "shimcprfactory.h"	// for CConnectionProviderFactoryShim
+
+#include "connectionSelectorShim.h"
+#include "shimcpr.h"
+#include "shimnifmansconn.h"
+#include "idquerynetmsg.h"
+#include <nifman.h>
+#ifdef SYMBIAN_NETWORKING_UMTSR5
+#include <esockmessages.h>
+#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<CConnectionFactoryContainer*>(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<TConnectionInfo>& 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<CConnectionProviderShim*>(aInfo.iInfo.iFactoryObject);
+	ASSERT(connectionProvider);
+	//call the CNifManSubConnectionShim interface to do the job
+	iClient = connectionProvider->QuerySubSessions(iQuery.iTypeId, reinterpret_cast<CConnection*> (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<NetMessages::CTypeIdQuery&>(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<MShimControlClient*>(q.iClient));
+	}
+return ret;
+}
+
+