msi: Save nonpersistent strings as holes in the string pool.

This commit is contained in:
James Hawkins 2007-10-17 22:57:18 -05:00 committed by Alexandre Julliard
parent 36df6a0655
commit 2274388323
2 changed files with 13 additions and 9 deletions

View File

@ -457,20 +457,22 @@ UINT msi_strcmp( const string_table *st, UINT lval, UINT rval, UINT *res )
static void string_totalsize( const string_table *st, UINT *datasize, UINT *poolsize ) static void string_totalsize( const string_table *st, UINT *datasize, UINT *poolsize )
{ {
UINT i, len, max, holesize; UINT i, len, holesize;
if( st->strings[0].str || st->strings[0].persistent_refcount || st->strings[0].nonpersistent_refcount) if( st->strings[0].str || st->strings[0].persistent_refcount || st->strings[0].nonpersistent_refcount)
ERR("oops. element 0 has a string\n"); ERR("oops. element 0 has a string\n");
*poolsize = 4; *poolsize = 4;
*datasize = 0; *datasize = 0;
max = 1;
holesize = 0; holesize = 0;
for( i=1; i<st->maxcount; i++ ) for( i=1; i<st->maxcount; i++ )
{ {
if( !st->strings[i].persistent_refcount ) if( !st->strings[i].persistent_refcount )
continue; {
if( st->strings[i].str ) TRACE("[%u] nonpersistent = %s\n", i, debugstr_w(st->strings[i].str));
(*poolsize) += 4;
}
else if( st->strings[i].str )
{ {
TRACE("[%u] = %s\n", i, debugstr_w(st->strings[i].str)); TRACE("[%u] = %s\n", i, debugstr_w(st->strings[i].str));
len = WideCharToMultiByte( st->codepage, 0, len = WideCharToMultiByte( st->codepage, 0,
@ -480,7 +482,6 @@ static void string_totalsize( const string_table *st, UINT *datasize, UINT *pool
(*datasize) += len; (*datasize) += len;
if (len>0xffff) if (len>0xffff)
(*poolsize) += 4; (*poolsize) += 4;
max = i + 1;
(*poolsize) += holesize + 4; (*poolsize) += holesize + 4;
holesize = 0; holesize = 0;
} }
@ -634,7 +635,13 @@ UINT msi_save_string_table( const string_table *st, IStorage *storage )
for( i=1; i<st->maxcount; i++ ) for( i=1; i<st->maxcount; i++ )
{ {
if( !st->strings[i].persistent_refcount ) if( !st->strings[i].persistent_refcount )
{
pool[ n*2 ] = 0;
pool[ n*2 + 1] = 0;
n++;
continue; continue;
}
sz = datasize - used; sz = datasize - used;
r = msi_id2stringA( st, i, data+used, &sz ); r = msi_id2stringA( st, i, data+used, &sz );
if( r != ERROR_SUCCESS ) if( r != ERROR_SUCCESS )

View File

@ -4253,10 +4253,7 @@ static void test_stringtable(void)
sz = sizeof(buffer); sz = sizeof(buffer);
r = MsiRecordGetString(hrec, 2, buffer, &sz); r = MsiRecordGetString(hrec, 2, buffer, &sz);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
todo_wine ok(!lstrcmp(buffer, "five"), "Expected five, got %s\n", buffer);
{
ok(!lstrcmp(buffer, "five"), "Expected five, got %s\n", buffer);
}
r = MsiCloseHandle(hrec); r = MsiCloseHandle(hrec);
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);