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

📄 caps.cpp

📁 ril source code for Windows CE
💻 CPP
📖 第 1 页 / 共 4 页
字号:
//
// 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 + -