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

📄 comdial.c

📁 支持XMODEM,YMODEM,FAX协议的串口通信软件包的下一个:基于TAPI应用的通信应用
💻 C
📖 第 1 页 / 共 3 页
字号:
//---------------------------------------------------------------------------
//
//  Module: comdial.c
//
//  Purpose:
//     This sample application demonstrates communications
//     in Windows 95.
//
//  Description of functions:
//     Descriptions are contained in the function headers.
//
//---------------------------------------------------------------------------
//
//  Written by Charles Mirho.
//  Copyright (c) 1996 Charles Mirho.  All Rights Reserved.
//
//---------------------------------------------------------------------------

#include "tty.h"
#include "resource.h"
#include "comdial.h"

HINSTANCE ghInst;		//global instance handle, for now.
HWND  hTTYWnd ;			//global window handle
PTTYINFO pTTYInfo;
extern MYTAPI mytapi;
#define MAXDSZ	30		//max size of dial string parts


LRESULT CALLBACK DialDialogProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
void MakeLettersIntoDigits (LPSTR dialstring);


#if !defined(_WIN32)
#include <ver.h>
#endif

// Windows NT defines APIENTRY, but 3.x doesn't
#if !defined (APIENTRY)
#define APIENTRY far pascal
#endif

// Windows 3.x uses a FARPROC for dialogs
#if !defined(_WIN32)
#define DLGPROC FARPROC
#endif

//
//   FUNCTION: WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
//
//   PURPOSE: calls initialization function, processes message loop
//

int APIENTRY WinMain(
               HINSTANCE hInstance,
               HINSTANCE hPrevInstance,
               LPSTR lpCmdLine,
               int nCmdShow
               )
{
    MSG msg;
    HMENU hMenu;
    BOOL bOldState = FALSE;


    // Other instances of app running?
    if (!hPrevInstance) {
       // Initialize shared things
       if (!InitApplication(hInstance)) {
          return (FALSE);               // Exits if unable to initialize
       }
    }

    if (NULL == (hTTYWnd = InitInstance( hInstance, nCmdShow )))
       return ( FALSE ) ;

    ghInst = hInstance;

    hMenu = GetMenu( hTTYWnd ) ;

    EnableMenuItem( hMenu, IDM_DISCONNECT,
                    MF_GRAYED | MF_DISABLED | MF_BYCOMMAND ) ;
    EnableMenuItem( hMenu, IDM_MAKECALL, 
				    MF_GRAYED | MF_DISABLED | MF_BYCOMMAND ) ;
	EnableMenuItem( hMenu, IDM_ANSWER,
	                MF_GRAYED | MF_DISABLED | MF_BYCOMMAND ) ;
    EnableMenuItem( hMenu, IDM_CONFIGUREMODEM,
                    MF_ENABLED | MF_BYCOMMAND ) ;

    CreateTTYInfo( hTTYWnd );
    if (NULL == (pTTYInfo =
          (PTTYINFO) GetWindowLong( hTTYWnd,GWL_PTTYINFO )))
	    return ( FALSE ) ;

	while (GetMessage(&msg, NULL, 0, 0)) {
   	    if (!TranslateAccelerator (msg.hwnd, ghAccel, &msg)) {
			TranslateMessage(&msg);// Translates virtual key codes
   	 		DispatchMessage(&msg); // Dispatches message to window
   	 	}
	} /* end while (not a quit message) */

    DestroyTTYInfo( hTTYWnd ) ;

   // Returns the value from PostQuitMessage
   return (msg.wParam);

   // This will prevent 'unused formal parameter' warnings
   lpCmdLine;
}

//---------------------------------------------------------------------------
//  BOOL NEAR InitApplication( HANDLE hInstance )
//
//  Description:
//     First time initialization stuff.  This registers information
//     such as window classes.
//
//  Parameters:
//     HANDLE hInstance
//        Handle to this instance of the application.
//
//---------------------------------------------------------------------------

BOOL NEAR InitApplication( HANDLE hInstance )
{
   WNDCLASS  wndclass ;

   // register tty window class

   wndclass.style =         0 ;
   wndclass.lpfnWndProc =   TTYWndProc ;
   wndclass.cbClsExtra =    0 ;
   wndclass.cbWndExtra =    sizeof( DWORD ) ;
   wndclass.hInstance =     hInstance ;
   wndclass.hIcon =         NULL;
   wndclass.hCursor =       LoadCursor( NULL, IDC_ARROW ) ;
   wndclass.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1) ;
   wndclass.lpszMenuName =  MAKEINTRESOURCE( IDR_MENU1) ;
   wndclass.lpszClassName = gszTTYClass ;

   return( RegisterClass( &wndclass ) ) ;

} // end of InitApplication()

