Module: wine Branch: master Commit: 131ef6372fb17decb118df90c229409670571666 URL: http://source.winehq.org/git/wine.git/?a=commit;h=131ef6372fb17decb118df90c2...
Author: Hans Leidekker hans@codeweavers.com Date: Thu Apr 14 14:41:19 2011 +0200
msi: Add support for maintaining a list of cabinet streams.
---
dlls/msi/media.c | 40 ++++++++++++++++++++++++++++++++++++++++ dlls/msi/msipriv.h | 11 +++++++++++ dlls/msi/package.c | 11 +++++++++++ 3 files changed, 62 insertions(+), 0 deletions(-)
diff --git a/dlls/msi/media.c b/dlls/msi/media.c index 9ce92b5..c699ecc 100644 --- a/dlls/msi/media.c +++ b/dlls/msi/media.c @@ -890,3 +890,43 @@ UINT ready_media(MSIPACKAGE *package, UINT Sequence, BOOL IsCompressed, MSIMEDIA msi_free(cabinet_file); return ERROR_SUCCESS; } + +UINT msi_add_cabinet_stream( MSIPACKAGE *package, UINT disk_id, IStorage *storage, const WCHAR *name ) +{ + MSICABINETSTREAM *cab, *item; + + TRACE("%p, %u, %p, %s\n", package, disk_id, storage, debugstr_w(name)); + + LIST_FOR_EACH_ENTRY( item, &package->cabinet_streams, MSICABINETSTREAM, entry ) + { + if (item->disk_id == disk_id) + { + TRACE("duplicate disk id %u\n", disk_id); + return ERROR_FUNCTION_FAILED; + } + } + if (!(cab = msi_alloc( sizeof(*cab) ))) return ERROR_OUTOFMEMORY; + if (!(cab->stream = msi_alloc( (strlenW( name ) + 1) * sizeof(WCHAR ) ))) + { + msi_free( cab ); + return ERROR_OUTOFMEMORY; + } + strcpyW( cab->stream, name ); + cab->disk_id = disk_id; + cab->storage = storage; + IStorage_AddRef( storage ); + list_add_tail( &package->cabinet_streams, &cab->entry ); + + return ERROR_SUCCESS; +} + +MSICABINETSTREAM *msi_get_cabinet_stream( MSIPACKAGE *package, UINT disk_id ) +{ + MSICABINETSTREAM *cab; + + LIST_FOR_EACH_ENTRY( cab, &package->cabinet_streams, MSICABINETSTREAM, entry ) + { + if (cab->disk_id == disk_id) return cab; + } + return NULL; +} diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h index 2dd2c9b..fead8ea 100644 --- a/dlls/msi/msipriv.h +++ b/dlls/msi/msipriv.h @@ -157,6 +157,14 @@ typedef struct tagMSIMEDIAINFO WCHAR sourcedir[MAX_PATH]; } MSIMEDIAINFO;
+typedef struct tagMSICABINETSTREAM +{ + struct list entry; + UINT disk_id; + IStorage *storage; + WCHAR *stream; +} MSICABINETSTREAM; + typedef struct tagMSIPATCHINFO { struct list entry; @@ -350,6 +358,7 @@ typedef struct tagMSIPACKAGE struct list tempfiles; struct list folders; struct list binaries; + struct list cabinet_streams; LPWSTR ActionFormat; LPWSTR LastAction; HANDLE log_file; @@ -1007,6 +1016,8 @@ extern UINT ready_media(MSIPACKAGE *package, UINT Sequence, BOOL IsCompressed, M extern UINT msi_load_media_info(MSIPACKAGE *package, UINT Sequence, MSIMEDIAINFO *mi); extern void msi_free_media_info(MSIMEDIAINFO *mi); extern BOOL msi_cabextract(MSIPACKAGE* package, MSIMEDIAINFO *mi, LPVOID data); +extern MSICABINETSTREAM *msi_get_cabinet_stream(MSIPACKAGE *, UINT); +extern UINT msi_add_cabinet_stream(MSIPACKAGE *, UINT, IStorage *, const WCHAR *);
/* control event stuff */ extern VOID ControlEvent_FireSubscribedEvent(MSIPACKAGE *package, LPCWSTR event, diff --git a/dlls/msi/package.c b/dlls/msi/package.c index 49acdb7..bad8ab3 100644 --- a/dlls/msi/package.c +++ b/dlls/msi/package.c @@ -300,6 +300,16 @@ static void free_package_structures( MSIPACKAGE *package ) msi_free( binary ); }
+ LIST_FOR_EACH_SAFE( item, cursor, &package->cabinet_streams ) + { + MSICABINETSTREAM *cab = LIST_ENTRY( item, MSICABINETSTREAM, entry ); + + list_remove( &cab->entry ); + IStorage_Release( cab->storage ); + msi_free( cab->stream ); + msi_free( cab ); + } + msi_free( package->BaseURL ); msi_free( package->PackagePath ); msi_free( package->ProductCode ); @@ -1080,6 +1090,7 @@ static MSIPACKAGE *msi_alloc_package( void ) list_init( &package->sourcelist_media ); list_init( &package->patches ); list_init( &package->binaries ); + list_init( &package->cabinet_streams ); }
return package;