windows-nt/Source/XPSP1/NT/printscan/fax/setup/ocm/fileq.cpp
2020-09-26 16:20:57 +08:00

382 lines
8.6 KiB
C++

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