[10/10] msi: Get rid of some more forward declarations.
Hans Leidekker
hans at codeweavers.com
Tue Jun 7 03:35:58 CDT 2011
---
dlls/msi/dialog.c | 38 +++---
dlls/msi/table.c | 443 +++++++++++++++++++++++++----------------------------
2 files changed, 228 insertions(+), 253 deletions(-)
diff --git a/dlls/msi/dialog.c b/dlls/msi/dialog.c
index f9d704a..08694bc 100644
--- a/dlls/msi/dialog.c
+++ b/dlls/msi/dialog.c
@@ -153,7 +153,24 @@ static const WCHAR szProperty[] = {'P','r','o','p','e','r','t','y',0};
static DWORD uiThreadId;
static HWND hMsiHiddenWindow;
-static LPWSTR msi_get_window_text( HWND hwnd );
+static LPWSTR msi_get_window_text( HWND hwnd )
+{
+ UINT sz, r;
+ LPWSTR buf;
+
+ sz = 0x20;
+ buf = msi_alloc( sz*sizeof(WCHAR) );
+ while ( buf )
+ {
+ r = GetWindowTextW( hwnd, buf, sz );
+ if ( r < (sz - 1) )
+ break;
+ sz *= 2;
+ buf = msi_realloc( buf, sz*sizeof(WCHAR) );
+ }
+
+ return buf;
+}
static INT msi_dialog_scale_unit( msi_dialog *dialog, INT val )
{
@@ -2044,25 +2061,6 @@ struct msi_pathedit_info
WNDPROC oldproc;
};
-static LPWSTR msi_get_window_text( HWND hwnd )
-{
- UINT sz, r;
- LPWSTR buf;
-
- sz = 0x20;
- buf = msi_alloc( sz*sizeof(WCHAR) );
- while ( buf )
- {
- r = GetWindowTextW( hwnd, buf, sz );
- if ( r < (sz - 1) )
- break;
- sz *= 2;
- buf = msi_realloc( buf, sz*sizeof(WCHAR) );
- }
-
- return buf;
-}
-
static void msi_dialog_update_pathedit( msi_dialog *dialog, msi_control *control )
{
LPWSTR prop, path;
diff --git a/dlls/msi/table.c b/dlls/msi/table.c
index 7b36ff9..ecca7c9 100644
--- a/dlls/msi/table.c
+++ b/dlls/msi/table.c
@@ -103,14 +103,6 @@ static const MSICOLUMNINFO _Tables_cols[1] = {
#define MAX_STREAM_NAME 0x1f
-static UINT table_get_column_info( MSIDATABASE *db, LPCWSTR name,
- MSICOLUMNINFO **pcols, UINT *pcount );
-static void table_calc_column_offsets( MSIDATABASE *db, MSICOLUMNINFO *colinfo,
- DWORD count );
-static UINT get_tablecolumns( MSIDATABASE *db,
- LPCWSTR szTableName, MSICOLUMNINFO *colinfo, UINT *sz);
-static void msi_free_colinfo( MSICOLUMNINFO *colinfo, UINT count );
-
static inline UINT bytes_per_column( MSIDATABASE *db, const MSICOLUMNINFO *col, UINT bytes_per_strref )
{
if( MSITYPE_IS_BINARY(col->type) )
@@ -381,6 +373,18 @@ end:
return ret;
}
+static void msi_free_colinfo( MSICOLUMNINFO *colinfo, UINT count )
+{
+ UINT i;
+
+ for (i = 0; i < count; i++)
+ {
+ msi_free( colinfo[i].tablename );
+ msi_free( colinfo[i].colname );
+ msi_free( colinfo[i].hash_table );
+ }
+}
+
static void free_table( MSITABLE *table )
{
UINT i;
@@ -513,6 +517,60 @@ static MSITABLE *find_cached_table( MSIDATABASE *db, LPCWSTR name )
return NULL;
}
+static void table_calc_column_offsets( MSIDATABASE *db, MSICOLUMNINFO *colinfo, DWORD count )
+{
+ DWORD i;
+
+ for (i = 0; colinfo && i < count; i++)
+ {
+ assert( i + 1 == colinfo[i].number );
+ if (i) colinfo[i].offset = colinfo[i - 1].offset +
+ bytes_per_column( db, &colinfo[i - 1], LONG_STR_BYTES );
+ else colinfo[i].offset = 0;
+
+ TRACE("column %d is [%s] with type %08x ofs %d\n",
+ colinfo[i].number, debugstr_w(colinfo[i].colname),
+ colinfo[i].type, colinfo[i].offset);
+ }
+}
+
+static UINT get_defaulttablecolumns( MSIDATABASE *db, LPCWSTR name, MSICOLUMNINFO *colinfo, UINT *sz )
+{
+ const MSICOLUMNINFO *p;
+ DWORD i, n;
+
+ TRACE("%s\n", debugstr_w(name));
+
+ if (!strcmpW( name, szTables ))
+ {
+ p = _Tables_cols;
+ n = 1;
+ }
+ else if (!strcmpW( name, szColumns ))
+ {
+ p = _Columns_cols;
+ n = 4;
+ }
+ else return ERROR_FUNCTION_FAILED;
+
+ /* duplicate the string data so we can free it in msi_free_colinfo */
+ for (i = 0; i < n; i++)
+ {
+ if (colinfo && i < *sz)
+ {
+ colinfo[i] = p[i];
+ colinfo[i].tablename = strdupW( p[i].tablename );
+ colinfo[i].colname = strdupW( p[i].colname );
+ }
+ if (colinfo && i >= *sz) break;
+ }
+ table_calc_column_offsets( db, colinfo, n );
+ *sz = n;
+ return ERROR_SUCCESS;
+}
+
+static UINT get_tablecolumns( MSIDATABASE *db, LPCWSTR szTableName, MSICOLUMNINFO *colinfo, UINT *sz );
+
static UINT table_get_column_info( MSIDATABASE *db, LPCWSTR name, MSICOLUMNINFO **pcols, UINT *pcount )
{
UINT r, column_count = 0;
@@ -521,33 +579,169 @@ static UINT table_get_column_info( MSIDATABASE *db, LPCWSTR name, MSICOLUMNINFO
/* get the number of columns in this table */
column_count = 0;
r = get_tablecolumns( db, name, NULL, &column_count );
- if( r != ERROR_SUCCESS )
+ if (r != ERROR_SUCCESS)
return r;
*pcount = column_count;
/* if there's no columns, there's no table */
- if( column_count == 0 )
+ if (!column_count)
return ERROR_INVALID_PARAMETER;
- TRACE("Table %s found\n", debugstr_w(name) );
+ TRACE("table %s found\n", debugstr_w(name));
- columns = msi_alloc( column_count*sizeof (MSICOLUMNINFO) );
- if( !columns )
+ columns = msi_alloc( column_count * sizeof(MSICOLUMNINFO) );
+ if (!columns)
return ERROR_FUNCTION_FAILED;
r = get_tablecolumns( db, name, columns, &column_count );
- if( r != ERROR_SUCCESS )
+ if (r != ERROR_SUCCESS)
{
msi_free( columns );
return ERROR_FUNCTION_FAILED;
}
-
*pcols = columns;
-
return r;
}
+static UINT get_table( MSIDATABASE *db, LPCWSTR name, MSITABLE **table_ret )
+{
+ MSITABLE *table;
+ UINT r;
+
+ /* first, see if the table is cached */
+ table = find_cached_table( db, name );
+ if (table)
+ {
+ *table_ret = table;
+ return ERROR_SUCCESS;
+ }
+
+ /* nonexistent tables should be interpreted as empty tables */
+ table = msi_alloc( sizeof(MSITABLE) + lstrlenW( name ) * sizeof(WCHAR) );
+ if (!table)
+ return ERROR_FUNCTION_FAILED;
+
+ table->row_count = 0;
+ table->data = NULL;
+ table->data_persistent = NULL;
+ table->colinfo = NULL;
+ table->col_count = 0;
+ table->persistent = MSICONDITION_TRUE;
+ lstrcpyW( table->name, name );
+
+ if (!strcmpW( name, szTables ) || !strcmpW( name, szColumns ))
+ table->persistent = MSICONDITION_NONE;
+
+ r = table_get_column_info( db, name, &table->colinfo, &table->col_count );
+ if (r != ERROR_SUCCESS)
+ {
+ free_table( table );
+ return r;
+ }
+ r = read_table_from_storage( db, table, db->storage );
+ if (r != ERROR_SUCCESS)
+ {
+ free_table( table );
+ return r;
+ }
+ list_add_head( &db->tables, &table->entry );
+ *table_ret = table;
+ return ERROR_SUCCESS;
+}
+
+static UINT read_table_int( BYTE *const *data, UINT row, UINT col, UINT bytes )
+{
+ UINT ret = 0, i;
+
+ for (i = 0; i < bytes; i++)
+ ret += data[row][col + i] << i * 8;
+
+ return ret;
+}
+
+static LPWSTR msi_makestring( const MSIDATABASE *db, UINT string_id )
+{
+ return strdupW( msi_string_lookup_id( db->strings, string_id ) );
+}
+
+static UINT get_tablecolumns( MSIDATABASE *db, LPCWSTR szTableName, MSICOLUMNINFO *colinfo, UINT *sz )
+{
+ UINT r, i, n = 0, table_id, count, maxcount = *sz;
+ MSITABLE *table = NULL;
+
+ TRACE("%s\n", debugstr_w(szTableName));
+
+ /* first check if there is a default table with that name */
+ r = get_defaulttablecolumns( db, szTableName, colinfo, sz );
+ if (r == ERROR_SUCCESS && *sz)
+ return r;
+
+ r = get_table( db, szColumns, &table );
+ if (r != ERROR_SUCCESS)
+ {
+ ERR("couldn't load _Columns table\n");
+ return ERROR_FUNCTION_FAILED;
+ }
+
+ /* convert table and column names to IDs from the string table */
+ r = msi_string2idW( db->strings, szTableName, &table_id );
+ if (r != ERROR_SUCCESS)
+ {
+ WARN("Couldn't find id for %s\n", debugstr_w(szTableName));
+ return r;
+ }
+ TRACE("Table id is %d, row count is %d\n", table_id, table->row_count);
+
+ /* Note: _Columns table doesn't have non-persistent data */
+
+ /* if maxcount is non-zero, assume it's exactly right for this table */
+ memset( colinfo, 0, maxcount * sizeof(*colinfo) );
+ count = table->row_count;
+ for (i = 0; i < count; i++)
+ {
+ if (read_table_int( table->data, i, 0, LONG_STR_BYTES) != table_id) continue;
+ if (colinfo)
+ {
+ UINT id = read_table_int( table->data, i, table->colinfo[2].offset, LONG_STR_BYTES );
+ UINT col = read_table_int( table->data, i, table->colinfo[1].offset, sizeof(USHORT) ) - (1 << 15);
+
+ /* check the column number is in range */
+ if (col < 1 || col > maxcount)
+ {
+ ERR("column %d out of range\n", col);
+ continue;
+ }
+ /* check if this column was already set */
+ if (colinfo[col - 1].number)
+ {
+ ERR("duplicate column %d\n", col);
+ continue;
+ }
+ colinfo[col - 1].tablename = msi_makestring( db, table_id );
+ colinfo[col - 1].number = col;
+ colinfo[col - 1].colname = msi_makestring( db, id );
+ colinfo[col - 1].type = read_table_int( table->data, i, table->colinfo[3].offset,
+ sizeof(USHORT) ) - (1 << 15);
+ colinfo[col - 1].offset = 0;
+ colinfo[col - 1].ref_count = 0;
+ colinfo[col - 1].hash_table = NULL;
+ }
+ n++;
+ }
+ TRACE("%s has %d columns\n", debugstr_w(szTableName), n);
+
+ if (colinfo && n != maxcount)
+ {
+ ERR("missing column in table %s\n", debugstr_w(szTableName));
+ msi_free_colinfo( colinfo, maxcount );
+ return ERROR_FUNCTION_FAILED;
+ }
+ table_calc_column_offsets( db, colinfo, n );
+ *sz = n;
+ return ERROR_SUCCESS;
+}
+
UINT msi_create_table( MSIDATABASE *db, LPCWSTR name, column_info *col_info,
MSICONDITION persistent, MSITABLE **table_ret)
{
@@ -700,64 +894,6 @@ err:
return r;
}
-static UINT get_table( MSIDATABASE *db, LPCWSTR name, MSITABLE **table_ret )
-{
- MSITABLE *table;
- UINT r;
-
- /* first, see if the table is cached */
- table = find_cached_table( db, name );
- if( table )
- {
- *table_ret = table;
- return ERROR_SUCCESS;
- }
-
- /* nonexistent tables should be interpreted as empty tables */
- table = msi_alloc( sizeof (MSITABLE) + lstrlenW(name)*sizeof (WCHAR) );
- if( !table )
- return ERROR_FUNCTION_FAILED;
-
- table->row_count = 0;
- table->data = NULL;
- table->data_persistent = NULL;
- table->colinfo = NULL;
- table->col_count = 0;
- table->persistent = MSICONDITION_TRUE;
- lstrcpyW( table->name, name );
-
- if ( !strcmpW( name, szTables ) || !strcmpW( name, szColumns ) )
- table->persistent = MSICONDITION_NONE;
-
- r = table_get_column_info( db, name, &table->colinfo, &table->col_count);
- if (r != ERROR_SUCCESS)
- {
- free_table ( table );
- return r;
- }
-
- r = read_table_from_storage( db, table, db->storage );
- if( r != ERROR_SUCCESS )
- {
- free_table( table );
- return r;
- }
-
- list_add_head( &db->tables, &table->entry );
- *table_ret = table;
- return ERROR_SUCCESS;
-}
-
-static UINT read_table_int(BYTE *const *data, UINT row, UINT col, UINT bytes)
-{
- UINT ret = 0, i;
-
- for (i = 0; i < bytes; i++)
- ret += data[row][col + i] << i * 8;
-
- return ret;
-}
-
static UINT save_table( MSIDATABASE *db, const MSITABLE *t, UINT bytes_per_strref )
{
BYTE *rawdata = NULL;
@@ -833,165 +969,6 @@ err:
return r;
}
-static void table_calc_column_offsets( MSIDATABASE *db, MSICOLUMNINFO *colinfo, DWORD count )
-{
- DWORD i;
-
- for( i=0; colinfo && (i<count); i++ )
- {
- assert( (i+1) == colinfo[ i ].number );
- if (i)
- colinfo[i].offset = colinfo[ i - 1 ].offset
- + bytes_per_column( db, &colinfo[ i - 1 ], LONG_STR_BYTES );
- else
- colinfo[i].offset = 0;
- TRACE("column %d is [%s] with type %08x ofs %d\n",
- colinfo[i].number, debugstr_w(colinfo[i].colname),
- colinfo[i].type, colinfo[i].offset);
- }
-}
-
-static UINT get_defaulttablecolumns( MSIDATABASE *db, LPCWSTR name,
- MSICOLUMNINFO *colinfo, UINT *sz)
-{
- const MSICOLUMNINFO *p;
- DWORD i, n;
-
- TRACE("%s\n", debugstr_w(name));
-
- if (!strcmpW( name, szTables ))
- {
- p = _Tables_cols;
- n = 1;
- }
- else if (!strcmpW( name, szColumns ))
- {
- p = _Columns_cols;
- n = 4;
- }
- else
- return ERROR_FUNCTION_FAILED;
-
- /* duplicate the string data so we can free it in msi_free_colinfo */
- for (i=0; i<n; i++)
- {
- if (colinfo && (i < *sz) )
- {
- colinfo[i] = p[i];
- colinfo[i].tablename = strdupW( p[i].tablename );
- colinfo[i].colname = strdupW( p[i].colname );
- }
- if( colinfo && (i >= *sz) )
- break;
- }
- table_calc_column_offsets( db, colinfo, n );
- *sz = n;
- return ERROR_SUCCESS;
-}
-
-static void msi_free_colinfo( MSICOLUMNINFO *colinfo, UINT count )
-{
- UINT i;
-
- for( i=0; i<count; i++ )
- {
- msi_free( colinfo[i].tablename );
- msi_free( colinfo[i].colname );
- msi_free( colinfo[i].hash_table );
- }
-}
-
-static LPWSTR msi_makestring( const MSIDATABASE *db, UINT stringid)
-{
- return strdupW(msi_string_lookup_id( db->strings, stringid ));
-}
-
-static UINT get_tablecolumns( MSIDATABASE *db,
- LPCWSTR szTableName, MSICOLUMNINFO *colinfo, UINT *sz)
-{
- UINT r, i, n=0, table_id, count, maxcount = *sz;
- MSITABLE *table = NULL;
-
- TRACE("%s\n", debugstr_w(szTableName));
-
- /* first check if there is a default table with that name */
- r = get_defaulttablecolumns( db, szTableName, colinfo, sz );
- if( ( r == ERROR_SUCCESS ) && *sz )
- return r;
-
- r = get_table( db, szColumns, &table );
- if( r != ERROR_SUCCESS )
- {
- ERR("couldn't load _Columns table\n");
- return ERROR_FUNCTION_FAILED;
- }
-
- /* convert table and column names to IDs from the string table */
- r = msi_string2idW( db->strings, szTableName, &table_id );
- if( r != ERROR_SUCCESS )
- {
- WARN("Couldn't find id for %s\n", debugstr_w(szTableName));
- return r;
- }
-
- TRACE("Table id is %d, row count is %d\n", table_id, table->row_count);
-
- /* Note: _Columns table doesn't have non-persistent data */
-
- /* if maxcount is non-zero, assume it's exactly right for this table */
- memset( colinfo, 0, maxcount*sizeof(*colinfo) );
- count = table->row_count;
- for( i=0; i<count; i++ )
- {
- if( read_table_int(table->data, i, 0, LONG_STR_BYTES) != table_id )
- continue;
- if( colinfo )
- {
- UINT id = read_table_int(table->data, i, table->colinfo[2].offset, LONG_STR_BYTES);
- UINT col = read_table_int(table->data, i, table->colinfo[1].offset, sizeof(USHORT)) - (1<<15);
-
- /* check the column number is in range */
- if (col<1 || col>maxcount)
- {
- ERR("column %d out of range\n", col);
- continue;
- }
-
- /* check if this column was already set */
- if (colinfo[ col - 1 ].number)
- {
- ERR("duplicate column %d\n", col);
- continue;
- }
-
- colinfo[ col - 1 ].tablename = msi_makestring( db, table_id );
- colinfo[ col - 1 ].number = col;
- colinfo[ col - 1 ].colname = msi_makestring( db, id );
- colinfo[ col - 1 ].type = read_table_int(table->data, i,
- table->colinfo[3].offset,
- sizeof(USHORT)) - (1<<15);
- colinfo[ col - 1 ].offset = 0;
- colinfo[ col - 1 ].ref_count = 0;
- colinfo[ col - 1 ].hash_table = NULL;
- }
- n++;
- }
-
- TRACE("%s has %d columns\n", debugstr_w(szTableName), n);
-
- if (colinfo && n != maxcount)
- {
- ERR("missing column in table %s\n", debugstr_w(szTableName));
- msi_free_colinfo(colinfo, maxcount );
- return ERROR_FUNCTION_FAILED;
- }
-
- table_calc_column_offsets( db, colinfo, n );
- *sz = n;
-
- return ERROR_SUCCESS;
-}
-
static void msi_update_table_columns( MSIDATABASE *db, LPCWSTR name )
{
MSITABLE *table;
--
1.7.4.1
More information about the wine-patches
mailing list