James Hawkins : msi: Fix the compressed files logic.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Aug 8 13:21:29 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: f84fa0ce6354827d6b2396ca3119c9a8bb7efcfb
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=f84fa0ce6354827d6b2396ca3119c9a8bb7efcfb
Author: James Hawkins <truiken at gmail.com>
Date: Mon Aug 7 11:37:49 2006 -0700
msi: Fix the compressed files logic.
If the compressed file attribute is not set, use the Word Count
property to determine if files are compressed.
---
dlls/msi/action.c | 16 ++++++++++++++++
dlls/msi/action.h | 1 +
dlls/msi/files.c | 6 +++---
dlls/msi/msipriv.h | 8 ++++++++
dlls/msi/package.c | 31 +++++++++++++++++++++++++++++++
5 files changed, 59 insertions(+), 3 deletions(-)
diff --git a/dlls/msi/action.c b/dlls/msi/action.c
index e2d78b1..a90096e 100644
--- a/dlls/msi/action.c
+++ b/dlls/msi/action.c
@@ -1326,8 +1326,24 @@ static UINT load_file(MSIRECORD *row, LP
file->state = msifs_invalid;
+ /* if the compressed bits are not set in the file attributes,
+ * then read the information from the package word count property
+ */
if (file->Attributes & msidbFileAttributesCompressed)
{
+ file->IsCompressed = TRUE;
+ }
+ else if (file->Attributes & msidbFileAttributesNoncompressed)
+ {
+ file->IsCompressed = FALSE;
+ }
+ else
+ {
+ file->IsCompressed = package->WordCount & MSIWORDCOUNT_COMPRESSED;
+ }
+
+ if (file->IsCompressed)
+ {
file->Component->ForceLocalState = TRUE;
file->Component->Action = INSTALLSTATE_LOCAL;
file->Component->ActionRequest = INSTALLSTATE_LOCAL;
diff --git a/dlls/msi/action.h b/dlls/msi/action.h
index 93d28c6..22ad1be 100644
--- a/dlls/msi/action.h
+++ b/dlls/msi/action.h
@@ -120,6 +120,7 @@ typedef struct tagMSIFILE
msi_file_state state;
LPWSTR SourcePath;
LPWSTR TargetPath;
+ BOOL IsCompressed;
} MSIFILE;
typedef struct tagMSITEMPFILE
diff --git a/dlls/msi/files.c b/dlls/msi/files.c
index 36caba7..914b699 100644
--- a/dlls/msi/files.c
+++ b/dlls/msi/files.c
@@ -330,7 +330,7 @@ static BOOL extract_cabinet_file(MSIPACK
static VOID set_file_source(MSIPACKAGE* package, MSIFILE* file, MSICOMPONENT*
comp, LPCWSTR path)
{
- if (!(file->Attributes & msidbFileAttributesCompressed))
+ if (!file->IsCompressed)
{
LPWSTR p, path;
p = resolve_folder(package, comp->Directory, TRUE, FALSE, NULL);
@@ -419,7 +419,7 @@ static UINT ready_media_for_file( MSIPAC
msi_free(mi->last_path);
mi->last_path = NULL;
- if (!(file->Attributes & msidbFileAttributesCompressed))
+ if (!file->IsCompressed)
{
mi->last_path = resolve_folder(package, comp->Directory, TRUE, FALSE, NULL);
set_file_source(package,file,comp,mi->last_path);
@@ -605,7 +605,7 @@ UINT ACTION_InstallFiles(MSIPACKAGE *pac
continue;
/* compressed files are extracted in ready_media_for_file */
- if (file->Attributes & msidbFileAttributesCompressed)
+ if (file->IsCompressed)
{
if (INVALID_FILE_ATTRIBUTES == GetFileAttributesW(file->TargetPath))
ERR("compressed file wasn't extracted (%s)\n",
diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h
index 5d2c21e..c565b67 100644
--- a/dlls/msi/msipriv.h
+++ b/dlls/msi/msipriv.h
@@ -39,6 +39,12 @@ #define MSITYPE_STRING 0x0800
#define MSITYPE_NULLABLE 0x1000
#define MSITYPE_KEY 0x2000
+/* Word Count masks */
+#define MSIWORDCOUNT_SHORTFILENAMES 0x0001
+#define MSIWORDCOUNT_COMPRESSED 0x0002
+#define MSIWORDCOUNT_ADMINISTRATIVE 0x0004
+#define MSIWORDCOUNT_PRIVILEGES 0x0008
+
#define MSITYPE_IS_BINARY(type) (((type) & ~MSITYPE_NULLABLE) == (MSITYPE_STRING|MSITYPE_VALID))
struct tagMSITABLE;
@@ -223,6 +229,8 @@ typedef struct tagMSIPACKAGE
UINT CurrentInstallState;
msi_dialog *dialog;
LPWSTR next_dialog;
+
+ UINT WordCount;
struct list subscriptions;
} MSIPACKAGE;
diff --git a/dlls/msi/package.c b/dlls/msi/package.c
index 283b0a6..4065ffb 100644
--- a/dlls/msi/package.c
+++ b/dlls/msi/package.c
@@ -40,6 +40,7 @@ #include "urlmon.h"
#include "shlobj.h"
#include "wine/unicode.h"
#include "objbase.h"
+#include "msidefs.h"
#include "msipriv.h"
#include "action.h"
@@ -376,6 +377,34 @@ static VOID set_installer_properties(MSI
ReleaseDC(0, dc);
}
+static UINT msi_get_word_count( MSIPACKAGE *package )
+{
+ UINT rc;
+ INT word_count;
+ MSIHANDLE suminfo;
+ MSIHANDLE hdb = alloc_msihandle( &package->db->hdr );
+
+ rc = MsiGetSummaryInformationW( hdb, NULL, 0, &suminfo );
+ MsiCloseHandle(hdb);
+ if (rc != ERROR_SUCCESS)
+ {
+ ERR("Unable to open Summary Information\n");
+ return 0;
+ }
+
+ rc = MsiSummaryInfoGetPropertyW( suminfo, PID_WORDCOUNT, NULL,
+ &word_count, NULL, NULL, NULL );
+ if (rc != ERROR_SUCCESS)
+ {
+ ERR("Unable to query word count\n");
+ MsiCloseHandle(suminfo);
+ return 0;
+ }
+
+ MsiCloseHandle(suminfo);
+ return word_count;
+}
+
MSIPACKAGE *MSI_CreatePackage( MSIDATABASE *db )
{
static const WCHAR szLevel[] = { 'U','I','L','e','v','e','l',0 };
@@ -411,6 +440,8 @@ MSIPACKAGE *MSI_CreatePackage( MSIDATABA
list_init( &package->progids );
list_init( &package->RunningActions );
+ package->WordCount = msi_get_word_count( package );
+
/* OK, here is where we do a slew of things to the database to
* prep for all that is to come as a package */
More information about the wine-cvs
mailing list