📄 rilsimtk_ozone.cpp
字号:
if (!AddSATCmdLength(m_szCmdBuffer)) {
if (fUseGSM) { return FALSE; }
return ParseSetupMenu(szRspIn, pBlob, cbBlob, TRUE);
}
// Notify the SIM manager of the SAT command
return HandleBlob(RIL_NOTIFY_SIMTOOLKITEVENT, pBlob, cbBlob, m_szCmdBuffer);
}
//////////////////////////////////////////////////////////////////////////////
//
// Internal parsing function.
//
// Return:
// TRUE or FALSE depending on the success of the operation.
//
//////////////////////////////////////////////////////////////////////////////
BOOL CSimToolkitHandling::ParseIdleText(LPCSTR szRspIn, void*& pBlob, UINT& cbBlob, BOOL fUseGSM) {
UINT nDetails;
UINT nIconQualifier, nIconId;
char* pText;
char szText[MAX_ATCMD_LEN];
LPCSTR szRsp = szRspIn;
// Prepare text field
SIMTK_PREPARE_TEXT(szText, pText, SIMTK_TXT_STANDARD);
// Parse "<details>"
if (!ParseUInt(szRsp, FALSE, nDetails, szRsp) ||
!ParseRspParamSeparator(szRsp, szRsp) ||
!ParseString(szRsp, pText, MAX_ATCMD_LEN, szRsp) ||
!ParseRspParamSeparator(szRsp, szRsp) ||
!ParseUInt(szRsp, FALSE, nIconQualifier, szRsp) ||
!ParseRspParamSeparator(szRsp, szRsp) ||
!ParseUInt(szRsp, FALSE, nIconId, szRsp) ||
!ParseRspPostfix(szRsp, szRsp)) {
return FALSE;
}
UpdateTextField(szText, fUseGSM);
// Fill out the SAT command details and device ids
sprintf(m_szCmdBuffer, "D00081030128%0.2X82028182%s1E02%0.2X%0.2X", nDetails, szText, nIconQualifier, nIconId);
if (!AddSATCmdLength(m_szCmdBuffer)) {
if (fUseGSM) { return FALSE; }
return ParseIdleText(szRspIn, pBlob, cbBlob, TRUE);
}
// Notify the SIM manager of the SAT command
return HandleBlob(RIL_NOTIFY_SIMTOOLKITEVENT, pBlob, cbBlob, m_szCmdBuffer);
}
//////////////////////////////////////////////////////////////////////////////
//
// Parsing function called to parse the response to a SIM-Toolkit command.
//
// Return:
// S_OK on successs, E_FAIL otherwise.
//
//////////////////////////////////////////////////////////////////////////////
HRESULT CSimToolkitHandling::ParseGetCommand(LPCSTR szRsp, void*& pBlob, UINT& cbBlob, LPVOID pParam) {
UINT nCmd;
CSimToolkitHandling* pInstance = (CSimToolkitHandling*)pParam;
HRESULT hr = S_OK;
pBlob = 0;
cbBlob = 0;
if (!pInstance) {
return E_FAIL;
}
pInstance->m_fNoResponse = FALSE;
// Parse "<prefix>^SSTGI: <cmdtype>"
if (!ParseRspPrefix(szRsp, szRsp) ||
!MatchStringBeginning(szRsp, "^SSTGI: ", szRsp) ||
!ParseUInt(szRsp, FALSE, nCmd, szRsp) ||
!ParseRspParamSeparator(szRsp, szRsp)) {
return E_FAIL;
}
RILRetailTrace((TEXT("RilDrv: SimToolkit: ParseGetCommand: %d\r\n"), nCmd));
EnterCriticalSection(&(pInstance->m_csLockBuffer));
switch (nCmd) {
case SIMTK_CMD_REFRESH:
if (!pInstance->ParseRefresh(szRsp, pBlob, cbBlob)) {
RILRetailTrace((TEXT("RilDrv: SimToolkit Error - REFRESH command format corrupt\r\n")));
hr = E_FAIL;
}
break;
case SIMTK_CMD_SETUP_CALL:
if (!pInstance->ParseSetupCall(szRsp, pBlob, cbBlob)) {
RILRetailTrace((TEXT("RilDrv: SimToolkit Error - SETUP CALL command format corrupt\r\n")));
hr = E_FAIL;
}
break;
case SIMTK_CMD_SEND_SS:
if (!pInstance->ParseSendSS(szRsp, pBlob, cbBlob)) {
RILRetailTrace((TEXT("RilDrv: SimToolkit Error - SEND SS command format corrupt\r\n")));
hr = E_FAIL;
}
break;
case SIMTK_CMD_SEND_USSD:
if (!pInstance->ParseSendUSSD(szRsp, pBlob, cbBlob)) {
RILRetailTrace((TEXT("RilDrv: SimToolkit Error - SEND USSD command format corrupt\r\n")));
hr = E_FAIL;
}
break;
case SIMTK_CMD_SEND_SMS:
if (!pInstance->ParseSendSMS(szRsp, pBlob, cbBlob)) {
RILRetailTrace((TEXT("RilDrv: SimToolkit Error - SEND SMS command format corrupt\r\n")));
hr = E_FAIL;
}
break;
case SIMTK_CMD_PLAY_TONE:
if (!pInstance->ParsePlayTone(szRsp, pBlob, cbBlob)) {
RILRetailTrace((TEXT("RilDrv: SimToolkit Error - PLAY TONE command format corrupt\r\n")));
hr = E_FAIL;
}
break;
case SIMTK_CMD_DISPLAY_TEXT:
if (!pInstance->ParseDisplayText(szRsp, pBlob, cbBlob)) {
RILRetailTrace((TEXT("RilDrv: SimToolkit - DISPLAY TEXT command format corrupt\r\n")));
hr = E_FAIL;
}
break;
case SIMTK_CMD_GET_INKEY:
if (!pInstance->ParseGetInkey(szRsp, pBlob, cbBlob)) {
RILRetailTrace((TEXT("RilDrv: SimToolkit - GET INKEY command format corrupt\r\n")));
hr = E_FAIL;
}
break;
case SIMTK_CMD_GET_INPUT:
if (!pInstance->ParseGetInput(szRsp, pBlob, cbBlob)) {
RILRetailTrace((TEXT("RilDrv: SimToolkit Error - GET INPUT command format corrupt\r\n")));
hr = E_FAIL;
}
break;
case SIMTK_CMD_SELECT_ITEM:
if (!pInstance->ParseSelectItem(szRsp, pBlob, cbBlob)) {
RILRetailTrace((TEXT("RilDrv: SimToolkit Error - SELECT ITEM command format corrupt\r\n")));
hr = E_FAIL;
}
break;
case SIMTK_CMD_SETUP_MENU:
if (!pInstance->ParseSetupMenu(szRsp, pBlob, cbBlob)) {
RILRetailTrace((TEXT("RilDrv: SimToolkit Error - SETUP MENU command format corrupt\r\n")));
hr = E_FAIL;
}
break;
case SIMTK_CMD_SETUP_IDLE_TEXT:
if (!pInstance->ParseIdleText(szRsp, pBlob, cbBlob)) {
RILRetailTrace((TEXT("RilDrv: SimToolkit Error - SETUP IDLETEXT command format corrupt\r\n")));
hr = E_FAIL;
}
break;
case SIMTK_CMD_SETUP_EVENTLIST:
case SIMTK_CMD_SEND_DTMF:
case SIMTK_CMD_LAUNCH_BROWSER:
case SIMTK_CMD_GET_ICON_DATA:
RILRetailTrace((TEXT("RilDrv: SimToolkit Error - Unsupported SAT command: %i\r\n"), nCmd));
hr = E_FAIL;
break;
default:
RILRetailTrace((TEXT("RilDrv: SimToolkit Error - Unknown SAT command (%i)\r\n"), nCmd));
hr = E_FAIL;
break;
}
LeaveCriticalSection(&(pInstance->m_csLockBuffer));
// Check if anything went wrong
if (FAILED(hr)) {
// Try to bring the module back into a proper state
char szCmd[32];
sprintf(szCmd, "AT^SSTR=%d,32\r", nCmd);
if (!QueueInternalCmd(COMMAND_PORT, pInstance->m_pRilDevice, szCmd, CMDOPT_NONE, APIID_SENDSIMTOOLKITCMDRESPONSE, 0, SIMTK_CMD_RETRIES, SIMTK_CMD_RETRY_DELAY)) {
RILRetailTrace((TEXT("RilDrv: SimToolkit Error - Failed to queue cancel cmd (%i)\r\n"), nCmd));
}
if (!QueueInternalCmd(COMMAND_PORT, pInstance->m_pRilDevice, "AT^SSTR=254\r", CMDOPT_NONE, APIID_SENDSIMTOOLKITCMDRESPONSE, 0, SIMTK_CMD_RETRIES, SIMTK_CMD_RETRY_DELAY)) {
RILRetailTrace((TEXT("RilDrv: SimToolkit Error - Failed to queue quit cmd\r\n")));
}
}
return S_OK;
}
//////////////////////////////////////////////////////////////////////////////
//
// Send the response to a Sim-Toolkit event.
//
// Params:
// pHandle : Pointer to CRilInstanceHandle to be used for the operation.
// lpbResponse: The response to send to the module.
// dwSize : The soze of the response.
//
// Return:
// S_OK on successs, E_FAIL otherwise.
//
//////////////////////////////////////////////////////////////////////////////
HRESULT CSimToolkitHandling::SendCmdResponse(CRilInstanceHandle* pHandle, const BYTE* lpbResponse, DWORD dwSize) {
UINT i, len, uAddLen;
char szCmd[MAX_ATCMD_LEN], szUCS2[5];
WCHAR wcUnicode;
char *pGSM;
WCHAR *pUCS2;
UCHAR ucStatus, ucItem;
BOOL fUCS2;
HRESULT hr = S_OK;
// Check if we have to suppress the response
if (m_fNoResponse) {
return S_OK;
}
// Check if we have an additional length field
uAddLen = 0;
if (lpbResponse[2] == 0x81) {
uAddLen = 1;
}
// Check for a result tag
if (lpbResponse[9 + uAddLen] == 3) {
ucStatus = lpbResponse[11 + uAddLen]; // Extract the result code
if (ucStatus < 7) {
ucStatus = 0; // The MC45 treats all values below 7 as 0
}
} else {
ucStatus = 0; // Assume successful for the moment
}
// Check the command response type
switch (lpbResponse[3 + uAddLen]) {
case SIMTK_CMD_SETUP_CALL:
RILRetailTrace((TEXT("RilDrv: SimToolkit: SETUP CALL command response\r\n")));
if (!ucStatus) {
// The ongoing command is handled by the application -> simply terminate the SAT session
ucStatus = 16;
}
sprintf(szCmd, "AT^SSTR=16,%d\r", ucStatus);
break;
case SIMTK_CMD_SELECT_ITEM:
RILRetailTrace((TEXT("RilDrv: SimToolkit: SELECT ITEM command response\r\n")));
if (ucStatus == 0) {
ucItem = lpbResponse[14 + uAddLen]; // Extract the item number
} else {
ucItem = 0;
}
// Compose the select item response
sprintf(szCmd, "AT^SSTR=36,%d,%d\r", ucStatus, ucItem);
break;
case SIMTK_CMD_GET_INKEY:
case SIMTK_CMD_GET_INPUT:
RILRetailTrace((TEXT("RilDrv: SimToolkit: GET INKEY / INPUT command response\r\n")));
// Compose the Inkey/Input response
sprintf(szCmd, "AT^SSTR=%d,%d,,\"", lpbResponse[3 + uAddLen], ucStatus);
// Check if we have an additional length field
if (lpbResponse[13 + uAddLen] == 0x81) {
uAddLen++;
}
if (ucStatus == 0) {
// Extract the user input string
fUCS2 = FALSE;
len = lpbResponse[13 + uAddLen] - 1;
pGSM = (char*)(&(lpbResponse[15 + uAddLen]));
if (lpbResponse[14 + uAddLen] == 8) {
fUCS2 = TRUE;
len = len / 2;
pUCS2 = (WCHAR*)(&(lpbResponse[16 + uAddLen]));
}
if (len > 0) {
for (i = 0; i < len; i++) {
if (!fUCS2) {
if (!GSMCharToUnicode(pGSM[i], &wcUnicode)) {
wcUnicode = '*';
}
} else {
wcUnicode = pUCS2[i];
}
sprintf(szUCS2, "%0.4X", wcUnicode);
strncat(szCmd, szUCS2, max(0, MAX_ATCMD_LEN - strlen(szCmd) - 1));
}
} else {
strncat(szCmd, "\\1b", max(0, MAX_ATCMD_LEN - strlen(szCmd) - 1));
}
}
strncat(szCmd, "\"\r", max(0, MAX_ATCMD_LEN - strlen(szCmd) - 1));
break;
case SIMTK_CMD_REFRESH:
case SIMTK_CMD_SEND_SS:
case SIMTK_CMD_SEND_USSD:
case SIMTK_CMD_SEND_SMS:
case SIMTK_CMD_PLAY_TONE:
case SIMTK_CMD_DISPLAY_TEXT:
case SIMTK_CMD_SETUP_MENU:
case SIMTK_CMD_SETUP_IDLE_TEXT:
RILRetailTrace((TEXT("RilDrv: SimToolkit: Default command response (%i)\r\n"), lpbResponse[3 + uAddLen]));
sprintf(szCmd, "AT^SSTR=%d,%d\r", lpbResponse[3 + uAddLen], ucStatus);
break;
case SIMTK_CMD_SETUP_EVENTLIST:
case SIMTK_CMD_LAUNCH_BROWSER:
case SIMTK_CMD_SEND_DTMF:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -