?? rilsimtkit.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.
//
/*++
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;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -