dial.c

来自「wince下的源代码集合打包」· C语言 代码 · 共 1,946 行 · 第 1/5 页

C
1,946
字号
// ******************************************************************// **Copyright (c) 1995-2000 Microsoft Corporation.  All rights reserved.// **             // ******************************************************************////	dial.c		The dialing state machine for Unimodem////	@doc	EX_TSPI////	@topic	TSPI |////		Tspi Stuff////#include "windows.h"#include "types.h"#include "memory.h"#include "mcx.h"#include "tspi.h"#include "linklist.h"#include "tspip.h"#include "tapicomn.h"#include "dial.h"#include "termctrl.h"#include "resource.h"// Functions from modem.cextern LONG ToggleCommMask(PTLINEDEV pLineDev);extern void SetDCBfromDevMiniCfg(DCB * pDCB,PDEVMINICFG lpDevMiniCfg);extern void WriteModemLog(PTLINEDEV pLineDev, UCHAR * szCommand, DWORD dwOp);// Unimodem thread priorityextern DWORD g_dwUnimodemThreadPriority;// Some keys we read to get modem related info from registryconst WCHAR szSettings[] =   TEXT("Settings");const WCHAR szDialSuffix[] = TEXT("DialSuffix");static const WCHAR szInit[] =   TEXT("Init");#define MAXINITKEYS 5static const PWCHAR szInitNum[MAXINITKEYS] = {    TEXT("1"),    TEXT("2"),    TEXT("3"),    TEXT("4"),    TEXT("5") };int strncmpi(char *dst, const char *src, long count){    while (count) {        if (toupper(*dst) != toupper(*src))            return 1;        if (*src == 0)            return 0;        dst++;        src++;        count--;    }    return 0;}/****************************************************************************** @doc INTERNAL @api BOOL | ExpandMacros | Takes the string pszLine, and copies it to  lpszVal after expanding macros  @parm char * | pszRegResponse | ptr to response string from registry.  @parm char * | pszExpanded | ptr to buffer to copy string to w/ macros expanded  @parm DWORD * | pdwValLen | length of pszVal w/ expanded macros.  @rdesc Returns FALSE if a needed macro translation could not be found in the pMacroXlations table, TRUE otherwise. *****************************************************************************/BOOLExpandMacros(    PWCHAR  pszRegResponse,    PWCHAR  pszExpanded,    DWORD * pdwValLen,    MODEMMACRO * pMdmMacro,    DWORD cbMacros    ){    PWCHAR pszValue;    DWORD cbTmp;    BOOL  bFound;    PWCHAR ptchTmp;    DWORD i;            DEBUGMSG(ZONE_DIAL, (TEXT("UNIMODEM:+ExpandMacros : Original \"%s\"\r\n"), pszRegResponse ));    pszValue = pszExpanded;    for ( ; *pszRegResponse; )     {        // check for a macro        if ( *pszRegResponse == LMSCH )         {            // <cr>            if (!wcsnicmp(pszRegResponse,CR_MACRO,CR_MACRO_LENGTH))             {                *pszValue++ = CR;                pszRegResponse += CR_MACRO_LENGTH;                continue;            }            // <lf>            if (!wcsnicmp(pszRegResponse,LF_MACRO,LF_MACRO_LENGTH))             {                *pszValue++ = LF;                pszRegResponse += LF_MACRO_LENGTH;                continue;            }            // <hxx>            if ((pszRegResponse[1] == 'h' || pszRegResponse[1] == 'H') &&                     isxdigit(pszRegResponse[2]) &&                     isxdigit(pszRegResponse[3]) &&                     pszRegResponse[4] == RMSCH )             {                *pszValue++ = (char) ((ctox(pszRegResponse[2]) << 4) + ctox(pszRegResponse[3]));                pszRegResponse += 5;                continue;            }            // <macro>            if (pMdmMacro)             {                bFound = FALSE;                // Check for a matching macro.                for (i = 0; i < cbMacros; i++)                {                    cbTmp = wcslen(pMdmMacro[i].MacroName);                    if (!wcsnicmp(pszRegResponse, pMdmMacro[i].MacroName, cbTmp))                    {                        ptchTmp = pMdmMacro[i].MacroValue;                        while (*ptchTmp)                        {                            *pszValue++ = *ptchTmp++;                        }                        pszRegResponse += cbTmp;                        bFound = TRUE;                        break;                    }                }                if (bFound)  // Did we get a match?                {                    continue;                }            }  // <macro>        } // LMSCH                // No matches, copy the character verbatim.        *pszValue++ = *pszRegResponse++;    } // for    *pszValue = 0;    if (pdwValLen)    {        *pdwValLen = pszValue - pszExpanded;    }    DEBUGMSG( ZONE_DIAL, (TEXT("UNIMODEM:-ExpandMacros : Expanded \"%s\"\r\n"), pszExpanded ));    return TRUE;}PWCHARCreateDialCommands(    PTLINEDEV pLineDev,    BOOL *fOriginate    ){    DWORD  dwSize;    PWCHAR pszTemp;    PWCHAR pszDialPrefix;    // ex. "ATX4DT" or "ATX3DT"    PWCHAR pszDialSuffix;    // ex. ";<cr>"    PWCHAR pszOrigSuffix;    // ex. "<cr>"    PWCHAR pszzDialCommands = NULL;    PWCHAR ptchSrc, ptchDest;    WCHAR  pszShortTemp[2];    static const WCHAR szPrefix[] =     TEXT("Prefix");    static const WCHAR szTerminator[] = TEXT("Terminator");    static const WCHAR szDialPrefix[] = TEXT("DialPrefix");    static const WCHAR szPulse[] =      TEXT("Pulse");    static const WCHAR szTone[] =       TEXT("Tone");    static const WCHAR *szDialType;  // szTone or szPulse    static const WCHAR szBlindOff[] =   TEXT("Blind_Off");    static const WCHAR szBlindOn[] =    TEXT("Blind_On");    static const WCHAR *szBlindType;  // szBlindOn or szBlindOff    DEBUGMSG( ZONE_DIAL, (TEXT("UNIMODEM:+CreateDialCommands - number %s\r\n"),               pLineDev->szAddress ? pLineDev->szAddress : TEXT("") ));     // Figure out fOriginate    ptchSrc = pLineDev->szAddress;        *fOriginate = TRUE;    while (*ptchSrc)    {        if (pLineDev->chContinuation == *ptchSrc)   // usually a semicolon        {            *fOriginate = FALSE;#ifdef DEBUG            // make sure the string is correctly formed.            if (ptchSrc[1])            {                DEBUGMSG(ZONE_DIAL, (TEXT("UNIMODEM: CreateDialCommands szPhoneNumber had a line continuation character not at the end.\r\n")));            }#endif // DEBUG        }        ptchSrc++;    }    // Trim the command continuation character off the end, now that we know this is not an origination string.    if (!(*fOriginate))    {        DEBUGMSG(ZONE_DIAL, (TEXT("UNIMODEM:CreateDialCommands Non-originate string, trim trailing \"%c\"\r\n"),pLineDev->chContinuation));#ifdef DEBUG        if (ptchSrc[-1] != pLineDev->chContinuation)    // usually a semicolon        {            DEBUGMSG( ZONE_DIAL, (TEXT("UNIMODEM:CreateDialCommands made a bad assumption.\r\n")));        }#endif // DEBUG        ptchSrc[-1] = 0;    }    // At this point, szPhoneNumber is just a string of digits to be dialed, with no semicolon at    // the end.  Plus we know whether to originate or not.    // make some temp space    dwSize = ((pLineDev->dwMaxCmd + 1 +    // pszTemp               pLineDev->dwMaxCmd + 1 +    // pszDialPrefix               pLineDev->dwMaxCmd + 1 +    // pszDialSuffix               pLineDev->dwMaxCmd + 1)     // pszOrigSuffix              * SZWCHAR);    pszTemp = (PWCHAR)TSPIAlloc( dwSize );    if (!pszTemp)    {        DEBUGMSG( ZONE_DIAL, (TEXT("UNIMODEM:-CreateDialCommands : out of memory.\r\n")));        return NULL;    }    DEBUGMSG(ZONE_DIAL, (TEXT("UNIMODEM:CreateDialCommands Allocated %d bytes at x%X for tmp dial strings\r\n"),               dwSize, pszTemp));    pszDialPrefix = pszTemp       + pLineDev->dwMaxCmd + 1;    pszDialSuffix = pszDialPrefix + pLineDev->dwMaxCmd + 1;    pszOrigSuffix = pszDialSuffix + pLineDev->dwMaxCmd + 1;        // read in prefix        dwSize = pLineDev->dwMaxCmd * SZWCHAR;        if (ERROR_SUCCESS !=            MdmRegGetValue( pLineDev,                            szSettings,                            szPrefix,                            REG_SZ,                            (PUCHAR)pszTemp,                            &dwSize) )        {            goto Failure;        }        ExpandMacros(pszTemp, pszDialPrefix, NULL, NULL, 0);                if ( (MDM_BLIND_DIAL & pLineDev->DevMiniCfg.dwModemOptions) ||             (MDM_BLIND_DIAL & pLineDev->dwDialOptions) )        {   // Turn on blind dialing            szBlindType = szBlindOn;            DEBUGMSG( ZONE_DIAL,                      (TEXT("UNIMODEM:CreateDialCommands BLIND DIALING - ModemOptions 0x%X, DialOptions 0x%X\r\n"),                       pLineDev->DevMiniCfg.dwModemOptions, pLineDev->dwDialOptions ));        }        else        {   // Turn off blind dialing            szBlindType = szBlindOff;                }            #ifdef BLIND_OPTION_IN_PREFIX        // read in appropriate blind options        dwSize = pLineDev->dwMaxCmd * SZWCHAR;        if (ERROR_SUCCESS !=            MdmRegGetValue( pLineDev,                            szSettings,                            szBlindType,                            REG_SZ,                            (PUCHAR)pszTemp,                            &dwSize) )        {            goto Failure;        }        ExpandMacros(pszTemp, pszDialPrefix + wcslen(pszDialPrefix), NULL, NULL, 0);#endif        // read in dial prefix    dwSize = pLineDev->dwMaxCmd * SZWCHAR;    if (ERROR_SUCCESS != MdmRegGetValue( pLineDev,                                         szSettings,                                         szDialPrefix,                                         REG_SZ,                                         (PUCHAR)pszTemp,                                         &dwSize) )    {        goto Failure;    }        ExpandMacros(pszTemp, pszDialPrefix + wcslen(pszDialPrefix), NULL, NULL, 0);            dwSize = pLineDev->dwMaxCmd * SZWCHAR;    if (MDM_TONE_DIAL & pLineDev->dwDialOptions)    {   // We want to do tone dialing        szDialType = szTone;    }    else    {   // We want to do pulse dialing        szDialType = szPulse;    }                if (ERROR_SUCCESS != MdmRegGetValue( pLineDev,                                         szSettings,                                         szDialType,                                         REG_SZ,                                         (PUCHAR)pszTemp,                                         &dwSize) )    {        goto Failure;    }        ExpandMacros(pszTemp, pszDialPrefix + wcslen(pszDialPrefix), NULL, NULL, 0);        // read in dial suffix    dwSize = pLineDev->dwMaxCmd * SZWCHAR;    if (ERROR_SUCCESS != MdmRegGetValue( pLineDev,                                         szSettings,                                         szDialSuffix,                                         REG_SZ,                                         (PUCHAR)pszTemp,                                         &dwSize) )    {

⌨️ 快捷键说明

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