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

📄 rilsimtkit.cpp

📁 ril source code for Windows CE
💻 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.
//
/*++
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:

RilSimTKit.cpp

Abstract:


Notes:


--*/



#include "precomp.h"
#undef assert
#include "Safeint.hxx"

#ifndef _PREFAST_
#pragma warning( disable: 4068 )
#endif

static const BYTE gsc_pbDefTerminalProfile[]    = {0x01, 0x61, 0xFF, 0x7F, 0x61, 0x00, 0x00, 0x30, 0x21};

typedef HRESULT (CRilSimToolkitCommand::*TLVPARSEFUNC)();

// A description of each toolkit command and which components it needs.  Note that the high bit is
// set if a component is optional, otherwise, it is mandatory
// NOTE: Open Channel is handled outside of this array of commands.
const DWORD g_rgdwTLV[] = {
      5, SIM_NOTIFY_DISPLAYTEXT, TEXTTAG, (ICONTAG | OPTIONALTAG), (IMMEDIATETAG | OPTIONALTAG),
      4, SIM_NOTIFY_GETINKEY, TEXTTAG, (ICONTAG | OPTIONALTAG),
      4, SIM_NOTIFY_SETUPIDLEMODETEXT, TEXTTAG, (ICONTAG | OPTIONALTAG),
      6, SIM_NOTIFY_GETINPUT, TEXTTAG, RESPONSETAG, (DEFTEXTTAG | OPTIONALTAG), (ICONTAG | OPTIONALTAG),
      2, SIM_NOTIFY_MORETIME,
      6, SIM_NOTIFY_PLAYTONE, (ALPHAIDTAG | OPTIONALTAG), (TONETAG | OPTIONALTAG), (DURATIONTAG | OPTIONALTAG), (ICONTAG | OPTIONALTAG),
      3, SIM_NOTIFY_POLLINTERVAL, DURATIONTAG,
      7, SIM_NOTIFY_SETUPMENU, ALPHAIDTAG, MENUITEMTAG, (NEXTACTIONTAG | OPTIONALTAG), (ICONTAG | OPTIONALTAG), (ICONLISTTAG | OPTIONALTAG),
      8, SIM_NOTIFY_SELECTITEM, (ALPHAIDTAG | OPTIONALTAG), MENUITEMTAG, (NEXTACTIONTAG | OPTIONALTAG), (ITEMIDTAG | OPTIONALTAG), (ICONTAG | OPTIONALTAG), (ICONLISTTAG | OPTIONALTAG),
      6, SIM_NOTIFY_SENDSMS, (ALPHAIDTAG | OPTIONALTAG), (ADDRESSTAG | OPTIONALTAG), TPDUTAG, (ICONTAG | OPTIONALTAG),
      5, SIM_NOTIFY_SENDSS, (ALPHAIDTAG | OPTIONALTAG), SSSTRINGTAG, (ICONTAG | OPTIONALTAG),
      5, SIM_NOTIFY_SENDUSSD, (ALPHAIDTAG | OPTIONALTAG), USSDSTRINGTAG, (ICONTAG | OPTIONALTAG),
      // Note: The SETUP CALL 2nd Alpha ID is handled as a special case in Parse Command.
      8, SIM_NOTIFY_SETUPCALL, (ALPHAIDTAG | OPTIONALTAG), ADDRESSTAG, (CAPABILITYTAG | OPTIONALTAG), (SUBADDRTAG | OPTIONALTAG), (DURATIONTAG | OPTIONALTAG), (ICONTAG | OPTIONALTAG),
      3, SIM_NOTIFY_REFRESH, (FILELISTTAG | OPTIONALTAG),   // Note -- this is optional or not depending on the command qualifier
      2, SIM_NOTIFY_POLLINGOFF,
      2, SIM_NOTIFY_LOCALINFO,
      3, SIM_NOTIFY_EVENTLIST, EVENTLISTTAG,
      9, SIM_NOTIFY_LAUNCHBROWSER, (BROWSERIDTAG | OPTIONALTAG), URLTAG, (BEARERTAG | OPTIONALTAG), (PROVISIONFILETAG | OPTIONALTAG), (TEXTTAG | OPTIONALTAG), (ALPHAIDTAG | OPTIONALTAG), (ICONTAG | OPTIONALTAG),
      4, SIM_NOTIFY_CLOSECHANNEL, (ALPHAIDTAG | OPTIONALTAG), (ICONTAG | OPTIONALTAG),
      5, SIM_NOTIFY_RECEIVEDATA, (ALPHAIDTAG | OPTIONALTAG),  (ICONTAG | OPTIONALTAG), CHANNELDATALENTAG,
      5, SIM_NOTIFY_SENDDATA, (ALPHAIDTAG | OPTIONALTAG),  (ICONTAG | OPTIONALTAG), CHANNELDATATAG,
      5, SIM_NOTIFY_SENDDTMF, (ALPHAIDTAG | OPTIONALTAG), DTMFTAG, (ICONTAG | OPTIONALTAG),
      3, SIM_NOTIFY_LANGUAGENOTIFICATION, (LANGUAGETAG | OPTIONALTAG),
      4, SIM_NOTIFY_RUNATCOMMAND, ATCMDTAG, (ICONTAG | OPTIONALTAG),
      0
};

/****************************************************************************

    FUNCTION:   CRilSimToolkitCommand

    PURPOSE:    CRilSimToolkitCommand class constructor

    PARAMETERS: None

    RETURNS:    HRESULT

****************************************************************************/

CRilSimToolkitCommand::CRilSimToolkitCommand()
: m_fTextNotifications(FALSE)
{
    FUNCTION_TRACE(CRilSimToolkitCommand::CRilSimToolkitCommand);
    m_fTextNotifications = g_rppPDDParams->fSIMToolkit_SupportsTextNotifications;
}


/****************************************************************************

    FUNCTION:   ~CRilSimToolkitCommand

    PURPOSE:    CRilSimToolkitCommand class destructor

    PARAMETERS: None

    RETURNS:    HRESULT

****************************************************************************/

CRilSimToolkitCommand::~CRilSimToolkitCommand()
{
    FUNCTION_TRACE(CRilSimToolkitCommand::~CRilSimToolkitCommand);
}


/****************************************************************************

    FUNCTION:   ParseCommand

    PURPOSE:    Parses a Proactive SIM command, returning a structure
                containing the command details suitable for passing
                to SIMTKit.

    PARAMETERS: szData - Data from SIM card
                dwDataSize - Size of that data
                ppCommand - Resulting structure to send to caller
                pdwCommandId - ID of this command
                pdwNotifyCode - What the notification code is

    RETURNS:    DWORD - SIMTKit response code.

****************************************************************************/

