Use an enumeration for file states.
This commit is contained in:
parent
4413adf9a9
commit
dded8fb7a8
|
@ -1305,7 +1305,7 @@ static UINT load_file(MSIRECORD *row, LPVOID param)
|
||||||
file->Attributes = MSI_RecordGetInteger( row, 7 );
|
file->Attributes = MSI_RecordGetInteger( row, 7 );
|
||||||
file->Sequence = MSI_RecordGetInteger( row, 8 );
|
file->Sequence = MSI_RecordGetInteger( row, 8 );
|
||||||
|
|
||||||
file->State = 0;
|
file->state = msifs_invalid;
|
||||||
|
|
||||||
TRACE("File Loaded (%s)\n",debugstr_w(file->File));
|
TRACE("File Loaded (%s)\n",debugstr_w(file->File));
|
||||||
|
|
||||||
|
@ -1861,7 +1861,7 @@ static UINT ACTION_CostFinalize(MSIPACKAGE *package)
|
||||||
|
|
||||||
if (GetFileAttributesW(file->TargetPath) == INVALID_FILE_ATTRIBUTES)
|
if (GetFileAttributesW(file->TargetPath) == INVALID_FILE_ATTRIBUTES)
|
||||||
{
|
{
|
||||||
file->State = 1;
|
file->state = msifs_missing;
|
||||||
comp->Cost += file->FileSize;
|
comp->Cost += file->FileSize;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -1896,16 +1896,16 @@ static UINT ACTION_CostFinalize(MSIPACKAGE *package)
|
||||||
debugstr_w(filever));
|
debugstr_w(filever));
|
||||||
if (strcmpiW(filever,file->Version)<0)
|
if (strcmpiW(filever,file->Version)<0)
|
||||||
{
|
{
|
||||||
file->State = 2;
|
file->state = msifs_overwrite;
|
||||||
FIXME("cost should be diff in size\n");
|
/* FIXME: cost should be diff in size */
|
||||||
comp->Cost += file->FileSize;
|
comp->Cost += file->FileSize;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
file->State = 3;
|
file->state = msifs_present;
|
||||||
msi_free(version);
|
msi_free(version);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
file->State = 3;
|
file->state = msifs_present;
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACE("Evaluating Condition Table\n");
|
TRACE("Evaluating Condition Table\n");
|
||||||
|
|
|
@ -93,6 +93,15 @@ typedef struct tagMSIFOLDER
|
||||||
INT Space;
|
INT Space;
|
||||||
} MSIFOLDER;
|
} MSIFOLDER;
|
||||||
|
|
||||||
|
typedef enum _msi_file_state {
|
||||||
|
msifs_invalid,
|
||||||
|
msifs_missing,
|
||||||
|
msifs_overwrite,
|
||||||
|
msifs_present,
|
||||||
|
msifs_installed,
|
||||||
|
msifs_skipped,
|
||||||
|
} msi_file_state;
|
||||||
|
|
||||||
typedef struct tagMSIFILE
|
typedef struct tagMSIFILE
|
||||||
{
|
{
|
||||||
struct list entry;
|
struct list entry;
|
||||||
|
@ -105,14 +114,7 @@ typedef struct tagMSIFILE
|
||||||
LPWSTR Language;
|
LPWSTR Language;
|
||||||
INT Attributes;
|
INT Attributes;
|
||||||
INT Sequence;
|
INT Sequence;
|
||||||
|
msi_file_state state;
|
||||||
INT State;
|
|
||||||
/* 0 = uninitialize */
|
|
||||||
/* 1 = not present */
|
|
||||||
/* 2 = present but replace */
|
|
||||||
/* 3 = present do not replace */
|
|
||||||
/* 4 = Installed */
|
|
||||||
/* 5 = Skipped */
|
|
||||||
LPWSTR SourcePath;
|
LPWSTR SourcePath;
|
||||||
LPWSTR TargetPath;
|
LPWSTR TargetPath;
|
||||||
} MSIFILE;
|
} MSIFILE;
|
||||||
|
|
|
@ -221,7 +221,7 @@ static INT_PTR cabinet_notify(FDINOTIFICATIONTYPE fdint, PFDINOTIFICATION pfdin)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (f->State != 1 && f->State != 2)
|
if (f->state != msifs_missing && f->state != msifs_overwrite)
|
||||||
{
|
{
|
||||||
TRACE("Skipping extraction of %s\n",debugstr_a(pfdin->psz1));
|
TRACE("Skipping extraction of %s\n",debugstr_a(pfdin->psz1));
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -240,7 +240,7 @@ static INT_PTR cabinet_notify(FDINOTIFICATIONTYPE fdint, PFDINOTIFICATION pfdin)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
f->State = 4;
|
f->state = msifs_installed;
|
||||||
return (INT_PTR) handle;
|
return (INT_PTR) handle;
|
||||||
}
|
}
|
||||||
case fdintCLOSE_FILE_INFO:
|
case fdintCLOSE_FILE_INFO:
|
||||||
|
@ -615,7 +615,7 @@ static UINT get_file_target(MSIPACKAGE *package, LPCWSTR file_key,
|
||||||
{
|
{
|
||||||
if (lstrcmpW( file_key, file->File )==0)
|
if (lstrcmpW( file_key, file->File )==0)
|
||||||
{
|
{
|
||||||
if (file->State >= 2)
|
if (file->state >= msifs_overwrite)
|
||||||
{
|
{
|
||||||
*file_source = strdupW( file->TargetPath );
|
*file_source = strdupW( file->TargetPath );
|
||||||
return ERROR_SUCCESS;
|
return ERROR_SUCCESS;
|
||||||
|
@ -629,11 +629,11 @@ static UINT get_file_target(MSIPACKAGE *package, LPCWSTR file_key,
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* In order to make this work more effeciencly I am going to do this in 2
|
* ACTION_InstallFiles()
|
||||||
* passes.
|
*
|
||||||
* Pass 1) Correct all the TargetPaths and determin what files are to be
|
* For efficiency, this is done in two passes:
|
||||||
* installed.
|
* 1) Correct all the TargetPaths and determine what files are to be installed.
|
||||||
* Pass 2) Extract Cabinents and copy files.
|
* 2) Extract Cabinets and copy files.
|
||||||
*/
|
*/
|
||||||
UINT ACTION_InstallFiles(MSIPACKAGE *package)
|
UINT ACTION_InstallFiles(MSIPACKAGE *package)
|
||||||
{
|
{
|
||||||
|
@ -648,7 +648,7 @@ UINT ACTION_InstallFiles(MSIPACKAGE *package)
|
||||||
/* increment progress bar each time action data is sent */
|
/* increment progress bar each time action data is sent */
|
||||||
ui_progress(package,1,1,0,0);
|
ui_progress(package,1,1,0,0);
|
||||||
|
|
||||||
/* handle the keys for the SouceList */
|
/* handle the keys for the SourceList */
|
||||||
ptr = strrchrW(package->PackagePath,'\\');
|
ptr = strrchrW(package->PackagePath,'\\');
|
||||||
if (ptr)
|
if (ptr)
|
||||||
{
|
{
|
||||||
|
@ -669,7 +669,7 @@ UINT ACTION_InstallFiles(MSIPACKAGE *package)
|
||||||
TRACE("File %s is not scheduled for install\n",
|
TRACE("File %s is not scheduled for install\n",
|
||||||
debugstr_w(file->File));
|
debugstr_w(file->File));
|
||||||
|
|
||||||
file->State = 5;
|
file->state = msifs_skipped;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -686,7 +686,7 @@ UINT ACTION_InstallFiles(MSIPACKAGE *package)
|
||||||
/* Pass 2 */
|
/* Pass 2 */
|
||||||
LIST_FOR_EACH_ENTRY( file, &package->files, MSIFILE, entry )
|
LIST_FOR_EACH_ENTRY( file, &package->files, MSIFILE, entry )
|
||||||
{
|
{
|
||||||
if (file->State != 1 && file->State != 2)
|
if (file->state != msifs_missing && file->state != msifs_overwrite)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
TRACE("Pass 2: %s\n",debugstr_w(file->File));
|
TRACE("Pass 2: %s\n",debugstr_w(file->File));
|
||||||
|
@ -702,7 +702,7 @@ UINT ACTION_InstallFiles(MSIPACKAGE *package)
|
||||||
TRACE("file paths %s to %s\n",debugstr_w(file->SourcePath),
|
TRACE("file paths %s to %s\n",debugstr_w(file->SourcePath),
|
||||||
debugstr_w(file->TargetPath));
|
debugstr_w(file->TargetPath));
|
||||||
|
|
||||||
if (file->State != 1 && file->State != 2)
|
if (file->state != msifs_missing && file->state != msifs_overwrite)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* compressed files are extracted in ready_media_for_file */
|
/* compressed files are extracted in ready_media_for_file */
|
||||||
|
@ -720,7 +720,7 @@ UINT ACTION_InstallFiles(MSIPACKAGE *package)
|
||||||
rc = GetLastError();
|
rc = GetLastError();
|
||||||
ERR("Unable to copy file (%s -> %s) (error %d)\n",
|
ERR("Unable to copy file (%s -> %s) (error %d)\n",
|
||||||
debugstr_w(file->SourcePath), debugstr_w(file->TargetPath), rc);
|
debugstr_w(file->SourcePath), debugstr_w(file->TargetPath), rc);
|
||||||
if (rc == ERROR_ALREADY_EXISTS && file->State == 2)
|
if (rc == ERROR_ALREADY_EXISTS && file->state == msifs_overwrite)
|
||||||
{
|
{
|
||||||
rc = 0;
|
rc = 0;
|
||||||
}
|
}
|
||||||
|
@ -737,7 +737,7 @@ UINT ACTION_InstallFiles(MSIPACKAGE *package)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
file->State = 4;
|
file->state = msifs_installed;
|
||||||
rc = ERROR_SUCCESS;
|
rc = ERROR_SUCCESS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue