📄 caps.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.
//
#include "precomp.h"
//
// NOTE: all the following mapping arrays must be kept sorted in the left column
// (this is needed, because they're used for binary search)
//
//
// Call management commands
//
static const LISTVALUEMAP g_rglvmCapsCallCmds[] =
{
{ 0, RIL_CAPS_CALLCMD_RELEASEHELD },
{ 1, RIL_CAPS_CALLCMD_RELEASEACTIVE_ACCEPTHELD },
{ 2, RIL_CAPS_CALLCMD_HOLDACTIVE_ACCEPTHELD },
{ 3, RIL_CAPS_CALLCMD_ADDHELDTOCONF },
{ 4, RIL_CAPS_CALLCMD_ADDHELDTOCONF_DISCONNECT },
{ 5, RIL_CAPS_CALLCMD_INVOKECCBS },
{ 11, RIL_CAPS_CALLCMD_RELEASECALL },
{ 12, RIL_CAPS_CALLCMD_RELEASECALL },
{ 13, RIL_CAPS_CALLCMD_RELEASECALL },
{ 14, RIL_CAPS_CALLCMD_RELEASECALL },
{ 15, RIL_CAPS_CALLCMD_RELEASECALL },
{ 16, RIL_CAPS_CALLCMD_RELEASECALL },
{ 17, RIL_CAPS_CALLCMD_RELEASECALL },
{ 18, RIL_CAPS_CALLCMD_RELEASECALL },
{ 19, RIL_CAPS_CALLCMD_RELEASECALL },
{ 21, RIL_CAPS_CALLCMD_HOLDALLBUTONE },
{ 22, RIL_CAPS_CALLCMD_HOLDALLBUTONE },
{ 23, RIL_CAPS_CALLCMD_HOLDALLBUTONE },
{ 24, RIL_CAPS_CALLCMD_HOLDALLBUTONE },
{ 25, RIL_CAPS_CALLCMD_HOLDALLBUTONE },
{ 26, RIL_CAPS_CALLCMD_HOLDALLBUTONE },
{ 27, RIL_CAPS_CALLCMD_HOLDALLBUTONE },
{ 28, RIL_CAPS_CALLCMD_HOLDALLBUTONE },
{ 29, RIL_CAPS_CALLCMD_HOLDALLBUTONE },
};
#define NUM_CAPSCALLCMDS (sizeof(g_rglvmCapsCallCmds) / sizeof(LISTVALUEMAP))
//
// Bearer service connection speeds (first set)
//
static const LISTVALUEMAP g_rglvmCapsConnSpeeds1[] =
{
{ 0, RIL_CAPS_SPEED1_AUTO },
{ 1, RIL_CAPS_SPEED1_300_V21 },
{ 2, RIL_CAPS_SPEED1_1200_V22 },
{ 3, RIL_CAPS_SPEED1_1200_75_V23 },
{ 4, RIL_CAPS_SPEED1_2400_V22BIS },
{ 5, RIL_CAPS_SPEED1_2400_V26TER },
{ 6, RIL_CAPS_SPEED1_4800_V32 },
{ 7, RIL_CAPS_SPEED1_9600_V32 },
{ 12, RIL_CAPS_SPEED1_9600_V34 },
{ 14, RIL_CAPS_SPEED1_14400_V34 },
{ 15, RIL_CAPS_SPEED1_19200_V34 },
{ 16, RIL_CAPS_SPEED1_28800_V34 },
{ 34, RIL_CAPS_SPEED1_1200_V120 },
{ 36, RIL_CAPS_SPEED1_2400_V120 },
{ 38, RIL_CAPS_SPEED1_4800_V120 },
{ 39, RIL_CAPS_SPEED1_9600_V120 },
{ 43, RIL_CAPS_SPEED1_14400_V120 },
{ 47, RIL_CAPS_SPEED1_19200_V120 },
{ 48, RIL_CAPS_SPEED1_28800_V120 },
{ 49, RIL_CAPS_SPEED1_38400_V120 },
{ 50, RIL_CAPS_SPEED1_48000_V120 },
{ 65, RIL_CAPS_SPEED1_300_V110 },
{ 66, RIL_CAPS_SPEED1_1200_V110 },
{ 68, RIL_CAPS_SPEED1_2400_V110 },
{ 70, RIL_CAPS_SPEED1_4800_V110 },
{ 71, RIL_CAPS_SPEED1_9600_V110 },
{ 75, RIL_CAPS_SPEED1_14400_V110 },
{ 79, RIL_CAPS_SPEED1_19200_V110 },
{ 80, RIL_CAPS_SPEED1_28800_V110 },
{ 81, RIL_CAPS_SPEED1_38400_V110 },
{ 82, RIL_CAPS_SPEED1_48000_V110 },
{ 83, RIL_CAPS_SPEED1_56000_V110 },
};
#define NUM_CAPSCONNSPEEDS1 (sizeof(g_rglvmCapsConnSpeeds1) / sizeof(LISTVALUEMAP))
//
// Bearer service connection speeds (second set)
//
static const LISTVALUEMAP g_rglvmCapsConnSpeeds2[] =
{
{ 51, RIL_CAPS_SPEED2_56000_V120 },
{ 115, RIL_CAPS_SPEED2_56000_TRANSP },
{ 116, RIL_CAPS_SPEED2_64000_TRANSP },
{ 120, RIL_CAPS_SPEED2_32000_PIAFS32K },
{ 121, RIL_CAPS_SPEED2_64000_PIAFS64K },
{ 130, RIL_CAPS_SPEED2_28800_MULTIMEDIA },
{ 131, RIL_CAPS_SPEED2_32000_MULTIMEDIA },
{ 132, RIL_CAPS_SPEED2_33600_MULTIMEDIA },
{ 133, RIL_CAPS_SPEED2_56000_MULTIMEDIA },
{ 134, RIL_CAPS_SPEED2_64000_MULTIMEDIA },
};
#define NUM_CAPSCONNSPEEDS2 (sizeof(g_rglvmCapsConnSpeeds2) / sizeof(LISTVALUEMAP))
//
// Bearer service names
//
static const LISTVALUEMAP g_rglvmCapsSvcNames[] =
{
{ 0, RIL_CAPS_BSVCNAME_DATACIRCUIT_ASYNC_UDI_MODEM },
{ 1, RIL_CAPS_BSVCNAME_DATACIRCUIT_SYNC_UDI_MODEM },
{ 2, RIL_CAPS_BSVCNAME_PADACCESS_ASYNC_UDI },
{ 3, RIL_CAPS_BSVCNAME_PACKETACCESS_SYNC_UDI },
{ 4, RIL_CAPS_BSVCNAME_DATACIRCUIT_ASYNC_RDI },
{ 5, RIL_CAPS_BSVCNAME_DATACIRCUIT_SYNC_RDI },
{ 6, RIL_CAPS_BSVCNAME_PADACCESS_ASYNC_RDI },
{ 7, RIL_CAPS_BSVCNAME_PACKETACCESS_SYNC_RDI },
};
#define NUM_CAPSSVCNAMES (sizeof(g_rglvmCapsSvcNames) / sizeof(LISTVALUEMAP))
//
// Bearer service connection elements
//
static const LISTVALUEMAP g_rglvmCapsConnElems[] =
{
{ 0, RIL_CAPS_BSVCCE_TRANSPARENT },
{ 1, RIL_CAPS_BSVCCE_NONTRANSPARENT },
{ 2, RIL_CAPS_BSVCCE_BOTH_TRANSPARENT },
{ 3, RIL_CAPS_BSVCCE_BOTH_NONTRANSPARENT },
};
#define NUM_CAPSCONNELEMS (sizeof(g_rglvmCapsConnElems) / sizeof(LISTVALUEMAP))
//
// Equipment states
//
static const LISTVALUEMAP g_rglvmCapsEqStates[] =
{
{ 0, RIL_CAPS_EQSTATE_MINIMUM },
{ 1, RIL_CAPS_EQSTATE_FULL },
{ 2, RIL_CAPS_EQSTATE_DISABLETX },
{ 3, RIL_CAPS_EQSTATE_DISABLERX },
{ 4, RIL_CAPS_EQSTATE_DISABLETXANDRX },
};
#define NUM_CAPSEQSTATES (sizeof(g_rglvmCapsEqStates) / sizeof(LISTVALUEMAP))
//
// Messaging service types
//
static const LISTVALUEMAP g_rglvmCapsMsgSvcTypes[] =
{
{ 0, RIL_CAPS_MSGSVCTYPE_PHASE2 },
{ 1, RIL_CAPS_MSGSVCTYPE_PHASE2PLUS },
};
#define NUM_CAPSMSGSVCTYPES (sizeof(g_rglvmCapsMsgSvcTypes) / sizeof(LISTVALUEMAP))
//
// Message storage locations
//
static const LISTSTRINGMAP g_rglsmCapsMsgLocations[] =
{
{ "BM", RIL_CAPS_MSGLOC_BROADCAST },
{ "BR", RIL_CAPS_MSGLOC_STATUSREPORT },
{ "SM", RIL_CAPS_MSGLOC_SIM },
};
#define NUM_CAPSMSGLOCS (sizeof(g_rglsmCapsMsgLocations) / sizeof(LISTSTRINGMAP))
//
// Message status values
//
static const LISTVALUEMAP g_rglvmCapsMsgStatusValues[] =
{
{ 0, RIL_CAPS_MSGSTATUS_RECUNREAD },
{ 1, RIL_CAPS_MSGSTATUS_RECREAD },
{ 2, RIL_CAPS_MSGSTATUS_STOUNSENT },
{ 3, RIL_CAPS_MSGSTATUS_STOSENT },
};
#define NUM_CAPSMSGSTATUSVALUES (sizeof(g_rglvmCapsMsgStatusValues) / sizeof(LISTVALUEMAP))
//
// Locking facilities
//
static const LISTSTRINGMAP g_rglsmCapsLockFacilities[] =
{
{ "CS", RIL_CAPS_LOCKFACILITY_CNTRL },
{ "FD", RIL_CAPS_LOCKFACILITY_SIM_FIXEDIALING },
{ "P2", RIL_CAPS_LOCKFACILITY_SIM_PIN2 },
{ "PC", RIL_CAPS_LOCKFACILITY_CORPPERS },
{ "PF", RIL_CAPS_LOCKFACILITY_PH_FSIM },
{ "PN", RIL_CAPS_LOCKFACILITY_NETWORKPERS },
{ "PP", RIL_CAPS_LOCKFACILITY_SERVICEPROVPERS },
{ "PS", RIL_CAPS_LOCKFACILITY_PH_SIM },
{ "PU", RIL_CAPS_LOCKFACILITY_NETWORKSUBPERS },
{ "SC", RIL_CAPS_LOCKFACILITY_SIM },
};
#define NUM_CAPSLOCKFACILITIES (sizeof(g_rglsmCapsLockFacilities) / sizeof(LISTSTRINGMAP))
//
// Types of call barring
//
static const LISTSTRINGMAP g_rglsmCapsBarrTypes[] =
{
{ "AB", RIL_CAPS_BARRTYPE_ALLBARRING },
{ "AC", RIL_CAPS_BARRTYPE_ALLINCOMINGBARRING },
{ "AG", RIL_CAPS_BARRTYPE_ALLOUTGOINGBARRING },
{ "AI", RIL_CAPS_BARRTYPE_ALLINCOMING },
{ "AO", RIL_CAPS_BARRTYPE_ALLOUTGOING },
{ "IR", RIL_CAPS_BARRTYPE_INCOMINGROAMING },
{ "NS", RIL_CAPS_BARRTYPE_INCOMINGNOTINSIM },
{ "OI", RIL_CAPS_BARRTYPE_OUTGOINGINT },
{ "OX", RIL_CAPS_BARRTYPE_OUTGOINGINTEXTOHOME },
};
#define NUM_CAPSBARRTYPES (sizeof(g_rglsmCapsBarrTypes) / sizeof(LISTSTRINGMAP))
//
// Forwarding reasons
//
static const LISTVALUEMAP g_rglvmCapsFwdReasons[] =
{
{ 0, RIL_CAPS_FWDREASON_UNCONDITIONAL },
{ 1, RIL_CAPS_FWDREASON_MOBILEBUSY },
{ 2, RIL_CAPS_FWDREASON_NOREPLY },
{ 3, RIL_CAPS_FWDREASON_UNREACHABLE },
{ 4, RIL_CAPS_FWDREASON_ALLFORWARDING },
{ 5, RIL_CAPS_FWDREASON_ALLCONDITIONAL },
};
#define NUM_CAPSFWDREASONS (sizeof(g_rglvmCapsFwdReasons) / sizeof(LISTVALUEMAP))
//
// HSCSD channel codings
//
static const DWORD g_rgdwCapsHSCSDCodings[] =
{
RIL_CAPS_HSCSDCODING_4800_FULLRATE, // 1 = 2^0
0, // 2 = 2^1
RIL_CAPS_HSCSDCODING_9600_FULLRATE, // 4 = 2^2
RIL_CAPS_HSCSDCODING_14400_FULLRATE, // 8 = 2^3
};
#define NUM_CAPSHSCSDCODINGS (sizeof(g_rgdwCapsHSCSDCodings) / sizeof(DWORD))
//
// HSCSD air interface user rates
//
static const LISTVALUEMAP g_rglvmHSCSDAirRates[] =
{
{ 0, RIL_HSCSDAIURATE_UNKNOWN },
{ 1, RIL_HSCSDAIURATE_9600 },
{ 2, RIL_HSCSDAIURATE_14400 },
{ 3, RIL_HSCSDAIURATE_19200 },
{ 4, RIL_HSCSDAIURATE_28800 },
{ 5, RIL_HSCSDAIURATE_38400 },
{ 6, RIL_HSCSDAIURATE_43200 },
{ 7, RIL_HSCSDAIURATE_57600 },
};
#define NUM_CAPSHSCSDAIRRATES (sizeof(g_rglvmHSCSDAirRates) / sizeof(LISTVALUEMAP))
//
//
//
static HRESULT ParseFakeDWord(const DWORD dwValue, void*& pBlob, UINT& cbBlob)
{
FUNCTION_TRACE(ParseFakeDWord);
DWORD* pdw = NULL;
HRESULT hr = S_OK;
pBlob = NULL;
cbBlob = 0;
pdw = (DWORD*)AllocBlob(sizeof(DWORD));
if (!pdw) {
hr = E_OUTOFMEMORY;
goto Error;
}
*pdw = dwValue;
pBlob = (void*)pdw;
cbBlob = sizeof(DWORD);
Error:
if (FAILED(hr)) {
FreeBlob(pdw);
}
return hr;
}
//
//
//
static HRESULT ParseRangeRsp(const LPCSTR szCmd, const BOOL fIgnoreRest, LPCSTR szRsp, void*& pBlob, UINT& cbBlob)
{
FUNCTION_TRACE(ParseRangeRsp);
BOOL fParsedPostfix;
RILRANGE* prr = NULL;
HRESULT hr = S_OK;
pBlob = NULL;
cbBlob = 0;
prr = (RILRANGE*)AllocBlob(sizeof(RILRANGE));
if (!prr) {
hr = E_OUTOFMEMORY;
goto Error;
}
memset(prr, 0x00, sizeof(RILRANGE));
// Parse "<prefix><command><range><CR><LF>"
if (!ParseRspPrefix(szRsp, szRsp) ||
!MatchStringBeginning(szRsp, szCmd, szRsp) ||
!ParseRange(szRsp, *prr, szRsp)) {
hr = E_FAIL;
goto Error;
}
// Parse "<postfix>" (skipping the rest of the response, if necessary)
if (fIgnoreRest) {
fParsedPostfix = FindRspPostfix(szRsp, szRsp);
} else {
fParsedPostfix = ParseRspPostfix(szRsp, szRsp);
}
if (!fParsedPostfix) {
hr = E_FAIL;
goto Error;
}
pBlob = (void*)prr;
cbBlob = sizeof(RILRANGE);
Error:
if (FAILED(hr)) {
FreeBlob(prr);
}
return hr;
}
//
//
//
static HRESULT ParseRangeListRsp(const LPCSTR szCmd, const LISTVALUEMAP* const rglvmMapArray, const UINT nMapArrayLength,
const BOOL fIgnoreRest, LPCSTR szRsp, void*& pBlob, UINT& cbBlob)
{
FUNCTION_TRACE(ParseRangeListRsp);
BOOL fParsedPostfix;
DWORD* pdw = NULL;
HRESULT hr = S_OK;
pBlob = NULL;
cbBlob = 0;
pdw = (DWORD*)AllocBlob(sizeof(DWORD));
if (!pdw) {
hr = E_OUTOFMEMORY;
goto Error;
}
memset(pdw, 0x00, sizeof(DWORD));
// Parse "<prefix><command><list><CR><LF>"
if (!ParseRspPrefix(szRsp, szRsp) ||
!MatchStringBeginning(szRsp, szCmd, szRsp) ||
!ParseRangeList(szRsp, rglvmMapArray, nMapArrayLength, *pdw, szRsp)) {
hr = E_FAIL;
goto Error;
}
// Parse "<postfix>" (skipping the rest of the response, if necessary)
if (fIgnoreRest) {
fParsedPostfix = FindRspPostfix(szRsp, szRsp);
} else {
fParsedPostfix = ParseRspPostfix(szRsp, szRsp);
}
if (!fParsedPostfix) {
hr = E_FAIL;
goto Error;
}
pBlob = (void*)pdw;
cbBlob = sizeof(DWORD);
Error:
if (FAILED(hr)) {
FreeBlob(pdw);
}
return hr;
}
//
//
//
static HRESULT ParseStringListRsp(const LPCSTR szCmd, const LISTSTRINGMAP* const rglsmMapArray, const UINT nMapArrayLength,
LPCSTR szRsp, void*& pBlob, UINT& cbBlob)
{
FUNCTION_TRACE(ParseStringListRsp);
DWORD* pdw = NULL;
HRESULT hr = S_OK;
pBlob = NULL;
cbBlob = 0;
pdw = (DWORD*)AllocBlob(sizeof(DWORD));
if (!pdw) {
hr = E_OUTOFMEMORY;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -