Commit c0523aaa authored by Mike McCormack's avatar Mike McCormack Committed by Alexandre Julliard

Pull the codepage from the string table.

parent fb3f40b9
...@@ -186,7 +186,7 @@ extern UINT msi_id2stringA( string_table *st, UINT string_no, LPSTR buffer, UINT ...@@ -186,7 +186,7 @@ extern UINT msi_id2stringA( string_table *st, UINT string_no, LPSTR buffer, UINT
extern LPWSTR MSI_makestring( MSIDATABASE *db, UINT stringid); extern LPWSTR MSI_makestring( MSIDATABASE *db, UINT stringid);
extern UINT msi_string2id( string_table *st, LPCWSTR buffer, UINT *id ); extern UINT msi_string2id( string_table *st, LPCWSTR buffer, UINT *id );
extern UINT msi_string2idA( string_table *st, LPCSTR str, UINT *id ); extern UINT msi_string2idA( string_table *st, LPCSTR str, UINT *id );
extern string_table *msi_init_stringtable( int entries ); extern string_table *msi_init_stringtable( int entries, UINT codepage );
extern VOID msi_destroy_stringtable( string_table *st ); extern VOID msi_destroy_stringtable( string_table *st );
extern UINT msi_string_count( string_table *st ); extern UINT msi_string_count( string_table *st );
extern UINT msi_id_refcount( string_table *st, UINT i ); extern UINT msi_id_refcount( string_table *st, UINT i );
......
...@@ -47,6 +47,7 @@ struct string_table ...@@ -47,6 +47,7 @@ struct string_table
{ {
UINT count; /* the number of strings */ UINT count; /* the number of strings */
UINT freeslot; UINT freeslot;
UINT codepage;
msistring *strings; /* an array of strings (in the tree) */ msistring *strings; /* an array of strings (in the tree) */
}; };
...@@ -63,7 +64,7 @@ static int msistring_makehash( const char *str ) ...@@ -63,7 +64,7 @@ static int msistring_makehash( const char *str )
return hash; return hash;
} }
string_table *msi_init_stringtable( int entries ) string_table *msi_init_stringtable( int entries, UINT codepage )
{ {
string_table *st; string_table *st;
...@@ -79,6 +80,7 @@ string_table *msi_init_stringtable( int entries ) ...@@ -79,6 +80,7 @@ string_table *msi_init_stringtable( int entries )
} }
st->count = entries; st->count = entries;
st->freeslot = 1; st->freeslot = 1;
st->codepage = codepage;
return st; return st;
} }
...@@ -192,11 +194,11 @@ int msi_addstringW( string_table *st, UINT n, const WCHAR *data, UINT len, UINT ...@@ -192,11 +194,11 @@ int msi_addstringW( string_table *st, UINT n, const WCHAR *data, UINT len, UINT
} }
/* allocate a new string */ /* allocate a new string */
sz = WideCharToMultiByte( CP_UTF8, 0, data, len, NULL, 0, NULL, NULL ); sz = WideCharToMultiByte( st->codepage, 0, data, len, NULL, 0, NULL, NULL );
st->strings[n].str = HeapAlloc( GetProcessHeap(), 0, sz + 1 ); st->strings[n].str = HeapAlloc( GetProcessHeap(), 0, sz + 1 );
if( !st->strings[n].str ) if( !st->strings[n].str )
return -1; return -1;
WideCharToMultiByte( CP_UTF8, 0, data, len, WideCharToMultiByte( st->codepage, 0, data, len,
st->strings[n].str, sz, NULL, NULL ); st->strings[n].str, sz, NULL, NULL );
st->strings[n].str[sz] = 0; st->strings[n].str[sz] = 0;
st->strings[n].refcount = 1; st->strings[n].refcount = 1;
...@@ -245,7 +247,7 @@ UINT msi_id2stringW( string_table *st, UINT id, LPWSTR buffer, UINT *sz ) ...@@ -245,7 +247,7 @@ UINT msi_id2stringW( string_table *st, UINT id, LPWSTR buffer, UINT *sz )
if( !str ) if( !str )
return ERROR_FUNCTION_FAILED; return ERROR_FUNCTION_FAILED;
len = MultiByteToWideChar(CP_UTF8,0,str,-1,NULL,0); len = MultiByteToWideChar(st->codepage,0,str,-1,NULL,0);
if( !buffer ) if( !buffer )
{ {
...@@ -253,7 +255,7 @@ UINT msi_id2stringW( string_table *st, UINT id, LPWSTR buffer, UINT *sz ) ...@@ -253,7 +255,7 @@ UINT msi_id2stringW( string_table *st, UINT id, LPWSTR buffer, UINT *sz )
return ERROR_SUCCESS; return ERROR_SUCCESS;
} }
*sz = MultiByteToWideChar(CP_UTF8,0,str,-1,buffer,*sz); *sz = MultiByteToWideChar(st->codepage,0,str,-1,buffer,*sz);
return ERROR_SUCCESS; return ERROR_SUCCESS;
} }
...@@ -338,13 +340,13 @@ UINT msi_string2id( string_table *st, LPCWSTR buffer, UINT *id ) ...@@ -338,13 +340,13 @@ UINT msi_string2id( string_table *st, LPCWSTR buffer, UINT *id )
return ERROR_SUCCESS; return ERROR_SUCCESS;
} }
sz = WideCharToMultiByte( CP_UTF8, 0, buffer, -1, NULL, 0, NULL, NULL ); sz = WideCharToMultiByte( st->codepage, 0, buffer, -1, NULL, 0, NULL, NULL );
if( sz <= 0 ) if( sz <= 0 )
return r; return r;
str = HeapAlloc( GetProcessHeap(), 0, sz ); str = HeapAlloc( GetProcessHeap(), 0, sz );
if( !str ) if( !str )
return ERROR_NOT_ENOUGH_MEMORY; return ERROR_NOT_ENOUGH_MEMORY;
WideCharToMultiByte( CP_UTF8, 0, buffer, -1, str, sz, NULL, NULL ); WideCharToMultiByte( st->codepage, 0, buffer, -1, str, sz, NULL, NULL );
r = msi_string2idA( st, str, id ); r = msi_string2idA( st, str, id );
if( str ) if( str )
......
...@@ -612,10 +612,10 @@ UINT load_string_table( MSIDATABASE *db ) ...@@ -612,10 +612,10 @@ UINT load_string_table( MSIDATABASE *db )
goto end; goto end;
count = poolsize/4; count = poolsize/4;
db->strings = msi_init_stringtable( count ); db->strings = msi_init_stringtable( count, pool[0] );
if( pool[0] || pool[1] ) if( pool[1] )
ERR("The first string should be nul, but isn't\n"); ERR("The first string should have zero refcount, but doesn't %04x\n", pool[1]);
offset = 0; offset = 0;
for( i=1; i<count; i++ ) for( i=1; i<count; i++ )
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment