Module: wine Branch: master Commit: 39d6b6eb7057f00aea54c5b252caf23aa3cd34da URL: http://source.winehq.org/git/wine.git/?a=commit;h=39d6b6eb7057f00aea54c5b252...
Author: Hans Leidekker hans@codeweavers.com Date: Mon Sep 20 11:20:19 2010 +0200
msi: Handle fdintNEXT_CABINET and fdintPARTIAL_FILE for cabinet streams.
---
dlls/msi/media.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 files changed, 40 insertions(+), 0 deletions(-)
diff --git a/dlls/msi/media.c b/dlls/msi/media.c index a2a9065..06cd76d 100644 --- a/dlls/msi/media.c +++ b/dlls/msi/media.c @@ -358,6 +358,40 @@ done: return res; }
+static INT_PTR cabinet_next_cabinet_stream( FDINOTIFICATIONTYPE fdint, + PFDINOTIFICATION pfdin ) +{ + MSICABDATA *data = pfdin->pv; + MSIMEDIAINFO *mi = data->mi; + UINT rc; + + msi_free( mi->disk_prompt ); + msi_free( mi->cabinet ); + msi_free( mi->volume_label ); + mi->disk_prompt = NULL; + mi->cabinet = NULL; + mi->volume_label = NULL; + + mi->disk_id++; + mi->is_continuous = TRUE; + + rc = msi_media_get_disk_info( data->package, mi ); + if (rc != ERROR_SUCCESS) + { + ERR("Failed to get next cabinet information: %u\n", rc); + return -1; + } + + msi_free( cab_stream.name ); + cab_stream.name = encode_streamname( FALSE, mi->cabinet + 1 ); + if (!cab_stream.name) + return -1; + + TRACE("next cabinet is %s\n", debugstr_w(mi->cabinet)); + + return 0; +} + static INT_PTR cabinet_copy_file(FDINOTIFICATIONTYPE fdint, PFDINOTIFICATION pfdin) { @@ -494,6 +528,12 @@ static INT_PTR CDECL cabinet_notify_stream( FDINOTIFICATIONTYPE fdint, PFDINOTIF { switch (fdint) { + case fdintPARTIAL_FILE: + return cabinet_partial_file( fdint, pfdin ); + + case fdintNEXT_CABINET: + return cabinet_next_cabinet_stream( fdint, pfdin ); + case fdintCOPY_FILE: return cabinet_copy_file( fdint, pfdin );