Hans Leidekker : msi: Fix building the message string in MSI_ProcessMessage .
Alexandre Julliard
julliard at winehq.org
Thu Mar 31 12:43:44 CDT 2011
Module: wine
Branch: master
Commit: 31291ec2050a642ce67dd8c2f224d701f55050a3
URL: http://source.winehq.org/git/wine.git/?a=commit;h=31291ec2050a642ce67dd8c2f224d701f55050a3
Author: Hans Leidekker <hans at codeweavers.com>
Date: Thu Mar 31 11:57:47 2011 +0200
msi: Fix building the message string in MSI_ProcessMessage.
---
dlls/msi/package.c | 62 ++++++++++++++++++++++++++-------------------------
1 files changed, 32 insertions(+), 30 deletions(-)
diff --git a/dlls/msi/package.c b/dlls/msi/package.c
index 7317af2..49acdb7 100644
--- a/dlls/msi/package.c
+++ b/dlls/msi/package.c
@@ -1703,8 +1703,7 @@ MSIHANDLE WINAPI MsiGetActiveDatabase(MSIHANDLE hInstall)
return handle;
}
-INT MSI_ProcessMessage( MSIPACKAGE *package, INSTALLMESSAGE eMessageType,
- MSIRECORD *record)
+INT MSI_ProcessMessage( MSIPACKAGE *package, INSTALLMESSAGE eMessageType, MSIRECORD *record )
{
static const WCHAR szActionData[] =
{'A','c','t','i','o','n','D','a','t','a',0};
@@ -1713,10 +1712,9 @@ INT MSI_ProcessMessage( MSIPACKAGE *package, INSTALLMESSAGE eMessageType,
static const WCHAR szActionText[] =
{'A','c','t','i','o','n','T','e','x','t',0};
LPWSTR message;
- DWORD sz, total_size = 0, log_type = 0;
- INT i, rc = 0;
+ DWORD i, len, total_len, log_type = 0;
+ INT rc = 0;
char *msg;
- int len;
TRACE("%x\n", eMessageType);
@@ -1769,35 +1767,39 @@ INT MSI_ProcessMessage( MSIPACKAGE *package, INSTALLMESSAGE eMessageType,
}
else
{
- INT msg_field=1;
- message = msi_alloc(1*sizeof (WCHAR));
- message[0]=0;
- msg_field = MSI_RecordGetFieldCount(record);
- for (i = 1; i <= msg_field; i++)
+ static const WCHAR format[] = {'%','u',':',' ',0};
+ UINT count = MSI_RecordGetFieldCount( record );
+ WCHAR *p;
+
+ total_len = 1;
+ for (i = 1; i <= count; i++)
+ {
+ len = 0;
+ MSI_RecordGetStringW( record, i, NULL, &len );
+ total_len += len + 13;
+ }
+ p = message = msi_alloc( total_len * sizeof(WCHAR) );
+ if (!p) return ERROR_OUTOFMEMORY;
+
+ for (i = 1; i <= count; i++)
{
- LPWSTR tmp;
- WCHAR number[3];
- static const WCHAR format[] = { '%','i',':',' ',0};
- sz = 0;
- MSI_RecordGetStringW(record,i,NULL,&sz);
- sz+=4;
- total_size+=sz*sizeof(WCHAR);
- tmp = msi_alloc(sz*sizeof(WCHAR));
- message = msi_realloc(message,total_size*sizeof (WCHAR));
-
- MSI_RecordGetStringW(record,i,tmp,&sz);
-
- if (msg_field > 1)
+ if (count > 1)
{
- sprintfW(number,format,i);
- strcatW(message,number);
+ len = sprintfW( p, format, i );
+ total_len -= len;
+ p += len;
+ }
+ len = total_len;
+ MSI_RecordGetStringW( record, i, p, &len );
+ total_len -= len;
+ p += len;
+ if (count > 1 && total_len)
+ {
+ *p++ = ' ';
+ total_len--;
}
- strcatW(message,tmp);
- if (msg_field > 1)
- strcatW(message, szSpace);
-
- msi_free(tmp);
}
+ p[0] = 0;
}
TRACE("%p %p %p %x %x %s\n", gUIHandlerA, gUIHandlerW, gUIHandlerRecord,
More information about the wine-cvs
mailing list