?? rilsimtkittext.cpp
字號(hào):
}
Exit:
delete[] pbFileData;
DEBUGMSG(ZONE_FUNCTION, (TEXT("RilDrv : SIMTKit: -CRilSimToolkitCommand::ParseProvisionFile\r\n")));
return hr;
}
HRESULT CRilSimToolkitCommand::ParseReceiveData(void)
{
BYTE* pbParse;
LPWSTR wszText = NULL;
size_t cbTextBufSize = 0;
DWORD dwIconID = SIMTKIT_INVALID_VALUE;
DWORD dwDispMode = SIMTKIT_INVALID_VALUE;
DWORD dwChannelDataLength;
DWORD dwLength;
HRESULT hr = S_OK;
DEBUGMSG(ZONE_FUNCTION, (TEXT("RilDrv : SIMTKit: +CRilSimToolkitCommand::ParseReceiveData\r\n")));
pbParse = m_lpbParse;
dwLength = 0;
// At this point the Receive Data notification should be in the form of:
//
// ,<length>[,<alphaId>[,<iconId>,<dispMode>]]
// ,<length>
if (!MatchStringBeginning((LPCSTR)pbParse, ",", (LPCSTR&)pbParse) ||
!ParseDWord((LPCSTR)pbParse, SIMTKIT_TEXTPARSE_PARSE_NOLEADINGZERO, dwChannelDataLength, (LPCSTR&)pbParse))
{
hr = E_FAIL;
goto Exit;
}
// Optional: ,<alphaId>
if (MatchStringBeginning((LPCSTR)pbParse, ",", (LPCSTR&)pbParse))
{
if (!ParseEncodedText(pbParse, SIMTKIT_TEXT_ENCODING_ALPHAID, wszText, cbTextBufSize, pbParse))
{
hr = E_FAIL;
goto Exit;
}
}
// Optional: ,<iconId>,<dispMode>
if (MatchStringBeginning((LPCSTR)pbParse, ",", (LPCSTR&)pbParse))
{
if (!ParseDWord((LPCSTR)pbParse, SIMTKIT_TEXTPARSE_PARSE_NOLEADINGZERO, dwIconID, (LPCSTR&)pbParse))
{
hr = E_FAIL;
goto Exit;
}
// ,<dispMode>
if (!MatchStringBeginning((LPCSTR)pbParse, ",", (LPCSTR&)pbParse) ||
!ParseDWord((LPCSTR)pbParse, SIMTKIT_TEXTPARSE_PARSE_NOLEADINGZERO, dwDispMode, (LPCSTR&)pbParse))
{
hr = E_FAIL;
goto Exit;
}
}
// <CR><LF>
if (!ParseRspPostfix((LPCSTR)pbParse, (LPCSTR&)pbParse) )
{
hr = E_FAIL;
goto Exit;
}
// Parsing successful, set proper values for build command functions
m_dwChannelDataLength = dwChannelDataLength;
if (wszText)
{
m_pwszAlphaId = wszText;
m_dwAlphaIdLen = cbTextBufSize;
}
if (SIMTKIT_INVALID_VALUE != dwIconID)
{
m_dwIconIdentifier = dwIconID;
}
if (SIMTKIT_INVALID_VALUE != dwDispMode)
{
m_dwIconQualifier = dwDispMode;
}
Exit:
if (FAILED(hr))
{
delete[] wszText;
}
dwLength = pbParse - m_lpbParse;
m_lpbParse = pbParse;
m_dwParseLen -= dwLength;
DEBUGMSG(ZONE_FUNCTION, (TEXT("RilDrv : SIMTKit: -CRilSimToolkitCommand::ParseReceiveData\r\n")));
return hr;
}
HRESULT CRilSimToolkitCommand::ParseSendData(void)
{
BYTE* pbParse;
LPWSTR wszText = NULL;
size_t cbTextBufSize = 0;
DWORD dwIconID = SIMTKIT_INVALID_VALUE;
DWORD dwDispMode = SIMTKIT_INVALID_VALUE;
DWORD dwDataLength;
BYTE* pbData = NULL;
size_t cbDataSize;
DWORD dwLength;
HRESULT hr = S_OK;
DEBUGMSG(ZONE_FUNCTION, (TEXT("RilDrv : SIMTKit: +CRilSimToolkitCommand::ParseSendData\r\n")));
pbParse = m_lpbParse;
dwLength = 0;
// At this point the Receive Data notification should be in the form of:
//
// ,<length>,<data>[,<alphaId>[,<iconId>,<dispMode>]]
// ,<length>
if (!MatchStringBeginning((LPCSTR)pbParse, ",", (LPCSTR&)pbParse) ||
!ParseDWord((LPCSTR)pbParse, SIMTKIT_TEXTPARSE_PARSE_NOLEADINGZERO, dwDataLength, (LPCSTR&)pbParse))
{
hr = E_FAIL;
goto Exit;
}
// ,
if (!MatchStringBeginning((LPCSTR)pbParse, ",", (LPCSTR&)pbParse))
{
hr = E_FAIL;
goto Exit;
}
// <data>
if (!ParseBytes(pbParse, pbData, cbDataSize, pbParse))
{
hr = E_FAIL;
goto Exit;
}
// Optional: ,<alphaId>
if (MatchStringBeginning((LPCSTR)pbParse, ",", (LPCSTR&)pbParse))
{
if (!ParseEncodedText(pbParse, SIMTKIT_TEXT_ENCODING_ALPHAID, wszText, cbTextBufSize, pbParse))
{
hr = E_FAIL;
goto Exit;
}
}
// Optional: ,<iconId>,<dispMode>
if (MatchStringBeginning((LPCSTR)pbParse, ",", (LPCSTR&)pbParse))
{
if (!ParseDWord((LPCSTR)pbParse, SIMTKIT_TEXTPARSE_PARSE_NOLEADINGZERO, dwIconID, (LPCSTR&)pbParse))
{
hr = E_FAIL;
goto Exit;
}
// ,<dispMode>
if (!MatchStringBeginning((LPCSTR)pbParse, ",", (LPCSTR&)pbParse) ||
!ParseDWord((LPCSTR)pbParse, SIMTKIT_TEXTPARSE_PARSE_NOLEADINGZERO, dwDispMode, (LPCSTR&)pbParse))
{
hr = E_FAIL;
goto Exit;
}
}
// <CR><LF>
if (!ParseRspPostfix((LPCSTR)pbParse, (LPCSTR&)pbParse) )
{
hr = E_FAIL;
goto Exit;
}
// Parsing successful, set proper values for build command functions
ASSERT(dwDataLength == cbDataSize);
m_dwChannelDataLen = dwDataLength;
m_lpbChannelData = pbData;
if (wszText)
{
m_pwszAlphaId = wszText;
m_dwAlphaIdLen = cbTextBufSize;
}
if (SIMTKIT_INVALID_VALUE != dwIconID)
{
m_dwIconIdentifier = dwIconID;
}
if (SIMTKIT_INVALID_VALUE != dwDispMode)
{
m_dwIconQualifier = dwDispMode;
}
Exit:
if (FAILED(hr))
{
delete[] wszText;
delete[] pbData;
}
dwLength = pbParse - m_lpbParse;
m_lpbParse = pbParse;
m_dwParseLen -= dwLength;
DEBUGMSG(ZONE_FUNCTION, (TEXT("RilDrv : SIMTKit: -CRilSimToolkitCommand::ParseSendData\r\n")));
return hr;
}
HRESULT CRilSimToolkitCommand::ParseLanguageNotification(void)
{
BYTE* pbParse;
DWORD dwLength;
LPSTR szLanguage = NULL;
size_t cbLanguageSize = 0;
int iWideLength;
HRESULT hr = S_OK;
DEBUGMSG(ZONE_FUNCTION, (TEXT("RilDrv : SIMTKit: +CRilSimToolkitCommand::ParseLanguageNotification\r\n")));
pbParse = m_lpbParse;
dwLength = 0;
// At this point the Language notification should be in the form of:
//
// [,<language>]
// where language is a pair of alpha numeric characters.
if (MatchStringBeginning((LPCSTR)pbParse, ",", (LPCSTR&)pbParse))
{
if (!ParseUnlimitedUnquotedString((LPCSTR)pbParse, '\r', szLanguage, cbLanguageSize, (LPCSTR&)pbParse))
{
hr = E_FAIL;
goto Exit;
}
}
// <CR><LF>
if (!ParseRspPostfix((LPCSTR)pbParse, (LPCSTR&)pbParse) )
{
hr = E_FAIL;
goto Exit;
}
// If we received a language, copy it to
if ((NULL != szLanguage) && (0 < cbLanguageSize))
{
// Size of the receiving language buffer must be the same size
// as the max number of TCHAR's the SIMLANGUAGE structure can hold.
if (cbLanguageSize != MAXLEN_LANGUAGE)
{
ASSERT(FALSE);
hr = E_FAIL;
goto Exit;
}
m_pwszLanguage = new TCHAR[MAXLEN_LANGUAGE];
if (NULL == m_pwszLanguage)
{
ASSERT(FALSE);
hr = E_OUTOFMEMORY;
goto Exit;
}
iWideLength = MultiByteToWideChar(CP_ACP, 0, szLanguage, cbLanguageSize, m_pwszLanguage, MAXLEN_LANGUAGE);
m_pwszLanguage[MAXLEN_LANGUAGE-1] = TEXT('\0');
// Set the output size to the size of the buffer, not the character count.
m_dwLanguageLen = (iWideLength) * sizeof(TCHAR);
}
else
{
m_pwszLanguage = NULL;
m_dwLanguageLen = 0;
}
DEBUGMSG(ZONE_INFO, (TEXT("RilDrv : SIMTKit: ParseLanguageNotification: %s\r\n"), szLanguage));
Exit:
if (FAILED(hr))
{
delete[] szLanguage;
}
dwLength = pbParse - m_lpbParse;
m_lpbParse = pbParse;
m_dwParseLen -= dwLength;
DEBUGMSG(ZONE_FUNCTION, (TEXT("RilDrv : SIMTKit: -CRilSimToolkitCommand::ParseLanguageNotification\r\n")));
return hr;
}
HRESULT CRilSimToolkitResponse::TextFormatResponse(const RILSIMTOOLKITRSP* pRsp, const LPBYTE pDetails, const DWORD dwDetailSize, __inout_ecount( *pdwDataRspSize ) LPBYTE pbDataRsp, DWORD *pdwDataRspSize)
{
DWORD dwOriginalSize = *pdwDataRspSize;
HRESULT hr = S_OK;
// Assert parameters
DEBUGCHK(NULL != pRsp);
DEBUGCHK(NULL != pbDataRsp);
DEBUGCHK(0 < *pdwDataRspSize);
// Check parameters
if (NULL == pRsp ||
NULL == pbDataRsp ||
0 >= *pdwDataRspSize)
{
hr = E_INVALIDARG;
goto Exit;
}
// Check dwParams to make sure the necessary fields are supported
DEBUGCHK(pRsp->dwParams & RIL_PARAM_SIMTKIT_RSP_TYPE);
DEBUGCHK(pRsp->dwParams & RIL_PARAM_SIMTKIT_RSP_RESPONSE);
if (!(pRsp->dwParams & RIL_PARAM_SIMTKIT_RSP_TYPE) ||
!(pRsp->dwParams & RIL_PARAM_SIMTKIT_RSP_RESPONSE))
{
hr = E_INVALIDARG;
goto Exit;
}
// Check the command and build up the appropriate response.
switch (pRsp->dwType)
{
case SIM_NOTIFY_SETUPMENU_REPLY:
hr = SetupMenuReply(pRsp->dwResponse, pDetails, dwDetailSize, pbDataRsp, pdwDataRspSize);
break;
case SIM_NOTIFY_SETUPMENU:
hr = SetupMenuResponse(pRsp->dwResponse, pbDataRsp, pdwDataRspSize);
break;
case SIM_NOTIFY_SELECTITEM:
hr = SelectItemResponse(pRsp->dwResponse, pDetails, dwDetailSize, pbDataRsp, pdwDataRspSize);
break;
case SIM_NOTIFY_PLAYTONE:
hr = PlayToneResponse(pRsp->dwResponse, pbDataRsp, pdwDataRspSize);
break;
case SIM_NOTIFY_DISPLAYTEXT:
hr = DisplayTextResponse(pRsp->dwResponse, pbDataRsp, pdwDataRspSize);
break;
case SIM_NOTIFY_GETINPUT:
case SIM_NOTIFY_GETINKEY:
hr = GetInputResponse(pRsp, pDetails, dwDetailSize, pbDataRsp, pdwDataRspSize);
break;
case SIM_NOTIFY_SETUPIDLEMODETEXT:
hr = SetupIdleModeTextResponse(pRsp->dwResponse, pbDataRsp, pdwDataRspSize);
break;
case SIM_NOTIFY_SETUPCALL:
hr = SetupCallResponse(pRsp->dwResponse, pbDataRsp, pdwDataRspSize);
break;
case SIM_NOTIFY_EVENTLIST:
hr = EventListResponse(pRsp->dwResponse, pbDataRsp, pdwDataRspSize);
break;
case SIM_NOTIFY_LAUNCHBROWSER:
hr = LaunchBrowserResponse(pRsp, pbDataRsp, pdwDataRspSize);
break;
case SIM_NOTIFY_OPENCHANNEL:
hr = OpenChannelResponse(pRsp->dwResponse, pbDataRsp, pdwDataRspSize);
break;
case SIM_NOTIFY_SENDDTMF:
hr = SendDTMFResponse(pRsp->dwResponse, pbDataRsp, pdwDataRspSize);
break;
case SIM_NOTIFY_SENDSS:
case SIM_NOTIFY_SENDUSSD:
case SIM_NOTIFY_SENDSMS:
case SIM_NOTIFY_REFRESH:
case SIM_NOTIFY_CLOSECHANNEL:
case SIM_NOTIFY_RECEIVEDATA:
case SIM_NOTIFY_SENDDATA:
case SIM_NOTIFY_LANGUAGENOTIFICATION:
// There is no need to send a response for these commands
// when the radio is pre-parsing and sending text formatted
// notifications.
*pdwDataRspSize = 0;
goto Exit;
case SIM_NOTIFY_CALLSETUP:
case SIM_NOTIFY_MORETIME:
case SIM_NOTIFY_POLLINTERVAL:
case SIM_NOTIFY_POLLINGOFF:
case SIM_NOTIFY_LOCALINFO:
default:
// Radios that pre-parse the SIM toolkit commands and send
// text formatted notifications do not issue these commands.
*pdwDataRspSize = 0;
goto Exit;
}
Exit:
if (FAILED(hr))
{
*pdwDataRspSize = 0;
DEBUGMSG(ZONE_ERROR, (TEXT("RilDrv : SIMTKit: Creation of command response failed.\r\n")));
}
else
{
// Assert that we did not fill up the buffer.
DEBUGCHK(dwOriginalSize > *pdwDataRspSize);
}
return hr;
}
HRESULT CRilSimToolkitResponse::TextEventDownload(const DWORD dwEvent, const LPBYTE pData, const DWORD dwDataSize, __inout_ecount( *pdwDataRspSize ) LPSTR szDataRsp, DWORD *pdwDataRspSize)
{
DWORD dwOriginalSize = *pdwDataRspSize;
HRESULT hr = S_OK;
// Assert parameters
DEBUGCHK(NULL != szDataRsp);
DEBUGCHK(0 < *pdwDataRspSize);
// Check parameters
if (NULL == szDataRsp ||
0 >= *pdwDataRspSize)
{
hr = E_INVALIDARG;
goto Exit;
}
// Check the command and build up the appropriate response.
switch (dwEvent)
{
case SIMTKIT_EVENT_USERACTIVITY:
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -