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

📄 misc.cpp

📁 手机RILGSM实现的源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
//
// 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 OR INDEMNITIES.
//
/*++
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.
Copyright (c) 1995-1999  Microsoft Corporation

Module Name:

misc.cpp

Abstract:


Notes:

--*/
//------------------------------------------------------------------------------
//    Revision History
//    Date                        Author                Activity ID                         Activity Headline
//    2006-02-05          zhangchunzhong    CEDB00005394        send at command to make phone to detach from PLMM
//    2006-03-02		 sunhongzhe	        CEDB00007685        modify IEMI number display
//    2006-03-03          wangzhengang      CEDB00007941        service display  error
//    2006-03-07          wangzhengang      CEDB00008454        signal display   inexactness
//    2006-03-13          caibeibei              CEDB00009451         remove 手机主界面显示通信运营商错误
//    2006-03-17          wuguangliang        CEDB00010269         synchronize to disable gsm report when suspend 
//    2006-03-27          Fuxiangbing          CEDB00007743          Display error operator name when 6f14 has content
//    2006-03-31          Liuhongjie             CEDB00011160         Restore old source code
//    2006-03-31          wuguangliang        CEDB00012466         Change power saving mode when radio off
//    2006-04-03          caohongsheng       CEDB00012366         Error message display when entering STK items
//    2006-04-11          Fuxiangbing           CEDB00013581         modify operator name
//   2006-04-07         zhangchunzhong   CEDB00012896            手机sleep一段时间后唤醒,gprs图标显示连接状态,但是实际连接不到网络
//   2006-04-04         qianyili           CEDB00012591            在查看通话记录界面时,没有任何内容显示
//   2006-05-17         Fuxiangbing        CEDB200000907           防止连续关闭打开电话无SIM卡
//    2006-05-24        zhaojian                CEDB200001182                 Fix bug for GPRS connection when power resume
//    2006-06-16        Fuxiangbing         CEDB200002792          手机插入159a卡出现漫游图标
//    2006-06-27        Fuxiangbing         CEDB200003545         使用159号段sim卡网络信号显示为满格但是无法呼出电话
//    2006-07-31        Fuxiangbing         CEDB200006623         无线管理器:多次打开关闭电话功能后,电话功能无法再开启
//    2007-01-29        XieFei         CEDB200042432         modify phone book module for exporting
//    2007-03-12         likai                   CEDB200047681	   modify for net state
//    2007-03-27         likai                   CEDB200049188	    Upgrade codes to Crossbow
//    2007-03-12         likai                   CEDB200046725	   modify for net state
//    2007-07-13        wangwei53        WM600010076             write IMEI into register
//    2007-07-18         xiangming               WM600010395       add the G/E icon function
//    2007-09-19        Cuiguoqing      WM600017468              Modify register table [System\\State\\Phone\\SignalStrength2] value so that meet App requirement.
//  2007-11-13         Cuiguoqing               WM600022632          reset the the last bit of phonebook register table for alternating master card. 
//    2007-11-20      qinxuetao       WM600022996          modify ParseGetEquipmentInfo
//    2007-11-30       Cuiguoqing       WM600019817         If DF and TI can also register on network, the two signalbar will be displayed on base of TI modem.
//    2007-12-06        Cuiguoqing       WM600025007          Modify for offering a IMEI and IMSI api Interface on ver2.13.
//  2007-12-25       Cuiguoqing       WM600025698      Modify for getting IMEI and IMSI but doesn't affect TI protocol stack.
//  2008-01-07      qinxuetao          WM600027958      Save the last equipment state in g2_dwEquipmentState
//  2008-01-15       Cuiguoqing       WM600029093      Modify for getting  IMSI but doesn't affect TI protocol stack again in ver3.0.
//  2008-02-22      zhongchuren    WM600031915          display Spn name in idle
//    2008-02-02        yingmingbo       WM600030877	   add IOCTL_RILEXT_GETCONTACTNAMEINFO for querying phonebook encode info 
//------------------------------------------------------------------------------

#include "precomp.h"
#undef assert
#include <safeint.hxx>

#ifdef RIL_ALLOW_UNICODE_PBENTRIES
#define ALLOW_UNICODE_PB_ENTRIES TRUE
#else
#define ALLOW_UNICODE_PB_ENTRIES FALSE
#endif

//#ifdef RIL_RADIO_RESILIENCE
// Define a global variable to save the new state of the radio that persists across rebooting
DWORD g_dwEquipmentState;
//#endif

