Change how we install files so that we extract files as we need them,

cuts down on extraction time and unused files.
This commit is contained in:
Aric Stewart 2005-01-04 20:42:58 +00:00 committed by Alexandre Julliard
parent 9d589acc26
commit def5cbfc0b
1 changed files with 20 additions and 8 deletions

View File

@ -2815,6 +2815,7 @@ typedef struct
{
MSIPACKAGE* package;
LPCSTR cab_path;
LPCSTR file_name;
} CabData;
static void * cabinet_alloc(ULONG cb)
@ -2890,13 +2891,17 @@ static INT_PTR cabinet_notify(FDINOTIFICATIONTYPE fdint, PFDINOTIFICATION pfdin)
{
CabData *data = (CabData*) pfdin->pv;
ULONG len = strlen(data->cab_path) + strlen(pfdin->psz1);
char *file = cabinet_alloc((len+1)*sizeof(char));
char *file;
LPWSTR trackname;
LPWSTR trackpath;
LPWSTR tracknametmp;
static const WCHAR tmpprefix[] = {'C','A','B','T','M','P','_',0};
if (data->file_name && strcmp(data->file_name,pfdin->psz1))
return 0;
file = cabinet_alloc((len+1)*sizeof(char));
strcpy(file, data->cab_path);
strcat(file, pfdin->psz1);
@ -2943,17 +2948,19 @@ static INT_PTR cabinet_notify(FDINOTIFICATIONTYPE fdint, PFDINOTIFICATION pfdin)
*
* Extract files from a cab file.
*/
static BOOL extract_cabinet_file(MSIPACKAGE* package, const WCHAR* source,
const WCHAR* path)
static BOOL extract_a_cabinet_file(MSIPACKAGE* package, const WCHAR* source,
const WCHAR* path, const WCHAR* file)
{
HFDI hfdi;
ERF erf;
BOOL ret;
char *cabinet;
char *cab_path;
char *file_name;
CabData data;
TRACE("Extracting %s to %s\n",debugstr_w(source), debugstr_w(path));
TRACE("Extracting %s (%s) to %s\n",debugstr_w(source),
debugstr_w(file), debugstr_w(path));
hfdi = FDICreate(cabinet_alloc,
cabinet_free,
@ -2984,6 +2991,8 @@ static BOOL extract_cabinet_file(MSIPACKAGE* package, const WCHAR* source,
data.package = package;
data.cab_path = cab_path;
file_name = strdupWtoA(file);
data.file_name = file_name;
ret = FDICopy(hfdi, cabinet, "", 0, cabinet_notify, NULL, &data);
@ -2994,17 +3003,18 @@ static BOOL extract_cabinet_file(MSIPACKAGE* package, const WCHAR* source,
HeapFree(GetProcessHeap(), 0, cabinet);
HeapFree(GetProcessHeap(), 0, cab_path);
HeapFree(GetProcessHeap(), 0, file_name);
return ret;
}
static UINT ready_media_for_file(MSIPACKAGE *package, UINT sequence,
WCHAR* path)
WCHAR* path, WCHAR* file)
{
UINT rc;
MSIQUERY * view;
MSIRECORD * row = 0;
WCHAR source[MAX_PATH];
static WCHAR source[MAX_PATH];
static const WCHAR ExecSeqQuery[] = {
's','e','l','e','c','t',' ','*',' ',
'f','r','o','m',' ','M','e','d','i','a',' ',
@ -3019,6 +3029,7 @@ static UINT ready_media_for_file(MSIPACKAGE *package, UINT sequence,
if (sequence <= last_sequence)
{
TRACE("Media already ready (%u, %u)\n",sequence,last_sequence);
extract_a_cabinet_file(package, source,path,file);
return ERROR_SUCCESS;
}
@ -3077,7 +3088,7 @@ static UINT ready_media_for_file(MSIPACKAGE *package, UINT sequence,
GetTempPathW(MAX_PATH,path);
}
}
rc = !extract_cabinet_file(package, source,path);
rc = !extract_a_cabinet_file(package, source,path,file);
}
msiobj_release(&row->hdr);
MSI_ViewClose(view);
@ -3143,7 +3154,8 @@ static UINT ACTION_InstallFiles(MSIPACKAGE *package)
if ((file->State == 1) || (file->State == 2))
{
TRACE("Installing %s\n",debugstr_w(file->File));
rc = ready_media_for_file(package,file->Sequence,path_to_source);
rc = ready_media_for_file(package,file->Sequence,path_to_source,
file->File);
/*
* WARNING!
* our file table could change here because a new temp file