📄 callctrl.cpp
字号:
IndicateCallActivityToAudioSubsystem(TRUE);//open the audio
}
(void)strncpyz(szCmd, "AT+CHLD=2\r", MAX_PATH);
pnd = new CNotificationData;
if (pnd && !pnd->InitFromRealBlob(RIL_NOTIFY_CALLSTATECHANGED, NULL, 0))
{
delete pnd;
pnd = NULL;
}
if (!QueueCmd(pHandle, szCmd, dwOpt, APIID_MANAGECALLS, NULL, pnd, hr))
{
hr = E_FAIL;
goto Error;
}
pnd = NULL;
fNeedSendActiveCallNet = TRUE;
}
goto Error;
}
else if(RILDrv_CC_CIDTotalToLocal(nCallIDInTotal,nCallIDInDriver))
{
RETAILMSG(1, (TEXT("[TI]RILDrv_ManageCalls: Total Call ID=%d,Local Call ID=%d\r\n"),dwID,nCallIDInDriver));
dwID = nCallIDInDriver ;
bCallExist = TRUE;
}
else if((dwCommand == RIL_CALLCMD_RELEASECALL) || (dwCommand == RIL_CALLCMD_HOLDALLBUTONE))
{
RETAILMSG(1, (TEXT("[TI]RILDrv_ManageCalls: call RILDrv_CC_CIDTotalToLocal failed,dwID=%d\r\n"),dwID));
}
//end add by fengguisen
if(!bRelease2ndVoiceCall)
{
switch (dwCommand)
{
case RIL_CALLCMD_RELEASEHELD:
{
UINT8 nCID2ndVoice = 0;
UINT8 nCIDHold = 0;
//if driver 1 does not has 1st voice call or data call,then route to driver 2 and return S_OK
if((!RILDrv_CC_IsCallExist(stShareMemOpt.nRILDriver1CallFlag,CALL_FLAG_VOICE_FIRST))
&& (!RILDrv_CC_IsCallExist(stShareMemOpt.nRILDriver1CallFlag,CALL_FLAG_CSD)))
{
RETAILMSG(1, (TEXT("[TI]RILDrv_ManageCalls:RELEASEHELD:Driver 1 does not has 1st voice and data call,route to driver 2\r\n")));
goto Error;
}
//if driver 2 has 1st voice call or csd call,driver 1 send cmd ,then route to driver 2 and return S_OK
if((RILDrv_CC_IsCallExist(stShareMemOpt.nRILDriver2CallFlag,CALL_FLAG_VOICE_FIRST)) ||
(RILDrv_CC_IsCallExist(stShareMemOpt.nRILDriver2CallFlag,CALL_FLAG_CSD)))
{
dwOpt |= CMDOPT_NOT_SEND_RESPONSE;
bRetS_OK = TRUE;
}
//if driver 2 has the 2nd voice call
if(RILDrv_CC_GetCallIDFromType(CALL_TYPE_VOICE_SECOND,nCID2ndVoice))
{
if(RILDrv_CC_GetCallIDFromStatus(RIL_CALLSTAT_ONHOLD,nCIDHold))
{
//release the hold call
sprintf(szCmd,"AT%%CHLD=1%d\r",nCIDHold);
dwOpt |= CMDOPT_HANGUP; // Necessary when attempting to end a single outgoing call
}
else
{
//if no hold call ,do nothing
(void)strncpyz(szCmd, "AT\r", MAX_PATH);
}
}
else
{
//if no 2nd voice call,then send AT+CHLD=0
(void)strncpyz(szCmd, "AT%CHLD=0\r", MAX_PATH);
dwOpt |= CMDOPT_HANGUP; // Necessary when attempting to end a single outgoing call
}
break;
}
case RIL_CALLCMD_RELEASEACTIVE_ACCEPTHELD:
{
if(RILDrv_CC_IsCallExist(stShareMemOpt.nRILDriver1CallFlag,CALL_FLAG_CSD)
||(!RILDrv_CC_IsCallExist(stShareMemOpt.nRILDriver1CallFlag,CALL_FLAG_VOICE_FIRST)))//if TI have csd call
{
goto Error;
}
if(RILDrv_CC_IsCallExist(stShareMemOpt.nRILDriver2CallFlag,CALL_FLAG_VOICE_FIRST))//if df have active call
{
dwOpt |= CMDOPT_NOT_SEND_RESPONSE;
bRetS_OK = TRUE;
}
if(RILDrv_CC_IsCallStatusExist(stShareMemOpt.nRILDriver1CallStatus,CALL_STATUS_VOICE_HOLD))//if ti have hold call,we will switch audio
{
IndicateCallActivityToAudioSubsystem(TRUE);
}
(void)strncpyz(szCmd, "AT%CHLD=1\r", MAX_PATH);
fNeedSendActiveCallNet = TRUE;
break;
}
case RIL_CALLCMD_RELEASECALL:
{
if((!RILDrv_CC_IsCallExist(stShareMemOpt.nRILDriver1CallFlag,CALL_FLAG_VOICE_FIRST))
&& (!RILDrv_CC_IsCallExist(stShareMemOpt.nRILDriver1CallFlag,CALL_FLAG_CSD)))
{
RETAILMSG(1, (TEXT("[TI]RILDrv_ManageCalls:RELEASEACTIVE_ACCEPTHELD:Driver 1 does not has 1st voice and data call,route to driver 2\r\n")));
goto Error;
}
if (dwID==0)
{
// Id of 0 is a magic value which says to release a call being dialed while
// another call is on hold.
// This activates code in HangupThreadProc to force it to send AT\r to the modem
// to try to abort a call being dialed.
#if defined (WAVECOM_DRIVER)
// H1 on wavecom will hang up calls in the alerting state.
(void)strncpyz(szCmd, "ATH1\r", MAX_PATH);
dwOpt = CMDOPT_HANGUP;
#else
// We don't need to send a command to the modem because
// HangupThreadProc's AT\r will cancel the dial.
(void)strncpyz(szCmd, "AT\r", MAX_PATH);
dwOpt = CMDOPT_HANGUP | CMDOPT_NOOP;
#endif
//goto Error;
}
else if (9 == dwID)
{
// This is a special-case to enable us to pass FTA case GSM 51.010 31.4.4.2 which requires
// a way to end all calls in one operation (i.e., "19<SEND>")
(void)strncpyz(szCmd, "ATH\r", MAX_PATH);
}
else if (8 == dwID)
{
// This is a special-case to enable us to pass FTA case GSM 51.010 31.4.4.1.2.4 which requires
// a way to end a held conference call in one operation (i.e., "18<SEND>")
(void)strncpyz(szCmd, "at+chld=11\rAT\rat+chld=12\r", MAX_PATH);
}
else
{
//if driver 1 does not has 1st voice call or data call,then route to driver 2 and return S_OK
if((!RILDrv_CC_IsCallExist(stShareMemOpt.nRILDriver1CallFlag,CALL_FLAG_VOICE_FIRST))
&& (!RILDrv_CC_IsCallExist(stShareMemOpt.nRILDriver1CallFlag,CALL_FLAG_CSD)))
{
RETAILMSG(1, (TEXT("[TI]RILDrv_ManageCalls:RELEASECALL:Driver 1 does not has 1st voice and data call,route to driver 2\r\n")));
goto Error;
}
//if driver 1 does has the call ,return S_OK,RIL router will resend ManageCall to driver 2
if(!bCallExist)
{
goto Error;
}
DEBUGCHK((0 <= dwID) && (dwID < ARRAY_LENGTH(g_rgfCallsInProgress))); // Otherwise, if may be necessary to increase MAX_TRACKED_CALLS
if ((0 <= dwID) && (dwID < ARRAY_LENGTH(g_rgfCallsInProgress)))
{
(void)_snprintfz(szCmd, MAX_PATH, "AT%%CHLD=7%u\r", dwID);
#if defined (WAVECOM_DRIVER)
// We need special case for data calls. We assume that
// the data call is always line 1.
// When a data call is released, we need to make sure that
// RIL gets out of data mode appropriately.
if (1 == dwID)
{
dwOpt |= CMDOPT_HANGUP;
}
#endif
}
else
{
// Special case for FTA case GSM 51.010 31.9.1.1.16 which requires us to send the command as USSD
// if there isn't an active call associated with this ID
(void)_snprintfz(szCmd, MAX_PATH, "AT+CUSD=1,\"1%u\",15\r", dwID);
dwOpt |= CMDOPT_SUPPRESSLOGGING;
fNeedNotification = FALSE;
}
fNeedSendActiveCallNet = TRUE;
}
break;
}
case RIL_CALLCMD_HOLDACTIVE_ACCEPTHELD:
{
(void)strncpyz(szCmd, "AT+CHLD=2\r", MAX_PATH);
if(!RILDrv_CC_IsCallStatusExist(stShareMemOpt.nRILDriver1CallStatus,CALL_STATUS_VOICE_ACTIVE))
{
IndicateCallActivityToAudioSubsystem(TRUE);
}
fNeedSendActiveCallNet = TRUE;
break;
}
case RIL_CALLCMD_HOLDALLBUTONE:
{
//if driver 1 does not has 1st voice call or data call,then route to driver 2 and return S_OK
if((!RILDrv_CC_IsCallExist(stShareMemOpt.nRILDriver1CallFlag,CALL_FLAG_VOICE_FIRST))
&& (!RILDrv_CC_IsCallExist(stShareMemOpt.nRILDriver1CallFlag,CALL_FLAG_CSD)))
{
RETAILMSG(1, (TEXT("[TI]RILDrv_ManageCalls:RELEASEACTIVE_ACCEPTHELD:Driver 1 does not has 1st voice and data call,route to driver 2\r\n")));
goto Error;
}
//if driver 2 has 1st voice call or csd call,driver 1 send cmd ,then route to driver 2 and return S_OK
if((RILDrv_CC_IsCallExist(stShareMemOpt.nRILDriver2CallFlag,CALL_FLAG_VOICE_FIRST)) ||
(RILDrv_CC_IsCallExist(stShareMemOpt.nRILDriver2CallFlag,CALL_FLAG_CSD)))
{
dwOpt |= CMDOPT_NOT_SEND_RESPONSE;
bRetS_OK = TRUE;
}
if ((0 <= dwID) && (dwID < ARRAY_LENGTH(g_rgfCallsInProgress)))
{
if(bCallExist)
{
//Active all call if neccessary
ActiveIFALLHOLD();
(void)_snprintfz(szCmd, MAX_PATH, "AT+CHLD=2%u\r", nCallIDInDriver);
}
else
{
(void)strncpyz(szCmd, "AT+CHLD=2\r", MAX_PATH);
}
if(!RILDrv_CC_IsCallStatusExist(stShareMemOpt.nRILDriver2CallStatus,CALL_STATUS_VOICE_ACTIVE))
{
IndicateCallActivityToAudioSubsystem(TRUE);
}
}
else
{
// Special case for FTA case GSM 51.010 31.9.1.1.16 which requires us to send the command as USSD
// if there isn't an active call associated with this ID
dwOpt |= CMDOPT_SUPPRESSLOGGING;
(void)_snprintfz(szCmd, MAX_PATH, "AT+CUSD=1,\"2%u\",15\r", dwID);
}
fNeedSendActiveCallNet = TRUE;
break;
}
case RIL_CALLCMD_ADDHELDTOCONF:
{
(void)strncpyz(szCmd, "AT+CHLD=3\r", MAX_PATH);
fNeedNotification = FALSE;
fNeedSendActiveCallNet = TRUE;
break;
}
case RIL_CALLCMD_ADDHELDTOCONF_DISCONNECT:
{
//if driver 1 does not has 1st voice call or data call,then route to driver 2 and return S_OK
if((!RILDrv_CC_IsCallExist(stShareMemOpt.nRILDriver1CallFlag,CALL_FLAG_VOICE_FIRST))
&& (!RILDrv_CC_IsCallExist(stShareMemOpt.nRILDriver1CallFlag,CALL_FLAG_CSD)))
{
RETAILMSG(1, (TEXT("[TI]RILDrv_ManageCalls:ADDHELDTOCONF_DISCONNECT:Driver 1 does not has 1st voice and data call,route to driver 2\r\n")));
goto Error;
}
if((!RILDrv_CC_IsCallStatusExist(stShareMemOpt.nRILDriver1CallStatus,CALL_STATUS_VOICE_ACTIVE))
|| (!RILDrv_CC_IsInConference()))
{
RETAILMSG(1, (TEXT("[TI]RILDrv_ManageCalls:ADDHELDTOCONF_DISCONNECT:Driver 1 does not has 1st hold voice call or not in conference status,route to driver 2\r\n")));
goto Error;
}
(void)strncpyz(szCmd, "AT+CHLD=4\r", MAX_PATH);
break;
}
case RIL_CALLCMD_INVOKECCBS:
{
(void)strncpyz(szCmd, "AT+CHLD=5\r", MAX_PATH);
fNeedNotification = FALSE;
break;
}
default:
// The proxy code should never let us get here
DEBUGCHK(FALSE);
}
}
//end add
if (fNeedNotification)
{
pnd = new CNotificationData;
if (pnd && !pnd->InitFromRealBlob(RIL_NOTIFY_CALLSTATECHANGED, NULL, 0))
{
delete pnd;
pnd = NULL;
}
}
if (!QueueCmd(pHandle, szCmd, dwOpt, APIID_MANAGECALLS, NULL, pnd, hr))
{
hr = E_FAIL;
goto Error;
}
pnd = NULL;
if(bRetS_OK)
{
hr = S_OK;
}
Error:
if(fNeedSendActiveCallNet)//add by sunrenhong
{
CNotificationData* pnd1 = NULL;
pnd1 = new CNotificationData;
DWORD dwActiveNet = SPECNOTIF_NETSLOT2;
if (pnd1 && !pnd1->InitFromRealBlob(RIL_NOTIFY_SPECNOTIFYACTIVECALLNET, (void*)&dwActiveNet, sizeof(dwActiveNet)))
{
delete pnd1;
pnd1 = NULL;
}
else
{
QueueCmdIgnoreRsp(APIID_NONE, NULL,CMDOPT_NOOP, g_TimeoutCmdInit, NULL, pnd1, 0, 0, 0);
}
}
if(pnd)
{
delete pnd;
}
return hr;
}
//
//
//
HRESULT RILDrv_TransferCall(DWORD dwParam, const RILADDRESS* lpAddress, const RILSUBADDRESS* lpSubAddress)
{
FUNCTION_TRACE(RILDrv_TransferCall);
#ifndef WAVECOM_DRIVER
// HW-SPECIFIC: WaveCom hardware doesn't support AT+CTFR
BYTE bTypeOfAddress;
BYTE bType;
char szAddress[MAXLENGTH_ADDRESS];
char szSubAddress[MAXLENGTH_SUBADDR];
char szCmd[CALLCTRL_CMDBUF_LENGTH];
LPSTR szWalk = szCmd;
HRESULT hrSubAddress;
HRESULT hr = S_OK;
CRilInstanceHandle* pHandle = ExtractHandle(dwParam);
if (!pHandle || !lpAddress) {
hr = E_FAIL;
goto Error;
}
// Determine address and type-of-address byte
hr = RILAddressToString(*lpAddress, szAddress, MAXLENGTH_ADDRESS, bTypeOfAddress);
if (FAILED(hr)) {
goto Error;
}
(void)_snprintfz(szWalk, CALLCTRL_CMDBUF_LENGTH - (szWalk - szCmd), "AT+CTFR=\"%s\",%u", szAddress, bTypeOfAddress);
szWalk = strchr(szWalk, '\0'); // NO_TYPO: 27
DEBUGCHK(NULL != szWalk);
if (lpSubAddress) {
hrSubAddress = RILSubAddressToString(*lpSubAddress, szSubAddress, MAXLENGTH_SUBADDR, bType);
if (SUCCEEDED(hrSubAddress)) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -