325 lines
5.6 KiB
C
325 lines
5.6 KiB
C
/*++
|
|
|
|
Copyright (c) 1993 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
bkinst.c
|
|
|
|
Abstract:
|
|
|
|
Routine to install the on-line books to a local hard drive.
|
|
|
|
Author:
|
|
|
|
Ted Miller (tedm) 5-Jan-1995
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
|
|
#include "books.h"
|
|
|
|
//
|
|
// Define structure that described a file to be copied.
|
|
//
|
|
typedef struct _FILETOCOPY {
|
|
struct _FILETOCOPY *Next;
|
|
WIN32_FIND_DATA FindData;
|
|
} FILETOCOPY, *PFILETOCOPY;
|
|
|
|
//
|
|
// Header of a linked list describing the files to be copied.
|
|
//
|
|
PFILETOCOPY CopyList;
|
|
|
|
//
|
|
// Custom window message
|
|
//
|
|
#define WMX_I_AM_READY (WM_USER+567)
|
|
|
|
|
|
VOID
|
|
TearDownCopyList(
|
|
VOID
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Delete the copy list structure, freeing all memory used by it.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
None. CopyList will be NULL on exit.
|
|
|
|
--*/
|
|
|
|
{
|
|
PFILETOCOPY p,q;
|
|
|
|
for(p=CopyList; p; p=q) {
|
|
|
|
q = p->Next;
|
|
MyFree(p);
|
|
}
|
|
|
|
CopyList = NULL;
|
|
}
|
|
|
|
|
|
BOOL
|
|
BuildFileList(
|
|
IN PWSTR Directory
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Build a list of files contained in a given directory.
|
|
|
|
Arguments:
|
|
|
|
Directory - supplies the directory whose contents are to be enumarated
|
|
and placed in a list.
|
|
|
|
Return Value:
|
|
|
|
Boolean value indicating outcome. If the return value is TRUE then the
|
|
global CopyList variable will point to a linked list of files in
|
|
the directory.
|
|
|
|
--*/
|
|
|
|
{
|
|
HANDLE h;
|
|
PFILETOCOPY p;
|
|
WCHAR SearchSpec[MAX_PATH];
|
|
PFILETOCOPY Previous;
|
|
BOOL b;
|
|
|
|
Previous = NULL;
|
|
|
|
lstrcpy(SearchSpec,Directory);
|
|
lstrcat(SearchSpec,L"\\*");
|
|
|
|
p = MyMalloc(sizeof(FILETOCOPY));
|
|
h = FindFirstFile(SearchSpec,&p->FindData);
|
|
if(h != INVALID_HANDLE_VALUE) {
|
|
|
|
CopyList = p;
|
|
Previous = p;
|
|
|
|
do {
|
|
|
|
p = MyMalloc(sizeof(FILETOCOPY));
|
|
|
|
if(b = FindNextFile(h,&p->FindData)) {
|
|
|
|
Previous->Next = p;
|
|
Previous = p;
|
|
}
|
|
} while(b);
|
|
|
|
FindClose(h);
|
|
}
|
|
|
|
MyFree(p);
|
|
|
|
if(!(b = (GetLastError() == ERROR_NO_MORE_FILES))) {
|
|
TearDownCopyList();
|
|
}
|
|
|
|
return(b);
|
|
}
|
|
|
|
|
|
DWORD WINAPI
|
|
ThreadBuildFileList(
|
|
IN PVOID ThreadParameter
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Entry point for worker thread that builds a list of files to be copied.
|
|
This thread is designed to be started by the ActionWithBillboard().
|
|
|
|
Arguments:
|
|
|
|
ThreadParameter - supplies thread parameters. This is expected to point
|
|
to a ACTIONTHREADPARAMS structure, from which we can determine the
|
|
billboard dialog's window handle and the directory to be enumerated.
|
|
|
|
Return Value:
|
|
|
|
Always 0. The actual 'return value' is communicated buy posting a message
|
|
to the billboard dialog, and is the value returned by BuildFileList().
|
|
|
|
|
|
--*/
|
|
|
|
{
|
|
PACTIONTHREADPARAMS p;
|
|
BOOL b;
|
|
|
|
p = ThreadParameter;
|
|
|
|
//
|
|
// Allow time for billboard dialog to come up
|
|
//
|
|
Sleep(250);
|
|
|
|
//
|
|
// Do it.
|
|
//
|
|
b = BuildFileList(p->UserData);
|
|
|
|
//
|
|
// Tell the billboard that we're done.
|
|
//
|
|
PostMessage(p->hdlg,WM_COMMAND,IDOK,b);
|
|
|
|
ExitThread(0);
|
|
return 0; // prevent compiler warning
|
|
}
|
|
|
|
|
|
|
|
INT_PTR
|
|
CALLBACK
|
|
DlgProcInstall(
|
|
IN HWND hdlg,
|
|
IN UINT msg,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
)
|
|
{
|
|
DWORD rc;
|
|
WCHAR Directory[MAX_PATH];
|
|
int i;
|
|
|
|
switch(msg) {
|
|
|
|
case WM_INITDIALOG:
|
|
|
|
CenterDialogOnScreen(hdlg);
|
|
|
|
GetWindowsDirectory(Directory,MAX_PATH);
|
|
lstrcat(Directory,L"\\BOOKS");
|
|
SetDlgItemText(hdlg,IDC_INSTALL_TO,Directory);
|
|
SendDlgItemMessage(hdlg,IDC_INSTALL_TO,EM_SETSEL,0,(LPARAM)-1);
|
|
SendDlgItemMessage(hdlg,IDC_INSTALL_TO,EM_LIMITTEXT,MAX_PATH-1,0);
|
|
SetFocus(GetDlgItem(hdlg,IDC_INSTALL_TO));
|
|
|
|
PostMessage(hdlg,WMX_I_AM_READY,0,lParam);
|
|
|
|
//
|
|
// Tell Windows we set the focus
|
|
//
|
|
return(FALSE);
|
|
|
|
case WMX_I_AM_READY:
|
|
|
|
do {
|
|
rc = ActionWithBillboard(
|
|
ThreadBuildFileList,
|
|
hdlg,
|
|
IDS_FILELIST_CAPTION,
|
|
IDS_FILELIST,
|
|
*(PWSTR *)lParam
|
|
);
|
|
|
|
//
|
|
// If rc is 0, we could not build file list.
|
|
//
|
|
if(!rc) {
|
|
|
|
//
|
|
// See if user wants to cancel or retry.
|
|
//
|
|
i = MessageBoxFromMessage(
|
|
hdlg,
|
|
MSG_CANT_GET_FILE_LIST,
|
|
0,
|
|
MB_RETRYCANCEL | MB_ICONSTOP | MB_SETFOREGROUND | MB_APPLMODAL
|
|
);
|
|
|
|
if(i = IDCANCEL) {
|
|
EndDialog(hdlg,FALSE);
|
|
break;
|
|
}
|
|
}
|
|
|
|
} while(!rc);
|
|
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
|
|
switch(HIWORD(wParam)) {
|
|
|
|
case BN_CLICKED:
|
|
|
|
switch(LOWORD(wParam)) {
|
|
|
|
case IDOK:
|
|
|
|
//
|
|
// See whether the user gave us something reasonable
|
|
// before attempting the copy.
|
|
//
|
|
return(FALSE);
|
|
|
|
case IDCANCEL:
|
|
|
|
EndDialog(hdlg,FALSE);
|
|
return(FALSE);
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
break;
|
|
|
|
case WM_QUERYDRAGICON:
|
|
|
|
return(MainIcon != 0);
|
|
|
|
default:
|
|
return(FALSE);
|
|
|
|
}
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
|
|
BOOL
|
|
DoInstall(
|
|
IN OUT PWSTR *Location
|
|
)
|
|
{
|
|
BOOL rc;
|
|
|
|
rc = (BOOL)DialogBoxParam(
|
|
hInst,
|
|
MAKEINTRESOURCE(DLG_INSTALL),
|
|
NULL,
|
|
DlgProcInstall,
|
|
(LPARAM)Location
|
|
);
|
|
|
|
TearDownCopyList();
|
|
|
|
return(rc);
|
|
}
|