--- /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 <e32base.h>
+#include <e32property.h>
+
+#ifdef _DUMMY_CUSTOM_API
+#include <DummyCustomAPI.h>
+#else
+#include <rmmcustomapi.h>
+#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<KMaxMsgSize> iApduCmd;
+ TBuf8<KMaxMsgSize> 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<KMaxMsgSize> 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 <TState> iStateArray;
+
+ RTelServer iTelServer;
+ RMobilePhone iPhone;
+ RMmCustomAPI iSubscriptionModule;
+
+ TBTSapMessage iResponseMessage;
+ TBTSapMessage iRequestMessage;
+ CBTSapStatusObserver* iStatusObserver;
+ TBool iStatesCreated;
+ };
+
+#endif // BT_SAP_SERVER_STATE_H
+
+// End of File