亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? callctrl.cpp

?? ril source code for Windows CE
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this sample source code is subject to the terms of the Microsoft
// license agreement under which you licensed this sample source code. If
// you did not accept the terms of the license agreement, you are not
// authorized to use this sample source code. For the terms of the license,
// please see the license agreement between you and Microsoft or, if applicable,
// see the LICENSE.RTF on your install media or the root of your tools installation.
// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES.
//
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.

Module Name:

callctrl.cpp

Abstract:


Notes:


--*/


#include "precomp.h"
#include <rilbacklight.h>

//
// Call status values
//
static const DWORD g_rgdwCallStats[] =
{
    RIL_CALLSTAT_ACTIVE,            // 0
    RIL_CALLSTAT_ONHOLD,            // 1
    RIL_CALLSTAT_DIALING,           // 2
    RIL_CALLSTAT_ALERTING,          // 3
    RIL_CALLSTAT_INCOMING,          // 4
    RIL_CALLSTAT_WAITING,           // 5
};
#define NUM_CALLSTATS   (sizeof(g_rgdwCallStats) / sizeof(DWORD))

//
// Call type values
//
const DWORD g_rgdwCallTypes[] =
{
    RIL_CALLTYPE_VOICE,             // 0
    RIL_CALLTYPE_DATA,              // 1
    RIL_CALLTYPE_FAX,               // 2
    RIL_CALLTYPE_PTT,               // 3
    RIL_CALLTYPE_VT,                // 4
    RIL_CALLTYPE_UNKNOWN,           // 5
    RIL_CALLTYPE_UNKNOWN,           // 6
    RIL_CALLTYPE_UNKNOWN,           // 7
    RIL_CALLTYPE_UNKNOWN,           // 8
    RIL_CALLTYPE_UNKNOWN,           // 9
};
const UINT NUM_CALLTYPES  =  (sizeof(g_rgdwCallTypes) / sizeof(DWORD));


//
// Line status values
//
static const DWORD g_rgdwLineStats[] =
{
    RIL_LINESTAT_READY,             // 0
    RIL_LINESTAT_UNAVAILABLE,       // 1
    RIL_LINESTAT_UNKNOWN,           // 2
    RIL_LINESTAT_RINGING,           // 3
    RIL_LINESTAT_CALLINPROGRESS,    // 4
    RIL_LINESTAT_ASLEEP,            // 5
};
#define NUM_LINESTATS   (sizeof(g_rgdwLineStats) / sizeof(DWORD))

// Defines an arbitrary maximum string length for the dial command.
// This maximum is not strictly enforced. It is used only as an aid
// for reporting a more specific error (RIL_E_DIALSTRINGTOOLONG) if
// the radio returns an error that is too generic.
#define MAX_DIAL_STRING_LENGTH      43

extern BOOL g_rfExternalCalltypeDetermination;

BOOL g_rgfCalltypeChecked[RIL_MAX_TRACKED_CALL_ID] = { FALSE };   // Initialize to FALSE
DWORD g_rgctCalltype[RIL_MAX_TRACKED_CALL_ID] = { 0 };   // Initialize to 0

DIALEDCALLDATA g_rcdDialedCallData;
extern CRITICAL_SECTION g_csDialedCallData;

extern RINGINGCALLDATA g_rcdRingingCallData;
extern CRITICAL_SECTION g_csRingingCallData;

// Define a global call type for call dialing, answering and hanging up
DWORD g_dwCallType = RIL_CALLTYPE_UNKNOWN;

VOID SetCalltypeFromCallInfo(RILCALLINFO *prci);

RILCALLINFO g_rgfCallStates[RIL_MAX_TRACKED_CALL_ID] = { 0 };
DWORD g_dwNumCallsInCallList = 0;

extern CRilHandle* g_pRilHandleDevice;

