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

📄 rilsimtk_ozone.cpp

📁 windows mobile RIL软件
💻 CPP
📖 第 1 页 / 共 4 页
字号:
  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 + -