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

📄 secur.cpp

📁 手机RILGSM实现的源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*++
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.
Copyright (c) 1995-1999  Microsoft Corporation

Module Name:

secur.cpp

Abstract:


Notes:


--*/
//------------------------------------------------------------------------------
//    Revision History
//    Date                        Author                Activity ID                       Activity Headline
//    2006-02-20             wangzhengang     CEDB00006684               The roaming state is  not normal
//    2006-03-03             wangzhengang     CEDB00007941               service display  error
//    2006-03-13             caibeibei              CEDB00009451               remove 手机主界面显示通信运营商错误
//    2006-03-23             liuhongjie             CEDB00011160              A CMCC sim card with MNC: 02, An Roaming Icon will be displayed
//                                                                                                  But in fact, it's not Roaming status.
//    2007-06-09             xiefei                  CEDB00011160              Remove spec notify to APP for block MS popup the pin window
//    2007-09-03             Cuiguoqing           WM600013374              Synchronize codes between Projec Gallic and Projec Cynthia850.
//   2007-09-20            Cuiguoqing             WM600017567             Modify codes in order to  input PIN code for TI modem automatically.
//   2007-11-06            Cuiguoqing             WM600021830             fix the bug that no service after change pin with wrong original pin in Cynthia850_ver2.07.
//   2007-11-16            qinxuetao              WM600021585              Sending AT+COPS=0 only after unlocking PIN
//   2008-01-22            Cuiguoqing             WM600029911              change unlock phone timeout time and add two parameters for QueueCmd function for TI.
//   2008-02-28            Cuiguoqing             WM600032420              modify for save pin correctly after enable FDN with pin2.
//------------------------------------------------------------------------------

#include "precomp.h"

#include "rilproxyext_ioctl.h"
//static DWORD gPINbackTimes = 0;
//static CRilInstanceHandle* g_pHandle = NULL;

//add by fengguisen for test
BOOL g_HasGetISMI = FALSE;
LPCSTR g_szUserIdentityString;
extern BOOL g_bChangeCardPin;
//end add
//
//
//
#ifdef CHANGEPINWRONG
extern BOOL g_ChangePINWrong;
#endif
extern DWORD g_dwSimStatus;
extern ChangePINReg(DWORD dwPINState);
HRESULT ParseGetUserIdentity(LPCSTR szRsp, void*& pBlob, UINT& cbBlob)
{
    FUNCTION_TRACE(ParseGetUserIdentity);
    LPSTR szUserID = NULL;
#ifdef RIL_WATSON_REPORT
    char* szUserIDCache = g_RilInfoCache.szIMSI;
#endif // RIL_WATSON_REPORT
    HRESULT hr = S_OK;

    szUserID = (LPSTR)AllocBlob(MAXLENGTH_USERID);
    if (!szUserID) {
        hr = E_OUTOFMEMORY;
        goto Error;
    }
    memset(szUserID, 0x00, MAXLENGTH_USERID);

    //add by fengguisen for ISMI Cache
    RETAILMSG(1,(TEXT("[TI] ParseGetUserIdentity:Begin..\r\n")));
    if(!g_HasGetISMI)
    {
        g_szUserIdentityString = (LPSTR)AllocBlob(strlen(szRsp));
        if (!g_szUserIdentityString) 
        {
            hr = E_OUTOFMEMORY;
            goto Error;
        }
        memcpy((void*)g_szUserIdentityString,szRsp,strlen(szRsp));
        RETAILMSG(1,(TEXT("[TI] ParseGetUserIdentity:g_szUserIdentityString=%S..\r\n"),g_szUserIdentityString));
    }

    // Parse "<prefix><IMSI><postfix>"
    if (!ParseRspPrefix(szRsp, szRsp)                                        ||
        !ParseUnquotedString(szRsp, '\r', szUserID, MAXLENGTH_USERID, szRsp) ||
        !ParseRspPostfix(szRsp, szRsp)) {
        hr = E_FAIL;
        goto Error;
    }

#ifdef RIL_WATSON_REPORT
    // Copy IMSI to RIL Info Cache
    strncpy(szUserIDCache, szUserID, MAXLENGTH_USERID);
#endif // RIL_WATSON_REPORT

#ifdef RIL_FIX_CMCC_NETWORK_ISSUE  /*Added by liuhongjie 2006-03-17*/
    char cMccMncID[6] = {0};
    memcpy(cMccMncID,szUserID,5);
    /*Save SIM MCC and MNC network ID*/
    SetMCCMNCIdInSim( (DWORD)atoi(cMccMncID));
#endif
	
    pBlob = (void*)szUserID;
    cbBlob = MAXLENGTH_USERID;


    g_HasGetISMI = TRUE;
    RETAILMSG(1, (TEXT("[TI] ParseGetUserIdentity OK,g_HasGetISMI=%d,szUserID=%S\r\n"),g_HasGetISMI,szUserID));

Error:
    if (FAILED(hr)) {
        FreeBlob(szUserID);
    }
    return hr;
}