//
//
//
HRESULT RILDrv_Dial(DWORD dwParam, LPCSTR szAddress, DWORD dwType, DWORD dwOptions)
{
    FUNCTION_TRACE(RILDrv_Dial);
#if defined (NODIALING) && !defined (SHIP_BUILD)
    bool fNoDialing;
    bool fNoEmergencyDialing;
#endif // NODIALING

    CNotificationData* pnd = NULL;
    RILCONNECTINFO rci; memset(&rci,0,sizeof(rci)); // zero struct
    char szCmd[MAX_PATH];
    LPSTR szWalk = szCmd;
    const char *szDialStringStart = NULL;
    HRESULT hr = S_OK;
    LPCSTR szAddrWalk;
    DWORD dwDialOpts = CMDOPT_DIAL|CMDOPT_RETRYONSIMLOCKED;

    CRilInstanceHandle* pHandle = ExtractHandle(dwParam);
    if (!pHandle || !szAddress) {
        hr = E_FAIL;
        goto Error;
    }

#if defined (NODIALING) && !defined (SHIP_BUILD)
    // See if we want to disable dialing
    if (GetRegistryBoolean(HKEY_LOCAL_MACHINE, g_tszRegKeyRIL, TEXT("NoDialing"), &fNoDialing) && fNoDialing) {
        // We can't allow any dialing (for stress tests)
#ifndef SHIP_BUILD
        DEBUGMSG(ZONE_ERROR, (TEXT("RILDrv : E : RILDrv_Dial : Dialing is prevented: %s\r\n"), TString(szAddress)));
#endif // !SHIP_BUILD
        hr = E_FAIL;
        goto Error;
    }

    // See if we want to disable emergency dialing
    if (GetRegistryBoolean(HKEY_LOCAL_MACHINE, g_tszRegKeyRIL, TEXT("NoEmergencyDialing"), &fNoEmergencyDialing) &&
        fNoEmergencyDialing) {
        if (!strcmp(szAddress, "911") || !strcmp(szAddress, "112") || !strcmp(szAddress, "08")) {
            // We can't allow dialing of emergency numbers (for stress tests)
#ifndef SHIP_BUILD
            DEBUGMSG(ZONE_ERROR, (TEXT("RILDrv : E : RILDrv_Dial : Dialing of an emergency number is prevented: %s\r\n"), TString(szAddress)));
#endif // !SHIP_BUILD
            hr = E_FAIL;
            goto Error;
        }
    }
#endif // NODIALING

    szWalk = BeginLineSpecificCommand(szCmd, MAX_PATH, 0);

    //  Remember the current call type.
    g_dwCallType = dwType;

    switch (dwType)
    {
        case RIL_CALLTYPE_VOICE:
        case RIL_CALLTYPE_PTT:
            pnd = new CNotificationData;
            if (pnd) {
                rci.cbSize = sizeof(RILCONNECTINFO);
                rci.dwParams = RIL_PARAM_CNI_CALLTYPE;
                rci.dwCallType = dwType;
                if (!pnd->InitFromRealBlob(RIL_NOTIFY_CONNECT, &rci, sizeof(RILCONNECTINFO))) {
                    delete pnd;
                    pnd = NULL;
                }
            }
            __fallthrough;

        case RIL_CALLTYPE_DATA:
            strncpyz(szWalk,"D",MAX_PATH - (szWalk - szCmd));
            break;

        case RIL_CALLTYPE_VT:
            //  Currently VT is not supported.
            hr = E_NOTIMPL;
            goto Error;

        case RIL_CALLTYPE_FAX:
            (void)strncpyz(szWalk, "+FCLASS+1;D", MAX_PATH - (szWalk - szCmd));
            break;

        default:
            // This should have been caught in the proxy
            DEBUGCHK(FALSE);
            __fallthrough;

        case RIL_CALLTYPE_UNKNOWN:
            hr = E_INVALIDARG;
            goto Error;
    }

    szWalk = strchr(szWalk, '\0');  // NO_TYPO: 27
    DEBUGCHK(NULL != szWalk);

    szDialStringStart = szWalk;

    // Copy the number in
    szAddrWalk = szAddress;
    const char * const pcszCmdEnd = &szCmd[ ARRAY_LENGTH(szCmd)-1 ];
    while( szWalk < pcszCmdEnd && *szAddrWalk != '\0' )
    {
        // Only allow characters in the set specified by GSM 07.07 section 6.2
        if (strchr("1234567890*#+ABCD,TP!W@",*szAddrWalk))
        {
            *szWalk++ = *szAddrWalk;
        }
        szAddrWalk++;
    }

    // If the dial string is really long, make a note in case the
    // command fails with a generic error. We can then guess that
    // the real error is that the dial string was too long.
    if ((szWalk - szDialStringStart) > MAX_DIAL_STRING_LENGTH)
    {
        dwDialOpts |= CMDOPT_LONGDIALSTRING;
    }

    if ( szWalk == szDialStringStart )
    {
        // No valid chars processed
        hr = E_INVALIDARG;
        goto Error;
    }

    // Remember to paste on the terminating '\0'
    *szWalk='\0';

    if (dwOptions & RIL_DIALOPT_CLOSEDGROUP) {
        (void)strncpyz(szWalk, "G", MAX_PATH - (szWalk - szCmd));
        szWalk++;
    }

    if (dwOptions & RIL_DIALOPT_RESTRICTID) {
        (void)strncpyz(szWalk, "I", MAX_PATH - (szWalk - szCmd));
        szWalk++;
    }
    else if (dwOptions & RIL_DIALOPT_PRESENTID) {
        (void)strncpyz(szWalk, "i", MAX_PATH - (szWalk - szCmd));
        szWalk++;
    }

    // If it's not a data call, terminate with a ; character
    if ((dwType==RIL_CALLTYPE_VOICE)||(dwType==RIL_CALLTYPE_PTT))
    {
        (void)strncpyz(szWalk, ";", MAX_PATH - (szWalk - szCmd));
        szWalk++;
    }
    else if (dwType==RIL_CALLTYPE_DATA)
    {
        dwDialOpts |= CMDOPT_DELAYCONNECTRSP;
    }

    (void)strncpyz(szWalk, "\r", MAX_PATH - (szWalk - szCmd));

    // perform external calltype determination processing
    if (g_rfExternalCalltypeDetermination)
    {
        //  There is no call id associated with the the dialed call yet,
        //  so store the calltype so it can be used later
        EnterCriticalSection(&g_csDialedCallData);
        g_rcdDialedCallData.fValid = TRUE;
        g_rcdDialedCallData.dwCalltype = dwType;
        MultiByteToWideChar(CP_ACP, 0, szAddress, MAXLENGTH_ADDRESS, g_rcdDialedCallData.wszAddress, MAXLENGTH_ADDRESS);
        DEBUGMSG(ZONE_INFO, (TEXT("RILDrv : i : RILDrv_Dial : Setting g_rcdDialedCallData calltype = %d, address = %s.\r\n"), g_rcdDialedCallData.dwCalltype, g_rcdDialedCallData.wszAddress));
        LeaveCriticalSection(&g_csDialedCallData);
    }

    if ((dwType==RIL_CALLTYPE_VOICE)||(dwType==RIL_CALLTYPE_PTT))
    {
        // Indicate call is active to audio driver
        IndicateCallActivityToAudioSubsystem(TRUE, FALSE);
    }

    if (!QueueCmd(pHandle, szCmd, dwDialOpts, APIID_DIAL, NULL, pnd, hr)) {
        hr = E_FAIL;
        goto Error;
    }
    pnd = NULL;

Error:
    if ( E_FAIL == hr )
    {
        // Indicate call is inactive to audio driver only if call list is empty
        IndicateCallActivityToAudioSubsystem(FALSE, TRUE);
    }

    return hr;
}


