networkcontrol/ipcprshim/src/shimclient.cpp
branchRCL_3
changeset 58 8d540f55e491
parent 57 abbed5a4b42a
child 59 e36178c55292
child 63 425d8f4f7fa5
--- a/networkcontrol/ipcprshim/src/shimclient.cpp	Tue Aug 31 16:45:15 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,733 +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:
-// This is part of an ECOM plug-in
-// 
-//
-
-#include <ss_std.h>
-#include "shimnifmansconn.h"
-#include "es_prot.h"
-
-
-/**
-@internalComponent
-*/
-const TUint KMicrosecondsInASecond = 1000000;
-const TInt KMaxTimerPeriod = KMaxTInt32/KMicrosecondsInASecond; //< max period of a CTimer using After()
-
-
-CSubConnectionLinkShimClient::CSubConnectionLinkShimClient(const CConnection& aConnection, CNifManSubConnectionShim& aSubConnectionShim) :
-	iConnection(aConnection), 
-	iSubConnectionShim(aSubConnectionShim),
-	iOutstandingProgressNotification(EFalse), 
-	iOutstandingDataSentNotification(EFalse), 
-	iOutstandingDataReceivedNotification(EFalse), 
-	iOutstandingSubConnectionActivity(EFalse) 
-/**
-*/
-	{
-	__CFLOG_VAR((KShimScprTag, KShimScprClientTag, _L8("CSubConnectionLinkShimClient %08x:\tCSubConnectionLinkShimClient() created for id %d, iConnection %08x"), 
-							 this, aSubConnectionShim.Id(), &iConnection));
-	}
-
-CSubConnectionLinkShimClient::~CSubConnectionLinkShimClient()
-/**
-Complete all outstanding RMessages
-
-*/
-	{	
-	__CFLOG_VAR((KShimScprTag, KShimScprClientTag, _L8("CSubConnectionLinkShimClient %08x:\t~CSubConnectionLinkShimClient(), id %d, iSubConnectionShim %08x"), 
-				 this, iSubConnectionShim.Id(), this, &iSubConnectionShim));
-
-	if(iActivityTimer)
-		{
-		iActivityTimer->Cancel();
-		delete iActivityTimer;
-		iActivityTimer = NULL;
-		}
-
-	if(iOutstandingProgressNotification)
-		iOutstandingProgressNotificationMessage.Complete(KErrCancel);
-	if(iOutstandingDataSentNotification)
-		iOutstandingDataSentNotificationMessage.Complete(KErrCancel);
-	if(iOutstandingDataReceivedNotification)
-		iOutstandingDataReceivedNotificationMessage.Complete(KErrCancel);
-	if(iOutstandingSubConnectionActivity)
-		iOutstandingSubConnectionActivityMessage.Complete(KErrCancel);
-	if (iSubConnectionShim.DataTransferShim())
-		{
-		iSubConnectionShim.DataTransferShim()->DeRegisterClient(*this);
-		}
-	}
-
-TBool CSubConnectionLinkShimClient::Match(const CConnection& aConnection) const
-	{
-	return &iConnection == &aConnection;
-	}
-	
-TSubConnectionUniqueId CSubConnectionLinkShimClient::Id()
-	{
-	return iSubConnectionShim.Id();
-	}
-
-TInt CSubConnectionLinkShimClient::ReturnCode() const
-	{
-	return iReturnCode;
-	}
-	
-TInt CSubConnectionLinkShimClient::GetCurrentProgress(TNifProgress& aProgress)
-/**
-Return the current progress state
-
-@param aProgress On return, contains the current progress from the subconnection
-@return KErrNone if successful; otherwise one of the system-wide error codes
-*/
-	{	
-	aProgress = iCurrentProgress;
-	
-	__CFLOG_VAR((KShimScprTag, KShimScprClientTag, _L8("CSubConnectionLinkShimClient %08x:\tGetCurrentProgress() => (%d, %d)"), 
-			    this, aProgress.iStage, aProgress.iError));
-	return KErrNone;
-	}
-
-TBool CSubConnectionLinkShimClient::StopL(const RMessage2& aMessage)
-	{	
-	TInt stopCode = 0;
-	RConnection::TConnStopType stopType = static_cast<RConnection::TConnStopType>(aMessage.Int1());
-	switch (stopType)
-		{
-		case RConnection::EStopNormal:
-			stopCode = KErrCancel;
-			break;
-		case RConnection::EStopAuthoritative:
-			stopCode = KErrConnectionTerminated;
-			break;
-		default:
-			stopCode = KErrCancel; // to remove compile warning
-			User::Leave(KErrArgument);
-		}
-
-	TInt ret = iSubConnectionShim.Provider().Stop(iSubConnectionShim.Id(), stopCode, &aMessage);
-	if (ret != KErrNone)
-		{
-		User::Leave(ret);
-		}
-	return ETrue;
-	}
-
-TBool CSubConnectionLinkShimClient::DataTransferredL(const RMessage2& aMessage)
-	{
-	__CFLOG_VAR((KShimScprTag, KShimScprClientTag, _L8("CSubConnectionLinkShimClient %08x:\tDataTransferredL(), id %d"),
-				this, iSubConnectionShim.Id()));
-
-	TUint uplinkDataVolume;
-	TUint downlinkDataVolume;
-
-	TInt ret = iSubConnectionShim.DataTransferShim()->DataTransferred(uplinkDataVolume, downlinkDataVolume);
-
-	__CFLOG_VAR((KShimScprTag, KShimScprClientTag, _L8("CSubConnectionLinkShimClient %08x:\tDataTransferredL(), ret %d, uplink %d, downlink %d"),
-			    this, ret, uplinkDataVolume, downlinkDataVolume));
-
-	if (KErrNone == ret)
-		{
-		TPckg<TUint> uplinkDataVolumePckg(uplinkDataVolume);
-		TPckg<TUint> downlinkDataVolumePckg(downlinkDataVolume);
-
-		aMessage.WriteL(1, uplinkDataVolumePckg);
-		aMessage.WriteL(2, downlinkDataVolumePckg);
-		}
-	SetReturnCode(ret);
-	return ETrue;
-	}
-
-TBool CSubConnectionLinkShimClient::DataTransferredCancel(const RMessage2& /*aMessage*/)
-	{
-	return ETrue;		
-	}
-
-TBool CSubConnectionLinkShimClient::RequestSubConnectionProgressNotificationL(const RMessage2& aMessage)
-/**
-Request from client for notification of new progress
-
-@pre No outstanding request for data sent notifications for this subconnection on this RConnection
-@param aMessage The client message
-@return ETrue if the client message is to be completed immediately
-@leave leaves with KErrInUse if there is already an outstanding RMessage for progress notification
-*/
-	{
-	if(iOutstandingProgressNotification)
-		User::Leave(KErrInUse);
-
-	TInt clientRequestedProgress = 0;
-	clientRequestedProgress = static_cast<TUint>(aMessage.Int2());
-	// if	- the last progress we sent to the client differs from the current one
-	// and	- the current progress is the same as the client requested progress OR 
-	//        the client has no requested progress...
-	if(iLastProgressToClient!=iCurrentProgress.iStage &&
-		(iCurrentProgress.iStage == clientRequestedProgress || clientRequestedProgress==0))
-		{		
-		__CFLOG_VAR((KShimScprTag, KShimScprClientTag, _L8("CSubConnectionLinkShimClient %08x:\tRequestSubConnectionProgressNotificationL() returning progress (%d, %d)"), 
-							 this, iCurrentProgress.iStage, iCurrentProgress.iError));
-
-		// ...send the current progress back
-		TPckg<TNifProgress> prog(iCurrentProgress);
-		aMessage.WriteL(1, prog);
-		return ETrue;
-		}
-	else	// store the client message until the next progress value arrives
-		{
-		//__FLOG_STATIC1(_L("ESock: "), _L("CSubConnectionLinkShimClient"), 
-		// _L("[id: %d]: client requested progress notification; storing client message for later completion"), 
-		// iSubConnectionsUniqueId);
-		__CFLOG_VAR((KShimScprTag, KShimScprClientTag, _L8("CSubConnectionLinkShimClient %08x:\tRequestSubConnectionProgressNotificationL() storing client message for later completion"), this));
-
-		iClientRequestedProgress = clientRequestedProgress;	// may be 0
-		iOutstandingProgressNotificationMessage = aMessage;
-		iOutstandingProgressNotification = ETrue;
-		return EFalse;
-		}
-	}
-
-TBool CSubConnectionLinkShimClient::CancelSubConnectionProgressNotification(const RMessage2& /*aMessage*/)
-/**
-Complete outstanding progress notification RMessage
-
-@param aMessage The client message
-@return ETrue if the client message is to be completed immediately
-*/
-	{
-	__CFLOG_VAR((KShimScprTag, KShimScprClientTag, _L8("CSubConnectionLinkShimClient %08x:\tCancelSubConnectionProgressNotification(), id %d, iSubConnectionShim %08x"), 
-						 iSubConnectionShim.Id(), this));
-
-	if(iOutstandingProgressNotification)
-		{
-		iOutstandingProgressNotificationMessage.Complete(KErrCancel);
-		iOutstandingProgressNotification = EFalse;
-		}
-	return ETrue;
-	}
-
-TBool CSubConnectionLinkShimClient::DataSentNotificationRequestL(const RMessage2& aMessage)
-/**
-Request notification when the specified (absolute or relative) volume of data has been sent
-
-@pre No outstanding request for data sent notifications for this subconnection on this RConnection
-@param aMessage The client message
-@return ETrue if the client message is to be completed immeadiately
-@leave leaves with KErrInUse if there is already an outstanding RMessage for data sent notification
-*/
-	{
-	if(iOutstandingDataSentNotification)
-		User::Leave(KErrInUse);
-
-	TUint requestedUplinkGranularity = static_cast<TUint>(aMessage.Int1());
-	if(requestedUplinkGranularity)	// the client is working in relative mode
-		{
-		iRemainingUplinkGranularity = requestedUplinkGranularity;
-		iDataSentNotificationsInAbsoluteMode = EFalse;
-
-		__CFLOG_VAR((KShimScprTag, KShimScprClientTag, _L8("CSubConnectionLinkShimClient %08x:\tDataSentNotificationRequestL(), id %d (relative mode: %d bytes)"), 
-							 this, iSubConnectionShim.Id(), iRemainingUplinkGranularity));
-		}
-	else							// the client is working in absolute mode
-		{
-		TPckg<TUint> iUplinkVolumeBuf(iUplinkDataNotificationVolume);
-		aMessage.ReadL(2, iUplinkVolumeBuf);
-		iDataSentNotificationsInAbsoluteMode = ETrue;
-
-		__CFLOG_VAR((KShimScprTag, KShimScprClientTag, _L8("CSubConnectionLinkShimClient %08x:\tDataSentNotificationRequestL() id %d (absolute mode: %d bytes)"), 
-							 this, iSubConnectionShim.Id(), iUplinkDataNotificationVolume));
-
-		if(iUplinkDataNotificationVolume >= iUplinkDataVolume)	// we've already sent this amount of data
-			{
-			__CFLOG_VAR((KShimScprTag, KShimScprClientTag, _L8("CSubConnectionLinkShimClient %08x:\tDataSentNotificationRequestL() id %d (completed immediately"), 
-								 this, iSubConnectionShim.Id()));
-			return ETrue;
-			}
-		}
-	
-	iOutstandingDataSentNotificationMessage = aMessage;
-	iOutstandingDataSentNotification = ETrue;
-	
-	iSubConnectionShim.DataTransferShim()->DataSentNotificationRequest(requestedUplinkGranularity, iUplinkDataNotificationVolume);
-
-	return EFalse;
-	}
-
-TBool CSubConnectionLinkShimClient::DataSentNotificationCancel(const RMessage2& /*aMessage*/)
-/**
-Complete outstanding data sent notification RMessage
-
-@param aMessage The client message
-@return ETrue if the client message is to be completed immediately
-*/
-	{
-	__CFLOG_VAR((KShimScprTag, KShimScprClientTag, _L8("CSubConnectionLinkShimClient %08x:\tDataSentNotificationCancel() id %d"), 
-				 this, iSubConnectionShim.Id()));
-	iSubConnectionShim.DataTransferShim()->DataSentNotificationCancel();
-
-	if(iOutstandingDataSentNotification)
-		{
-		iOutstandingDataSentNotificationMessage.Complete(KErrCancel);
-		iOutstandingDataSentNotification= EFalse;
-		}
-	return ETrue;
-	}
-
-TBool CSubConnectionLinkShimClient::DataReceivedNotificationRequestL(const RMessage2& aMessage)
-/**
-Request notification when the specified (absolute or relative) volume of data has been sent
-
-@pre No outstanding request for data sent notifications for this subconnection on this RConnection
-@param aMessage The client message
-@return ETrue if the client message is to be completed immediately
-@leave leaves with KErrInUse if there is already an outstanding RMessage for data received notification
-*/
-	{
-
-	if(iOutstandingDataReceivedNotification)
-		User::Leave(KErrInUse);
-	
-	TUint requestedDownlinkGranularity = static_cast<TUint>(aMessage.Int1());
-	if(requestedDownlinkGranularity)	// the client is working in relative mode
-		{
-		iRemainingDownlinkGranularity = requestedDownlinkGranularity;
-		iDataReceivedNotificationsInAbsoluteMode = EFalse;
-		
-		__CFLOG_VAR((KShimScprTag, KShimScprClientTag, _L8("CSubConnectionLinkShimClient %08x:\tDataReceivedNotificationRequestL() id %d (relative mode: %d bytes)"), 
-					 this, iSubConnectionShim.Id(), iRemainingDownlinkGranularity));
-		}
-	else							// the client is working in absolute mode
-		{
-		TPckg<TUint> iDownlinkVolumeBuf(iDownlinkDataNotificationVolume);
-		aMessage.ReadL(2, iDownlinkVolumeBuf);
-		iDataReceivedNotificationsInAbsoluteMode = ETrue;
-
-		__CFLOG_VAR((KShimScprTag, KShimScprClientTag, _L8("CSubConnectionLinkShimClient %08x:\tDataReceivedNotificationRequestL() id %d (absolute mode: %d bytes)"), 
-							 this, iSubConnectionShim.Id(), iDownlinkDataNotificationVolume));
-		
-		if(iDownlinkDataNotificationVolume >= iDownlinkDataVolume)	// we've already received this amount of data
-			{
-			__CFLOG_VAR((KShimScprTag, KShimScprClientTag, _L8("CSubConnectionLinkShimClient %08x:\tDataReceivedNotificationRequestL() id %d(completed immediately)"), 
-						 this, iSubConnectionShim.Id()));
-			return ETrue;
-			}
-		}
-
-	iOutstandingDataReceivedNotificationMessage = aMessage;
-	iOutstandingDataReceivedNotification = ETrue;
-
-	iSubConnectionShim.DataTransferShim()->DataReceivedNotificationRequest(requestedDownlinkGranularity, iDownlinkDataNotificationVolume);
-
-	return EFalse;
-	}
-
-TBool CSubConnectionLinkShimClient::DataReceivedNotificationCancel(const RMessage2& /*aMessage*/)
-/**
-Complete outstanding data received notification RMessage
-
-@param aMessage The client message
-@return ETrue if the client message is to be completed immediately
-*/
-	{
-	__CFLOG_VAR((KShimScprTag, KShimScprClientTag, _L8("CSubConnectionLinkShimClient %08x:\tDataReceivedNotificationCancel() id %d"), 
-						 this, iSubConnectionShim.Id()));
-
-	iSubConnectionShim.DataTransferShim()->DataReceivedNotificationCancel();
-
-	if(iOutstandingDataReceivedNotification)
-		{
-		iOutstandingDataReceivedNotificationMessage.Complete(KErrCancel);
-		iOutstandingDataReceivedNotification = EFalse;
-		}
-	return ETrue;
-	}
-
-TBool CSubConnectionLinkShimClient::IsSubConnectionActiveRequestL(const RMessage2& aMessage)
-/**
-Indicate whether the subconnection is active or not
-
-@note Checks at a period defined in the RMessage
-@note Only returns when the state varies from that provided by the client
-@param aMessage The client message
-@return ETrue if the client message is to be completed immediately
-*/
-	{
-	if(iOutstandingSubConnectionActivity)
-		User::Leave(KErrInUse);
-
-	__CFLOG_VAR((KShimScprTag, KShimScprClientTag, _L8("CSubConnectionLinkShimClient %08x:\tIsSubConnectionActiveRequestL() id %d"), 
-				this, iSubConnectionShim.Id()));
-
-	// Create the activity timer if it doesn't already exist (from a previous request)
-	if(!iActivityTimer)
-		{
-		__CFLOG_VAR((KShimScprTag, KShimScprClientTag, _L8("CSubConnectionLinkShimClient %08x:\tIsSubConnectionActiveRequestL() id %d - creating timer"), 
-					this, iSubConnectionShim.Id()));
-
-		iActivityTimer = CActivityTimer::NewL(this, KActivityTimerPriority);
-		}
-
-	TPckg<TBool> subConnectionActiveBuf(iClientBelievesSubConnectionActive);
-	aMessage.ReadL(2, subConnectionActiveBuf);
-
-	iSubConnectionShim.DataTransferShim()->DataTransferred(iPreviousUplinkDataVolume, iPreviousDownlinkDataVolume);	
-
-	// get clients request timer period and check validity
-	TInt timeInSeconds = static_cast<TUint>(aMessage.Int1());
-	if(timeInSeconds > KMaxTimerPeriod) // secs; underlying CTimer limitation
-		{
-		__CFLOG_VAR((KShimScprTag, KShimScprClientTag, _L8("CSubConnectionLinkShimClient %08x:\tIsSubConnectionActiveRequestL() id %d - rejecting timer request (%d secs)"), 
-							 this, iSubConnectionShim.Id(), timeInSeconds));
-		
-		SetReturnCode(KErrArgument);
-		return ETrue;
-		}
-
-	// store in microsecs
-	iRequestedClientTimerPeriod = timeInSeconds * KMicrosecondsInASecond;
-	
-	__CFLOG_VAR((KShimScprTag, KShimScprClientTag, _L8("CSubConnectionLinkShimClient %08x:\tIsSubConnectionActiveRequestL() id %d, iClientBelievesSubConnectionActive %d, iRequestedClientTimerPeriod %d - Starting timer."), 
-						 this, iSubConnectionShim.Id(), iClientBelievesSubConnectionActive, iRequestedClientTimerPeriod));
-
-	iOutstandingSubConnectionActivity = ETrue;
-	iOutstandingSubConnectionActivityMessage = aMessage;
-
-	iActivityTimer->After(iRequestedClientTimerPeriod);
-	return EFalse;
-	}
-
-TBool CSubConnectionLinkShimClient::IsSubConnectionActiveCancel(const RMessage2& /*aMessage*/)
-	{
-	__CFLOG_VAR((KShimScprTag, KShimScprClientTag, _L8("CSubConnectionLinkShimClient %08x:\tIsSubConnectionActiveCancel() id %d, connection %08x"), 
-						 this, iSubConnectionShim.Id(), &iConnection));
-
-	if(iOutstandingSubConnectionActivity)
-		{
-		iActivityTimer->Cancel();
-		ASSERT(iOutstandingSubConnectionActivity); // assert that the timer cancelled rather than completing
-		iOutstandingSubConnectionActivityMessage.Complete(KErrCancel);
-		iOutstandingSubConnectionActivity = EFalse;
-		}
-	return ETrue;
-	}
-	
-TInt CSubConnectionLinkShimClient::GetSubConnectionInfo(const RMessage2& aMessage)
-	{
-	TUint index = static_cast<TUint>(aMessage.Int0());
-	
-	TInt result = KErrNone;
-	TRAP(result,
-
-   	// Find the size of the clients descriptor
-   	TInt sizeOfSubConnInfo = aMessage.GetDesLengthL(1);
-   
-   	// Create an appropriately sized descriptor server-side
-   	HBufC8* subConnectionInfo;
-   	subConnectionInfo = HBufC8::NewL(sizeOfSubConnInfo);
-   	CleanupStack::PushL (subConnectionInfo);
-   	
-   	TPtr8 subConnInfoPtr(subConnectionInfo->Des());
-
-   	// and read the client data across
-      aMessage.ReadL(1, subConnInfoPtr);
-
-   	// Pass it down to the connection provider using the appropriate call
-     	if(index==KUseEmbeddedUniqueId)
-   		{
-   		result = iSubConnectionShim.Provider().GetSubConnectionInfo(subConnInfoPtr);
-   		}
-   	else
-   		{
-   		result = iSubConnectionShim.Provider().GetSubConnectionInfo(index, subConnInfoPtr);
-   		}
-   
-   	if (KErrNone == result)
-   		{
-   		// Write result back into client's address space
-   		aMessage.WriteL(1, subConnInfoPtr);
-   		}
-   		
-   	CleanupStack::PopAndDestroy (subConnectionInfo);
-      );  // END TRAP
-      
-	SetReturnCode(result);
-	return ETrue;
-	}
-	
-void CSubConnectionLinkShimClient::ProgressNotification(TInt aStage, TInt aError, const TDesC8& /*aInfo*/)
-/**
-Notification of new progress stage from nif/agent via Nifman and CInterface
-
-@param aStage The progress stage that has been reached
-@param aError Any errors that have occured
-@param aInfo No idea what this is, it's inserted by CInterface and is currently null
-*/
-	{
-	__CFLOG_VAR((KShimScprTag, KShimScprClientTag, _L8("CSubConnectionLinkShimClient %08x:\tProgressNotification(%d, %d) id %d"), 
-						this, aStage, aError, iSubConnectionShim.Id()));
-
-	iCurrentProgress.iStage = aStage;
-	iCurrentProgress.iError = aError;
-
-	if(iOutstandingProgressNotification)
-		{
-		if(iLastProgressToClient!=iCurrentProgress.iStage && /* we could assume this since we've probably just received a new progress value */
-			(iCurrentProgress.iStage == iClientRequestedProgress || iClientRequestedProgress==0))
-			{
-			TPckg<TNifProgress> prog(iCurrentProgress);
-			TInt err= iOutstandingProgressNotificationMessage.Write(1, prog);
-			iOutstandingProgressNotificationMessage.Complete(err);
-			iOutstandingProgressNotification= EFalse;
-			}
-		}
-	}
-
-TInt CSubConnectionLinkShimClient::NotifyDataSent(TUint aUplinkVolume, TUint aCurrentGranularity)
-/**
-Upcall from connection provider, via MConnDataTransferNotify. Update the sent bytes count, and if necessary
-complete any outstanding RMessages
-
-@param aUplinkVolume The total number of bytes sent on this subconnection
-@note Upcall from CInterface via CConnection
-*/
-	{	
-	__CFLOG_VAR((KShimScprTag, KShimScprClientTag, _L8("CSubConnectionLinkShimClient %08x:\tNotifyDataSent(aUplinkVolume %d, aCurrentGranularity %d) id %d"), 
-						 this, aUplinkVolume, aCurrentGranularity, iSubConnectionShim.Id()));
-
-	iUplinkDataVolume = aUplinkVolume;
-
-	TBool completeMessage = EFalse;
-
-	if(iOutstandingDataSentNotification)
-		{
-		__CFLOG_VAR((KShimScprTag, KShimScprClientTag, _L8("CSubConnectionLinkShimClient %08x:\tid %d - outstanding client request"), 
-							 this, iSubConnectionShim.Id()));
-		switch(iDataSentNotificationsInAbsoluteMode)
-			{
-			case ETrue:
-				__CFLOG_VAR((KShimScprTag, KShimScprClientTag, _L8("CSubConnectionLinkShimClient %08x:\tid %d - %d bytes remaining to be sent before client completion (absolute mode)"), 
-									 this, iSubConnectionShim.Id(), (iUplinkDataNotificationVolume - iUplinkDataVolume)));
-				
-				if (iUplinkDataVolume >= iUplinkDataNotificationVolume)
-					{
-					completeMessage = ETrue;
-					}
-				break;
-				
-			case EFalse:	// in relative mode
-				iRemainingUplinkGranularity -= aCurrentGranularity;
-				
-				__CFLOG_VAR((KShimScprTag, KShimScprClientTag, _L8("CSubConnectionLinkShimClient %08x:\tid %d - %d bytes remaining to be sent before client completion (relative mode)."), 
-									 this, iSubConnectionShim.Id(), iRemainingUplinkGranularity));
-				
-				if(iRemainingUplinkGranularity <= 0)
-					{
-					completeMessage = ETrue;
-					}
-				break;
-
-			default:
-				break;
-			}
-		}
-
-	if(completeMessage)
-		{
-		__CFLOG_VAR((KShimScprTag, KShimScprClientTag, _L8("CSubConnectionLinkShimClient %08x:\tid %d - completing client request."), 
-							 iSubConnectionShim.Id(), this));
-		TPckg<TUint> iUplinkDataVolumePckg(iUplinkDataVolume);
-		TInt ret= iOutstandingDataSentNotificationMessage.Write(2, iUplinkDataVolumePckg);
-		iOutstandingDataSentNotificationMessage.Complete(ret);
-		iOutstandingDataSentNotification= EFalse;
-		}
-	return KErrNone;
-	}
-
-TInt CSubConnectionLinkShimClient::NotifyDataReceived(TUint aDownlinkVolume, TUint aCurrentGranularity)
-/**
-Update the received bytes count, and if necessary complete any outstanding RMessages
-
-@param aDownlinkVolume The total number of bytes sent on this subconnection
-@param aCurrentGranularity The currently set granularity of notifications from the CInterface object
-@note Upcall from CInterface via CConnection
-*/
-	{
-	__CFLOG_VAR((KShimScprTag, KShimScprClientTag, _L8("CSubConnectionLinkShimClient %08x:\tNotifyDataReceived(aDownlinkVolume %d, aCurrentGranularity %d)"), 
-						 this, iSubConnectionShim.Id(), aDownlinkVolume, aCurrentGranularity));
-
-	iDownlinkDataVolume = aDownlinkVolume;
-
-	TBool completeMessage = EFalse;
-
-	if(iOutstandingDataReceivedNotification)
-		{
-		__CFLOG_VAR((KShimScprTag, KShimScprClientTag, _L8("CSubConnectionLinkShimClient %08x:\tid %d - outstanding client request"), 
-							 this, iSubConnectionShim.Id()));
-		switch(iDataReceivedNotificationsInAbsoluteMode)
-			{
-			case ETrue:
-				__CFLOG_VAR((KShimScprTag, KShimScprClientTag, _L8("CSubConnectionLinkShimClient %08x:\tid %d - %d bytes remaining to be sent before client completion (absolute mode)."), 
-									 this, iSubConnectionShim.Id(), (iDownlinkDataNotificationVolume - iDownlinkDataVolume)));
-
-				if (iDownlinkDataVolume >= iDownlinkDataNotificationVolume)
-					{
-					completeMessage = ETrue;
-					}
-				break;
-
-			case EFalse:	// in relative mode
-				iRemainingDownlinkGranularity -= aCurrentGranularity;
-		
-				__CFLOG_VAR((KShimScprTag, KShimScprClientTag, _L8("CSubConnectionLinkShimClient %08x:\tid %d - %d bytes remaining to be sent before client completion (relative mode)."), 
-									 this, iSubConnectionShim.Id(), iRemainingDownlinkGranularity));
-
-				if(iRemainingDownlinkGranularity <= 0)
-					{
-					completeMessage = ETrue;
-					}
-				break;
-
-			default:
-				break;
-			}
-		}
-
-	if(completeMessage)
-		{
-		__CFLOG_VAR((KShimScprTag, KShimScprClientTag, _L8("CSubConnectionLinkShimClient %08x:\tid %d - completing client request."), 
-					 this, &iSubConnectionShim));
-		TPckg<TUint> iDownlinkDataVolumePckg(iDownlinkDataVolume);
-		TInt ret= iOutstandingDataReceivedNotificationMessage.Write(2, iDownlinkDataVolumePckg);
-		iOutstandingDataReceivedNotificationMessage.Complete(ret);
-		iOutstandingDataReceivedNotification= EFalse;
-		}
-	return KErrNone;
-	}
-
-TInt CSubConnectionLinkShimClient::NotifyDataTransferred(const TUint aUplinkVolume, const TUint aDownlinkVolume)
-/**
-Upcall from CConnection, indicating that it has performed a DataTransferred request and notifying us of the results
-
-@param aUplinkVolume The total amount of data sent so far on this subconnection
-@param aDownlinkVolume The total amount of data received so far on this subconnection
-*/
-	{
-	// Update internal data counters, complete any outstanding RMessages if appropriate
-	// No granularities because we don't know what they are, and because we're taking the 
-	// opportunity of using the client's call to update our counters, ie. it's not an 
-	// actual notification
-	NotifyDataSent(aUplinkVolume, 0);
-	NotifyDataReceived(aDownlinkVolume, 0);
-	return KErrNone;
-	}
-
-void CSubConnectionLinkShimClient::CheckSubConnectionActivity()
-/**
-Check for activity on the subconnection since the last call (to IsSubConnectionActiveRequest() )
-
-*/
-	{
-	__CFLOG_VAR((KShimScprTag, KShimScprClientTag, _L8("CSubConnectionLinkShimClient %08x:\tCheckSubConnectionActivity() id %d"), 
-						 this, iSubConnectionShim.Id()));
-
-	ASSERT(iOutstandingSubConnectionActivity);
-
-	TUint newUplinkDataVolume;
-	TUint newDownlinkDataVolume;
-	
-	iSubConnectionShim.DataTransferShim()->DataTransferred(newUplinkDataVolume, newDownlinkDataVolume);
-
-	TBool dataTransferred = (newUplinkDataVolume!=iPreviousUplinkDataVolume) || 
-		                    (newDownlinkDataVolume!=iPreviousDownlinkDataVolume);
-
-	// If the data transferred volumes haven't change but the client thinks the connection is active...
-	if(iClientBelievesSubConnectionActive)
-		{
-		__CFLOG_VAR((KShimScprTag, KShimScprClientTag, _L8("CSubConnectionLinkShimClient %08x:\tid %d - client believes subconnection active"), 
-							 this, iSubConnectionShim.Id()));
-
-		if(dataTransferred)	// ...and it is, so just start another timer cycle
-			{
-			__CFLOG_VAR((KShimScprTag, KShimScprClientTag, _L8("CSubConnectionLinkShimClient %08x:\tid %d - ...and it is.  Restart timer for another cycle."), 
-								 this, iSubConnectionShim.Id()));
-
-			iPreviousUplinkDataVolume = newUplinkDataVolume;
-			iPreviousDownlinkDataVolume = newDownlinkDataVolume;
-			iActivityTimer->After(iRequestedClientTimerPeriod);
-			}
-		else				// ...tell them it's not
-			{
-			__CFLOG_VAR((KShimScprTag, KShimScprClientTag, _L8("CSubConnectionLinkShimClient %08x:\tid %d - ...and it isn't.  Notify client."), 
-								 this, iSubConnectionShim.Id()));
-
-			TPckg<TBool> subConnectionActiveBuf(dataTransferred);
-			TInt ret= iOutstandingSubConnectionActivityMessage.Write(2, subConnectionActiveBuf);
-			iOutstandingSubConnectionActivityMessage.Complete(ret);
-			iOutstandingSubConnectionActivity = EFalse;
-			}
-		}
-	else					// client believes subconnection is idle...
-		{
-		__CFLOG_VAR((KShimScprTag, KShimScprClientTag, _L8("CSubConnectionLinkShimClient %08x:\tid %d - client believes subconnection idle..."), 
-							 this, iSubConnectionShim.Id()));
-
-		if(dataTransferred)
-			{
-			__CFLOG_VAR((KShimScprTag, KShimScprClientTag, _L8("CSubConnectionLinkShimClient %08x:\tid %d - ...and it isn't.  Notify client."), 
-								 this, iSubConnectionShim.Id()));
-
-			TPckg<TBool> subConnectionActiveBuf(dataTransferred);
-			TInt ret= iOutstandingSubConnectionActivityMessage.Write(2, subConnectionActiveBuf);
-			iOutstandingSubConnectionActivityMessage.Complete(ret);
-			iOutstandingSubConnectionActivity = EFalse;
-			}
-		else				// ...and it is, so just start another timer cycle
-			{
-			__CFLOG_VAR((KShimScprTag, KShimScprClientTag, _L8("CSubConnectionLinkShimClient %08x:\tid %d - ...and it is.  Restart timer for another cycle."), 
-								 this, iSubConnectionShim.Id()));
-
-			iPreviousUplinkDataVolume = newUplinkDataVolume;
-			iPreviousDownlinkDataVolume = newDownlinkDataVolume;
-			iActivityTimer->After(iRequestedClientTimerPeriod);
-			}
-		}
-	}
-
-CSubConnectionLinkShimClient::CActivityTimer* CSubConnectionLinkShimClient::CActivityTimer::NewL(CSubConnectionLinkShimClient* aOwner, TInt aPriority)
-/**
-Construct a new CActivityTimer()
-
-@param aOwner The owning CSubConnectionLinkShimClient (on which we call methods upon timer completion)
-@param aPriority The priority of the active object underlying this timer object
-@return A pointer to the newly constructed CActivityTimer object
-*/
-	{
-	CSubConnectionLinkShimClient::CActivityTimer* newActivityTimer = 
-		new(ELeave) CSubConnectionLinkShimClient::CActivityTimer(aOwner, aPriority);
-
-	CleanupStack::PushL(newActivityTimer);
-	newActivityTimer->ConstructL();
-	CleanupStack::Pop(newActivityTimer);
-	return newActivityTimer;
-	}
-
-void CSubConnectionLinkShimClient::CActivityTimer::RunL()
-/**
-Call the owning object's check activity method
-
-*/
-	{ 
-	iOwner->CheckSubConnectionActivity(); 
-	}