+mod_uri_load_base_reporting(): Complain on errors loading base URLs.
[captive.git] / src / install / acquire / moduriload.c
index af56ad2..6c4f8d0 100644 (file)
@@ -135,6 +135,9 @@ struct captivemodid_module *module;
        g_return_if_fail(file_base!=NULL);
        g_return_if_fail(uri!=NULL);
 
+       if ((*ui_progress)(uri))
+               return;
+
        file_md5=calc_md5(file_base,file_length);
        if (!(module=captivemodid_module_md5_lookup(file_md5)))
                goto fail_free_file_md5;
@@ -144,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);
                }
@@ -171,8 +174,15 @@ GnomeVFSResult errvfsresult;
        errvfsresult=gnome_vfs_read(handle,file_buffer,file_info->size,&bytes_read);
        if (errvfsresult!=GNOME_VFS_OK || bytes_read!=file_info->size)
                goto fail_free_file_buffer;
-       errvfsresult=gnome_vfs_read(handle,&file_tail_check,1,NULL);
-       if (errvfsresult!=GNOME_VFS_ERROR_EOF)
+       /* 'bytes_read' must be !=NULL for GnomeVFS-2.0.x! */
+       errvfsresult=gnome_vfs_read(handle,&file_tail_check,1,&bytes_read);
+       if (!(errvfsresult==GNOME_VFS_ERROR_EOF
+                       /* At least RedHat gnome-vfs2-2.0.2-5
+                        * and ntfsprogs-200309071734-1captive1 and ntfsprogs-gnomevfs-1.0.1-0
+                        * do not report GNOME_VFS_ERROR_EOF.
+                        * FIXME: Check if it is a bug in ntfsprogs-gnomevfs-1.0.1-0.
+                        */
+                       || (errvfsresult==GNOME_VFS_OK && bytes_read==0)))
                goto fail_free_file_buffer;
        mod_uri_load_file_from_memory(file_buffer,file_info->size,uri);
 
@@ -180,15 +190,17 @@ 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 **handlep,GnomeVFSFileInfo *file_info,GnomeVFSURI *uri,gint cabinet_used)
 {
 struct acquire_cabinet *acquire_cabinet;
 
-       g_return_if_fail(handle!=NULL);
+       g_return_if_fail(handlep!=NULL);
+       g_return_if_fail(*handlep!=NULL);
        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(handlep,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);
@@ -220,8 +232,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:
@@ -240,14 +255,20 @@ static gboolean mod_uri_load_directory_visit_func
 
        *recurse=FALSE;
 
-       if ((*ui_search_is_aborted)())
-               return FALSE;   /* abort traversal */
+       /* Do not: (*ui_progress)(root_uri);
+        * here as we are called with the same 'root_uri' for all of our 'rel_path's.
+        */
+       (*ui_progress)(NULL);
 
        switch (info->type) {
                case GNOME_VFS_FILE_TYPE_REGULAR: {
 GnomeVFSURI *file_uri;
 
                        file_uri=gnome_vfs_uri_append_path(root_uri,rel_path);
+                       if ((*ui_progress)(file_uri)) {
+                               gnome_vfs_uri_unref(file_uri);
+                               return FALSE;   /* abort traversal */
+                               }
                        mod_uri_load_file(file_uri);
                        gnome_vfs_uri_unref(file_uri);
                        } break;
@@ -260,6 +281,10 @@ GnomeVFSDirectoryHandle *directory_handle;
                         * Check the directory accessibility manually:
                         */
                        directory_uri=gnome_vfs_uri_append_path(root_uri,rel_path);
+                       if ((*ui_progress)(directory_uri)) {
+                               gnome_vfs_uri_unref(directory_uri);
+                               return FALSE;   /* abort traversal */
+                               }
                        if (GNOME_VFS_OK==gnome_vfs_directory_open_from_uri(&directory_handle,directory_uri,GNOME_VFS_FILE_INFO_DEFAULT)) {
                                *recurse=TRUE;
                                gnome_vfs_directory_close(directory_handle);    /* errors ignored */
@@ -292,7 +317,7 @@ gchar *uri_text;
                }
 }
 
-void mod_uri_load(GnomeVFSURI *uri)
+static void mod_uri_load_internal(GnomeVFSURI *uri,gboolean base_reporting)
 {
 GnomeVFSFileInfo file_info_local;
 GnomeVFSResult errvfsresult;
@@ -308,8 +333,16 @@ gchar *uri_text;
                }
 
        file_info_local.type=GNOME_VFS_FILE_TYPE_UNKNOWN;
-       if (GNOME_VFS_OK!=(errvfsresult=gnome_vfs_get_file_info_uri(uri,&file_info_local,GNOME_VFS_FILE_INFO_DEFAULT)))
-               return /* errvfsresult */;
+       if (GNOME_VFS_OK!=(errvfsresult=gnome_vfs_get_file_info_uri(uri,&file_info_local,GNOME_VFS_FILE_INFO_DEFAULT))) {
+               if (base_reporting) {
+gchar *uri_text;
+
+                       uri_text=gnome_vfs_uri_to_string(uri,GNOME_VFS_URI_HIDE_PASSWORD);
+                       g_warning(_("Error loading \"%s\": %s"),uri_text,gnome_vfs_result_to_string(errvfsresult));
+                       g_free(uri_text);
+                       }
+               return;
+               }
        switch (file_info_local.type) {
                case GNOME_VFS_FILE_TYPE_REGULAR:   return mod_uri_load_file(uri);
                case GNOME_VFS_FILE_TYPE_DIRECTORY: return mod_uri_load_directory(uri);
@@ -317,3 +350,19 @@ gchar *uri_text;
                }
        /* NOTREACHED */
 }
+
+void mod_uri_load(GnomeVFSURI *uri)
+{
+       g_return_if_fail(uri!=NULL);
+
+       mod_uri_load_internal(uri,
+                       FALSE); /* base_reporting */
+}
+
+void mod_uri_load_base_reporting(GnomeVFSURI *uri)
+{
+       g_return_if_fail(uri!=NULL);
+
+       mod_uri_load_internal(uri,
+                       TRUE);  /* base_reporting */
+}