//
//
//
HRESULT RILDrv_Answer(DWORD dwParam)
{
    FUNCTION_TRACE(RILDrv_Answer);
    CNotificationData* pnd = NULL;
    RILCONNECTINFO rci; memset(&rci,0,sizeof(rci)); // zero struct
    HRESULT hr = S_OK;
    CRilInstanceHandle* pHandle = ExtractHandle(dwParam);
    if (!pHandle) {
        hr = E_FAIL;
        goto Error;
    }

    // Set up the voice connect notification. If  incoming call is a data call,
    //    we will get a "CONNECT" instead of "OK", which will prevent this notification
    //    from being sent
    pnd = new CNotificationData;
    if (pnd) {
        rci.cbSize = sizeof(RILCONNECTINFO);
        rci.dwParams = RIL_PARAM_CNI_CALLTYPE;
        rci.dwCallType = g_dwCallType;

        // check for externally determined calltype
        if (g_rfExternalCalltypeDetermination)
        {
            //  There may be no call id associated with the call yet,
            //  so use the previously stored calltype
            EnterCriticalSection(&g_csRingingCallData);
            if (g_rcdRingingCallData.fCalltypeValid)
            {
                rci.dwCallType = g_rcdRingingCallData.dwCalltype;
                DEBUGMSG(ZONE_INFO, (TEXT("RILDrv : i : RILDrv_Answer : using calltype %d.\r\n"), g_rcdRingingCallData.dwCalltype));
                g_rcdRingingCallData.dwCalltype = RIL_CALLTYPE_UNKNOWN;
                g_rcdRingingCallData.fCalltypeValid = FALSE;
                //  Just in case there was a call id, clear the associated ringing call globals
                g_rcdRingingCallData.fCallIdValid = FALSE;
                g_rcdRingingCallData.dwCallId = RIL_MAX_TRACKED_CALL_ID;
            }
            DEBUGMSG(ZONE_INFO, (TEXT("RILDrv : i : RILDrv_Answer : Ringing Call TypeValid = %d, type = %d, IdValid = %d, Id = %d, \r\n"), 
                g_rcdRingingCallData.fCalltypeValid, g_rcdRingingCallData.dwCalltype,g_rcdRingingCallData.fCallIdValid,g_rcdRingingCallData.dwCallId));
            LeaveCriticalSection(&g_csRingingCallData);
        }
        
        if (!pnd->InitFromRealBlob(RIL_NOTIFY_CONNECT, &rci, sizeof(RILCONNECTINFO))) {
            delete pnd;
            pnd = NULL;
        }
    }

    // Indicate call is active to audio driver
    IndicateCallActivityToAudioSubsystem(TRUE, FALSE);

    if ( RIL_CALLTYPE_VT == g_dwCallType )
        {
        //  Currently VT is not supported.
        delete pnd;
        pnd = NULL;
        hr = E_FAIL;
        goto Error;
        }
    else if (!QueueCmd(pHandle, "ATA\r", CMDOPT_ANSWER, APIID_ANSWER, NULL, pnd, hr)) {
        hr = E_FAIL;
        goto Error;
    }
    pnd = NULL;

Error:
    if (E_FAIL == hr) 
    {
        // Indicate call is inactive to audio driver only if call list is empty
        IndicateCallActivityToAudioSubsystem(FALSE, TRUE);
    }

    if ( RIL_CALLTYPE_VT == g_dwCallType )
        {
        //  Currently VT is not supported.
        hr = E_NOTIMPL;
        }

    return hr;
}