DWORD CRilSimToolkitCommand::ParseCommand(LPCSTR szData, DWORD dwDataSize, RILSIMTOOLKITCMD **ppCommand, DWORD *pdwCommandSize)
{
    FUNCTION_TRACE(CRilSimToolkitCommand::ParseCommand);

    HRESULT hr;
    DWORD dwRetVal = SIM_RESPONSE_OK;
    DWORD dwResultSize = 0;
    DWORD dwNotifyCode = 0;
    DWORD dwCommandId = 0;
    DWORD dwCommandTag = 0;
    DWORD i;
    DWORD numTLVs;
    DWORD dwTag;
    BYTE bCmdQualifier = 0;
    LPBYTE lpbResult = NULL;
    const DWORD *pdwTLV;
    RILSIMTOOLKITCMD* pCmd = NULL;
#pragma prefast( push )
#pragma prefast( disable: 5434, "PREfast noise: No function call but pointers to function" )
    const TLVPARSEFUNC rglpfnParse[] = { NULL, NULL, NULL, NULL, ReadDuration,                  // 0x00 - 0x04
            ReadAlphaIdentifier, ReadAddress, ReadCapability, ReadSubAddress, ReadShortString,  // 0x05 - 0x09
            ReadUSSD, ReadTPDU, NULL, ReadTextString, ReadTone,                                 // 0x0A - 0x0E
            ReadMenuItem, ReadItemIdentifier, ReadResponseLength, ReadFileList, NULL,           // 0x0F - 0x13
            NULL, NULL, NULL, ReadDefaultTextString, ReadNextAction,                            // 0x14 - 0x18
            ReadEventList, NULL, NULL, NULL, NULL,                                              // 0x19 - 0x1D
            ReadIconIdentifier, ReadIconIdentifierList, NULL, NULL, NULL,                       // 0x1E - 0x22
            NULL, NULL, NULL, NULL, NULL,                                                       // 0x23 - 0x27
            ReadATCommand, NULL, NULL, ReadImmediate, ReadDTMF,                                 // 0x28 - 0x2C
            ReadLanguage, NULL, NULL, ReadBrowserIdentity, ReadURL,                             // 0x2D - 0x31
            ReadBearer, ReadProvisionFileList, NULL, NULL, ReadChannelData,                     // 0x32 - 0x36
            ReadChannelDataLength                                                               // 0x37
            };
#pragma prefast( pop )


    // Assert parameters
    DEBUGCHK(*ppCommand == NULL);
    DEBUGCHK(szData != NULL);

    // Check parameters
    if (szData == NULL)
    {
        dwRetVal = SIM_RESPONSE_ERR_MOBILEINCAPABLE;
        goto Exit;
    }

    // Set up some variables
    m_lpbParse = NULL;
    m_dwParseLen = 0;
    m_pwszAlphaId = NULL;
    m_pwszText = NULL;
    m_pwszDefaultText = NULL;
    m_pwszAddress = NULL;
    m_pwszSubAddr = NULL;
    m_pwszUSSD = NULL;
    m_lpbTPDU = NULL;
    m_dwAlphaIdLen = 0;
    m_dwTextLen = 0;
    m_dwDefaultTextLen = 0;
    m_dwAddressLen = 0;
    m_dwSubAddrLen = 0;
    m_dwUSSDLen = 0;
    m_dwTPDULen = 0;
    m_dwNumFiles = 0;
    m_dwDuration = SIMTONE_DEFAULTDURATION;
    m_dwDuration2 = SIMOPENCHANNEL_DEFAULTDURATION;
    m_dwTone = SIMTONE_DEFAULT;
    m_dwMinResponse = 1;
    m_dwMaxResponse = 1;
    m_dwItemId = 0xffffffff;
    m_rgpsmi = NULL;
    m_numpsmi = 0;
    m_dwAddrType = SIM_ADDRTYPE_UNKNOWN;
    m_dwNumPlan = SIM_NUMPLAN_UNKNOWN;
    m_pdwFiles = NULL;
    m_lpbEventList = NULL;
    m_dwEventListLen = 0;
    m_dwBrowserId = 0xffffffff;
    m_pwszURL = NULL;
    m_dwURLLen = 0;
    m_lpbBearer = NULL;
    m_dwBearerLen = 0;
    m_rgpsfr = NULL;
    m_numpsfr = 0;
    m_pwszDTMF = NULL;
    m_dwDTMFLen = 0;
    m_lpbChannelData = NULL;
    m_dwChannelDataLen = 0;
    m_dwChannelDataLength = 0xffffffff;
    m_dwDeviceSrcId = 0;
    m_dwDeviceDestId = 0;
    m_pwszLanguage = NULL;
    m_dwLanguageLen = 0;
    m_dwLocalAddrType = 0;
    m_lpbLocalAddr = NULL;
    m_dwLocalAddrLen = 0;
    m_lpbDestAddr = NULL;
    m_dwDestAddrLen = 0;
    m_pwszLogin = NULL;
    m_dwLoginLen = 0;
    m_pwszPassword = NULL;
    m_dwPasswordLen = 0;
    m_dwDestAddrType = 0;
    m_dwBearerDescType = 0;
    m_lpbBearerDesc = NULL;
    m_dwBearerDescLen = 0;
    m_dwBufferSize = 0;
    m_dwProtocolType = 0;
    m_dwPortNum = 0;
    m_lpbAccessName = NULL;
    m_dwAccessNameLen = 0;
    m_fImmediateResponse = FALSE;
    m_dwIconIdentifier = SIMTKIT_INVALID_VALUE;
    m_dwIconQualifier = SIMTKIT_INVALID_VALUE;
    m_pwszAlphaId2 = NULL;
    m_dwAlphaId2Len = 0;
    m_dwIconIdentifier2 = SIMTKIT_INVALID_VALUE;
    m_dwIconQualifier2 = SIMTKIT_INVALID_VALUE;

    // Text based, comma delimited commands passed from the radio.
    if (m_fTextNotifications)
    {
        m_lpbParse = (LPBYTE)szData;
        m_dwParseLen = dwDataSize;
        hr = ParseTextFormatCommand(&dwNotifyCode, &bCmdQualifier, &dwRetVal);

        if (FAILED(hr))
        {
            DEBUGCHK(FALSE);
            DEBUGMSG(ZONE_ERROR, (TEXT("RILDrv : SIMTKit: Parsing of command %x failed.\r\n"), dwNotifyCode));
            dwRetVal = SIM_RESPONSE_ERR_MOBILEINCAPABLE;
            goto Exit;
        }
    }
    // Byte based commands from the radio.
    else
    {
        m_lpbParse = (LPBYTE)szData;

        // First comes the proactive SIM command tag
        if (*(m_lpbParse++) != 0xD0)
        {
            // Unexpected command
            DEBUGMSG(ZONE_ERROR, (TEXT("RILDrv : SIMTKit: First byte is %x, expected 0xD0\r\n"), *(m_lpbParse - 1)));
            dwRetVal = SIM_RESPONSE_ERR_COMMANDNUMBER;
            goto Exit;
        }

        // Then comes the length -- note we have to be a little sly here -- this actually ends up
        // changing m_dwParseLen, but what I really want to do is SET m_dwParseLen here
        m_dwParseLen = 5;
        if ( dwDataSize < m_dwParseLen )
        {
            m_dwParseLen = 0;
        }
        hr = ReadCmdLength(&m_dwParseLen);
        if (FAILED(hr))
        {
            DEBUGMSG(ZONE_ERROR, (TEXT("RILDrv : SIMTKit: ReadCmdLength returned error\r\n")));
            dwRetVal = SIM_RESPONSE_ERR_COMMANDNUMBER;
            goto Exit;
        }

        ASSERT(m_dwParseLen == (dwDataSize - 2) || m_dwParseLen == (dwDataSize - 3));
        if (m_dwParseLen < 9)
        {
            // Invalid -- even MORETIME has 9 bytes more
            DEBUGMSG(ZONE_ERROR, (TEXT("RILDrv : SIMTKit: Not enough bytes for command details, expected at least 9, saw %d\r\n"), m_dwParseLen));
            dwRetVal = SIM_RESPONSE_ERR_COMMANDNUMBER;
            goto Exit;
        }

        // First byte -- the command details tag. Save this because a proper terminal response requires
        // the command details to be identical to the proactive commands, including comprehension settings.
        dwCommandTag = (DWORD) (*(m_lpbParse++));

        if ((dwCommandTag & 0x7f) != COMMANDIDTAG)
        {
            // Invalid
            DEBUGMSG(ZONE_ERROR, (TEXT("RILDrv : SIMTKit: Expected Command ID Tag, saw %x\r\n"), dwCommandTag));
            dwRetVal = SIM_RESPONSE_ERR_COMMANDNUMBER;
            goto Exit;
        }

        // Second byte -- length, should be 3
        if (*(m_lpbParse++) != 3)
        {
            DEBUGMSG(ZONE_ERROR, (TEXT("RILDrv : SIMTKit: Expected 3 in second byte of Command ID, saw %x\r\n"), *(m_lpbParse - 1)));
            dwRetVal = SIM_RESPONSE_ERR_COMMANDNUMBER;
            goto Exit;
        }

        // Third byte -- the command number
        dwCommandId = (DWORD) (*(m_lpbParse++));

        // Fourth byte -- the command (fifth byte is command-specific data (command qualifier))
        dwNotifyCode = (DWORD) (*(m_lpbParse++));
        bCmdQualifier = *(m_lpbParse++);
        DEBUGMSG(ZONE_INFO, (TEXT("RILDrv : SIMTKit: Command ID %x, Notification %x, Command Qualifier %x\r\n"), dwCommandId, dwNotifyCode, bCmdQualifier));

        // The next 4 bytes are "device identities" -- we ignore these,
        // but the first byte should be 2 and so should the second byte
        if ((*(m_lpbParse++) & 0x7f) != DEVICEIDTAG)
        {
            // Invalid
            DEBUGMSG(ZONE_ERROR, (TEXT("RILDrv : SIMTKit: Expected Device ID Tag, saw %x\r\n"), *(m_lpbParse - 1)));
            dwRetVal = SIM_RESPONSE_ERR_COMMANDDATA;
            goto Exit;
        }

        // Next byte -- length, should be 2
        if (*(m_lpbParse++) != 2)
        {
            DEBUGMSG(ZONE_ERROR, (TEXT("RILDrv : SIMTKit: Expected Device ID Length of 2, saw %x\r\n"), *(m_lpbParse - 1)));
            dwRetVal = SIM_RESPONSE_ERR_COMMANDDATA;
            goto Exit;
        }

        // Source and destination device ID's.
        m_dwDeviceSrcId = (DWORD) (*(m_lpbParse++));
        m_dwDeviceDestId = (DWORD) (*(m_lpbParse++));
        m_dwParseLen -= 9;


        // Special parsing for Open channel commands
        if (SIM_NOTIFY_OPENCHANNEL == dwNotifyCode)
        {
            // Parse Optional alphaID
            if ((m_dwParseLen > 0) && ((*m_lpbParse & 0x7f) == (BYTE)ALPHAIDTAG))
            {
                m_lpbParse++;
                m_dwParseLen--;
                hr = ReadAlphaIdentifier();
                if (FAILED(hr))
                {
                    // Failure
                    DEBUGMSG(ZONE_ERROR, (TEXT("RilDrv : SIMTKit: Function for TLV AlphaID failed while parsing Open Channel.\r\n")));
                    dwRetVal = SIM_RESPONSE_ERR_VALUESMISSING;
                    goto Exit;
                }

⌨️ 快捷键说明

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