⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 callctrl.cpp

📁 手机RILGSM实现的源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
                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 + -