//---------------------------------------------------------------------------
//  HWND NEAR InitInstance( HANDLE hInstance, int nCmdShow )
//
//  Description:
//     Initializes instance specific information.
//
//  Parameters:
//     HANDLE hInstance
//        Handle to instance
//
//     int nCmdShow
//        How do we show the window?
//
//---------------------------------------------------------------------------

HWND NEAR InitInstance( HANDLE hInstance, int nCmdShow )
{
   HWND  hTTYWnd ;

   // create the TTY window
   hTTYWnd = CreateWindow( gszTTYClass, gszAppName,
                           WS_OVERLAPPEDWINDOW,
                           CW_USEDEFAULT, CW_USEDEFAULT,
                           CW_USEDEFAULT, CW_USEDEFAULT,
                           NULL, NULL, hInstance, NULL ) ;

   if (NULL == hTTYWnd)
      return ( NULL ) ;

   ShowWindow( hTTYWnd, nCmdShow ) ;
   UpdateWindow( hTTYWnd ) ;

   return ( hTTYWnd ) ;

} // end of InitInstance()

//---------------------------------------------------------------------------
//  LRESULT FAR PASCAL  TTYWndProc( HWND hWnd, UINT uMsg,
//                                 WPARAM wParam, LPARAM lParam )
//
//  Description:
//     This is the TTY Window Proc.  This handles ALL messages
//     to the tty window.
//
//  Parameters:
//     As documented for Window procedures.
//
//---------------------------------------------------------------------------