#if defined(OEM1_DRIVER) || defined(OEM2_DRIVER)
extern BOOL g_bRadioOff;
#endif
extern RILLOCATIONINFO g_rliLocationInfo;
extern BOOL g_fInitialLocationInfoReceived;
extern BOOL g_bChangedPrimaryCard;

#ifdef RIL_FIX_CMCC_NETWORK_ISSUE
extern BOOL g_bCIMIFlag;
#endif

#ifdef OFFER_IMEI_IMSI
extern BOOL g_bFirstGetIMSI;
#endif
extern HRESULT ParseGetGPRSContextActivatedList(LPCSTR szRsp, void*& pBlob, UINT& cbBlob);
extern DWORD g_bNetworkSystemType;  //xiangming add for the G/E icon function at 070718
//
// Equipment states
//
static const DWORD g_rgdwEquipmentStates[] =
{
    -1,     // RIL_EQSTATE_UNKNOWN
    0,      // RIL_EQSTATE_MINIMUM
    1,      // RIL_EQSTATE_FULL
    2,      // RIL_EQSTATE_DISABLETX
    3,      // RIL_EQSTATE_DISABLERX
    4,      // RIL_EQSTATE_DISABLETXANDRX
};
#define NUM_EQSTATES    (sizeof(g_rgdwEquipmentStates) / sizeof(DWORD))


//
// Phonebook storage locations
//
static const LPCSTR g_rgszPBLocations[] =
{
    "",             // RIL_PBLOC_UNKNOWN
    "EN",           // RIL_PBLOC_SIMEMERGENCY
    "FD",           // RIL_PBLOC_SIMFIXDIALING
    "LD",           // RIL_PBLOC_SIMLASTDIALING
    "ON",           // RIL_PBLOC_OWNNUMBERS
#ifdef OEM1_DRIVER
    "MT",           // RIL_PBLOC_SIMPHONEBOOK (MT is used for TI phonebook)
#else
    "SM",           // RIL_PBLOC_SIMPHONEBOOK   (Used by OEM2 and Wavecom)
#endif
};
#define NUM_PBLOCS     (sizeof(g_rgszPBLocations) / sizeof(LPCSTR))


//
// Bit error rates
//
static const DWORD g_rgdwBitErrorRates[] =
{
    14,     // 0
    28,     // 1
    57,     // 2
    113,    // 3
    226,    // 4
    453,    // 5
    905,    // 6
    1810,   // 7
};
#define NUM_BITERRORRATES     (sizeof(g_rgdwBitErrorRates) / sizeof(DWORD))


//
// Restricted SIM commands
//
static const DWORD g_rgdwRestrictedSIMCmds[] =
{
    -1,     // 0
    176,    // RIL_SIMCMD_READBINARY
    178,    // RIL_SIMCMD_READRECORD
    192,    // RIL_SIMCMD_GETRESPONSE
    214,    // RIL_SIMCMD_UPDATEBINARY
    220,    // RIL_SIMCMD_UPDATERECORD
    242,    // RIL_SIMCMD_STATUS
};
#define NUM_RESTRICTEDSIMCMDS   (sizeof(g_rgdwRestrictedSIMCmds) / sizeof(DWORD))


//
//
//
static const DWORD g_rgdwSIMToolkitTermCauses[] =
{
    -1,     // 0
    0,      // RIL_SIMTKITTERMCAUSE_USERSTOPPEDREDIAL
    1,      // RIL_SIMTKITTERMCAUSE_ENDOFREDIAL
    2,      // RIL_SIMTKITTERMCAUSE_USERENDEDSESSION
};
#define NUM_SIMTOOLKITTERMCAUSES   (sizeof(g_rgdwSIMToolkitTermCauses) / sizeof(DWORD))


//
//
//
ENCODE_TYPE g_EncodeType = ENCODE_NONE;
BOOL g_bEncodeHex = FALSE;

