📄 comdial.c
字号:
#include <windows.h>
#include "comdial.h"
#include "resource.h"
extern MYTAPI mytapi;
extern HWND ghWnd;
extern HINSTANCE ghInst;
extern DWORD WINAPI ReadThread(LPVOID lpParams);
//000****************************************************************
LONG telephonyInitialize(HWND hWnd,HINSTANCE ghInst)
{
LONG lrc;
UINT i;
LINEEXTENSIONID extensions;
while ((lrc=lineInitialize(&mytapi.hTAPI,ghInst,
mytapi.CallbackProc=
(LINECALLBACK)LineCallbackProc,
NULL,&mytapi.dwNumLines))
==LINEERR_REINIT)
{
Sleep(5);
if (MessageBox(hWnd,
"Telephony system is reinitializing-Click Cancel to abort",
"Error",MB_RETRYCANCEL)
==IDCANCEL) goto done;
}
if (lrc) goto done;
mytapi.bInitialized=1;
for (i=0;i<mytapi.dwNumLines;i++) {
lrc=lineNegotiateAPIVersion(mytapi.hTAPI,i,
0x00010000,TAPI_CURRENT_VERSION,
&mytapi.dwVersionToUse,&extensions);
if (lrc) continue;
lrc=mylineGetDevCaps();
if (lrc) goto done;
if (mytapi.pLineDevCaps->dwMediaModes
& LINEMEDIAMODE_DATAMODEM)
{
mytapi.dwLine=i;
break;
}
}
if (lrc) goto done;
lrc=mylineGetOldDevConfig();
if (lrc) goto done;
lrc=mylineGetDevConfig();
if (lrc) goto done;
mytapi.hAsyncFuncEnded=
CreateEvent(NULL,TRUE,FALSE,NULL);
return lrc;
done:
ProcessTAPIError(lrc);
telephonyShutdown();
return lrc;
}
//001*****************************************************************
LONG telephonyOpen(HWND hWnd,HINSTANCE ghInst)
{
LONG lrc;
lrc=lineOpen(mytapi.hTAPI,mytapi.dwLine,&mytapi.hLine,
mytapi.dwVersionToUse,0,0,LINECALLPRIVILEGE_OWNER,
LINEMEDIAMODE_DATAMODEM,NULL);
if (lrc) goto done;
mytapi.bLineOpen=TRUE;
myDrawTAPIIcon(hWnd);
lrc=telephonyCaps();
if (lrc) goto done;
lrc=lineSetStatusMessages(mytapi.hLine,
mytapi.pLineDevCaps->dwLineStates,
mytapi.pLineAddressCaps->dwAddressStates);
if (lrc) goto done;
lrc=telephonyGetModemCaps();
if (lrc) goto done;
lrc=telephonyGetModemSettings();
if (lrc) goto done;
return lrc;
done:
ProcessTAPIError(lrc);
telephonyShutdown();
return lrc;
}
//002****************************************************************
LONG telephonyGetModemCaps()
{
DWORD dwsize=sizeof(COMMPROP)+sizeof(MODEMDEVCAPS);
LONG lrc;
if (mytapi.bCommPropAlloced) {
free(mytapi.pCommProp);
mytapi.bCommPropAlloced=FALSE;
}
if (!(mytapi.pCommProp=(COMMPROP *)calloc(1,dwsize)))
return LINEERR_NOMEM;
mytapi.bCommPropAlloced=TRUE;
mytapi.pCommProp->wPacketLength=(WORD)dwsize;
mytapi.pCommProp->dwProvSpec1=COMMPROP_INITIALIZED;
lrc=mylineGetID();
if (lrc) {
free(mytapi.pCommProp);
mytapi.bCommPropAlloced=FALSE;
return lrc;
}
lrc=GetCommProperties(mytapi.hComm,mytapi.pCommProp);
CloseHandle(mytapi.hComm);
mytapi.bGotCommHandle=FALSE;
if (!lrc) {
free(mytapi.pCommProp);
mytapi.bCommPropAlloced=FALSE;
myMessageBox("Error GetCommProperties");
return -1;
}
mytapi.pModemCaps=(MODEMDEVCAPS *)mytapi.pCommProp->wcProvChar;
dwsize=mytapi.pModemCaps->dwRequiredSize+sizeof(COMMPROP);
free(mytapi.pCommProp);
if (!(mytapi.pCommProp=(COMMPROP *)calloc(1,dwsize)))
return LINEERR_NOMEM;
mytapi.bCommPropAlloced=TRUE;
mytapi.pCommProp->wPacketLength=(WORD)dwsize;
mytapi.pCommProp->dwProvSpec1=COMMPROP_INITIALIZED;
lrc=mylineGetID();
if (lrc) {
free(mytapi.pCommProp);
mytapi.bCommPropAlloced=FALSE;
return lrc;
}
lrc=GetCommProperties(mytapi.hComm,mytapi.pCommProp);
CloseHandle(mytapi.hComm);
mytapi.bGotCommHandle=FALSE;
if (!lrc) {
free(mytapi.pCommProp);
mytapi.bCommPropAlloced=FALSE;
myMessageBox("Error GetCommProperties");
return -1;
}
mytapi.pModemCaps=(MODEMDEVCAPS *)mytapi.pCommProp->wcProvChar;
return 0;
}
//003****************************************************************************
LONG telephonyGetModemSettings()
{
DWORD dwsize=sizeof(COMMCONFIG)+sizeof(MODEMSETTINGS);
LONG lrc;
for (;;) {
if (mytapi.bCommConfigAlloced) {
free(mytapi.pCommConfig);
mytapi.bCommConfigAlloced=FALSE;
}
if (!(mytapi.pCommConfig=(COMMCONFIG *)calloc(1,dwsize)))
return LINEERR_NOMEM;
mytapi.bCommConfigAlloced=TRUE;
mytapi.pCommConfig->dwSize=dwsize;
lrc=mylineGetID();//require for MODDEM handle
if (lrc) {
free(mytapi.pCommConfig);
mytapi.bCommConfigAlloced=FALSE;
return lrc;
}
lrc=GetCommConfig(mytapi.hComm,mytapi.pCommConfig,&dwsize);
CloseHandle(mytapi.hComm);
mytapi.bGotCommHandle=FALSE;
if (!lrc) {
free(mytapi.pCommConfig);
mytapi.bCommConfigAlloced=FALSE;
myMessageBox("Error GetCommConfig");
return -1;
}
mytapi.pModemSettings=
(MODEMSETTINGS *)mytapi.pCommConfig->wcProviderData;
if (mytapi.pCommConfig->dwSize<dwsize) continue;
break;
}
return 0;
}
//004**************************************************************************************
void myDrawTAPIIcon(HWND hwnd)
{
HICON hIcon;
lineGetIcon(mytapi.dwLine,NULL,&hIcon);
SetClassLong(hwnd,GCL_HICON,(LONG)hIcon);
}
//005**************************************************************************************
LONG mylineGetDevConfig()
{
LONG lrc;
DWORD dwSize;
if (mytapi.bDevConfigAlloced) {
free(mytapi.pDevConfig);
mytapi.bDevConfigAlloced=FALSE;
}
if (!(mytapi.pDevConfig=(VARSTRING *)calloc(1,sizeof(VARSTRING))))
return LINEERR_NOMEM;
mytapi.bDevConfigAlloced=TRUE;
mytapi.pDevConfig->dwTotalSize=sizeof(VARSTRING);
for (;;) {
lrc=lineGetDevConfig(mytapi.dwLine,mytapi.pDevConfig,"comm/datamodem");
if (lrc) {
free(mytapi.pDevConfig);
mytapi.bDevConfigAlloced=FALSE;
return lrc;
}
if (mytapi.pDevConfig->dwTotalSize
< mytapi.pDevConfig->dwNeededSize)
{
dwSize=mytapi.pDevConfig->dwNeededSize;
free(mytapi.pDevConfig);
mytapi.bDevConfigAlloced=FALSE;
mytapi.pDevConfig=(VARSTRING *)calloc(1,dwSize);
if (!mytapi.pDevConfig) return LINEERR_NOMEM;
mytapi.bDevConfigAlloced=TRUE;
mytapi.pDevConfig->dwTotalSize=dwSize;
continue;
}
break;
}
return lrc;
}
//006*********************************************************************************
LONG mylineGetOldDevConfig()
{
LONG lrc;
DWORD dwSize;
if (mytapi.bOldDevConfigAlloced) {
free(mytapi.pOldDevConfig);
mytapi.bOldDevConfigAlloced=FALSE;
}
if (!(mytapi.pOldDevConfig=(VARSTRING *)calloc(1,sizeof(VARSTRING))))
return LINEERR_NOMEM;
mytapi.bOldDevConfigAlloced=TRUE;
mytapi.pOldDevConfig->dwTotalSize=sizeof(VARSTRING);
for (;;) {
lrc=lineGetDevConfig(mytapi.dwLine,mytapi.pOldDevConfig,"comm/datamodem");
if (lrc) {
free(mytapi.pOldDevConfig);
mytapi.bOldDevConfigAlloced=FALSE;
return lrc;
}
if (mytapi.pOldDevConfig->dwTotalSize
< mytapi.pOldDevConfig->dwNeededSize)
{
dwSize=mytapi.pOldDevConfig->dwNeededSize;
free(mytapi.pOldDevConfig);
mytapi.bOldDevConfigAlloced=FALSE;
mytapi.pOldDevConfig=(VARSTRING *)calloc(1,dwSize);
if (!mytapi.pOldDevConfig) return LINEERR_NOMEM;
mytapi.bOldDevConfigAlloced=TRUE;
mytapi.pOldDevConfig->dwTotalSize=dwSize;
continue;
}
break;
}
return lrc;
}
//007***************************************************************************************
LONG mylineGetID()
{
VARSTRING *vs;
CommID *cid;
LONG lrc;
DWORD dwSize;
mytapi.bGotCommHandle=FALSE;
if (!(vs=(VARSTRING *)calloc(1,sizeof(VARSTRING))))
return LINEERR_NOMEM;
vs->dwTotalSize=sizeof(VARSTRING);
for (;;) {
lrc=lineGetID(mytapi.hLine,0L,NULL,
LINECALLSELECT_LINE,vs,"comm/datamodem");
if (lrc) { free(vs); return lrc; }
if (vs->dwTotalSize<vs->dwNeededSize) {
dwSize=vs->dwNeededSize;
free(vs);
if (!(vs=(VARSTRING *)calloc(1,dwSize)))
return LINEERR_NOMEM;
vs->dwTotalSize=dwSize;
continue;
}
break;
}
cid=(CommID *)((LPSTR)vs+vs->dwStringOffset);
if (mytapi.bModemNameAlloced) {
free(mytapi.szModemName);
mytapi.bModemNameAlloced=FALSE;
}
if (!(mytapi.szModemName=(LPSTR)calloc(1,vs->dwStringSize)))
return LINEERR_NOMEM;
mytapi.bModemNameAlloced=TRUE;
lstrcpy(mytapi.szModemName,cid->szDeviceName);
mytapi.hComm=cid->hComm;
free(vs);
mytapi.bGotCommHandle=TRUE;
return lrc;
}
//008**********************************************************************
LONG mylineGetCallID()
{
CommID *cid;
VARSTRING *vs;
LONG lrc;
DWORD dwSize;
mytapi.bGotCommHandle=FALSE;
if (!(vs=(VARSTRING *)calloc(1,sizeof(VARSTRING))))
return LINEERR_NOMEM;
vs->dwTotalSize=sizeof(VARSTRING);
for (;;) {
lrc=lineGetID(NULL,0L,mytapi.hCall,
LINECALLSELECT_CALL,vs,"comm/datamodem");
if (lrc) { free(vs); return lrc; }
if (vs->dwTotalSize<vs->dwNeededSize) {
dwSize=vs->dwNeededSize;
free(vs);
if (!(vs=(VARSTRING *)calloc(1,dwSize)))
return LINEERR_NOMEM;
vs->dwTotalSize=dwSize;
continue;
}
break;
}
cid=(CommID *)((LPSTR)vs+vs->dwStringOffset);
if (mytapi.bModemNameAlloced) {
free(mytapi.szModemName);
mytapi.bModemNameAlloced=FALSE;
}
if (!(mytapi.szModemName=(LPSTR)calloc(1,vs->dwStringSize)))
return LINEERR_NOMEM;
mytapi.bModemNameAlloced=TRUE;
lstrcpy(mytapi.szModemName,cid->szDeviceName);
mytapi.hComm=cid->hComm;
free(vs);
mytapi.bGotCommHandle=TRUE;
return lrc;
}
//009**********************************************************************
LONG mylineGetDevCaps()
{
LONG lrc;
DWORD dwsize;
if (mytapi.bLineDevCapsAlloced) {
free(mytapi.pLineDevCaps);
mytapi.bLineDevCapsAlloced=FALSE;
}
if (!(mytapi.pLineDevCaps=(LINEDEVCAPS *)calloc(1,sizeof(LINEDEVCAPS))))
return LINEERR_NOMEM;
mytapi.bLineDevCapsAlloced=TRUE;
mytapi.pLineDevCaps->dwTotalSize=sizeof(LINEDEVCAPS);
for (;;) {
lrc=lineGetDevCaps(mytapi.hTAPI,mytapi.dwLine,
mytapi.dwVersionToUse,0,mytapi.pLineDevCaps);
if (lrc) {
free(mytapi.pLineDevCaps);
mytapi.bLineDevCapsAlloced=FALSE;
return lrc;
}
dwsize=mytapi.pLineDevCaps->dwNeededSize;
if (mytapi.pLineDevCaps->dwTotalSize<dwsize)
{
free(mytapi.pLineDevCaps);
mytapi.bLineDevCapsAlloced=FALSE;
mytapi.pLineDevCaps=(LINEDEVCAPS *)calloc(1,dwsize);
if (!mytapi.pLineDevCaps) return LINEERR_NOMEM;
mytapi.bLineDevCapsAlloced=TRUE;
mytapi.pLineDevCaps->dwTotalSize=dwsize;
continue;
}
break;
}
return lrc;
}
//010***************************************************************************************
LONG telephonyCaps()
{
LONG lrc,i;
DWORD dwsize;
if (mytapi.bLineAddressCapsAlloced) {
free(mytapi.pLineAddressCaps);
mytapi.bLineAddressCapsAlloced=FALSE;
}
if (!(mytapi.pLineAddressCaps=(LINEADDRESSCAPS *)calloc(1,sizeof(LINEADDRESSCAPS))))
return LINEERR_NOMEM;
mytapi.bLineAddressCapsAlloced=TRUE;
mytapi.pLineAddressCaps->dwTotalSize=sizeof(LINEADDRESSCAPS);
i=0;
do {
lrc=lineGetAddressCaps(mytapi.hTAPI,mytapi.dwLine,i,
mytapi.dwVersionToUse,0,mytapi.pLineAddressCaps);
if (lrc) {
free(mytapi.pLineAddressCaps);
mytapi.bLineAddressCapsAlloced=FALSE;
return lrc;
}
if (!(mytapi.pLineAddressCaps->
dwCallFeatures & LINECALLFEATURE_ANSWER))
{ i++; continue; }
dwsize=mytapi.pLineAddressCaps->dwNeededSize;
if (mytapi.pLineAddressCaps->dwTotalSize<dwsize)
{
free(mytapi.pLineAddressCaps);
mytapi.bLineAddressCapsAlloced=FALSE;
mytapi.pLineAddressCaps=(LINEADDRESSCAPS *)calloc(1,dwsize);
if (!mytapi.pLineAddressCaps) return LINEERR_NOMEM;
mytapi.bLineAddressCapsAlloced=TRUE;
mytapi.pLineAddressCaps->dwTotalSize=dwsize;
continue;
}
break;
} while ((unsigned)i<mytapi.pLineDevCaps->dwNumAddresses);
if ((unsigned)i==mytapi.pLineDevCaps->dwNumAddresses) {
free(mytapi.pLineAddressCaps);
mytapi.bLineAddressCapsAlloced=FALSE;
myMessageBox("Error lineGetAddressCaps");
return -1;
}
mytapi.dwAddress=i;
if (mytapi.bLineTranslateCapsAlloced) {
free(mytapi.pLineTranslateCaps);
mytapi.bLineTranslateCapsAlloced=FALSE;
}
if (!(mytapi.pLineTranslateCaps=(LINETRANSLATECAPS *)calloc(1,sizeof(LINETRANSLATECAPS))))
return LINEERR_NOMEM;
mytapi.bLineTranslateCapsAlloced=TRUE;
mytapi.pLineTranslateCaps->dwTotalSize=sizeof(LINETRANSLATECAPS);
for (;;) {
lrc=lineGetTranslateCaps(mytapi.hTAPI,
mytapi.dwVersionToUse,mytapi.pLineTranslateCaps);
if (lrc) {
free(mytapi.pLineTranslateCaps);
mytapi.bLineTranslateCapsAlloced=FALSE;
return lrc;
}
dwsize=mytapi.pLineTranslateCaps->dwNeededSize;
if (mytapi.pLineTranslateCaps->dwTotalSize<dwsize)
{
free(mytapi.pLineTranslateCaps);
mytapi.bLineTranslateCapsAlloced=FALSE;
mytapi.pLineTranslateCaps=(LINETRANSLATECAPS *)calloc(1,dwsize);
if (!mytapi.pLineTranslateCaps) return LINEERR_NOMEM;
mytapi.bLineTranslateCapsAlloced=TRUE;
mytapi.pLineTranslateCaps->dwTotalSize=dwsize;
continue;
}
break;
}
lrc=mylineGetLineDevStatus();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -