📄 misc.cpp
字号:
//
// 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 + -