//
//
//
HRESULT RILDrv_GetUserIdentity(DWORD dwParam)
{
    FUNCTION_TRACE(RILDrv_GetUserIdentity);
    HRESULT hr = S_OK;
    CRilInstanceHandle* pHandle = ExtractHandle(dwParam);
    if (!pHandle) {
        hr = E_FAIL;
        goto Error;
    }

    if (!QueueCmd(pHandle, "AT+CIMI\r", CMDOPT_SUPPRESSLOGGING, APIID_GETUSERIDENTITY, ParseGetUserIdentity, NULL, hr)) {
        hr = E_FAIL;
        goto Error;
    }

	//add by fengguisen for Simultaneous voice and data call

//test for simultaneous data and voice connection

{
       DWORD CallType = RIL_SYSTEMCAPS_VOICEDATA ;
	CRilHandle * pRILHandle = pHandle->GetDevice();
       if(pRILHandle && pRILHandle->BroadcastRealBlobNotification(RIL_NOTIFY_SYSTEMCAPSCHANGED, &CallType, sizeof(CallType)))
       {
              RETAILMSG(1, (TEXT("[TI] OK:broadcast simultaneous data and voice connections\r\n")));
       }
       else
       {
              RETAILMSG(1, (TEXT("[TI] ERROR:broadcast simultaneous data and voice connections\r\n")));
       }
}
//end add

Error:
    return hr;
}


