[PATCH 5/5] msi: Implement UI messages in MsiOpenPackage().
Zebediah Figura
z.figura12 at gmail.com
Sun Jun 25 21:13:56 CDT 2017
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
dlls/msi/msi.rc | 2 ++
dlls/msi/package.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
dlls/msi/resource.h | 2 ++
dlls/msi/tests/format.c | 18 ++++++++++++++++++
4 files changed, 68 insertions(+)
diff --git a/dlls/msi/msi.rc b/dlls/msi/msi.rc
index 4904a2d..5bd9956 100644
--- a/dlls/msi/msi.rc
+++ b/dlls/msi/msi.rc
@@ -69,6 +69,7 @@ STRINGTABLE
{
IDS_ACTIONSTART "Action %s: [1]. [2]"
IDS_INFO "Info [1]. "
+ IDS_COMMONDATA "Message type: [1], Argument: [2]{, [3]}"
}
/* INSTALLMESSAGE_INFO strings */
@@ -76,6 +77,7 @@ STRINGTABLE
{
IDS_INFO_ACTIONSTART "Action start %s: [1]."
IDS_INFO_ACTIONENDED "Action ended %s: [1]. Return value [2]."
+ IDS_INFO_LOGGINGSTART "=== Logging started: %s %s ==="
}
/* Standard action description strings */
diff --git a/dlls/msi/package.c b/dlls/msi/package.c
index 00a8283..64f3664 100644
--- a/dlls/msi/package.c
+++ b/dlls/msi/package.c
@@ -1468,6 +1468,7 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage)
MSIDATABASE *db;
MSIPACKAGE *package;
MSIHANDLE handle;
+ MSIRECORD *data_row, *info_row;
LPWSTR ptr, base_url = NULL;
UINT r;
WCHAR localfile[MAX_PATH], cachefile[MAX_PATH];
@@ -1475,6 +1476,12 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage)
DWORD index = 0;
MSISUMMARYINFO *si;
BOOL delete_on_close = FALSE;
+ LPWSTR productname;
+ static const WCHAR date_format[] =
+ {'M','/','d','/','y','y','y','y',0};
+ static const WCHAR time_format[] =
+ {'H','H','\'',':','\'','m','m','\'',':','\'','s','s',0};
+ WCHAR timet[100], datet[100], info_template[1024], info_message[1024];
TRACE("%s %p\n", debugstr_w(szPackage), pPackage);
@@ -1610,6 +1617,35 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage)
if (gszLogFile)
package->log_file = CreateFileW( gszLogFile, GENERIC_WRITE, FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
+
+ /* FIXME: when should these messages be sent? */
+ data_row = MSI_CreateRecord(3);
+ /* FIXME: field 0 should be NULL */
+ MSI_RecordSetInteger(data_row, 1, 0);
+ MSI_RecordSetInteger(data_row, 2, package->num_langids ? package->langids[0] : 0);
+ MSI_RecordSetInteger(data_row, 3, msi_get_string_table_codepage(package->db->strings));
+ MSI_ProcessMessage(package, INSTALLMESSAGE_COMMONDATA, data_row);
+
+ info_row = MSI_CreateRecord(0);
+ GetTimeFormatW(LOCALE_USER_DEFAULT, 0, NULL, time_format, timet, 100);
+ GetDateFormatW(LOCALE_USER_DEFAULT, 0, NULL, date_format, datet, 100);
+ LoadStringW(msi_hInstance, IDS_INFO_LOGGINGSTART, info_template, 1024);
+ sprintfW(info_message, info_template, datet, timet);
+ MSI_RecordSetStringW(info_row, 0, info_message);
+ MSI_ProcessMessage(package, INSTALLMESSAGE_INFO|MB_ICONHAND, info_row);
+
+ MSI_ProcessMessage(package, INSTALLMESSAGE_COMMONDATA, data_row);
+
+ productname = msi_dup_property(package->db, INSTALLPROPERTY_PRODUCTNAMEW);
+ MSI_RecordSetInteger(data_row, 1, 1);
+ MSI_RecordSetStringW(data_row, 2, productname);
+ MSI_RecordSetStringW(data_row, 3, NULL);
+ MSI_ProcessMessage(package, INSTALLMESSAGE_COMMONDATA, data_row);
+
+ msi_free(productname);
+ msiobj_release(&info_row->hdr);
+ msiobj_release(&data_row->hdr);
+
*pPackage = package;
return ERROR_SUCCESS;
}
@@ -1791,6 +1827,12 @@ INT MSI_ProcessMessage( MSIPACKAGE *package, INSTALLMESSAGE eMessageType, MSIREC
msi_free(template_rec);
msi_free(template);
}
+ else if ((eMessageType & 0xff000000) == INSTALLMESSAGE_COMMONDATA)
+ {
+ WCHAR template[1024];
+ LoadStringW(msi_hInstance, IDS_COMMONDATA, template, 1024);
+ MSI_RecordSetStringW(record, 0, template);
+ }
if (!package || !record)
message = NULL;
@@ -1896,6 +1938,10 @@ INT WINAPI MsiProcessMessage( MSIHANDLE hInstall, INSTALLMESSAGE eMessageType,
(eMessageType & 0xff000000) == INSTALLMESSAGE_TERMINATE)
return -1;
+ if ((eMessageType & 0xff000000) == INSTALLMESSAGE_ACTIONDATA &&
+ MsiRecordGetInteger(hRecord, 1) != 2)
+ return -1;
+
package = msihandle2msiinfo( hInstall, MSIHANDLETYPE_PACKAGE );
if( !package )
{
diff --git a/dlls/msi/resource.h b/dlls/msi/resource.h
index 4d349e6..92fed33 100644
--- a/dlls/msi/resource.h
+++ b/dlls/msi/resource.h
@@ -18,9 +18,11 @@
#define IDS_ACTIONSTART 1000
#define IDS_INFO 1001
+#define IDS_COMMONDATA 1002
#define IDS_INFO_ACTIONSTART 1050
#define IDS_INFO_ACTIONENDED 1051
+#define IDS_INFO_LOGGINGSTART 1052
#define IDS_DESC_ALLOCATEREGISTRYSPACE 1100
#define IDS_DESC_APPSEARCH 1101
diff --git a/dlls/msi/tests/format.c b/dlls/msi/tests/format.c
index d86a252..a9a60cd 100644
--- a/dlls/msi/tests/format.c
+++ b/dlls/msi/tests/format.c
@@ -2785,6 +2785,24 @@ static void test_processmessage(void)
r = MsiProcessMessage(package, INSTALLMESSAGE_INITIALIZE, hrec);
ok( r == -1, "expected -1, got %i\n", r);
+ r = MsiRecordSetInteger(hrec, 1, 2);
+ ok( r == ERROR_SUCCESS, "set integer failed\n");
+ r = MsiRecordSetInteger(hrec, 2, 1);
+ ok( r == ERROR_SUCCESS, "set integer failed\n");
+ r = MsiProcessMessage(package, INSTALLMESSAGE_COMMONDATA, hrec);
+ todo_wine
+ ok( r == IDOK, "expected IDOK, got %i\n", r);
+
+ r = MsiRecordSetInteger(hrec, 2, 2);
+ ok( r == ERROR_SUCCESS, "set integer failed\n");
+ r = MsiProcessMessage(package, INSTALLMESSAGE_INITIALIZE, hrec);
+ ok( r == -1, "expected -1, got %i\n", r);
+
+ r = MsiRecordSetInteger(hrec, 1, 1);
+ ok( r == ERROR_SUCCESS, "set integer failed\n");
+ r = MsiProcessMessage(package, INSTALLMESSAGE_INITIALIZE, hrec);
+ ok( r == -1, "expected -1, got %i\n", r);
+
MsiCloseHandle(hrec);
MsiCloseHandle(package);
--
2.7.4
More information about the wine-patches
mailing list