Annotation of q_a/samples/setinfo/setinfo.c, revision 1.1

1.1     ! root        1: /*************************************************************************\
        !             2: *  PROGRAM: setinfo.c
        !             3: *
        !             4: *  PURPOSE:
        !             5: *
        !             6: *    To demonstrate queries and setting file information much as the
        !             7: *    OS/2 API's DosQFileInfo() and DosSetFileInfo().
        !             8: *
        !             9: *  GLOBAL VARIABLES:
        !            10: *
        !            11: *    HANDLE hInst;  - Instance handle.
        !            12: *
        !            13: *    HWND   hWnd;   - Client window handle.
        !            14: *
        !            15: *    HWND   hWndDlg;- Window handle to upper dialog box.
        !            16: *
        !            17: *    HWND   hWndFileDlg;
        !            18: *                   - Window handle to lower dialog box.
        !            19: *
        !            20: *    DWORD  StepTime;
        !            21: *                   - Time in ms., used to control the speed of reporting
        !            22: *                     return codes in the upper dialog box.
        !            23: *
        !            24: *  FUNCTIONS:
        !            25: *
        !            26: *    WinMain()      - Initializes the window, and process the message loop.
        !            27: *    MainWndProc()  - To handle the messages to the main window.
        !            28: *    StatusDlgProc()- To handle messages to the Status Dialog (upper) box.
        !            29: *    FileDlgProc()  - To handle messages to the File Dialog (lower) box.
        !            30: *    RepStat()      - To calculate return codes and to send results as
        !            31: *                     messages to the StatusDlgProc()
        !            32: *
        !            33: *  COMMENTS:
        !            34: *
        !            35: *    Overview:
        !            36: *      This sample captures and sets a files date/time, size, and
        !            37: *      attributes information (note it does not *set* file size
        !            38: *      information).  It also reports API return code status
        !            39: *      information.
        !            40: *
        !            41: *    To Use:
        !            42: *      Enter a file name into the appropriate edit field, and click on
        !            43: *      the Get Info. button.  File information will be retrieved and
        !            44: *      placed in the various edit fields and check buttons.  To set
        !            45: *      file information, modify the values in the Time and Date edit
        !            46: *      fields, and click the Set Info. button.  To set file attributes,
        !            47: *      set the approprate check boxes, and click on the Set Attr. button.
        !            48: *      Note this application does not check for rediculous Date and Time
        !            49: *      information, and does not understand i.e. values before 1980 or after
        !            50: *      2099.  The API are left to deal with such values as best they
        !            51: *      can.
        !            52: *
        !            53: *      As the buttons are clicked the code sends return code status
        !            54: *      information to be reported in the upper dialog box.  The user
        !            55: *      can leave this reporting to be done at default time ( 0ms. Sleep
        !            56: *      between each API), or can enter a time in the appropriate box
        !            57: *      and clicking the Set Time button.  This will put a Sleep between
        !            58: *      the API call so that the user can more easily read the return
        !            59: *      codes.
        !            60: *
        !            61: *    Time Conversion:
        !            62: *      Note that GetFileTime() and SetFileTime() use 64 bit FILETIME
        !            63: *      structures.  These structure consist of two DWORD fields: which
        !            64: *      represent file time in hundreds of nano-seconds.  This file time
        !            65: *      can be converted into DosDate time (or back again) with the
        !            66: *      FileTimeToDosDateTime() and DosDateTimeToFileTime() calls.  These
        !            67: *      calls use WORD values representing DosDate and DosTime.  The
        !            68: *      online Windows .hlp files will tell you how these WORDs break
        !            69: *      down into days, months, hours, seconds, etc.  This sample uses
        !            70: *      a combination of masking and shifting to extract the values
        !            71: *      from the file (see the FileDlgProc() and the symbolic constants
        !            72: *      mask defined in the header file).  Other points of interest are
        !            73: *      that seconds are stored in 2 second increments (1-29), and that
        !            74: *      years are represented from 1980 (meaning i.e. 1992 will be
        !            75: *      be represented by 12).
        !            76: *
        !            77: *
        !            78: \*************************************************************************/
        !            79: 
        !            80: #include <windows.h>
        !            81: #include <stdlib.h>
        !            82: #include "setinfo.h"
        !            83: 
        !            84: 
        !            85: HANDLE hInst;
        !            86: HWND   hWnd, hWndDlg, hWndFileDlg;
        !            87: DWORD  StepTime;
        !            88: 
        !            89: 
        !            90: 
        !            91: /*************************************************************************\
        !            92: *
        !            93: *  FUNCTION: WinMain(HANDLE, HANDLE, LPSTR, int)
        !            94: *
        !            95: *  PURPOSE:  Calls initialization function, processes message loop.
        !            96: *
        !            97: *  COMMENTS: A fairly standard WinMain, with the exception that it
        !            98: *            creates two modeless dialog boxes which fit over the window.
        !            99: *            Note the use of IsDialogMessage in the message loop.  This
        !           100: *            call not only returns a boolean value, but also processes
        !           101: *            the message if it is a dialog box message; otherwise the
        !           102: *            message falls through to the body of the loop to be translated
        !           103: *            and dispatched.
        !           104: *
        !           105: \*************************************************************************/
        !           106: 
        !           107: int APIENTRY WinMain (HANDLE hInstance,
        !           108:                       HANDLE hPrevInstance,
        !           109:                       LPSTR  lpCmdLine,
        !           110:                       int    nCmdShow)
        !           111: 
        !           112: 
        !           113: {
        !           114: 
        !           115:   MSG  msg;
        !           116:   WNDCLASS wc;
        !           117:   RECT rect;
        !           118: 
        !           119:   UNREFERENCED_PARAMETER( lpCmdLine );
        !           120:   UNREFERENCED_PARAMETER( hPrevInstance );
        !           121: 
        !           122:   hInst = hInstance;
        !           123: 
        !           124:   wc.style = NULL;                       // Replaces CS_SIZEREDRAW.
        !           125:   wc.lpfnWndProc = (WNDPROC)MainWndProc; // The client window procedure.
        !           126:   wc.cbClsExtra = 0;                     // No room reserved for extra data.
        !           127:   wc.cbWndExtra = 0;
        !           128:   wc.hInstance = hInstance;
        !           129:   wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
        !           130:   wc.hCursor = LoadCursor (NULL, IDC_ARROW);
        !           131:   wc.hbrBackground = GetStockObject (WHITE_BRUSH);
        !           132:   wc.lpszMenuName = "";
        !           133:   wc.lpszClassName = "SetInfoWClass";
        !           134: 
        !           135:   RegisterClass(&wc);
        !           136: 
        !           137:   hWnd = CreateWindow ("SetInfoWClass",
        !           138:                        "Set File Info. Sample",
        !           139:                        WS_OVERLAPPEDWINDOW,
        !           140:                        CW_USEDEFAULT,
        !           141:                        CW_USEDEFAULT,
        !           142:                        CW_USEDEFAULT,
        !           143:                        CW_USEDEFAULT,
        !           144:                        NULL,
        !           145:                        NULL,
        !           146:                        hInstance,
        !           147:                        NULL);
        !           148: 
        !           149:   hWndDlg     = CreateDialog (hInst, "StatusDlg", hWnd, StatusDlgProc);
        !           150:   hWndFileDlg = CreateDialog (hInst, "FileDlg",   hWnd, FileDlgProc);
        !           151: 
        !           152:   GetClientRect (hWnd, &rect);
        !           153:   SendMessage (hWnd, WM_SIZE, 0, (rect.right - rect.left));
        !           154:   ShowWindow  (hWndDlg,  SW_SHOW);
        !           155:   ShowWindow  (hWndFileDlg, SW_SHOW);
        !           156:   ShowWindow  (hWnd, nCmdShow);
        !           157: 
        !           158:   while (GetMessage (&msg, NULL, NULL, NULL))
        !           159:     if (!IsDialogMessage (hWndDlg, &msg)
        !           160:         && !IsDialogMessage (hWndFileDlg, &msg))
        !           161:       {
        !           162:        DispatchMessage (&msg);   // Dispatch message to window.
        !           163:       }
        !           164: 
        !           165:   return (msg.wParam);           // Returns value from PostQuitMessage.
        !           166: 
        !           167: }
        !           168: 
        !           169: /*************************************************************************\
        !           170: *
        !           171: *  FUNCTION:  MainWndProc (HWND, UINT, UINT, LONG)
        !           172: *
        !           173: *  PURPOSE:   To process messages.  To launch client and server threads
        !           174: *             as appropriate.
        !           175: *
        !           176: *  VARIABLES USED:
        !           177: *
        !           178: *    - hWndDlg:
        !           179: *             Global window handle for the upper dialog box.
        !           180: *
        !           181: *    - hWndFileDlg:
        !           182: *             Global window handle for the lower dialog box.
        !           183: *
        !           184: *  MESSAGES:
        !           185: *
        !           186: *    WM_DESTROY      - Standard, destroys the window.
        !           187: *    WM_SIZE         - Sends messages to the two dialog boxes so that they
        !           188: *                      maintain their relative size to the client window.
        !           189: *
        !           190: *  CALLED BY:
        !           191: *
        !           192: *    WinMain();
        !           193: *
        !           194: \*************************************************************************/
        !           195: 
        !           196: LONG APIENTRY MainWndProc (HWND hwnd,
        !           197:                            UINT message,
        !           198:                            UINT wParam,
        !           199:                            LONG lParam)
        !           200: {
        !           201:   switch (message)
        !           202:       {
        !           203: 
        !           204:         case WM_SIZE :
        !           205:           SetWindowPos (hWndDlg, NULL, 0,0, LOWORD(lParam), DIALOGHEIGHT, NULL);
        !           206:           SetWindowPos (hWndFileDlg, NULL, 0,DIALOGHEIGHT, LOWORD(lParam), HIWORD(lParam), NULL);
        !           207:           return (0);
        !           208: 
        !           209:         case WM_DESTROY :
        !           210:             PostQuitMessage (0);
        !           211:             return (0);
        !           212: 
        !           213:        }
        !           214:     return DefWindowProc (hwnd, message, wParam, lParam);
        !           215: }
        !           216: 
        !           217: /*************************************************************************\
        !           218: *
        !           219: *  FUNCTION:  StatusDlgProc (HWND, UINT, UINT, LONG)
        !           220: *
        !           221: *  PURPOSE:   To process messages for the upper dialog box.
        !           222: *
        !           223: *  VARIABLES USED:
        !           224: *
        !           225: *    - StepTime:
        !           226: *             A global DWORD holding the value of the sleep time between
        !           227: *             API calls.
        !           228: *
        !           229: *    - bTranslated:
        !           230: *             A local BOOL needed for GetDlgItemInt().
        !           231: *
        !           232: *  MESSAGES:
        !           233: *
        !           234: *    WM_INITDIALOG:  - Sets a "0" in the time edit field IDE_TIME.  This
        !           235: *                      is to indicate to the user that the default time
        !           236: *                      set to sleep between reporting the results of
        !           237: *                      API calls is set to 0.
        !           238: *
        !           239: *    WM_REPSTAT:     - A user defined message.  This message uses wParam
        !           240: *                      as a pointer to a string holding an API i.e.
        !           241: *                      "CreateFile()".  It uses lParam to hold a string
        !           242: *                      reporting the value of returned by the API i.e.
        !           243: *                      "ERROR_ACCESS_DENIED", or a number if the return
        !           244: *                      value isn't identified in RepStat().  The code
        !           245: *                      then places these strings in the IDE_API and
        !           246: *                      IDE_REPSTAT edit fields.
        !           247: *
        !           248: *    WM_COMMAND
        !           249: *
        !           250: *      IDM_STEP:     - Captures the time value in the IDE_TIME edit
        !           251: *                      field, and then sets that value into the
        !           252: *                      global DWORD StepTime.  This value sets
        !           253: *                      a sleep time inbetween reporting the results of
        !           254: *                      each API (making it easier for the user to read).
        !           255: *
        !           256: *  COMMENTS:
        !           257: *
        !           258: *    This procedure controls the upper dialog box of the application.
        !           259: *    The purpose of this box is to report on the API being used by
        !           260: *    the lower box, and it's return code.  It also allows you to control
        !           261: *    the speed that the application steps through these calls.  This is
        !           262: *    basically a error checking/debugging feature, but it also lends an
        !           263: *    intuitive look at the API being used.
        !           264: *
        !           265: \*************************************************************************/
        !           266: 
        !           267: LONG APIENTRY StatusDlgProc (HWND hDlg, UINT message, UINT wParam, LONG lParam)
        !           268: {
        !           269:   BOOL bTranslated;
        !           270: 
        !           271:   UNREFERENCED_PARAMETER (wParam);
        !           272:   UNREFERENCED_PARAMETER (lParam);
        !           273: 
        !           274:   switch (message)
        !           275:     {
        !           276:     case WM_INITDIALOG:
        !           277:       StepTime = 0;
        !           278:       SetDlgItemInt (hDlg, IDE_TIME, StepTime, FALSE);
        !           279:       return (0);
        !           280: 
        !           281:     case WM_REPSTAT:
        !           282:       SetDlgItemText (hDlg, IDE_API,(LPTSTR) wParam);
        !           283:       SetDlgItemText (hDlg, IDE_RETSTAT, (LPTSTR)lParam);
        !           284:       return (0);
        !           285: 
        !           286:     case WM_COMMAND:
        !           287:       switch (LOWORD(wParam))
        !           288:        {
        !           289:        case IDB_STEP:
        !           290:            StepTime = GetDlgItemInt (hDlg, IDE_TIME, &bTranslated, FALSE);
        !           291:        }
        !           292:     }
        !           293:   return (0);
        !           294: }
        !           295: 
        !           296: /*************************************************************************\
        !           297: *
        !           298: *  FUNCTION:  FileDlgProc (HWND, UINT, UINT, LONG)
        !           299: *
        !           300: *  PURPOSE:   To process the messages to the lower dialog box.
        !           301: *
        !           302: *  VARIABLES USED:
        !           303: *
        !           304: *    - fileName:
        !           305: *             A local CHAR array used to capture the text from the
        !           306: *             IDE_FILENAME edit field.
        !           307: *
        !           308: *    - hFile: Local file handle.
        !           309: *
        !           310: *    - retCode:
        !           311: *             Local DWORD used to trap API return codes.
        !           312: *
        !           313: *    - ftCreation,
        !           314: *    - ftAccessed,
        !           315: *    - ftWrittenTo:
        !           316: *             Local FILETIME structures.
        !           317: *
        !           318: *    - wDosDate,
        !           319: *    - wDosTime:
        !           320: *             Local WORDs, used to hold the values converted from the
        !           321: *             FILETIME structures converted by FileTimeToDosDateTime()
        !           322: *             and DosDateTimeToFileTime().
        !           323: *
        !           324: *    - DD[],
        !           325: *    - MM[],
        !           326: *    - YY[],
        !           327: *    - Mn[],
        !           328: *    - SS[],
        !           329: *    - HH[]:  Local CHAR arrays used to trap the values in various
        !           330: *             edit fields representing date and time values.
        !           331: *
        !           332: *    - dwFileSize:
        !           333: *             Local DWORD holding file size.
        !           334: *
        !           335: *    - lpsFileSize[]:
        !           336: *             Local CHAR array used to trap the string from the IDE_SIZE
        !           337: *             edit field.
        !           338: *
        !           339: *    - dwFileAttr:
        !           340: *             Local DWORD holding the file attributes.
        !           341: *
        !           342: *    - hDlg:  Input parameter, handle to the dialog box.
        !           343: *
        !           344: *  MESSAGES:
        !           345: *
        !           346: *    WM_COMMAND
        !           347: *
        !           348: *      IDB_ATTR:
        !           349: *             It initializes the variable to hold the file attributes,
        !           350: *             dwFileAttr, and then traps the checked states of the
        !           351: *             dialog boxes checked buttons.  If a box is found to be
        !           352: *             checked, then the appropriate file attribute flag is
        !           353: *             OR'd into dwFileAttr.  When all of the attribute values
        !           354: *             have been collected, these attributes are set to the file
        !           355: *             listed in IDE_FILENAME.
        !           356: *
        !           357: *      IDB_SET:
        !           358: *             This collects the values from the various time and date
        !           359: *             edit fields, converts them into system time, and sets
        !           360: *             them to the file listed in IDE_FILENAME.  Basically the
        !           361: *             technique is to 1) get the values from the edit fields;
        !           362: *             2) shift them to their correct location in the WORD; and
        !           363: *             3) OR them together into a single WORD.
        !           364: *
        !           365: *      IDB_OPENFILE:
        !           366: *             This gets the date, time, size, and attribute information
        !           367: *             from the file listed in IDE_FILENAME.  It converts the
        !           368: *             values appropriately and puts them into the various
        !           369: *             edit fields and check buttons.  Again, to do time and date
        !           370: *             conversions, you must AND the values returned from
        !           371: *             GetFileTime() with certain masks to let the appropriate bits
        !           372: *             fall through from the WORD (see the mask and shift values
        !           373: *             in the setinfo.h file), and shift them to the low order
        !           374: *             bit to get the new values.  This is done in the wsprintf()
        !           375: *             call's parameter list.
        !           376: *
        !           377: *  CALLS TO:
        !           378: *
        !           379: *    RepStat();
        !           380: *
        !           381: *  COMMENTS:
        !           382: *    The basic function of this box is to capture and set file information,
        !           383: *    and to send messages to the upper dialog box via RepStat() to report
        !           384: *    return code information.  Special characteristics of this function
        !           385: *    is how to get and set file information and attributes, and how to
        !           386: *    convert Time and Date information.
        !           387: *
        !           388: \*************************************************************************/
        !           389: 
        !           390: LONG APIENTRY FileDlgProc (HWND hDlg, UINT message, UINT wParam, LONG lParam)
        !           391: {
        !           392:   CHAR     fileName[100];
        !           393:   HANDLE   hFile;
        !           394:   DWORD    retCode = 0;
        !           395:   FILETIME ftCreation, ftAccessed, ftWrittenTo;
        !           396:   WORD     wDosDate, wDosTime;
        !           397:   CHAR     DD[3], MM[3], YY[3], HH[3], Mn[3], SS[3];
        !           398:   DWORD    dwFileSize;
        !           399:   CHAR     lpsFileSize[10];
        !           400:   DWORD    dwFileAttr;
        !           401: 
        !           402:   UNREFERENCED_PARAMETER (wParam);
        !           403:   UNREFERENCED_PARAMETER (lParam);
        !           404: 
        !           405:   switch (message)
        !           406:     {
        !           407: 
        !           408:     case WM_COMMAND :
        !           409:       switch (LOWORD(wParam))
        !           410:         {
        !           411:         case IDB_ATTR:
        !           412: 
        !           413:           dwFileAttr = 0;
        !           414: 
        !           415:           if (IsDlgButtonChecked (hDlg, IDC_HIDE))
        !           416:              dwFileAttr |= FILE_ATTRIBUTE_HIDDEN;
        !           417: 
        !           418:           if (IsDlgButtonChecked (hDlg, IDC_NORMAL))
        !           419:              dwFileAttr |= FILE_ATTRIBUTE_NORMAL;
        !           420: 
        !           421:           if (IsDlgButtonChecked (hDlg, IDC_ARC))
        !           422:              dwFileAttr |= FILE_ATTRIBUTE_ARCHIVE;
        !           423: 
        !           424:           if (IsDlgButtonChecked (hDlg, IDC_SYSTEM))
        !           425:              dwFileAttr |= FILE_ATTRIBUTE_SYSTEM;
        !           426: 
        !           427:           if (IsDlgButtonChecked (hDlg, IDC_READ))
        !           428:              dwFileAttr |= FILE_ATTRIBUTE_READONLY;
        !           429: 
        !           430:           GetDlgItemText (hDlg, IDE_FILENAME, fileName, 100);
        !           431: 
        !           432:           retCode = SetFileAttributes (fileName, dwFileAttr);
        !           433:             RepStat ("SetFileAttributes()", retCode);
        !           434: 
        !           435:           return (0);
        !           436: 
        !           437:         case IDB_SET:
        !           438: 
        !           439:           GetDlgItemText (hDlg, IDE_YEAR,  YY, 3);
        !           440:           GetDlgItemText (hDlg, IDE_DAY,   DD, 3);
        !           441:           GetDlgItemText (hDlg, IDE_MONTH, MM, 3);
        !           442:           wDosDate = (WORD)((atoi(YY) - 80)<<YRSHIFT |
        !           443:                              atoi(MM)<<MONSHIFT |
        !           444:                              atoi(DD)<<DAYSHIFT);
        !           445: 
        !           446:           GetDlgItemText (hDlg, IDE_HOURS,   HH, 3);
        !           447:           GetDlgItemText (hDlg, IDE_SECONDS, SS, 3);
        !           448:           GetDlgItemText (hDlg, IDE_MINUTES, Mn, 3);
        !           449:           wDosTime = (WORD)((atoi(SS) / 2)<< SECSHIFT |
        !           450:                              atoi(Mn)<<MINSHIFT |
        !           451:                              atoi(HH)<<HRSHIFT);
        !           452: 
        !           453:           retCode = DosDateTimeToFileTime (wDosDate, wDosTime, &ftWrittenTo);
        !           454:             RepStat("DosDateTimeToFileTime()", retCode);
        !           455: 
        !           456:           GetDlgItemText (hDlg, IDE_FILENAME, fileName, 100);
        !           457:           hFile = CreateFile (fileName,
        !           458:                               GENERIC_READ | GENERIC_WRITE,
        !           459:                               FILE_SHARE_READ | FILE_SHARE_WRITE,
        !           460:                               NULL,
        !           461:                               OPEN_EXISTING,
        !           462:                               FILE_ATTRIBUTE_NORMAL,
        !           463:                               NULL);
        !           464:           if (RepStat("CreateFile()", (DWORD)hFile))
        !           465:             return (0);
        !           466: 
        !           467: 
        !           468:           retCode = SetFileTime (hFile, NULL, NULL, &ftWrittenTo);
        !           469:             RepStat("SetFileTime()", retCode);
        !           470: 
        !           471:           CloseHandle (hFile);
        !           472:           return (0);
        !           473: 
        !           474: 
        !           475:         case IDB_OPENFILE :
        !           476:           GetDlgItemText (hDlg, IDE_FILENAME, fileName, 100);
        !           477:           hFile = CreateFile (fileName,
        !           478:                               GENERIC_READ,
        !           479:                               FILE_SHARE_READ | FILE_SHARE_WRITE,
        !           480:                               NULL,
        !           481:                               OPEN_EXISTING,
        !           482:                               FILE_ATTRIBUTE_NORMAL,
        !           483:                               NULL);
        !           484:           if (RepStat("CreateFile()", (DWORD)hFile))
        !           485:             return (0);
        !           486: 
        !           487:           (BOOL)retCode = GetFileTime (hFile,
        !           488:                                        &ftCreation,
        !           489:                                        &ftAccessed,
        !           490:                                        &ftWrittenTo);
        !           491:           RepStat( "GetFileTime()", retCode);
        !           492: 
        !           493:           (BOOL)retCode = FileTimeToDosDateTime( &ftWrittenTo,
        !           494:                                                  &wDosDate,
        !           495:                                                  &wDosTime);
        !           496:           RepStat("FileTimeToDosDateTime()", retCode);
        !           497: 
        !           498:           dwFileSize = GetFileSize (hFile, NULL);
        !           499:           RepStat("GetFileSize()", dwFileSize);
        !           500: 
        !           501: 
        !           502:           wsprintf(YY, "%02d", ((wDosDate & YRMASK) >> YRSHIFT ) + 80);
        !           503:           SetDlgItemText (hDlg, IDE_YEAR, YY);
        !           504: 
        !           505:           wsprintf(MM, "%02d", ((wDosDate & MONMASK) >> MONSHIFT));
        !           506:           SetDlgItemText (hDlg, IDE_MONTH, MM);
        !           507: 
        !           508:           wsprintf(DD, "%02d", ((wDosDate & DAYMASK) >> DAYSHIFT) );
        !           509:           SetDlgItemText (hDlg, IDE_DAY, DD);
        !           510: 
        !           511:           wsprintf(SS, "%02d", ((wDosTime & SECMASK) >> SECSHIFT ) * 2);
        !           512:           SetDlgItemText (hDlg, IDE_SECONDS, SS);
        !           513: 
        !           514:           wsprintf(Mn, "%02d", ((wDosTime & MINMASK) >> MINSHIFT));
        !           515:           SetDlgItemText (hDlg, IDE_MINUTES, Mn);
        !           516: 
        !           517:           wsprintf(HH, "%02d", (DWORD)(wDosTime & HRMASK) >> HRSHIFT );
        !           518:           SetDlgItemText (hDlg, IDE_HOURS, HH);
        !           519: 
        !           520:           wsprintf(lpsFileSize, "%d", dwFileSize);
        !           521:           SetDlgItemText (hDlg, IDE_SIZE, lpsFileSize);
        !           522: 
        !           523:           dwFileAttr = GetFileAttributes (fileName);
        !           524:             RepStat("GetFileAttributes()", dwFileAttr);
        !           525: 
        !           526:           if (dwFileAttr & FILE_ATTRIBUTE_NORMAL)
        !           527:             CheckDlgButton (hDlg, IDC_NORMAL, TRUE);
        !           528:           else
        !           529:             CheckDlgButton (hDlg, IDC_NORMAL, FALSE);
        !           530: 
        !           531:           if (dwFileAttr & FILE_ATTRIBUTE_READONLY)
        !           532:             CheckDlgButton (hDlg, IDC_READ, TRUE);
        !           533:           else
        !           534:             CheckDlgButton (hDlg, IDC_READ, FALSE);
        !           535: 
        !           536:           if (dwFileAttr & FILE_ATTRIBUTE_HIDDEN)
        !           537:             CheckDlgButton (hDlg, IDC_HIDE, TRUE);
        !           538:           else
        !           539:             CheckDlgButton (hDlg, IDC_HIDE, FALSE);
        !           540: 
        !           541:           if (dwFileAttr & FILE_ATTRIBUTE_SYSTEM)
        !           542:             CheckDlgButton (hDlg, IDC_SYSTEM, TRUE);
        !           543:           else
        !           544:             CheckDlgButton (hDlg, IDC_SYSTEM, FALSE);
        !           545: 
        !           546:           if (dwFileAttr & FILE_ATTRIBUTE_ARCHIVE)
        !           547:             CheckDlgButton (hDlg, IDC_ARC, TRUE);
        !           548:           else
        !           549:             CheckDlgButton (hDlg, IDC_ARC, FALSE);
        !           550: 
        !           551:           CloseHandle (hFile);
        !           552: 
        !           553:           return (0);
        !           554:         }
        !           555:     }
        !           556:   return (0);
        !           557: }
        !           558: 
        !           559: /*************************************************************************\
        !           560: *
        !           561: *  FUNCTION:  RepStat (CHAR *, DWORD)
        !           562: *
        !           563: *  PURPOSE:   To report return code information to the upper dialog box.
        !           564: *
        !           565: *  VARIABLES USED:
        !           566: *
        !           567: *    - TempBufW[],
        !           568: *    - TempBufL[]:
        !           569: *             Local CHAR arrays used to set the lParam and wParam of
        !           570: *             the WM_REPSTAT message.
        !           571: *
        !           572: *    - StepTime:
        !           573: *             Global DWORD representing the amount of sleep time chosen
        !           574: *             by the user.
        !           575: *
        !           576: *  CALLED BY:
        !           577: *
        !           578: *    FileDlgProc();
        !           579: *
        !           580: *  COMMENTS:
        !           581: *
        !           582: *    This function receives a string representing an API, and a DWORD
        !           583: *    representing it's return code value.  It checks the return code to
        !           584: *    see if it indicates an error.  If so, GetLastError is called to find
        !           585: *    the extended error information; if not, then retCode is set to 0.
        !           586: *    The case statement is used to exchange the retCode value for
        !           587: *    it's more intuitive string counterpart.  If no counterpart
        !           588: *    is listed, the function just sends the number value in string
        !           589: *    form.  Note that retCode 0 is just sent as a string number.
        !           590: *    Once the function drops from the switch statment, it sends the
        !           591: *    user define WM_REPSTAT message to the upper dialog box with the
        !           592: *    API and retCode information.  It will then enter a Sleep of a
        !           593: *    duration determined by the global StepTime value (set by the
        !           594: *    user through and edit field.  The function returns a boolean
        !           595: *    value so that the calling procedure can determine if it wants
        !           596: *    to continue processing or break.
        !           597: *
        !           598: \*************************************************************************/
        !           599: 
        !           600: 
        !           601: BOOL RepStat (CHAR *API, DWORD retCode)
        !           602: {
        !           603:   CHAR TempBufW[40];
        !           604:   CHAR TempBufL[40];
        !           605: 
        !           606:   wsprintf(TempBufW, API);
        !           607: 
        !           608:   if ((int)retCode <= 0 )
        !           609:     retCode = GetLastError();
        !           610:   else
        !           611:     retCode = 0;
        !           612: 
        !           613:   if (retCode)
        !           614:     MessageBeep(0);
        !           615: 
        !           616:   switch (retCode)
        !           617:     {
        !           618:     case ERROR_INVALID_FUNCTION:   // 1L
        !           619:       wsprintf(TempBufL, "ERROR_INVALID_FUNCTION");
        !           620:       break;
        !           621: 
        !           622:     case ERROR_FILE_NOT_FOUND:     // 2L
        !           623:       wsprintf(TempBufL, "ERROR_FILE_NOT_FOUND");
        !           624:       break;
        !           625: 
        !           626:     case ERROR_ACCESS_DENIED:      // 5L
        !           627:       wsprintf(TempBufL, "ERROR_ACCESS_DENIED");
        !           628:       break;
        !           629: 
        !           630:     case ERROR_INVALID_HANDLE:     // 6L
        !           631:       wsprintf(TempBufL, "ERROR_INVALID_HANDLE");
        !           632:       break;
        !           633: 
        !           634:     case ERROR_INVALID_PARAMETER:  // 87L
        !           635:       wsprintf(TempBufL, "ERROR_INVALID_HANDLE");
        !           636:       break;
        !           637: 
        !           638:     case ERROR_INVALID_NAME:       // 123L
        !           639:       wsprintf(TempBufL, "ERROR_INVALID_NAME");
        !           640:       break;
        !           641: 
        !           642:     default:
        !           643:       wsprintf(TempBufL, "%d", retCode);
        !           644:     }
        !           645: 
        !           646:   SendMessage (hWndDlg, WM_REPSTAT, (DWORD)TempBufW, (LONG)TempBufL);
        !           647:   Sleep( StepTime );
        !           648: 
        !           649:   return (retCode != 0);
        !           650: }

unix.superglobalmegacorp.com

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