Annotation of mstools/samples/comm/tty.c, revision 1.1

1.1     ! root        1: //---------------------------------------------------------------------------
        !             2: //
        !             3: //  Module: tty.c
        !             4: //
        !             5: //  Purpose:
        !             6: //     The sample application demonstrates the usage of the COMM
        !             7: //     API.  It implements the new COMM API of Windows 3.1.
        !             8: //
        !             9: //     NOTE:  no escape sequences are translated, only
        !            10: //            the necessary control codes (LF, CR, BS, etc.)
        !            11: //
        !            12: //  Description of functions:
        !            13: //     Descriptions are contained in the function headers.
        !            14: //
        !            15: //  Development Team:
        !            16: //     Bryan A. Woodruff
        !            17: //
        !            18: //  History:   Date       Author      Comment
        !            19: //
        !            20: //              5/ 8/91   BryanW      Wrote it.
        !            21: //
        !            22: //             10/18/91   BryanW      Sanitized code & comments.
        !            23: //
        !            24: //             10/22/91   BryanW      Minor bug fixes.
        !            25: //
        !            26: //             12/31/91   BryanW      Ported to Win32 (NT).
        !            27: //
        !            28: //              2/10/92   BryanW      Fixed a problem with ReadCommBlock()
        !            29: //                                    and error detection.  ReadComm() is
        !            30: //                                    now performed... if the result is < 0
        !            31: //                                    the error status is read using
        !            32: //                                    GetCommError() and displayed.  The
        !            33: //                                    length is adjusted (*= -1).
        !            34: //
        !            35: //              2/13/92   BryanW      Updated to provide the option to
        !            36: //                                    implement/handle CN_RECEIVE
        !            37: //                                    notifications.
        !            38: //
        !            39: //              2/13/92   BryanW      Implemented forced DTR control. DTR
        !            40: //                                    is asserted on connect and dropped
        !            41: //                                    on disconnect.
        !            42: //
        !            43: //              2/21/92   BryanW      Removed overhead of local memory
        !            44: //                                    functions - now uses LPTR for
        !            45: //                                    allocation from heap.
        !            46: //
        !            47: //              2/26/92   BryanW      Fixed off by one problem in paint
        !            48: //                                    calculations.
        !            49: //
        !            50: //              6/15/92   BryanW      Ported the "updated" version of TTY
        !            51: //                                    for Win 3.1 including bug fixes.
        !            52: //
        !            53: //---------------------------------------------------------------------------
        !            54: //
        !            55: //  Written by Microsoft Product Support Services, Windows Developer Support.
        !            56: //  Copyright (c) 1991 Microsoft Corporation.  All Rights Reserved.
        !            57: //
        !            58: //---------------------------------------------------------------------------
        !            59: 
        !            60: #include "tty.h"
        !            61: 
        !            62: //---------------------------------------------------------------------------
        !            63: //  int PASCAL WinMain( HANDLE hInstance, HANDLE hPrevInstance,
        !            64: //                      LPSTR lpszCmdLine, int nCmdShow )
        !            65: //
        !            66: //  Description:
        !            67: //     This is the main window loop!
        !            68: //
        !            69: //  Parameters:
        !            70: //     As documented for all WinMain() functions.
        !            71: //
        !            72: //  History:   Date       Author      Comment
        !            73: //              5/ 8/91   BryanW      Wrote it.
        !            74: //
        !            75: //---------------------------------------------------------------------------
        !            76: 
        !            77: int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
        !            78:                     LPSTR lpszCmdLine, int nCmdShow )
        !            79: {
        !            80:    HWND  hTTYWnd ;
        !            81:    MSG   msg ;
        !            82: 
        !            83:    if (!hPrevInstance)
        !            84:       if (!InitApplication( hInstance ))
        !            85:          return ( FALSE ) ;
        !            86: 
        !            87:    if (NULL == (hTTYWnd = InitInstance( hInstance, nCmdShow )))
        !            88:       return ( FALSE ) ;
        !            89: 
        !            90:    while (GetMessage( &msg, NULL, 0, 0 ))
        !            91:    {
        !            92:       if (!TranslateAccelerator( hTTYWnd, ghAccel, &msg ))
        !            93:       {
        !            94:          TranslateMessage( &msg ) ;
        !            95:          DispatchMessage( &msg ) ;
        !            96:       }
        !            97:    }
        !            98:    return ( (int) msg.wParam ) ;
        !            99: 
        !           100: } // end of WinMain()
        !           101: 
        !           102: //---------------------------------------------------------------------------
        !           103: //  BOOL NEAR InitApplication( HANDLE hInstance )
        !           104: //
        !           105: //  Description:
        !           106: //     First time initialization stuff.  This registers information
        !           107: //     such as window classes.
        !           108: //
        !           109: //  Parameters:
        !           110: //     HANDLE hInstance
        !           111: //        Handle to this instance of the application.
        !           112: //
        !           113: //  History:   Date       Author      Comment
        !           114: //              5/ 8/91   BryanW      Wrote it.
        !           115: //             10/22/91   BryanW      Fixed background color problem.
        !           116: //
        !           117: //---------------------------------------------------------------------------
        !           118: 
        !           119: BOOL NEAR InitApplication( HANDLE hInstance )
        !           120: {
        !           121:    WNDCLASS  wndclass ;
        !           122: 
        !           123:    // register tty window class
        !           124: 
        !           125:    wndclass.style =         NULL ;
        !           126:    wndclass.lpfnWndProc =   TTYWndProc ;
        !           127:    wndclass.cbClsExtra =    0 ;
        !           128:    wndclass.cbWndExtra =    TTYEXTRABYTES ;
        !           129:    wndclass.hInstance =     hInstance ;
        !           130:    wndclass.hIcon =         LoadIcon( hInstance, MAKEINTRESOURCE( TTYICON ) );
        !           131:    wndclass.hCursor =       LoadCursor( NULL, IDC_ARROW ) ;
        !           132:    wndclass.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1) ;
        !           133:    wndclass.lpszMenuName =  MAKEINTRESOURCE( TTYMENU ) ;
        !           134:    wndclass.lpszClassName = gszTTYClass ;
        !           135: 
        !           136:    return( RegisterClass( &wndclass ) ) ;
        !           137: 
        !           138: } // end of InitApplication()
        !           139: 
        !           140: //---------------------------------------------------------------------------
        !           141: //  HWND NEAR InitInstance( HANDLE hInstance, int nCmdShow )
        !           142: //
        !           143: //  Description:
        !           144: //     Initializes instance specific information.
        !           145: //
        !           146: //  Parameters:
        !           147: //     HANDLE hInstance
        !           148: //        Handle to instance
        !           149: //
        !           150: //     int nCmdShow
        !           151: //        How do we show the window?
        !           152: //
        !           153: //  History:   Date       Author      Comment
        !           154: //              5/ 8/91   BryanW      Wrote it.
        !           155: //
        !           156: //---------------------------------------------------------------------------
        !           157: 
        !           158: HWND NEAR InitInstance( HANDLE hInstance, int nCmdShow )
        !           159: {
        !           160:    HWND  hTTYWnd ;
        !           161: 
        !           162:    // load accelerators
        !           163:    ghAccel = LoadAccelerators( hInstance, MAKEINTRESOURCE( TTYACCEL ) ) ;
        !           164: 
        !           165:    // create the TTY window
        !           166:    hTTYWnd = CreateWindow( gszTTYClass, gszAppName,
        !           167:                            WS_OVERLAPPEDWINDOW,
        !           168:                            CW_USEDEFAULT, CW_USEDEFAULT,
        !           169:                            CW_USEDEFAULT, CW_USEDEFAULT,
        !           170:                            NULL, NULL, hInstance, NULL ) ;
        !           171: 
        !           172:    if (NULL == hTTYWnd)
        !           173:       return ( NULL ) ;
        !           174: 
        !           175:    ShowWindow( hTTYWnd, nCmdShow ) ;
        !           176:    UpdateWindow( hTTYWnd ) ;
        !           177: 
        !           178:    return ( hTTYWnd ) ;
        !           179: 
        !           180: } // end of InitInstance()
        !           181: 
        !           182: //---------------------------------------------------------------------------
        !           183: //  LRESULT FAR PASCAL TTYWndProc( HWND hWnd, UINT uMsg,
        !           184: //                                 WPARAM wParam, LPARAM lParam )
        !           185: //
        !           186: //  Description:
        !           187: //     This is the TTY Window Proc.  This handles ALL messages
        !           188: //     to the tty window.
        !           189: //
        !           190: //  Parameters:
        !           191: //     As documented for Window procedures.
        !           192: //
        !           193: //  Win-32 Porting Issues:
        !           194: //     - WM_HSCROLL and WM_VSCROLL packing is different under Win-32.
        !           195: //     - Needed LOWORD() of wParam for WM_CHAR messages.
        !           196: //
        !           197: //  History:   Date       Author      Comment
        !           198: //              5/ 9/91   BryanW      Wrote it.
        !           199: //              6/15/92   BryanW      Kill focus before disconnecting.
        !           200: //              6/15/92   BryanW      Ported to Win-32.
        !           201: //
        !           202: //---------------------------------------------------------------------------
        !           203: 
        !           204: LRESULT FAR PASCAL TTYWndProc( HWND hWnd, UINT uMsg,
        !           205:                                WPARAM wParam, LPARAM lParam )
        !           206: {
        !           207:    switch (uMsg)
        !           208:    {
        !           209:       case WM_CREATE:
        !           210:          return ( CreateTTYInfo( hWnd ) ) ;
        !           211: 
        !           212:       case WM_COMMAND:
        !           213:       {
        !           214:          switch ( LOWORD( wParam ) )
        !           215:          {
        !           216:             case IDM_CONNECT:
        !           217:                if (!OpenConnection( hWnd ))
        !           218:                   MessageBox( hWnd, "Connection failed.", gszAppName,
        !           219:                               MB_ICONEXCLAMATION ) ;
        !           220:                break ;
        !           221: 
        !           222:             case IDM_DISCONNECT:
        !           223:                KillTTYFocus( hWnd ) ;
        !           224:                CloseConnection( hWnd ) ;
        !           225:                break ;
        !           226: 
        !           227:             case IDM_SETTINGS:
        !           228:             {
        !           229:                NPTTYINFO  npTTYInfo ;
        !           230: 
        !           231:                if (NULL == (npTTYInfo = GETNPTTYINFO( hWnd )))
        !           232:                   return ( FALSE ) ;
        !           233:                GoModalDialogBoxParam( GETHINST( hWnd ),
        !           234:                                       MAKEINTRESOURCE( SETTINGSDLGBOX ), hWnd,
        !           235:                                       SettingsDlgProc,
        !           236:                                       (LPARAM) (LPSTR) npTTYInfo ) ;
        !           237: 
        !           238:                // if fConnected, set new COM parameters
        !           239: 
        !           240:                if (CONNECTED( npTTYInfo ))
        !           241:                {
        !           242:                   if (!SetupConnection( hWnd ))
        !           243:                      MessageBox( hWnd, "Settings failed!", gszAppName,
        !           244:                                  MB_ICONEXCLAMATION ) ;
        !           245:                }
        !           246:             }
        !           247:             break ;
        !           248: 
        !           249:             case IDM_ABOUT:
        !           250:                GoModalDialogBoxParam ( GETHINST( hWnd ),
        !           251:                                        MAKEINTRESOURCE( ABOUTDLGBOX ),
        !           252:                                        hWnd,
        !           253:                                        AboutDlgProc, NULL ) ;
        !           254:                break;
        !           255: 
        !           256:             case IDM_EXIT:
        !           257:                PostMessage( hWnd, WM_CLOSE, NULL, 0L ) ;
        !           258:                break ;
        !           259:          }
        !           260:       }
        !           261:       break ;
        !           262: 
        !           263:       case WM_COMMNOTIFY:
        !           264:          ProcessCOMMNotification( hWnd, wParam, lParam ) ;
        !           265:          break ;
        !           266: 
        !           267:       case WM_PAINT:
        !           268:          PaintTTY( hWnd ) ;
        !           269:          break ;
        !           270: 
        !           271:       case WM_SIZE:
        !           272:          SizeTTY( hWnd, HIWORD( lParam ), LOWORD( lParam ) ) ;
        !           273:          break ;
        !           274: 
        !           275:       case WM_HSCROLL:
        !           276: #ifdef WIN32
        !           277:          ScrollTTYHorz( hWnd, LOWORD( wParam ), HIWORD( wParam ) ) ;
        !           278: #else
        !           279:          ScrollTTYHorz( hWnd, (WORD) wParam, LOWORD( lParam ) ) ;
        !           280: #endif
        !           281:          break ;
        !           282: 
        !           283:       case WM_VSCROLL:
        !           284: #ifdef WIN32
        !           285:          ScrollTTYVert( hWnd, LOWORD( wParam ), HIWORD( wParam ) ) ;
        !           286: #else
        !           287:          ScrollTTYVert( hWnd, (WORD) wParam, LOWORD( lParam ) ) ;
        !           288: #endif
        !           289:          break ;
        !           290: 
        !           291:       case WM_CHAR:
        !           292: #ifdef WIN32
        !           293:          ProcessTTYCharacter( hWnd, LOBYTE( LOWORD( wParam ) ) ) ;
        !           294: #else
        !           295:          ProcessTTYCharacter( hWnd, LOBYTE( wParam ) ) ;
        !           296: #endif
        !           297:          break ;
        !           298: 
        !           299:       case WM_SETFOCUS:
        !           300:          SetTTYFocus( hWnd ) ;
        !           301:          break ;
        !           302: 
        !           303:       case WM_KILLFOCUS:
        !           304:          KillTTYFocus( hWnd ) ;
        !           305:          break ;
        !           306: 
        !           307:       case WM_DESTROY:
        !           308:          DestroyTTYInfo( hWnd ) ;
        !           309:          PostQuitMessage( 0 ) ;
        !           310:          break ;
        !           311: 
        !           312:       case WM_CLOSE:
        !           313:          if (IDOK != MessageBox( hWnd, "OK to close window?", "TTY Sample",
        !           314:                                  MB_ICONQUESTION | MB_OKCANCEL ))
        !           315:             break ;
        !           316: 
        !           317:          // fall through
        !           318: 
        !           319:       default:
        !           320:          return( DefWindowProc( hWnd, uMsg, wParam, lParam ) ) ;
        !           321:    }
        !           322:    return 0L ;
        !           323: 
        !           324: } // end of TTYWndProc()
        !           325: 
        !           326: //---------------------------------------------------------------------------
        !           327: //  LRESULT NEAR CreateTTYInfo( HWND hWnd )
        !           328: //
        !           329: //  Description:
        !           330: //     Creates the tty information structure and sets
        !           331: //     menu option availability.  Returns -1 if unsuccessful.
        !           332: //
        !           333: //  Parameters:
        !           334: //     HWND  hWnd
        !           335: //        Handle to main window.
        !           336: //
        !           337: //  Win-32 Porting Issues:
        !           338: //     - Needed to initialize TERMWND( npTTYInfo ) for secondary thread.
        !           339: //     - Needed to create/initialize overlapped structures used in reads &
        !           340: //       writes to COMM device.
        !           341: //
        !           342: //  History:   Date       Author      Comment
        !           343: //             10/18/91   BryanW      Pulled from tty window proc.
        !           344: //              1/13/92   BryanW      Fixed bug with invalid handle
        !           345: //                                    caused by WM_SIZE sent by
        !           346: //                                    ResetTTYScreen().
        !           347: //
        !           348: //---------------------------------------------------------------------------
        !           349: 
        !           350: LRESULT NEAR CreateTTYInfo( HWND hWnd )
        !           351: {
        !           352:    HMENU       hMenu ;
        !           353:    NPTTYINFO   npTTYInfo ;
        !           354: 
        !           355:    if (NULL == (npTTYInfo =
        !           356:                    (NPTTYINFO) LocalAlloc( LPTR, sizeof( TTYINFO ) )))
        !           357:       return ( (LRESULT) -1 ) ;
        !           358: 
        !           359:    // initialize TTY info structure
        !           360: 
        !           361:    COMDEV( npTTYInfo )        = 0 ;
        !           362:    CONNECTED( npTTYInfo )     = FALSE ;
        !           363:    CURSORSTATE( npTTYInfo )   = CS_HIDE ;
        !           364:    LOCALECHO( npTTYInfo )     = FALSE ;
        !           365:    AUTOWRAP( npTTYInfo )      = TRUE ;
        !           366:    PORT( npTTYInfo )          = 1 ;
        !           367:    BAUDRATE( npTTYInfo )      = CBR_9600 ;
        !           368:    BYTESIZE( npTTYInfo )      = 8 ;
        !           369:    FLOWCTRL( npTTYInfo )      = FC_RTSCTS ;
        !           370:    PARITY( npTTYInfo )        = NOPARITY ;
        !           371:    STOPBITS( npTTYInfo )      = ONESTOPBIT ;
        !           372:    XONXOFF( npTTYInfo )       = FALSE ;
        !           373:    XSIZE( npTTYInfo )         = 0 ;
        !           374:    YSIZE( npTTYInfo )         = 0 ;
        !           375:    XSCROLL( npTTYInfo )       = 0 ;
        !           376:    YSCROLL( npTTYInfo )       = 0 ;
        !           377:    XOFFSET( npTTYInfo )       = 0 ;
        !           378:    YOFFSET( npTTYInfo )       = 0 ;
        !           379:    COLUMN( npTTYInfo )        = 0 ;
        !           380:    ROW( npTTYInfo )           = 0 ;
        !           381:    HTTYFONT( npTTYInfo )      = NULL ;
        !           382:    FGCOLOR( npTTYInfo )       = RGB( 0, 0, 0 ) ;
        !           383:    USECNRECEIVE( npTTYInfo )  = TRUE ;
        !           384:    DISPLAYERRORS( npTTYInfo ) = TRUE ;
        !           385: #ifdef WIN32
        !           386:    TERMWND( npTTYInfo ) =       hWnd ;
        !           387: 
        !           388:    // create I/O event used for overlapped reads / writes
        !           389: 
        !           390:    READ_OS( npTTYInfo ).hEvent = CreateEvent( NULL,    // no security
        !           391:                                               TRUE,    // explicit reset req
        !           392:                                               FALSE,   // initial event reset
        !           393:                                               NULL ) ; // no name
        !           394:    if (READ_OS( npTTYInfo ).hEvent == NULL)
        !           395:    {
        !           396:       LocalFree( npTTYInfo ) ;
        !           397:       return ( -1 ) ;
        !           398:    }
        !           399:    WRITE_OS( npTTYInfo ).hEvent = CreateEvent( NULL,    // no security
        !           400:                                                TRUE,    // explicit reset req
        !           401:                                                FALSE,   // initial event reset
        !           402:                                                NULL ) ; // no name
        !           403:    if (NULL == WRITE_OS( npTTYInfo ).hEvent)
        !           404:    {
        !           405:       CloseHandle( READ_OS( npTTYInfo ).hEvent ) ;
        !           406:       LocalFree( npTTYInfo ) ;
        !           407:       return ( -1 ) ;
        !           408:    }
        !           409: 
        !           410:    // create "posted notification" event
        !           411: 
        !           412:    POSTEVENT( npTTYInfo ) = CreateEvent( NULL,     // no security
        !           413:                                          TRUE,     // manual reset
        !           414:                                          TRUE,     // initial event is set
        !           415:                                          NULL ) ;  // no name
        !           416: 
        !           417:    if (POSTEVENT( npTTYInfo ) == NULL)
        !           418:    {
        !           419:       CloseHandle( READ_OS( npTTYInfo ).hEvent ) ;
        !           420:       CloseHandle( WRITE_OS( npTTYInfo ).hEvent ) ;
        !           421:       LocalFree( npTTYInfo ) ;
        !           422:       return ( -1 ) ;
        !           423:    }
        !           424: #endif
        !           425: 
        !           426:    // clear screen space
        !           427: 
        !           428:    _fmemset( SCREEN( npTTYInfo ), ' ', MAXROWS * MAXCOLS ) ;
        !           429: 
        !           430:    // setup default font information
        !           431: 
        !           432:    LFTTYFONT( npTTYInfo ).lfHeight =         12 ;
        !           433:    LFTTYFONT( npTTYInfo ).lfWidth =          0 ;
        !           434:    LFTTYFONT( npTTYInfo ).lfEscapement =     0 ;
        !           435:    LFTTYFONT( npTTYInfo ).lfOrientation =    0 ;
        !           436:    LFTTYFONT( npTTYInfo ).lfWeight =         0 ;
        !           437:    LFTTYFONT( npTTYInfo ).lfItalic =         0 ;
        !           438:    LFTTYFONT( npTTYInfo ).lfUnderline =      0 ;
        !           439:    LFTTYFONT( npTTYInfo ).lfStrikeOut =      0 ;
        !           440:    LFTTYFONT( npTTYInfo ).lfCharSet =        OEM_CHARSET ;
        !           441:    LFTTYFONT( npTTYInfo ).lfOutPrecision =   OUT_DEFAULT_PRECIS ;
        !           442:    LFTTYFONT( npTTYInfo ).lfClipPrecision =  CLIP_DEFAULT_PRECIS ;
        !           443:    LFTTYFONT( npTTYInfo ).lfQuality =        DEFAULT_QUALITY ;
        !           444:    LFTTYFONT( npTTYInfo ).lfPitchAndFamily = FIXED_PITCH | FF_MODERN ;
        !           445:    LFTTYFONT( npTTYInfo ).lfFaceName[0] =    NULL ;
        !           446: 
        !           447:    // set TTYInfo handle before any further message processing.
        !           448: 
        !           449:    SETNPTTYINFO( hWnd, npTTYInfo ) ;
        !           450: 
        !           451:    // reset the character information, etc.
        !           452: 
        !           453:    ResetTTYScreen( hWnd, npTTYInfo ) ;
        !           454: 
        !           455:    hMenu = GetMenu( hWnd ) ;
        !           456:    EnableMenuItem( hMenu, IDM_DISCONNECT,
        !           457:                    MF_GRAYED | MF_DISABLED | MF_BYCOMMAND ) ;
        !           458:    EnableMenuItem( hMenu, IDM_CONNECT, MF_ENABLED | MF_BYCOMMAND ) ;
        !           459: 
        !           460:    return ( (LRESULT) TRUE ) ;
        !           461: 
        !           462: } // end of CreateTTYInfo()
        !           463: 
        !           464: //---------------------------------------------------------------------------
        !           465: //  BOOL NEAR DestroyTTYInfo( HWND hWnd )
        !           466: //
        !           467: //  Description:
        !           468: //     Destroys block associated with TTY window handle.
        !           469: //
        !           470: //  Parameters:
        !           471: //     HWND hWnd
        !           472: //        handle to TTY window
        !           473: //
        !           474: //  Win-32 Porting Issues:
        !           475: //     - Needed to clean up event objects created during initialization.
        !           476: //
        !           477: //  History:   Date       Author      Comment
        !           478: //              5/ 8/91   BryanW      Wrote it.
        !           479: //              6/15/92   BryanW      Ported to Win-32.
        !           480: //
        !           481: //---------------------------------------------------------------------------
        !           482: 
        !           483: BOOL NEAR DestroyTTYInfo( HWND hWnd )
        !           484: {
        !           485:    NPTTYINFO npTTYInfo ;
        !           486: 
        !           487:    if (NULL == (npTTYInfo = GETNPTTYINFO( hWnd )))
        !           488:       return ( FALSE ) ;
        !           489: 
        !           490:    // force connection closed (if not already closed)
        !           491: 
        !           492:    if (CONNECTED( npTTYInfo ))
        !           493:       CloseConnection( hWnd ) ;
        !           494: 
        !           495: #ifdef WIN32
        !           496:    // clean up event objects
        !           497: 
        !           498:    CloseHandle( READ_OS( npTTYInfo ).hEvent ) ;
        !           499:    CloseHandle( WRITE_OS( npTTYInfo ).hEvent ) ;
        !           500:    CloseHandle( POSTEVENT( npTTYInfo ) ) ;
        !           501: #endif
        !           502: 
        !           503:    DeleteObject( HTTYFONT( npTTYInfo ) ) ;
        !           504: 
        !           505:    LocalFree( npTTYInfo ) ;
        !           506:    return ( TRUE ) ;
        !           507: 
        !           508: } // end of DestroyTTYInfo()
        !           509: 
        !           510: //---------------------------------------------------------------------------
        !           511: //  BOOL NEAR ResetTTYScreen( HWND hWnd, NPTTYINFO npTTYInfo )
        !           512: //
        !           513: //  Description:
        !           514: //     Resets the TTY character information and causes the
        !           515: //     screen to resize to update the scroll information.
        !           516: //
        !           517: //  Parameters:
        !           518: //     NPTTYINFO  npTTYInfo
        !           519: //        pointer to TTY info structure
        !           520: //
        !           521: //  History:   Date       Author      Comment
        !           522: //             10/20/91   BryanW      Wrote it.
        !           523: //
        !           524: //---------------------------------------------------------------------------
        !           525: 
        !           526: BOOL NEAR ResetTTYScreen( HWND hWnd, NPTTYINFO npTTYInfo )
        !           527: {
        !           528:    HDC         hDC ;
        !           529:    TEXTMETRIC  tm ;
        !           530:    RECT        rcWindow ;
        !           531: 
        !           532:    if (NULL == npTTYInfo)
        !           533:       return ( FALSE ) ;
        !           534: 
        !           535:    if (NULL != HTTYFONT( npTTYInfo ))
        !           536:       DeleteObject( HTTYFONT( npTTYInfo ) ) ;
        !           537: 
        !           538:    HTTYFONT( npTTYInfo ) = CreateFontIndirect( &LFTTYFONT( npTTYInfo ) ) ;
        !           539: 
        !           540:    hDC = GetDC( hWnd ) ;
        !           541:    SelectObject( hDC, HTTYFONT( npTTYInfo ) ) ;
        !           542:    GetTextMetrics( hDC, &tm ) ;
        !           543:    ReleaseDC( hWnd, hDC ) ;
        !           544: 
        !           545:    XCHAR( npTTYInfo ) = tm.tmAveCharWidth  ;
        !           546:    YCHAR( npTTYInfo ) = tm.tmHeight + tm.tmExternalLeading ;
        !           547: 
        !           548:    // a slimy hack to force the scroll position, region to
        !           549:    // be recalculated based on the new character sizes
        !           550: 
        !           551:    GetWindowRect( hWnd, &rcWindow ) ;
        !           552:    SendMessage( hWnd, WM_SIZE, SIZENORMAL,
        !           553:                 (LPARAM) MAKELONG( rcWindow.right - rcWindow.left,
        !           554:                                    rcWindow.bottom - rcWindow.top ) ) ;
        !           555: 
        !           556:    return ( TRUE ) ;
        !           557: 
        !           558: } // end of ResetTTYScreen()
        !           559: 
        !           560: //---------------------------------------------------------------------------
        !           561: //  BOOL NEAR PaintTTY( HWND hWnd )
        !           562: //
        !           563: //  Description:
        !           564: //     Paints the rectangle determined by the paint struct of
        !           565: //     the DC.
        !           566: //
        !           567: //  Parameters:
        !           568: //     HWND hWnd
        !           569: //        handle to TTY window (as always)
        !           570: //
        !           571: //  History:   Date       Author      Comment
        !           572: //              5/ 9/91   BryanW      Wrote it.
        !           573: //             10/22/91   BryanW      Problem with background color
        !           574: //                                    and "off by one" fixed.
        !           575: //
        !           576: //              2/25/92   BryanW      Off-by-one not quite fixed...
        !           577: //                                    also resolved min/max problem
        !           578: //                                    for windows extended beyond
        !           579: //                                    the "TTY display".
        !           580: //
        !           581: //---------------------------------------------------------------------------
        !           582: 
        !           583: BOOL NEAR PaintTTY( HWND hWnd )
        !           584: {
        !           585:    int          nRow, nCol, nEndRow, nEndCol, nCount, nHorzPos, nVertPos ;
        !           586:    HDC          hDC ;
        !           587:    HFONT        hOldFont ;
        !           588:    NPTTYINFO    npTTYInfo ;
        !           589:    PAINTSTRUCT  ps ;
        !           590:    RECT         rect ;
        !           591: 
        !           592:    if (NULL == (npTTYInfo = GETNPTTYINFO( hWnd )))
        !           593:       return ( FALSE ) ;
        !           594: 
        !           595:    hDC = BeginPaint( hWnd, &ps ) ;
        !           596:    hOldFont = SelectObject( hDC, HTTYFONT( npTTYInfo ) ) ;
        !           597:    SetTextColor( hDC, FGCOLOR( npTTYInfo ) ) ;
        !           598:    SetBkColor( hDC, GetSysColor( COLOR_WINDOW ) ) ;
        !           599:    rect = ps.rcPaint ;
        !           600:    nRow =
        !           601:       min( MAXROWS - 1,
        !           602:            max( 0, (rect.top + YOFFSET( npTTYInfo )) / YCHAR( npTTYInfo ) ) ) ;
        !           603:    nEndRow =
        !           604:       min( MAXROWS - 1,
        !           605:            ((rect.bottom + YOFFSET( npTTYInfo ) - 1) / YCHAR( npTTYInfo ) ) ) ;
        !           606:    nCol =
        !           607:       min( MAXCOLS - 1,
        !           608:            max( 0, (rect.left + XOFFSET( npTTYInfo )) / XCHAR( npTTYInfo ) ) ) ;
        !           609:    nEndCol =
        !           610:       min( MAXCOLS - 1,
        !           611:            ((rect.right + XOFFSET( npTTYInfo ) - 1) / XCHAR( npTTYInfo ) ) ) ;
        !           612:    nCount = nEndCol - nCol + 1 ;
        !           613:    for (; nRow <= nEndRow; nRow++)
        !           614:    {
        !           615:       nVertPos = (nRow * YCHAR( npTTYInfo )) - YOFFSET( npTTYInfo ) ;
        !           616:       nHorzPos = (nCol * XCHAR( npTTYInfo )) - XOFFSET( npTTYInfo ) ;
        !           617:       rect.top = nVertPos ;
        !           618:       rect.bottom = nVertPos + YCHAR( npTTYInfo ) ;
        !           619:       rect.left = nHorzPos ;
        !           620:       rect.right = nHorzPos + XCHAR( npTTYInfo ) * nCount ;
        !           621:       SetBkMode( hDC, OPAQUE ) ;
        !           622:       ExtTextOut( hDC, nHorzPos, nVertPos, ETO_OPAQUE | ETO_CLIPPED, &rect,
        !           623:                   (LPSTR)( SCREEN( npTTYInfo ) + nRow * MAXCOLS + nCol ),
        !           624:                   nCount, NULL ) ;
        !           625:    }
        !           626:    SelectObject( hDC, hOldFont ) ;
        !           627:    EndPaint( hWnd, &ps ) ;
        !           628:    MoveTTYCursor( hWnd ) ;
        !           629:    return ( TRUE ) ;
        !           630: 
        !           631: } // end of PaintTTY()
        !           632: 
        !           633: //---------------------------------------------------------------------------
        !           634: //  BOOL NEAR SizeTTY( HWND hWnd, WORD wVertSize, WORD wHorzSize )
        !           635: //
        !           636: //  Description:
        !           637: //     Sizes TTY and sets up scrolling regions.
        !           638: //
        !           639: //  Parameters:
        !           640: //     HWND hWnd
        !           641: //        handle to TTY window
        !           642: //
        !           643: //     WORD wVertSize
        !           644: //        new vertical size
        !           645: //
        !           646: //     WORD wHorzSize
        !           647: //        new horizontal size
        !           648: //
        !           649: //  History:   Date       Author      Comment
        !           650: //              5/ 8/ 91  BryanW      Wrote it
        !           651: //
        !           652: //---------------------------------------------------------------------------
        !           653: 
        !           654: BOOL NEAR SizeTTY( HWND hWnd, WORD wVertSize, WORD wHorzSize )
        !           655: {
        !           656:    int        nScrollAmt ;
        !           657:    NPTTYINFO  npTTYInfo ;
        !           658: 
        !           659:    if (NULL == (npTTYInfo = GETNPTTYINFO( hWnd )))
        !           660:       return ( FALSE ) ;
        !           661: 
        !           662:    YSIZE( npTTYInfo ) = (int) wVertSize ;
        !           663:    YSCROLL( npTTYInfo ) = max( 0, (MAXROWS * YCHAR( npTTYInfo )) -
        !           664:                                YSIZE( npTTYInfo ) ) ;
        !           665:    nScrollAmt = min( YSCROLL( npTTYInfo ), YOFFSET( npTTYInfo ) ) -
        !           666:                      YOFFSET( npTTYInfo ) ;
        !           667:    ScrollWindow( hWnd, 0, -nScrollAmt, NULL, NULL ) ;
        !           668: 
        !           669:    YOFFSET( npTTYInfo ) = YOFFSET( npTTYInfo ) + nScrollAmt ;
        !           670:    SetScrollPos( hWnd, SB_VERT, YOFFSET( npTTYInfo ), FALSE ) ;
        !           671:    SetScrollRange( hWnd, SB_VERT, 0, YSCROLL( npTTYInfo ), TRUE ) ;
        !           672: 
        !           673:    XSIZE( npTTYInfo ) = (int) wHorzSize ;
        !           674:    XSCROLL( npTTYInfo ) = max( 0, (MAXCOLS * XCHAR( npTTYInfo )) -
        !           675:                                 XSIZE( npTTYInfo ) ) ;
        !           676:    nScrollAmt = min( XSCROLL( npTTYInfo ), XOFFSET( npTTYInfo )) -
        !           677:                      XOFFSET( npTTYInfo ) ;
        !           678:    ScrollWindow( hWnd, 0, -nScrollAmt, NULL, NULL ) ;
        !           679:    XOFFSET( npTTYInfo ) = XOFFSET( npTTYInfo ) + nScrollAmt ;
        !           680:    SetScrollPos( hWnd, SB_HORZ, XOFFSET( npTTYInfo ), FALSE ) ;
        !           681:    SetScrollRange( hWnd, SB_HORZ, 0, XSCROLL( npTTYInfo ), TRUE ) ;
        !           682: 
        !           683:    InvalidateRect( hWnd, NULL, TRUE ) ;
        !           684: 
        !           685:    return ( TRUE ) ;
        !           686: 
        !           687: } // end of SizeTTY()
        !           688: 
        !           689: //---------------------------------------------------------------------------
        !           690: //  BOOL NEAR ScrollTTYVert( HWND hWnd, WORD wScrollCmd, WORD wScrollPos )
        !           691: //
        !           692: //  Description:
        !           693: //     Scrolls TTY window vertically.
        !           694: //
        !           695: //  Parameters:
        !           696: //     HWND hWnd
        !           697: //        handle to TTY window
        !           698: //
        !           699: //     WORD wScrollCmd
        !           700: //        type of scrolling we're doing
        !           701: //
        !           702: //     WORD wScrollPos
        !           703: //        scroll position
        !           704: //
        !           705: //  History:   Date       Author      Comment
        !           706: //              5/ 8/91   BryanW      Wrote it.
        !           707: //
        !           708: //---------------------------------------------------------------------------
        !           709: 
        !           710: BOOL NEAR ScrollTTYVert( HWND hWnd, WORD wScrollCmd, WORD wScrollPos )
        !           711: {
        !           712:    int        nScrollAmt ;
        !           713:    NPTTYINFO  npTTYInfo ;
        !           714: 
        !           715:    if (NULL == (npTTYInfo = GETNPTTYINFO( hWnd )))
        !           716:       return ( FALSE ) ;
        !           717: 
        !           718:    switch (wScrollCmd)
        !           719:    {
        !           720:       case SB_TOP:
        !           721:          nScrollAmt = -YOFFSET( npTTYInfo ) ;
        !           722:          break ;
        !           723: 
        !           724:       case SB_BOTTOM:
        !           725:          nScrollAmt = YSCROLL( npTTYInfo ) - YOFFSET( npTTYInfo ) ;
        !           726:          break ;
        !           727: 
        !           728:       case SB_PAGEUP:
        !           729:          nScrollAmt = -YSIZE( npTTYInfo ) ;
        !           730:          break ;
        !           731: 
        !           732:       case SB_PAGEDOWN:
        !           733:          nScrollAmt = YSIZE( npTTYInfo ) ;
        !           734:          break ;
        !           735: 
        !           736:       case SB_LINEUP:
        !           737:          nScrollAmt = -YCHAR( npTTYInfo ) ;
        !           738:          break ;
        !           739: 
        !           740:       case SB_LINEDOWN:
        !           741:          nScrollAmt = YCHAR( npTTYInfo ) ;
        !           742:          break ;
        !           743: 
        !           744:       case SB_THUMBPOSITION:
        !           745:          nScrollAmt = wScrollPos - YOFFSET( npTTYInfo ) ;
        !           746:          break ;
        !           747: 
        !           748:       default:
        !           749:          return ( FALSE ) ;
        !           750:    }
        !           751:    if ((YOFFSET( npTTYInfo ) + nScrollAmt) > YSCROLL( npTTYInfo ))
        !           752:       nScrollAmt = YSCROLL( npTTYInfo ) - YOFFSET( npTTYInfo ) ;
        !           753:    if ((YOFFSET( npTTYInfo ) + nScrollAmt) < 0)
        !           754:       nScrollAmt = -YOFFSET( npTTYInfo ) ;
        !           755:    ScrollWindow( hWnd, 0, -nScrollAmt, NULL, NULL ) ;
        !           756:    YOFFSET( npTTYInfo ) = YOFFSET( npTTYInfo ) + nScrollAmt ;
        !           757:    SetScrollPos( hWnd, SB_VERT, YOFFSET( npTTYInfo ), TRUE ) ;
        !           758: 
        !           759:    return ( TRUE ) ;
        !           760: 
        !           761: } // end of ScrollTTYVert()
        !           762: 
        !           763: //---------------------------------------------------------------------------
        !           764: //  BOOL NEAR ScrollTTYHorz( HWND hWnd, WORD wScrollCmd, WORD wScrollPos )
        !           765: //
        !           766: //  Description:
        !           767: //     Scrolls TTY window horizontally.
        !           768: //
        !           769: //  Parameters:
        !           770: //     HWND hWnd
        !           771: //        handle to TTY window
        !           772: //
        !           773: //     WORD wScrollCmd
        !           774: //        type of scrolling we're doing
        !           775: //
        !           776: //     WORD wScrollPos
        !           777: //        scroll position
        !           778: //
        !           779: //  History:   Date       Author      Comment
        !           780: //              5/ 8/91   BryanW      Wrote it.
        !           781: //
        !           782: //---------------------------------------------------------------------------
        !           783: 
        !           784: BOOL NEAR ScrollTTYHorz( HWND hWnd, WORD wScrollCmd, WORD wScrollPos )
        !           785: {
        !           786:    int        nScrollAmt ;
        !           787:    NPTTYINFO  npTTYInfo ;
        !           788: 
        !           789:    if (NULL == (npTTYInfo = GETNPTTYINFO( hWnd )))
        !           790:       return ( FALSE ) ;
        !           791: 
        !           792:    switch (wScrollCmd)
        !           793:    {
        !           794:       case SB_TOP:
        !           795:          nScrollAmt = -XOFFSET( npTTYInfo ) ;
        !           796:          break ;
        !           797: 
        !           798:       case SB_BOTTOM:
        !           799:          nScrollAmt = XSCROLL( npTTYInfo ) - XOFFSET( npTTYInfo ) ;
        !           800:          break ;
        !           801: 
        !           802:       case SB_PAGEUP:
        !           803:          nScrollAmt = -XSIZE( npTTYInfo ) ;
        !           804:          break ;
        !           805: 
        !           806:       case SB_PAGEDOWN:
        !           807:          nScrollAmt = XSIZE( npTTYInfo ) ;
        !           808:          break ;
        !           809: 
        !           810:       case SB_LINEUP:
        !           811:          nScrollAmt = -XCHAR( npTTYInfo ) ;
        !           812:          break ;
        !           813: 
        !           814:       case SB_LINEDOWN:
        !           815:          nScrollAmt = XCHAR( npTTYInfo ) ;
        !           816:          break ;
        !           817: 
        !           818:       case SB_THUMBPOSITION:
        !           819:          nScrollAmt = wScrollPos - XOFFSET( npTTYInfo ) ;
        !           820:          break ;
        !           821: 
        !           822:       default:
        !           823:          return ( FALSE ) ;
        !           824:    }
        !           825:    if ((XOFFSET( npTTYInfo ) + nScrollAmt) > XSCROLL( npTTYInfo ))
        !           826:       nScrollAmt = XSCROLL( npTTYInfo ) - XOFFSET( npTTYInfo ) ;
        !           827:    if ((XOFFSET( npTTYInfo ) + nScrollAmt) < 0)
        !           828:       nScrollAmt = -XOFFSET( npTTYInfo ) ;
        !           829:    ScrollWindow( hWnd, -nScrollAmt, 0, NULL, NULL ) ;
        !           830:    XOFFSET( npTTYInfo ) = XOFFSET( npTTYInfo ) + nScrollAmt ;
        !           831:    SetScrollPos( hWnd, SB_HORZ, XOFFSET( npTTYInfo ), TRUE ) ;
        !           832: 
        !           833:    return ( TRUE ) ;
        !           834: 
        !           835: } // end of ScrollTTYHorz()
        !           836: 
        !           837: //---------------------------------------------------------------------------
        !           838: //  BOOL NEAR SetTTYFocus( HWND hWnd )
        !           839: //
        !           840: //  Description:
        !           841: //     Sets the focus to the TTY window also creates caret.
        !           842: //
        !           843: //  Parameters:
        !           844: //     HWND hWnd
        !           845: //        handle to TTY window
        !           846: //
        !           847: //  History:   Date       Author      Comment
        !           848: //              5/ 9/91   BryanW      Wrote it.
        !           849: //
        !           850: //---------------------------------------------------------------------------
        !           851: 
        !           852: BOOL NEAR SetTTYFocus( HWND hWnd )
        !           853: {
        !           854:    NPTTYINFO  npTTYInfo ;
        !           855: 
        !           856:    if (NULL == (npTTYInfo = GETNPTTYINFO( hWnd )))
        !           857:       return ( FALSE ) ;
        !           858: 
        !           859:    if (CONNECTED( npTTYInfo ) && (CURSORSTATE( npTTYInfo ) != CS_SHOW))
        !           860:    {
        !           861:       CreateCaret( hWnd, NULL, XCHAR( npTTYInfo ), YCHAR( npTTYInfo ) ) ;
        !           862:       ShowCaret( hWnd ) ;
        !           863:       CURSORSTATE( npTTYInfo ) = CS_SHOW ;
        !           864:    }
        !           865:    MoveTTYCursor( hWnd ) ;
        !           866:    return ( TRUE ) ;
        !           867: 
        !           868: } // end of SetTTYFocus()
        !           869: 
        !           870: //---------------------------------------------------------------------------
        !           871: //  BOOL NEAR KillTTYFocus( HWND hWnd )
        !           872: //
        !           873: //  Description:
        !           874: //     Kills TTY focus and destroys the caret.
        !           875: //
        !           876: //  Parameters:
        !           877: //     HWND hWnd
        !           878: //        handle to TTY window
        !           879: //
        !           880: //  History:   Date       Author      Comment
        !           881: //              5/ 9/91   BryanW      Wrote it.
        !           882: //
        !           883: //---------------------------------------------------------------------------
        !           884: 
        !           885: BOOL NEAR KillTTYFocus( HWND hWnd )
        !           886: {
        !           887:    NPTTYINFO  npTTYInfo ;
        !           888: 
        !           889:    if (NULL == (npTTYInfo = GETNPTTYINFO( hWnd )))
        !           890:       return ( FALSE ) ;
        !           891: 
        !           892:    if (CONNECTED( npTTYInfo ) && (CURSORSTATE( npTTYInfo ) != CS_HIDE))
        !           893:    {
        !           894:       HideCaret( hWnd ) ;
        !           895:       DestroyCaret() ;
        !           896:       CURSORSTATE( npTTYInfo ) = CS_HIDE ;
        !           897:    }
        !           898:    return ( TRUE ) ;
        !           899: 
        !           900: } // end of KillTTYFocus()
        !           901: 
        !           902: //---------------------------------------------------------------------------
        !           903: //  BOOL NEAR MoveTTYCursor( HWND hWnd )
        !           904: //
        !           905: //  Description:
        !           906: //     Moves caret to current position.
        !           907: //
        !           908: //  Parameters:
        !           909: //     HWND hWnd
        !           910: //        handle to TTY window
        !           911: //
        !           912: //  History:   Date       Author      Comment
        !           913: //              5/ 9/91   BryanW      Wrote it.
        !           914: //
        !           915: //---------------------------------------------------------------------------
        !           916: 
        !           917: BOOL NEAR MoveTTYCursor( HWND hWnd )
        !           918: {
        !           919:    NPTTYINFO  npTTYInfo ;
        !           920: 
        !           921:    if (NULL == (npTTYInfo = GETNPTTYINFO( hWnd )))
        !           922:       return ( FALSE ) ;
        !           923: 
        !           924:    if (CONNECTED( npTTYInfo ) && (CURSORSTATE( npTTYInfo ) & CS_SHOW))
        !           925:       SetCaretPos( (COLUMN( npTTYInfo ) * XCHAR( npTTYInfo )) -
        !           926:                    XOFFSET( npTTYInfo ),
        !           927:                    (ROW( npTTYInfo ) * YCHAR( npTTYInfo )) -
        !           928:                    YOFFSET( npTTYInfo ) ) ;
        !           929:    
        !           930:    return ( TRUE ) ;
        !           931: 
        !           932: } // end of MoveTTYCursor()
        !           933: 
        !           934: //---------------------------------------------------------------------------
        !           935: //  BOOL NEAR ProcessCOMMNotification( HWND hWnd,
        !           936: //                                     WPARAM wParam, LPARAM lParam ) ;
        !           937: //
        !           938: //  Description:
        !           939: //     Processes the WM_COMMNOTIFY message from the COMM.DRV.
        !           940: //
        !           941: //  Parameters:
        !           942: //     HWND hWnd
        !           943: //        handle to TTY window
        !           944: //
        !           945: //     WPARAM wParam
        !           946: //        specifes the device (nCid)
        !           947: //
        !           948: //     LPARAM lParam
        !           949: //        LOWORD contains event trigger
        !           950: //        HIWORD is NULL
        !           951: //
        !           952: //  Win-32 Porting Issues:
        !           953: //     - Function was constrained by WORD and LONG declarations.
        !           954: //     - Processing under Win-32 is much simpler and additionally
        !           955: //       requires the "posted message" flag to be cleared.
        !           956: //
        !           957: //  History:   Date       Author      Comment
        !           958: //              5/10/91   BryanW      Wrote it.
        !           959: //             10/18/91   BryanW      Updated to verify the event.
        !           960: //              6/15/92   BryanW      Removed WORD and LONG constraints.
        !           961: //              6/15/92   BryanW      Ported to Win-32.
        !           962: //
        !           963: //---------------------------------------------------------------------------
        !           964: 
        !           965: BOOL NEAR ProcessCOMMNotification( HWND hWnd, WPARAM wParam, LPARAM lParam )
        !           966: {
        !           967:    int        nLength ;
        !           968:    BYTE       abIn[ MAXBLOCK + 1] ;
        !           969:    NPTTYINFO  npTTYInfo ;
        !           970:    MSG        msg ;
        !           971: 
        !           972:    if (NULL == (npTTYInfo = GETNPTTYINFO( hWnd )))
        !           973:       return ( FALSE ) ;
        !           974: 
        !           975: #ifdef WIN32
        !           976:    // verify that it is a COMM event sent by our thread
        !           977: 
        !           978:    if (CN_EVENT & LOWORD( lParam ) != CN_EVENT)
        !           979:       return ( FALSE ) ;
        !           980: 
        !           981:    // We loop here since it is highly likely that the buffer
        !           982:    // can been filled while we are reading this block.  This
        !           983:    // is especially true when operating at high baud rates
        !           984:    // (e.g. >= 9600 baud).
        !           985: 
        !           986:    do
        !           987:    {
        !           988:       if (nLength = ReadCommBlock( hWnd, (LPSTR) abIn, MAXBLOCK ))
        !           989:       {
        !           990:          WriteTTYBlock( hWnd, (LPSTR) abIn, nLength ) ;
        !           991: 
        !           992:          // force a paint
        !           993: 
        !           994:          UpdateWindow( hWnd ) ;
        !           995:       }
        !           996:    }
        !           997:    while (!PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE) || (nLength > 0)) ;
        !           998: 
        !           999:    // clear our "posted notification" flag
        !          1000: 
        !          1001:    SetEvent( POSTEVENT( npTTYInfo ) ) ;
        !          1002: #else
        !          1003:    if (!USECNRECEIVE( npTTYInfo ))
        !          1004:    {
        !          1005:       // verify that it is a COMM event specified by our mask
        !          1006: 
        !          1007:       if (CN_EVENT & LOWORD( lParam ) != CN_EVENT)
        !          1008:          return ( FALSE ) ;
        !          1009: 
        !          1010:       // For Windows 3.1, rested reset the event word so we are notified
        !          1011:       // when the next event occurs
        !          1012: 
        !          1013:       GetCommEventMask( COMDEV( npTTYInfo ), EV_RXCHAR ) ;
        !          1014: 
        !          1015:       // We loop here since it is highly likely that the buffer
        !          1016:       // can been filled while we are reading this block.  This
        !          1017:       // is especially true when operating at high baud rates
        !          1018:       // (e.g. >= 9600 baud).
        !          1019: 
        !          1020:       do
        !          1021:       {
        !          1022:          if (nLength = ReadCommBlock( hWnd, (LPSTR) abIn, MAXBLOCK ))
        !          1023:          {
        !          1024:             WriteTTYBlock( hWnd, (LPSTR) abIn, nLength ) ;
        !          1025: 
        !          1026:             // force a paint
        !          1027: 
        !          1028:             UpdateWindow( hWnd ) ;
        !          1029:          }
        !          1030:       }
        !          1031:       while (!PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE) || (nLength > 0)) ;
        !          1032:    }
        !          1033:    else
        !          1034:    {
        !          1035:       // verify that it is a receive event
        !          1036: 
        !          1037:       if (CN_RECEIVE & LOWORD( lParam ) != CN_RECEIVE)
        !          1038:          return ( FALSE ) ;
        !          1039: 
        !          1040:       do
        !          1041:       {
        !          1042:          if (nLength = ReadCommBlock( hWnd, (LPSTR) abIn, MAXBLOCK ))
        !          1043:          {
        !          1044:             WriteTTYBlock( hWnd, (LPSTR) abIn, nLength ) ;
        !          1045: 
        !          1046:             // force a paint
        !          1047: 
        !          1048:             UpdateWindow( hWnd ) ;
        !          1049:          }
        !          1050:       }
        !          1051:       while ((!PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE )) ||
        !          1052:             (ComStat.cbInQue >= MAXBLOCK)) ;
        !          1053:    }
        !          1054: #endif
        !          1055: 
        !          1056:    return ( TRUE ) ;
        !          1057: 
        !          1058: } // end of ProcessCOMMNotification()
        !          1059: 
        !          1060: //---------------------------------------------------------------------------
        !          1061: //  BOOL NEAR ProcessTTYCharacter( HWND hWnd, BYTE bOut )
        !          1062: //
        !          1063: //  Description:
        !          1064: //     This simply writes a character to the port and echos it
        !          1065: //     to the TTY screen if fLocalEcho is set.  Some minor
        !          1066: //     keyboard mapping could be performed here.
        !          1067: //
        !          1068: //  Parameters:
        !          1069: //     HWND hWnd
        !          1070: //        handle to TTY window
        !          1071: //
        !          1072: //     BYTE bOut
        !          1073: //        byte from keyboard
        !          1074: //
        !          1075: //  History:   Date       Author      Comment
        !          1076: //              5/11/91   BryanW      Wrote it.
        !          1077: //
        !          1078: //---------------------------------------------------------------------------
        !          1079: 
        !          1080: BOOL NEAR ProcessTTYCharacter( HWND hWnd, BYTE bOut )
        !          1081: {
        !          1082:    NPTTYINFO  npTTYInfo ;
        !          1083: 
        !          1084:    if (NULL == (npTTYInfo = GETNPTTYINFO( hWnd )))
        !          1085:       return ( FALSE ) ;
        !          1086: 
        !          1087:    if (!CONNECTED( npTTYInfo ))
        !          1088:       return ( FALSE ) ;
        !          1089: 
        !          1090:    WriteCommByte( hWnd, bOut ) ;
        !          1091:    if (LOCALECHO( npTTYInfo ))
        !          1092:       WriteTTYBlock( hWnd, &bOut, 1 ) ;
        !          1093: 
        !          1094:    return ( TRUE ) ;
        !          1095: 
        !          1096: } // end of ProcessTTYCharacter()
        !          1097: 
        !          1098: //---------------------------------------------------------------------------
        !          1099: //  BOOL NEAR OpenConnection( HWND hWnd )
        !          1100: //
        !          1101: //  Description:
        !          1102: //     Opens communication port specified in the TTYINFO struct.
        !          1103: //     It also sets the CommState and notifies the window via
        !          1104: //     the fConnected flag in the TTYINFO struct.
        !          1105: //
        !          1106: //  Parameters:
        !          1107: //     HWND hWnd
        !          1108: //        handle to TTY window
        !          1109: //
        !          1110: //  Win-32 Porting Issues:
        !          1111: //     - OpenComm() is not supported under Win-32.  Use OpenFile()
        !          1112: //       and setup for OVERLAPPED_IO.
        !          1113: //     - Win-32 has specific communication timeout parameters.
        !          1114: //     - Created the secondary thread for event notification.
        !          1115: //
        !          1116: //  History:   Date       Author      Comment
        !          1117: //              5/ 9/91   BryanW      Wrote it.
        !          1118: //
        !          1119: //---------------------------------------------------------------------------
        !          1120: 
        !          1121: BOOL NEAR OpenConnection( HWND hWnd )
        !          1122: {
        !          1123:    char       szPort[ 10 ], szTemp[ 10 ] ;
        !          1124:    BOOL       fRetVal ;
        !          1125:    HCURSOR    hOldCursor, hWaitCursor ;
        !          1126:    HMENU      hMenu ;
        !          1127:    NPTTYINFO  npTTYInfo ;
        !          1128: 
        !          1129: #ifdef WIN32
        !          1130:    HANDLE        hCommWatchThread ;
        !          1131:    DWORD         dwThreadID ;
        !          1132:    COMMTIMEOUTS  CommTimeOuts ;
        !          1133: #endif
        !          1134: 
        !          1135:    if (NULL == (npTTYInfo = GETNPTTYINFO( hWnd )))
        !          1136:       return ( FALSE ) ;
        !          1137: 
        !          1138:    // show the hourglass cursor
        !          1139:    hWaitCursor = LoadCursor( NULL, IDC_WAIT ) ;
        !          1140:    hOldCursor = SetCursor( hWaitCursor ) ;
        !          1141: 
        !          1142:    // load the COM prefix string and append port number
        !          1143: 
        !          1144:    LoadString( GETHINST( hWnd ), IDS_COMPREFIX, szTemp, sizeof( szTemp ) ) ;
        !          1145:    wsprintf( szPort, "%s%d", (LPSTR) szTemp, PORT( npTTYInfo ) ) ;
        !          1146: 
        !          1147:    // open COMM device
        !          1148: 
        !          1149: #ifdef WIN32
        !          1150:    if ((COMDEV( npTTYInfo ) =
        !          1151:       CreateFile( szPort, GENERIC_READ | GENERIC_WRITE,
        !          1152:                   0,                    // exclusive access
        !          1153:                   NULL,                 // no security attrs
        !          1154:                   OPEN_EXISTING,
        !          1155:                   FILE_FLAG_OVERLAPPED, // overlapped I/O
        !          1156:                   NULL )) == (HANDLE) -1 )
        !          1157:       return ( FALSE ) ;
        !          1158:    else
        !          1159:    {
        !          1160:       // purge any information in the buffer
        !          1161: 
        !          1162:       PurgeComm( COMDEV( npTTYInfo ), PURGE_TXABORT | PURGE_RXABORT |
        !          1163:                                       PURGE_TXCLEAR | PURGE_RXCLEAR ) ;
        !          1164: 
        !          1165:       // set up for overlapped non-blocking I/O
        !          1166: 
        !          1167:       CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF ;
        !          1168:       CommTimeOuts.ReadTotalTimeoutMultiplier = 0 ;
        !          1169:       CommTimeOuts.ReadTotalTimeoutConstant = 0 ;
        !          1170:       CommTimeOuts.WriteTotalTimeoutMultiplier = 0 ;
        !          1171:       CommTimeOuts.WriteTotalTimeoutConstant = 0 ;
        !          1172:       SetCommTimeouts( COMDEV( npTTYInfo ), &CommTimeOuts ) ;
        !          1173:    }
        !          1174: #else
        !          1175:    if ((COMDEV( npTTYInfo ) = OpenComm( szPort, RXQUEUE, TXQUEUE )) < 0)
        !          1176:       return ( FALSE ) ;
        !          1177: #endif
        !          1178: 
        !          1179:    fRetVal = SetupConnection( hWnd ) ;
        !          1180: 
        !          1181:    if (fRetVal)
        !          1182:    {
        !          1183:       CONNECTED( npTTYInfo ) = TRUE ;
        !          1184: 
        !          1185: #ifdef WIN32
        !          1186:       // In the case of Win32, we create a secondary thread
        !          1187:       // to watch for an event.
        !          1188: 
        !          1189:       if (NULL == (hCommWatchThread =
        !          1190:                       CreateThread( (LPSECURITY_ATTRIBUTES) NULL,
        !          1191:                                     0, 
        !          1192:                                     (LPTHREAD_START_ROUTINE) CommWatchProc,
        !          1193:                                     (LPVOID) npTTYInfo,
        !          1194:                                     NULL, &dwThreadID )))
        !          1195:       {
        !          1196:          CONNECTED( npTTYInfo ) = FALSE ;
        !          1197:          CloseHandle( COMDEV( npTTYInfo ) ) ;
        !          1198:          fRetVal = FALSE ;
        !          1199:       }
        !          1200:       else
        !          1201:       {
        !          1202:          THREADID( npTTYInfo ) = dwThreadID ;
        !          1203:          HTHREAD( npTTYInfo ) = hCommWatchThread ;
        !          1204: 
        !          1205:          // assert DTR
        !          1206: 
        !          1207:          EscapeCommFunction( COMDEV( npTTYInfo ), SETDTR ) ;
        !          1208: 
        !          1209: 
        !          1210:          SetTTYFocus( hWnd ) ;
        !          1211: 
        !          1212:          hMenu = GetMenu( hWnd ) ;
        !          1213:          EnableMenuItem( hMenu, IDM_DISCONNECT,
        !          1214:                         MF_ENABLED | MF_BYCOMMAND ) ;
        !          1215:          EnableMenuItem( hMenu, IDM_CONNECT,
        !          1216:                         MF_GRAYED | MF_DISABLED | MF_BYCOMMAND ) ;
        !          1217:       }
        !          1218: #else
        !          1219:       // Under Windows 3.1, we set up notifications from COMM.DRV
        !          1220: 
        !          1221:       if (!USECNRECEIVE( npTTYInfo ))
        !          1222:       {
        !          1223:          // In this case we really are only using the notifications
        !          1224:          // for the received characters - it could be expanded to
        !          1225:          // cover the changes in CD or other status lines.
        !          1226: 
        !          1227:          SetCommEventMask( COMDEV( npTTYInfo ), EV_RXCHAR ) ;
        !          1228: 
        !          1229:          // Enable notifications for events only.
        !          1230:       
        !          1231:          // NB:  This method does not use the specific
        !          1232:          // in/out queue triggers.
        !          1233: 
        !          1234:          EnableCommNotification( COMDEV( npTTYInfo ), hWnd, -1, -1 ) ;
        !          1235:       }
        !          1236:       else
        !          1237:       {
        !          1238:          // Enable notification for CN_RECEIVE events.
        !          1239: 
        !          1240:          EnableCommNotification( COMDEV( npTTYInfo ), hWnd, MAXBLOCK, -1 ) ;
        !          1241:       }
        !          1242: 
        !          1243:       // assert DTR
        !          1244: 
        !          1245:       EscapeCommFunction( COMDEV( npTTYInfo ), SETDTR ) ;
        !          1246: 
        !          1247: 
        !          1248:       SetTTYFocus( hWnd ) ;
        !          1249: 
        !          1250:       hMenu = GetMenu( hWnd ) ;
        !          1251:       EnableMenuItem( hMenu, IDM_DISCONNECT,
        !          1252:                       MF_ENABLED | MF_BYCOMMAND ) ;
        !          1253:       EnableMenuItem( hMenu, IDM_CONNECT,
        !          1254:                       MF_GRAYED | MF_DISABLED | MF_BYCOMMAND ) ;
        !          1255: #endif
        !          1256:    }
        !          1257:    else
        !          1258:    {
        !          1259:       CONNECTED( npTTYInfo ) = FALSE ;
        !          1260: 
        !          1261: #ifdef WIN32
        !          1262:       CloseHandle( COMDEV( npTTYInfo ) ) ;
        !          1263: #else
        !          1264:       CloseComm( COMDEV( npTTYInfo ) ) ;
        !          1265: #endif
        !          1266:    }
        !          1267: 
        !          1268:    // restore cursor
        !          1269: 
        !          1270:    SetCursor( hOldCursor ) ;
        !          1271: 
        !          1272:    return ( fRetVal ) ;
        !          1273: 
        !          1274: } // end of OpenConnection()
        !          1275: 
        !          1276: //---------------------------------------------------------------------------
        !          1277: //  BOOL NEAR SetupConnection( HWND hWnd )
        !          1278: //
        !          1279: //  Description:
        !          1280: //     This routines sets up the DCB based on settings in the
        !          1281: //     TTY info structure and performs a SetCommState().
        !          1282: //
        !          1283: //  Parameters:
        !          1284: //     HWND hWnd
        !          1285: //        handle to TTY window
        !          1286: //
        !          1287: //  Win-32 Porting Issues:
        !          1288: //     - Win-32 requires a slightly different processing of the DCB.
        !          1289: //       Changes were made for configuration of the hardware handshaking
        !          1290: //       lines.
        !          1291: //
        !          1292: //  History:   Date       Author      Comment
        !          1293: //              5/ 9/91   BryanW      Wrote it.
        !          1294: //
        !          1295: //---------------------------------------------------------------------------
        !          1296: 
        !          1297: BOOL NEAR SetupConnection( HWND hWnd )
        !          1298: {
        !          1299:    BOOL       fRetVal ;
        !          1300:    BYTE       bSet ;
        !          1301:    DCB        dcb ;
        !          1302:    NPTTYINFO  npTTYInfo ;
        !          1303: 
        !          1304:    if (NULL == (npTTYInfo = GETNPTTYINFO( hWnd )))
        !          1305:       return ( FALSE ) ;
        !          1306: 
        !          1307: #ifdef WIN32
        !          1308:    dcb.DCBlength = sizeof( DCB ) ;
        !          1309: #endif
        !          1310: 
        !          1311:    GetCommState( COMDEV( npTTYInfo ), &dcb ) ;
        !          1312: 
        !          1313:    dcb.BaudRate = BAUDRATE( npTTYInfo ) ;
        !          1314:    dcb.ByteSize = BYTESIZE( npTTYInfo ) ;
        !          1315:    dcb.Parity = PARITY( npTTYInfo ) ;
        !          1316:    dcb.StopBits = STOPBITS( npTTYInfo ) ;
        !          1317: 
        !          1318:    // setup hardware flow control
        !          1319: 
        !          1320:    bSet = (BYTE) ((FLOWCTRL( npTTYInfo ) & FC_DTRDSR) != 0) ;
        !          1321: #ifdef WIN32
        !          1322:    dcb.fOutxDsrFlow = bSet ;
        !          1323:    if (bSet)
        !          1324:       dcb.fDtrControl = DTR_CONTROL_HANDSHAKE ;
        !          1325:    else
        !          1326:       dcb.fDtrControl = DTR_CONTROL_ENABLE ;
        !          1327: #else
        !          1328:    dcb.fOutxDsrFlow = dcb.fDtrflow = bSet ;
        !          1329:    dcb.DsrTimeout = (bSet) ? 30 : 0 ;
        !          1330: #endif
        !          1331: 
        !          1332:    bSet = (BYTE) ((FLOWCTRL( npTTYInfo ) & FC_RTSCTS) != 0) ;
        !          1333: #ifdef WIN32
        !          1334:    dcb.fOutxCtsFlow = bSet ;
        !          1335:    if (bSet)
        !          1336:       dcb.fRtsControl = RTS_CONTROL_HANDSHAKE ;
        !          1337:    else
        !          1338:       dcb.fRtsControl = RTS_CONTROL_ENABLE ;
        !          1339: #else
        !          1340:    dcb.fOutxCtsFlow = dcb.fRtsflow = bSet ;
        !          1341:    dcb.CtsTimeout = (bSet) ? 30 : 0 ;
        !          1342: #endif
        !          1343: 
        !          1344:    // setup software flow control
        !          1345: 
        !          1346:    bSet = (BYTE) ((FLOWCTRL( npTTYInfo ) & FC_XONXOFF) != 0) ;
        !          1347: 
        !          1348:    dcb.fInX = dcb.fOutX = bSet ;
        !          1349:    dcb.XonChar = ASCII_XON ;
        !          1350:    dcb.XoffChar = ASCII_XOFF ;
        !          1351:    dcb.XonLim = 100 ;
        !          1352:    dcb.XoffLim = 100 ;
        !          1353: 
        !          1354:    // other various settings
        !          1355: 
        !          1356:    dcb.fBinary = TRUE ;
        !          1357:    dcb.fParity = TRUE ;
        !          1358: 
        !          1359: #ifndef WIN32
        !          1360:    dcb.fRtsDisable = FALSE ;
        !          1361:    dcb.fDtrDisable = FALSE ;
        !          1362:    fRetVal = !(SetCommState( &dcb ) < 0) ;
        !          1363: #else
        !          1364:    fRetVal = SetCommState( COMDEV( npTTYInfo ), &dcb ) ;
        !          1365: #endif
        !          1366: 
        !          1367:    return ( fRetVal ) ;
        !          1368: 
        !          1369: } // end of SetupConnection()
        !          1370: 
        !          1371: //---------------------------------------------------------------------------
        !          1372: //  BOOL NEAR CloseConnection( HWND hWnd )
        !          1373: //
        !          1374: //  Description:
        !          1375: //     Closes the connection to the port.  Resets the connect flag
        !          1376: //     in the TTYINFO struct.
        !          1377: //
        !          1378: //  Parameters:
        !          1379: //     HWND hWnd
        !          1380: //        handle to TTY window
        !          1381: //
        !          1382: //  Win-32 Porting Issues:
        !          1383: //     - Needed to stop secondary thread.  SetCommMask() will signal the
        !          1384: //       WaitCommEvent() event and the thread will halt when the
        !          1385: //       CONNECTED() flag is clear.
        !          1386: //     - Use new PurgeComm() API to clear communications driver before
        !          1387: //       closing device.
        !          1388: //
        !          1389: //  History:   Date       Author      Comment
        !          1390: //              5/ 9/91   BryanW      Wrote it.
        !          1391: //              6/15/92   BryanW      Ported to Win-32.
        !          1392: //
        !          1393: //---------------------------------------------------------------------------
        !          1394: 
        !          1395: BOOL NEAR CloseConnection( HWND hWnd )
        !          1396: {
        !          1397:    HMENU      hMenu ;
        !          1398:    NPTTYINFO  npTTYInfo ;
        !          1399: 
        !          1400:    if (NULL == (npTTYInfo = GETNPTTYINFO( hWnd )))
        !          1401:       return ( FALSE ) ;
        !          1402: 
        !          1403:    // set connected flag to FALSE
        !          1404: 
        !          1405:    CONNECTED( npTTYInfo ) = FALSE ;
        !          1406: 
        !          1407: #ifdef WIN32
        !          1408:    // disable event notification and wait for thread
        !          1409:    // to halt
        !          1410: 
        !          1411:    SetCommMask( COMDEV( npTTYInfo ), NULL ) ;
        !          1412: 
        !          1413:    // block until thread has been halted
        !          1414: 
        !          1415:    while (THREADID( npTTYInfo ) != NULL) ;
        !          1416: #else
        !          1417:    // Disable event notification.  Using a NULL hWnd tells
        !          1418:    // the COMM.DRV to disable future notifications.
        !          1419: 
        !          1420:    EnableCommNotification( COMDEV( npTTYInfo ), NULL, -1, -1 ) ;
        !          1421: #endif
        !          1422: 
        !          1423:    // kill the focus
        !          1424: 
        !          1425:    KillTTYFocus( hWnd ) ;
        !          1426: 
        !          1427:    // drop DTR
        !          1428: 
        !          1429:    EscapeCommFunction( COMDEV( npTTYInfo ), CLRDTR ) ;
        !          1430: 
        !          1431: #ifdef WIN32
        !          1432:    // purge any outstanding reads/writes and close device handle
        !          1433: 
        !          1434:    PurgeComm( COMDEV( npTTYInfo ), PURGE_TXABORT | PURGE_RXABORT |
        !          1435:                                    PURGE_TXCLEAR | PURGE_RXCLEAR ) ;
        !          1436:    CloseHandle( COMDEV( npTTYInfo ) ) ;
        !          1437: #else
        !          1438:    // close comm connection
        !          1439: 
        !          1440:    CloseComm( COMDEV( npTTYInfo ) ) ;
        !          1441: #endif
        !          1442: 
        !          1443:    // change the selectable items in the menu
        !          1444: 
        !          1445:    hMenu = GetMenu( hWnd ) ;
        !          1446:    EnableMenuItem( hMenu, IDM_DISCONNECT,
        !          1447:                    MF_GRAYED | MF_DISABLED | MF_BYCOMMAND ) ;
        !          1448:    EnableMenuItem( hMenu, IDM_CONNECT,
        !          1449:                    MF_ENABLED | MF_BYCOMMAND ) ;
        !          1450: 
        !          1451:    return ( TRUE ) ;
        !          1452: 
        !          1453: } // end of CloseConnection()
        !          1454: 
        !          1455: //---------------------------------------------------------------------------
        !          1456: //  int NEAR ReadCommBlock( HWND hWnd, LPSTR lpszBlock, int nMaxLength )
        !          1457: //
        !          1458: //  Description:
        !          1459: //     Reads a block from the COM port and stuffs it into
        !          1460: //     the provided block.
        !          1461: //
        !          1462: //  Parameters:
        !          1463: //     HWND hWnd
        !          1464: //        handle to TTY window
        !          1465: //
        !          1466: //     LPSTR lpszBlock
        !          1467: //        block used for storage
        !          1468: //
        !          1469: //     int nMaxLength
        !          1470: //        max length of block to read
        !          1471: //
        !          1472: //  Win-32 Porting Issues:
        !          1473: //     - ReadComm() has been replaced by ReadFile() in Win-32.
        !          1474: //     - Overlapped I/O has been implemented.
        !          1475: //
        !          1476: //  History:   Date       Author      Comment
        !          1477: //              5/10/91   BryanW      Wrote it.
        !          1478: //
        !          1479: //---------------------------------------------------------------------------
        !          1480: 
        !          1481: int NEAR ReadCommBlock( HWND hWnd, LPSTR lpszBlock, int nMaxLength )
        !          1482: {
        !          1483: #ifdef WIN32
        !          1484:    DWORD      nLength ;
        !          1485:    BOOL       fReadStat ;
        !          1486:    COMSTAT    ComStat ;
        !          1487:    DWORD      dwErrorFlags ;
        !          1488: #else
        !          1489:    int        nLength, nError ;
        !          1490: #endif
        !          1491: 
        !          1492:    char       szError[ 10 ] ;
        !          1493:    NPTTYINFO  npTTYInfo ;
        !          1494: 
        !          1495:    if (NULL == (npTTYInfo = GETNPTTYINFO( hWnd )))
        !          1496:       return ( FALSE ) ;
        !          1497: 
        !          1498: #ifdef WIN32
        !          1499:    ClearCommError( COMDEV( npTTYInfo ), &dwErrorFlags, &ComStat ) ;
        !          1500:    if ((dwErrorFlags > 0) && DISPLAYERRORS( npTTYInfo ))
        !          1501:    {
        !          1502:       wsprintf( szError, "<CE-%u>", dwErrorFlags ) ;
        !          1503:       WriteTTYBlock( hWnd, szError, lstrlen( szError ) ) ;
        !          1504:    }
        !          1505:    nLength = min( (DWORD) nMaxLength, ComStat.cbInQue ) ;
        !          1506:    if (nLength > 0)
        !          1507:    {
        !          1508:       fReadStat = ReadFile( COMDEV( npTTYInfo ), lpszBlock,
        !          1509:                             nLength, &nLength, &READ_OS( npTTYInfo ) ) ;
        !          1510:       if (!fReadStat)
        !          1511:       {
        !          1512:          if (GetLastError() == ERROR_IO_PENDING)
        !          1513:          {
        !          1514:             OutputDebugString( "ReadCommBlock: I/O Pending.\r\n" ) ;
        !          1515: 
        !          1516:             // wait for a second for this transmission to complete
        !          1517: 
        !          1518:             if (WaitForSingleObject( READ_OS( npTTYInfo ).hEvent, 1000 ))
        !          1519:                nLength = 0 ;
        !          1520:             else
        !          1521:             {
        !          1522:                GetOverlappedResult( COMDEV( npTTYInfo ),
        !          1523:                                     &READ_OS( npTTYInfo ),
        !          1524:                                     &nLength, FALSE ) ;
        !          1525:                READ_OS( npTTYInfo ).Offset += nLength ;
        !          1526:             }
        !          1527:          }
        !          1528:          else
        !          1529:             // some other error occurred
        !          1530: 
        !          1531:             nLength = 0 ;
        !          1532:       }
        !          1533:    }
        !          1534: #else
        !          1535:    nLength = ReadComm( COMDEV( npTTYInfo ), lpszBlock, nMaxLength ) ;
        !          1536: 
        !          1537:    if (nLength < 0)
        !          1538:    {
        !          1539:       nLength *= -1 ;
        !          1540:       while (nError = GetCommError( COMDEV( npTTYInfo ), NULL ))
        !          1541:       {
        !          1542:          if (DISPLAYERRORS( npTTYInfo ))
        !          1543:          {
        !          1544:             wsprintf( szError, "<CE-%d>", nError ) ;
        !          1545:             WriteTTYBlock( hWnd, szError, lstrlen( szError ) ) ;
        !          1546:          }
        !          1547:       }
        !          1548:    }
        !          1549: #endif
        !          1550: 
        !          1551:    return ( nLength ) ;
        !          1552: 
        !          1553: } // end of ReadCommBlock()
        !          1554: 
        !          1555: //---------------------------------------------------------------------------
        !          1556: //  BOOL NEAR WriteCommByte( HWND hWnd, BYTE bByte )
        !          1557: //
        !          1558: //  Description:
        !          1559: //     Writes a byte to the COM port specified in the associated
        !          1560: //     TTY info structure.
        !          1561: //
        !          1562: //  Parameters:
        !          1563: //     HWND hWnd
        !          1564: //        handle to TTY window
        !          1565: //
        !          1566: //     BYTE bByte
        !          1567: //        byte to write to port
        !          1568: //
        !          1569: //  Win-32 Porting Issues:
        !          1570: //     - WriteComm() has been replaced by WriteFile() in Win-32.
        !          1571: //     - Overlapped I/O has been implemented.
        !          1572: //
        !          1573: //  History:   Date       Author      Comment
        !          1574: //              5/10/91   BryanW      Wrote it.
        !          1575: //
        !          1576: //---------------------------------------------------------------------------
        !          1577: 
        !          1578: BOOL NEAR WriteCommByte( HWND hWnd, BYTE bByte )
        !          1579: {
        !          1580: #ifdef WIN32
        !          1581:    BOOL        fWriteStat ;
        !          1582:    DWORD       dwBytesWritten ;
        !          1583: #endif
        !          1584:    NPTTYINFO  npTTYInfo ;
        !          1585: 
        !          1586:    if (NULL == (npTTYInfo = GETNPTTYINFO( hWnd )))
        !          1587:       return ( FALSE ) ;
        !          1588: 
        !          1589: #ifdef WIN32
        !          1590:    fWriteStat = WriteFile( COMDEV( npTTYInfo ), (LPSTR) &bByte, 1,
        !          1591:                            &dwBytesWritten, &WRITE_OS( npTTYInfo ) ) ;
        !          1592:    if (!fWriteStat && (GetLastError() == ERROR_IO_PENDING))
        !          1593:    {
        !          1594:       OutputDebugString( "WriteCommByte: I/O Pending.\r\n" ) ;
        !          1595: 
        !          1596:       // wait for a second for this transmission to complete
        !          1597: 
        !          1598:       if (WaitForSingleObject( WRITE_OS( npTTYInfo ).hEvent, 1000 ))
        !          1599:          dwBytesWritten = 0 ;
        !          1600:       else
        !          1601:       {
        !          1602:          GetOverlappedResult( COMDEV( npTTYInfo ),
        !          1603:                               &WRITE_OS( npTTYInfo ),
        !          1604:                               &dwBytesWritten, FALSE ) ;
        !          1605:          WRITE_OS( npTTYInfo ).Offset += dwBytesWritten ;
        !          1606:       }
        !          1607:    }
        !          1608: #else
        !          1609:    WriteComm( COMDEV( npTTYInfo ), (LPSTR) &bByte, 1 ) ;
        !          1610: #endif
        !          1611:    return ( TRUE ) ;
        !          1612: 
        !          1613: } // end of WriteCommByte()
        !          1614: 
        !          1615: //---------------------------------------------------------------------------
        !          1616: //  BOOL NEAR WriteTTYBlock( HWND hWnd, LPSTR lpBlock, int nLength )
        !          1617: //
        !          1618: //  Description:
        !          1619: //     Writes block to TTY screen.  Nothing fancy - just
        !          1620: //     straight TTY.
        !          1621: //
        !          1622: //  Parameters:
        !          1623: //     HWND hWnd
        !          1624: //        handle to TTY window
        !          1625: //
        !          1626: //     LPSTR lpBlock
        !          1627: //        far pointer to block of data
        !          1628: //
        !          1629: //     int nLength
        !          1630: //        length of block
        !          1631: //
        !          1632: //  History:   Date       Author      Comment
        !          1633: //              5/ 9/91   BryanW      Wrote it.
        !          1634: //              5/20/91   BryanW      Modified... not character based,
        !          1635: //                                    block based now.  It was processing
        !          1636: //                                    per char.
        !          1637: //
        !          1638: //---------------------------------------------------------------------------
        !          1639: 
        !          1640: BOOL NEAR WriteTTYBlock( HWND hWnd, LPSTR lpBlock, int nLength )
        !          1641: {
        !          1642:    int        i ;
        !          1643:    NPTTYINFO  npTTYInfo ;
        !          1644:    RECT       rect ;
        !          1645: 
        !          1646:    if (NULL == (npTTYInfo = GETNPTTYINFO( hWnd )))
        !          1647:       return ( FALSE ) ;
        !          1648: 
        !          1649:    for (i = 0 ; i < nLength; i++)
        !          1650:    {
        !          1651:       switch (lpBlock[ i ])
        !          1652:       {
        !          1653:          case ASCII_BEL:
        !          1654:             // Bell
        !          1655:             MessageBeep( 0 ) ;
        !          1656:             break ;
        !          1657:    
        !          1658:          case ASCII_BS:
        !          1659:             // Backspace
        !          1660:             if (COLUMN( npTTYInfo ) > 0)
        !          1661:                COLUMN( npTTYInfo ) -- ;
        !          1662:             MoveTTYCursor( hWnd ) ;
        !          1663:             break ;
        !          1664:    
        !          1665:          case ASCII_CR:
        !          1666:             // Carriage return
        !          1667:             COLUMN( npTTYInfo ) = 0 ;
        !          1668:             MoveTTYCursor( hWnd ) ;
        !          1669:             if (!NEWLINE( npTTYInfo ))
        !          1670:                break;
        !          1671:    
        !          1672:             // fall through
        !          1673:    
        !          1674:          case ASCII_LF:
        !          1675:             // Line feed
        !          1676:             if (ROW( npTTYInfo )++ == MAXROWS - 1)
        !          1677:             {
        !          1678:                _fmemmove( (LPSTR) (SCREEN( npTTYInfo )),
        !          1679:                           (LPSTR) (SCREEN( npTTYInfo ) + MAXCOLS),
        !          1680:                           (MAXROWS - 1) * MAXCOLS ) ;
        !          1681:                _fmemset( (LPSTR) (SCREEN( npTTYInfo ) + (MAXROWS - 1) * MAXCOLS),
        !          1682:                          ' ', MAXCOLS ) ;
        !          1683:                InvalidateRect( hWnd, NULL, FALSE ) ;
        !          1684:                ROW( npTTYInfo )-- ;
        !          1685:             }
        !          1686:             MoveTTYCursor( hWnd ) ;
        !          1687:             break ;
        !          1688: 
        !          1689:          default:
        !          1690:             *(SCREEN( npTTYInfo ) + ROW( npTTYInfo ) * MAXCOLS +
        !          1691:                 COLUMN( npTTYInfo )) = lpBlock[ i ] ;
        !          1692:             rect.left = (COLUMN( npTTYInfo ) * XCHAR( npTTYInfo )) -
        !          1693:                         XOFFSET( npTTYInfo ) ;
        !          1694:             rect.right = rect.left + XCHAR( npTTYInfo ) ;
        !          1695:             rect.top = (ROW( npTTYInfo ) * YCHAR( npTTYInfo )) -
        !          1696:                        YOFFSET( npTTYInfo ) ;
        !          1697:             rect.bottom = rect.top + YCHAR( npTTYInfo ) ;
        !          1698:             InvalidateRect( hWnd, &rect, FALSE ) ;
        !          1699: 
        !          1700:             // Line wrap
        !          1701:             if (COLUMN( npTTYInfo ) < MAXCOLS - 1)
        !          1702:                COLUMN( npTTYInfo )++ ;
        !          1703:             else if (AUTOWRAP( npTTYInfo ))
        !          1704:                WriteTTYBlock( hWnd, "\r\n", 2 ) ;
        !          1705:             break;
        !          1706:       }
        !          1707:    }
        !          1708:    return ( TRUE ) ;
        !          1709: 
        !          1710: } // end of WriteTTYBlock()
        !          1711: 
        !          1712: //---------------------------------------------------------------------------
        !          1713: //  VOID NEAR GoModalDialogBoxParam( HINSTANCE hInstance,
        !          1714: //                                   LPCSTR lpszTemplate, HWND hWnd,
        !          1715: //                                   DLGPROC lpDlgProc, LPARAM lParam )
        !          1716: //
        !          1717: //  Description:
        !          1718: //     It is a simple utility function that simply performs the
        !          1719: //     MPI and invokes the dialog box with a DWORD paramter.
        !          1720: //
        !          1721: //  Parameters:
        !          1722: //     similar to that of DialogBoxParam() with the exception
        !          1723: //     that the lpDlgProc is not a procedure instance
        !          1724: //
        !          1725: //  History:   Date       Author      Comment
        !          1726: //              5/10/91   BryanW      Wrote it.
        !          1727: //
        !          1728: //---------------------------------------------------------------------------
        !          1729: 
        !          1730: VOID NEAR GoModalDialogBoxParam( HINSTANCE hInstance, LPCSTR lpszTemplate,
        !          1731:                                  HWND hWnd, DLGPROC lpDlgProc, LPARAM lParam )
        !          1732: {
        !          1733:    DLGPROC  lpProcInstance ;
        !          1734: 
        !          1735:    lpProcInstance = (DLGPROC) MakeProcInstance( (FARPROC) lpDlgProc,
        !          1736:                                                 hInstance ) ;
        !          1737:    DialogBoxParam( hInstance, lpszTemplate, hWnd, lpProcInstance, lParam ) ;
        !          1738:    FreeProcInstance( (FARPROC) lpProcInstance ) ;
        !          1739: 
        !          1740: } // end of GoModalDialogBoxParam()
        !          1741: 
        !          1742: //---------------------------------------------------------------------------
        !          1743: //  BOOL FAR PASCAL AboutDlgProc( HWND hDlg, UINT uMsg,
        !          1744: //                                WPARAM wParam, LPARAM lParam )
        !          1745: //
        !          1746: //  Description:
        !          1747: //     Simulates the Windows System Dialog Box.
        !          1748: //
        !          1749: //  Parameters:
        !          1750: //     Same as standard dialog procedures.
        !          1751: //
        !          1752: //  History:   Date       Author      Comment
        !          1753: //             10/19/91   BryanW      Added this little extra.
        !          1754: //      
        !          1755: //---------------------------------------------------------------------------
        !          1756: 
        !          1757: BOOL FAR PASCAL AboutDlgProc( HWND hDlg, UINT uMsg,
        !          1758:                               WPARAM wParam, LPARAM lParam )
        !          1759: {
        !          1760:    switch (uMsg)
        !          1761:    {
        !          1762:       case WM_INITDIALOG:
        !          1763:       {
        !          1764: #ifdef WIN32
        !          1765:          char         szBuffer[ MAXLEN_TEMPSTR ], szTemp[ MAXLEN_TEMPSTR ];
        !          1766:          DWORD        dwFreeMemory ;
        !          1767:          WORD         wRevision, wVersion ;
        !          1768: #else
        !          1769:          int          idModeString ;
        !          1770:          char         szBuffer[ MAXLEN_TEMPSTR ], szTemp[ MAXLEN_TEMPSTR ] ;
        !          1771:          DWORD        dwFreeMemory, dwWinFlags ;
        !          1772:          WORD         wFreeResources, wRevision, wVersion ;
        !          1773: #endif
        !          1774: 
        !          1775: #ifdef ABOUTDLG_USEBITMAP
        !          1776:          // if we are using the bitmap, hide the icon
        !          1777: 
        !          1778:          ShowWindow( GetDlgItem( hDlg, IDD_ABOUTICON ), SW_HIDE ) ;
        !          1779: #endif
        !          1780:          // sets up the version number for Windows
        !          1781: 
        !          1782:          wVersion = LOWORD( GetVersion() ) ;
        !          1783:          wRevision = HIBYTE( wVersion ) ;
        !          1784:          wVersion = LOBYTE( wVersion ) ;
        !          1785: 
        !          1786:          GetDlgItemText( hDlg, IDD_TITLELINE, szTemp, sizeof( szTemp ) ) ;
        !          1787:          wsprintf( szBuffer, szTemp, wVersion, wRevision ) ;
        !          1788:          SetDlgItemText( hDlg, IDD_TITLELINE, szBuffer ) ;
        !          1789: 
        !          1790:          // sets up version number for TTY
        !          1791: 
        !          1792:          GetDlgItemText( hDlg, IDD_VERSION, szTemp, sizeof( szTemp ) ) ;
        !          1793:          wsprintf( szBuffer, szTemp, VER_MAJOR, VER_MINOR, VER_BUILD ) ;
        !          1794:          SetDlgItemText( hDlg, IDD_VERSION, (LPSTR) szBuffer ) ;
        !          1795: 
        !          1796:          // get by-line
        !          1797: 
        !          1798:          LoadString( GETHINST( hDlg ), IDS_BYLINE, szBuffer,
        !          1799:                      sizeof( szBuffer ) ) ;
        !          1800:          SetDlgItemText( hDlg, IDD_BYLINE, szBuffer ) ;
        !          1801: 
        !          1802: #ifndef WIN32
        !          1803:          // set windows mode information
        !          1804: 
        !          1805:          dwWinFlags = GetWinFlags() ;
        !          1806:          if (dwWinFlags & WF_ENHANCED)
        !          1807:             idModeString = IDS_MODE_ENHANCED ;
        !          1808:          else if (dwWinFlags & WF_STANDARD)
        !          1809:             idModeString = IDS_MODE_STANDARD ;
        !          1810:          else if (dwWinFlags & WF_WLO)
        !          1811:             idModeString = IDS_MODE_WLO ;
        !          1812:          else
        !          1813:             idModeString = IDS_MODE_UNDEF ;
        !          1814: 
        !          1815:          LoadString( GETHINST( hDlg ), idModeString, szBuffer,
        !          1816:                      sizeof( szBuffer ) ) ;
        !          1817:          SetDlgItemText( hDlg, IDD_WINDOWSMODE, szBuffer ) ;
        !          1818: #else
        !          1819:          SetDlgItemText( hDlg, IDD_WINDOWSMODE, "NT Mode" ) ;
        !          1820: #endif
        !          1821: 
        !          1822:          // get free memory information
        !          1823: 
        !          1824:          dwFreeMemory = GetFreeSpace( 0 ) / 1024L ;
        !          1825:          GetDlgItemText( hDlg, IDD_FREEMEM, szTemp, sizeof( szTemp ) ) ;
        !          1826:          wsprintf( szBuffer, szTemp, dwFreeMemory ) ;
        !          1827:          SetDlgItemText( hDlg, IDD_FREEMEM, (LPSTR) szBuffer ) ;
        !          1828: 
        !          1829: #ifndef WIN32
        !          1830:          // get free resources information
        !          1831: 
        !          1832:          wFreeResources = GetFreeSystemResources( 0 ) ;
        !          1833:          GetDlgItemText( hDlg, IDD_RESOURCES, szTemp, sizeof( szTemp ) ) ;
        !          1834:          wsprintf( szBuffer, szTemp, wFreeResources ) ;
        !          1835:          SetDlgItemText( hDlg, IDD_RESOURCES, (LPSTR) szBuffer ) ;
        !          1836: #endif
        !          1837:       }
        !          1838:       return ( TRUE ) ;
        !          1839: 
        !          1840: #ifdef ABOUTDLG_USEBITMAP
        !          1841:       // used to paint the bitmap
        !          1842: 
        !          1843:       case WM_PAINT:
        !          1844:       {
        !          1845:          HBITMAP      hBitMap ;
        !          1846:          HDC          hDC, hMemDC ;
        !          1847:          PAINTSTRUCT  ps ;
        !          1848: 
        !          1849:          // load bitmap and display it
        !          1850: 
        !          1851:          hDC = BeginPaint( hDlg, &ps ) ;
        !          1852:          if (NULL != (hMemDC = CreateCompatibleDC( hDC )))
        !          1853:          {
        !          1854:             hBitMap = LoadBitmap( GETHINST( hDlg ),
        !          1855:                                   MAKEINTRESOURCE( TTYBITMAP ) ) ;
        !          1856:             hBitMap = SelectObject( hMemDC, hBitMap ) ;
        !          1857:             BitBlt( hDC, 10, 10, 64, 64, hMemDC, 0, 0, SRCCOPY ) ;
        !          1858:             DeleteObject( SelectObject( hMemDC, hBitMap ) ) ;
        !          1859:             DeleteDC( hMemDC ) ;
        !          1860:          }
        !          1861:          EndPaint( hDlg, &ps ) ;
        !          1862:       }
        !          1863:       break ;
        !          1864: #endif
        !          1865: 
        !          1866:       case WM_COMMAND:
        !          1867:          if (LOWORD( wParam ) == IDD_OK)
        !          1868:          {
        !          1869:             EndDialog( hDlg, TRUE ) ;
        !          1870:             return ( TRUE ) ;
        !          1871:          }
        !          1872:          break;
        !          1873:    }
        !          1874:    return ( FALSE ) ;
        !          1875: 
        !          1876: } // end of AboutDlgProc()
        !          1877: 
        !          1878: //---------------------------------------------------------------------------
        !          1879: //  VOID NEAR FillComboBox( HINSTANCE hInstance, HWND hCtrlWnd, int nIDString,
        !          1880: //                          WORD NEAR *npTable, WORD wTableLen,
        !          1881: //                          WORD wCurrentSetting )
        !          1882: //
        !          1883: //  Description:
        !          1884: //     Fills the given combo box with strings from the resource
        !          1885: //     table starting at nIDString.  Associated items are
        !          1886: //     added from given table.  The combo box is notified of
        !          1887: //     the current setting.
        !          1888: //
        !          1889: //  Parameters:
        !          1890: //     HINSTANCE hInstance
        !          1891: //        handle to application instance
        !          1892: //
        !          1893: //     HWND hCtrlWnd
        !          1894: //        handle to combo box control
        !          1895: //
        !          1896: //     int nIDString
        !          1897: //        first resource string id
        !          1898: //
        !          1899: //     DWORD NEAR *npTable
        !          1900: //        near point to table of associated values
        !          1901: //
        !          1902: //     WORD wTableLen
        !          1903: //        length of table
        !          1904: //
        !          1905: //     DWORD dwCurrentSetting
        !          1906: //        current setting (for combo box selection)
        !          1907: //
        !          1908: //  History:   Date       Author      Comment
        !          1909: //             10/20/91   BryanW      Pulled from the init procedure.
        !          1910: //
        !          1911: //---------------------------------------------------------------------------
        !          1912: 
        !          1913: VOID NEAR FillComboBox( HINSTANCE hInstance, HWND hCtrlWnd, int nIDString,
        !          1914:                         DWORD NEAR *npTable, WORD wTableLen,
        !          1915:                         DWORD dwCurrentSetting )
        !          1916: {
        !          1917:    char  szBuffer[ MAXLEN_TEMPSTR ] ;
        !          1918:    WORD  wCount, wPosition ;
        !          1919: 
        !          1920:    for (wCount = 0; wCount < wTableLen; wCount++)
        !          1921:    {
        !          1922:       // load the string from the string resources and
        !          1923:       // add it to the combo box
        !          1924: 
        !          1925:       LoadString( hInstance, nIDString + wCount, szBuffer, sizeof( szBuffer ) ) ;
        !          1926:       wPosition = LOWORD( SendMessage( hCtrlWnd, CB_ADDSTRING, NULL,
        !          1927:                                        (LPARAM) (LPSTR) szBuffer ) ) ;
        !          1928: 
        !          1929:       // use item data to store the actual table value
        !          1930: 
        !          1931:       SendMessage( hCtrlWnd, CB_SETITEMDATA, (WPARAM) wPosition,
        !          1932:                    (LPARAM) *(npTable + wCount) ) ;
        !          1933: 
        !          1934:       // if this is our current setting, select it
        !          1935: 
        !          1936:       if (*(npTable + wCount) == dwCurrentSetting)
        !          1937:          SendMessage( hCtrlWnd, CB_SETCURSEL, (WPARAM) wPosition, NULL ) ;
        !          1938:    }
        !          1939: 
        !          1940: } // end of FillComboBox()
        !          1941: 
        !          1942: //---------------------------------------------------------------------------
        !          1943: //  BOOL NEAR SettingsDlgInit( HWND hDlg )
        !          1944: //
        !          1945: //  Description:
        !          1946: //     Puts current settings into dialog box (via CheckRadioButton() etc.)
        !          1947: //
        !          1948: //  Parameters:
        !          1949: //     HWND hDlg
        !          1950: //        handle to dialog box
        !          1951: //
        !          1952: //  Win-32 Porting Issues:
        !          1953: //     - Constants require DWORD arrays for baud rate table, etc.
        !          1954: //     - There is no "MAXCOM" function in Win-32.  Number of COM ports
        !          1955: //       is assumed to be 4.
        !          1956: //
        !          1957: //  History:   Date       Author      Comment
        !          1958: //              5/11/91   BryanW      Wrote it.
        !          1959: //             10/20/91   BryanW      Dialog revision.
        !          1960: //             10/24/91   BryanW      Fixed bug with EscapeCommFunction().
        !          1961: //              6/15/92   BryanW      Ported to Win-32.
        !          1962: //
        !          1963: //---------------------------------------------------------------------------
        !          1964: 
        !          1965: BOOL NEAR SettingsDlgInit( HWND hDlg )
        !          1966: {
        !          1967:    char       szBuffer[ MAXLEN_TEMPSTR ], szTemp[ MAXLEN_TEMPSTR ] ;
        !          1968:    NPTTYINFO  npTTYInfo ;
        !          1969:    WORD       wCount, wMaxCOM, wPosition ;
        !          1970: 
        !          1971:    if (NULL == (npTTYInfo = (NPTTYINFO) GET_PROP( hDlg, ATOM_TTYINFO )))
        !          1972:       return ( FALSE ) ;
        !          1973: 
        !          1974: #ifdef WIN32
        !          1975:    wMaxCOM = 4 ;
        !          1976: #else
        !          1977:    wMaxCOM = LOWORD( EscapeCommFunction( NULL, GETMAXCOM ) ) + 1 ;
        !          1978: #endif
        !          1979: 
        !          1980:    // load the COM prefix from resources
        !          1981: 
        !          1982:    LoadString( GETHINST( hDlg ), IDS_COMPREFIX, szTemp, sizeof( szTemp ) ) ;
        !          1983: 
        !          1984:    // fill port combo box and make initial selection
        !          1985: 
        !          1986:    for (wCount = 0; wCount < wMaxCOM; wCount++)
        !          1987:    {
        !          1988:       wsprintf( szBuffer, "%s%d", (LPSTR) szTemp, wCount + 1 ) ;
        !          1989:       SendDlgItemMessage( hDlg, IDD_PORTCB, CB_ADDSTRING, NULL,
        !          1990:                           (LPARAM) (LPSTR) szBuffer ) ;
        !          1991:    }
        !          1992:    SendDlgItemMessage( hDlg, IDD_PORTCB, CB_SETCURSEL,
        !          1993:                        (WPARAM) (PORT( npTTYInfo ) - 1), NULL ) ;
        !          1994: 
        !          1995:    // disable COM port combo box if connection has already been
        !          1996:    // established (e.g. OpenComm() already successful)
        !          1997: 
        !          1998:    EnableWindow( GetDlgItem( hDlg, IDD_PORTCB ), !CONNECTED( npTTYInfo ) ) ;
        !          1999: 
        !          2000:    // fill baud combo box and make initial selection
        !          2001: 
        !          2002:    FillComboBox( GETHINST( hDlg ), GetDlgItem( hDlg, IDD_BAUDCB ),
        !          2003:                  IDS_BAUD110, BaudTable,
        !          2004:                  sizeof( BaudTable ) / sizeof( BaudTable[ 0 ] ),
        !          2005:                  BAUDRATE( npTTYInfo ) ) ;
        !          2006: 
        !          2007:    // fill data bits combo box and make initial selection
        !          2008: 
        !          2009:    for (wCount = 5; wCount < 9; wCount++)
        !          2010:    {
        !          2011:       wsprintf( szBuffer, "%d", wCount ) ;
        !          2012:       wPosition = LOWORD( SendDlgItemMessage( hDlg, IDD_DATABITSCB,
        !          2013:                                               CB_ADDSTRING, NULL,
        !          2014:                                               (LPARAM) (LPSTR) szBuffer ) ) ;
        !          2015: 
        !          2016:       // if current selection, tell the combo box
        !          2017: 
        !          2018:       if (wCount == BYTESIZE( npTTYInfo ))
        !          2019:          SendDlgItemMessage( hDlg, IDD_DATABITSCB, CB_SETCURSEL,
        !          2020:                              (WPARAM) wPosition, NULL ) ;
        !          2021:    }
        !          2022: 
        !          2023:    // fill parity combo box and make initial selection
        !          2024: 
        !          2025:    FillComboBox( GETHINST( hDlg ), GetDlgItem( hDlg, IDD_PARITYCB ),
        !          2026:                  IDS_PARITYNONE, ParityTable,
        !          2027:                  sizeof( ParityTable ) / sizeof( ParityTable[ 0 ] ),
        !          2028:                  PARITY( npTTYInfo ) ) ;
        !          2029: 
        !          2030:    // fill stop bits combo box and make initial selection
        !          2031: 
        !          2032:    FillComboBox( GETHINST( hDlg ), GetDlgItem( hDlg, IDD_STOPBITSCB ),
        !          2033:                  IDS_ONESTOPBIT, StopBitsTable,
        !          2034:                  sizeof( StopBitsTable ) / sizeof ( StopBitsTable ),
        !          2035:                  STOPBITS( npTTYInfo ) ) ;
        !          2036: 
        !          2037:    // initalize the flow control settings
        !          2038: 
        !          2039:    CheckDlgButton( hDlg, IDD_DTRDSR,
        !          2040:                    (FLOWCTRL( npTTYInfo ) & FC_DTRDSR) > 0 ) ;
        !          2041:    CheckDlgButton( hDlg, IDD_RTSCTS,
        !          2042:                    (FLOWCTRL( npTTYInfo ) & FC_RTSCTS) > 0 ) ;
        !          2043:    CheckDlgButton( hDlg, IDD_XONXOFF,
        !          2044:                    (FLOWCTRL( npTTYInfo ) & FC_XONXOFF) > 0 ) ;
        !          2045: 
        !          2046:    // other TTY settings
        !          2047: 
        !          2048:    CheckDlgButton( hDlg, IDD_AUTOWRAP, AUTOWRAP( npTTYInfo ) ) ;
        !          2049:    CheckDlgButton( hDlg, IDD_NEWLINE, NEWLINE( npTTYInfo ) ) ;
        !          2050:    CheckDlgButton( hDlg, IDD_LOCALECHO, LOCALECHO( npTTYInfo ) ) ;
        !          2051: 
        !          2052:    // control options
        !          2053: 
        !          2054: #ifdef WIN32
        !          2055:    // "Use CN_RECEIVE" is not valid under Win-32
        !          2056: 
        !          2057:    EnableWindow( GetDlgItem( hDlg, IDD_USECNRECEIVE ), FALSE ) ;
        !          2058: #else
        !          2059:    CheckDlgButton( hDlg, IDD_USECNRECEIVE, USECNRECEIVE( npTTYInfo ) ) ;
        !          2060: 
        !          2061:    // disable Use CN_RECEIVE option if connection has already been
        !          2062:    // established (e.g. OpenComm() already successful)
        !          2063: 
        !          2064:    EnableWindow( GetDlgItem( hDlg, IDD_USECNRECEIVE ),
        !          2065:                  !CONNECTED( npTTYInfo ) ) ;
        !          2066: #endif
        !          2067: 
        !          2068:    CheckDlgButton( hDlg, IDD_DISPLAYERRORS, DISPLAYERRORS( npTTYInfo ) ) ;
        !          2069: 
        !          2070:    return ( TRUE ) ;
        !          2071: 
        !          2072: } // end of SettingsDlgInit()
        !          2073: 
        !          2074: //---------------------------------------------------------------------------
        !          2075: //  BOOL NEAR SelectTTYFont( HWND hDlg )
        !          2076: //
        !          2077: //  Description:
        !          2078: //     Selects the current font for the TTY screen.
        !          2079: //     Uses the Common Dialog ChooseFont() API.
        !          2080: //
        !          2081: //  Parameters:
        !          2082: //     HWND hDlg
        !          2083: //        handle to settings dialog
        !          2084: //
        !          2085: //  History:   Date       Author      Comment
        !          2086: //             10/20/91   BryanW      Wrote it.
        !          2087: //
        !          2088: //---------------------------------------------------------------------------
        !          2089: 
        !          2090: BOOL NEAR SelectTTYFont( HWND hDlg )
        !          2091: {
        !          2092:    CHOOSEFONT  cfTTYFont ;
        !          2093:    NPTTYINFO   npTTYInfo ;
        !          2094: 
        !          2095:    if (NULL == (npTTYInfo = (NPTTYINFO) GET_PROP( hDlg, ATOM_TTYINFO )))
        !          2096:       return ( FALSE ) ;
        !          2097: 
        !          2098:    cfTTYFont.lStructSize    = sizeof( CHOOSEFONT ) ;
        !          2099:    cfTTYFont.hwndOwner      = hDlg ;
        !          2100:    cfTTYFont.hDC            = NULL ;
        !          2101:    cfTTYFont.rgbColors      = FGCOLOR( npTTYInfo ) ;
        !          2102:    cfTTYFont.lpLogFont      = &LFTTYFONT( npTTYInfo ) ;
        !          2103:    cfTTYFont.Flags          = CF_SCREENFONTS | CF_FIXEDPITCHONLY |
        !          2104:                               CF_EFFECTS | CF_INITTOLOGFONTSTRUCT ;
        !          2105:    cfTTYFont.lCustData      = NULL ;
        !          2106:    cfTTYFont.lpfnHook       = NULL ;
        !          2107:    cfTTYFont.lpTemplateName = NULL ;
        !          2108:    cfTTYFont.hInstance      = GETHINST( hDlg ) ;
        !          2109: 
        !          2110:    if (ChooseFont( &cfTTYFont ))
        !          2111:    {
        !          2112:      FGCOLOR( npTTYInfo ) = cfTTYFont.rgbColors ;
        !          2113:      ResetTTYScreen( GetParent( hDlg ), npTTYInfo ) ;
        !          2114:    }
        !          2115: 
        !          2116:    return ( TRUE ) ;
        !          2117: 
        !          2118: } // end of SelectTTYFont()
        !          2119: 
        !          2120: //---------------------------------------------------------------------------
        !          2121: //  BOOL NEAR SettingsDlgTerm( HWND hDlg )
        !          2122: //
        !          2123: //  Description:
        !          2124: //     Puts dialog contents into TTY info structure.
        !          2125: //
        !          2126: //  Parameters:
        !          2127: //     HWND hDlg
        !          2128: //        handle to settings dialog
        !          2129: //
        !          2130: //  Win-32 Porting Issues:
        !          2131: //     - Baud rate requires DWORD values.
        !          2132: //
        !          2133: //  History:   Date       Author      Comment
        !          2134: //              5/11/91   BryanW      Wrote it.
        !          2135: //              6/15/92   BryanW      Ported to Win-32.
        !          2136: //
        !          2137: //---------------------------------------------------------------------------
        !          2138: 
        !          2139: BOOL NEAR SettingsDlgTerm( HWND hDlg )
        !          2140: {
        !          2141:    NPTTYINFO  npTTYInfo ;
        !          2142:    WORD       wSelection ;
        !          2143: 
        !          2144:    if (NULL == (npTTYInfo = (NPTTYINFO) GET_PROP( hDlg, ATOM_TTYINFO )))
        !          2145:       return ( FALSE ) ;
        !          2146: 
        !          2147:    // get port selection
        !          2148: 
        !          2149:    PORT( npTTYInfo ) =
        !          2150:       LOBYTE( LOWORD( SendDlgItemMessage( hDlg, IDD_PORTCB,
        !          2151:                                           CB_GETCURSEL,
        !          2152:                                           NULL, NULL ) ) + 1 ) ;
        !          2153:    // get baud rate selection
        !          2154: 
        !          2155:    wSelection =
        !          2156:       LOWORD( SendDlgItemMessage( hDlg, IDD_BAUDCB, CB_GETCURSEL,
        !          2157:                                   NULL, NULL ) ) ;
        !          2158: #ifdef WIN32
        !          2159:    BAUDRATE( npTTYInfo ) =
        !          2160:       SendDlgItemMessage( hDlg, IDD_BAUDCB, CB_GETITEMDATA,
        !          2161:                           (WPARAM) wSelection, NULL ) ;
        !          2162: #else
        !          2163:    BAUDRATE( npTTYInfo ) =
        !          2164:       LOWORD( SendDlgItemMessage( hDlg, IDD_BAUDCB, CB_GETITEMDATA,
        !          2165:                                   (WPARAM) wSelection, NULL ) ) ;
        !          2166: #endif
        !          2167: 
        !          2168:    // get data bits selection
        !          2169: 
        !          2170:    BYTESIZE( npTTYInfo ) =
        !          2171:       LOBYTE( LOWORD( SendDlgItemMessage( hDlg, IDD_DATABITSCB,
        !          2172:                                           CB_GETCURSEL,
        !          2173:                                           NULL, NULL ) ) + 5 ) ;
        !          2174: 
        !          2175:    // get parity selection
        !          2176: 
        !          2177:    wSelection =
        !          2178:       LOWORD( SendDlgItemMessage( hDlg, IDD_PARITYCB, CB_GETCURSEL,
        !          2179:                                   NULL, NULL ) ) ;
        !          2180:    PARITY( npTTYInfo ) =
        !          2181:       LOBYTE( LOWORD( SendDlgItemMessage( hDlg, IDD_PARITYCB,
        !          2182:                                           CB_GETITEMDATA,
        !          2183:                                           (WPARAM) wSelection,
        !          2184:                                            NULL ) ) ) ;
        !          2185: 
        !          2186:    // get stop bits selection
        !          2187: 
        !          2188:    wSelection =
        !          2189:       LOWORD( SendDlgItemMessage( hDlg, IDD_STOPBITSCB, CB_GETCURSEL,
        !          2190:                                   NULL, NULL ) ) ;
        !          2191:    STOPBITS( npTTYInfo ) =
        !          2192:       LOBYTE( LOWORD( SendDlgItemMessage( hDlg, IDD_STOPBITSCB,
        !          2193:                                           CB_GETITEMDATA,
        !          2194:                                           (WPARAM) wSelection, NULL ) ) ) ;
        !          2195: 
        !          2196:    // get flow control settings
        !          2197: 
        !          2198:    FLOWCTRL( npTTYInfo ) = 0 ;
        !          2199:    if (IsDlgButtonChecked( hDlg, IDD_DTRDSR ))
        !          2200:       FLOWCTRL( npTTYInfo ) |= FC_DTRDSR ;
        !          2201:    if (IsDlgButtonChecked( hDlg, IDD_RTSCTS ))
        !          2202:       FLOWCTRL( npTTYInfo ) |= FC_RTSCTS ;
        !          2203:    if (IsDlgButtonChecked( hDlg, IDD_XONXOFF ))
        !          2204:       FLOWCTRL( npTTYInfo ) |= FC_XONXOFF ;
        !          2205: 
        !          2206:    // get other various settings
        !          2207: 
        !          2208:    AUTOWRAP( npTTYInfo ) = IsDlgButtonChecked( hDlg, IDD_AUTOWRAP ) ;
        !          2209:    NEWLINE( npTTYInfo ) = IsDlgButtonChecked( hDlg, IDD_NEWLINE ) ;
        !          2210:    LOCALECHO( npTTYInfo ) = IsDlgButtonChecked( hDlg, IDD_LOCALECHO ) ;
        !          2211: 
        !          2212:    // control options
        !          2213: 
        !          2214:    USECNRECEIVE( npTTYInfo ) = IsDlgButtonChecked( hDlg, IDD_USECNRECEIVE ) ;
        !          2215:    DISPLAYERRORS( npTTYInfo ) = IsDlgButtonChecked( hDlg, IDD_DISPLAYERRORS ) ;
        !          2216: 
        !          2217:    return ( TRUE ) ;
        !          2218: 
        !          2219: } // end of SettingsDlgTerm()
        !          2220: 
        !          2221: //---------------------------------------------------------------------------
        !          2222: //  BOOL FAR PASCAL SettingsDlgProc( HWND hDlg, UINT uMsg,
        !          2223: //                                   WPARAM wParam, LPARAM lParam )
        !          2224: //
        !          2225: //  Description:
        !          2226: //     This handles all of the user preference settings for
        !          2227: //     the TTY.
        !          2228: //
        !          2229: //  Parameters:
        !          2230: //     same as all dialog procedures
        !          2231: //
        !          2232: //  Win-32 Porting Issues:
        !          2233: //     - npTTYInfo is a DWORD in Win-32.
        !          2234: //
        !          2235: //  History:   Date       Author      Comment
        !          2236: //              5/10/91   BryanW      Wrote it.
        !          2237: //             10/20/91   BryanW      Now uses window properties to
        !          2238: //                                    store TTYInfo handle.  Also added
        !          2239: //                                    font selection.
        !          2240: //              6/15/92   BryanW      Ported to Win-32.
        !          2241: //
        !          2242: //---------------------------------------------------------------------------
        !          2243: 
        !          2244: BOOL FAR PASCAL SettingsDlgProc( HWND hDlg, UINT uMsg,
        !          2245:                                  WPARAM wParam, LPARAM lParam )
        !          2246: {
        !          2247:    switch (uMsg)
        !          2248:    {
        !          2249:       case WM_INITDIALOG:
        !          2250:       {
        !          2251:          NPTTYINFO  npTTYInfo ;
        !          2252: 
        !          2253:          // get & save pointer to TTY info structure
        !          2254: 
        !          2255: #ifdef WIN32
        !          2256:          npTTYInfo = (NPTTYINFO) lParam ;
        !          2257: #else
        !          2258:          npTTYInfo = (NPTTYINFO) LOWORD( lParam ) ;
        !          2259: #endif
        !          2260: 
        !          2261:          SET_PROP( hDlg, ATOM_TTYINFO, (HANDLE) npTTYInfo ) ;
        !          2262: 
        !          2263:          return ( SettingsDlgInit( hDlg ) ) ;
        !          2264:       }
        !          2265: 
        !          2266:       case WM_COMMAND:
        !          2267:          switch ( LOWORD( wParam ))
        !          2268:          {
        !          2269:             case IDD_FONT:
        !          2270:                return ( SelectTTYFont( hDlg ) ) ;
        !          2271: 
        !          2272:             case IDD_OK:
        !          2273:                // Copy stuff into structure
        !          2274:                SettingsDlgTerm( hDlg ) ;
        !          2275:                EndDialog( hDlg, TRUE ) ;
        !          2276:                return ( TRUE ) ;
        !          2277: 
        !          2278:             case IDD_CANCEL:
        !          2279:                // Just end
        !          2280:                EndDialog( hDlg, TRUE ) ;
        !          2281:                return ( TRUE ) ;
        !          2282:          }
        !          2283:          break;
        !          2284: 
        !          2285:       case WM_DESTROY:
        !          2286:          REMOVE_PROP( hDlg, ATOM_TTYINFO ) ;
        !          2287:          break ;
        !          2288:    }
        !          2289:    return ( FALSE ) ;
        !          2290: 
        !          2291: } // end of SettingsDlgProc()
        !          2292: 
        !          2293: #ifdef WIN32
        !          2294: 
        !          2295: //************************************************************************
        !          2296: //  DWORD FAR PASCAL CommWatchProc( LPSTR lpData )
        !          2297: //
        !          2298: //  Description:
        !          2299: //     A secondary thread that will watch for COMM events.
        !          2300: //
        !          2301: //  Parameters:
        !          2302: //     LPSTR lpData
        !          2303: //        32-bit pointer argument
        !          2304: //
        !          2305: //  Win-32 Porting Issues:
        !          2306: //     - Added this thread to watch the communications device and
        !          2307: //       post notifications to the associated window.
        !          2308: //
        !          2309: //  History:   Date       Author      Comment
        !          2310: //             12/31/91   BryanW      Wrote it.
        !          2311: //              6/12/92   BryanW      CommWaitEvent() now uses
        !          2312: //                                    an overlapped structure.
        !          2313: //
        !          2314: //************************************************************************
        !          2315: 
        !          2316: DWORD FAR PASCAL CommWatchProc( LPSTR lpData )
        !          2317: {
        !          2318:    DWORD       cbTransfer ;
        !          2319:    DWORD       dwEvtMask ;
        !          2320:    NPTTYINFO   npTTYInfo = (NPTTYINFO) lpData ;
        !          2321:    OVERLAPPED  os ;
        !          2322: 
        !          2323:    memset( &os, 0, sizeof( OVERLAPPED ) ) ;
        !          2324: 
        !          2325:    // create I/O event used for overlapped read
        !          2326: 
        !          2327:    os.hEvent = CreateEvent( NULL,    // no security
        !          2328:                             TRUE,    // explicit reset req
        !          2329:                             FALSE,   // initial event reset
        !          2330:                             NULL ) ; // no name
        !          2331:    if (os.hEvent == NULL)
        !          2332:    {
        !          2333:       MessageBox( NULL, "Failed to create event for thread!", "TTY Error!",
        !          2334:                   MB_ICONEXCLAMATION | MB_OK ) ;
        !          2335:       return ( FALSE ) ;
        !          2336:    }
        !          2337: 
        !          2338:    if (!SetCommMask( COMDEV( npTTYInfo ), EV_RXCHAR ))
        !          2339:       return ( FALSE ) ;
        !          2340: 
        !          2341:    while ( CONNECTED( npTTYInfo ) )
        !          2342:    {
        !          2343:       dwEvtMask = NULL ;
        !          2344: 
        !          2345:       if (!WaitCommEvent( COMDEV( npTTYInfo ), &dwEvtMask, &os ))
        !          2346:       {
        !          2347:          if (ERROR_IO_PENDING == GetLastError())
        !          2348:          {
        !          2349:             GetOverlappedResult( COMDEV( npTTYInfo ), &os, &cbTransfer, TRUE ) ;
        !          2350:             os.Offset += cbTransfer ;
        !          2351:          }
        !          2352:       }
        !          2353: 
        !          2354:       if ((dwEvtMask & EV_RXCHAR) == EV_RXCHAR)
        !          2355:       {
        !          2356:          // wait for "posted notification" flag to clear
        !          2357: 
        !          2358:          WaitForSingleObject( POSTEVENT( npTTYInfo ), 0xFFFFFFFF ) ;
        !          2359: 
        !          2360:          // reset event
        !          2361: 
        !          2362:          ResetEvent( POSTEVENT( npTTYInfo ) ) ;
        !          2363: 
        !          2364:          // last message was processed, O.K. to post
        !          2365: 
        !          2366:          PostMessage( TERMWND( npTTYInfo ), WM_COMMNOTIFY,
        !          2367:                       (WPARAM) COMDEV( npTTYInfo ),
        !          2368:                       MAKELONG( CN_EVENT, 0 ) ) ;
        !          2369:       }
        !          2370:    }
        !          2371: 
        !          2372:    // get rid of event handle
        !          2373: 
        !          2374:    CloseHandle( os.hEvent ) ;
        !          2375: 
        !          2376:    // clear information in structure (kind of a "we're done flag")
        !          2377: 
        !          2378:    THREADID( npTTYInfo ) = NULL ;
        !          2379:    HTHREAD( npTTYInfo ) = NULL ;
        !          2380: 
        !          2381:    return( TRUE ) ;
        !          2382: 
        !          2383: } // end of CommWatchProc()
        !          2384: 
        !          2385: #endif
        !          2386: 
        !          2387: //---------------------------------------------------------------------------
        !          2388: //  End of File: tty.c
        !          2389: //---------------------------------------------------------------------------

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.