msi: Initialize the summary information from a storage interface, not a db.
This commit is contained in:
parent
fd7f9b735d
commit
7f98f1d086
@ -460,7 +460,7 @@ static UINT msi_parse_patch_summary( MSIPACKAGE *package, MSIDATABASE *patch_db
|
|||||||
LPWSTR str, *substorage;
|
LPWSTR str, *substorage;
|
||||||
UINT i, r = ERROR_SUCCESS;
|
UINT i, r = ERROR_SUCCESS;
|
||||||
|
|
||||||
si = MSI_GetSummaryInformationW( patch_db, 0 );
|
si = MSI_GetSummaryInformationW( patch_db->storage, 0 );
|
||||||
if (!si)
|
if (!si)
|
||||||
return ERROR_FUNCTION_FAILED;
|
return ERROR_FUNCTION_FAILED;
|
||||||
|
|
||||||
|
@ -57,15 +57,12 @@ DEFINE_GUID( CLSID_MsiPatch, 0x000c1086, 0x0000, 0x0000,
|
|||||||
static VOID MSI_CloseDatabase( MSIOBJECTHDR *arg )
|
static VOID MSI_CloseDatabase( MSIOBJECTHDR *arg )
|
||||||
{
|
{
|
||||||
MSIDATABASE *db = (MSIDATABASE *) arg;
|
MSIDATABASE *db = (MSIDATABASE *) arg;
|
||||||
DWORD r;
|
|
||||||
|
|
||||||
msi_free(db->path);
|
msi_free(db->path);
|
||||||
free_cached_tables( db );
|
free_cached_tables( db );
|
||||||
msi_free_transforms( db );
|
msi_free_transforms( db );
|
||||||
msi_destroy_stringtable( db->strings );
|
msi_destroy_stringtable( db->strings );
|
||||||
r = IStorage_Release( db->storage );
|
IStorage_Release( db->storage );
|
||||||
if( r )
|
|
||||||
ERR("database reference count was not zero (%d)\n", r);
|
|
||||||
if (db->deletefile)
|
if (db->deletefile)
|
||||||
{
|
{
|
||||||
DeleteFileW( db->deletefile );
|
DeleteFileW( db->deletefile );
|
||||||
|
@ -256,7 +256,7 @@ typedef struct tagMSIPREVIEW
|
|||||||
typedef struct tagMSISUMMARYINFO
|
typedef struct tagMSISUMMARYINFO
|
||||||
{
|
{
|
||||||
MSIOBJECTHDR hdr;
|
MSIOBJECTHDR hdr;
|
||||||
MSIDATABASE *db;
|
IStorage *storage;
|
||||||
DWORD update_count;
|
DWORD update_count;
|
||||||
PROPVARIANT property[MSI_MAX_PROPS];
|
PROPVARIANT property[MSI_MAX_PROPS];
|
||||||
} MSISUMMARYINFO;
|
} MSISUMMARYINFO;
|
||||||
@ -686,7 +686,7 @@ extern MSIPREVIEW *MSI_EnableUIPreview( MSIDATABASE * );
|
|||||||
extern UINT MSI_PreviewDialogW( MSIPREVIEW *, LPCWSTR );
|
extern UINT MSI_PreviewDialogW( MSIPREVIEW *, LPCWSTR );
|
||||||
|
|
||||||
/* summary information */
|
/* summary information */
|
||||||
extern MSISUMMARYINFO *MSI_GetSummaryInformationW( MSIDATABASE *db, UINT uiUpdateCount );
|
extern MSISUMMARYINFO *MSI_GetSummaryInformationW( IStorage *stg, UINT uiUpdateCount );
|
||||||
extern LPWSTR msi_suminfo_dup_string( MSISUMMARYINFO *si, UINT uiProperty );
|
extern LPWSTR msi_suminfo_dup_string( MSISUMMARYINFO *si, UINT uiProperty );
|
||||||
|
|
||||||
/* undocumented functions */
|
/* undocumented functions */
|
||||||
|
@ -96,7 +96,7 @@ static void MSI_CloseSummaryInfo( MSIOBJECTHDR *arg )
|
|||||||
|
|
||||||
for( i = 0; i < MSI_MAX_PROPS; i++ )
|
for( i = 0; i < MSI_MAX_PROPS; i++ )
|
||||||
free_prop( &si->property[i] );
|
free_prop( &si->property[i] );
|
||||||
msiobj_release( &si->db->hdr );
|
IStorage_Release( si->storage );
|
||||||
}
|
}
|
||||||
|
|
||||||
static UINT get_type( UINT uiProperty )
|
static UINT get_type( UINT uiProperty )
|
||||||
@ -405,28 +405,28 @@ static UINT save_summary_info( MSISUMMARYINFO * si, IStream *stm )
|
|||||||
return ERROR_SUCCESS;
|
return ERROR_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
MSISUMMARYINFO *MSI_GetSummaryInformationW( MSIDATABASE *db, UINT uiUpdateCount )
|
MSISUMMARYINFO *MSI_GetSummaryInformationW( IStorage *stg, UINT uiUpdateCount )
|
||||||
{
|
{
|
||||||
IStream *stm = NULL;
|
IStream *stm = NULL;
|
||||||
MSISUMMARYINFO *si;
|
MSISUMMARYINFO *si;
|
||||||
DWORD grfMode;
|
DWORD grfMode;
|
||||||
HRESULT r;
|
HRESULT r;
|
||||||
|
|
||||||
TRACE("%p %d\n", db, uiUpdateCount );
|
TRACE("%p %d\n", stg, uiUpdateCount );
|
||||||
|
|
||||||
si = alloc_msiobject( MSIHANDLETYPE_SUMMARYINFO,
|
si = alloc_msiobject( MSIHANDLETYPE_SUMMARYINFO,
|
||||||
sizeof (MSISUMMARYINFO), MSI_CloseSummaryInfo );
|
sizeof (MSISUMMARYINFO), MSI_CloseSummaryInfo );
|
||||||
if( !si )
|
if( !si )
|
||||||
return si;
|
return si;
|
||||||
|
|
||||||
msiobj_addref( &db->hdr );
|
|
||||||
si->db = db;
|
|
||||||
memset( &si->property, 0, sizeof si->property );
|
memset( &si->property, 0, sizeof si->property );
|
||||||
si->update_count = uiUpdateCount;
|
si->update_count = uiUpdateCount;
|
||||||
|
IStorage_AddRef( stg );
|
||||||
|
si->storage = stg;
|
||||||
|
|
||||||
/* read the stream... if we fail, we'll start with an empty property set */
|
/* read the stream... if we fail, we'll start with an empty property set */
|
||||||
grfMode = STGM_READ | STGM_SHARE_EXCLUSIVE;
|
grfMode = STGM_READ | STGM_SHARE_EXCLUSIVE;
|
||||||
r = IStorage_OpenStream( si->db->storage, szSumInfo, 0, grfMode, 0, &stm );
|
r = IStorage_OpenStream( si->storage, szSumInfo, 0, grfMode, 0, &stm );
|
||||||
if( SUCCEEDED(r) )
|
if( SUCCEEDED(r) )
|
||||||
{
|
{
|
||||||
load_summary_info( si, stm );
|
load_summary_info( si, stm );
|
||||||
@ -462,7 +462,7 @@ UINT WINAPI MsiGetSummaryInformationW( MSIHANDLE hDatabase,
|
|||||||
return ERROR_INVALID_PARAMETER;
|
return ERROR_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
si = MSI_GetSummaryInformationW( db, uiUpdateCount );
|
si = MSI_GetSummaryInformationW( db->storage, uiUpdateCount );
|
||||||
if (si)
|
if (si)
|
||||||
{
|
{
|
||||||
*pHandle = alloc_msihandle( &si->hdr );
|
*pHandle = alloc_msihandle( &si->hdr );
|
||||||
@ -749,7 +749,7 @@ UINT WINAPI MsiSummaryInfoPersist( MSIHANDLE handle )
|
|||||||
return ERROR_INVALID_HANDLE;
|
return ERROR_INVALID_HANDLE;
|
||||||
|
|
||||||
grfMode = STGM_CREATE | STGM_READWRITE | STGM_SHARE_EXCLUSIVE;
|
grfMode = STGM_CREATE | STGM_READWRITE | STGM_SHARE_EXCLUSIVE;
|
||||||
r = IStorage_CreateStream( si->db->storage, szSumInfo, grfMode, 0, 0, &stm );
|
r = IStorage_CreateStream( si->storage, szSumInfo, grfMode, 0, 0, &stm );
|
||||||
if( SUCCEEDED(r) )
|
if( SUCCEEDED(r) )
|
||||||
{
|
{
|
||||||
ret = save_summary_info( si, stm );
|
ret = save_summary_info( si, stm );
|
||||||
|
Loading…
x
Reference in New Issue
Block a user