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

📄 response.cpp

📁 手机RILGSM实现的源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
            cchUsed);
    }
    else
    {
        // Coding scheme is not GSM unpacked or UCS2
        goto Exit;
    }

    if (fConvertSucceeded)
    {
        if (cchUsed > dwSize)
        {
            // Overflow on text buffer! Truncating text.
            cchUsed = dwSize;
        }

        // null terminate
        wszText[cchUsed] = L'\0';

        // RIL driver only supports PSTR's for Operator Names.
        // Convert the Unicode text to an ANSI string as best possible.
        StringCchCopyA(szOut, dwSize, AnsiString(wszText));
        fRet = TRUE;
    }

Exit:
    if (NULL != wszText)
    {
        delete[] wszText;
    }

    return fRet;
}


void StartPlmnNameRead()
{
    RETAILMSG(1, (TEXT("########################## start of PLMN READ\r\n")));

    DWORD dwPlmnNameFileId;
    BOOL fReadCphsFile = TRUE;
    BOOL fReadPnnFile = TRUE;
    DWORD dwUseCphsPlmnName = 0;
    char *cptr = NULL;
    HRESULT hr = E_FAIL;
    DWORD dwSize = 0,cbSName =0;
#ifdef DISPLAY_SPN
#define SPNNAMEMAXLENTH   34
    byte displaycondition;
    dwPlmnNameFileId = 0x6f46;  // CPHS Operator Name String
    SPNStatus k( dwPlmnNameFileId );
    hr = k.Read();
    k.Dump();
    if ( SUCCEEDED( hr ) )
    {
        RILSIMRECORDSTATUS rsrs = k.GetStatus();
        if ( rsrs.dwParams & RIL_PARAM_SRS_SIZE )
        {
            SPNRecord kk( dwPlmnNameFileId, rsrs.dwSize );
            hr = kk.Read();
            kk.Dump();
            if ( SUCCEEDED( hr ) )
            {
                byte *m_ptr = new byte[ rsrs.dwSize+1 ];
                if ( m_ptr != NULL )
                {
                    dwSize = rsrs.dwSize;
                    BOOL fOk = kk.GetRecord((byte*)m_ptr, dwSize );
                    if ( fOk )
                    {
                            WCHAR SPNName[SPNNAMEMAXLENTH+1];	
				byte pchOut[SPNNAMEMAXLENTH+1];
			       DWORD i=0,j=0;
                            for(i=0;i<dwSize;i++)
                            {
                                if(m_ptr[i]!=0xff)
                                {
                                    pchOut[j++]= m_ptr[i];
                                    RETAILMSG(1,(TEXT("************SPNName[%d]:%c***********\r\n"),(j-1),pchOut[j-1]));  
                                }
                            }
                            pchOut[j] = '\0';
				cbSName =j;
			       displaycondition = pchOut[0];
	                     memset(SPNName,0,sizeof(SPNName));
                            if(pchOut[1]<0x80) //default gsm
                            {
                                MultiByteToWideChar(CP_ACP, 0, (char*)&pchOut[1], SPNNAMEMAXLENTH, SPNName, SPNNAMEMAXLENTH);
                            }
                            if(pchOut[1] ==0x80) // uncode
                            {
                                WCHAR chHigh=0,chLow = 0;
                                j=0;                        
                                for(DWORD i =0;i<cbSName-2; i = i+2)
                                {
                                    chHigh =pchOut[2+i];
                                    chHigh =chHigh << 8;
                                    chHigh =chHigh & 0xFF00;
                                    chLow =pchOut[2+i+1];
                                    chLow = chLow & 0x00FF;
                                    SPNName[j++] = (WCHAR)( chHigh | chLow );
                                }
                                SPNName[j] = L'\0';
                            }
				// Now don't deal with the case when (codec == 0x81 or 0x82)
                            else  
                            {
                                displaycondition = 0;
                            }
                          /*
                                   refer to 3gpp 1111-8a0.doc
                                   b1=0: display of registered PLMN not required
                                   b1=1: display of registered PLMN required
                          */
                            if(displaycondition!=0)
                            {
                                if( !SetRegistrySZ(HKEY_LOCAL_MACHINE, TEXT("System\\CardInfo\\Card2"), TEXT("SPNNAME"), SPNName) )
                                {
                                    RETAILMSG(1, (TEXT("[TI]ParseGetCurrentSPNname SET SpnName failed!\r\n")));
                                }
                                else
                                {
                                    RETAILMSG(1, (TEXT("[TI]ParseGetCurrentspnname SET SpnName succeeded!value is %s \r\n"),SPNName));
                                }
                            }
                    }
                    if ( m_ptr != NULL )
                    {
                        delete[] m_ptr;
                        m_ptr = NULL;
                    }
                }
            }
        }
    }
#endif
    dwPlmnNameFileId = 0x6FC5;
    if (GetRegistryDWORD(
        HKEY_LOCAL_MACHINE,
        g_tszRegKeyRIL,
        TEXT("UseCphsPlmnName"),
        &dwUseCphsPlmnName))
    {
        if (0 == dwUseCphsPlmnName)
        {
            fReadCphsFile = FALSE;
        }
        else
        {
            fReadPnnFile = FALSE;
        }
    }

    if ( g_pcszCPHS != NULL )
    {
        delete[] g_pcszCPHS;
        g_pcszCPHS = NULL;
    }

    if (fReadPnnFile)
    {
        CPHSStatus statusPnnFile(dwPlmnNameFileId);
        hr = statusPnnFile.Read();
        statusPnnFile.Dump();

        if (SUCCEEDED(hr))
        {
            RILSIMRECORDSTATUS rsrsPnn = statusPnnFile.GetStatus();

            if (RIL_PARAM_SRS_ALL == (RIL_PARAM_SRS_ALL & rsrsPnn.dwParams) &&
                RIL_SIMRECORDTYPE_LINEAR == rsrsPnn.dwRecordType &&
                0 < rsrsPnn.dwItemCount)
            {
                CPHSRecord recPnnFile(
                    dwPlmnNameFileId,
                    rsrsPnn.dwSize,
                    CPHSRecord::READ_RECORD,
                    1);
                hr = recPnnFile.Read();
                recPnnFile.Dump();

                if (SUCCEEDED(hr))
                {
                    dwSize = rsrsPnn.dwSize;
                    cptr = new char[dwSize+1];

                    if (ParsePnnNameRecord(recPnnFile, cptr, dwSize))
                    {
                        if (NULL != g_pcszCPHS)
                        {
                            delete[] g_pcszCPHS;
                        }
                        g_pcszCPHS   = cptr;
                        g_cphschange = TRUE;
                        cptr         = NULL;
                    }
                    else
                    {
                        hr = E_FAIL;
                    }

                    if ( cptr != NULL )
                    {
                        delete[] cptr;
                        cptr = NULL;
                    }
                }
            }
        }
    }

    if (fReadCphsFile && FAILED(hr))
    {
        dwPlmnNameFileId = 0x6f14;  // CPHS Operator Name String
        CPHSStatus k( dwPlmnNameFileId );
        hr = k.Read();
        k.Dump();
        if ( SUCCEEDED( hr ) )
        {
            RILSIMRECORDSTATUS rsrs = k.GetStatus();
            if ( rsrs.dwParams & RIL_PARAM_SRS_SIZE )
            {
                CPHSRecord kk( dwPlmnNameFileId, rsrs.dwSize );
                hr = kk.Read();
                kk.Dump();
                if ( SUCCEEDED( hr ) )
                {
                    cptr = new char[ rsrs.dwSize+1 ];
                    if ( cptr != NULL )
                    {
                        dwSize = rsrs.dwSize;
                        BOOL fOk = kk.GetRecord( (BYTE*)cptr, dwSize );
                        if ( fOk )
                        {
                            cptr[dwSize] = NULL;

                            /* mark end-of-record */
                            char *x = strchr( cptr, (char)0xFF );
                            if ( x != NULL )
                            {
                                *x = NULL;
                            }
                            x = NULL;
#ifdef RIL_FIX_CMCC_NETWORK_ISSUE                        
                            memset(cptr,0x00,rsrs.dwSize+1);
#endif                        
                            if (NULL != g_pcszCPHS)
                            {
                                delete[] g_pcszCPHS;
                            }
                            g_pcszCPHS   = cptr;
                            g_cphschange = TRUE;
                            cptr         = NULL;
                        }
                        if ( cptr != NULL )
                        {
                            delete[] cptr;
                            cptr = NULL;
                        }
                    }
                }
            }
        }
    }

    RETAILMSG(1, (TEXT("[TI]############################ end of CPHS READ\r\n")));
}