//
//
//
HRESULT ParseGetEquipmentInfo(LPCSTR szRsp, void*& pBlob, UINT& cbBlob)
{
    FUNCTION_TRACE(ParseGetEquipmentInfo);
    RILEQUIPMENTINFO* prei = NULL;
#ifdef RIL_WATSON_REPORT
    RILEQUIPMENTINFO* preiCache = &(g_RilInfoCache.rileiEquipmentInfo);
#endif // RIL_WATSON_REPORT
    HRESULT hr = S_OK;
    TCHAR Imeivalue[MAX_PATH] = {0};

    pBlob = NULL;
    cbBlob = 0;

    prei = (RILEQUIPMENTINFO*)AllocBlob(sizeof(RILEQUIPMENTINFO));
    if (!prei) {
        hr = E_OUTOFMEMORY;
        goto Error;
    }
    memset(prei, 0x00, sizeof(RILEQUIPMENTINFO));
    prei->cbSize = sizeof(RILEQUIPMENTINFO);

#ifdef RIL_WATSON_REPORT
    // Clear equipment info cache
    memset(preiCache, 0x00, sizeof(RILEQUIPMENTINFO));
    preiCache->cbSize = sizeof(RILEQUIPMENTINFO);
#endif // RIL_WATSON_REPORT

    // Parse "<prefix><manufacturer_id><postfix>"
    if (!ParseRspPrefix(szRsp, szRsp)                                                       ||
        !ParseUnquotedString(szRsp, '\r', prei->szManufacturer, MAXLENGTH_EQUIPINFO, szRsp) ||
        !ParseRspPostfix(szRsp, szRsp)) {
        hr = E_FAIL;
        goto Error;
    }
    prei->dwParams |= RIL_PARAM_EI_MANUFACTURER;

#ifdef RIL_WATSON_REPORT
    // Copy to cache
    strncpy(preiCache->szManufacturer, prei->szManufacturer, MAXLENGTH_EQUIPINFO);
    preiCache->dwParams |= RIL_PARAM_EI_MANUFACTURER;
#endif // RIL_WATSON_REPORT

    // Parse "<prefix><model_id><postfix>"
    if (!ParseRspPrefix(szRsp, szRsp)                                                ||
        !ParseUnquotedString(szRsp, '\r', prei->szModel, MAXLENGTH_EQUIPINFO, szRsp) ||
        !ParseRspPostfix(szRsp, szRsp)) {
        hr = E_FAIL;
        goto Error;
    }
    prei->dwParams |= RIL_PARAM_EI_MODEL;

#ifdef RIL_WATSON_REPORT
    // Copy to cache
    strncpy(preiCache->szModel, prei->szModel, MAXLENGTH_EQUIPINFO);
    preiCache->dwParams |= RIL_PARAM_EI_MODEL;
#endif // RIL_WATSON_REPORT

    // Parse "<prefix><revision_id><postfix>"
    if (!ParseRspPrefix(szRsp, szRsp)                                                   ||
        !ParseUnquotedString(szRsp, '\r', prei->szRevision, MAXLENGTH_EQUIPINFO, szRsp) ||
        !ParseRspPostfix(szRsp, szRsp)) {
        hr = E_FAIL;
        goto Error;
    }
    prei->dwParams |= RIL_PARAM_EI_REVISION;

#ifdef RIL_WATSON_REPORT
    // Copy to cache
    strncpy(preiCache->szRevision, prei->szRevision, MAXLENGTH_EQUIPINFO);
    preiCache->dwParams |= RIL_PARAM_EI_REVISION;
#endif // RIL_WATSON_REPORT

    // Parse "<prefix><serial_number><postfix>"
    if (!ParseRspPrefix(szRsp, szRsp)                                                       ||
        !ParseUnquotedString(szRsp, '\r', prei->szSerialNumber, MAXLENGTH_EQUIPINFO, szRsp) ||
        !ParseRspPostfix(szRsp, szRsp)) {
        hr = E_FAIL;
        goto Error;
    }
    //cut IMEI to 15
    prei->szSerialNumber[15] = '\0';
        
    prei->dwParams |= RIL_PARAM_EI_SERIALNUMBER;

#ifdef RIL_WATSON_REPORT
    // Copy to cache
    strncpy(preiCache->szSerialNumber, prei->szSerialNumber, MAXLENGTH_EQUIPINFO);
    preiCache->dwParams |= RIL_PARAM_EI_SERIALNUMBER;
#endif // RIL_WATSON_REPORT

    //write into register
    MultiByteToWideChar(CP_ACP,0,prei->szSerialNumber,strlen(prei->szSerialNumber),Imeivalue,MAX_PATH);//char to wchar
    if (SetRegistrySZ(HKEY_LOCAL_MACHINE, TEXT("System\\CardInfo\\Card2"), TEXT("IMEI"),  Imeivalue))
    {
        RETAILMSG(1 ,(TEXT("[TI]ParseGetEquipmentInfo: set IMEI success [%s] \r\n"),Imeivalue));
    }
    else 
    {
        RETAILMSG(1,  (TEXT("[TI] ParseGetEquipmentInfo: set IMEI failed\r\n")));
    }
    //write end



    pBlob = (void*)prei;
    cbBlob = sizeof(RILEQUIPMENTINFO);

Error:
    if (FAILED(hr)) {
        FreeBlob(prei);
    }
    return hr;
}


