networkcontrol/ipcprshim/src/connectionSelectorShim.cpp
branchRCL_3
changeset 58 8d540f55e491
parent 57 abbed5a4b42a
child 59 e36178c55292
child 63 425d8f4f7fa5
--- a/networkcontrol/ipcprshim/src/connectionSelectorShim.cpp	Tue Aug 31 16:45:15 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,557 +0,0 @@
-
-// 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:
-// Implementation file for the CConnectionSelectorShim
-// 
-//
-
-/**
- @file
- @internalComponent
-*/
-
-
-#include <nifman.h>
-#include <ss_glob.h>
-#ifndef SYMBIAN_NETWORKING_UMTSR5
-#include <comms-infras/nifif.h>
-#endif //SYMBIAN_NETWORKING_UMTSR5
-#include <connpref.h>
-#include <cdblen.h>
-#include <esockmessages.h>
-#include "shimcprfactory.h"
-#include "connectionSelectorShim.h"
-#include "shimcpr.h"
-
-using namespace ESock;
-
-//PREQ399_REMOVE
-#ifdef SYMBIAN_NETWORKING_3GPPDEFAULTQOS
-#include <nullagtprog.h>
-#endif
-//SYMBIAN_NETWORKING_3GPPDEFAULTQOS //PREQ399_REMOVE
-
-TInt CConnectionSelectorShim::AsyncDestructorCb(TAny* aInstance)
-	{
-	CConnectionSelectorShim* selector = reinterpret_cast<CConnectionSelectorShim*>(aInstance);
-	delete selector;
-	return KErrNone;
-	}
-
-CConnectionSelectorShim::CConnectionSelectorShim(ISelectionNotify& aNotify) : 
- iNotify(aNotify), 
- iAsyncDestructor(CActive::EPriorityStandard + 1),
- iConnProvider(NULL)
-/** 
-C'tor.
-
-The priority of the async destructor is specifically set one higher than normal
-to cater for the case whereby an RConnection is started asynchronously and
-immediately closed.  This ensures that the async destructor is called before
-NetCon begins the selection procedure, and hence can cancel the NetCon request
-before it starts.  This causes immediate cancellation of the connection start
-procedure.  Otherwise, NetCon gets in first, the connection comes all the way
-and then times out in the short timer.
-
-@param aNotify the ISelectionNotify that should be notified about the
-selection progress.
-*/
-    { 
-    __CFLOG_VAR((KShimCprTag, KShimCprSubTag, _L8("CConnectionSelectorShim %08x:\tCConnectionSelectorShim"), this));   
-    iAsyncDestructor.Set(TCallBack(AsyncDestructorCb, this));
-    }        
-    
-CConnectionSelectorShim::~CConnectionSelectorShim()
-    {
-	__CFLOG_VAR((KShimCprTag, KShimCprSubTag, _L8("CConnectionSelectorShim %08x:\t~CConnectionSelectorShim"), this));
-
-	iNotify.Detach(); //"PrevLayer"::Detach() will be called only once.
-
-	delete iSelectorSession;
-
-	iSelectionInfo.Close();
-    }
-
-
-void CConnectionSelectorShim::DeleteAsync()
-	{
-	if (!iAsyncDestructor.IsActive())
-		{
-		if (iConnProvider)
-			{
-			__CFLOG_VAR((KShimCprTag, KShimCprSubTag, _L8("CConnectionSelectorShim %08x:\tDeleteAsync() RelaseRef(this)"), this));
-			iConnProvider->ReleaseRef(this);
-			}
-		iAsyncDestructor.CallBack();
-		}
-    }
-
-#ifdef SYMBIAN_NETWORKING_UMTSR5
-void CConnectionSelectorShim::SetFactoryIface(MIAPLockInfo * aFactoryIface)
-	{
-	iFactoryIface = aFactoryIface;
-	}
-
-#endif // #ifdef SYMBIAN_NETWORKING_UMTSR5
-
-TInt CConnectionSelectorShim::Cancel()
-	{
-	return Cancel(KErrCancel,NULL);
-	}
-	
-TInt CConnectionSelectorShim::Cancel(TInt aReason, const RMessage2* aMessage)
-	{
-	__CFLOG_VAR((KShimCprTag, KShimCprSubTag, _L8("CConnectionSelectorShim %08x:\tCancel(aReason %d)"), this, aReason));
-	TInt error = KErrNone;
-	if (iSelectorSession)
-		{
-		error = iSelectorSession->Stop(aReason, aMessage);
-		delete iSelectorSession;
-		iSelectorSession = NULL;
-		}
-	
-	//"PrevLayer"::Detach() will be called only once.
-	//It is important to call iNotify.Detach() after all progress notifications
-	//resulting from NifSession::Stop() have been passed up towards the CConnection.
-	iNotify.Detach();
-	DeleteAsync();
-	return error;
-	}
-	
-TInt CConnectionSelectorShim::Select(Meta::SMetaData& aPreferences, const RMessagePtr2* aMessage)
-/** Implements CConnectorSelector::Select (async). The shim layer (this layer)
-delegates the selection to NIFMAN. NIFMAN cannot be asked just to perform the
-selection, as the selection is tighly coupled with starting connection provider.
-
-@param aPreferences connection preferences.
-*/
-    {
-    //Assume this is a TConnStart (as defined in ss_connprov.h)
-    STypeId type = aPreferences.GetTypeId();
-    ASSERT(type.iUid.iUid == KESockMessagesImplementationUid);
-	ASSERT(type.iType == EESockMessageConnStart);
-
-   	const TConnPref* connPrefs = NULL;
-   	TConnStartType stype = EConnStartImplicit;
-   	
-   	if (type.iType == EESockMessageConnStart)
- 		{
- 		connPrefs = reinterpret_cast<CConnStart&>(aPreferences).ConnPrefs();
- 		stype = reinterpret_cast<CConnStart&>(aPreferences).StartType();
-	    if (connPrefs && connPrefs->ExtensionId() == TConnPref::EConnPrefSnap)
-	    	{
-			__CFLOG_VAR((KShimCprTag, KShimCprSubTag, _L8("CConnectionSelectorShim %08x:\tSelect() with not supported preferences EConnPrefSnap"), this));
-	    	iNotify.SelectComplete(NULL, KErrNotSupported);
-	   	    DeleteAsync();
-	   	    return KErrNotSupported;
-	    	}
- 		}
-
-#ifdef SYMBIAN_NETWORKING_UMTSR5 
-     	
-		// The code here will check the secure ID of the application which is expected with the aMessage Ptr.
-		// The logic used here is that if a General purpose application locks an IAP then no other application
-		// should be allowed to start the connection ans should return with KErrAccessDenied.
-	    if(aMessage!=NULL)
-	       {
-	       iAppSecureId = aMessage->SecureId();
-	       }
- #endif   //SYMBIAN_NETWORKING_UMTSR5 
-    
-    TRAPD(ret,
-	iSelectorSession = Nif::NewConnectionL(this, 0);
-    if (connPrefs)
-    	{
-		__CFLOG_VAR((KShimCprTag, KShimCprSubTag, _L8("CConnectionSelectorShim %08x:\tSelect() with preferences, iSelectorSession %x"), this, iSelectorSession));
-	    iSelectorSession->StartL(stype, *connPrefs, aMessage );		
-    	}
-    else
-    	{
-		__CFLOG_VAR((KShimCprTag, KShimCprSubTag, _L8("CConnectionSelectorShim %08x:\tSelect() no preferences, iSelectorSession %x"), this, iSelectorSession));
-	    iSelectorSession->StartL(stype, aMessage );		
-    	}
-    );
-    if (ret != KErrNone)
-    	{
-    	iNotify.SelectComplete(NULL, ret);
-   	    DeleteAsync();
-    	}
-    return ret;
-    }
-    
-
-void CConnectionSelectorShim::SelectionComplete(TInt aError, const TDesC8& aSelectionInfo)
-/** Called by NIFMAN when the selection (previously triggered by CConnectionSelectorShim::SelectL)
-completes the selection. There are two methods NIFMAN will use to indicate progress to its client. This
-method and the generic ::ProgressNotification. This method forwards selection complete to
-this->ProgressNotification(KFinishedSelection).
-
-@param aError operation result.
-@param aSelectionInfo selection info (to be converted to TSoIfConnectionInfo {iIAPId; iNetworkId;})
-*/
-    {
-    __CFLOG_VAR((KShimCprTag, KShimCprSubTag, _L8("CConnectionSelectorShim %08x:\tSelectionComplete(), aError: %d"), this, aError));
-    iSelectionInfo.Close();
-    TInt err;
-    if((err = iSelectionInfo.Create(aSelectionInfo)) != KErrNone)
-    	{
-    	aError = err;
-    	}
-#ifdef SYMBIAN_NETWORKING_UMTSR5
-    // The following line will extract connection information which is sent by nifman after agent selection.The information contains IAP , iNetworkId
-	//and connection information.
-
-    Mem::Copy(&iConnectionInfo, aSelectionInfo.Ptr(),sizeof(iConnectionInfo));
-#endif
-    ProgressNotification(KFinishedSelection, aError);
-    }
-
-void CConnectionSelectorShim::CreateProviderL()
-	{
-	ASSERT(iSelectionInfo.Length());//this should only happen after the agent's been selected
-	__CFLOG_VAR((KShimCprTag, KShimCprSubTag, _L8("CConnectionSelectorShim %08x:\tCreateProviderL() iConnProvider %x"), this, iConnProvider));
- 	if (iConnProvider) 
- 		{
-		__CFLOG_VAR((KShimCprTag, KShimCprSubTag, _L8("CConnectionSelectorShim %08x:\tCreateProviderL() iConnProvider->GetNifSession() %x"), this, iConnProvider->GetNifSession()));	
-		__CFLOG_VAR((KShimCprTag, KShimCprSubTag, _L8("CConnectionSelectorShim %08x:\tCreateProviderL() iConnProvider->ConnectionInfo() %S"), this, &iConnProvider->ConnectionInfo()));
- 		}
-	//if we have a provider already and it's the existing one we have to check whether the conn info still matches since there could've been
-	//a reconnection
-	if ( iConnProvider && iConnProvider->GetNifSession() && iConnProvider->ConnectionInfo() != iSelectionInfo )
-		{
-        __CFLOG_VAR((KShimCprTag, KShimCprSubTag, _L8("CConnectionSelectorShim %08x:\tCreateProviderL() -> ReleaseRef()"), this));
-	    iConnProvider->ReleaseRef(this);
-	    iConnProvider = NULL;
-		}
-	if ( !iConnProvider )
-		{
-	    TSockManData* sockManData = SockManGlobals::Get();
-		ASSERT(sockManData);
-		
-		CConnectionFactoryContainer* connectionFactories = sockManData->iConnectionFactories;
-		ASSERT(connectionFactories);
-		
-		CConnectionProviderFactoryBase* factory = connectionFactories->FindFactory(KShimConnectionProviderFactoryId);
-		ASSERT(factory);
-		if (IsConnectionStoppingL())
-			{
-			// We must force the creation of a new provider because the old one is on its way out.
-			// This is required to ensure that we do not receive progresses generated as the connection
-			// comes down.  We are only interested in progresses generated when the connection subsequently
-			// starts coming up again.  Upper layers starting a connection just as it is coming down will
-			// otherwise receive these progresses.  In particular, progresses with an error will otherwise
-			// be mistaken for an indication that the connection startup failed.
-	    		iConnProvider = (CConnectionProviderShim*)factory->CreateProviderL();
-			__CFLOG_VAR((KShimCprTag, KShimCprSubTag, _L8("CConnectionSelectorShim %08x:\tCreateProviderL() - connection stopping, iConnProvider %x"), this, iConnProvider));
-			}
-		else
-			{
-			XConnectionFactoryQueryInfo query(NULL, iSelectionInfo);
-			iConnProvider = (CConnectionProviderShim*)factory->FindOrCreateProviderL(query);
-			__CFLOG_VAR((KShimCprTag, KShimCprSubTag, _L8("CConnectionSelectorShim %08x:\tCreateProviderL() - found/created iConnProvider %x"), this, iConnProvider));
-			}
-	    //and keep provider up during the selection
-	    iConnProvider->AddRefL(this);
-		}
-	}
-
-TBool CConnectionSelectorShim::IsConnectionStoppingL()
-	{
-	TPckg<TBool> stopping(EFalse);
-	iSelectorSession->ControlL(KCOLProvider, KNifSessionGetStopping, stopping, NULL);
-	return stopping();
-	}
-
-void CConnectionSelectorShim::HandleSelectionL()
-	{
-	// HandleSelection will set up the provider
-
-	// Set default factory as the CConnectionProviderFactoryShim
-	CreateProviderL();
-	if (iSelectorSession && !iConnProvider->GetNifSession())
-		{			
-		iConnProvider->SetConnectionInfo(iSelectionInfo);
-		//
-		// The factory didn't find an existing provider that matched the query.
-		// It's returned a brand new instance of CConnectionProviderShim.
-		// Hence we'll call Initialise. this will do 2 things:
-		//
-		// 1. Create a secure nif(man) session for the provider
-		// 2. Call ConnectionControlActivity for the provider so that
-		//			
-		iConnProvider->InitialiseL(iSelectorSession);
-		iConnProvider->SetBlockProgressesL(iSelectorSession);
-		iSetProviderNull = ETrue;
-		}
-	}
-
-
-#ifdef SYMBIAN_NETWORKING_UMTSR5
-void CConnectionSelectorShim::MaybeLockIapL()
-	{
-	//The value of Secure ID is fetched from DataBase againt IAP.Iap is taken agent selection is over.This will look 
-	//into the database if secureID feild is NULL or not if it is NULL then IAP will not be locked
-	CMDBSession* cmdbSession;
-	CCDIAPRecord* ptrIapRecord;
-	ptrIapRecord = static_cast<CCDIAPRecord*>(CCDRecordBase::RecordFactoryL(KCDTIdIAPRecord));
-	CleanupStack::PushL(ptrIapRecord);
-	
-	// Create a new CMDB session Object
-	cmdbSession = CMDBSession::NewL(KCDVersion1_1);
-	// If successm Get and Load the record.
-	CleanupStack::PushL(cmdbSession);
-
-	ptrIapRecord->SetRecordId(iConnectionInfo.iIAPId);
-	ptrIapRecord->LoadL(*cmdbSession);
-	// Although the SecureID of the application is numerical, we have to take it into the string buffer
-	// because of the limitations of the CommsDat, which dont support hexadeciaml values, and truncate 
-	// decimal values after 8 digits, for some unknown reasons.
-	// Because of the current project schedule, its not feasible to rectify commsdat as of now, so decided
-	// to take on string Buffers to be used for Secure Ids from commsdat 
-	TUint32 secureId;
-	secureId=ptrIapRecord->iAppSid;
- 	
-	if(secureId==iAppSecureId.iId && iAppSecureId.iId!=NULL)
-		{
-		// Inform the Factory that the Ids match so IAP will be locked. The IAP number is also given to 
-		// the factory so that the application can start connection on other IAPs which are not locked
-		// by the program
-		iFactoryIface->SetIAPLockStatus(ETrue,iConnectionInfo.iIAPId);
-		}
-	    
-        CleanupStack::Pop(cmdbSession);
-	delete cmdbSession;
-	CleanupStack::Pop(ptrIapRecord);
-	delete ptrIapRecord;
-	       
-	}
-#endif
-
-void CConnectionSelectorShim::ProgressNotification(TInt aStage, TInt aError)
-/** 
-
-@param 
-*/  
-    {
-	__CFLOG_VAR((KShimCprTag, KShimCprSubTag, _L8("CConnectionSelectorShim %08x:\tProgressNotification(%d, %d)"), 
-					 this, aStage, aError));
-	
-	// In all cases we must pass the new progress up the chain of selectors
-	if (aError == KErrNone)
-		{
-		aError = iError;
-		}
-	//	
-	// Depending on the progress and the progress error, we need to handle situations differently
-	// 
-	// Normally, if progress has reached KFinishedSelection, we stop propogating the progress
-	// up, because, we would have already setup the provide (iProvider) with a new nif session
-	// pointing to the same agent as iSelectorSession, hence further messages from agent and
-	// nifman will be forwared to the provider.
-	//
-	// However, there are two exceptions to this situation:
-	// We have a provider that's already been initialized with a nif session
-	// signified by !iSetProviderNull, in which case, we forward the message up 
-	// whether or not we have finished selection. Same goes for situations when 
-	// we have progress error, instead of waiting for the provider to propogate the 
-	// message upwards, we use iNotify to do that, since the client would expect the
-	// message (e.g. Stop) to be completed with error immidiately
-	// 
-
-	// Any error means that the selection (and startup of the interface) will be abandoned and reported to the client.
-	if (aError != KErrNone)
-		{
-		iNotify.ProgressNotification(aStage, aError);
-		iNotify.SelectComplete(NULL, aError);
-		DeleteAsync();
-		}
-	else if (aStage <= KFinishedSelection || !iSetProviderNull)
-		{
-		iNotify.ProgressNotification(aStage, aError);
-		}
-
-	if (aStage == KFinishedSelection && aError == KErrNone)
-		{
-		// The selection is complete so we want to reach the situation where the selector (this object) is 
-		// joined by the appropriate provider. The provider will be set up with a pointer to the CNifSession 
-		// allowing the calls to methods such as EnumerateSubConnections to work between KFinishedSelection and
-		// KLinkLayerOpen. The provider will be accessible from the selector until KLinkLayerOpen is reached
-		// (when the selector will be destroyed).
-		TRAP(aError,HandleSelectionL());
-		if (aError == KErrNone)
-			{
-			iNotify.SelectComplete(iConnProvider, aError);
-			}
-#ifdef SYMBIAN_NETWORKING_UMTSR5
-
-		// First Check IAP Locked, if yes Return,
-		TBool  IapLocked = EFalse;
-		TInt	IapNumber = -1;
-	
-		iFactoryIface->GetIAPLockStatus(IapLocked, IapNumber);
-	
-		if (IapLocked && IapNumber == iConnectionInfo.iIAPId)
-			{
-			//iNotify.ProgressNotification(aStage, KErrPermissionDenied);
-			iNotify.SelectComplete(iConnProvider, KErrPermissionDenied);
-			DeleteAsync();	
-			return;
-			}
-#endif //SYMBIAN_NETWORKING_UMTSR5  
-
-		}
-	else if (aStage == KConnectionUninitialised)
-		{
-		//KConnectionUninitialised means that the interface has been stopped.
-		DeleteAsync();
-		}
-	else if (aStage == KLinkLayerOpen && !iIsLinkLayerOpen)
-		{
-		// Calling iNotify.LayerUp when we have a provider setup with a nif session already
-		// follows from the logic above justifying propogating progress up when we have a 
-		// provider setup with a nif session
-		iNotify.LayerUp(aError);
-		DeleteAsync(); // The interface has successfully started and all responsibility should be taken over by the the provider.
-		}
-
-#ifdef SYMBIAN_NETWORKING_3GPPDEFAULTQOS
-    else if ( aStage == ENullAgtConnecting && aError == KErrNone )
-    	{
-#ifdef SYMBIAN_NETWORKING_UMTSR5
-
-	TRAPD(ret,MaybeLockIapL());
-#ifdef __CFLOG_ACTIVE	
-	if(ret!=KErrNone)
-		{
-		__CFLOG_VAR((KShimCprTag, KShimCprSubTag, _L8("CConnectionSelectorShim %08x:\tMaybeLockIap left with  %d"), 
-					 this, ret));
-		}
-#endif
-	(void)ret; //TRAP is safe to ignore becuase if MaybeLockIapL: leave the correct behaviour is to leave Iap unlocked.
-	//We can safely ignore the trap because the function will only lock IAP. One should not be effected if someth
-#endif //SYMBIAN_NETWORKING_UMTSR5  
-    	}
-    	
-#endif //SYMBIAN_NETWORKING_3GPPDEFAULTQOS //PREQ399_REMOVE
-    }
-
-
-void CConnectionSelectorShim::SubConnectionEvent(const TSubConnectionEvent& /*aSubConnectionEvent*/)
-/** 
-
-@param 
-*/
-   {		
-   }
-
-void CConnectionSelectorShim::ServiceChangeNotification(TUint32 aId, const TDesC& aType)
-/** 
-
-@param 
-*/
-   {
-   iNotify.ServiceChangeNotification(aId, aType);
-   }
-
-void CConnectionSelectorShim::LinkLayerOpen(TInt aError)
-/** 
-
-@param 
-*/
-	{
-	__CFLOG_VAR((KShimCprTag, KShimCprSubTag, _L8("CConnectionSelectorShim %08x:\tLinkLayerOpen(aError %d)"), 
-					 this, aError));
-	iIsLinkLayerOpen = ETrue;
-	if (aError == KErrNone)
-		{
-		if (iSetProviderNull)
-			{
-			ASSERT(iConnProvider->GetNifSession());
-			iConnProvider->ReleaseRef(this);
-			iConnProvider = NULL;
-			iSetProviderNull = EFalse;
-			}		
-		
-		DeleteAsync();
-		}
-	else
-		{
-		iNotify.SelectComplete(NULL, aError);
-		}
-    }
-    
-void CConnectionSelectorShim::SetProviderNull()
-	{
-	__CFLOG_VAR((KShimCprTag, KShimCprSubTag, _L8("CConnectionSelectorShim %08x:\tSetProviderNull() iConnProvider %x"), this, iConnProvider));
-	iConnProvider = NULL;
-	}
-
-void CConnectionSelectorShim::ConnectionError(TInt /*aError*/)
-/** 
-
-@param 
-*/
-    {
-    //ignore the event
-    }
-
-
-void CConnectionSelectorShim::LinkLayerClosed(TInt /*aError*/)
-/** 
-
-@param 
-*/
-    {
-    //ignore the event
-    }
-
-
-
-void CConnectionSelectorShim::ProgressNotification(TSubConnectionUniqueId /*aSubConnectionUniqueId*/, TInt /*aStage*/, TInt /*aError*/)
-/** 
-
-@param 
-*/
-    {
-    }
-
-void CConnectionSelectorShim::InterfaceStateChangeNotification(TDesC8& /*aInfo*/)
-/** 
-
-@param 
-*/
-    {
-    //ignore the event
-    }
-
-
-void CConnectionSelectorShim::NotifyDataSent(TSubConnectionUniqueId /*aSubConnectionUniqueId*/, TUint /*aUplinkVolume*/)
-/** 
-
-@param 
-*/
-    {
-    //ignore the event
-    }
-
-
-void CConnectionSelectorShim::NotifyDataReceived(TSubConnectionUniqueId /*aSubConnectionUniqueId*/, TUint /*aDownlinkVolume*/)
-/** 
-
-@param 
-*/
-    {
-    //ignore the event
-    }
-