//
//
//
HRESULT RILDrv_Hangup(DWORD dwParam)
{
    FUNCTION_TRACE(RILDrv_Hangup);
    CNotificationData* pnd = NULL;
    BOOL fSuccess;
    HRESULT hr = S_OK;
    CRilInstanceHandle* pHandle = ExtractHandle(dwParam);
    if (!pHandle) {
        hr = E_FAIL;
        goto Error;
    }

    pnd = new CNotificationData;
    if (pnd) {
        if (pHandle->FPreferred()) {
            fSuccess = pnd->InitFromRealBlob(RIL_NOTIFY_EMERGENCYHANGUP, NULL, 0);
        } else {
           // must notify of disconnect here since this lets drivers go to lower power state
            fSuccess = pnd->InitFromDWORDBlob(RIL_NOTIFY_DISCONNECT, RIL_DISCINIT_LOCAL);
        }
        if (!fSuccess) {
            delete pnd;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕+乱码+中文字幕一区| 亚洲第一搞黄网站| 一级日本不卡的影视| 美美哒免费高清在线观看视频一区二区 | 欧美mv和日韩mv国产网站| 久久精品欧美一区二区三区麻豆| 亚洲bt欧美bt精品| 99久久精品情趣| 久久久久久久久久久久久久久99| 亚洲国产精品久久人人爱| 国产成a人亚洲精品| 91精品国产综合久久久久久久| 中文字幕日韩精品一区| 国产精品夜夜嗨| 日韩一区和二区| 五月婷婷久久综合| 91影院在线观看| 久久精品一区蜜桃臀影院| 日本亚洲视频在线| 欧美美女直播网站| 亚洲高清在线视频| 欧美视频一二三区| 一区二区三区四区在线| 91免费小视频| 亚洲欧洲日产国产综合网| 国产福利视频一区二区三区| 欧美xxxxxxxxx| 青青国产91久久久久久| 欧美老肥妇做.爰bbww视频| 一区二区三区加勒比av| 日本高清视频一区二区| 亚洲免费观看高清| 在线精品视频免费播放| 蜜臀av一级做a爰片久久| 欧美日本韩国一区二区三区视频| 亚洲一区二区三区美女| 欧美性感一区二区三区| 午夜欧美电影在线观看| 欧美美女视频在线观看| 免费欧美高清视频| 久久久精品影视| 国产99精品国产| 国产精品看片你懂得| 色综合av在线| 性做久久久久久免费观看欧美| 欧美人妇做爰xxxⅹ性高电影| 日韩国产欧美一区二区三区| 日韩午夜电影av| 国产裸体歌舞团一区二区| 中文字幕乱码日本亚洲一区二区| 99国产精品99久久久久久| 亚洲精品乱码久久久久久| 欧美日韩aaaaa| 国内精品第一页| 亚洲视频每日更新| 欧美日韩高清一区二区三区| 极品少妇xxxx精品少妇偷拍| 国产精品久久久久三级| 欧美性猛交xxxx黑人交| 激情综合网天天干| 久久久电影一区二区三区| 色噜噜久久综合| 男人的天堂久久精品| 欧美激情一区二区三区四区| 欧美丝袜丝交足nylons图片| 国产一区二区三区在线观看精品| 成人欧美一区二区三区小说| 91麻豆精品国产91久久久久久| 国内久久婷婷综合| 樱花草国产18久久久久| 精品国产1区2区3区| 91在线丨porny丨国产| 麻豆精品新av中文字幕| 日韩精品高清不卡| 国产精品对白交换视频| 偷拍日韩校园综合在线| 欧美成人aa大片| av中文一区二区三区| 日本午夜一本久久久综合| 日本一区二区三区四区| 欧美美女一区二区| av网站免费线看精品| 蜜臀av一区二区三区| 亚洲免费伊人电影| 久久久久久久久久久99999| 欧美网站一区二区| 成人av在线播放网址| 精品中文av资源站在线观看| 亚洲伦理在线精品| 中文字幕成人在线观看| 欧美一区二区视频免费观看| 91视频精品在这里| 国产成人综合网站| 免费高清在线视频一区·| 亚洲一区二区视频在线| 国产亚洲婷婷免费| 91精品在线免费| 色爱区综合激月婷婷| 成人亚洲精品久久久久软件| 免费成人av资源网| 婷婷综合在线观看| 亚洲午夜精品17c| 中文字幕日本不卡| 国产精品久久久爽爽爽麻豆色哟哟 | 福利视频网站一区二区三区| 日韩av电影免费观看高清完整版在线观看| 亚洲天堂精品在线观看| 国产精品狼人久久影院观看方式| 久久久99精品免费观看| 精品国产1区二区| 久久免费视频一区| 久久精品一区二区三区不卡| 欧美精品一区二区不卡| 久久综合五月天婷婷伊人| 精品久久国产老人久久综合| 日韩精品一区二区三区视频播放 | 成人免费视频播放| 国产东北露脸精品视频| 国产91在线看| 丁香婷婷综合色啪| 成人黄色片在线观看| 99精品国产99久久久久久白柏| 白白色 亚洲乱淫| 色婷婷激情久久| 91传媒视频在线播放| 欧美色男人天堂| 欧美一区二区三区在线视频| 日韩一级完整毛片| www久久精品| 国产精品国产三级国产普通话蜜臀| 日本一区二区高清| 亚洲图片另类小说| 亚洲午夜一区二区| 毛片av一区二区| 国产精品影视网| 91性感美女视频| 精品视频在线看| 精品国产第一区二区三区观看体验 | 欧美激情一区在线观看| 中文字幕一区二区三区四区| 一区二区三区在线视频观看58| 五月天激情综合| 国内精品国产成人| 99久久精品国产观看| 欧美日韩卡一卡二| 久久久久久黄色| 亚洲愉拍自拍另类高清精品| 美女脱光内衣内裤视频久久网站| 国产成人午夜电影网| 色8久久精品久久久久久蜜| 91精品国产综合久久国产大片| 欧美精品一区二区高清在线观看| 亚洲欧美国产毛片在线| 热久久久久久久| 国产精品精品国产色婷婷| 69堂国产成人免费视频| 精品捆绑美女sm三区| 国产精品高潮呻吟| 蜜桃视频在线观看一区| 91视视频在线观看入口直接观看www | 亚洲图片欧美综合| 韩国成人在线视频| 99久久久久久| 久久亚洲二区三区| 亚洲一二三四区不卡| 成人av动漫在线| 2021中文字幕一区亚洲| 亚洲一区二区三区免费视频| 国产盗摄一区二区| 日韩一级片网址| 一级日本不卡的影视| 懂色中文一区二区在线播放| 日韩免费一区二区三区在线播放| 亚洲欧美另类久久久精品| 国产黑丝在线一区二区三区| 51久久夜色精品国产麻豆| 亚洲精选视频在线| 国产超碰在线一区| 精品成人私密视频| 蜜桃av一区二区| 在线综合视频播放| 亚洲另类色综合网站| 99久久精品国产精品久久| 国产欧美日韩综合精品一区二区| 免费高清在线视频一区·| 欧美日韩一区二区三区高清| 亚洲男人的天堂在线观看| 99免费精品视频| 国产精品嫩草久久久久| 国产一区 二区 三区一级| 精品国产免费一区二区三区四区| 午夜激情综合网| 欧美精品在线视频| 亚洲国产成人高清精品| 91年精品国产| 亚洲精品国产成人久久av盗摄| 色综合久久久久久久久| 亚洲黄色av一区| 在线观看日韩精品| 亚洲成年人影院|