James Hawkins : msi: Fix creation of the default format in
MsiFormatRecord.
Alexandre Julliard
julliard at wine.codeweavers.com
Thu Sep 7 07:12:32 CDT 2006
Module: wine
Branch: master
Commit: a248cc8f6284754c4b1abbe35ba42465437eb0b0
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=a248cc8f6284754c4b1abbe35ba42465437eb0b0
Author: James Hawkins <truiken at gmail.com>
Date: Tue Sep 5 20:26:56 2006 -0700
msi: Fix creation of the default format in MsiFormatRecord.
---
dlls/msi/format.c | 48 +++++++++++++++++++++++++++++++-----
dlls/msi/tests/format.c | 63 ++++++++++++++++++++++-------------------------
2 files changed, 70 insertions(+), 41 deletions(-)
diff --git a/dlls/msi/format.c b/dlls/msi/format.c
index b0d9d52..6dc92f9 100644
--- a/dlls/msi/format.c
+++ b/dlls/msi/format.c
@@ -50,19 +50,53 @@ static LPWSTR build_default_format(MSIRE
{
int i;
int count;
- LPWSTR rc;
- static const WCHAR fmt[] = {'%','i',':',' ','[','%','i',']',' ',0};
- WCHAR buf[11];
+ LPWSTR rc, buf;
+ static const WCHAR fmt[] = {'%','i',':',' ','%','s',' ',0};
+ static const WCHAR fmt_null[] = {'%','i',':',' ',' ',0};
+ static const WCHAR fmt_index[] = {'%','i',0};
+ LPCWSTR str;
+ WCHAR index[10];
+ DWORD size, max_len, len;
count = MSI_RecordGetFieldCount(record);
- rc = msi_alloc((11*count)*sizeof(WCHAR));
- rc[0] = 0;
+ max_len = MAX_PATH;
+ buf = msi_alloc((max_len + 1) * sizeof(WCHAR));
+
+ rc = NULL;
+ size = 1;
for (i = 1; i <= count; i++)
{
- sprintfW(buf,fmt,i,i);
- strcatW(rc,buf);
+ sprintfW(index,fmt_index,i);
+ str = MSI_RecordGetString(record, i);
+ len = (str) ? lstrlenW(str) : 0;
+ len += (sizeof(fmt_null) - 3) + lstrlenW(index);
+ size += len;
+
+ if (len > max_len)
+ {
+ max_len = len;
+ buf = msi_realloc(buf, (max_len + 1) * sizeof(WCHAR));
+ if (!buf) return NULL;
+ }
+
+ if (str)
+ sprintfW(buf,fmt,i,str);
+ else
+ sprintfW(buf,fmt_null,i);
+
+ if (!rc)
+ {
+ rc = msi_alloc(size * sizeof(WCHAR));
+ lstrcpyW(rc, buf);
+ }
+ else
+ {
+ rc = msi_realloc(rc, size * sizeof(WCHAR));
+ lstrcatW(rc, buf);
+ }
}
+ msi_free(buf);
return rc;
}
diff --git a/dlls/msi/tests/format.c b/dlls/msi/tests/format.c
index c619c10..c9f9bc3 100644
--- a/dlls/msi/tests/format.c
+++ b/dlls/msi/tests/format.c
@@ -1501,6 +1501,24 @@ static void test_formatrecord_package(vo
ok( sz == 51, "size wrong (%li)\n",sz);
ok( 0 == strcmp(buffer,"1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: "), "wrong output(%s)\n",buffer);
+ r = MsiSetProperty(package, "prop", "val");
+ ok( r == ERROR_SUCCESS, "failed to set propertY: %d\n", r);
+
+ r = MsiRecordSetString(hrec, 0, NULL);
+ r = MsiRecordSetString(hrec, 1, "[2]");
+ r = MsiRecordSetString(hrec, 2, "stuff");
+ r = MsiRecordSetString(hrec, 3, "prop");
+ r = MsiRecordSetString(hrec, 4, "[prop]");
+ r = MsiRecordSetString(hrec, 5, "[noprop]");
+ sz = sizeof buffer;
+ r = MsiFormatRecord(package, hrec, buffer, &sz);
+ ok( r == ERROR_SUCCESS, "format failed with empty buffer (%i)\n",r);
+ todo_wine
+ {
+ ok( sz == 66, "size wrong (%li)\n",sz);
+ ok( 0 == strcmp(buffer,"1: [2] 2: stuff 3: prop 4: val 5: 6: 7: 8: 9: 10: 11: 12: "), "wrong output(%s)\n",buffer);
+ }
+
/* now put play games with escaping */
r = MsiRecordSetString(hrec, 0, "[1] [2] [\\3asdf]");
r = MsiRecordSetString(hrec, 1, "boo");
@@ -1715,33 +1733,25 @@ static void test_formatrecord_tables(voi
/* property doesn't exist */
size = MAX_PATH;
+ /*MsiRecordSetString( hrec, 0, "[1]" ); */
MsiRecordSetString( hrec, 1, "[idontexist]" );
r = MsiFormatRecord( hpkg, hrec, buf, &size );
ok( r == ERROR_SUCCESS, "format record failed: %d\n", r);
- todo_wine
- {
- ok( !lstrcmp( buf, "1: " ), "Expected '1: ', got %s\n", buf );
- }
+ ok( !lstrcmp( buf, "1: " ), "Expected '1: ', got %s\n", buf );
/* property exists */
size = MAX_PATH;
MsiRecordSetString( hrec, 1, "[imaprop]" );
r = MsiFormatRecord( hpkg, hrec, buf, &size );
ok( r == ERROR_SUCCESS, "format record failed: %d\n", r);
- todo_wine
- {
- ok( !lstrcmp( buf, "1: ringer " ), "Expected '1: ringer ', got %s\n", buf );
- }
+ ok( !lstrcmp( buf, "1: ringer " ), "Expected '1: ringer ', got %s\n", buf );
/* environment variable doesn't exist */
size = MAX_PATH;
MsiRecordSetString( hrec, 1, "[%idontexist]" );
r = MsiFormatRecord( hpkg, hrec, buf, &size );
ok( r == ERROR_SUCCESS, "format record failed: %d\n", r);
- todo_wine
- {
- ok( !lstrcmp( buf, "1: " ), "Expected '1: ', got %s\n", buf );
- }
+ ok( !lstrcmp( buf, "1: " ), "Expected '1: ', got %s\n", buf );
/* environment variable exists */
size = MAX_PATH;
@@ -1749,20 +1759,14 @@ static void test_formatrecord_tables(voi
MsiRecordSetString( hrec, 1, "[%crazyvar]" );
r = MsiFormatRecord( hpkg, hrec, buf, &size );
ok( r == ERROR_SUCCESS, "format record failed: %d\n", r);
- todo_wine
- {
- ok( !lstrcmp( buf, "1: crazyval " ), "Expected '1: crazyval ', got %s\n", buf );
- }
+ ok( !lstrcmp( buf, "1: crazyval " ), "Expected '1: crazyval ', got %s\n", buf );
/* file key before CostInitialize */
size = MAX_PATH;
MsiRecordSetString( hrec, 1, "[#frontal_file]" );
r = MsiFormatRecord( hpkg, hrec, buf, &size );
ok( r == ERROR_SUCCESS, "format record failed: %d\n", r);
- todo_wine
- {
- ok( !lstrcmp( buf, "1: " ), "Expected '1: ', got %s\n", buf );
- }
+ ok( !lstrcmp( buf, "1: " ), "Expected '1: ', got %s\n", buf );
r = MsiDoAction(hpkg, "CostInitialize");
ok( r == ERROR_SUCCESS, "CostInitialize failed: %d\n", r);
@@ -1778,31 +1782,22 @@ static void test_formatrecord_tables(voi
MsiRecordSetString( hrec, 1, "[#frontal_file]" );
r = MsiFormatRecord( hpkg, hrec, buf, &size );
ok( r == ERROR_SUCCESS, "format record failed: %d\n", r);
- todo_wine
- {
- ok( !lstrcmp( buf, "1: C:\\frontal.txt " ), "Expected '1: C:\\frontal.txt ', got %s\n", buf);
- }
+ ok( !lstrcmp( buf, "1: C:\\frontal.txt " ), "Expected '1: C:\\frontal.txt ', got %s\n", buf);
/* frontal short file key */
size = MAX_PATH;
MsiRecordSetString( hrec, 1, "[!frontal_file]" );
r = MsiFormatRecord( hpkg, hrec, buf, &size );
ok( r == ERROR_SUCCESS, "format record failed: %d\n", r);
- todo_wine
- {
- ok( !lstrcmp( buf, "1: C:\\frontal.txt " ), "Expected '1: C:\\frontal.txt ', got %s\n", buf);
- }
+ ok( !lstrcmp( buf, "1: C:\\frontal.txt " ), "Expected '1: C:\\frontal.txt ', got %s\n", buf);
/* temporal full file key */
size = MAX_PATH;
MsiRecordSetString( hrec, 1, "[#temporal_file]" );
r = MsiFormatRecord( hpkg, hrec, buf, &size );
ok( r == ERROR_SUCCESS, "format record failed: %d\n", r);
- todo_wine
- {
- ok( !lstrcmp( buf, "1: C:\\I am a really long directory\\temporal.txt " ),
- "Expected '1: C:\\I am a really long directory\\temporal.txt ', got %s\n", buf);
- }
+ ok( !lstrcmp( buf, "1: C:\\I am a really long directory\\temporal.txt " ),
+ "Expected '1: C:\\I am a really long directory\\temporal.txt ', got %s\n", buf);
/* temporal short file key */
size = MAX_PATH;
@@ -1846,7 +1841,7 @@ static void test_formatrecord_tables(voi
/* component with INSTALLSTATE_LOCAL */
size = MAX_PATH;
- MsiRecordSetString( hrec, 1, "[$temporal]" );
+ MsiRecordSetString( hrec, 0, "[$temporal]" );
r = MsiFormatRecord( hpkg, hrec, buf, &size );
ok( r == ERROR_SUCCESS, "format record failed: %d\n", r);
todo_wine
More information about the wine-cvs
mailing list