//
//
//
HRESULT RILDrv_GetEquipmentInfo(DWORD dwParam)
{
    FUNCTION_TRACE(RILDrv_GetEquipmentInfo);
    HRESULT hr = S_OK;
    CRilInstanceHandle* pHandle = ExtractHandle(dwParam);
    if (!pHandle) {
        hr = E_FAIL;
        goto Error;
    }

#ifdef OEM1_DRIVER
    if (!QueueCmd(pHandle, "AT+CGMI;+CGMM;+CGMR;D*#06#\r", CMDOPT_NONE|CMDOPT_IGNORERADIOOFF, APIID_GETEQUIPMENTINFO,
#else
    if (!QueueCmd(pHandle, "AT+CGMI;+CGMM;+CGMR;+CGSN\r", CMDOPT_NONE, APIID_GETEQUIPMENTINFO,
#endif // OEM1_DRIVER
                  ParseGetEquipmentInfo, NULL, hr)) {
        hr = E_FAIL;
        goto Error;
    }

Error:
    return hr;
}

//
// Helper function to fill RILEQUIPMENTSTATE structure and implement
// driver-specific RIL_RADIOSUPPORT_* mapping.
//
void FillEquipmentStateStruct(RILEQUIPMENTSTATE * pres, DWORD dwEqState)
{
    DEBUGCHK(NULL != pres);

    memset(pres, 0x00, sizeof(RILEQUIPMENTSTATE));

    pres->cbSize = sizeof(RILEQUIPMENTSTATE);
    pres->dwParams = RIL_PARAM_EQUIPMENTSTATE_ALL;
    pres->dwEqState = dwEqState;
    pres->dwReadyState = g_dwReadyState;
    if (RIL_EQSTATE_UNKNOWN == dwEqState)
    {
        pres->dwRadioSupport = RIL_RADIOSUPPORT_UNKNOWN;
    }
    else
    {
        pres->dwRadioSupport = (dwEqState == RIL_EQSTATE_FULL) ? RIL_RADIOSUPPORT_ON : RIL_RADIOSUPPORT_OFF;
    }
}

//
//
//
HRESULT ParseGetEquipmentState(LPCSTR szRsp, void*& pBlob, UINT& cbBlob)
{
    FUNCTION_TRACE(ParseGetEquipmentState);
    UINT nValue;
    DWORD dwState;
    RILEQUIPMENTSTATE * pres = NULL;
    UINT i;
    HRESULT hr = S_OK;

    pBlob = NULL;
    cbBlob = 0;

    pres = (RILEQUIPMENTSTATE*)AllocBlob(sizeof(RILEQUIPMENTSTATE));
    if (!pres) {
        hr = E_OUTOFMEMORY;
        goto Error;
    }

    // Parse "<prefix>+CFUN: <state><postfix>"
    if (!ParseRspPrefix(szRsp, szRsp)                  ||
        !MatchStringBeginning(szRsp, "+CFUN: ", szRsp) ||
        !ParseUInt(szRsp, TRUE, nValue, szRsp)         ||
        !ParseRspPostfix(szRsp, szRsp)) {
        hr = E_FAIL;
        goto Error;
    }

    for (i = 0; i < NUM_EQSTATES; i++) {
        if (nValue == g_rgdwEquipmentStates[i]) {
            dwState = i;
            break;
        }
    }
    if (NUM_EQSTATES == i) {
        // We couldn't match the response with anything
        dwState = RIL_EQSTATE_UNKNOWN;
    }

    if (RIL_EQSTATE_MINIMUM == dwState || RIL_EQSTATE_DISABLETXANDRX == dwState)
    {
        DWORD dwState2 = SPECNOTIF_NETRADIOOFF;
        if (SetRegistryDWORD(HKEY_LOCAL_MACHINE, TEXT("System\\State\\Phone"), TEXT("State2"), dwState2) )
        {
            RETAILMSG(1 ,(TEXT("[TI]ParseGetEquipmentState success set reg net state 2, value is %d. \r\n"), dwState2));
        }
        else
        {
            RETAILMSG(1 ,(TEXT("[TI]ParseGetEquipmentState fail set reg net state 2, value is %d. \r\n"), dwState2));
        }
    }

    FillEquipmentStateStruct(pres, dwState);

    pBlob = (void*)pres;
    cbBlob = pres->cbSize;

#ifdef OEM2_DRIVER
    g_bRadioOff = dwState == RIL_EQSTATE_MINIMUM;
#endif

Error:
    if (FAILED(hr)) {
        FreeBlob(pres);
    }
    return hr;
}


//
//
//

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -