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;
+}
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;
struct list tempfiles;
struct list folders;
struct list binaries;
+ struct list cabinet_streams;
LPWSTR ActionFormat;
LPWSTR LastAction;
HANDLE log_file;
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,
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 );
list_init( &package->sourcelist_media );
list_init( &package->patches );
list_init( &package->binaries );
+ list_init( &package->cabinet_streams );
}
return package;