https://git.reactos.org/?p=reactos.git;a=commitdiff;h=3dfa0cce097c4e59c0798…
commit 3dfa0cce097c4e59c0798d5b8a895de0f1181dc6
Author: winesync <ros-dev(a)reactos.org>
AuthorDate: Sun Mar 13 00:16:14 2022 +0100
Commit: Mark Jansen <mark.jansen(a)reactos.org>
CommitDate: Sun Mar 20 19:28:05 2022 +0100
[WINESYNC] msi: Support substorage transforms in MsiDatabaseApplyTransform.
Wine-Bug:
https://bugs.winehq.org/show_bug.cgi?id=40206
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard(a)winehq.org>
wine commit id ef86011ba40ef90eefb5e54059d907753ec8d694 by Hans Leidekker
<hans(a)codeweavers.com>
---
dll/win32/msi/msiquery.c | 68 +++++++++++++++++++++++++-----------------------
1 file changed, 35 insertions(+), 33 deletions(-)
diff --git a/dll/win32/msi/msiquery.c b/dll/win32/msi/msiquery.c
index 6ecbbcdf63c..036328e0491 100644
--- a/dll/win32/msi/msiquery.c
+++ b/dll/win32/msi/msiquery.c
@@ -824,50 +824,55 @@ MSIHANDLE WINAPI MsiGetLastErrorRecord( void )
return 0;
}
-UINT MSI_DatabaseApplyTransformW( MSIDATABASE *db,
- LPCWSTR szTransformFile, int iErrorCond )
+UINT MSI_DatabaseApplyTransformW( MSIDATABASE *db, const WCHAR *transform, int error_cond
)
{
- HRESULT r;
+ HRESULT hr;
UINT ret = ERROR_FUNCTION_FAILED;
- IStorage *stg = NULL;
+ IStorage *stg;
STATSTG stat;
- TRACE("%p %s %d\n", db, debugstr_w(szTransformFile), iErrorCond);
+ TRACE( "%p %s %08x\n", db, debugstr_w(transform), error_cond );
- r = StgOpenStorage( szTransformFile, NULL,
- STGM_DIRECT|STGM_READ|STGM_SHARE_DENY_WRITE, NULL, 0, &stg);
- if ( FAILED(r) )
+ if (*transform == ':')
{
- WARN("failed to open transform 0x%08x\n", r);
- return ret;
+ hr = IStorage_OpenStorage( db->storage, transform + 1, NULL,
STGM_SHARE_EXCLUSIVE, NULL, 0, &stg );
+ if (FAILED( hr ))
+ {
+ WARN( "failed to open substorage transform 0x%08x\n", hr );
+ return ERROR_FUNCTION_FAILED;
+ }
+ }
+ else
+ {
+ hr = StgOpenStorage( transform, NULL,
STGM_DIRECT|STGM_READ|STGM_SHARE_DENY_WRITE, NULL, 0, &stg );
+ if (FAILED( hr ))
+ {
+ WARN( "failed to open file transform 0x%08x\n", hr );
+ return ERROR_FUNCTION_FAILED;
+ }
}
- r = IStorage_Stat( stg, &stat, STATFLAG_NONAME );
- if ( FAILED( r ) )
- goto end;
-
- if ( !IsEqualGUID( &stat.clsid, &CLSID_MsiTransform ) )
- goto end;
-
- if( TRACE_ON( msi ) )
- enum_stream_names( stg );
+ hr = IStorage_Stat( stg, &stat, STATFLAG_NONAME );
+ if (FAILED( hr )) goto end;
+ if (!IsEqualGUID( &stat.clsid, &CLSID_MsiTransform )) goto end;
+ if (TRACE_ON( msi )) enum_stream_names( stg );
ret = msi_table_apply_transform( db, stg );
end:
IStorage_Release( stg );
-
return ret;
}
-UINT WINAPI MsiDatabaseApplyTransformW( MSIHANDLE hdb,
- LPCWSTR szTransformFile, int iErrorCond)
+UINT WINAPI MsiDatabaseApplyTransformW( MSIHANDLE hdb, const WCHAR *transform, int
error_cond )
{
MSIDATABASE *db;
UINT r;
+ if (error_cond) FIXME( "ignoring error conditions\n" );
+
db = msihandle2msiinfo( hdb, MSIHANDLETYPE_DATABASE );
- if( !db )
+ if (!db)
{
MSIHANDLE remote;
@@ -879,27 +884,24 @@ UINT WINAPI MsiDatabaseApplyTransformW( MSIHANDLE hdb,
return ERROR_SUCCESS;
}
- r = MSI_DatabaseApplyTransformW( db, szTransformFile, iErrorCond );
+ r = MSI_DatabaseApplyTransformW( db, transform, error_cond );
msiobj_release( &db->hdr );
return r;
}
-UINT WINAPI MsiDatabaseApplyTransformA( MSIHANDLE hdb,
- LPCSTR szTransformFile, int iErrorCond)
+UINT WINAPI MsiDatabaseApplyTransformA( MSIHANDLE hdb, const char *transform, int
error_cond )
{
- LPWSTR wstr;
+ WCHAR *wstr;
UINT ret;
- TRACE("%d %s %d\n", hdb, debugstr_a(szTransformFile), iErrorCond);
+ TRACE( "%d %s %08x\n", hdb, debugstr_a(transform), error_cond );
- wstr = strdupAtoW( szTransformFile );
- if( szTransformFile && !wstr )
+ wstr = strdupAtoW( transform );
+ if (transform && !wstr)
return ERROR_NOT_ENOUGH_MEMORY;
- ret = MsiDatabaseApplyTransformW( hdb, wstr, iErrorCond);
-
+ ret = MsiDatabaseApplyTransformW( hdb, wstr, error_cond );
msi_free( wstr );
-
return ret;
}