#ifdef RIL_ENABLE_EONS
void StartEONSRead()
{
    RETAILMSG(1, (TEXT("[TI]########################## start of EONS READ\r\n")));
    g_eons.Read();
    while( !g_eons.Ready() )
    {
        Sleep( 100 );
    }
    RETAILMSG(1, (TEXT("[TI]############################ end of EONS READ\r\n")));

    g_eons.Dump();

    /* we need to trigger an update */
    g_eonschange = TRUE;

    /* update cache */
    EONSCache cache( g_eons );
    cache.Write();

    /* sync the global cache object */
    g_eonscache.Invalidate();
    g_eonscache.Read();
}
#endif

#ifdef OEM1_DRIVER
static DWORD WINAPI StartSIMRecordReadThreadCB( LPVOID lpThreadData )
{
    StartPlmnNameRead();
#ifdef RIL_ENABLE_EONS
    StartEONSRead();
#endif
    return 0;
}
static void StartSIMRecordReadThread()
{
    /* do not block current thread -- do the SIM record read in another thread */
    HANDLE hThread = CreateThread(NULL, 0, &StartSIMRecordReadThreadCB, 0, 0, NULL);
    if ( hThread != NULL )
    {
        CloseHandle( hThread );
        hThread = NULL;
    }
}
#endif

