diff -r 000000000000 -r f63038272f30 bluetoothengine/btsap/inc/BTSapServerState.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetoothengine/btsap/inc/BTSapServerState.h Mon Jan 18 20:28:57 2010 +0200 @@ -0,0 +1,428 @@ +/* +* Copyright (c) 2004-2006 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: +* BTSap Plugin header definition +* +* +*/ + + +#ifndef BT_SAP_SERVER_STATE_H +#define BT_SAP_SERVER_STATE_H + +// INCLUDES +#include +#include + +#ifdef _DUMMY_CUSTOM_API +#include +#else +#include +#endif + +#include "BTSapPlugin.h" +#include "BTSapMessage.h" + +enum TBTSapServerState + { + EStateInit, + EStateNotConnected, + EStateConnect, + EStateDisconnect, + EStateIdle, + EStateAPDU, + EStateATR, + EStatePowerOff, + EStatePowerOn, + EStateReset, + EStateCardReaderStatus + }; + +enum TSapConnectionCompleteReason + { + EConnectionError, + EUserAccepted, + EUserRejected + }; + +enum TSapConnectionState + { + ESapNotConnected, + ESapConnecting, + ESapConnected + }; + +// FORWARD DECLARATIONS +class CBTSapSocketHandler; +class CBTSapRequestHandler; +class CBTSapSimCardStatusNotifier; +class RTelServer; +class RMobilePhone; +class MSapStatusObserver; + +/* +* An abstarct interface that defines a callback method +* for the SAP connection state observer. SapStatusChangedL +* is called by CBTSapStatusObserver when the SAP connection +* state has changed. aStatus represents the new status value. +*/ +class MSapStatusObserver + { + public: + virtual void SapStatusChangedL(TInt aStatus) = 0; + }; + +/* +* An observer that monitors KPSUidBluetoothSapConnectionState +* P&S key. The clients can call SubscribeSapStatusL in order to +* get a chenged new SAP connection status returned via +* MSapStatusObserver::SapStatusChangedL. +*/ +class CBTSapStatusObserver : public CActive + { +public: + /** + * Two-phased constructor. + */ + static CBTSapStatusObserver* NewL(); + /** + * Destructor. + */ + virtual ~CBTSapStatusObserver(); + + /** + * Starts listening KPSUidBluetoothSapConnectionState P&S key. + * When the key value is changed, the new state is indicated + * through the observer interface (MSapStatusObserver). + */ + void SubscribeSapStatusL(MSapStatusObserver* aObserver); + +private: + /** + * Two-Phase constructor + */ + void ConstructL(); + + /** + * Default constructor + */ + CBTSapStatusObserver(); + + // From CActive + virtual void DoCancel(); + virtual void RunL(); + +private: + MSapStatusObserver* iObserver; + RProperty iProperty; + }; + + +/** +* CBTSapServerState core class +* +*/ +class CBTSapServerState : public CActive, MSapStatusObserver + { +private: + class TState + { + public: + TState(CBTSapServerState& aServerState); + virtual void Enter(TRequestStatus& aStatus) = 0; + virtual TBTSapServerState Complete(TInt aReason = KErrNone) = 0; + virtual void Cancel() = 0; + + virtual TInt DisconnectSapConnection(TBTSapDisconnectType aType); + virtual TInt AcceptSapConnection(); + virtual TInt RejectSapConnection(TBTSapRejectReason aReason); + virtual void SimCardStatusChanged(TCardStatus aCardStatus); + virtual TInt ChangeState(TBTSapServerState& aNextState); + + void NotifySapState(TSapConnectionState aState); + void StartBTNotifier(TInt type); + TBool IsSimPresent(); + + protected: + TInt iSimStatus; + CBTSapServerState& iServerState; + TBTSapMessage& iResponseMessage; // + TRequestStatus* iStatus; // TState can't access parent's member directly + }; + + class TStateInit : public TState + { + public: + TStateInit(CBTSapServerState& aServerState); + void Enter(TRequestStatus& aStatus); + TBTSapServerState Complete(TInt aReason); + void Cancel(); + }; + + class TStateNotConnected : public TState + { + public: + TStateNotConnected(CBTSapServerState& aServerState); + void Enter(TRequestStatus& aStatus); + TBTSapServerState Complete(TInt aReason); + void Cancel(); + + TInt ChangeState(TBTSapServerState& aNextState); + }; + + class TStateIdle : public TState + { + public: + TStateIdle(CBTSapServerState& aServerState); + void Enter(TRequestStatus& aStatus); + TBTSapServerState Complete(TInt aReason); + void Cancel(); + + TInt DisconnectSapConnection(TBTSapDisconnectType aType); + void SimCardStatusChanged(TCardStatus aCardStatus); + TInt ChangeState(TBTSapServerState& aNextState); + }; + + class TStateConnect : public TStateIdle + { + public: + TStateConnect(CBTSapServerState& aServerState); + void Enter(TRequestStatus& aStatus); + TBTSapServerState Complete(TInt aReason); + void Cancel(); + + TInt AcceptSapConnection(); + TInt RejectSapConnection(TBTSapRejectReason aReason); + TInt ChangeState(TBTSapServerState& aNextState); + void SimCardStatusChanged(TCardStatus aCardStatus); + + private: + void CheckMaxMsgSize(TConnectionStatus& aMsgSizeStatus); + TBool IsCallOngoing(); + + private: + TBool iConnectRequestOK; + TCardStatus iCardStatus; + RProperty iProperty; + }; + + class TStateDisconnect : public TStateIdle + { + public: + TStateDisconnect(CBTSapServerState& aServerState); + void Enter(TRequestStatus& aStatus); + TBTSapServerState Complete(TInt aReason); + void Cancel(); + + TInt ChangeState(TBTSapServerState& aNextState); + }; + + class TStateAPDU : public TStateIdle + { + public: + TStateAPDU(CBTSapServerState& aServerState); + void Enter(TRequestStatus& aStatus); + TBTSapServerState Complete(TInt aReason); + void Cancel(); + + TInt ChangeState(TBTSapServerState& aNextState); + + private: + TBuf8 iApduCmd; + TBuf8 iApduResp; + RMmCustomAPI::TApduParameters iApduParameters; + }; + + class TStateATR : public TStateIdle + { + public: + TStateATR(CBTSapServerState& aServerState); + void Enter(TRequestStatus& aStatus); + TBTSapServerState Complete(TInt aReason); + void Cancel(); + + TInt ChangeState(TBTSapServerState& aNextState); + + private: + TBuf8 iATR; + }; + + class TStatePowerOff : public TStateIdle + { + public: + TStatePowerOff(CBTSapServerState& aServerState); + void Enter(TRequestStatus& aStatus); + TBTSapServerState Complete(TInt aReason); + void Cancel(); + + TInt ChangeState(TBTSapServerState& aNextState); + }; + + class TStatePowerOn : public TStateIdle + { + public: + TStatePowerOn(CBTSapServerState& aServerState); + void Enter(TRequestStatus& aStatus); + TBTSapServerState Complete(TInt aReason); + void Cancel(); + + TInt ChangeState(TBTSapServerState& aNextState); + void SimCardStatusChanged(TCardStatus aCardStatus); + + private: + TResultCode iResultCode; + TCardStatus iCardStatus; + }; + + class TStateReset : public TStateIdle + { + public: + TStateReset(CBTSapServerState& aServerState); + void Enter(TRequestStatus& aStatus); + TBTSapServerState Complete(TInt aReason); + void Cancel(); + + TInt ChangeState(TBTSapServerState& aNextState); + void SimCardStatusChanged(TCardStatus aCardStatus); + + private: + TResultCode iResultCode; + TCardStatus iCardStatus; + }; + + class TStateCardReaderStatus : public TStateIdle + { + public: + TStateCardReaderStatus(CBTSapServerState& aServerState); + void Enter(TRequestStatus& aStatus); + TBTSapServerState Complete(TInt aReason); + void Cancel(); + + TInt ChangeState(TBTSapServerState& aNextState); + + private: + RMmCustomAPI::TSimCardReaderStatus iCardReaderStatus; + }; + +public: + /** + * Two-phased constructor. + */ + static CBTSapServerState* NewL(CBTSapPlugin& aBTSapPlugin); + /** + * Destructor. + */ + virtual ~CBTSapServerState(); + +public: + + void StartL(); + + void ChangeState(const TBTSapServerState aNextState); + + TBTSapServerState CurrentState(); + + TInt DisconnectSapConnection(TBTSapDisconnectType aType); + + TInt AcceptSapConnection(); + + TInt RejectSapConnection(TBTSapRejectReason aReason); + + TBool IsSapConnected(); + + TInt GetRemoteBTAddress(TBTDevAddr& aBTDevAddr); + + TInt CreateStatesL(); + + TInt ReleaseStatesL(); + + TInt DisconnectCompleteL(TInt aErr); + +public: + + TInt HandleStateChangeRequest(TBTSapServerState& aNextState); + + void SendErrorResponse(); + + void SimCardStatusChanged(TCardStatus aCardStatus); + + CBTSapSocketHandler& BTSapSocketHandler(); + + CBTSapSimCardStatusNotifier& BTSapSimCardStatusNotifier(); + + RMmCustomAPI& SubscriptionModule(); + + TBTSapMessage& BTSapRequestMessage(); + + TBTSapMessage& BTSapResponseMessage(); + + // From MSapStatusObserver + void SapStatusChangedL(TInt aStatus); + +private: + + void OpenSubscriptionModuleL(); + +private: // From CActive + + /** + * DoCancel() has to be implemented by all the classes deriving CActive. + * Request cancellation routine. + * @param none + * @return none + */ + virtual void DoCancel(); + + /** + * RunL is called by framework after request is being completed. + * @param nones + * @return none + */ + virtual void RunL(); + +private: + + /** + * Default constructor + */ + CBTSapServerState(CBTSapPlugin& aBTSapPlugin); + + /** + * Two-Phase constructor + */ + void ConstructL(); + +private: // Data + + CBTSapPlugin& iBTSapPlugin; + CBTSapSocketHandler* iSocketHandler; + CBTSapRequestHandler* iRequestHandler; + CBTSapSimCardStatusNotifier* iSimCardStatusNotifier; + + TBTSapServerState iCurrentState; + RPointerArray iStateArray; + + RTelServer iTelServer; + RMobilePhone iPhone; + RMmCustomAPI iSubscriptionModule; + + TBTSapMessage iResponseMessage; + TBTSapMessage iRequestMessage; + CBTSapStatusObserver* iStatusObserver; + TBool iStatesCreated; + }; + +#endif // BT_SAP_SERVER_STATE_H + +// End of File