diff -r 000000000000 -r 29b1cd4cb562 bluetooth/btcomm/src/btstate.h --- /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 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