369 lines
5.8 KiB
C
369 lines
5.8 KiB
C
/*++
|
|
|
|
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);
|
|
}
|
|
}
|
|
|