📄 rilsimtk_magneto.cpp
字号:
pSatText->dwMinResponse = nResponseMin;
pSatText->dwMaxResponse = nResponseMax;
if (wcslen(wszText)) {
pSatText->dwParams |= SIM_PARAM_SIMTEXT_TEXTSIZE | SIM_PARAM_SIMTEXT_TEXTOFFSET;
pSatText->dwTextSize = (wcslen(wszText) + 1) * sizeof(WCHAR);
pSatText->dwTextOffset = ROUNDTODWORD(sizeof(SIMTEXT));
wcscpy((WCHAR*)((BYTE*)pSatText + pSatText->dwTextOffset), wszText);
}
if (wcslen(wszText)) {
pSatText->dwParams |= SIM_PARAM_SIMTEXT_DEFAULTTEXTSIZE | SIM_PARAM_SIMTEXT_DEFAULTTEXTOFFSET;
pSatText->dwDefaultTextSize = (wcslen(wszDefaultText) + 1) * sizeof(WCHAR);
pSatText->dwDefaultTextOffset = ROUNDTODWORD2(sizeof(SIMTEXT), pSatText->dwTextSize);
wcscpy((WCHAR*)((BYTE*)pSatText + pSatText->dwDefaultTextOffset), wszDefaultText);
}
if (nIconId) {
pSatText->dwParams |= SIM_PARAM_SIMTEXT_ICONID | SIM_PARAM_SIMTEXT_ICONQUALIFIER;
pSatText->dwIconIdentifier = nIconId;
pSatText->dwIconQualifier = nIconQualifier;
}
pSatText->cbSize = ROUNDTODWORD3(sizeof(SIMTEXT), pSatText->dwTextSize, pSatText->dwDefaultTextSize);
pSatCmd->cbSize += pSatText->cbSize;
pSatCmd->dwDetailsSize = pSatText->cbSize;
}
// Notify the SIM manager of the SAT command
if (!HandleBlob(RIL_NOTIFY_SIMTOOLKITCMD, pBlob, cbBlob , m_bCmdBuffer, pSatCmd->cbSize)) {
fRet = FALSE;
}
return fRet;
}
//////////////////////////////////////////////////////////////////////////////
//
// Internal parsing function.
//
// Return:
// TRUE or FALSE depending on the success of the operation.
//
//////////////////////////////////////////////////////////////////////////////
BOOL CSimToolkitHandling::ParseSelectItem(LPCSTR szRsp, void*& pBlob, UINT& cbBlob)
{
UINT i, nCmd, nNumItems, nDetails, nItem, nDefaultItem;
UINT /* nItemIconsPresent, */nItemIconsQualifier, nTitleIconQualifier, nTitleIconId;
UINT nNextActionId, nIconId;
DWORD dwLen;
RILSIMTOOLKITCMD* pSatCmd;
SIMMENU* pSatMenu;
SIMMENUITEM* pSatItem;
WCHAR wszText[UCS2_LEN + 1];
BOOL fRet = TRUE;
PrepareRilCmdStruct(m_bCmdBuffer, &pSatCmd, SIM_NOTIFY_SELECTITEM);
//<cr><lf>+PPSTGI:36,0,8,0,"4E1A52A17CBE9009",0,0<cr><lf>+PPSTGI:36,8,1,"83DC53557BA17406",0,0,0<cr><lf>+PPSTGI:36,8,2,"5F6994C38BBE7F6E",0,0,0<cr><lf>+PPSTGI:36,8,3,"97F34E5070ED7EBF",0,0,0<cr><lf>+PPSTGI:36,8,4,"79FB52A884DD9875",0,0,0<cr><lf>+PPSTGI:36,8,5,"7B2C4E0065F695F465B095FB",0,0,0<cr><lf>+PPSTGI:36,8,6,"59296C14988462A5",0,0,
// Parse Title: "<details>,<numitems>,<"titletext">,<>defaultitem,<itemiconspresent>,<itemiconqualifier>,<titleiconqualifier>,<titleiconid>"
// Parse Title: <CmdQualifier>,<ItemNum>,<DefaultItem>,<TitleText>,<TitleIconID>,<TitleIconQualifier>
if (!ParseUInt(szRsp, FALSE, nDetails, szRsp) ||
!ParseRspParamSeparator(szRsp, szRsp) ||
!ParseUInt(szRsp, FALSE, nNumItems, szRsp) ||
!ParseRspParamSeparator(szRsp, szRsp) ||
!ParseUInt(szRsp, FALSE, nDefaultItem, szRsp) ||
!ParseRspParamSeparator(szRsp, szRsp) ||
!ParseUCS2String(szRsp, wszText, UCS2_LEN, szRsp) ||
!ParseRspParamSeparator(szRsp, szRsp) ||
!ParseUInt(szRsp, FALSE, nTitleIconId, szRsp) ||
!ParseRspParamSeparator(szRsp, szRsp) ||
!ParseUInt(szRsp, FALSE, nTitleIconQualifier, szRsp) ||
//!ParseRspParamSeparator(szRsp, szRsp) ||
/*
!ParseUInt(szRsp, FALSE, nItemIconsPresent, szRsp) ||
!ParseRspParamSeparator(szRsp, szRsp) ||
!ParseUInt(szRsp, FALSE, nItemIconsQualifier, szRsp) ||
!ParseRspParamSeparator(szRsp, szRsp) ||
*/
!ParseRspPostfix(szRsp, szRsp)) {
RILRetailTrace((TEXT("RilDrv: SimToolkit:CSimToolkitHandling::ParseSelectItem error 1\r\n")));
PrepareRilCmdError(pSatCmd, SIM_RESPONSE_ERR_VALUESMISSING);
fRet = FALSE;
} else {
// An item list without items is invalid
if (!nNumItems) {
RILRetailTrace((TEXT("RilDrv: SimToolkit:CSimToolkitHandling::ParseSelectItem error 2\r\n")));
PrepareRilCmdError(pSatCmd, SIM_RESPONSE_ERR_COMMANDDATA);
fRet = FALSE;
} else {
pSatMenu = (SIMMENU*)((BYTE*)pSatCmd + pSatCmd->dwDetailsOffset);
pSatMenu->dwParams = SIM_PARAM_SIMMENU_FLAGS | SIM_PARAM_SIMMENU_MENUITEMCOUNT |
SIM_PARAM_SIMMENU_MENUITEMOFFSET | SIM_PARAM_SIMMENU_MENUITEMSIZE;
if (nDetails & 0x80) { pSatMenu->dwFlags = SIMMENU_HELPINFO; }
if (wcslen(wszText)) {
pSatMenu->dwParams |= SIM_PARAM_SIMMENU_TEXTSIZE | SIM_PARAM_SIMMENU_TEXTOFFSET;
pSatMenu->dwTextSize = (wcslen(wszText) + 1) * sizeof(WCHAR);
pSatMenu->dwTextOffset = ROUNDTODWORD(sizeof(SIMMENU));
wcscpy((WCHAR*)((BYTE*)pSatMenu + pSatMenu->dwTextOffset), wszText);
}
if (nDefaultItem) {
pSatMenu->dwParams |= SIM_PARAM_SIMMENU_DEFAULTITEM;
pSatMenu->dwDefaultItem = nDefaultItem;
}
if (nTitleIconId) {
pSatMenu->dwParams |= SIM_PARAM_SIMMENU_ICONID | SIM_PARAM_SIMMENU_ICONQUALIFIER;
pSatMenu->dwIconIdentifier = nTitleIconId;
pSatMenu->dwIconQualifier = nTitleIconQualifier;
}
pSatMenu->dwMenuItemCount = nNumItems;
pSatMenu->dwMenuItemOffset = ROUNDTODWORD2(sizeof(SIMMENU), pSatMenu->dwTextSize);
pSatMenu->cbSize = ROUNDTODWORD2(sizeof(SIMMENU), pSatMenu->dwTextSize);
pSatItem = (SIMMENUITEM*)((BYTE*)pSatMenu + pSatMenu->dwMenuItemOffset);
for (i = 0; i < nNumItems; i++) {
//<cr><lf>+PPSTGI:36,0,8,0,"4E1A52A17CBE9009",0,0<cr><lf>+PPSTGI:36,8,1,"83DC53557BA17406",0,0,0<cr><lf>+PPSTGI:36,8,2,"5F6994C38BBE7F6E",0,0,0<cr><lf>+PPSTGI:36,8,3,"97F34E5070ED7EBF",0,0,0<cr><lf>+PPSTGI:36,8,4,"79FB52A884DD9875",0,0,0<cr><lf>+PPSTGI:36,8,5,"7B2C4E0065F695F465B095FB",0,0,0<cr><lf>+PPSTGI:36,8,6,"59296C14988462A5",0,0,
// Parse Item: "^SSTGI: <cmdtype>,<itemid>,"itemtext",<nextactionid>,<iconid>"
// +PPSTGI:<CmdType>,<ItemNum>,<ItemID>,<ItemText>,<ItemIconID>,<ItemIconQualifier>,<NextActionID>
if (!MatchStringBeginning(szRsp, "+PPSTGI:", szRsp) ||
!ParseUInt(szRsp, FALSE, nCmd, szRsp) ||
!ParseRspParamSeparator(szRsp, szRsp) ||
!ParseUInt(szRsp, FALSE, nItem, szRsp) || //itemNum
!ParseRspParamSeparator(szRsp, szRsp) ||
!ParseUInt(szRsp, FALSE, nItem, szRsp) || //itemID
!ParseRspParamSeparator(szRsp, szRsp) ||
!ParseUCS2String(szRsp, wszText, UCS2_LEN, szRsp) ||
!ParseRspParamSeparator(szRsp, szRsp) ||
!ParseUInt(szRsp, FALSE, nIconId, szRsp) ||
!ParseRspParamSeparator(szRsp, szRsp) ||
!ParseUInt(szRsp, FALSE, nItemIconsQualifier,szRsp)||
!ParseRspParamSeparator(szRsp, szRsp) ||
!ParseUInt(szRsp, FALSE, nNextActionId, szRsp) ||
//!ParseRspParamSeparator(szRsp, szRsp) ||
!ParseRspPostfix(szRsp, szRsp)) {
RILRetailTrace((TEXT("RilDrv: SimToolkit:CSimToolkitHandling::ParseSelectItem error 3\r\n")));
PrepareRilCmdError(pSatCmd, SIM_RESPONSE_ERR_VALUESMISSING);
fRet = FALSE;
break;
}
dwLen = wcslen(wszText);
if (dwLen) {
dwLen = (dwLen + 1) * sizeof(WCHAR);
}
if (((BYTE*)pSatItem + ROUNDTODWORD2(sizeof(SIMMENUITEM), dwLen)) >= &(m_bCmdBuffer[SIMTK_MAX_LENGTH])) {
// Our temporary buffer on the stack is too small
PrepareRilCmdError(pSatCmd, SIM_RESPONSE_ERR_COMMANDDATA);
fRet = FALSE;
break;
}
pSatItem->dwParams = SIM_PARAM_SIMMENUITEM_FLAGS | SIM_PARAM_SIMMENUITEM_IDENTIFIER;
if (nDetails & 0x80) { pSatItem->dwFlags = SIMMENU_HELPINFO; }
pSatItem->dwIdentifier = nItem;
if (dwLen) {
pSatItem->dwParams |= SIM_PARAM_SIMMENUITEM_TEXTSIZE | SIM_PARAM_SIMMENUITEM_TEXTOFFSET;
pSatItem->dwTextSize = dwLen;
pSatItem->dwTextOffset = ROUNDTODWORD(sizeof(SIMMENUITEM));
wcscpy((WCHAR*)((BYTE*)pSatItem + pSatItem->dwTextOffset), wszText);
}
if (nNextActionId) {
pSatItem->dwParams |= SIM_PARAM_SIMMENUITEM_NEXTACTION;
pSatItem->dwNextAction = nNextActionId;
}
if (nIconId /*&& nItemIconsPresent*/) {
pSatItem->dwParams |= SIM_PARAM_SIMMENUITEM_ICONID | SIM_PARAM_SIMMENUITEM_ICONQUALIFIER;
pSatItem->dwIconIdentifier = nIconId;
pSatItem->dwIconQualifier = nItemIconsQualifier;
}
pSatItem->cbSize = ROUNDTODWORD2(sizeof(SIMMENUITEM), pSatItem->dwTextSize);
pSatMenu->dwMenuItemSize += pSatItem->cbSize;
pSatItem = (SIMMENUITEM*)((BYTE*)pSatItem + pSatItem->cbSize);
}
if (fRet) {
pSatMenu->cbSize += pSatMenu->dwMenuItemSize;
pSatCmd->cbSize += pSatMenu->cbSize;
pSatCmd->dwDetailsSize = pSatMenu->cbSize;
}
}
}
// Notify the SIM manager of the SAT command
if (!HandleBlob(RIL_NOTIFY_SIMTOOLKITCMD, pBlob, cbBlob , m_bCmdBuffer, pSatCmd->cbSize)) {
fRet = FALSE;
}
return fRet;
}
//////////////////////////////////////////////////////////////////////////////
//
// Internal parsing function.
//
// Return:
// TRUE or FALSE depending on the success of the operation.
//
//////////////////////////////////////////////////////////////////////////////
BOOL CSimToolkitHandling::ParseSetupMenu(LPCSTR szRsp, void*& pBlob, UINT& cbBlob)
{
UINT i, nCmd, nNumItems,/* nDetails,*/ nItem, nCmdQualifier, nDispMode;
UINT nItemIconsPresent, nItemIconsQualifier/*, nTitleIconQualifier, nTitleIconId*/;
UINT nNextActionId, nIconId;
DWORD dwLen;
RILSIMTOOLKITCMD* pSatCmd;
SIMMENU* pSatMenu;
SIMMENUITEM* pSatItem;
WCHAR wszText[UCS2_LEN + 1];
BOOL fRet = TRUE;
PrepareRilCmdStruct(m_bCmdBuffer, &pSatCmd, SIM_NOTIFY_SETUPMENU);
// Parse Title: "<CmdQualifier>,<NumItems>,<"titletext">,<dwIconID>,<itemiconqualifier>"
if (!ParseUInt(szRsp, FALSE, nCmdQualifier, szRsp) ||
!ParseRspParamSeparator(szRsp, szRsp) ||
!ParseUInt(szRsp, FALSE, nNumItems, szRsp) ||
!ParseRspParamSeparator(szRsp, szRsp) ||
!ParseUCS2String(szRsp, wszText, UCS2_LEN, szRsp) ||
!ParseRspParamSeparator(szRsp, szRsp) ||
!ParseUInt(szRsp, FALSE, nItemIconsPresent, szRsp) ||
!ParseRspParamSeparator(szRsp, szRsp) ||
!ParseUInt(szRsp, FALSE, nItemIconsQualifier, szRsp) ||
!ParseRspPostfix(szRsp, szRsp))
{
RILRetailTrace((TEXT("RilDrv: SimToolkitHandling::ParseSetupMenu(Analyse Failed!!!)\r\n")));
PrepareRilCmdError(pSatCmd, SIM_RESPONSE_ERR_VALUESMISSING);
fRet = FALSE;
} else {
RILRetailTrace((TEXT("RilDrv: SimToolkitHandling::ParseSetupMenu(CmdQua:%u,NumItem:%u,dwIconId:%u\r\n"), nCmdQualifier,nNumItems,nItemIconsPresent));
pSatMenu = (SIMMENU*)((BYTE*)pSatCmd + pSatCmd->dwDetailsOffset);
pSatMenu->dwParams = SIM_PARAM_SIMMENU_FLAGS | SIM_PARAM_SIMMENU_MENUITEMCOUNT |
SIM_PARAM_SIMMENU_MENUITEMOFFSET | SIM_PARAM_SIMMENU_MENUITEMSIZE;
if (nCmdQualifier & 0x80) { pSatMenu->dwFlags = SIMMENU_HELPINFO; }
if (wcslen(wszText)) {
pSatMenu->dwParams |= SIM_PARAM_SIMMENU_TEXTSIZE | SIM_PARAM_SIMMENU_TEXTOFFSET;
pSatMenu->dwTextSize = (wcslen(wszText) + 1) * sizeof(WCHAR);
pSatMenu->dwTextOffset = ROUNDTODWORD(sizeof(SIMMENU));
wcscpy((WCHAR*)((BYTE*)pSatMenu + pSatMenu->dwTextOffset), wszText);
}
if (1/*nTitleIconId*/) {
pSatMenu->dwParams |= SIM_PARAM_SIMMENU_ICONID | SIM_PARAM_SIMMENU_ICONQUALIFIER;
pSatMenu->dwIconIdentifier = nItemIconsPresent;
pSatMenu->dwIconQualifier = nItemIconsQualifier;
}
pSatMenu->dwMenuItemCount = nNumItems;
pSatMenu->dwMenuItemOffset = ROUNDTODWORD2(sizeof(SIMMENU), pSatMenu->dwTextSize);
pSatMenu->cbSize = ROUNDTODWORD2(sizeof(SIMMENU), pSatMenu->dwTextSize);
pSatItem = (SIMMENUITEM*)((BYTE*)pSatMenu + pSatMenu->dwMenuItemOffset);
for (i = 0; i < nNumItems; i++) {
// Parse Item: "+PPSTGI: <cmdtype>,<itemnum>,<itemid>,"itemtext",<iconId>,<dispMode>,<nai>"
if (!MatchStringBeginning(szRsp, "+PPSTGI:", szRsp) ||
!ParseUInt(szRsp, FALSE, nCmd, szRsp) ||
!ParseRspParamSeparator(szRsp, szRsp) ||
!ParseUInt(szRsp, FALSE, nItem, szRsp) || //this is number of menu items.
!ParseRspParamSeparator(szRsp, szRsp) ||
!ParseUInt(szRsp, FALSE, nItem, szRsp) ||
!ParseRspParamSeparator(szRsp, szRsp) ||
!ParseUCS2String(szRsp, wszText, UCS2_LEN, szRsp) ||
!ParseRspParamSeparator(szRsp, szRsp) ||
!ParseUInt(szRsp, FALSE, nIconId, szRsp) ||
!ParseRspParamSeparator(szRsp, szRsp) ||
!ParseUInt(szRsp, FALSE, nDispMode, szRsp) ||
!ParseRspParamSeparator(szRsp, szRsp) ||
!ParseUInt(szRsp, FALSE, nNextActionId, szRsp) ||
!ParseRspPostfix(szRsp, szRsp)) {
PrepareRilCmdError(pSatCmd, SIM_RESPONSE_ERR_VALUESMISSING);
fRet = FALSE;
break;
}
dwLen = wcslen(wszText);
if (dwLen) {
dwLen = (dwLen + 1) * sizeof(WCHAR);
}
if (((BYTE*)pSatItem + ROUNDTODWORD2(sizeof(SIMMENUITEM), dwLen)) >= &(m_bCmdBuffer[SIMTK_MAX_LENGTH])) {
// Our temporary buffer on the stack is too small
RILRetailTrace((TEXT("RilDrv: SimToolkitHandling::Our temporary buffer on the stack is too small\r\n")));
PrepareRilCmdError(pSatCmd, SIM_RESPONSE_ERR_COMMANDDATA);
fRet = FALSE;
break;
}
RILRetailTrace((TEXT("RilDrv: SimToolkitHandling::ParseSetupMenu(MenuItemId:%u\r\n"), nItem));
pSatItem->dwParams = SIM_PARAM_SIMMENUITEM_FLAGS | SIM_PARAM_SIMMENUITEM_IDENTIFIER;
if (nCmdQualifier & 0x80) { pSatItem->dwFlags = SIMMENU_HELPINFO; }
pSatItem->dwIdentifier = nItem;
if (dwLen) {
pSatItem->dwParams |= SIM_PARAM_SIMMENUITEM_TEXTSIZE | SIM_PARAM_SIMMENUITEM_TEXTOFFSET;
pSatItem->dwTextSize = dwLen;
pSatItem->dwTextOffset = ROUNDTODWORD(sizeof(SIMMENUITEM));
wcscpy((WCHAR*)((BYTE*)pSatItem + pSatItem->dwTextOffset), wszText);
}
if (nNextActionId) {
pSatItem->dwParams |= SIM_PARAM_SIMMENUITEM_NEXTACTION;
pSatItem->dwNextAction = nNextActionId;
}
if (nIconId && nItemIconsPresent) {
pSatItem->dwParams |= SIM_PARAM_SIMMENUITEM_ICONID | SIM_PARAM_SIMMENUITEM_ICONQUALIFIER;
pSatItem->dwIconIdentifier = nIconId;
pSatItem->dwIconQualifier = nDispMode/*nItemIconsQualifier*/;
}
pSatItem->cbSize = ROUNDTODWORD2(sizeof(SIMMENUITEM), pSatItem->dwTextSize);
pSatMenu->dwMenuItemSize += pSatItem->cbSize;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -