⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fdemo.c

📁 传真示例
💻 C
📖 第 1 页 / 共 5 页
字号:
   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 + -