📄 fdemo.c
字号:
lpDevData->chtype = ATFX_CHTYPE(lpDevData->faxhandle);
// set firmware and library parameters
if (fx_setparm(lpDevData->faxhandle, FC_LOCALID, &lpDevData->devname) == -1) {
StatusMsg(hwnd, "Error 0x%x, setting FX_LOCALID\nDevice not initialized\n",
ATDV_LASTERR(lpDevData->faxhandle));
// if we get an error here, we probably won't be able to set other params
// either, just give up
return(FALSE);
}
// let fax library determine Phase D continuation values, set to DFC_AUTO
temp = DFC_AUTO;
fx_setparm(lpDevData->faxhandle, FC_SENDCONT, &temp);
// let fax libarary determine TIFF/F page numbering used
temp = TF_AUTOPG;
fx_setparm(lpDevData->faxhandle, FC_TFPGBASE, &temp);
// setup to accept incoming calls after first ring
temp = 1;
if (dx_setparm(lpDevData->voicehandle,DXCH_RINGCNT,&temp) == -1) {
StatusMsg(hwnd, "Error 0x%x, setting ring count\n",
ATDV_LASTERR(lpDevData->voicehandle));
return(FALSE);
}
if (dx_setevtmsk(lpDevData->voicehandle, DM_RINGS) == -1) {
StatusMsg(hwnd, "Error 0x%x, returned from dx_setevtmsk()\n",
ATDV_LASTERR(lpDevData->voicehandle));
return(FALSE);
}
// and set channel on hook
if (dx_sethook(lpDevData->voicehandle,DX_ONHOOK,EV_ASYNC) == -1) {
StatusMsg(hwnd, "Error 0x%x, setting device onhook\n",
ATDV_LASTERR(lpDevData->voicehandle));
return(FALSE);
}
// set state and print init complete msg
lpDevData->state = ST_WTRING;
return(TRUE);
}
/************************************************************
* NAME: ChildOnDestroy
* DESCRIPTION: Window being destroyed, NOTE: It is up to
* window destroyer to verify that channel is idle
************************************************************/
void ChildOnDestroy(HWND hwnd)
{
LPDEVDATA lpDevData;
// if not already freed up, close device and free channel structure
if ((lpDevData = GetDevPtr(hwnd)) != NULL) {
SetDevPtr(hwnd, NULL);
// close devices
fx_close(lpDevData->faxhandle);
dx_close(lpDevData->voicehandle);
// release memory DEVDATA structure for device
free(lpDevData);
}
}
/************************************************************
* NAME: ChildOnSysCommand
* DESCRIPTION: Check for window being closed from System memu
************************************************************/
void ChildOnSysCommand(HWND hwnd, UINT cmd, int x, int y)
{
if ((cmd&0xFFF0) == SC_CLOSE) {
// close the window
CloseFaxDevice(hwnd);
// note: CloseFaxDevice takes care of destroying window,
// so we don't need to pass the syscommand to the default
// window procedure.
return;
}
// otherwise pass it thru to default handler
FORWARD_WM_SYSCOMMAND(hwnd, cmd, x, y, ChildDefProc);
}
#define LEFTCOL 05
#define RIGHTCOL LEFTCOL+16
/************************************************************
* NAME: ChildOnPaint
* DESCRIPTION: Update the window client area, use device state
* to determine what to display
************************************************************/
void ChildOnPaint(HWND hwnd)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
LPDEVDATA lpDevData = GetDevPtr(hwnd);
if (lpDevData == NULL) {
return;
}
hdc = BeginPaint(hwnd, &ps);
SetBkMode(hdc, TRANSPARENT);
WinPrintfAt(hdc, 1, LEFTCOL, "Status: ");
switch (lpDevData->state) {
case ST_INIT:
WinPrintfAt(hdc, 1, RIGHTCOL, "Initializing...");
break;
case ST_WTRING:
WinPrintfAt(hdc, 1, RIGHTCOL, "Idle");
break;
case ST_RXOFFHK:
WinPrintfAt(hdc, 1, RIGHTCOL, "Incoming call...");
break;
case ST_RXRECVFAX:
if (lpDevData->remoteid[0] == 0) {
// not connected yet
WinPrintfAt(hdc, 1, RIGHTCOL, "Negotiating...");
}
else {
WinPrintfAt(hdc, 1, RIGHTCOL, "Receiving fax: \"%s\"", lpDevData->rxfilename);
WinPrintfAt(hdc, 2, LEFTCOL, "Connected to:");
WinPrintfAt(hdc, 2, RIGHTCOL, "\"%s\"", lpDevData->remoteid);
WinPrintfAt(hdc, 3, LEFTCOL, "Connected at:");
WinPrintfAt(hdc, 3, RIGHTCOL, "%d, %s",
ATFX_SPEED(lpDevData->faxhandle),
Coding[ATFX_CODING(lpDevData->faxhandle)]);
WinPrintfAt(hdc, 4, LEFTCOL, "Receiving page:");
WinPrintfAt(hdc, 4, RIGHTCOL, "%d",ATFX_PGXFER(lpDevData->faxhandle)+1);
}
break;
case ST_TXOFFHK:
WinPrintfAt(hdc, 1, RIGHTCOL, "Setup...");
break;
case ST_TXDIAL:
WinPrintfAt(hdc, 1, RIGHTCOL, "Dialing \"%s\"...", lpDevData->dialstr);
break;
case ST_TXSENDFAX:
if (lpDevData->remoteid[0] == 0) {
// not connected yet
WinPrintfAt(hdc, 1, RIGHTCOL, "Connecting to \"%s\"...", lpDevData->dialstr);
}
else {
WinPrintfAt(hdc, 1, RIGHTCOL, "Sending fax...");
WinPrintfAt(hdc, 2, LEFTCOL, "Connected to:");
WinPrintfAt(hdc, 2, RIGHTCOL, "\"%s\"", lpDevData->remoteid);
WinPrintfAt(hdc, 3, LEFTCOL, "Connected at:");
WinPrintfAt(hdc, 3, RIGHTCOL, "%d, %s, %s",
ATFX_SPEED(lpDevData->faxhandle),
(ATFX_RESLN(lpDevData->faxhandle) == DF_RESHI) ? "High Res" : " Low Res",
Coding[ATFX_CODING(lpDevData->faxhandle)]);
WinPrintfAt(hdc, 4, LEFTCOL, "Sending page:");
WinPrintfAt(hdc, 4, RIGHTCOL, "%d",ATFX_PGXFER(lpDevData->faxhandle)+1);
}
break;
case ST_ONHK:
WinPrintfAt(hdc, 1, RIGHTCOL, "Completed");
break;
}
// Display Status information at bottom of window
rect.left = LEFTCOL * tmAveCharWidth;
rect.top = 5 * tmHeight;
rect.right = 60 * tmAveCharWidth;
rect.bottom = 5 * tmHeight;
SetBkMode(hdc, TRANSPARENT);
DrawText(hdc, lpDevData->winbuff, -1, &rect,
DT_NOCLIP | DT_WORDBREAK | DT_NOPREFIX);
EndPaint(hwnd, &ps);
}
/************************************************************
* NAME: ChildOnSRLNotifyEvent
* DESCRIPTION: SRL notification Events for child window
* Process Voice/fax event and move to next state
* if an error is encountered, go back to ONHOOK state
************************************************************/
int WINAPI ChildOnSRLNotifyEvent(HWND hwnd, int evttype, int devhandle)
{
DX_CST *cstp;
int i;
LPDEVDATA lpDevData = GetDevPtr(hwnd);
char szBuff[MAXFILELEN];
void * evtdatap;
if (lpDevData == NULL) {
return 0;
}
// pull event from SRL queue
if (sr_waitevt(0) == -1) {
// This is an error, SRL sent msg notification, but there
// is no message! Just ignore it.
return 0;
}
// get pointer to additional data
evtdatap = sr_getevtdatap(0);
// process event
switch (evttype) {
case TDX_CST:
// only CST event we should get is DE_RINGS, ignore all others
cstp = (DX_CST *) evtdatap;
if ((cstp->cst_event == DE_RINGS) && (lpDevData->state == ST_WTRING)) {
// start receive call processing
lpDevData->state = ST_RXOFFHK;
// Clear screen buffer
lpDevData->winbuff[0] = 0;
lpDevData->remoteid[0] = 0;
if (dx_sethook(lpDevData->voicehandle, DX_OFFHOOK, EV_ASYNC) == -1) {
StatusMsg(hwnd, "dx_sethook DX_OFFHOOK error 0x%x, \"%s\"\n",
ATDV_LASTERR(lpDevData->voicehandle), ATDV_ERRMSGP(lpDevData->voicehandle));
lpDevData->state = ST_WTRING;
}
}
break;
case TDX_SETHOOK:
// sethook command complete
cstp = (DX_CST *) evtdatap;
if (cstp->cst_event == DX_ONHOOK) {
lpDevData->state = ST_WTRING;
break;
}
if (cstp->cst_event != DX_OFFHOOK) {
// if not offhook complete, we don't care
StatusMsg(hwnd, "unhandled cst_event 0x%x", cstp->cst_event);
break;
}
// offhook processing, either recvfax or sendfax
if (lpDevData->state == ST_RXOFFHK) {
// generate next receive filename and start recieve fax command
lpDevData->rxcount++;
sprintf(lpDevData->rxfilename,"%s_%2.2d.tif", &lpDevData->devname[4], lpDevData->rxcount);
strcpy(szBuff, szRxPath);
strcat(szBuff, lpDevData->rxfilename);
lpDevData->state = ST_RXRECVFAX;
if (fx_initstat(lpDevData->faxhandle, DF_RX) == -1) {
StatusMsg(hwnd, "fx_initstat DF_RX error 0x%x, \"%s\"\n",
ATDV_LASTERR(lpDevData->faxhandle), ATDV_ERRMSGP(lpDevData->faxhandle));
// go back onhook
lpDevData->state = ST_ONHK;
dx_sethook(lpDevData->voicehandle, DX_ONHOOK, EV_ASYNC);
break;
}
if (fx_rcvfax(lpDevData->faxhandle, szBuff, RXFLAGS) == -1) {
StatusMsg(hwnd, "fx_rcvfax error 0x%x, \"%s\"\n",
ATDV_LASTERR(lpDevData->faxhandle), ATDV_ERRMSGP(lpDevData->faxhandle));
// go back onhook
lpDevData->state = ST_ONHK;
dx_sethook(lpDevData->voicehandle, DX_ONHOOK, EV_ASYNC);
}
break;
}
if (lpDevData->state == ST_TXOFFHK) {
// Clear screen buffer
lpDevData->winbuff[0] = 0;
lpDevData->remoteid[0] = 0;
// dial number
lpDevData->state = ST_TXDIAL;
if (dx_dial(lpDevData->voicehandle, lpDevData->dialstr, NULL, EV_ASYNC) == -1) {
StatusMsg(hwnd, "dx_dial error 0x%x, \"%s\"\n",
ATDV_LASTERR(lpDevData->voicehandle), ATDV_ERRMSGP(lpDevData->voicehandle));
SendfaxCleanup(lpDevData,evttype);
// go back onhook
lpDevData->state = ST_ONHK;
dx_sethook(lpDevData->voicehandle, DX_ONHOOK, EV_ASYNC);
}
break;
}
StatusMsg(hwnd, "unhandled DX_OFFHOOK event");
// go back onhook
lpDevData->state = ST_ONHK;
dx_sethook(lpDevData->voicehandle, DX_ONHOOK, EV_ASYNC);
break;
case TDX_DIAL:
if (lpDevData->state == ST_TXDIAL) {
// dial complete, send fax command
lpDevData->state = ST_TXSENDFAX;
if (fx_initstat(lpDevData->faxhandle, DF_TX) == -1) {
StatusMsg(hwnd, "fx_initstat DF_TX error 0x%x, \"%s\"\n",
ATDV_LASTERR(lpDevData->faxhandle), ATDV_ERRMSGP(lpDevData->faxhandle));
SendfaxCleanup(lpDevData,evttype);
// go back onhook
lpDevData->state = ST_ONHK;
dx_sethook(lpDevData->voicehandle, DX_ONHOOK, EV_ASYNC);
break;
}
if (fx_sendfax(lpDevData->faxhandle, &lpDevData->sfl.iott[0], TXFLAGS) == -1) {
StatusMsg(hwnd, "fx_sendfax error 0x%x, \"%s\"\n",
ATDV_LASTERR(lpDevData->faxhandle), ATDV_ERRMSGP(lpDevData->faxhandle));
SendfaxCleanup(lpDevData,evttype);
// go back onhook
lpDevData->state = ST_ONHK;
dx_sethook(lpDevData->voicehandle, DX_ONHOOK, EV_ASYNC);
}
break;
}
break;
case TFX_PHASEB:
if ((ATFX_BSTAT(lpDevData->faxhandle) & DFS_REMOTEID) == DFS_REMOTEID) {
fx_getparm(lpDevData->faxhandle, FC_REMOTEID, szBuff);
// remove any leading/trailing spaces from remote id b4 storing it
strcpy(lpDevData->remoteid,strtrim(szBuff));
}
else {
strcpy(lpDevData->remoteid,"Not Available");
}
break;
case TFX_PHASED:
// no processing needed for Phase D, The UpdateWindow() call after
// the switch statement will cause the child window to be updated
break;
case TFX_FAXERROR:
i = ATFX_ESTAT(lpDevData->faxhandle);
StatusMsg(hwnd, "\nFax error 0x%x, \"%s\"\n E Status %d\n",
ATDV_LASTERR(lpDevData->faxhandle), ATDV_ERRMSGP(lpDevData->faxhandle), i);
// error cleanup, issue sethook
if (lpDevData->state == ST_RXRECVFAX) {
lpDevData->state = ST_ONHK;
dx_sethook(lpDevData->voicehandle, DX_ONHOOK, EV_ASYNC);
break;
}
// FALL THRU TO SENDFAX COMPLETE TO DO CLEANUP
case TFX_FAXSEND:
SendfaxCleanup(lpDevData,evttype);
if (evttype == TFX_FAXSEND) {
// remember, faxerror falls thru here
StatusMsg(hwnd, "Sent %d pages to \"%s\"",
ATFX_PGXFER(lpDevData->faxhandle), lpDevData->remoteid);
}
// and hangup
lpDevData->state = ST_ONHK;
dx_sethook(lpDevData->voicehandle, DX_ONHOOK, EV_ASYNC);
break;
case TFX_FAXRECV:
StatusMsg(hwnd, "Received %d pages from \"%s\"",
ATFX_PGXFER(lpDevData->faxhandle), lpDevData->remoteid);
lpDevData->state = ST_ONHK;
dx_sethook(lpDevData->voicehandle, DX_ONHOOK, EV_ASYNC);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -