[PATCH v2 4/4] msi: Implement UI messages in MsiOpenPackage().

Zebediah Figura z.figura12 at gmail.com
Mon Jun 26 20:28:02 CDT 2017


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/msi/msi.rc         |  2 ++
 dlls/msi/package.c      | 53 +++++++++++++++++++++++++++++++++++++++++++++++++
 dlls/msi/resource.h     |  2 ++
 dlls/msi/tests/format.c | 18 +++++++++++++++++
 4 files changed, 75 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..bf6ae10 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,42 @@ 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);
+    if (!data_row)
+	return ERROR_OUTOFMEMORY;
+    /* 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);
+    if (!info_row)
+    {
+	msiobj_release(&data_row->hdr);
+	return ERROR_OUTOFMEMORY;
+    }
+    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 +1834,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 +1945,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