dial.c

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

C
1,946
字号
                 (TEXT("UNIMODEM:-ModemResponseHandler, Empty response\r\n")));        return MODEM_IGNORE;    }    DEBUGMSG(ZONE_CALLS,             (TEXT("UNIMODEM:ModemResponseHandler Modem Response '%a'\r\n"), pszResponse));    // Lets remove any leading CR/LF from orig command.    while( (CR == *pszOrigCommand) || (LF == *pszOrigCommand) )        pszOrigCommand++;        // First, check to see if this is just an echo of the command    if( NULL != pszOrigCommand )    {        DEBUGMSG(ZONE_FUNC,                 (TEXT("UNIMODEM:ModemResponseHandler Checking for echo of CMD %a\r\n"), pszOrigCommand));                if( ! strncmpi( pszResponse, pszOrigCommand, strlen(pszResponse) ) )        {            // Ignore this, it was just a duplicate            DEBUGMSG(ZONE_FUNC,                     (TEXT("UNIMODEM:-ModemResponseHandler, Command Echo\r\n")));            return MODEM_IGNORE;         }    }        DEBUGMSG(ZONE_FUNC,             (TEXT("UNIMODEM:ModemResponseHandler response was not an echo\r\n")));                // Regular Modems have a lookup table for responses            // Lets convert the ASCII response to a numeric code    for( i=0; i<SZ_RESPONSE_TABLE; i++ )    {        if( !strncmpi( pszResponse, ResponseTable[i].pszResponse,                       (strlen(ResponseTable[i].pszResponse) - 1) ) )        {                        wRespCode = ResponseTable[i].ModemRespCode;            break;        }    }    DEBUGMSG(ZONE_CALLS|ZONE_FUNC,             (TEXT("UNIMODEM:-ModemResponseHandler, %s\n"), ResponseName(wRespCode) ));    return wRespCode;}//// Expand macros and convert command to chars//LPSTRMdmConvertCommand(    WCHAR const *pszWCommand,    LPSTR pchCmd,    LPDWORD lpdwSize    ){    LPSTR lpstr;    WCHAR szExpand[256];    DWORD dwCmdLen;    if (pchCmd) {        lpstr = pchCmd;    } else {        lpstr = NULL;    }    if (!ExpandMacros((PWCHAR)pszWCommand, (PWCHAR)szExpand, 0, NULL, 0)) {        return NULL;    }    dwCmdLen = wcslen(szExpand) + 1;    if (lpstr == NULL) {        lpstr = TSPIAlloc(dwCmdLen);        if (lpstr == NULL) {            return NULL;        }    }    dwCmdLen = wcstombs( lpstr, szExpand, dwCmdLen );    if (lpdwSize) {        *lpdwSize = dwCmdLen;    }    return lpstr;}    BOOLMdmSendCommand(    PTLINEDEV pLineDev,    UCHAR const *pszCommand    ){    DWORD   dwLen;    BOOL bRet = FALSE;        //    // This routine sends a Modem command, and then waits for    // a valid response from the modem (or timeout).    //    try    {        if(  (HANDLE)INVALID_DEVICE != pLineDev->hDevice )        {                DEBUGMSG(ZONE_CALLS, (TEXT("UNIMODEM:MdmSendCommand '%a'\r\n"), pszCommand));            // Purge any old responses sitting in serial buffer            if (PurgeComm( pLineDev->hDevice, PURGE_RXCLEAR|PURGE_TXCLEAR )) {                // Set the Comm Mask for waitcommevent                if (SetCommMask(pLineDev->hDevice, EV_DEFAULT)) {                    // Now, lets send this nice new string to the modem                    bRet = WriteFile(pLineDev->hDevice, (LPVOID)pszCommand, strlen((LPVOID)pszCommand), &dwLen, 0 );                    if ((FALSE == bRet) || (dwLen != strlen((LPVOID)pszCommand))) {                        bRet = FALSE;                        RETAILMSG (1,                                   (TEXT("UNIMODEM:!!!MdmSendCommand wrote %d of %d byte dial string\r\n"),                                    dwLen, strlen((LPVOID)pszCommand)) );                                                                   DEBUGMSG(ZONE_MISC,                                 (TEXT("UNIMODEM:MdmSendCommand Wrote %d bytes of %d byte dial string\r\n"),                                  dwLen, strlen((LPVOID)pszCommand)) );                    }                }            }        }    }    except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?            EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {        // Just return of handle is bad    }    WriteModemLog(pLineDev, (PUCHAR)pszCommand, bRet ? MDMLOG_COMMAND_OK : MDMLOG_COMMAND_FAIL);    return bRet;}#ifdef DEBUGvoidDisplayModemStatus(    DWORD ModemStat    ){    WCHAR szModemStat[256];    szModemStat[0] = 0;    if( ModemStat & EV_BREAK)        wcscat(szModemStat, TEXT(" EV_BREAK"));    if( ModemStat & EV_CTS)        wcscat(szModemStat, TEXT(" EV_CTS"));    if( ModemStat & EV_DSR)        wcscat(szModemStat, TEXT(" EV_DSR"));    if( ModemStat & EV_ERR)        wcscat(szModemStat, TEXT(" EV_ERR"));    if( ModemStat & EV_RING)        wcscat(szModemStat, TEXT(" EV_RING"));    if( ModemStat & EV_RLSD)        wcscat(szModemStat, TEXT(" EV_RLSD"));    if( ModemStat & EV_RXCHAR)        wcscat(szModemStat, TEXT(" EV_RXCHAR"));    if( ModemStat & EV_RXFLAG)        wcscat(szModemStat, TEXT(" EV_RXFLAG"));    if( ModemStat & EV_TXEMPTY)        wcscat(szModemStat, TEXT(" EV_TXEMPTY"));    DEBUGMSG (ZONE_MISC, (TEXT("UNIMODEM:DisplayModemStatus ModemStat =%s\n"), szModemStat));}   // DisplayModemStatusvoidDisplayCommError(    DWORD dwCommError    ){    WCHAR szCommError[256];    szCommError[0] = 0;    if (dwCommError & CE_BREAK) {        wcscat(szCommError, TEXT(" CE_BREAK"));    }    if (dwCommError & CE_FRAME) {        wcscat(szCommError, TEXT(" CE_FRAME"));    }    if (dwCommError & CE_IOE) {        wcscat(szCommError, TEXT(" CE_IOE"));    }    if (dwCommError & CE_MODE) {        wcscat(szCommError, TEXT(" CE_MODE"));    }    if (dwCommError & CE_OOP) {        wcscat(szCommError, TEXT(" CE_OOP"));    }    if (dwCommError & CE_OVERRUN) {        wcscat(szCommError, TEXT(" CE_OVERRUN"));    }    if (dwCommError & CE_RXOVER) {        wcscat(szCommError, TEXT(" CE_RXOVER"));    }    if (dwCommError & CE_RXPARITY) {        wcscat(szCommError, TEXT(" CE_RXPARITY"));    }    if (dwCommError & CE_TXFULL) {        wcscat(szCommError, TEXT(" CE_TXFULL"));    }    if (dwCommError & CE_DNS) {        wcscat(szCommError, TEXT(" CE_DNS"));    }    if (dwCommError & CE_PTO) {        wcscat(szCommError, TEXT(" CE_PTO"));    }    DEBUGMSG (ZONE_MISC, (TEXT("UNIMODEM:DisplayCommError CommError=%s\n"), szCommError));}   // DisplayCommError#endifBOOLLineNotDropped(    PTLINEDEV pLineDev,    DEVSTATES OrigDevState    ){    if (pLineDev->DevState == OrigDevState) {        return TRUE;    }    return FALSE;}MODEMRESPCODESMdmGetResponse(    PTLINEDEV pLineDev,    PUCHAR    pszCommand,    BOOL      bLeaveCS    ){    MODEMRESPCODES ModemResp = MODEM_IGNORE;    DWORD   ModemStat;    UCHAR   InBuf[MAXSTRINGLENGTH];    int     i;    UCHAR   ModemResponse[MAXSTRINGLENGTH];    UINT16  ModemResponseIndex = 0;    DWORD   dwLen;    DEVSTATES OrigDevState;    PUCHAR  pchDCC; // either pchDCCCmd or pchDCCResp    MODEMRESPCODES DCCResp;    DWORD dwDCCLen;    BOOL bInCS;    DWORD OrigPendingOp;        DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:+MdmGetResponse for %a\r\n"), pszCommand));    OrigDevState = pLineDev->DevState;    OrigPendingOp = pLineDev->dwPendingType;    bInCS = bLeaveCS;    // Wait until we get some type of meaningful response from the modem    while ((MODEM_IGNORE == ModemResp) && LineNotDropped(pLineDev, OrigDevState))    {        try        {            ModemStat = 0;            if (bInCS) {                //                // To help avoid missing signals from SignalControlThread, stay in CS as long                // as possible before calling WaitCommEvent.                //                LeaveCriticalSection(&pLineDev->OpenCS);                bInCS = FALSE;            }            if (!WaitCommEvent( pLineDev->hDevice, &ModemStat, NULL)) {                dwLen = GetLastError();                DEBUGMSG(ZONE_CALLS, (TEXT("UNIMODEM:MdmGetResponse - WaitCommEvent failed %d\n"), dwLen));                ModemResp = MODEM_EXIT;                goto mgr_exit;            }            if (pLineDev->bWatchdogTimedOut) {                pLineDev->bWatchdogTimedOut = FALSE;                DEBUGMSG(ZONE_CALLS, (TEXT("UNIMODEM:MdmGetResponse - Watchdog timed out\n")));                ModemResp = MODEM_EXIT;                goto mgr_exit;            }            //            // Look for signals from SignalControlThread            //            if (pLineDev->dwPendingType != OrigPendingOp) {                DEBUGMSG(ZONE_CALLS, (TEXT("UNIMODEM:MdmGetResponse - Interrupted\n")));                ModemResp = MODEM_FAILURE;                goto mgr_exit;            }            if (ModemStat) {#ifdef DEBUG                DisplayModemStatus(ModemStat);#endif                if (ModemStat & EV_ERR) {                    if (ClearCommError(pLineDev->hDevice, &dwLen, NULL)) {#ifdef DEBUG                        if (dwLen) {                            DisplayCommError(dwLen);                        }                    } else {                        dwLen = GetLastError();                        DEBUGMSG(ZONE_CALLS, (TEXT("UNIMODEM:MdmGetResponse ClearCommError failed %d\n"), dwLen));#endif                    }                }                if( ModemStat & EV_RING) {                    ModemResp = MODEM_RING;                }                if ((ModemStat & EV_RXCHAR)  && LineNotDropped(pLineDev, OrigDevState))                {                    if (!ReadFile (pLineDev->hDevice, (LPVOID)InBuf, sizeof(InBuf), &dwLen, 0)) {                        DEBUGMSG(ZONE_CALLS, (TEXT("UNIMODEM:MdmGetResponse - ReadFile failed %d\n"), GetLastError()));                        ModemResp = MODEM_EXIT;                        goto mgr_exit;                    }                    InBuf[dwLen] = 0;                    WriteModemLog(pLineDev, (PUCHAR)InBuf, MDMLOG_RESPONSE);#ifdef DEBUG_RESPONSES                    if (dwLen) {                        DEBUGMSG(ZONE_CALLS, (TEXT("UNIMODEM:MdmGetResponse Response = %a\n"), InBuf));                    }#endif                    // Now lets process each response as they arrive                    for( i=0; i<(int)dwLen; i++ )                    {                        ModemResponse[ModemResponseIndex] = InBuf[i];                        if(  IS_NULL_MODEM(pLineDev) )                        {                            //                            // Only allow one response per call to MdmGetResponse for a DCC connection                            //                            ModemResp = MODEM_FAILURE;                            //                            // Are we client or server?                            //                            if (pLineDev->dwPendingType == PENDING_LINEMAKECALL) {                                pchDCC = (PUCHAR)pchDCCResp;                                DCCResp = MODEM_CONNECT;                            } else {                                pchDCC = (PUCHAR)pchDCCCmd;                                DCCResp = MODEM_RING;                            }                            dwDCCLen = strlen(pchDCC);                            if( ModemResponse[ModemResponseIndex] == pchDCC[ModemResponseIndex] )                            {                                ModemResponseIndex++;                                // characters match so far, see if we have a complete response.                                if( ModemResponseIndex >= dwDCCLen )                                {                                    // OK, we got a full response.  Zero terminate it and exit                                    ModemResponse[ModemResponseIndex] = 0;                                    // No need to call response handler, we already did all the work.                                    ModemResp = DCCResp;                                    DEBUGMSG (ZONE_CALLS, (TEXT("UNIMODEM:MdmGetResponse Null Response detected\r\n")));                                    break;                                }                                                            }                            else // character mismatch - restart scan sequence.                            {                                // If character is 'C', it might be first character of the actual                                // response.  Any other case means that all data up to here is useless                                // so we should toss it.  This is only true because 'C' appears only as                                // the first character of a response, and never after that.                                ModemResponseIndex = 0;                                if (pchDCC[0] == InBuf[i])                                {                                    ModemResponse[ModemResponseIndex] = InBuf[i];                                    ModemResponseIndex++;                                }                            }                        }                        else

⌨️ 快捷键说明

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