/*++ Copyright (c) 1993 Microsoft Corporation Module Name: bkutils.c Abstract: Miscellaneous utility functions for online books program. Author: Ted Miller (tedm) 5-Jan-1995 Revision History: --*/ #include "books.h" UINT MyGetDriveType( IN WCHAR Drive ) /*++ Routine Description: Determine the type of a drive (removeable, fixed, net, cd, etc). Arguments: Drive - supplies drive letter of drive whose type is needed. Return Value: Same set of values as returned by GetDriveType() API. --*/ { WCHAR DriveName[3]; DriveName[0] = Drive; DriveName[1] = L':'; DriveName[2] = 0; return GetDriveType(DriveName); } WCHAR LocateCdRomDrive( VOID ) /*++ Routine Description: Determine if a CD-ROM drive is attached to the computer and return its drive letter. If there's more than one cd-rom drive the one with the alphabetically lower drive letter is returned. Arguments: None. Return Value: Drive letter of CD-ROM drive, or 0 if none could be located. --*/ { WCHAR Drive; UINT OldMode; OldMode = SetErrorMode(SEM_FAILCRITICALERRORS); for(Drive=L'C'; Drive<=L'Z'; Drive++) { if(MyGetDriveType(Drive) == DRIVE_CDROM) { SetErrorMode(OldMode); return Drive; } } SetErrorMode(OldMode); return 0; } BOOL IsCdRomInDrive( IN WCHAR Drive, IN PWSTR TagFile ) /*++ Routine Description: Determine if a particular CD-ROM is in a drive, based on the presence of a given tagfile. Arguments: Drive - supplies drive letter of drive to be checked for presence of the tagfile. TagFile - supplies drive-relative path (from root) of the file whose presence validates the presence of a volume. Return Value: Boolean value indicating whether the tagfile could be accessed. --*/ { WCHAR Path[MAX_PATH]; if(*TagFile == L'\\') { TagFile++; } wsprintf(Path,L"%c:\\%s",Drive,TagFile); return DoesFileExist(Path); } BOOL DoesFileExist( IN PWSTR File ) /*++ Routine Description: Determine if a file exists and is accessible. Arguments: File - supplies full path of file whose accessibility is in question. Return Value: Boolean value indicating whether file is accessible. --*/ { UINT OldMode; HANDLE h; WIN32_FIND_DATA FindData; // // Avoid system popups. // OldMode = SetErrorMode(SEM_FAILCRITICALERRORS); h = FindFirstFile(File,&FindData); SetErrorMode(OldMode); if(h == INVALID_HANDLE_VALUE) { return(FALSE); } FindClose(h); return(TRUE); } PWSTR DupString( IN PWSTR String ) /*++ Routine Description: Duplicate a string and return a pointer to the copy. This routine always succeeds. Arguments: String - supplies pointer to the string to be duplicated. Return Value: Pointer to copy of string. Caller can free this buffer with MyFree when the copy is no longer needed. --*/ { PWSTR p = MyMalloc((lstrlen(String)+1)*sizeof(WCHAR)); lstrcpy(p,String); return p; } VOID CenterDialogOnScreen( IN HWND hdlg ) /*++ Routine Description: Center a window on the screen. Arguments: hdlg - supplies handle of window to be centered on the screen. Return Value: None. --*/ { RECT rcWindow; LONG x,y,w,h; POINT point; LONG sx = GetSystemMetrics(SM_CXSCREEN), sy = GetSystemMetrics(SM_CYSCREEN); GetWindowRect (hdlg,&rcWindow); w = rcWindow.right - rcWindow.left + 1; h = rcWindow.bottom - rcWindow.top + 1; x = (sx - w) / 2; y = (sy - h) / 2; MoveWindow(hdlg,x,y,w,h,FALSE); } VOID CenterDialogInWindow( IN HWND hdlg, IN HWND hwnd ) /*++ Routine Description: Center a dialog relative to a window. Arguments: hdlg - supplies handle of window to be centered relative to a window hwnd - supplies handle of window relative to which hdlg is to be centered. Return Value: None. --*/ { RECT rcFrame, rcWindow; LONG x,y,w,h; POINT point; LONG sx = GetSystemMetrics(SM_CXSCREEN), sy = GetSystemMetrics(SM_CYSCREEN); point.x = point.y = 0; ClientToScreen(hwnd,&point); GetWindowRect (hdlg,&rcWindow); GetClientRect (hwnd,&rcFrame ); w = rcWindow.right - rcWindow.left + 1; h = rcWindow.bottom - rcWindow.top + 1; x = point.x + ((rcFrame.right - rcFrame.left + 1 - w) / 2); y = point.y + ((rcFrame.bottom - rcFrame.top + 1 - h) / 2); if (x + w > sx) { x = sx - w; } else if (x < 0) { x = 0; } if (y + h > sy) { y = sy - h; } else if (y < 0) { y = 0; } MoveWindow(hdlg,x,y,w,h,FALSE); } VOID MyError( IN HWND Owner, IN UINT StringId, IN BOOL Fatal ) /*++ Routine Description: Display message box whose text is taken from the application's string resources. The caption will be "Error"; the icon will be ICONSTOP for fatal errors and ICONINFORMATION for nonfatal ones. Arguments: Owner - supplies the window handle of the window that is to own the message box. StringId - supplies the string Id of the message to be displayed. Fatal - if TRUE, this is a fatal error and this routine does not return to the caller but exits via ExitProcess(). Return Value: Returns only if the error is non-fatal. --*/ { PWSTR p; // // Load error string // p = MyLoadString(StringId); // // Put up message box indicating the error. // MessageBox( Owner, p, NULL, MB_OK | MB_SETFOREGROUND | MB_TASKMODAL | (Fatal ? MB_ICONSTOP : MB_ICONINFORMATION) ); if(Fatal) { ExitProcess(1); } }