datacommsserver/esockserver/test/providers/dummy/inc/dummypr_network_flow.h
changeset 0 dfb7c4ff071f
child 18 9644881fedd0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/datacommsserver/esockserver/test/providers/dummy/inc/dummypr_network_flow.h	Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,194 @@
+// Copyright (c) 2008-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:
+// Dummy network flow
+// 
+//
+
+/**
+ @file
+ @internalComponent
+*/
+
+#if !defined(__DUMMYPR_NETWORK_FLOW_H__)
+#define __DUMMYPR_NETWORK_FLOW_H__
+
+#include "dummypr_factory.h"
+#include <comms-infras/ss_protflow.h>
+#include <comms-infras/ss_subconnflow.h>
+#include <comms-infras/es_sap.h>
+#include <comms-infras/nifif.h>
+
+#include <comms-infras/ss_nodemessages_dataclient.h>
+#include <comms-infras/ss_nodemessages_flow.h>
+
+namespace ESock
+{
+
+_LIT(KDummyProtocolName, "dummy");
+_LIT(KDumberProtocolName, "dumber");
+
+class CDummyNetworkFlow : public CSubConnectionFlowBase,
+	public MSessionData,
+	public MSessionControl,
+	public MFlowBinderControl,
+	public MSessionControlNotify,
+	public MSessionDataNotify
+/**
+@internalComponent
+@released since v9.6
+ */
+	{
+    friend class CSocket;
+public:
+    typedef CDummyNetworkFlowFactory FactoryType; //for factoryobject_cast to work
+
+	static CDummyNetworkFlow* NewL(CSubConnectionFlowFactoryBase& aFactory, const Messages::TNodeId& aSubConn, CProtocolIntfBase* aProtocolIntf);
+	void SetSSP(CServProviderBase& aSSP);
+
+	inline CServProviderBase* Provider();
+
+protected:
+	// Lifetime
+	CDummyNetworkFlow(CSubConnectionFlowFactoryBase& aFactory, const Messages::TNodeId& aSubConn, CProtocolIntfBase* aProtocolIntf);
+	virtual ~CDummyNetworkFlow();
+	void SetSockType(TUint aSockType);
+	TInt LockToConnectionInfo();
+
+	// MSessionData
+	virtual TUint Write(const TDesC8& aDesc,TUint aOptions, TSockAddr* anAddr);
+	virtual TInt Write(RMBufChain& aData, TUint aOptions, TSockAddr* anAddr);
+	virtual void GetData(TDes8& aDesc, TUint aOptions, TSockAddr* anAddr);
+	virtual TInt GetData(RMBufChain& aData, TUint aLength, TUint aOptions, TSockAddr* anAddr);
+
+	// MSessionControl
+	virtual void Start();
+	virtual void LocalName(TSockAddr& anAddr) const;
+	virtual void SetLocalName(TSockAddr& anAddr);
+	virtual void RemName(TSockAddr& anAddr) const;
+	virtual TInt SetRemName(TSockAddr& anAddr);
+	virtual TInt GetOption(TUint aLevel,TUint aName,TDes8& anOption) const;
+	virtual void Ioctl(TUint aLevel,TUint aName,TDes8* anOption);
+	virtual void CancelIoctl(TUint aLevel,TUint aName);
+	virtual TInt SetOption(TUint aLevel, TUint aName,const TDesC8 &anOption);
+	virtual void ActiveOpen();
+	virtual void ActiveOpen(const TDesC8& aConnectionData);
+	virtual TInt PassiveOpen(TUint aQueueSize);
+	virtual TInt PassiveOpen(TUint aQueueSize,const TDesC8& aConnectionData);
+	virtual void Shutdown(MSessionControl::TCloseType aOption);
+	virtual void Shutdown(MSessionControl::TCloseType aOption, const TDesC8& aDisconnectionData);
+	virtual void AutoBind();
+	virtual TInt SecurityCheck(MProvdSecurityChecker* aSecurityChecker);
+
+    // MFlowBinderControl
+    //session binders for CSocket
+    virtual MSessionControl* GetControlL(TInt aSessionType,MSessionControlNotify& aSessionControlNotify);
+    virtual MSessionData* BindL(MSessionDataNotify& aNotify);
+    virtual void Unbind();
+    virtual CSubConnectionFlowBase& CloneFlowL();
+	virtual CSubConnectionFlowBase* Flow();
+
+private:
+	// MSessionControlNotify
+    void ConnectComplete();
+	void ConnectComplete(const TDesC8& aConnectData);
+    void ConnectComplete(CSubConnectionFlowBase& anSSP);
+	void ConnectComplete(CSubConnectionFlowBase& anSSP,const TDesC8& aConnectData);
+	void CanClose(MSessionControlNotify::TDelete aDelete=MSessionControlNotify::EDelete);
+    void CanClose(const TDesC8& aDisconnectData,MSessionControlNotify::TDelete aDelete=MSessionControlNotify::EDelete);
+	TInt Error(TInt anError,TUint anOperationMask);
+	void Disconnect( );
+	void Disconnect(TDesC8& aDisconnectData);
+	void IoctlComplete(TDesC8* aBuf);
+	void DisconnectFromListener(CSubConnectionFlowBase& aSSP);
+	void SetLocalNameComplete();
+
+
+	// MSessionDataNotify
+	void NewData(TUint aCount);
+	void CanSend();
+
+protected:
+	// CSubConnectionFlowBase
+	virtual MFlowBinderControl* DoGetBinderControlL();
+
+	// Messages::ANode
+	virtual void ReceivedL(
+		const Messages::TRuntimeCtxId& aSender,
+		const Messages::TNodeId& aRecipient,
+		Messages::TSignatureBase& aMessage
+		);
+
+    // Local methods
+    void SubConnectionError(
+		const Messages::TEBase::TError& errorMsg,
+		TUint anOperationMask = (MSocketNotify::EErrorSend | MSocketNotify::EErrorConnect));
+	void BindToL(TCFDataClient::TBindTo& aBindTo);
+	void Rejoin(const TCFFlow::TRejoin& aRejoinMessage);
+	void StartFlow();
+	void StopFlow(TCFDataClient::TStop& aMessage);
+	void ProcessDCIdleState();
+	void CompleteStart(TInt aError);
+	void Destroy();
+	void PostNoBearer();
+
+	// Inline methods
+	TBool NoBearerGuard() const { return iNoBearerRunning; }
+	void SetNoBearerGuard() { iNoBearerRunning = ETrue; }
+	void ClearNoBearerGuard() { iNoBearerRunning = EFalse; }
+	void ClearUseBearerErrors() { iUseBearerErrors = EFalse; }
+	TBool IsStopped() { return iIsStopped; }
+	TBool IsHostResolver() const { return EFalse; }
+	void SetIfInfo(const TSoIfConnectionInfo& aInfo) { iIfInfo = aInfo; }
+    TBool IsBoundToSession() const {return  iSessionControlNotify || iSessionDataNotify; }
+	TBool ActivityRunning()	{return NoBearerGuard();}
+
+
+private:
+	// Flow binders
+	MFlowBinderControl* iLowerFlow;
+	MLowerControl* iLowerControl; //just to keep the lower flow up
+
+	// Lower session binding
+	MSessionControl* iFlowShim;
+	MSessionData* iFlowShimData;
+
+	// Upper session binding
+	MSessionControlNotify* iSessionControlNotify;
+	MSessionDataNotify* iSessionDataNotify;
+
+	Messages::RRequestOriginator iStartRequest;
+
+	// Local properties
+	TSoIfConnectionInfo iIfInfo;
+	TUint iUseBearerErrors:1;		// error the socket on Error() upcalls from bearer rather than StopFlow() calls from SCPR
+	TUint iIsStopped:1;				// DataClientStop has been received.
+	TUint iIsStarting:1;
+	TBool iNoBearerRunning:1;		// NoBearer message has been issued to SCPR
+	TUint iStartActivityId:16;		// If iIsStarting is set, iStartActivityId contains activity id that opened the TCFDataClient::TStarted channel
+	TBool iIsStarted:1;
+
+	enum TDCIdleState
+		{
+		EClientsPresent = 0, // presumption is we're always created for a client (ie HR or socket)
+		EIdle = 1,
+		EIdleSent = 2
+		};
+	TDCIdleState iDCIdle:2;
+	};
+
+}
+
+
+#endif	// __DUMMYPR_NETWORK_FLOW_H__
+