diff -r 5ebadcda06cb -r 001a94c71129 bluetoothengine/btsap/src/BTSapServerState.cpp --- a/bluetoothengine/btsap/src/BTSapServerState.cpp Fri Sep 03 16:17:59 2010 +0300 +++ b/bluetoothengine/btsap/src/BTSapServerState.cpp Wed Sep 29 13:09:05 2010 +0300 @@ -20,6 +20,8 @@ // INCLUDE FILES #include +#include +#include #include "BTSapDomainPSKeys.h" #include "BTSapServerState.h" @@ -78,7 +80,7 @@ } // --------------------------------------------------------- -// CBTSapStatusObserver::StartObservingL() +// CBTSapStatusObserver::SubscribeSapStatusL() //---------------------------------------------------------- // void CBTSapStatusObserver::SubscribeSapStatusL(MSapStatusObserver* aObserver) @@ -130,6 +132,102 @@ } // --------------------------------------------------------- +// CBTSapCallStatusObserver::CBTSapCallStatusObserver() +//---------------------------------------------------------- +// +CBTSapCallStatusObserver::CBTSapCallStatusObserver(): CActive(CActive::EPriorityStandard) + { + CActiveScheduler::Add( this ); + } + +// --------------------------------------------------------- +// CBTSapCallStatusObserver::NewL() +//---------------------------------------------------------- +// +CBTSapCallStatusObserver* CBTSapCallStatusObserver::NewL() + { + CBTSapCallStatusObserver* self = new(ELeave) CBTSapCallStatusObserver(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// --------------------------------------------------------- +// CBTSapCallStatusObserver::ConstructL() +//---------------------------------------------------------- +// +void CBTSapCallStatusObserver::ConstructL() + { + BTSAP_TRACE_OPT(KBTSAP_TRACE_FUNCTIONS, BTSapPrintTrace(_L("[BTSap] CBTSapCallStatusObserver::ConstructL"))); + User::LeaveIfError(iProperty.Attach( KPSUidCtsyCallInformation, + KCTsyCallState)); + } + +// --------------------------------------------------------- +// CBTSapCallStatusObserver::~CBTSapCallStatusObserver +//---------------------------------------------------------- +// +CBTSapCallStatusObserver::~CBTSapCallStatusObserver() + { + Cancel(); + iProperty.Close(); + } + +// --------------------------------------------------------- +// CBTSapCallStatusObserver::SubscribeCallStatusL() +//---------------------------------------------------------- +// +void CBTSapCallStatusObserver::SubscribeCallStatusL(MSapCallStatusObserver* aObserver) + { + BTSAP_TRACE_OPT(KBTSAP_TRACE_FUNCTIONS, BTSapPrintTrace(_L("[BTSap] CBTSapCallStatusObserver::SubscribeCallStatusL"))); + + ASSERT(aObserver); + + iObserver = aObserver; + + iProperty.Subscribe(iStatus); + SetActive(); + BTSAP_TRACE_OPT(KBTSAP_TRACE_FUNCTIONS, BTSapPrintTrace(_L("[BTSap] CBTSapCallStatusObserver::SubscribeCallStatusL() Exit"))); + } + + +// --------------------------------------------------------- +// CBTSapCallStatusObserver::DoCancel() +// --------------------------------------------------------- +// +void CBTSapCallStatusObserver::DoCancel() + { + BTSAP_TRACE_OPT(KBTSAP_TRACE_FUNCTIONS, BTSapPrintTrace(_L("[BTSap] CBTSapCallStatusObserver::DoCancel"))); + + iProperty.Cancel(); + } + +// --------------------------------------------------------- +// CBTSapCallStatusObserver::RunL() +// --------------------------------------------------------- +// +void CBTSapCallStatusObserver::RunL() + { + BTSAP_TRACE_OPT(KBTSAP_TRACE_FUNCTIONS, BTSapPrintTrace(_L("[BTSap] CBTSapCallStatusObserver::RunL"))); + + TInt btSapState; + TInt err = iStatus.Int(); + + iProperty.Subscribe(iStatus); + SetActive(); + + if (!err) + { + err = iProperty.Get(btSapState); + if (!err) + { + iObserver->CallStatusChangedL(btSapState); + } + } + } + +// --------------------------------------------------------- // CBTSapServerState::CBTSapServerState() // --------------------------------------------------------- // @@ -169,6 +267,7 @@ delete iSimCardStatusNotifier; delete iRequestHandler; delete iStatusObserver; + delete iBTCallStatusObserver; iSubscriptionModule.Close(); iPhone.Close(); @@ -206,6 +305,7 @@ iSocketHandler = CBTSapSocketHandler::NewL(*this, *iRequestHandler); iSimCardStatusNotifier = CBTSapSimCardStatusNotifier::NewL(*this); iStatusObserver = CBTSapStatusObserver::NewL(); + iBTCallStatusObserver = CBTSapCallStatusObserver::NewL(); TState* state = new (ELeave) TStateInit(*this); CleanupStack::PushL(state); @@ -216,6 +316,46 @@ } // --------------------------------------------------------- +// CBTSapServerState::SubscribeCallStatusL() +// --------------------------------------------------------- +// +void CBTSapServerState::SubscribeCallStatusL() + { + BTSAP_TRACE_OPT(KBTSAP_TRACE_FUNCTIONS, BTSapPrintTrace(_L("[BTSap] CBTSapServerState::SubscribeCallStatusL"))); + if (!iBTCallStatusObserver->IsActive()) + { + iBTCallStatusObserver->SubscribeCallStatusL(this); + } + } + +// --------------------------------------------------------- +// CBTSapServerState::CancelSubscribeCallStatusL() +// --------------------------------------------------------- +// +void CBTSapServerState::CancelSubscribeCallStatusL() + { + BTSAP_TRACE_OPT(KBTSAP_TRACE_FUNCTIONS, BTSapPrintTrace(_L("[BTSap] CBTSapServerState::CancelSubscribeCallStatusL"))); + iBTCallStatusObserver->Cancel(); + } + +// --------------------------------------------------------- +// CBTSapServerState::CallStatusChangedL() +// --------------------------------------------------------- +// +void CBTSapServerState::CallStatusChangedL(TInt aStatus) + { + BTSAP_TRACE_OPT(KBTSAP_TRACE_INFO, BTSapPrintTrace(_L("[BTSap] TStateConnect: callState: %d"), aStatus)); + + // If callState is EPSTelephonyCallStateNone or EPSTelephonyCallStateUninitialized, there's no ongoing call + TBool retVal = (aStatus != EPSCTsyCallStateNone) && (aStatus != EPSCTsyCallStateUninitialized); + if (retVal) + { + BTSAP_TRACE_OPT(KBTSAP_TRACE_FUNCTIONS, BTSapPrintTrace(_L("[BTSap] CBTSapServerState::CallStatusChangedL() call ended"))); + iStateArray[iCurrentState]->CallInactive(); + } + } + +// --------------------------------------------------------- // CBTSapServerState::StartL() // --------------------------------------------------------- //