networkingtestandutils/networkingperformancemeasurementtools/delaymeterproto/inc/delaymeterflow.h
changeset 0 af10295192d8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/networkingtestandutils/networkingperformancemeasurementtools/delaymeterproto/inc/delaymeterflow.h	Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,143 @@
+// 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:
+// Protocol used by netperfte to insert timestamps on incoming packets,
+// and record delays of outgoing packets which it reports back to netperfte
+// 
+//
+
+/**
+ @file
+ @internalTechnology
+*/
+
+#ifndef TIMESTAMPFLOW_H
+#define TIMESTAMPFLOW_H
+
+#include <e32property.h>
+#include <comms-infras/ss_subconnflow.h>
+#include <comms-infras/ss_flowbinders.h>
+
+#include <elements/nm_signatures.h>
+
+class CDelayMeterBinder;
+namespace DelayMeter { class CSendRecorder; }
+namespace DelayMeter { class CReceiveTimestamper; }
+
+class CDelayMeterFlow : public ESock::CSubConnectionFlowBase, public ESock::MFlowBinderControl
+	{
+	friend class CDelayMeterProtoFactory;
+
+protected:
+	CDelayMeterFlow(ESock::CSubConnectionFlowFactoryBase& aFactory, const Messages::TNodeId& aSubConnId, ESock::CProtocolIntfBase* aProtocolIntf);
+
+public:
+	virtual ~CDelayMeterFlow();
+
+	// from CSubConnectionFlowBase:
+	virtual ESock::MFlowBinderControl* DoGetBinderControlL();
+	virtual void ReceivedL(
+		const Messages::TRuntimeCtxId& aSender,
+		const Messages::TNodeId& aRecipient,
+		Messages::TSignatureBase& aMessage
+		);
+
+	// from MFlowBinderControl:
+	virtual ESock::MLowerControl* GetControlL(const TDesC8& aProtocol);
+	virtual ESock::MLowerDataSender* BindL(const TDesC8& aProtocol, ESock::MUpperDataReceiver* aReceiver, ESock::MUpperControl* aControl);
+	virtual void Unbind( ESock::MUpperDataReceiver* aReceiver, ESock::MUpperControl* aControl);
+	virtual ESock::CSubConnectionFlowBase* Flow();
+
+	// my helper methods:
+	CDelayMeterBinder* FindOrCreateBinderL(const TDesC8& aProtocol);
+private:
+	RPointerArray<CDelayMeterBinder> iBinders;
+	};
+
+
+namespace DelayMeter {class TDelayMeterPrefs;}
+
+class CDelayMeterBinder :	public CActive,
+			public ESock::MLowerControl, // I receive control requests from above
+			public ESock::MLowerDataSender, // I receive data from above (outgoing)
+			public ESock::MUpperControl, // I receive control signals from below
+			public ESock::MUpperDataReceiver // I receive data from below (incoming)
+	{
+public:
+	// My constructor
+	static CDelayMeterBinder* NewL();
+	void ConstructL();
+protected:
+	CDelayMeterBinder();
+public:
+	virtual ~CDelayMeterBinder();
+
+	// from CActive:
+	virtual void DoCancel();
+	virtual void RunL();
+
+	// from ESock::MLowerControl:
+	virtual TInt GetName(TDes& aName);
+	virtual TInt BlockFlow(TBlockOption aOption);
+	virtual TInt GetConfig(TBinderConfig& aConfig);
+	virtual TInt Control(TUint aLevel, TUint aName, TDes8& aOption);
+	// .. uses my leaving method:
+	void ControlL(TUint aName, TDes8& aOption, DelayMeter::TDelayMeterPrefs& prefs);
+
+	// handlers for the possible control calls:
+	void StartSendRecorderL(TDes8& aOption, DelayMeter::TDelayMeterPrefs& prefs);
+	void GetSendRecorderResultsL(TDes8& aOption, DelayMeter::TDelayMeterPrefs& prefs);
+	void StartReceiveTimestamperL(TDes8& aOption, DelayMeter::TDelayMeterPrefs& prefs);
+	void GetReceiveTimestamperResultsL(TDes8& aOption, DelayMeter::TDelayMeterPrefs& prefs);
+
+
+	// from ESock::MLowerDataSender:
+	virtual ESock::MLowerDataSender::TSendResult Send(RMBufChain& aData);
+
+	// from ESock::MUpperControl:
+	virtual void StartSending();
+	virtual void Error(TInt anError);
+
+	// from ESock::MUpperDataReceiver:
+	virtual void Process(RMBufChain& aData);
+
+
+	// my own methods
+	TBool InUse() const {return iLowerControl || iLowerDataSender ; }
+	void BindToUpperL(ESock::MUpperDataReceiver& aUpperDataReceiver, ESock::MUpperControl& aUpperControl);
+	TBool UnbindFromUpper(ESock::MUpperDataReceiver& aUpperDataReceiver, ESock::MUpperControl& aUpperControl);
+	void BindToLowerFlowL(ESock::MFlowBinderControl& aLowerControl);
+	const TDesC8& ProtocolName() const;
+
+	DelayMeter::CSendRecorder* FindSendRecorder(TInt aProtocol, TInt aPortNumber, TBool aRemoveFoundEntry=EFalse);
+	DelayMeter::CReceiveTimestamper* FindReceiveTimestamper(TInt aProtocol, TInt aPortNumber, TBool aRemoveFoundEntry=EFalse);
+
+	// very bespoke method to perform mild validation and extract some info, common between send & receive
+	TBool ExtractIPv4ProtocolAndPort(RMBufChain& aData, /*returns*/RMBufChain& aPayload, TInt& aProtocol, TInt& aPort, TInt& aLength);
+
+	private:
+	ESock::MLowerControl* iLowerControl; 		// .. so I can send controls down
+	ESock::MLowerDataSender* iLowerDataSender;		// .. so I can send data down (outgoing)
+	ESock::MUpperControl* iUpperControl;		// .. so I can send controls up (err/startsending)
+	ESock::MUpperDataReceiver* iUpperDataReceiver;	// .. so I can send data up (incoming)
+
+	RPointerArray<DelayMeter::CSendRecorder> iSendRecorders;
+	RPointerArray<DelayMeter::CReceiveTimestamper> iReceiveTimestampers;
+
+	RProperty iProperty; // for controls (til we establish the proper path. pah)
+
+	};
+
+
+
+#endif // TIMESTAMPFLOW_H