dial.c
来自「wince下的源代码集合打包」· C语言 代码 · 共 1,946 行 · 第 1/5 页
C
1,946 行
wcscpy(pszDialSuffix, TEXT(""));#ifdef TODO hPort->mi_fHaveDialSuffix = FALSE;#endif } else {#ifdef TODO hPort->mi_fHaveDialSuffix = TRUE;#endif ExpandMacros(pszTemp, pszDialSuffix, NULL, NULL, 0); } // read in prefix terminator dwSize = pLineDev->dwMaxCmd * SZWCHAR; if (ERROR_SUCCESS == MdmRegGetValue( pLineDev, szSettings, szTerminator, REG_SZ, (PUCHAR)pszTemp, &dwSize) ) { ExpandMacros(pszTemp, pszOrigSuffix, NULL, NULL, 0); wcscat(pszDialSuffix, pszOrigSuffix);#ifdef DEBUG if (wcslen(pszOrigSuffix) > wcslen(pszDialSuffix)) { DEBUGMSG( ZONE_DIAL, (TEXT("UNIMODEM:CreateDialCommands OrigSuffix longer than DialSuffix!!! (contact developer)\r\n"))); }#endif // DEBUG }#ifdef DEBUG if ((wcslen(pszDialPrefix) + wcslen(pszDialSuffix)) > pLineDev->dwMaxCmd) { DEBUGMSG( ZONE_DIAL, (TEXT("UNIMODEM:CreateDialCommands Prefix, Terminator, BlindOn/Off, Dial Prefix, and Dial Suffix are too long!\r\n"))); }#endif // DEBUG // allocate space for the phone number lines { DWORD dwCharsAlreadyTaken = wcslen(pszDialPrefix) + wcslen(pszDialSuffix); DWORD dwAvailCharsPerLine = (pLineDev->dwMaxCmd - dwCharsAlreadyTaken); DWORD dwPhoneNumLen = wcslen(pLineDev->szAddress); DWORD dwNumLines = dwPhoneNumLen ? (dwPhoneNumLen / dwAvailCharsPerLine + (dwPhoneNumLen % dwAvailCharsPerLine ? 1 : 0)) : 1; // handle null string dwSize = (dwPhoneNumLen + dwNumLines * (dwCharsAlreadyTaken + 1) + 1) * SZWCHAR; DEBUGMSG( ZONE_DIAL, (TEXT("UNIMODEM:CreateDialCommands Allocation sizes - prefix/suffix %d, Phone num %d, numLines %d\r\n"), dwCharsAlreadyTaken, dwPhoneNumLen, dwNumLines)); } DEBUGMSG( ZONE_DIAL, (TEXT("UNIMODEM:CreateDialCommands Allocate %d bytes for Dial Commands.\r\n"), dwSize)); dwSize *= 4; if (!(pszzDialCommands = (PWCHAR)TSPIAlloc(dwSize))) { DEBUGMSG( ZONE_DIAL, (TEXT("UNIMODEM:CreateDialCommands ran out of memory and failed a TSPIAlloc!\r\n"))); goto Failure; } DEBUGMSG( ZONE_DIAL, (TEXT("UNIMODEM:CreateDialCommands Allocated %d bytes at x%X for dial string\r\n"), dwSize, pszzDialCommands)); ptchDest = pszzDialCommands; // point to the beginning of the commands // build dial line(s):#ifndef BLIND_OPTION_IN_PREFIX // See above : we now split the blind dial out from the dial prefix. // read in prefix dwSize = pLineDev->dwMaxCmd * SZWCHAR; if (ERROR_SUCCESS != MdmRegGetValue( pLineDev, szSettings, szPrefix, REG_SZ, (PUCHAR)pszTemp, &dwSize) ) { goto Failure; } ExpandMacros(pszTemp, ptchDest, NULL, NULL, 0); // 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, ptchDest + wcslen(ptchDest), NULL, NULL, 0); DEBUGMSG( ZONE_DIAL, (TEXT("UNIMODEM:CreateDialCommands prepended Blind dial sequence = %s, len %d\r\n"), ptchDest, wcslen(ptchDest))); //OK, be sure to add a CR to this ExpandMacros(CR_MACRO, ptchDest + wcslen(ptchDest), NULL, NULL, 0); DEBUGMSG( ZONE_DIAL, (TEXT("UNIMODEM:CreateDialCommands prepended Blind dial sequence = %s, len %d\r\n"), ptchDest, wcslen(ptchDest))); // begin a new dial string ptchDest += wcslen(ptchDest) + 1;#endif // prime the pump DEBUGMSG( ZONE_DIAL, (TEXT("UNIMODEM:CreateDialCommands Copying Dial prefix %s to x%X\r\n"), pszDialPrefix, ptchDest)); wcscpy(ptchDest, pszDialPrefix); // do we have a dial suffix if ( /*!hPort->mi_fHaveDialSuffix*/ FALSE ) { #ifdef DEBUG // but, can we fit the dial string? if (wcslen(pszDialPrefix) + wcslen(pLineDev->szAddress) + wcslen(pszDialSuffix) + 1 > pLineDev->dwMaxCmd) { DEBUGMSG( ZONE_DIAL, (TEXT("UNIMODEM:CreateDialCommands dial string is too long and we don't have dial suffix capability\r\n"))); } // did we not want to originate? if (!(*fOriginate)) { DEBUGMSG( ZONE_DIAL, (TEXT("UNIMODEM:CreateDialCommands was told not to originate, but it has to because it doesn't have a dial suffix! (tsp screwed up!)\r\n"))); }#endif // DEBUG // build it DEBUGMSG( ZONE_DIAL, (TEXT("UNIMODEM:CreateDialCommands Appending phone number %s\r\n"), pLineDev->szAddress)); wcscat(ptchDest, pLineDev->szAddress); DEBUGMSG( ZONE_DIAL, (TEXT("UNIMODEM:CreateDialCommands Appending Dial Suffix %s\r\n"), pszDialSuffix)); wcscat(ptchDest, pszDialSuffix); DEBUGMSG( ZONE_DIAL, (TEXT("UNIMODEM:CreateDialCommands Final Dial String %s\n"), ptchDest)); } else { // we have a dial suffix. // populate new pszzDialCommands with semi-colons as necessary. // go through and add suffixi, making sure lines don't exceed pLineDev->dwMaxCmd ptchSrc = pLineDev->szAddress; // moves a character at a time. pszShortTemp[1] = 0; // null terminate the 1 character temp string // step through the source while (*ptchSrc) { if (wcslen(ptchDest) + wcslen(pszDialSuffix) + 1 > pLineDev->dwMaxCmd) { // finish up this string DEBUGMSG( ZONE_DIAL, (TEXT("UNIMODEM:CreateDialCommands Appending Dial suffix %s\r\n"), pszDialSuffix)); wcscat(ptchDest, pszDialSuffix); // begin a new string ptchDest += wcslen(ptchDest) + 1; DEBUGMSG( ZONE_DIAL, (TEXT("UNIMODEM:CreateDialCommands Copying Dial prefix %s for a new line at 0x%X\r\n"), pszDialPrefix, ptchDest)); wcscpy(ptchDest, pszDialPrefix); } else { // copy char DEBUGMSG( ZONE_DIAL, (TEXT("UNIMODEM:CreateDialCommands Appending character %c to dial string %s\r\n"), *ptchSrc, ptchDest)); pszShortTemp[0] = *ptchSrc; wcscat(ptchDest, pszShortTemp); ptchSrc++; } } // conclude with the approprate Suffix. DEBUGMSG( ZONE_DIAL, (TEXT("UNIMODEM:CreateDialCommands Appending Final Dial Suffix %s\r\n"), (*fOriginate ? pszOrigSuffix : pszDialSuffix))); wcscat(ptchDest, (*fOriginate ? pszOrigSuffix : pszDialSuffix)); } // close keys Exit: DEBUGMSG( ZONE_DIAL, (TEXT("UNIMODEM:CreateDialCommands Trying to free pszTemp x%X\r\n"), pszTemp)); TSPIFree(pszTemp); DEBUGMSG( ZONE_DIAL, (TEXT("UNIMODEM:-CreateDialCommands\r\n"))); return pszzDialCommands;Failure: if (pszzDialCommands) { DEBUGMSG( ZONE_DIAL|ZONE_ERROR, (TEXT("UNIMODEM:CreateDialCommands - Error, freeing dial string\r\n"))); TSPIFree(pszzDialCommands); pszzDialCommands = NULL; } goto Exit;}BOOLIsDigit( UCHAR ch ){ switch (ch) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': return TRUE; } return FALSE;}//// Extract the connection speed from an extended CONNECT or CARRIER modem response// and store it in pLineDev->dwCurrentBaudRate//voidParseConnectSpeed( PTLINEDEV pLineDev, PUCHAR pszResponse ){ DWORD dwSpeed = 0; PUCHAR psz; DEBUGMSG(ZONE_FUNC|ZONE_CALLS, (TEXT("UNIMODEM:+ParseConnectSpeed %a\n"), pszResponse)); // // CONNECT and CARRIER typically follow the form: // CONNECT <speed></protocol>< protocol> <compressed> // CARRIER <speed></protocol> < protocol> <compressed> // Sometimes there is a colon and/or a space before the speed. // Sometimes a K follows the speed indicating * 1000 // Sometimes there are commas in the speed // // // Skip to the first digit // psz = pszResponse; while (*psz) { if (IsDigit(*psz)) { break; } psz++; } while (*psz) { if (IsDigit(*psz)) { dwSpeed = dwSpeed * 10 + (DWORD)(*psz - '0'); } else if (*psz == 'K') { dwSpeed *= 1000; } else if (*psz != ',') { break; } psz++; } if (dwSpeed) { pLineDev->dwCurrentBaudRate = dwSpeed; if (pLineDev->htCall) { CallLineEventProc( pLineDev, pLineDev->htCall, LINE_CALLINFO, LINECALLINFOSTATE_RATE, 0, 0 ); } } DEBUGMSG(ZONE_FUNC|ZONE_CALLS, (TEXT("UNIMODEM:-ParseConnectSpeed %d\n"), dwSpeed));}constMODEM_RESPONSE ResponseTable[] ={ { "OK", MODEM_SUCCESS }, { "RING", MODEM_RING }, { "RINGING", MODEM_RING }, { "NO CARRIER", MODEM_HANGUP }, { "ERROR", MODEM_FAILURE }, { "NO DIALTONE", MODEM_NODIALTONE }, { "NO DIAL TONE", MODEM_NODIALTONE }, { "BUSY", MODEM_BUSY}, { "NO ANSWER", MODEM_NOANSWER }, { "CONNECT", MODEM_CONNECT }, { "FCERROR", MODEM_FAILURE }, { "FCON", MODEM_FAILURE }, { "BLACKLIST", MODEM_NOANSWER }, { "CARRIER", MODEM_CARRIER }, { "DATA", MODEM_FAILURE }, { "DATE", MODEM_PROGRESS }, { "DELAYED", MODEM_FAILURE }, { "DIALING", MODEM_PROGRESS }, { "FAX", MODEM_FAILURE }, { "VCON", MODEM_SUCCESS }, { "VOICE", MODEM_FAILURE }, { "PROTOCOL", MODEM_PROTOCOL }, { "RRING", MODEM_RING},};#ifdef DEBUGLPWSTRResponseName( MODEMRESPCODES MdmRsp ){ switch (MdmRsp) { case MODEM_SUCCESS: return TEXT("MODEM_SUCCESS"); case MODEM_PENDING: return TEXT("MODEM_PENDING"); case MODEM_CONNECT: return TEXT("MODEM_CONNECT"); case MODEM_FAILURE: return TEXT("MODEM_FAILURE"); case MODEM_HANGUP: return TEXT("MODEM_HANGUP"); case MODEM_NODIALTONE: return TEXT("MODEM_NODIALTONE"); case MODEM_BUSY: return TEXT("MODEM_BUSY"); case MODEM_NOANSWER: return TEXT("MODEM_NOANSWER"); case MODEM_RING: return TEXT("MODEM_RING"); case MODEM_CARRIER: return TEXT("MODEM_CARRIER"); case MODEM_PROTOCOL: return TEXT("MODEM_PROTOCOL"); case MODEM_PROGRESS: return TEXT("MODEM_PROGRESS"); case MODEM_UNKNOWN: return TEXT("MODEM_UNKNOWN"); case MODEM_IGNORE: return TEXT("MODEM_IGNORE"); case MODEM_EXIT: return TEXT("MODEM_EXIT"); default: return TEXT("UNKNOWN Modem Response Code!!!"); }}#endif // DEBUG// The only valid NULL_MODEM response is "CLIENTSERVER"const UCHAR pchDCCResp[] = "CLIENTSERVER";const UCHAR pchDCCCmd[] = "CLIENT"; #define SZ_RESPONSE_TABLE (sizeof(ResponseTable)/sizeof(MODEM_RESPONSE))MODEMRESPCODESModemResponseHandler( PTLINEDEV pLineDev, PUCHAR pszResponse, PUCHAR pszOrigCommand ){ UINT16 wRespCode = MODEM_UNKNOWN; int i; DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:+ModemResponseHandler x%X, x%X, x%X\r\n"), pLineDev, pszResponse, pszOrigCommand)); // Lets remove any leading CR/LF from response. while( (CR == *pszResponse) || (LF == *pszResponse) ) pszResponse++; if( 0 == *pszResponse ) { DEBUGMSG(ZONE_FUNC,
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?