Fix N_SE-41043
[apps/osp/Call.git] / src / CallTelephonyManager.cpp
index 0a98f23..65884c6 100644 (file)
@@ -337,7 +337,6 @@ result
 TelephonyManager::EndActiveCall(Long callHandle)
 {
        result r = E_FAILURE;
-
        //fetch ended callInfo from active call list
        AppCallInfo endCall;
        r = __pActiveCallList->GetValue(callHandle.ToLong(), endCall);
@@ -345,6 +344,7 @@ TelephonyManager::EndActiveCall(Long callHandle)
        {
                r = EndCall(endCall);
        }
+
        return r;
 }
 
@@ -1739,6 +1739,7 @@ TelephonyManager::HandleEndConferenceCallbackResponse(TapiHandle* pHandle, int c
        AppLog("ENTER");
        //This callback comes only if a conference call is ended by user.
        TelephonyManager* pTelManager = (TelephonyManager*) pUserData;
+       AppCallInfo heldCall;
        if (callBackResult == TAPI_CAUSE_SUCCESS && pData != null)
        {
                //fetch ended confCall details
@@ -1792,6 +1793,24 @@ TelephonyManager::HandleEndConferenceCallbackResponse(TapiHandle* pHandle, int c
                {
                        //fetch active calls to show appropriate scene
                        pCallList = static_cast<ArrayListT<AppCallInfo>*>(pTelManager->__pActiveCallList->GetValuesN());
+                       r = pCallList->GetAt(0, heldCall);
+                       if (r == E_SUCCESS)
+                       {
+                               //pTelManager->HoldActiveCall(&heldCall, false);
+                               AppCallInfo* pHeldCallInfo = new (std::nothrow) AppCallInfo();
+                               unsigned int callHandle = heldCall.GetCallHandle()->ToLong();
+                               //copy state into new callinfo object
+                               *pHeldCallInfo = heldCall;
+
+                               //set call to hold state
+                               pHeldCallInfo->SetOnHold(false);
+
+                               pTelManager->__pActiveCallList->Remove(callHandle);
+                               //replace old object with new
+                               pTelManager->__pActiveCallList->Add(callHandle, *pHeldCallInfo);
+                               delete pCallList;
+                               pCallList = static_cast<ArrayListT<AppCallInfo>*>(pTelManager->__pActiveCallList->GetValuesN());
+                       }
                }
                //notify listener that call is disconnected.
                pTelManager->__pEventListener->HandleCallDisconnected(isLastCall, *pCallList);
@@ -1949,6 +1968,8 @@ bool
 TelephonyManager::HandleEndNormalActiveCall(AppCallInfo& endCallInfo)
 {
        AppLogDebug("Enter");
+       result r = E_FAILURE;
+       AppCallInfo heldCall;
        // This function gets called only from HandleIdleCallback(),
        // to handle disconnection of normal active calls.
        if (endCallInfo.IsConferenceCall() == false)
@@ -1971,6 +1992,14 @@ TelephonyManager::HandleEndNormalActiveCall(AppCallInfo& endCallInfo)
                {
                        //fetch active calls to show appropriate scene
                        pCallList = static_cast<ArrayListT<AppCallInfo>*>(__pActiveCallList->GetValuesN());
+                       //fetch the held call on disconnecting the active call and activate it.
+                       r = pCallList->GetAt(0, heldCall);
+                       if (r == E_SUCCESS)
+                       {
+                               HoldActiveCall(&heldCall, false);
+                               delete pCallList;
+                               pCallList = static_cast<ArrayListT<AppCallInfo>*>(__pActiveCallList->GetValuesN());
+                       }
                }
 
                //Save "End" call info to call log database