LRESULT FAR PASCAL  TTYWndProc( HWND hWnd, UINT uMsg,
                                WPARAM wParam, LPARAM lParam )
{
   LONG lrc;
   HMENU hMenu;
   LONG lResult;

   switch (uMsg)
   {
      case WM_CREATE:
		mytapi.bInitialized = FALSE;
		break;

      case WM_COMMAND:
      {
         switch ((DWORD) wParam)
         {

			case IDM_DISCONNECT:

				// disconnect any connected calls
				lResult =  lineDrop(mytapi.hCall,NULL,0);
				if (!(lResult>0)) {
					ProcessTAPIError(lResult);
					MessageBox(hWnd, "ERROR", "Error dropping call", MB_OK);
				}
				// need to place a wait loop here until linedrop succeeds
				// then close the line, but do not completely shut down

				//telephonyShutdown();
			    hMenu = GetMenu(hWnd);
			    EnableMenuItem( hMenu, IDM_DISCONNECT, MF_GRAYED | MF_DISABLED | MF_BYCOMMAND ) ;
		    	EnableMenuItem( hMenu, IDM_MAKECALL, MF_GRAYED | MF_DISABLED | MF_BYCOMMAND ) ;
		    	EnableMenuItem( hMenu, IDM_ANSWER, MF_GRAYED | MF_DISABLED | MF_BYCOMMAND ) ;
				break;

            case IDM_ANSWER:

				if (!mytapi.bLineopen) {
					if (telephonyOpen(hWnd, ghInst)) {
						MessageBox(hWnd, "Error", "Error opening line", MB_OK);
						break;
					}
				}

				mytapi.bWaitForCall = TRUE;

				break;

            case IDM_MAKECALL: {
				char szTemp[60];
				LPLINETRANSLATEOUTPUT lto; 
				LINECALLPARAMS *pCallParams;

				if (!mytapi.bLineopen) {
					if (telephonyOpen(hWnd, ghInst)) {
						MessageBox(hWnd, "Error", "Error opening line", MB_OK);
						break;
					}
				}

				if (!(mytapi.pLineaddressstatus->dwAddressFeatures & 
					LINEADDRFEATURE_MAKECALL)) {
					MessageBox(hWnd, "Error", 
						       "Line/address does not support \
							   lineMakeCall", MB_OK);
					break;
				}

				if (!DialogBox (GetModuleHandle(NULL), 
					MAKEINTRESOURCE(IDD_DIAL), 
					hWnd, (DLGPROC)DialDialogProc))
					break;

				if (mytapi.szDialNumber[0] != '+') {
					szTemp[0] = '+';
					lstrcpy(&szTemp[1], mytapi.szDialNumber);
					lstrcpy(mytapi.szDialNumber, szTemp);
				}

				lResult =  lineTranslateDialog(mytapi.hTAPI, 
					mytapi.dwLine, mytapi.dwVersionToUse,
					hWnd, mytapi.szDialNumber);

				if (!(lResult==0)) {
					/* Process error */
					ProcessTAPIError(lResult);
					MessageBox(hWnd, "ERROR", "Error translating address", MB_OK);
					break;
				}

				lto = (LINETRANSLATEOUTPUT *) 
					  calloc(sizeof(LINETRANSLATEOUTPUT)+5000,1);
				lto->dwTotalSize = sizeof(LINETRANSLATEOUTPUT)+5000;
				lResult =  lineTranslateAddress(mytapi.hTAPI,
					mytapi.dwLine, mytapi.dwVersionToUse,
					mytapi.szDialNumber, 0,
					0,lto);
				if (!(lResult==0)) {
					/* Process error */
					ProcessTAPIError(lResult);
					MessageBox(hWnd, "ERROR", "Error translating address", MB_OK);
					free (lto);
					break;
				}
				else {
					memcpy (mytapi.szDialNumber, 
						    (LPSTR)
						    ((DWORD)lto+lto->dwDialableStringOffset), 
							lto->dwDialableStringSize);
					mytapi.szDialNumber[lto->dwDialableStringSize] = 0;
				}
				free (lto);
				
				pCallParams = (LINECALLPARAMS *) 
							  calloc(sizeof(LINECALLPARAMS),1);
				pCallParams->dwTotalSize = sizeof(LINECALLPARAMS);
				pCallParams->dwBearerMode = LINEBEARERMODE_VOICE;
				pCallParams->dwMediaMode = LINEMEDIAMODE_DATAMODEM;
				pCallParams->dwCallParamFlags = LINECALLPARAMFLAGS_IDLE;
				pCallParams->dwAddressMode = LINEADDRESSMODE_ADDRESSID;

				lResult =  lineMakeCall(mytapi.hLine, &mytapi.hCall,
					mytapi.szDialNumber, 0, pCallParams);
				if (!(lResult>0)) {
					ProcessTAPIError(lResult);
					MessageBox(hWnd, "ERROR", "Error making call", MB_OK);
					free (pCallParams);
					break;
				}
				free (pCallParams);
			    hMenu = GetMenu(hWnd);
			    EnableMenuItem( hMenu, IDM_DISCONNECT, MF_ENABLED | MF_BYCOMMAND ) ;

				break;

			}
            case IDM_CONFIGUREMODEM:

			    hMenu = GetMenu(hWnd);

				// if not initialized, do it now

				if (!mytapi.bInitialized) {
					if (telephonyInitialize(hWnd, ghInst)) {
						MessageBox(hWnd, "Error", "Error initializing", MB_OK);
						break;
					}

				    EnableMenuItem( hMenu, IDM_DISCONNECT, MF_GRAYED | MF_DISABLED | MF_BYCOMMAND ) ;
			    	EnableMenuItem( hMenu, IDM_MAKECALL, MF_ENABLED | MF_BYCOMMAND ) ;
					EnableMenuItem( hMenu, IDM_ANSWER, MF_ENABLED | MF_BYCOMMAND ) ;
				}
				// get new settings
				lResult = telephonySettings (hWnd);
				if (!(lResult==0)) {
					ProcessTAPIError(lResult);
					MessageBox(hWnd, "ERROR", "Error configuring modem", MB_OK);
				}

				break;


            case IDM_EXIT:
               PostMessage( hWnd, WM_CLOSE, 0, 0L ) ;
               break ;
         }
      }
      break ;

      case WM_PAINT:  {
	     PaintTTY( hWnd ) ;
         break ;
	  }
      case WM_SIZE:
         SizeTTY( hWnd, HIWORD( lParam ), LOWORD( lParam ) ) ;
         break ;

      case WM_HSCROLL:
         ScrollTTYHorz( hWnd, (WORD) wParam, LOWORD( lParam ) ) ;
         break ;

      case WM_VSCROLL:
         ScrollTTYVert( hWnd, (WORD) wParam, LOWORD( lParam ) ) ;
         break ;

      case WM_CHAR:

			  /* echo to local window if echo turned on */
		 	    if (LOCALECHO (pTTYInfo)) {
     	 			WriteTTYBlock(hWnd, (LPBYTE)&wParam, 1 );
				}

				if (!WriteFile(mytapi.hComm, (LPBYTE)&wParam, 1, &lrc, NULL)) {
					/* handle error */
					locProcessCommError(GetLastError ());
				} /* end if (error reading bytes) */

				break ;

      case WM_SETFOCUS:
         SetTTYFocus( hWnd ) ;
         break ;

      case WM_KILLFOCUS:
         KillTTYFocus( hWnd ) ;
         break ;

      case WM_DESTROY:
         PostQuitMessage( 0 ) ;
         break ;

      case WM_CLOSE:
         if (IDOK != MessageBox( hWnd, "OK to close window?", 
								 "TTY Sample",
                                 MB_ICONQUESTION | MB_OKCANCEL ))
            break ;

		// shutdown telephony 

		if (mytapi.bInitialized)
			telephonyShutdown();

      default:
         return( DefWindowProc( hWnd, uMsg, wParam, lParam ) ) ;
   }
   return 0L ;

} // end of TTYWndProc()

/****************************************************************************
    FUNCTION: DialDialogProc

⌨️ 快捷键说明

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