//
// CME error mapping table must be in left hand sorted order
//
static const ERRORMAP g_rgemCMEErrors[] =
{
    { RIL_E_PHONEFAILURE,        0},
    { RIL_E_NOCONNECTION,        1},
    { RIL_E_LINKRESERVED,        2},
    { RIL_E_OPNOTALLOWED,        3},
    { RIL_E_OPNOTSUPPORTED,      4},
    { RIL_E_PHSIMPINREQUIRED,    5},
    { RIL_E_PHFSIMPINREQUIRED,   6},
    { RIL_E_PHFSIMPUKREQUIRED,   7},
    { RIL_E_SIMNOTINSERTED,     10},
    { RIL_E_SIMPINREQUIRED,     11},
    { RIL_E_SIMPUKREQUIRED,     12},
    { RIL_E_SIMFAILURE,         13},
    { RIL_E_SIMBUSY,            14},
    { RIL_E_SIMWRONG,           15},
    { RIL_E_INCORRECTPASSWORD,  16},
    { RIL_E_SIMPIN2REQUIRED,    17},
    { RIL_E_SIMPUK2REQUIRED,    18},
    { RIL_E_MEMORYFULL,         20},
    { RIL_E_INVALIDINDEX,       21},
    { RIL_E_NOTFOUND,           22},
    { RIL_E_MEMORYFAILURE,      23},
    { RIL_E_TEXTSTRINGTOOLONG,  24},
    { RIL_E_INVALIDTEXTSTRING,  25},
    { RIL_E_DIALSTRINGTOOLONG,  26},
    { RIL_E_INVALIDDIALSTRING,  27},
    { RIL_E_NONETWORKSVC,       30},
    { RIL_E_NETWORKTIMEOUT,     31},
    { RIL_E_EMERGENCYONLY,      32},
    { RIL_E_NETWKPINREQUIRED,   40},
    { RIL_E_NETWKPUKREQUIRED,   41},
    { RIL_E_SUBSETPINREQUIRED,  42},
    { RIL_E_SUBSETPUKREQUIRED,  43},
    { RIL_E_SVCPINREQUIRED,     44},
    { RIL_E_SVCPUKREQUIRED,     45},
    { RIL_E_CORPPINREQUIRED,    46},
    { RIL_E_CORPPUKREQUIRED,    47},
#if defined(OEM1_DRIVER) || defined(OEM2_DRIVER)
    { RIL_E_PHONEFAILURE,      100},
#endif
#if defined(OEM1_DRIVER) 
    { RIL_E_TIMEDOUT,          512},
#endif
    { RIL_E_NOTREADY,          515},
};
#define NUM_CMEERRORS       (sizeof(g_rgemCMEErrors) / sizeof(ERRORMAP))

#ifdef RIL_RADIO_RESILIENCE
//
// CME GPRS error mapping table must be in left hand sorted order
//
static const ERRORMAP g_rgemGPRSCMEErrors[] =
{    
    { RIL_E_ILLEGALMS,                                                          103},
    { RIL_E_ILLEGALME,                                                          106},
    { RIL_E_GPRSSERVICENOTALLOWED,                                  107},
    { RIL_E_PLMNNOTALLOWED,                                         111},
    { RIL_E_LOCATIONAREANOTALLOWED,                                 112},
    { RIL_E_ROAMINGNOTALLOWEDINTHISLOCATIONAREA,                    113},
    { RIL_E_SERVICEOPTIONNOTSUPPORTED,                              132},
    { RIL_E_REQUESTEDSERVICEOPTIONNOTSUBSCRIBED,                    133},
    { RIL_E_SERVICEOPTIONTEMPORARILYOUTOFORDER,                     134},
    { RIL_E_UNSPECIFIEDGPRSERROR,                                   148},
    { RIL_E_PDPAUTHENTICATIONFAILURE,                               149},
    { RIL_E_INVALIDMOBILECLASS,                                     150},
};
#define NUM_GPRSCMEERRORS       (sizeof(g_rgemGPRSCMEErrors) / sizeof(ERRORMAP))
#endif // RIL_RADIO_RESILIENCE

//
// CMS error mapping table must be in left hand sorted order
//
static const ERRORMAP g_rgemCMSErrors[] =
{
    { RIL_E_UNASSIGNEDNUMBER,         1},

⌨️ 快捷键说明

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