bluetoothengine/btsap/src/BTSapServerState.cpp
changeset 65 001a94c71129
parent 0 f63038272f30
--- 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 <e32property.h>
+#include <ctsydomainpskeys.h>
+#include <PSVariables.h>
 #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()
 // ---------------------------------------------------------
 //