//
//
//
HRESULT ParseGetPhoneLockedState(LPCSTR szRsp, void*& pBlob, UINT& cbBlob)
{
    FUNCTION_TRACE(ParseGetPhoneLockedState);
    UINT i;
    DWORD* pdwState = NULL;
    char szState[MAX_PATH];
#ifdef RIL_WATSON_REPORT
    char* szUserIDCache = g_RilInfoCache.szIMSI;
#endif // RIL_WATSON_REPORT
    HRESULT hr = S_OK;

    pBlob = NULL;
    cbBlob = 0;

    pdwState = (DWORD*)AllocBlob(sizeof(DWORD));
    if (!pdwState) {
        hr = E_OUTOFMEMORY;
        goto Error;
    }
    memset(pdwState, 0x00, sizeof(DWORD));

    // Parse "<prefix>+CPIN: <state><postfix>"
    if (!ParseRspPrefix(szRsp, szRsp)                               ||
        !MatchStringBeginning(szRsp, "+CPIN: ", szRsp)              ||
        !ParseUnquotedString(szRsp, '\r', szState, MAX_PATH, szRsp) ||
        !ParseRspPostfix(szRsp, szRsp)) {
        hr = E_FAIL;
        goto Error;
    }
    for (i = 1; i <= NUM_LOCKEDSTATES; i++) {
        if (!strcmp(szState, g_rgszLockedStates[i])) {
            *pdwState = i;
/*
            if (i > 1)
            {
                RETAILMSG(1, (TEXT("[TI][zhn PIN back] ParseGetPhoneLockedState(), return PIN.\r\n")));

                if (gPINbackTimes == 1)
                {
                    // let MS not popup pin check window
                    *pdwState = RIL_LOCKEDSTATE_UNKNOWN;
                }
            }

            if (gPINbackTimes == 1)
            {
                g_pHandle->GetDevice()->BroadcastDWORDBlobNotification(RIL_NOTIFY_SPECSTARTCUSTPINCHECK, (DWORD) 2);
                RETAILMSG(1, (TEXT("[TI][zhn broadcast] ParseGetPhoneLockedState(), return PIN.\r\n")));
            }
*/
            break;
        }
    }
    RETAILMSG(1,(TEXT("[TI]ParseGetPhoneLockedState THE value of i is:%d \r\n"),i));
    if (i > NUM_LOCKEDSTATES) {
        // We couldn't match the response with anything
        *pdwState = RIL_LOCKEDSTATE_UNKNOWN;
    }
    else
    {
        UpdateSIMState(*pdwState);
        //add by qinxuetao for WM600021585
        g_dwSimStatus = *pdwState;

#ifdef RIL_WATSON_REPORT
        // Send command to update the IMSI in the info cache
        // if the IMSI cache has not been updated yet and the 
        // SIM state is ready.
        if (('\0' == *szUserIDCache) && (RIL_LOCKEDSTATE_READY == *pdwState) )
        {
            QueueCmdIgnoreRsp(APIID_NONE, "AT+CIMI\r", CMDOPT_SUPPRESSLOGGING | CMDOPT_IGNORERADIOOFF, g_TimeoutCmdInit, ParseGetUserIdentity, NULL, 0, 0, 0);
        }
#endif // RIL_WATSON_REPORT
    }
#ifdef CHANGEPINWRONG
    if (RIL_LOCKEDSTATE_READY == i)
    {
        g_ChangePINWrong = FALSE;
        RETAILMSG(1, (TEXT("[TI]Secur:set g_ChangePINWrong FALSE \r\n")));
    }
    if ((g_ChangePINWrong) && ((1 == i) || (2 == i)))
    {
        *pdwState = RIL_LOCKEDSTATE_READY;
        i = RIL_LOCKEDSTATE_READY;
    }
#endif
    //DMDC:change PIN state for app and other module,only for 3 state
    //note that regestry::--0: PIN ready; 1:PIN lock; 2:PUK block; 3:No SIM inserted
    if((SIM_NEED_PIN == *pdwState) || (SIM_NEED_PUK == *pdwState) || (NO_SIM_INSERT== *pdwState))
    {
        ChangePINReg(*pdwState-1);        
    }
    
    pBlob = (void*)pdwState;
    cbBlob = sizeof(DWORD);

Error:
    if (FAILED(hr)) {
        FreeBlob(pdwState);
    }
    return hr;
}


//
//
//
HRESULT RILDrv_GetPhoneLockedState(DWORD dwParam)
{
    FUNCTION_TRACE(RILDrv_GetPhoneLockedState);
    HRESULT hr = S_OK;
    CRilInstanceHandle* pHandle = ExtractHandle(dwParam);
    if (!pHandle) {
        hr = E_FAIL;
        goto Error;
    }
    RETAILMSG(1, (TEXT("[TI]RILDrv_GetPhoneLockedState().\r\n")));
    //gPINbackTimes++;
    //g_pHandle = pHandle;
    //end add

#ifdef WAVECOM_DRIVER
    // HW-SPECIFIC: WaveCom hardware doesn't provide an OK at the end of an AT+CPIN? response

    if (!QueueCmd(pHandle, "AT+CPIN?\r", CMDOPT_NONE, APIID_GETPHONELOCKEDSTATE, NULL, NULL, hr)) 
#else  // WAVECOM_DRIVER

    if (!QueueCmd(pHandle, "AT+CPIN?\r", CMDOPT_NONE, APIID_GETPHONELOCKEDSTATE, ParseGetPhoneLockedState, NULL, hr)) 
#endif // WAVECOM_DRIVER
    {
        hr = E_FAIL;
        goto Error;
    }

Error:
    return hr;
}


