bluetoothengine/btsap/src/BTSapStateConnect.cpp
changeset 65 001a94c71129
parent 0 f63038272f30
--- a/bluetoothengine/btsap/src/BTSapStateConnect.cpp	Fri Sep 03 16:17:59 2010 +0300
+++ b/bluetoothengine/btsap/src/BTSapStateConnect.cpp	Wed Sep 29 13:09:05 2010 +0300
@@ -30,7 +30,7 @@
 
 
 CBTSapServerState::TStateConnect::TStateConnect(CBTSapServerState& aServerState)
-    : TStateIdle(aServerState), iConnectRequestOK(EFalse), iCardStatus(ECardStatusReserved)
+    : TStateIdle(aServerState), iConnectRequestOK(EFalse), iCardStatus(ECardStatusReserved), iSendRespMessageDone(EFalse), iMessageSizeNegotiationDone(EFalse) 
     {
     }
 
@@ -43,15 +43,27 @@
 
     iStatus = &aStatus;
     TConnectionStatus connectionStatus = EConnectionErrReject;
-    if(!IsCallOngoing())
-        {   // SAP cannot be accepted if a call is ongoing or if no SIM is present
-        connectionStatus = EConnectionOK;
-        }
-
-    if (connectionStatus == EConnectionOK)
+    if (!iMessageSizeNegotiationDone)
         {
         CheckMaxMsgSize(connectionStatus);
         }
+    
+    if (connectionStatus == EConnectionOK || iMessageSizeNegotiationDone)
+        {
+        iMessageSizeNegotiationDone = ETrue;
+        if(IsCallOngoing())
+            {   // SAP cannot be accepted if a call is ongoing or if no SIM is present
+            connectionStatus = EConnectionOKOngoingCall;
+            }
+        else
+            {
+            connectionStatus = EConnectionOK;
+            }
+        }
+    else
+        {
+        iMessageSizeNegotiationDone = EFalse;
+        }
 
     if (connectionStatus == EConnectionOK)
         {
@@ -84,10 +96,23 @@
 #endif //__WINS__
 
         }
+    else if (connectionStatus == EConnectionOKOngoingCall) 
+        {
+        iConnectRequestOK = EFalse;
+        aStatus = KRequestPending; 
+        if (iSendRespMessageDone)
+            {
+            //start subscribe to CallStatusChange
+            iServerState.SubscribeCallStatusL();
+            }
+        else
+            {
+            User::RequestComplete(iStatus, EConnectionWithActiveCall);
+            }
+        }    
     else
         {
         iConnectRequestOK = EFalse;
-
         iResponseMessage.SetMsgID(EConnectResponse);
         iResponseMessage.AddParameter(EParaConnectionStatus, connectionStatus);
 
@@ -121,8 +146,25 @@
     BTSAP_TRACE_OPT(KBTSAP_TRACE_STM, BTSapPrintTrace(_L("[BTSap]  SM: TStateConnect: Complete")));
 
     TBTSapServerState nextState = EStateNotConnected;
-
-    if (aReason == EUserAccepted || aReason == EUserRejected)
+    if (aReason == EConnectionWithActiveCall)
+        {
+        if (!iSendRespMessageDone)
+            {
+            TInt connectionStatus = EConnectionOKOngoingCall;
+            iResponseMessage.SetMsgID(EConnectResponse);
+            iResponseMessage.AddParameter(EParaConnectionStatus, connectionStatus);
+            iServerState.BTSapSocketHandler().Send(iResponseMessage.Data());
+            iSendRespMessageDone = ETrue;
+            }
+        //wait in TStateConnect state, until call is released
+        nextState = EStateConnect;
+        }   
+    else if (aReason == EConnectionWithoutActiveCall)
+        {
+        //Enter TStateConnect state one last time, make a SAP connection
+        nextState = EStateConnect;
+        }   
+    else if (aReason == EUserAccepted || aReason == EUserRejected)
         {
         TInt connectionStatus = (aReason == EUserAccepted) ? EConnectionOK : EConnectionErrReject;
 
@@ -147,6 +189,8 @@
                 NotifySapState(ESapConnected);
                 }
             nextState = EStateIdle;
+            iSendRespMessageDone = EFalse;
+            iMessageSizeNegotiationDone = EFalse;
             }
         }
 
@@ -156,6 +200,9 @@
 void CBTSapServerState::TStateConnect::Cancel()
     {
     NotifySapState(ESapNotConnected);
+    iSendRespMessageDone = EFalse;
+    iMessageSizeNegotiationDone = EFalse;
+    iServerState.CancelSubscribeCallStatusL();
     User::RequestComplete(iStatus, KErrCancel);
     }
 
@@ -182,7 +229,12 @@
         BTSAP_TRACE_OPT(KBTSAP_TRACE_INFO, BTSapPrintTrace(_L("[BTSap]  TStateConnect: callState: %d"), callState));
 
         // If callState is EPSTelephonyCallStateNone or EPSTelephonyCallStateUninitialized, there's no ongoing call
-        retVal = (callState != EPSCTsyCallStateNone) && (callState != EPSCTsyCallStateUninitialized);
+        // should EPSCTsyCallStateDisconnecting be treated as non active call status ???
+        // added it here for testing with SAP 1.0 supported carkit. Since there is delay for call status changes from EPSCTsyCallStateDisconnecting
+        // to EPSCTsyCallStateNone or EPSCTsyCallStateUninitialized. If we do not treat EPSCTsyCallStateDisconnecting as 
+        // Call Inactive status, SAP connection will be dropped and client connects to HFP profile instead. 
+        // could be removed and try if it works with SAP 1.1 clients.
+        retVal = (callState != EPSCTsyCallStateNone) && (callState != EPSCTsyCallStateUninitialized) && (callState != EPSCTsyCallStateDisconnecting);
         }
     else
         {
@@ -264,4 +316,15 @@
     iCardStatus = aCardStatus;
     }
 
+TInt CBTSapServerState::TStateConnect::CallInactive()
+    {
+    BTSAP_TRACE_OPT(KBTSAP_TRACE_FUNCTIONS, BTSapPrintTrace(_L("[BTSap]  SM: TStateConnect: CallInactive")));
+
+    if (*iStatus == KRequestPending)
+        {
+        User::RequestComplete(iStatus, EConnectionWithoutActiveCall);
+        }
+    return KErrNone;
+    }
+
 //  End of File