Implemented cabinet download progress indicator.
authorshort <>
Wed, 17 Sep 2003 15:43:52 +0000 (15:43 +0000)
committershort <>
Wed, 17 Sep 2003 15:43:52 +0000 (15:43 +0000)
src/install/acquire/cabinet.c
src/install/acquire/cabinet.h
src/install/acquire/captivemodid.c
src/install/acquire/captivemodid.h
src/install/acquire/main.c
src/install/acquire/main.h
src/install/acquire/moduriload.c
src/install/acquire/ui-gnome.c
src/install/acquire/ui-gnome.glade
src/install/acquire/w32-mod-id.captivemodid.xml

index 0e9a790..299f609 100644 (file)
@@ -101,6 +101,9 @@ GnomeVFSFileSize bytes_read_now;
                        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++;
@@ -147,7 +150,8 @@ GnomeVFSURI *uri_cabextract;
        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;
 
@@ -161,11 +165,14 @@ 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;
 
@@ -190,6 +197,8 @@ 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;
 }
@@ -233,6 +242,9 @@ struct file *filelist,*fi;
 
        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;
 
index 7d673e5..f521630 100644 (file)
@@ -45,6 +45,7 @@ struct acquire_cabinet {
        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);
@@ -53,8 +54,10 @@ GnomeVFSFileOffset acquire_cabinet_tell(struct acquire_cabinet *acquire_cabinet)
 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);
 
index 234cbc3..4e3af28 100644 (file)
@@ -101,6 +101,7 @@ static void module_type_best_priority_hash_init(void)
 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))) {
@@ -111,7 +112,15 @@ struct captivemodid_module *module_md5_conflict;
        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)) {
@@ -129,7 +138,20 @@ gint file_size_gint;
        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)
@@ -211,6 +233,7 @@ char *ends;
 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")))
@@ -227,8 +250,17 @@ struct captivemodid_module *module;
                }
        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;
index f654f34..c40bd75 100644 (file)
@@ -35,6 +35,7 @@ struct captivemodid_module {
        const xmlChar *md5;
        const xmlChar *id;
        gint priority;
+       gint cabinet_used;
        };
 
 extern void (*captivemodid_module_best_priority_notify)(const gchar *module_type);
@@ -45,6 +46,7 @@ struct captivemodid_module *captivemodid_module_md5_lookup(const gchar *file_md5
 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
 
index abd4799..3eefed7 100644 (file)
@@ -116,6 +116,7 @@ static gboolean ui_progress_dummy(GnomeVFSURI *uri)
 }
 
 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)
index 7a5537c..7c11693 100644 (file)
@@ -31,6 +31,7 @@ extern gboolean optarg_verbose;
 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);
index 59256d6..fba1690 100644 (file)
@@ -147,7 +147,7 @@ struct captivemodid_module *module;
        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);
                }
@@ -183,7 +183,8 @@ fail_free_file_buffer:
        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;
 
@@ -191,7 +192,7 @@ 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);
@@ -223,8 +224,11 @@ GnomeVFSHandle *handle;
                }
        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:
index f5904df..83f9008 100644 (file)
@@ -35,6 +35,7 @@
 #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>
 
@@ -59,6 +60,7 @@ static GnomeDruidPage *MicrosoftComPage;
 static GnomeDruidPage *PageFinish;
 static GtkEntry *ScanPathLocationComboEntry;
 static GtkButton *MicrosoftComConfirmButton;
+static GtkProgressBar *MicrosoftComProgress;
 enum {
                DRIVERS_TREE_STORE_COLUMN_TYPE,
                DRIVERS_TREE_STORE_COLUMN_ID,
@@ -130,6 +132,8 @@ static void state_changed(void)
                                (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,"");
                }
 }
 
@@ -244,6 +248,28 @@ struct timeval diff_timeval;
        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)
 {
@@ -502,6 +528,7 @@ GtkBox *druid_button_box;
        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));
@@ -581,6 +608,7 @@ gboolean ui_gnome_init(void)
        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;
 
index 8b6613d..b07ad09 100644 (file)
@@ -384,6 +384,21 @@ We will need to download approx 29MB of data right now (takes 2 hours on 33.6 mo
                      <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>
index 20be778..6efe57d 100644 (file)
@@ -21,7 +21,7 @@
        <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"