networkcontrol/ipcprshim/inc/shimnifmansconn.h
branchRCL_3
changeset 57 abbed5a4b42a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/networkcontrol/ipcprshim/inc/shimnifmansconn.h	Tue Aug 31 16:45:15 2010 +0300
@@ -0,0 +1,219 @@
+// 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:
+//
+
+/**
+ @file
+ @internalComponent
+*/
+
+
+#if !defined(__SHIMNIFMANSCONN_H__)
+#define __SHIMNIFMANSCONN_H__
+
+#include <comms-infras/ss_log.h>
+#include "shimdatatransfer.h"
+#include "shimclient.h"
+#include "shimcpr.h" //access to the CConnectionProviderShim::Provider() fn
+
+//const TInt KSubConnectionProviderShimImplementationUid = 0x10207106;
+
+#define KShimScprTag KESockSubConnectionTag
+_LIT8(KShimScprSubTag, "shimscpr");
+_LIT8(KShimScprDataTag, "shimscprData");
+_LIT8(KShimScprClientTag, "shimscprClient");
+
+//Former CInterface CSubConnection related up-calls so that CConnectionProviderShim
+//doesn't have to link against the sub-connection shim
+class CConnection;
+class MSubInterfaceShim : public MConnDataTransferNotify
+	{
+public:
+	virtual TInt ProgressNotification(TInt aStage, TInt aError, const TDesC8& aInfo) = 0;
+	virtual TSubConnectionUniqueId Id() = 0;
+	virtual void SetSubConnectionUniqueId( TSubConnectionUniqueId aSubConnectionUniqueId ) = 0;
+	virtual void ConnectionJoiningL(const CConnection& aConnection) = 0;
+	virtual void ConnectionLeaving(const CConnection& aConnection) = 0;
+	};
+
+//class CSubConnectionProviderFactoryShim;
+class CSubConnectionLinkShimClient;
+
+NONSHARABLE_CLASS(CNifManSubConnectionShim) : public CBase, public MConnectionDataClient, public MSubInterfaceShim
+/**
+ @internalComponent
+ */
+	{
+
+public:
+	CNifManSubConnectionShim(CConnectionProviderShim& aProviderShim);
+	~CNifManSubConnectionShim();
+
+	// MSubInterfaceShim impl
+	virtual TInt ProgressNotification(TInt aStage, TInt aError, const TDesC8& aInfo);
+	virtual TInt NotifyDataTransferred(TUint aUplinkVolume, TUint aDownlinkVolume);
+	virtual TInt NotifyDataSent(TUint aUplinkVolume, TUint aCurrentGranularity);
+	virtual TInt NotifyDataReceived(TUint aDownlinkVolume, TUint aCurrentGranularity);
+	virtual TSubConnectionUniqueId Id();
+	virtual void SetSubConnectionUniqueId( TSubConnectionUniqueId aSubConnectionUniqueId );
+	virtual void ConnectionJoiningL(const CConnection& aConnection);
+	virtual void ConnectionLeaving(const CConnection& aConnection);
+
+	CConnectionProvdBase& Provider()
+		{
+		return static_cast<CConnectionProviderShim*>(iConnectionProvider)->Provider();
+		}
+	CConnDataTransferShim* DataTransferShim()
+		{
+		return iConnDataTransferShim;
+		}
+	CSubConnectionLinkShimClient* ShimClient( TInt aIndex )
+		{
+		return aIndex < iShimClients.Count() ? iShimClients[aIndex] : NULL;
+		}
+	void DeleteAsync();	
+protected:
+	//MConnectionDataClient
+	virtual void ConnectionGoingDown(CConnectionProviderBase& aConnProvider);
+	virtual void ConnectionError(TInt aStage, TInt aError);
+	virtual void Notify(TNotify aNotifyType,  CConnectionProviderBase* aConnProvider, TInt aError, const CConNotificationEvent* aConNotificationEvent);
+      virtual void AttachToNext(CSubConnectionProviderBase* aSubConnProvider);
+
+
+	TInt FindClient(const CConnection& aConnection);
+      CConnDataTransfer& CreateDataTransferL();
+
+protected:
+	RPointerArray<CSubConnectionLinkShimClient> iShimClients;
+	TSubConnectionUniqueId iSubConnectionsUniqueId;
+	CConnDataTransferShim* iConnDataTransferShim;
+	CConnectionProviderBase* iConnectionProvider;
+	CAsyncCallBack iAsyncDestructor;
+private:
+	static TInt AsyncDestructorCb(TAny* aInstance);
+	};
+
+NONSHARABLE_CLASS(CSubConnectionLinkShimClient) : public CBase, public MConnDataTransferNotify, public MShimControlClient
+/**
+ Handle subconnection-related asynchronous client requests that may not complete immediately, it effectively
+ represents the old CSubConnection
+ @internalComponent
+ */
+	{
+public:
+	CSubConnectionLinkShimClient(const CConnection& aConnection, CNifManSubConnectionShim& aSubConnectionShim);
+	~CSubConnectionLinkShimClient();
+
+	//MConnDataTransferNotify interface towards CConnDataTransfer
+	virtual TInt NotifyDataTransferred(const TUint aUplinkVolume, const TUint aDownlinkVolume);
+	virtual TInt NotifyDataSent(TUint aUplinkVolume, TUint aCurrentGranularity);
+	virtual TInt NotifyDataReceived(TUint aDownlinkVolume, TUint aCurrentGranularity);
+	
+	void ProgressNotification(TInt aStage, TInt aError, const TDesC8& aInfo);
+
+	//MShimControlClient interface towards ESOCK
+	//former CConnection::StopSubConnectionL(const RMessage2& aMessage);
+	virtual TBool StopL(const RMessage2& aMessage);
+	// Former calls from CConnection::GetSubConnectionInfo
+	virtual TInt GetSubConnectionInfo(const RMessage2& aMessage);
+	//	Former Calls from RConnection via CSubConnection
+	virtual TInt GetCurrentProgress(TNifProgress& aProgress);
+	virtual TBool DataTransferredL(const RMessage2& aMessage);
+	virtual TBool DataTransferredCancel(const RMessage2& aMessage);
+	virtual TBool RequestSubConnectionProgressNotificationL(const RMessage2& aMessage);
+	virtual TBool CancelSubConnectionProgressNotification(const RMessage2& aMessage);
+	virtual TBool DataSentNotificationRequestL(const RMessage2& aMessage);
+	virtual TBool DataSentNotificationCancel(const RMessage2& aMessage);
+	virtual TBool DataReceivedNotificationRequestL(const RMessage2& aMessage);
+	virtual TBool DataReceivedNotificationCancel(const RMessage2& aMessage);
+	virtual TBool IsSubConnectionActiveRequestL(const RMessage2& aMessage);
+	virtual TBool IsSubConnectionActiveCancel(const RMessage2& aMessage);
+	TBool Match(const CConnection& aConnection) const;
+	TSubConnectionUniqueId Id();
+	virtual TInt ReturnCode() const;
+
+	void SetReturnCode(TInt aErr)
+		{
+		iReturnCode = aErr;
+		}
+
+	/**
+	Callback from activity timer
+	*/
+	void CheckSubConnectionActivity();
+
+	NONSHARABLE_CLASS(CActivityTimer) : public CTimer
+	/**
+	@internalComponent
+	*/
+		{
+	public:
+		static CActivityTimer* NewL(CSubConnectionLinkShimClient* aOwner, TInt aPriority);
+		virtual inline ~CActivityTimer() {};
+		void RunL();
+	private:
+		inline CActivityTimer(CSubConnectionLinkShimClient* aOwner, TInt aPriority);
+	private:
+		CSubConnectionLinkShimClient* iOwner;
+		};
+
+
+private:
+	const CConnection& iConnection;
+	CNifManSubConnectionShim& iSubConnectionShim;
+	
+	TUint iUplinkDataVolume;
+	TUint iDownlinkDataVolume;
+	TUint iUplinkDataNotificationVolume;
+	TUint iDownlinkDataNotificationVolume;
+	TInt iRemainingUplinkGranularity;
+	TInt iRemainingDownlinkGranularity;
+
+	TBool iDataSentNotificationsInAbsoluteMode;
+	TBool iDataReceivedNotificationsInAbsoluteMode;
+
+	TNifProgress iCurrentProgress;
+	TInt iLastProgressToClient;
+	TInt iClientRequestedProgress;
+	CActivityTimer* iActivityTimer;
+	TInt iRequestedClientTimerPeriod;
+	TBool iClientBelievesSubConnectionActive;
+	TUint iPreviousUplinkDataVolume;
+	TUint iPreviousDownlinkDataVolume;
+
+	TBool iOutstandingProgressNotification:1;
+	TBool iOutstandingDataSentNotification:1;
+	TBool iOutstandingDataReceivedNotification:1;
+	TBool iOutstandingSubConnectionActivity:1;
+
+	RMessage2 iOutstandingProgressNotificationMessage;
+	RMessage2 iOutstandingDataSentNotificationMessage;
+	RMessage2 iOutstandingDataReceivedNotificationMessage;
+	RMessage2 iOutstandingSubConnectionActivityMessage;
+	
+	TInt iReturnCode;
+	};
+
+inline CSubConnectionLinkShimClient::CActivityTimer::CActivityTimer(CSubConnectionLinkShimClient* aOwner, TInt aPriority) 
+: CTimer(aPriority), iOwner(aOwner)
+/**
+Set up the activity timer for subconnection activity
+
+@param aOwner, The owing subconnection
+@param aPriority, The priority of the active object
+*/
+	{ CActiveScheduler::Add(this); };
+	
+#endif
+// __SHIMNIFMANSCONN_H__