if (errvfsresult!=GNOME_VFS_OK)
return errvfsresult;
g_assert(bytes_read_now>0);
+ acquire_cabinet->cabinet_done+=bytes_read_now;
+ if (ui_progress_bar)
+ (*ui_progress_bar)(acquire_cabinet->cabinet_done,acquire_cabinet->cabinet_used);
while (bytes_read_now) {
ACQUIRE_CABINET_SET_BYTE_CACHED(acquire_cabinet,offset_start);
offset_start++;
acquire_cabinet->filename=gnome_vfs_uri_to_string(acquire_cabinet->uri,GNOME_VFS_URI_HIDE_PASSWORD);
}
-struct acquire_cabinet *acquire_cabinet_new_from_memory(gconstpointer file_base,size_t file_length,GnomeVFSURI *uri)
+struct acquire_cabinet *acquire_cabinet_new_from_memory
+ (gconstpointer file_base,size_t file_length,GnomeVFSURI *uri,gint cabinet_used)
{
struct acquire_cabinet *r;
r->handle=NULL;
r->size=file_length;
acquire_cabinet_set_uri(r,uri);
+ r->cabinet_done=0;
+ r->cabinet_used=cabinet_used;
return r;
}
-struct acquire_cabinet *acquire_cabinet_new_from_handle(GnomeVFSHandle *handle,GnomeVFSFileInfo *file_info,GnomeVFSURI *uri)
+struct acquire_cabinet *acquire_cabinet_new_from_handle
+ (GnomeVFSHandle *handle,GnomeVFSFileInfo *file_info,GnomeVFSURI *uri,gint cabinet_used)
{
struct acquire_cabinet *r;
r->handle=handle;
r->size=file_info->size;
acquire_cabinet_set_uri(r,uri);
+ r->cabinet_done=0;
+ r->cabinet_used=cabinet_used;
return r;
}
g_return_if_fail(acquire_cabinet!=NULL);
+ if (ui_progress_bar)
+ (*ui_progress_bar)(acquire_cabinet->cabinet_done,acquire_cabinet->cabinet_used);
+
if ((*ui_progress)(acquire_cabinet->uri))
return;
GnomeVFSFileOffset (*tell)(struct acquire_cabinet *acquire_cabinet);
GnomeVFSResult (*read)
(struct acquire_cabinet *acquire_cabinet,gpointer buffer,GnomeVFSFileSize bytes,GnomeVFSFileSize *bytes_read);
+ gint cabinet_done,cabinet_used;
};
void acquire_cabinet_seek(struct acquire_cabinet *acquire_cabinet,GnomeVFSFileOffset offset);
GnomeVFSResult acquire_cabinet_read
(struct acquire_cabinet *acquire_cabinet,gpointer buffer,GnomeVFSFileSize bytes,GnomeVFSFileSize *bytes_read);
-struct acquire_cabinet *acquire_cabinet_new_from_memory(gconstpointer file_base,size_t file_length,GnomeVFSURI *uri);
-struct acquire_cabinet *acquire_cabinet_new_from_handle(GnomeVFSHandle *handle,GnomeVFSFileInfo *file_info,GnomeVFSURI *uri);
+struct acquire_cabinet *acquire_cabinet_new_from_memory
+ (gconstpointer file_base,size_t file_length,GnomeVFSURI *uri,gint cabinet_used);
+struct acquire_cabinet *acquire_cabinet_new_from_handle
+ (GnomeVFSHandle *handle,GnomeVFSFileInfo *file_info,GnomeVFSURI *uri,gint cabinet_used);
void acquire_cabinet_free(struct acquire_cabinet *acquire_cabinet);
void acquire_cabinet_load(struct acquire_cabinet *acquire_cabinet);
static void captivemodid_load_module(struct captivemodid_module *module)
{
struct captivemodid_module *module_md5_conflict;
+gpointer valid_length_value_gpointer;
module_md5_hash_init();
if ((module_md5_conflict=g_hash_table_lookup(module_md5_hash,module->md5))) {
g_hash_table_insert(module_md5_hash,(/* de-const */ xmlChar *)module->md5,module);
module_valid_length_hash_init();
- g_hash_table_insert(module_valid_length_hash,GINT_TO_POINTER(module->length),module_valid_length_hash);
+ if (!g_hash_table_lookup_extended(module_valid_length_hash,GINT_TO_POINTER(module->length),
+ NULL, /* orig_key */
+ &valid_length_value_gpointer)) /* value */
+ g_hash_table_insert(module_valid_length_hash,GINT_TO_POINTER(module->length),GINT_TO_POINTER(module->cabinet_used));
+ else {
+ /* Conflicting 'cabinet_used' values for single 'cabinet size'? */
+ if (valid_length_value_gpointer && GPOINTER_TO_INT(valid_length_value_gpointer)!=module->cabinet_used)
+ g_hash_table_insert(module_valid_length_hash,GINT_TO_POINTER(module->length),NULL);
+ }
if (strcmp(module->type,"cabinet")) {
if (module->priority>captivemodid_module_type_best_priority_lookup(module->type)) {
if ((GnomeVFSFileSize)(file_size_gint=file_size)!=file_size) /* Size too big to be valid. */
return FALSE;
module_valid_length_hash_init();
- return !!g_hash_table_lookup(module_valid_length_hash,GINT_TO_POINTER(file_size_gint));
+ return g_hash_table_lookup_extended(module_valid_length_hash,GINT_TO_POINTER(file_size_gint),
+ NULL, /* orig_key */
+ NULL); /* value */
+}
+
+gint captivemodid_cabinet_length_to_used(gint cabinet_length)
+{
+gpointer valid_length_value_gpointer;
+
+ if (!g_hash_table_lookup_extended(module_valid_length_hash,GINT_TO_POINTER(cabinet_length),
+ NULL, /* orig_key */
+ &valid_length_value_gpointer)) /* value */
+ return 0;
+ return GPOINTER_TO_INT(valid_length_value_gpointer);
}
struct captivemodid_module *captivemodid_module_md5_lookup(const gchar *file_md5)
static void captivemodid_load_module_xml(const gchar *captivemodid_pathname,xmlTextReader *xml_reader)
{
struct captivemodid_module *module;
+xmlChar *cabinet_used_string;
captive_new0(module);
if (!(module->type=captivemodid_load_module_xml_get_attr(captivemodid_pathname,xml_reader,"type")))
}
if (!(module->id =captivemodid_load_module_xml_get_attr(captivemodid_pathname,xml_reader,"id")))
goto fail_free_module;
- if (0>=(module->length=captivemodid_load_module_xml_get_attr_l(captivemodid_pathname,xml_reader,"length",1,G_MAXINT-1)))
+ if (0>=(module->length=captivemodid_load_module_xml_get_attr_l(
+ captivemodid_pathname,xml_reader,"length",1,G_MAXINT-1)))
goto fail_free_module;
+ if (!(cabinet_used_string=xmlTextReaderGetAttribute(xml_reader,"cabinet_used")))
+ module->cabinet_used=0;
+ else {
+ xmlFree(cabinet_used_string);
+ if (0>=(module->cabinet_used=captivemodid_load_module_xml_get_attr_l(
+ captivemodid_pathname,xml_reader,"cabinet_used",1,G_MAXINT-1)))
+ goto fail_free_module;
+ }
if (G_MININT>=(module->priority=captivemodid_load_module_xml_get_attr_l(captivemodid_pathname,xml_reader,"priority",
G_MININT+1,G_MAXINT-1)))
goto fail_free_module;
const xmlChar *md5;
const xmlChar *id;
gint priority;
+ gint cabinet_used;
};
extern void (*captivemodid_module_best_priority_notify)(const gchar *module_type);
gint captivemodid_module_type_best_priority_lookup(const xmlChar *module_type);
gboolean captivemodid_module_type_best_priority_found(const xmlChar *module_type);
gboolean captivemodid_load(const gchar *captivemodid_pathname);
+gint captivemodid_cabinet_length_to_used(gint cabinet_length);
G_END_DECLS
}
gboolean (*ui_progress)(GnomeVFSURI *uri)=ui_progress_dummy;
+void (*ui_progress_bar)(gint done,gint length);
static GList *mod_uri_list_local;
static void mod_uri_list_local_init(void)
extern gboolean optarg_dry;
extern void (*ui_interactive)(void);
extern gboolean (*ui_progress)(GnomeVFSURI *uri);
+extern void (*ui_progress_bar)(gint done,gint length);
void scan_disks_quick(void);
void scan_disks(void);
else {
struct acquire_cabinet *acquire_cabinet;
/* acquire_cabinet_load() will call mod_uri_load_module_from_memory(): */
- acquire_cabinet=acquire_cabinet_new_from_memory(file_base,file_length,uri);
+ acquire_cabinet=acquire_cabinet_new_from_memory(file_base,file_length,uri,module->cabinet_used);
acquire_cabinet_load(acquire_cabinet);
acquire_cabinet_free(acquire_cabinet);
}
g_free(file_buffer);
}
-static void mod_uri_load_file_handle_remote_cabinet(GnomeVFSHandle *handle,GnomeVFSFileInfo *file_info,GnomeVFSURI *uri)
+static void mod_uri_load_file_handle_remote_cabinet
+ (GnomeVFSHandle *handle,GnomeVFSFileInfo *file_info,GnomeVFSURI *uri,gint cabinet_used)
{
struct acquire_cabinet *acquire_cabinet;
g_return_if_fail(file_info!=NULL);
g_return_if_fail(uri!=NULL);
- acquire_cabinet=acquire_cabinet_new_from_handle(handle,file_info,uri);
+ acquire_cabinet=acquire_cabinet_new_from_handle(handle,file_info,uri,cabinet_used);
/* acquire_cabinet_load() will call mod_uri_load_module_from_memory(): */
acquire_cabinet_load(acquire_cabinet);
acquire_cabinet_free(acquire_cabinet);
}
if (file_info_local.size<=MAX_FILE_LOAD_LENGTH)
mod_uri_load_file_handle_to_memory(handle,&file_info_local,uri);
- else
- mod_uri_load_file_handle_remote_cabinet(handle,&file_info_local,uri);
+ else {
+gint cabinet_used=captivemodid_cabinet_length_to_used(file_info_local.size);
+
+ mod_uri_load_file_handle_remote_cabinet(handle,&file_info_local,uri,cabinet_used);
+ }
errvfsresult=GNOME_VFS_OK;
/* PASSTHRU */
fail_close_handle:
#include <libgnomeui/gnome-app-util.h>
#include <libgnomeui/gnome-druid-page-edge.h>
#include "final.h"
+#include <libgnomevfs/gnome-vfs-utils.h>
#include <captive/macros.h>
static GnomeDruidPage *PageFinish;
static GtkEntry *ScanPathLocationComboEntry;
static GtkButton *MicrosoftComConfirmButton;
+static GtkProgressBar *MicrosoftComProgress;
enum {
DRIVERS_TREE_STORE_COLUMN_TYPE,
DRIVERS_TREE_STORE_COLUMN_ID,
(page_active!=PageFinish && page_active!=MicrosoftComPage));
gtk_widget_set_sensitive(GTK_WIDGET(MicrosoftComConfirmButton),
(page_active==MicrosoftComPage));
+ gtk_progress_bar_set_fraction(MicrosoftComProgress,(gdouble)0);
+ gtk_progress_bar_set_text(MicrosoftComProgress,"");
}
}
return FALSE;
}
+static void ui_gnome_progress_bar(gint done,gint length)
+{
+ g_return_if_fail(done>=0);
+ g_return_if_fail(length>=0);
+
+ if (!length) {
+ gtk_progress_bar_pulse(MicrosoftComProgress);
+ gtk_progress_bar_set_text(MicrosoftComProgress,"");
+ }
+ else {
+gchar *done_display,*length_display;
+
+ gtk_progress_bar_set_fraction(MicrosoftComProgress,((gdouble)done)/length);
+ done_display=gnome_vfs_format_file_size_for_display(done);
+ length_display=gnome_vfs_format_file_size_for_display(length);
+ gtk_progress_bar_set_text(MicrosoftComProgress,
+ captive_printf_alloca("%s / %s",done_display,length_display));
+ g_free(done_display);
+ g_free(length_display);
+ }
+}
+
/* FIXME: Change it to "prepare" signal. */
void on_Page_map(GtkWidget *vbox_widget,GtkWidget *page_widget)
{
PageFinish=GNOME_DRUID_PAGE(lookup_widget(GTK_WIDGET(App),"PageFinish"));
ScanPathLocationComboEntry=GTK_ENTRY(lookup_widget(GTK_WIDGET(App),"ScanPathLocationComboEntry"));
MicrosoftComConfirmButton=GTK_BUTTON(lookup_widget(GTK_WIDGET(App),"MicrosoftComConfirmButton"));
+ MicrosoftComProgress=GTK_PROGRESS_BAR(lookup_widget(GTK_WIDGET(App),"MicrosoftComProgress"));
ProgressEntry=GTK_ENTRY(lookup_widget(GTK_WIDGET(App),"ProgressEntry"));
druid_button_box=GTK_BOX(gtk_widget_get_parent(Druid->next));
acquire_module_available_notify=ui_gnome_module_available_notify;
acquire_module_all_modules_found_notify=ui_gnome_all_modules_found_notify;
ui_progress=ui_gnome_progress;
+ ui_progress_bar=ui_gnome_progress_bar;
ui_interactive=ui_gnome_interactive;
captivemodid_module_best_priority_notify=ui_gnome_module_best_priority_notify;
<property name="fill">True</property>
</packing>
</child>
+
+ <child>
+ <widget class="GtkProgressBar" id="MicrosoftComProgress">
+ <property name="visible">True</property>
+ <property name="orientation">GTK_PROGRESS_LEFT_TO_RIGHT</property>
+ <property name="fraction">0</property>
+ <property name="pulse_step">0.1</property>
+ <property name="text" translatable="yes"></property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
</widget>
</child>
</widget>
<module type="cabinet" length="160852568" priority="100" md5="ed5c40cab78513084f9a11cdd3a25361"
id="Microsoft Windows XP Service Pack 1 Checked Build U.S. Cabinet" />
<!-- xpsp1a_en_x86_chk.exe -->
- <module type="cabinet" length="151583320" priority="100" md5="257c90b85f20f597caad8a4bd8c481ef"
+ <module type="cabinet" length="151583320" priority="100" md5="257c90b85f20f597caad8a4bd8c481ef" cabinet_used="27983852"
id="Microsoft Windows XP Service Pack 1a Checked Build U.S. Cabinet" />
<!-- ntoskrnl.exe -->
<module type="ntoskrnl.exe" length="3427328" priority="100" md5="f2935c744335d920c27d6fd47e814863"