|
|
/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
fileq.c
Abstract:
This file implements the file copy code.
Environment:
WIN32 User Mode
Author:
Wesley Witt (wesw) 17-Feb-1996
--*/
#include "faxocm.h"
#pragma hdrstop
FILE_QUEUE_INFO MinimalServerFileQueue[] = { { L"CoverPageFiles", DIRID_COVERPAGE, L"%s\\%s" , FILEQ_FLAG_SHELL, CSIDL_COMMON_DOCUMENTS } };
#define CountMinimalServerFileQueue (sizeof(MinimalServerFileQueue)/sizeof(FILE_QUEUE_INFO))
FILE_QUEUE_INFO ServerFileQueue[] = { { L"ClientFiles", DIRID_CLIENTS, L"%s\\" FAX_CLIENT_DIR, FILEQ_FLAG_SHELL, CSIDL_COMMON_APPDATA }, { L"CoverPageFiles", DIRID_COVERPAGE, L"%s\\%s" , FILEQ_FLAG_SHELL, CSIDL_COMMON_DOCUMENTS } };
#define CountServerFileQueue (sizeof(ServerFileQueue)/sizeof(FILE_QUEUE_INFO))
FILE_QUEUE_INFO ClientFileQueue[] = { { L"ClientSystemFiles", DIRID_SYSTEM, NULL, 0, 0 }, { L"HelpFilesClient", DIRID_HELP, NULL, 0, 0 }, { L"OutlookConfigFile", DIRID_OUTLOOK_ECF, L"%windir%\\addins", FILEQ_FLAG_ENV, 0 }, { L"CoverPageFiles", DIRID_COVERPAGE, L"%s\\Fax\\Personal Coverpages", FILEQ_FLAG_SHELL, CSIDL_PERSONAL} };
#define CountClientFileQueue (sizeof(ClientFileQueue)/sizeof(FILE_QUEUE_INFO))
DWORD SetupQueueXXXSection( HSPFILEQ QueueHandle, LPWSTR SourceRootPath, HINF InfHandle, HINF ListInfHandle, LPWSTR Section, DWORD CopyStyle, DWORD Action ) { if (Action == SETUP_ACTION_NONE) { return 0; }
if (Action == SETUP_ACTION_COPY) { return SetupQueueCopySection( QueueHandle, SourceRootPath, InfHandle, ListInfHandle, Section, CopyStyle ); }
if (Action == SETUP_ACTION_DELETE) { return SetupQueueDeleteSection( QueueHandle, InfHandle, ListInfHandle, Section ); }
return 0; }
BOOL SetDestinationDir( HINF SetupInf, PFILE_QUEUE_INFO FileQueueInfo ) { WCHAR DestDir[MAX_PATH*2]; BOOL Rval;
if (FileQueueInfo->InfDirId < DIRID_USER) { return TRUE; }
if (FileQueueInfo->Flags & FILEQ_FLAG_SHELL) { WCHAR ShellPath[MAX_PATH]; if (!MyGetSpecialPath(FileQueueInfo->ShellId, ShellPath) ) { DebugPrint(( L"MyGetSpecialPath(%d) failed, ec = %d\n", FileQueueInfo->ShellId, GetLastError() )); return FALSE; }
if (FileQueueInfo->InfDirId == DIRID_COVERPAGE) { wsprintf( DestDir, FileQueueInfo->DirName, ShellPath, GetString( IDS_COVERPAGE_DIR ) ); } else { wsprintf( DestDir, FileQueueInfo->DirName, ShellPath ); } }
if (FileQueueInfo->Flags & FILEQ_FLAG_ENV) { ExpandEnvironmentStrings( FileQueueInfo->DirName, DestDir, sizeof(DestDir)/sizeof(WCHAR) ); }
DebugPrint(( L"Setting destination dir: [%d] [%s]", FileQueueInfo->InfDirId, DestDir ));
MakeDirectory( DestDir );
Rval = SetupSetDirectoryId( SetupInf, FileQueueInfo->InfDirId, DestDir );
if (!Rval) { DebugPrint(( L"SetupSetDirectoryId() failed, ec=%d", GetLastError() )); return FALSE; }
return TRUE; }
BOOL ProcessFileQueueEntry( HINF SetupInf, HSPFILEQ FileQueue, LPWSTR SourceRoot, PFILE_QUEUE_INFO FileQueueInfo, DWORD ActionId ) { BOOL Rval;
//
// set the destination directory
//
if (!SetDestinationDir( SetupInf, FileQueueInfo ) ) { return FALSE; }
//
// queue the operation
//
Rval = SetupQueueXXXSection( FileQueue, SourceRoot, SetupInf, SetupInf, FileQueueInfo->SectionName, SP_COPY_FORCE_NEWER, ActionId ); return Rval; }
BOOL ProcessFileQueueEntryForDiskSpace( HINF SetupInf, HDSKSPC DiskSpace, LPWSTR SourceRoot, PFILE_QUEUE_INFO FileQueueInfo, DWORD Operation, BOOL AddToQueue ) { BOOL Rval; //
// set the destination directory
//
if (!SetDestinationDir( SetupInf, FileQueueInfo )) { return FALSE; }
//
// add the files to the disk space queue
//
if (AddToQueue) { Rval = SetupAddSectionToDiskSpaceList( DiskSpace, SetupInf, NULL, FileQueueInfo->SectionName, Operation, NULL, 0 ); } else { Rval = SetupRemoveSectionFromDiskSpaceList( DiskSpace, SetupInf, NULL, FileQueueInfo->SectionName, Operation, NULL, 0 ); }
return Rval; }
BOOL AddServerFilesToQueue( HINF SetupInf, HSPFILEQ FileQueue, LPWSTR SourceRoot ) { PFILE_QUEUE_INFO pfqi = &MinimalServerFileQueue[0]; DWORD CountMax = CountMinimalServerFileQueue;
//
// BugBug: might want to enable this block for product suites, so that client files are also copied over.
//
#if 0
if (IsProductSuite()) { pfqi = &ServerFileQueue[0]; CountMax = CountServerFileQueue; } #endif
for (DWORD i=0; i<CountMax; i++) { ProcessFileQueueEntry( SetupInf, FileQueue, SourceRoot, &pfqi[i], SETUP_ACTION_COPY ); }
return TRUE; }
BOOL CalcServerDiskSpace( HINF SetupInf, HDSKSPC DiskSpace, LPWSTR SourceRoot, BOOL AddToQueue ) { BOOL Rval = TRUE; DWORD ec; PFILE_QUEUE_INFO pfqi = &MinimalServerFileQueue[0]; DWORD CountMax = CountMinimalServerFileQueue;
//
// BugBug: might want to enable this block for product suites, so that client files are also copied over.
//
#if 0
if (IsProductSuite()) { pfqi = &ServerFileQueue[0]; CountMax = CountServerFileQueue; } #endif
for (DWORD i=0; i<CountMax; i++) { if (!ProcessFileQueueEntryForDiskSpace( SetupInf, DiskSpace, SourceRoot, &pfqi[i], FILEOP_COPY, AddToQueue )) { ec = GetLastError(); Rval = FALSE; } }
return Rval; }
BOOL CopyClientFiles( LPWSTR SourceRoot ) { BOOL Rval = FALSE; HINF SetupInf = INVALID_HANDLE_VALUE; HSPFILEQ FileQueue = INVALID_HANDLE_VALUE; WCHAR Buffer[MAX_PATH]; DWORD i; LPVOID Context = NULL;
wcscpy( Buffer, SourceRoot ); wcscat( Buffer, L"faxclnt.inf" );
SetupInf = SetupOpenInfFile( Buffer, NULL, INF_STYLE_WIN4, NULL ); if (SetupInf == INVALID_HANDLE_VALUE) { DebugPrint(( TEXT("SetupOpenInfFile() failed, [%s], ec=0x%08x"), Buffer, GetLastError() )); goto exit; }
FileQueue = SetupOpenFileQueue(); if (FileQueue == INVALID_HANDLE_VALUE) { DebugPrint(( TEXT("SetupOpenFileQueue() failed, ec=0x%08x"), GetLastError() )); goto exit; }
for (i=0; i<CountClientFileQueue; i++) { ProcessFileQueueEntry( SetupInf, FileQueue, SourceRoot, &ClientFileQueue[i], SETUP_ACTION_COPY ); }
Context = SetupInitDefaultQueueCallbackEx( NULL, (HWND)INVALID_HANDLE_VALUE, 0, 0, 0 ); if (!Context) { goto exit; }
if (!SetupCommitFileQueue( NULL, FileQueue, SetupDefaultQueueCallback, Context )) { DebugPrint(( TEXT("SetupCommitFileQueue() failed, ec=0x%08x"), GetLastError() )); goto exit; }
Rval = TRUE;
exit:
if (Context) { SetupTermDefaultQueueCallback( Context ); } if (FileQueue != INVALID_HANDLE_VALUE) { SetupCloseFileQueue( FileQueue ); } if (SetupInf != INVALID_HANDLE_VALUE) { SetupCloseInfFile( SetupInf ); }
return Rval; }
|