Annotation of mstools/samples/mcitest/mcitest.c, revision 1.1.1.1

1.1       root        1: /* mcitest.c - WinMain(), main dialog box and support code for MCITest.
                      2:  *
                      3:  * MCITest is a Windows with Multimedia sample application illustrating
                      4:  * the use of the Media Control Interface (MCI). MCITest puts up a dialog
                      5:  * box allowing you to enter and execute MCI string commands.
                      6:  *
                      7:  *    (C) Copyright Microsoft Corp. 1991, 1992.  All rights reserved.
                      8:  *
                      9:  *    You have a royalty-free right to use, modify, reproduce and
                     10:  *    distribute the Sample Files (and/or any modified version) in
                     11:  *    any way you find useful, provided that you agree that
                     12:  *    Microsoft has no warranty obligations or liability for any
                     13:  *    Sample Application Files which are modified.
                     14:  */
                     15: 
                     16: /*----------------------------------------------------------------------------*\
                     17: |   mcitest.c - A testbed for MCI                                              |
                     18: |                                                                              |
                     19: |                                                                              |
                     20: |   History:                                                                   |
                     21: |       01/01/88 toddla     Created                                            |
                     22: |       03/01/90 davidle    Modified quick app into MCI testbed                |
                     23: |       09/17/90 t-mikemc   Added Notification box with 3 notification types   |
                     24: |       11/02/90 w-dougb    Commented & formatted the code to look pretty      |
                     25: |       05/29/91 NigelT     ported to Win32
                     26: |       02/05/92 SteveDav   Merged latest Win 3.1 stuff
                     27: |                                                                              |
                     28: \*----------------------------------------------------------------------------*/
                     29: 
                     30: /*----------------------------------------------------------------------------*\
                     31: |                                                                              |
                     32: |   i n c l u d e   f i l e s                                                  |
                     33: |                                                                              |
                     34: \*----------------------------------------------------------------------------*/
                     35: 
                     36: #include <stdio.h>
                     37: #include <string.h>
                     38: #include <windows.h>
                     39: #include "mcitest.h"
                     40: #include "mcimain.h"
                     41: #include "edit.h"
                     42: 
                     43: 
                     44: /*----------------------------------------------------------------------------*\
                     45: |                                                                              |
                     46: |   c o n s t a n t   a n d   m a c r o   d e f i n i t i o n s                |
                     47: |                                                                              |
                     48: \*----------------------------------------------------------------------------*/
                     49: 
                     50: #define BUFFER_LENGTH 256
                     51: #define SLASH(c)      ((c) == '/' || (c) == '\\')
                     52: 
                     53: 
                     54: /*----------------------------------------------------------------------------*\
                     55: |                                                                              |
                     56: |   g l o b a l   v a r i a b l e s                                            |
                     57: |                                                                              |
                     58: \*----------------------------------------------------------------------------*/
                     59: #ifndef STATICDT
                     60:   #if DBG
                     61:        #define STATICDT
                     62:   #else
                     63:        #define STATICDT static
                     64:   #endif
                     65: #endif
                     66: 
                     67: STATICDT int         nLastNumberOfDevices = 0;
                     68: STATICDT HANDLE      hAccTable;
                     69: STATICDT HANDLE      hInstApp;
                     70:          HWND        hwndMainDlg = 0;
                     71: STATICDT HWND        hwndEdit = 0;
                     72: STATICDT HWND        hwndDevices = 0;
                     73: STATICDT char        aszMciFile[BUFFER_LENGTH] = "";
                     74: STATICDT char        aszBuffer[BUFFER_LENGTH];
                     75: STATICDT char        aszExt[] = "*.mcs";
                     76:          char        aszAppName[] = "MCITest";
                     77: STATICDT char        aszMainTextFormat[] = "%s - %s";
                     78: STATICDT char        aszDeviceTextFormat[] = "Open MCI Devices(count=%d)";
                     79: STATICDT char        aszNULL[] = "";
                     80: STATICDT char        aszTRUE[] = "TRUE";
                     81: STATICDT char        aszFALSE[] = "FALSE";
                     82: STATICDT char        aszEOL[] = "\r\n";
                     83: STATICDT char        aszOpenFileTitle[] = "Open MCITest File";
                     84: STATICDT char        aszSaveFileTitle[] = "Save MCITest File";
                     85: STATICDT char        aszSaveFileControl[] = "Save File &Name";
                     86: STATICDT char        aszProfileSection[] = "extensions";
                     87: STATICDT char        aszProfileKey[] = "mcs";
                     88: STATICDT char        aszProfileSetting[] = "mcitest.exe ^.mcs";
                     89: STATICDT char        aszMciTester[] = "MciTester";
                     90: 
                     91: /*----------------------------------------------------------------------------*\
                     92: |                                                                              |
                     93: |   f u n c t i o n   d e f i n i t i o n s                                    |
                     94: |                                                                              |
                     95: \*----------------------------------------------------------------------------*/
                     96: 
                     97: BOOL mcitester(HWND hwnd, UINT Msg, LONG wParam, LONG lParam);
                     98: PSTR FileName(PSTR szPath);
                     99: STATICFN void update_device_list(void);
                    100: DWORD sendstring(HWND hwndDlg, PSTR strBuffer);
                    101: void execute( HWND hwndDlg, BOOL fStep);
                    102: void OpenMciFile( HWND hwndDlg, LPSTR szFile);
                    103: BOOL AppInit(int argc, char *argv[]);
                    104: BOOL ErrDlgFunc( HWND hwndDlg, UINT Msg, LONG w, LONG l );
                    105: void create_device_list(void);
                    106: STATICFN BOOL devices(HWND hwndDlg, UINT Msg, LONG wParam, LONG lParam);
                    107: 
                    108: /*----------------------------------------------------------------------------*\
                    109: |   AboutDlgProc( hwndDlg, Message, wParam, lParam )                           |
                    110: |                                                                              |
                    111: |   Description:                                                               |
                    112: |       This function handles messages belonging to the "About" dialog box.    |
                    113: |       The only message that it looks for is WM_COMMAND, indicating the user  |
                    114: |       has pressed the "OK" button.  When this happens, it takes down         |
                    115: |       the dialog box.                                                        |
                    116: |                                                                              |
                    117: |   Arguments:                                                                 |
                    118: |       hwndDlg         window handle of the about dialog window               |
                    119: |       Message         message number                                         |
                    120: |       wParam          message-dependent parameter                            |
                    121: |       lParam          message-dependent parameter                            |
                    122: |                                                                              |
                    123: |   Returns:                                                                   |
                    124: |       TRUE if the message has been processed, else FALSE                     |
                    125: |                                                                              |
                    126: \*----------------------------------------------------------------------------*/
                    127: 
                    128: BOOL AboutDlgProc(
                    129:     HWND    hwndDlg,
                    130:     UINT    Msg,
                    131:     LONG    wParam,
                    132:     LONG    lParam)
                    133: {
                    134:        dprintf4("AboutDlgProc");
                    135:     switch (Msg) {
                    136:     case WM_COMMAND:
                    137: 
                    138:         if (LOWORD(wParam) == IDOK) {
                    139:             EndDialog(hwndDlg,TRUE);
                    140:         }
                    141:         break;
                    142: 
                    143:     case WM_INITDIALOG:
                    144:         return TRUE;
                    145: 
                    146:     }
                    147: 
                    148:     return FALSE;
                    149: }
                    150: 
                    151: /*----------------------------------------------------------------------------*\
                    152: |   FileName(szPath)                                                           |
                    153: |                                                                              |
                    154: |   Description:                                                               |
                    155: |       This function takes the full path\filename string specified in <szPath>|
                    156: |       and returns a pointer to the first character of the filename in the    |
                    157: |       same string.                                                           |
                    158: |                                                                              |
                    159: |   Arguments:                                                                 |
                    160: |       szPath          pointer to the full path\filename string               |
                    161: |                                                                              |
                    162: |   Returns:                                                                   |
                    163: |       a pointer to the first character of the filename in the same string    |
                    164: |                                                                              |
                    165: \*----------------------------------------------------------------------------*/
                    166: 
                    167: PSTR FileName(
                    168:     PSTR   szPath)
                    169: {
                    170:     PSTR   szCurrent;               /* temporary pointer to the string        */
                    171: 
                    172:     /* Scan to the end of the string */
                    173: 
                    174:     for (szCurrent = szPath; *szCurrent; szCurrent++)
                    175:     {} ;
                    176: 
                    177:     /*
                    178:      * Now start scanning back towards the beginning of the string until
                    179:      * a slash (\) character, colon, or start of the string is encountered.
                    180:      */
                    181: 
                    182:     for (; szCurrent >= szPath
                    183:               && !SLASH(*szCurrent)
                    184:                   && *szCurrent != ':'
                    185:                 ; szCurrent--)
                    186:     {} ;
                    187: 
                    188:        /* This should be done by calling a Win 32 function, e.g. GetFullPathName
                    189:         */
                    190: 
                    191:     /* Now pointing to the char before the first char in the filename.
                    192:      */
                    193:     return ++szCurrent;
                    194: }
                    195: 
                    196: /*----------------------------------------------------------------------------*\
                    197: |   OpenMciFile( hwndDlg, szFile )                                                |
                    198: |                                                                              |
                    199: |   Description:                                                               |
                    200: |       This function opens the MCI file specified by <szFile> and updates the |
                    201: |       main window caption to display this file name along with the app name. |
                    202: |                                                                              |
                    203: |   Arguments:                                                                 |
                    204: |       hwndDlg            window handle of the main dialog window                |
                    205: |       szFile          pointer to the string containing the filename to be    |
                    206: |                        opened                                                |
                    207: |   Returns:                                                                   |
                    208: |       void                                                                   |
                    209: |                                                                              |
                    210: \*----------------------------------------------------------------------------*/
                    211: 
                    212: void OpenMciFile(
                    213:     HWND    hwndDlg,
                    214:     LPSTR   lszFile)
                    215: {
                    216:     dprintf2("OpenMciFile: %s", lszFile);
                    217: 
                    218:     if (EditOpenFile(hwndEdit, lszFile)) {
                    219: 
                    220:         strcpy(aszMciFile, lszFile);
                    221:         wsprintf(aszBuffer, aszMainTextFormat, (LPSTR)aszAppName,
                    222:            (LPSTR)FileName(aszMciFile));
                    223:         dprintf3("Set caption: %s", aszBuffer);
                    224:         SetWindowText(hwndDlg, aszBuffer);
                    225:     } else {
                    226:         dprintf1("failed to open %s", lszFile);
                    227:     }
                    228: }
                    229: 
                    230: /*----------------------------------------------------------------------------*\
                    231: |   get_number_of_devices()                                                    |
                    232: |                                                                              |
                    233: |   Description:                                                               |
                    234: |       This function sends a command to MCI querying it as to how many        |
                    235: |       are currently open in the system. It returns the value provided by MCI.|
                    236: |                                                                              |
                    237: |   Arguments:                                                                 |
                    238: |       none                                                                   |
                    239: |                                                                              |
                    240: |   Returns:                                                                   |
                    241: |       The number of MCI devices currently open, or 0 if an error occurred.   |
                    242: |                                                                              |
                    243: \*----------------------------------------------------------------------------*/
                    244: 
                    245: int get_number_of_devices(
                    246:     void)
                    247: {
                    248:     MCI_SYSINFO_PARMS sysinfo;      /* Parameter structure used for getting
                    249:                                         information about the MCI devices in
                    250:                                         the system                            */
                    251:     DWORD dwDevices;                /* count of open devices                  */
                    252: 
                    253:     /*
                    254:      * Set things up so that MCI puts the number of open devices directly
                    255:      * into <dwDevices>.
                    256:      */
                    257: 
                    258:     sysinfo.lpstrReturn = (LPSTR)(LPDWORD)&dwDevices;
                    259:     sysinfo.dwRetSize = sizeof(dwDevices);
                    260: 
                    261:     /*
                    262:      * Send MCI a command querying all devices in the system to see if they
                    263:      * are open. If the command was successful, return the number provided by
                    264:      * MCI. Otherwise, return 0.
                    265:      *
                    266:      */
                    267: 
                    268:     if (mciSendCommand (MCI_ALL_DEVICE_ID,
                    269:                         MCI_SYSINFO,
                    270:                         (MCI_SYSINFO_OPEN | MCI_SYSINFO_QUANTITY),
                    271:                         (DWORD)(LPMCI_SYSINFO_PARMS)&sysinfo) != 0)
                    272:         return 0;
                    273:     else
                    274:         return (int)dwDevices;
                    275: }
                    276: 
                    277: 
                    278: /*----------------------------------------------------------------------------*\
                    279: |   update_device_list()                                                       |
                    280: |                                                                              |
                    281: |   Description:                                                               |
                    282: |       This function updates the list of devices displayed in the Devices     |
                    283: |       dialog.                                                                |
                    284: |                                                                              |
                    285: |   Arguments:                                                                 |
                    286: |       none                                                                   |
                    287: |                                                                              |
                    288: |   Returns:                                                                   |
                    289: |       void                                                                   |
                    290: |                                                                              |
                    291: \*----------------------------------------------------------------------------*/
                    292: 
                    293: STATICFN void update_device_list(
                    294:     void)
                    295: {
                    296:        char aszBuf[BUFFER_LENGTH];     /* string used for several things       */
                    297:     MCI_SYSINFO_PARMS sysinfo;      /* Parameter structure used for getting
                    298:                                           information about the devices in the
                    299:                                           system                              */
                    300:     HWND              hwndList;     /* handle to the Devices listbox window   */
                    301:     int               nDevices;
                    302:     int               nCurrentDevice;
                    303: #if DBG
                    304:     BOOL              fNoRedraw = FALSE;
                    305: #endif
                    306: 
                    307:     /* If the Devices dialog is not present, then return */
                    308: 
                    309:     if (hwndDevices == 0) {
                    310:         return;
                    311:     }
                    312: 
                    313:     /* Find out how many devices are currently open in the system */
                    314: 
                    315:     nDevices = get_number_of_devices();
                    316: 
                    317:     /* Update the dialog caption appropriately */
                    318: 
                    319:        wsprintf(aszBuf, aszDeviceTextFormat, nDevices);
                    320:        SetWindowText(hwndDevices, aszBuf);
                    321: 
                    322:     /* Get a handle to the dialog's listbox, and prepare it for updating */
                    323: 
                    324:     hwndList = GetDlgItem (hwndDevices, ID_DEVICE_LIST);
                    325:     SendMessage (hwndList, LB_RESETCONTENT, 0, 0L);
                    326: 
                    327:        if (nDevices) {
                    328:                SendMessage (hwndList, WM_SETREDRAW, FALSE, 0L);
                    329: #if DBG
                    330:                fNoRedraw = TRUE;
                    331: #endif
                    332:        }
                    333: 
                    334:     /*
                    335:      * Get the name of each open device in the system, one device at a time.
                    336:      * Add each device's name to the listbox.
                    337:      */
                    338: 
                    339:     for (nCurrentDevice = 1; nCurrentDevice <= nDevices; ++nCurrentDevice) {
                    340: 
                    341:         sysinfo.dwNumber = nCurrentDevice;
                    342:         sysinfo.lpstrReturn = (LPSTR)&aszBuf;
                    343:         sysinfo.dwRetSize = sizeof(aszBuf);
                    344: 
                    345:         /* If an error is encountered, skip to the next device.
                    346:          */
                    347:         if (mciSendCommand(MCI_ALL_DEVICE_ID, MCI_SYSINFO,
                    348:                             MCI_SYSINFO_OPEN | MCI_SYSINFO_NAME,
                    349:                             (DWORD)(LPMCI_SYSINFO_PARMS)&sysinfo) != 0) {
                    350:             continue;
                    351:                }
                    352: 
                    353:         /* Redraw the list when all device names have been added.
                    354:          */
                    355:         if (nCurrentDevice == nDevices) {
                    356:                        /* About to add the last device - allow redrawing */
                    357:             SendMessage(hwndList, WM_SETREDRAW, TRUE, 0L);
                    358: #if DBG
                    359:                        fNoRedraw = FALSE;
                    360: #endif
                    361:                }
                    362: 
                    363:         /* Add the device name to the listbox.
                    364:          */
                    365:         SendMessage(hwndList, LB_ADDSTRING, 0, (LONG)(LPSTR)aszBuf);
                    366:     }
                    367: 
                    368:        
                    369: #if DBG
                    370:        if (fNoRedraw) { // We had an error...
                    371:                dDbgAssert("Assert failed, REDRAW is still off", __FILE__, __LINE__);
                    372:        }
                    373: #endif
                    374: 
                    375:     /* Remember the number of open devices we found this time */
                    376: 
                    377:     nLastNumberOfDevices = nDevices;
                    378: }
                    379: 
                    380: /*----------------------------------------------------------------------------*\
                    381: |   sendstring( hwndDlg, strBuffer )                                           |
                    382: |                                                                              |
                    383: |   Description:                                                               |
                    384: |       This function sends the string command specified in <strBuffer> to MCI |
                    385: |       via the MCI string interface. Any message returned by MCI is displayed |
                    386: |       in the 'MCI output' box. Any error which may have occurred is displayed|
                    387: |       in the 'Error' box'.                                                   |
                    388: |                                                                              |
                    389: |   Arguments:                                                                 |
                    390: |       hwndDlg            window handle of the main dialog window                |
                    391: |       strBuffer       pointer to the string containing the string command to |
                    392: |                        be executed                                           |
                    393: |   Returns:                                                                   |
                    394: |       void                                                                   |
                    395: |                                                                              |
                    396: \*----------------------------------------------------------------------------*/
                    397: 
                    398: DWORD sendstring(
                    399:     HWND    hwndDlg,
                    400:     PSTR    strBuffer)
                    401: {
                    402:     char    aszReturn[BUFFER_LENGTH];       /* string containing the message
                    403:                                                 returned by MCI               */
                    404:     DWORD   dwErr;                          /* variable containing the return
                    405:                                                 code from the MCI command     */
                    406:     dprintf2("sendstring: %s", strBuffer);
                    407: 
                    408:     /* Uncheck the notification buttons */
                    409: 
                    410:     CheckDlgButton (hwndDlg, ID_NOT_SUCCESS, FALSE);
                    411:     CheckDlgButton (hwndDlg, ID_NOT_SUPER, FALSE);
                    412:     CheckDlgButton (hwndDlg, ID_NOT_ABORT, FALSE);
                    413:     CheckDlgButton (hwndDlg, ID_NOT_FAIL, FALSE);
                    414: 
                    415:     /* Send the string command to MCI */
                    416: 
                    417:     dwErr = mciSendString(strBuffer, aszReturn, sizeof(aszReturn), hwndDlg);
                    418: 
                    419:     /* Put the text message returned by MCI into the 'MCI Output' box */
                    420: 
                    421:     SetDlgItemText (hwndDlg, ID_OUTPUT, aszReturn);
                    422: 
                    423:     /*
                    424:      * Decode the error # returned by MCI, and display the string in the
                    425:      * 'Error' box.
                    426:      */
                    427: 
                    428:     mciGetErrorString(dwErr, strBuffer, BUFFER_LENGTH);
                    429:     SetDlgItemText(hwndDlg, ID_ERRORCODE, strBuffer);
                    430: 
                    431:     /* Update the internal list of currently open devices */
                    432: 
                    433:     update_device_list();
                    434:     return dwErr;
                    435: }
                    436: 
                    437: 
                    438: /*----------------------------------------------------------------------------*\
                    439: |   ErrDlgFunc( hwndDlg, Msg, wParam, lParam )                                    |
                    440: |                                                                              |
                    441: |   Description:                                                               |
                    442: |       This function is the callback function for the dialog box which           |
                    443: |       occurs during the execution of a error in a loop of MCITEST commands   |
                    444: |       It displays Abort, Continue and Ignore buttons                         |
                    445: |                                                                              |
                    446: |   Arguments:                                                                 |
                    447: |       hwndDlg            window handle of the error message dialog window       |
                    448: |       Msg             message number                                         |
                    449: |       wParam          message-dependent parameter                            |
                    450: |       lParam          message-dependent parameter                            |
                    451: |                                                                              |
                    452: |   Returns:                                                                   |
                    453: |       normal message passing return values                                   |
                    454: |                                                                              |
                    455: \*----------------------------------------------------------------------------*/
                    456: 
                    457: 
                    458: BOOL ErrDlgFunc(
                    459:     HWND    hwndDlg,
                    460:     UINT    Msg,
                    461:     LONG    wParam,
                    462:     LONG    lParam)
                    463: {
                    464:        dprintf4("ErrDlgFunc");
                    465:     switch( Msg ) {
                    466:                case WM_INITDIALOG:
                    467:                        return TRUE;
                    468:                
                    469: 
                    470:                case WM_COMMAND:
                    471:                        switch( LOWORD(wParam) ) {              // button pushed
                    472:                                case IDABORT:
                    473:                                case IDOK:
                    474:                                case IDIGNORE:
                    475:                                        EndDialog( hwndDlg, LOWORD(wParam) ); // return button ID
                    476:                                        break;
                    477:                                }
                    478:                        break;
                    479:     }
                    480:     return( FALSE );
                    481: }
                    482: 
                    483: /*----------------------------------------------------------------------------*\
                    484: |   execute( hwndDlg, fStep )                                                  |
                    485: |                                                                              |
                    486: |   Description:                                                               |
                    487: |       This function executes the MCI command which is currently selected in  |
                    488: |       the edit box. If <fStep> is true, then only this one line will be      |
                    489: |       executed. Otherwise, every line from the currently selected line to    |
                    490: |       the last line in the edit box will be executed sequentially.           |
                    491: |                                                                              |
                    492: |   Arguments:                                                                 |
                    493: |       hwndDlg         window handle of the main dialog window                |
                    494: |       fSingleStep     flag indicating whether or not to work in 'single step'|
                    495: |                        mode                                                  |
                    496: |   Returns:                                                                   |
                    497: |       void                                                                   |
                    498: |                                                                              |
                    499: \*----------------------------------------------------------------------------*/
                    500: 
                    501: void execute(
                    502:     HWND    hwndDlg,
                    503:     BOOL    fSingleStep)
                    504: {
                    505:     int  iLine;             /* line # of the command currently being executed
                    506:                                 in the edit box                               */
                    507:     int  n=0;               /* counter variable                               */
                    508:     int  runcount = 1;
                    509:     int  count;
                    510:     int  iLineStart;
                    511:     BOOL fIgnoreErrors = FALSE;
                    512: 
                    513:     runcount = GetDlgItemInt(hwndDlg, ID_RUNCOUNT, NULL, TRUE);
                    514: 
                    515:     /*
                    516:      * Go through this loop for every line in the edit box from the currently
                    517:      * selected line to the last line, or a single line if in single step mode
                    518:      */
                    519: 
                    520:     iLineStart = EditGetCurLine(hwndEdit);
                    521:        dprintf2("Called to execute %d lines from line %d", runcount, iLineStart);
                    522: 
                    523:     for (count = runcount; count-- > 0; )
                    524:     {
                    525:         for (iLine = iLineStart;
                    526:             EditGetLine(hwndEdit, iLine, aszBuffer, sizeof(aszBuffer));
                    527:             iLine++ ) {
                    528: 
                    529:             /* If we hit a comment line or a blank line, skip to the next line */
                    530: 
                    531:             if (*aszBuffer == ';' || *aszBuffer == 0) {
                    532:                 continue;
                    533:                        }
                    534: 
                    535:             /* Select the line that is about to be processed */
                    536: 
                    537:             EditSelectLine(hwndEdit,iLine);
                    538: 
                    539:             /*
                    540:              * If we're in 'single step' mode and we've already processed one
                    541:              * line, then break out of the loop (and exit the routine).
                    542:              */
                    543: 
                    544:             if (fSingleStep && ++n == 2) {
                    545:                 break;
                    546:             }
                    547: 
                    548:             /*
                    549:             * Send the command on the current line to MCI via the string
                    550:             * interface.
                    551:             */
                    552: 
                    553:             if (sendstring(hwndDlg, aszBuffer) != 0
                    554:               && !fIgnoreErrors
                    555:               && runcount > 1
                    556:               && !fSingleStep) {
                    557: 
                    558:                 int nRet;
                    559: 
                    560:                 nRet = DialogBox(hInstApp, MAKEINTRESOURCE(IDD_ERRORDLG),
                    561:                                  hwndDlg, (DLGPROC)ErrDlgFunc);
                    562: 
                    563:                 if (nRet == IDABORT)  { goto exit_fn; }
                    564:                 if (nRet == IDIGNORE) { fIgnoreErrors = TRUE; }
                    565: 
                    566:             }
                    567:         }
                    568:         SetDlgItemInt (hwndDlg, ID_RUNCOUNT, count, TRUE);
                    569:         if (fSingleStep) { break; }
                    570:     }
                    571: exit_fn:;
                    572:     SetDlgItemInt (hwndDlg, ID_RUNCOUNT, runcount, TRUE);
                    573: }
                    574: 
                    575: 
                    576: /*----------------------------------------------------------------------------*\
                    577: |   devices( hwndDlg, uMessage, wParam, lParam )                                  |
                    578: |                                                                              |
                    579: |   Description:                                                               |
                    580: |       This function handles messages belonging to the "List of open devices" |
                    581: |       dialog box. The only message that it looks for is WM_COMMAND,          |
                    582: |       indicating the user has pressed the "OK" button.  When this happens,   |
                    583: |       it takes down the dialog box.                                          |
                    584: |                                                                              |
                    585: |   Arguments:                                                                 |
                    586: |       hwndDlg            window handle of the Devices dialog window             |
                    587: |       uMessage        message number                                         |
                    588: |       wParam          message-dependent parameter                            |
                    589: |       lParam          message-dependent parameter                            |
                    590: |                                                                              |
                    591: |   Returns:                                                                   |
                    592: |       TRUE if the message has been processed, else FALSE                     |
                    593: |                                                                              |
                    594: \*----------------------------------------------------------------------------*/
                    595: 
                    596: STATICFN BOOL devices(
                    597:     HWND    hwndDlg,
                    598:     UINT    Msg,
                    599:     LONG    wParam,
                    600:     LONG    lParam)
                    601: {
                    602:     switch (Msg) {
                    603: 
                    604:     case WM_COMMAND:
                    605: 
                    606:                dprintf4("Devices -- WM_COMMAND");
                    607:         switch (LOWORD(wParam)) {
                    608: 
                    609:         case ID_END_DEVICE_LIST:
                    610: 
                    611:             hwndDevices = 0;
                    612:             EndDialog(hwndDlg,TRUE);
                    613: 
                    614:             break;
                    615:         }
                    616: 
                    617:         break;
                    618:     }
                    619: 
                    620:     return FALSE;
                    621: }
                    622: 
                    623: 
                    624: 
                    625: /*----------------------------------------------------------------------------*\
                    626: |   create_device_list()                                                       |
                    627: |                                                                              |
                    628: |   Description:                                                               |
                    629: |       This function creates the Devices dialog box and updates the list of   |
                    630: |       open devices displayed in it.                                          |
                    631: |                                                                              |
                    632: |   Arguments:                                                                 |
                    633: |       none                                                                   |
                    634: |                                                                              |
                    635: |   Returns:                                                                   |
                    636: |       void                                                                   |
                    637: |                                                                              |
                    638: \*----------------------------------------------------------------------------*/
                    639: 
                    640: void create_device_list(
                    641:     void)
                    642: {
                    643:     /* Create the Devices dialog box */
                    644: 
                    645:     hwndDevices = CreateDialog(hInstApp, MAKEINTRESOURCE(IDD_DEVICES),
                    646:                                hwndMainDlg, (DLGPROC)devices);
                    647:     //hwndDevices = CreateDialog (hInstApp, "devices", hwndMainDlg, (WNDPROC)devices);
                    648: 
                    649:     if (hwndDevices == NULL) {
                    650:                dprintf1("NULL hwndDevices");
                    651:         return;
                    652:     }
                    653: 
                    654:     /* Update the information displayed in the listbox */
                    655: 
                    656:     update_device_list();
                    657: }
                    658: 
                    659: 
                    660: /*----------------------------------------------------------------------------*\
                    661: |   mcitester( hwndDlg, Msg, wParam, lParam )                                  |
                    662: |                                                                              |
                    663: |   Description:                                                               |
                    664: |       This function is the main message handler for MCI test. It handles     |
                    665: |       messages from the pushbuttons, radio buttons, edit controls, menu      |
                    666: |       system, etc. When it receives a WM_EXIT message, this routine tears    |
                    667: |       everything down and exits.                                             |
                    668: |                                                                              |
                    669: |   Arguments:                                                                 |
                    670: |       hwndDlg         window handle of the main dialog window                |
                    671: |       Msg             message number                                         |
                    672: |       wParam          message-dependent parameter                            |
                    673: |       lParam          message-dependent parameter                            |
                    674: |                                                                              |
                    675: |   Returns:                                                                   |
                    676: |       TRUE if the message has been processed, else FALSE                     |
                    677: |                                                                              |
                    678: \*----------------------------------------------------------------------------*/
                    679: 
                    680: BOOL mcitester(
                    681:     HWND    hwndDlg,
                    682:     UINT    Msg,
                    683:     LONG    wParam,
                    684:     LONG    lParam)                    
                    685: {
                    686:     DWORD dw;                       /* return value from various messages     */
                    687:     UINT  EnableOrNot;              /* is something currently selected?       */
                    688:     UINT  wID;                      /* the type of notification required      */
                    689:     int   i;
                    690: 
                    691: #if DBG
                    692:     if (Msg != WM_MOUSEMOVE  && Msg != WM_NCHITTEST && Msg != WM_NCMOUSEMOVE
                    693:            && (Msg < WM_CTLCOLORMSGBOX || Msg > WM_CTLCOLORSTATIC)
                    694:                && Msg != WM_SETCURSOR) {
                    695:         dprintf4("hWnd: %08XH, Msg: %08XH, wParam: %08XH, lParam: %08XH", hwndDlg, Msg, wParam, lParam );
                    696:     }
                    697: #endif
                    698:     switch (Msg) {
                    699: 
                    700:     case WM_COMMAND:
                    701: 
                    702:         dprintf3("WM_COMMAND, wParam: %08XH, lParam: %08XH", wParam, lParam);
                    703:         switch (LOWORD(wParam)) {
                    704: 
                    705:         case IDOK:
                    706: 
                    707:             /*
                    708:              * When the OK button gets pressed, insert a CR LF into
                    709:              * the edit control. and execute the current line.
                    710:              *
                    711:              */
                    712: 
                    713:             SetFocus(hwndEdit);
                    714:                        i = EditGetCurLine(hwndEdit);
                    715: 
                    716:             execute(hwndDlg, TRUE);
                    717: 
                    718:             EditSetCurLine(hwndEdit, i);
                    719: 
                    720:             SendMessage(hwndEdit, WM_KEYDOWN, VK_END, 0L);
                    721:             SendMessage(hwndEdit, WM_KEYUP, VK_END, 0L);
                    722:             SendMessage(hwndEdit, EM_REPLACESEL, 0,(LONG)(LPSTR)aszEOL);
                    723: 
                    724:             break;
                    725: 
                    726:         case ID_GO:
                    727: 
                    728:             /*
                    729:              * When the GO! button gets pressed, execute every line
                    730:              * in the edit box starting with the first one.
                    731:              *
                    732:              */
                    733: 
                    734:             EditSetCurLine(hwndEdit, 0);
                    735:             execute(hwndDlg, FALSE);
                    736: 
                    737:             break;
                    738: 
                    739:         case ID_STEP:
                    740: 
                    741:             /*
                    742:              * When the STEP button gets pressed, execute the currently
                    743:              * selected line in the edit box.
                    744:              */
                    745: 
                    746:             execute(hwndDlg, TRUE);
                    747: 
                    748:             break;
                    749: 
                    750:         case MENU_EXIT:
                    751:         case ID_EXIT:
                    752:         case IDCANCEL:
                    753: 
                    754:             /*
                    755:              * If the user indicates that he/she wishes to exit the
                    756:              * application, then end the main dialog and post a WM_QUIT
                    757:              * message.
                    758:              *
                    759:              */
                    760: 
                    761:             EndDialog(hwndDlg,TRUE);
                    762:             PostQuitMessage (0);
                    763:             hwndMainDlg = 0;
                    764: 
                    765:             break;
                    766: 
                    767:         case MENU_ABOUT:
                    768: 
                    769:             /* Show the 'About...' box */
                    770: 
                    771:             DialogBox(hInstApp, MAKEINTRESOURCE(IDD_ABOUTBOX), hwndDlg, (DLGPROC)AboutDlgProc);
                    772:             break;
                    773: 
                    774:         case WM_CLEAR:
                    775:         case WM_CUT:
                    776:         case WM_COPY:
                    777:         case WM_PASTE:
                    778:         case WM_UNDO:
                    779: 
                    780:             /* Pass whatever edit message we receive to the edit box */
                    781:             // BUGBUG This might well be bogus
                    782:             dprintf3("sending edit Msg to edit control");
                    783:             SendMessage(hwndEdit, LOWORD(wParam), 0, 0);
                    784: 
                    785:             break;
                    786: 
                    787:         case MENU_OPEN:
                    788: 
                    789:             /* Open a 'File Open' dialog */
                    790: #ifdef WIN16
                    791: 
                    792:             f = OpenFileDialog(hwndDlg, aszOpenFileTitle, aszExt,
                    793:                      DLGOPEN_MUSTEXIST | OF_EXIST | OF_READ, NULL,
                    794:                      aszBuffer, sizeof(aszBuffer));
                    795: 
                    796:             /* If the user selected a valid file, then open it */
                    797: 
                    798:             if ((int)f >= 0)
                    799:                                OpenMciFile(hwndDlg, aszBuffer);
                    800: #else
                    801: 
                    802:             strcpy(aszBuffer, aszExt);
                    803:             i = DlgOpen(hInstApp, hwndDlg, aszBuffer, sizeof(aszBuffer) );
                    804: 
                    805:             /* If the user selected a valid file, then open it */
                    806: 
                    807:             if (i == 1)
                    808:                 OpenMciFile(hwndDlg, aszBuffer);
                    809: #endif
                    810: 
                    811:             break;
                    812: 
                    813:         case MENU_SAVE:
                    814: 
                    815:             /*
                    816:              * If a filename exists, then save the contents of the edit
                    817:              * box under that filename.
                    818:              *
                    819:              */
                    820: 
                    821:             if (*aszMciFile) {
                    822: 
                    823:                 EditSaveFile(hwndEdit, aszMciFile);
                    824:                 break;
                    825:             }
                    826: 
                    827:             break;
                    828: 
                    829:         case MENU_SAVEAS:
                    830: 
                    831:             /*
                    832:              */
                    833: 
                    834: #ifdef WIN16
                    835:             *aszBuffer = (char)0;
                    836:             f = OpenFileDialog(hwndDlg, aszSaveFileTitle, aszExt,
                    837:                 DLGOPEN_SAVE | OF_EXIST, aszSaveFileControl, aszBuffer,
                    838:                 sizeof(aszBuffer));
                    839: 
                    840:             /* If the user didn't hit Cancel, then he must have set a
                    841:              * filename, so save the contents of the edit box under
                    842:              * that filename.
                    843:              */
                    844:             if (f != DLGOPEN_CANCEL) {
                    845: 
                    846:                 EditSaveFile(hwndEdit, aszBuffer);
                    847:             }
                    848: 
                    849: #else
                    850:             strcpy(aszBuffer, aszExt);
                    851:             i = DlgOpen(hInstApp, hwndDlg, aszBuffer, sizeof(aszBuffer) );
                    852: 
                    853:             /*
                    854:              * If the user didn't hit Cancel, then he must have set a
                    855:              * filename, so save the contents of the edit box under
                    856:              * that filename.
                    857:              *
                    858:              */
                    859: 
                    860:             if (i != 2) {
                    861: 
                    862:                 EditSaveFile(hwndEdit, aszBuffer);
                    863:             }
                    864: #endif
                    865:             break;
                    866: 
                    867:         case MENU_DEVICES:
                    868: 
                    869:             /*
                    870:              * If the Devices dialog box doesn't already exist, then
                    871:              * create and display it.
                    872:              *
                    873:              */
                    874: 
                    875:             if (hwndDevices == 0) {
                    876:                 create_device_list();
                    877:             }
                    878: 
                    879:             break;
                    880: 
                    881: #if DBG
                    882:         case IDM_DEBUG0:
                    883:         case IDM_DEBUG1:
                    884:         case IDM_DEBUG2:
                    885:         case IDM_DEBUG3:
                    886:         case IDM_DEBUG4:
                    887:             dDbgSetDebugMenuLevel(wParam - IDM_DEBUG0);
                    888:             break;
                    889: #endif
                    890: 
                    891:         }
                    892:         break; // end of WM_COMMAND case
                    893: 
                    894:     case WM_INITDIALOG:
                    895: 
                    896:         /* Do general initialization stuff */
                    897: 
                    898:         hwndEdit = GetDlgItem(hwndDlg,ID_INPUT);
                    899: 
                    900:                dprintf3("WM_INITDIALOG:  hwndEdit = %08xH", hwndEdit);
                    901: 
                    902:         SetMenu(hwndDlg, LoadMenu(hInstApp, MAKEINTRESOURCE(IDM_MCITEST)));
                    903: 
                    904:         SetClassLong (hwndDlg, GCL_HICON,
                    905:                       (DWORD)LoadIcon (hInstApp, MAKEINTRESOURCE(IDI_MCITEST)));
                    906: 
                    907:         CheckDlgButton (hwndDlg, ID_NOT_SUCCESS, FALSE);
                    908:         CheckDlgButton (hwndDlg, ID_NOT_SUPER, FALSE);
                    909:         CheckDlgButton (hwndDlg, ID_NOT_ABORT, FALSE);
                    910:         CheckDlgButton (hwndDlg, ID_NOT_FAIL, FALSE);
                    911:         SetDlgItemInt (hwndDlg, ID_RUNCOUNT, 1, TRUE);
                    912: 
                    913: #if DBG
                    914:                // Check the initial debug level                
                    915:                {
                    916:                        HANDLE hMenu;
                    917:                        hMenu = GetMenu(hwndDlg);
                    918:                        CheckMenuItem(hMenu, (UINT)(__iDebugLevel + IDM_DEBUG0), MF_CHECKED);
                    919:                }
                    920: #endif
                    921: 
                    922:         hAccTable = LoadAccelerators(hInstApp, MAKEINTRESOURCE(IDA_MCITEST));
                    923: 
                    924:                dprintf4("INIT_DIALOG: hwndEdit = %08XH Haccel = %08XH,", hwndEdit, hAccTable);
                    925: 
                    926:         return TRUE;
                    927: 
                    928:     case WM_DESTROY:
                    929: 
                    930:         /* End the dialog and send a WM_QUIT message */
                    931: 
                    932:         dprintf2("dialog ending");
                    933:         dSaveDebugLevel(aszAppName);
                    934:         EndDialog(hwndDlg,TRUE);
                    935:         PostQuitMessage (0);
                    936:         hwndMainDlg = 0;
                    937: 
                    938:         break;
                    939: 
                    940:     case MM_MCINOTIFY:
                    941: 
                    942:         /*
                    943:          * Check the radio button corresponding to the notification
                    944:          * received.
                    945:          *
                    946:          */
                    947: 
                    948:         dprintf3("MM_MCINOTIFY, wParam: %08XH", wParam);
                    949:         wID = 0;
                    950:         switch (wParam) {
                    951:                case MCI_NOTIFY_SUCCESSFUL:
                    952: 
                    953:             wID = ID_NOT_SUCCESS;
                    954:             break;
                    955: 
                    956:         case MCI_NOTIFY_SUPERSEDED:
                    957: 
                    958:             wID = ID_NOT_SUPER;
                    959:             break;
                    960: 
                    961:         case MCI_NOTIFY_ABORTED:
                    962: 
                    963:             wID = ID_NOT_ABORT;
                    964:             break;
                    965: 
                    966:         case MCI_NOTIFY_FAILURE:
                    967: 
                    968:             wID = ID_NOT_FAIL;
                    969:             break;
                    970: 
                    971:         default:
                    972:             break;
                    973:         }
                    974: 
                    975:         if (wID) {
                    976: 
                    977:             CheckDlgButton (hwndDlg, wID, TRUE);
                    978:             SetFocus (GetDlgItem(hwndDlg, ID_INPUT));
                    979:         }
                    980: 
                    981:         break;
                    982: 
                    983:     case WM_INITMENUPOPUP:                   /* wParam is menu handle */
                    984: 
                    985:         dprintf3("WM_INITMENUPOPUP");
                    986: 
                    987:         /* Enable the 'Save' option if a valid filename exists */
                    988: 
                    989:         EnableMenuItem((HMENU)wParam, (UINT)MENU_SAVE,
                    990:             (UINT)(*aszMciFile ? MF_ENABLED : MF_GRAYED));
                    991: 
                    992:         /* Find out if something is currently selected in the edit box */
                    993: 
                    994:         dw = SendMessage(hwndEdit,EM_GETSEL,0,0L);
                    995:         EnableOrNot = (UINT)((HIWORD(dw) != LOWORD(dw) ? MF_ENABLED : MF_GRAYED));
                    996: 
                    997:         /* Enable / disable the Edit menu options appropriately */
                    998: 
                    999:         EnableMenuItem ((HMENU)wParam, (UINT)WM_UNDO ,
                   1000:             (UINT)(SendMessage(hwndEdit,EM_CANUNDO,0,0L) ? MF_ENABLED : MF_GRAYED));
                   1001:         EnableMenuItem ((HMENU)wParam, WM_CUT  , EnableOrNot);
                   1002:         EnableMenuItem ((HMENU)wParam, WM_COPY , EnableOrNot);
                   1003:         EnableMenuItem ((HMENU)wParam, WM_PASTE,
                   1004:             (UINT)(IsClipboardFormatAvailable(CF_TEXT) ? MF_ENABLED : MF_GRAYED));
                   1005:         EnableMenuItem ((HMENU)wParam, WM_CLEAR, EnableOrNot);
                   1006: 
                   1007:         return 0L;
                   1008:     }
                   1009: 
                   1010:     return 0;
                   1011: }
                   1012: 
                   1013: 
                   1014: /*----------------------------------------------------------------------------*\
                   1015: |   AppInit( hInst, hPrev, sw, szCmdLine)                                      |
                   1016: |                                                                              |
                   1017: |   Description:                                                               |
                   1018: |       This is called when the application is first loaded into memory. It    |
                   1019: |       performs all initialization that doesn't need to be done once per      |
                   1020: |       instance.                                                              |
                   1021: |                                                                              |
                   1022: |   Arguments:                                                                 |
                   1023: |       hInstance       instance handle of current instance                    |
                   1024: |       hPrev           instance handle of previous instance                   |
                   1025: |       sw              not really used at all                                 |
                   1026: |       szCmdLine       string containing the command line arguments           |
                   1027: |                                                                              |
                   1028: |   Returns:                                                                   |
                   1029: |       TRUE if successful, FALSE if not                                       |
                   1030: |                                                                              |
                   1031: \*----------------------------------------------------------------------------*/
                   1032: 
                   1033: BOOL AppInit(
                   1034:     int    argc,
                   1035:     char   *argv[])
                   1036: {
                   1037:     /* Put up the main dialog box */
                   1038: 
                   1039:        hInstApp = GetModuleHandle(NULL);
                   1040:        dprintf1("MCITEST starting... module handle is %xH", hInstApp);
                   1041: 
                   1042:     if (NULL ==
                   1043:        (hwndMainDlg = CreateDialog (hInstApp,
                   1044:                                        MAKEINTRESOURCE(IDD_MCITEST),// "mcitester",
                   1045:                                                                        NULL, (DLGPROC)mcitester)
                   1046:        )) {
                   1047:                DWORD n;
                   1048: 
                   1049:                n = GetLastError();
                   1050:            dprintf1("NULL hwndMainDLG, last error is %d", n);
                   1051:                DebugBreak();
                   1052: 
                   1053:         return(FALSE);
                   1054:     }
                   1055: 
                   1056:     /* Fix up WIN.INI if this is the first time we are run... */
                   1057: 
                   1058:     if (!GetProfileString(aszProfileSection, aszProfileKey, aszNULL, aszBuffer, sizeof(aszBuffer)))
                   1059:         WriteProfileString(aszProfileSection, aszProfileKey, aszProfileSetting);
                   1060: 
                   1061:     /*
                   1062:      * If a command line argument was specified, assume it to be a filename
                   1063:      * and open that file.
                   1064:      *
                   1065:      */
                   1066: 
                   1067:     if (argc > 1 && *argv[1])
                   1068:         OpenMciFile(hwndMainDlg, argv[1]);
                   1069: 
                   1070:     return TRUE;
                   1071: }
                   1072: 
                   1073: 
                   1074: /*----------------------------------------------------------------------------*\
                   1075: |   WinMain( hInst, hPrev, lpszCmdLine, sw )                                   |
                   1076: |                                                                              |
                   1077: |   Description:                                                               |
                   1078: |       The main procedure for the app. After initializing, it just goes       |
                   1079: |       into a message-processing loop until it gets a WM_QUIT message         |
                   1080: |       (meaning the app was closed).                                          |
                   1081: |                                                                              |
                   1082: |   Arguments:                                                                 |
                   1083: |       hInst           instance handle of this instance of the app            |
                   1084: |       hPrev           instance handle of previous instance, NULL if first    |
                   1085: |       szCmdLine       null-terminated command line string                    |
                   1086: |       sw              specifies how the window is to be initially displayed  |
                   1087: |                                                                              |
                   1088: |   Returns:                                                                   |
                   1089: |       The exit code as specified in the WM_QUIT message.                     |
                   1090: |                                                                              |
                   1091: \*----------------------------------------------------------------------------*/
                   1092: 
                   1093: int _CRTAPI1 main(
                   1094:     int argc,
                   1095:     char *argv[],
                   1096:     char *envp[])
                   1097: {
                   1098:     MSG     Msg;                    /* Windows message structure */
                   1099: 
                   1100:     // If we are in DEBUG mode, get debug level for this module
                   1101:     dGetDebugLevel(aszAppName);
                   1102: #if DBG
                   1103:     dprintf1("started (debug level %d)", __iDebugLevel);
                   1104: #endif
                   1105: 
                   1106:     /* Call the initialization procedure */
                   1107: 
                   1108:     if (!AppInit(argc, argv)) {
                   1109:         return FALSE;
                   1110:     }
                   1111: 
                   1112: 
                   1113:     /* Poll the event queue for messages */
                   1114: 
                   1115:     while (GetMessage(&Msg, NULL, 0, 0))  {
                   1116: 
                   1117:         /*
                   1118:          * If the Devices dialog is showing and the number of open devices has
                   1119:          * changed since we last checked, then update the list of open devices.
                   1120:          */
                   1121: 
                   1122:         if (hwndDevices != 0 && get_number_of_devices() != nLastNumberOfDevices) {
                   1123:             update_device_list();
                   1124:         }
                   1125: 
                   1126:         /* Main message processing */
                   1127: 
                   1128:         if (!hwndMainDlg || !IsDialogMessage(hwndMainDlg, &Msg)) {
                   1129:             TranslateMessage(&Msg);
                   1130:             DispatchMessage(&Msg);
                   1131:             // IsDialogMessage may enter with hwndMainDlg != NULL and exit with
                   1132:             // hwndMainDlg == NULL after processing the message
                   1133:         }
                   1134:         else if (hwndMainDlg) {
                   1135:             TranslateAccelerator (hwndMainDlg, hAccTable, &Msg);
                   1136:         }
                   1137:     }
                   1138: 
                   1139:     return Msg.wParam;
                   1140: }

unix.superglobalmegacorp.com

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