//
//
//
HRESULT RILDrv_UnlockPhone(DWORD dwParam, LPCSTR lpszPassword, LPCSTR lpszNewPassword)
{
    FUNCTION_TRACE(RILDrv_UnlockPhone);
    DEBUGCHK(NULL != lpszPassword);

    char szCmd[SECUR_CMDBUF_LENGTH];
    LPSTR szWalk = szCmd;
    HRESULT hr = S_OK;
    CRilInstanceHandle* pHandle = ExtractHandle(dwParam);
    if (!pHandle || !lpszPassword) {
        hr = E_FAIL;
        goto Error;
    }

    (void)_snprintfz(szWalk, SECUR_CMDBUF_LENGTH - (szWalk - szCmd), "AT+CPIN=\"%s\"", lpszPassword);
    szWalk = strchr(szWalk, '\0');  // NO_TYPO: 27
    DEBUGCHK(NULL != szWalk);

    if (lpszNewPassword) {
        (void)_snprintfz(szWalk, SECUR_CMDBUF_LENGTH - (szWalk - szCmd), ",\"%s\"", lpszNewPassword);
        szWalk = strchr(szWalk, '\0');  // NO_TYPO: 27
        DEBUGCHK(NULL != szWalk);
    }
    (void)strncpyz(szWalk, "\r", SECUR_CMDBUF_LENGTH - (szWalk - szCmd));  // NO_TYPO: 30

#ifdef RIL_RADIO_RESILIENCE
    if ((RIL_LOCKEDSTATE_SIM_PIN == g_dwSimStatus) || (RIL_LOCKEDSTATE_SIM_PUK == g_dwSimStatus) 
        || (RIL_LOCKEDSTATE_READY == g_dwSimStatus) || (RIL_LOCKEDSTATE_UNKNOWN == g_dwSimStatus))
        {
            // save the unlock code in case of radio reset 
            SavePINSecure(lpszNewPassword ? lpszNewPassword : lpszPassword);
        }
#endif // RIL_RADIO_RESILIENCE
    
    if (!QueueCmd(pHandle, szCmd, CMDOPT_UNLOCKING | CMDOPT_SUPPRESSLOGGING | CMDOPT_CPINENTERED, APIID_UNLOCKPHONE, NULL, NULL, hr,20000,0)) {
        hr = E_FAIL;
        goto Error;
    }

Error:
    return hr;
}


//
//
//
static HRESULT ParseGetLockingStatus(LPCSTR szRsp, void*& pBlob, UINT& cbBlob)
{
    FUNCTION_TRACE(ParseGetLockingStatus);
    UINT nValue;
    DWORD* pdwStatus = NULL;
    HRESULT hr = S_OK;

    pBlob = NULL;
    cbBlob = 0;

    pdwStatus = (DWORD*)AllocBlob(sizeof(DWORD));
    if (!pdwStatus) {
        hr = E_OUTOFMEMORY;
        goto Error;
    }
    memset(pdwStatus, 0x00, sizeof(DWORD));

    // Parse "<prefix>+CLCK: <status><postfix>"
    if (!ParseRspPrefix(szRsp, szRsp)                           ||
        !MatchStringBeginning(szRsp, "+CLCK: ", szRsp)          ||
        !ParseUIntAndVerifyAbove(szRsp, TRUE, 2, nValue, szRsp) ||
        !ParseRspPostfix(szRsp, szRsp)) {
        hr = E_FAIL;
        goto Error;
    }
    *pdwStatus = (nValue ? RIL_LOCKINGSTATUS_ENABLED : RIL_LOCKINGSTATUS_DISABLED);

    pBlob = (void*)pdwStatus;
    cbBlob = sizeof(DWORD);

Error:
    if (FAILED(hr)) {
        FreeBlob(pdwStatus);
    }
    return hr;
}


//
//
//
HRESULT RILDrv_GetLockingStatus(DWORD dwParam, DWORD dwFacility, LPCSTR lpszPassword)
{
    FUNCTION_TRACE(RILDrv_GetLockingStatus);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -