Module: wine Branch: master Commit: 31291ec2050a642ce67dd8c2f224d701f55050a3 URL: http://source.winehq.org/git/wine.git/?a=commit;h=31291ec2050a642ce67dd8c2f2...
Author: Hans Leidekker hans@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,