bluetooth/btcomm/src/btcomm.h
changeset 0 29b1cd4cb562
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/btcomm/src/btcomm.h	Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,275 @@
+// Copyright (c) 1997-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:
+//
+
+#ifndef BTCOMM_H__
+#define BTCOMM_H__
+
+#include <es_sock.h>
+#include <cs_port.h>
+
+#include <bt_sock.h>
+#include <btmanclient.h>
+#include <btdefcommport.h>
+
+
+static const TInt KBTCOMMRecvBufferLength=1024;
+static const TInt KBTCOMMSendBufferLength=1024;
+static const TInt KBTCOMMCircularBufferLength=4096;
+static const TInt KBTCOMMCircularBufferHighWatermark=3072;
+static const TInt KBTCOMMCircularBufferLowWatermark=2048;
+
+const TUint KCommLowUnit=0;
+const TInt KBtcommShutdownTimer=6000000; //2 secs
+
+
+
+//  CONCRETE FACTORY CLASSES FOR BTMODEM CSY
+
+#define SERIAL_DESCRIPTION _L("BT RFComm Serial Emulation")
+#define SERIAL_NAME _S("BTCOMM")
+
+// Concrete factory makes the CPort which does the work
+// This uses the "highlander pattern".  ie there can only
+// be one factory. Note that the one factory instance 
+// can make many CPort instances however.
+class CBTPortStateFactory;
+NONSHARABLE_CLASS(CBTPortFactory) : public CSerial
+	{
+public:
+	~CBTPortFactory();
+	static CBTPortFactory* NewL();
+	virtual CPort* NewPortL(const TUint aUnit);
+	virtual void Info(TSerialInfo& aSerialInfo);
+	inline CBTPortStateFactory* GetPortStateFactory() {return iPortStateFactory;};
+protected:
+	//From CSerial
+    virtual TSecurityPolicy PortPlatSecCapability(TUint aPort) const;
+private:
+	void ConstructL();
+	CBTPortFactory();
+private:
+	CBTPortStateFactory* iPortStateFactory;
+	};
+
+
+class CBTPortProxy;
+class CBTPortLocker;
+class CBTPortReader;
+class CBTPortWriter;
+NONSHARABLE_CLASS(CBTPort) : public CPort
+/**
+	Concrete implementation of the BTComm CSY.
+	This is in effect the server of the RComm client requests.
+*/
+	{
+	friend class CBTPortProxy;
+public:
+	static CBTPort* NewL(TUint aUint,CBTPortStateFactory* aFactory);
+public:
+	virtual void StartRead(const TAny* aClientBuffer,TInt aLength);
+	virtual void ReadCancel();
+	virtual TInt QueryReceiveBuffer(TInt& aLength) const;
+	virtual void ResetBuffers(TUint aFlags);
+	virtual void StartWrite(const TAny* aClientBuffer,TInt aLength);
+	virtual void WriteCancel();
+	virtual void Break(TInt aTime);
+	virtual void BreakCancel();
+	virtual TInt GetConfig(TDes8& aPackage) const;
+	virtual TInt SetConfig(const TDesC8& aPackage);
+	virtual TInt SetServerConfig(const TDesC8& aPackage);
+	virtual TInt GetServerConfig(TDes8& aPackage);
+	virtual TInt GetCaps(TDes8& aPackage);
+	virtual TInt GetSignals(TUint& aSignals);
+	virtual TInt SetSignalsToMark(TUint aSignals);
+	virtual TInt SetSignalsToSpace(TUint aSignals);
+	virtual TInt GetReceiveBufferLength(TInt& aLength) const;
+	virtual TInt SetReceiveBufferLength(TInt aLength);
+    virtual ~CBTPort();
+	virtual void Destruct();
+	virtual void FreeMemory();
+	// extra functions introduced by v6 c32
+	virtual void NotifySignalChange(TUint aSignalMask);
+	virtual void NotifySignalChangeCancel();
+	virtual void NotifyConfigChange();
+	virtual void NotifyConfigChangeCancel();
+	virtual void NotifyFlowControlChange();
+	virtual void NotifyFlowControlChangeCancel();
+	virtual void NotifyBreak();
+	virtual void NotifyBreakCancel();
+	virtual void NotifyDataAvailable();
+	virtual void NotifyDataAvailableCancel();
+	virtual void NotifyOutputEmpty();
+	virtual void NotifyOutputEmptyCancel();
+	virtual TInt GetFlowControlStatus(TFlowControl& aFlowControl);
+	virtual TInt GetRole(TCommRole& aRole);
+	virtual TInt SetRole(TCommRole aRole);
+	//
+private:
+    CBTPort();
+	void ConstructL(TUint aUnit,CBTPortStateFactory *aFactory);
+	void DestructNow(); //called by CBTPortproxy to signal shutdown
+private:
+	TCommRole			iRole;
+	TCommConfigV01		iConfig;
+	TCommCapsV02		iCaps;
+	CBTPortProxy		*iPortProxy;
+	};
+
+NONSHARABLE_CLASS(TReadTerminator)
+	{
+public:
+	TInt	iTerminatorCount; //Number of terminator characters
+	TText8	iTerminatorChars[KConfigMaxTerminators];
+	TInt    iNextCharToFindIdx; // index in the array of the next char in the sequence
+								// to search for
+	};
+
+class CBTTimerSimple;
+class CBTPortBuffer;
+class TBTPortState;
+class CSockServConnector;
+NONSHARABLE_CLASS(CBTPortProxy) : public CActive
+// Context class in state pattern.
+// Friendship is extended to this class so that it 
+// can see the CPort instance private data.
+	{
+	friend class CBTPort;
+	friend class CBTPortLocker;
+	friend class CBTPortWriter;
+	friend class CBTPortReader;
+	friend class CBTTimerSimple;
+	friend class TBTPortDefaultState;
+	friend class TBTPortCommonBaseState;
+	friend class TBTPortStateIdle;
+	friend class TBTPortStateLoadingProtocol;
+	friend class TBTPortStateDiscovering;
+	friend class TBTPortStateSDPConnected;
+	friend class TBTPortStateSDPServiceQuery;
+	friend class TBTPortStateSDPAttributeListRetrieved;
+	friend class TBTPortStateConnectionSecuritySetup;
+	friend class TBTPortStateConnecting;
+	friend class TBTPortStateOpen;
+	friend class TBTPortStateClosing;
+	friend class TBTPortErrorState;
+	friend class TBTPortStateServiceIDListRetrieved;
+public:
+	static CBTPortProxy* NewL(TUint32 aPortNo, CBTPort *aParent,CBTPortStateFactory *aFactory);
+	~CBTPortProxy();
+	inline void SetState(TBTPortState& aState){ iState=&aState;};
+	void MoveToErrorState();
+	// from CActive
+	virtual void RunL();
+	virtual void DoCancel();
+	// interface of proxy
+	void Read(const TAny* aClientBuffer,TInt aLength);
+	void ReadCancel();
+	void Write(const TAny* aClientBuffer,TInt aLength);
+	void WriteCancel();
+	TInt QueryReceiveBuffer(TInt &aLength);
+	TInt GetReceiveBufferLength(TInt &aLength);
+	void ResetRxBuffer();
+	void Close();
+private:
+	CBTPortProxy(TUint32 aPortNo);
+	void InitL(CBTPort *aParent,CBTPortStateFactory *aFactory);
+	void DestructContext();
+	// context locker AO
+	void StartLocker();
+	void DoLockedAction();
+	TBool IsLockerOn();
+	void StopLocker();
+	// context writer AO
+	void StartWriter();
+	void DoWriteCompleted(TInt aError);
+	void StopWriter();
+	// context reader AO
+	void StartReader();
+	void DoReadCompleted(TInt aError);
+	void StopReader();
+	// To be called by the active friendly states
+	void DoWriteCancel();
+	// void DoReadCancel(); not needed since read cancels are not propagated to the underlying socket
+	void StartShutdownTimerL();
+	void CancelShutDownTimer();
+	void ShutdownAlarm();
+	// To be called by the Open state only
+	// void SetReadCancelPending(); not needed since read cancels are not propagated to the underlying socket
+	void SetWriteCancelPending();
+	TBool IsWriteCancelPending();
+	// TBool IsReadCancelPending(); not needed since read cancels are not propagated to the underlying socket
+	TBool ReadInBufferLowWatermarkReached();
+	TBool ReadInBufferHighWatermarkReached();
+	// To be called by Closing and SDP Discovering states only
+	TBool IsNetDbInUse();
+	void SetNetDbInUse();
+	void SetNetDbNotInUse();
+private:
+	TInt					iLastError;
+	TBTPortState*			iState;
+	CBTPort*				iPort;
+	TUint32					iPortNo;
+	CBTPortStateFactory*	iPortStateFactory;
+    CBTPortLocker*			iPortLocker;
+	CBTPortReader*			iPortReader;
+	CBTPortWriter*			iPortWriter;
+	CSockServConnector*		iSockServConnector;
+	RSocketServ				iSockServ;
+	RSocket					iSocket;
+	CBTPortBuffer*			iCircularReadBuf;
+	HBufC8*					iSendBuf;
+	TPtr8					iSendBufPtr;
+	HBufC8*					iReadBuf;
+	TPtr8					iReadBufPtr;
+
+							// temp FIX
+	HBufC8*					iReadOutBuf; // to be used for reading from the circular buf to the client
+	
+	TBool					iMoreSendsToCome;
+	TAny*					iClientWritePtr;
+	TInt					iClientWriteLength;
+	TInt					iClientLengthWrittenSoFar;
+	TAny*					iClientReadPtr;
+	TInt					iClientReadLength;
+	TInt					iClientRemainderToRead;
+	TInt					iClientWriteOffset;
+	TBool					iClientReadOneOrMore;
+	RNetDatabase			iNetDatabase;
+	TNameEntry				iLog;
+	TUint					iRemoteDevAddr;
+	TBool					iTerminatedReads;
+	TReadTerminator			iTerm;
+	TInt					iReadTerminatorOffset;
+
+	// TBool					iReadCancelationPending; not needed because the read cancel is not propagated to the underlying socket
+	TBool					iWriteCancelationPending;
+	TRfcommSockAddr			iAddr;
+	TBuf8<512>				iSDPResult;
+	TBuf8<512>				iSDPServRecordHandle;
+	TBuf8<255>				iSDPRequest;
+	TUint8					iRemoteRfcommPortNumber;
+	TBTDevAddr				iBdaddr;
+	TBool					iNetDbInUse;
+
+	RBTRegServ				iRegServ;
+	RBTCommPortSettings		iPortSettings;
+	TBTCommPortSettings   	iDefaultService;
+	CBTTimerSimple*			iShutdownTimer;
+
+#ifdef _DEBUG
+	TInt					iReadsPending; //for debugging calls to the reader
+#endif
+};
+
+#endif