|
|
/*++
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); }
|