bluetooth/btcomm/src/btstate.h
changeset 0 29b1cd4cb562
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/btcomm/src/btstate.h	Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,275 @@
+// Copyright (c) 1999-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 BTSTATE_H__
+#define BTSTATE_H__
+
+#include "btcommutil.h"
+
+class TBTPortState;
+NONSHARABLE_CLASS(CBTPortStateFactory) : public CBase
+	{
+friend class CBTPortFactory;	
+// only a friend can instantiate a CBTPortStateFactory...
+public:
+	enum TCSYState
+		{
+		EIdle,
+		ELoadingProtocol,
+		EDiscovering,
+		ESDPConnected,
+		ESDPServiceQuery,
+		ESDPServiceIDListRetrieved,
+		ESDPAttribListRetrieved,
+		ESecuritySetup,
+		EConnecting,
+		EOpen,
+		EClosing,
+		EError,
+	// *** keep next one last ***
+		EMaxCSYStates,
+		};
+
+	~CBTPortStateFactory();
+	TBTPortState& GetState(const TCSYState aState);
+	TInt StateIndex(const TBTPortState* aState) const;
+private:
+	static CBTPortStateFactory *NewL();
+	CBTPortStateFactory();
+	void InitL();
+private:
+	TFixedArray<TBTPortState*, EMaxCSYStates> iStates;
+public:
+	TInt	iSDPServRecordHandleCount;
+	TInt	iExtractedHandleCount;
+	};
+
+NONSHARABLE_CLASS(TBTPortState)
+// abstract base class for CSY state objects.
+	{
+public:
+	TBTPortState(CBTPortStateFactory* aFactory);
+	virtual ~TBTPortState()=0;
+	virtual void Open(CBTPortProxy* aContext)=0;
+	virtual void Read(CBTPortProxy* aContext,TAny* aPtr,TInt aLength)=0;
+	virtual void Write(CBTPortProxy* aContext,TAny* aPtr,TInt aLength)=0;
+	virtual void Close(CBTPortProxy* aContext)=0;
+	virtual void DoRunL(CBTPortProxy* aContext)=0;
+	virtual void DoCancel(CBTPortProxy* aContext)=0;
+	virtual void WriteCancel(CBTPortProxy* aContext)=0;
+	virtual void ReadCancel(CBTPortProxy* aContext)=0;
+	virtual void DoWriteCompleted(CBTPortProxy* aContext,TInt aError)=0;
+	virtual void DoReadCompleted(CBTPortProxy* aContext,TInt aError)=0;
+	virtual void DoLockedAction(CBTPortProxy* aContext)=0;
+	virtual void Error(CBTPortProxy* aContext,TInt aError)=0;
+protected:
+	void PanicInState(TBTCommPanic aPanic) const;
+protected:
+	CBTPortStateFactory* iFactory;
+private:
+    // Forbid copying
+	TBTPortState(const TBTPortState&);
+	const TBTPortState& operator=(const TBTPortState&);
+	};
+
+NONSHARABLE_CLASS(TBTPortDefaultState) : public TBTPortState
+// contains default overrides for TBTPortState functions
+	{
+public:
+	TBTPortDefaultState(CBTPortStateFactory* aParent);
+	virtual ~TBTPortDefaultState();
+	virtual void Open(CBTPortProxy* aContext);
+	virtual void Read(CBTPortProxy* aContext,TAny* aPtr, TInt aLength);
+	virtual void Write(CBTPortProxy* aContext,TAny* aPtr, TInt aLength);
+	virtual void Close(CBTPortProxy* aContext);
+	virtual void DoRunL(CBTPortProxy* aContext);
+	virtual void DoCancel(CBTPortProxy* aContext);
+	virtual void WriteCancel(CBTPortProxy* aContext);
+	virtual void ReadCancel(CBTPortProxy* aContext);
+	virtual void DoLockedAction(CBTPortProxy* aContext);
+	virtual void DoWriteCompleted(CBTPortProxy* aContext, TInt aError);
+	virtual void DoReadCompleted(CBTPortProxy* aContext, TInt aError);
+	virtual void Error(CBTPortProxy* aContext,TInt aError);
+	virtual void LogStateError(CBTPortProxy* aContext, TInt aError)=0;
+	};
+
+
+NONSHARABLE_CLASS(TBTPortCommonBaseState) : public TBTPortDefaultState
+	{
+public:
+	TBTPortCommonBaseState(CBTPortStateFactory* aParent);
+	virtual void Read(CBTPortProxy* aContext,TAny* aPtr, TInt aLength);
+	virtual void Write(CBTPortProxy* aContext,TAny* aPtr, TInt aLength);
+	virtual void WriteCancel(CBTPortProxy* aContext);
+	virtual void ReadCancel(CBTPortProxy* aContext);
+	virtual void Close(CBTPortProxy* aContext);
+	};
+
+NONSHARABLE_CLASS(TBTPortStateIdle) : public TBTPortCommonBaseState
+	{
+public:
+	TBTPortStateIdle(CBTPortStateFactory* aParent);
+	~TBTPortStateIdle();
+	virtual void DoRunL(CBTPortProxy* aContext);
+	virtual void Open(CBTPortProxy* aContext);
+	virtual void Close(CBTPortProxy* aContext);
+	virtual void Read(CBTPortProxy* aContext,TAny* aPtr, TInt aLength);
+	virtual void Write(CBTPortProxy* aContext,TAny* aPtr, TInt aLength);
+	virtual void LogStateError(CBTPortProxy* aContext, TInt aError);
+private:
+	void SockServConnect(CBTPortProxy* aContext); // to be called by friendly class 
+												//upon re-opening while closing
+	friend class CBTPortProxy; 
+	};
+
+NONSHARABLE_CLASS(TBTPortStateLoadingProtocol) : public TBTPortCommonBaseState
+	{
+public:
+	TBTPortStateLoadingProtocol(CBTPortStateFactory* aParent);
+	~TBTPortStateLoadingProtocol();
+	virtual void DoRunL(CBTPortProxy* aContext);
+	virtual void Close(CBTPortProxy* aContext);
+	virtual void Read(CBTPortProxy* aContext,TAny* aPtr, TInt aLength);
+	virtual void Write(CBTPortProxy* aContext,TAny* aPtr, TInt aLength);
+	virtual void LogStateError(CBTPortProxy* aContext, TInt aError);
+private:
+	void StartProtocol(CBTPortProxy* aContext); 
+private:
+	TBool iClosePending;
+
+	friend class CBTPortProxy; 
+	};
+
+NONSHARABLE_CLASS(TBTPortStateDiscovering) : public TBTPortCommonBaseState
+	{
+public:
+	TBTPortStateDiscovering(CBTPortStateFactory* aParent);
+	~TBTPortStateDiscovering();
+	virtual void DoRunL(CBTPortProxy* aContext);
+	virtual void DoLockedAction(CBTPortProxy* aContext);
+	virtual void LogStateError(CBTPortProxy* aContext, TInt aError);
+	};
+
+
+NONSHARABLE_CLASS(TBTPortStateSDPConnected) : public TBTPortCommonBaseState
+	{
+public:
+	TBTPortStateSDPConnected(CBTPortStateFactory* aParent);
+	~TBTPortStateSDPConnected();
+	virtual void DoRunL(CBTPortProxy* aContext);
+	virtual void LogStateError(CBTPortProxy* aContext, TInt aError);
+	};
+
+NONSHARABLE_CLASS(TBTPortStateSDPServiceQuery) : public TBTPortCommonBaseState
+	{
+public:
+	TBTPortStateSDPServiceQuery(CBTPortStateFactory* aParent);
+	~TBTPortStateSDPServiceQuery();
+	virtual void DoRunL(CBTPortProxy* aContext);
+	virtual void LogStateError(CBTPortProxy* aContext, TInt aError);
+	};
+
+NONSHARABLE_CLASS(TBTPortStateServiceIDListRetrieved) : public TBTPortCommonBaseState
+	{
+public:
+	TBTPortStateServiceIDListRetrieved(CBTPortStateFactory* aParent);
+	~TBTPortStateServiceIDListRetrieved();
+	virtual void DoRunL(CBTPortProxy* aContext);
+	virtual void LogStateError(CBTPortProxy* aContext, TInt aError);
+	};
+
+
+NONSHARABLE_CLASS(TBTPortStateSDPAttributeListRetrieved) : public TBTPortCommonBaseState
+	{
+public:
+	TBTPortStateSDPAttributeListRetrieved(CBTPortStateFactory* aParent);
+	~TBTPortStateSDPAttributeListRetrieved();
+	virtual void DoRunL(CBTPortProxy* aContext);
+	virtual void DoLockedAction(CBTPortProxy* aContext);
+	virtual void LogStateError(CBTPortProxy* aContext, TInt aError);
+	};
+
+NONSHARABLE_CLASS(TBTPortStateConnecting) : public TBTPortCommonBaseState
+	{
+public:
+	TBTPortStateConnecting(CBTPortStateFactory* aParent);
+	~TBTPortStateConnecting();
+	virtual void DoRunL(CBTPortProxy* aContext);
+	virtual void LogStateError(CBTPortProxy* aContext,TInt aError);
+	};
+
+NONSHARABLE_CLASS(TBTPortStateOpen) : public TBTPortCommonBaseState
+	{
+public:
+	TBTPortStateOpen(CBTPortStateFactory* aParent);
+	~TBTPortStateOpen();
+	virtual void Read(CBTPortProxy* aContext,TAny* aPtr,TInt aLength);
+	virtual void Write(CBTPortProxy* aContext,TAny* aPtr,TInt aLength);
+	virtual void WriteCancel(CBTPortProxy* aContext);
+	virtual void ReadCancel(CBTPortProxy* aContext);
+	virtual void Close(CBTPortProxy* aContext);
+	virtual void DoLockedAction(CBTPortProxy* aContext);
+	virtual void DoWriteCompleted(CBTPortProxy* aContext,TInt aError);
+	virtual void DoReadCompleted(CBTPortProxy* aContext,TInt aError);
+	virtual void LogStateError(CBTPortProxy* aContext,TInt aError);
+private:
+	void HandleIPCWriteToClient(CBTPortProxy* aContext);
+	};
+
+NONSHARABLE_CLASS(TBTPortStateClosing) : public TBTPortCommonBaseState
+	{
+public:
+	TBTPortStateClosing(CBTPortStateFactory* aParent);
+	~TBTPortStateClosing();
+	virtual void Read(CBTPortProxy* aContext,TAny* aPtr,TInt aLength);
+	virtual void Write(CBTPortProxy* aContext,TAny* aPtr,TInt aLength);
+	virtual void Close(CBTPortProxy* aContext);
+	virtual void DoRunL(CBTPortProxy* aContext);
+	virtual void DoLockedAction(CBTPortProxy* aContext);
+	virtual void DoWriteCompleted(CBTPortProxy* aContext,TInt aError);
+	virtual void DoReadCompleted(CBTPortProxy* aContext,TInt aError);
+	virtual void LogStateError(CBTPortProxy* aContext,TInt aError);
+	};
+
+NONSHARABLE_CLASS(TBTPortErrorState) : public TBTPortState
+/**
+	Error State.
+	The CSY will move in this state after an error has been returned.
+	From this state on Read and Write (from the client) we will return
+	the error code, hence notify the client. Unfortunately this is the only
+	way that we can notify C32 (and hence the client).
+*/
+	{
+public:
+	TBTPortErrorState(CBTPortStateFactory* aParent);
+	virtual ~TBTPortErrorState();
+	virtual void Open(CBTPortProxy* aContext);
+	virtual void Read(CBTPortProxy* aContext,TAny* aPtr,TInt aLength);
+	virtual void Write(CBTPortProxy* aContext,TAny* aPtr,TInt aLength);
+	virtual void Close(CBTPortProxy* aContext);
+	virtual void DoRunL(CBTPortProxy* aContext);
+	virtual void DoCancel(CBTPortProxy* aContext);
+	virtual void WriteCancel(CBTPortProxy* aContext);
+	virtual void ReadCancel(CBTPortProxy* aContext);
+	virtual void DoLockedAction(CBTPortProxy* aContext);
+	virtual void DoWriteCompleted(CBTPortProxy* aContext,TInt aError);
+	virtual void DoReadCompleted(CBTPortProxy* aContext,TInt aError);
+	virtual void Error(CBTPortProxy* aContext,TInt aError);
+	};
+
+
+
+
+#endif