[5/6] msi: Add support for maintaining a list of cabinet streams.
Hans Leidekker
hans at codeweavers.com
Thu Apr 14 07:41:19 CDT 2011
---
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;
--
1.7.4.1
More information about the wine-patches
mailing list