Move 'captivemodid' library to libcaptive.
[captive.git] / src / install / acquire / moduriload.c
index 6b2d591..4500716 100644 (file)
@@ -28,7 +28,6 @@
 #include "../libcaptive-install/proc_partitions.h"
 #include "main.h"
 #include <string.h>
-#include "captivemodid.h"
 #include "cabinet.h"
 #include <libgnomevfs/gnome-vfs-ops.h>
 #include <libgnomevfs/gnome-vfs-directory.h>
@@ -36,6 +35,7 @@
 #include <unistd.h>
 
 #include <captive/macros.h>
+#include <captive/captivemodid.h>
 
 
 /* Config: */
@@ -68,7 +68,7 @@ void (*acquire_module_available_notify)(struct module_available *module_availabl
 void (*acquire_module_all_modules_found_notify)(void);
 
 static void mod_uri_load_module_from_memory
-               (struct captivemodid_module *module,gconstpointer file_base,size_t file_length,GnomeVFSURI *uri)
+               (struct captive_captivemodid_module *module,gconstpointer file_base,size_t file_length,GnomeVFSURI *uri)
 {
 struct module_available *module_available;
 gint best_priority;
@@ -109,10 +109,10 @@ int dest_fd;
 
        all_modules_found=FALSE;
 
-       best_priority=captivemodid_module_type_best_priority_lookup(module->type);
+       best_priority=captive_captivemodid_module_type_best_priority_lookup(module->type);
        if (best_priority==G_MININT     /* no longer seeking for such module */
                        || module_available->module->priority==best_priority) {
-               if (captivemodid_module_type_best_priority_found(module->type)) {
+               if (captive_captivemodid_module_type_best_priority_found(module->type)) {
                        /* Postpone (*acquire_module_all_modules_found_notify)()
                         * after (*acquire_module_available_notify)().
                         */
@@ -130,7 +130,7 @@ int dest_fd;
 void mod_uri_load_file_from_memory(gconstpointer file_base,size_t file_length,GnomeVFSURI *uri)
 {
 gchar *file_md5;
-struct captivemodid_module *module;
+struct captive_captivemodid_module *module;
 
        g_return_if_fail(file_base!=NULL);
        g_return_if_fail(uri!=NULL);
@@ -138,11 +138,11 @@ struct captivemodid_module *module;
        if ((*ui_progress)(uri))
                return;
 
-       file_md5=calc_md5(file_base,file_length);
-       if (!(module=captivemodid_module_md5_lookup(file_md5)))
+       file_md5=captive_calc_md5(file_base,file_length);
+       if (!(module=captive_captivemodid_module_md5_lookup(file_md5)))
                goto fail_free_file_md5;
 
-       if (strcmp("cabinet",module->type))
+       if (strcmp("cabinet",(const char *)module->type))
                mod_uri_load_module_from_memory(module,file_base,file_length,uri);
        else {
                struct acquire_cabinet *acquire_cabinet;
@@ -191,17 +191,25 @@ fail_free_file_buffer:
 }
 
 static void mod_uri_load_file_handle_remote_cabinet
-               (GnomeVFSHandle *handle,GnomeVFSFileInfo *file_info,GnomeVFSURI *uri,gint cabinet_used)
+               (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,cabinet_used);
+       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);
+       if (optarg_verbose) {
+gchar *uri_text;
+
+               uri_text=gnome_vfs_uri_to_string(uri,GNOME_VFS_URI_HIDE_PASSWORD);
+               g_message("cabinet_used: %s - %d",uri_text,acquire_cabinet->cabinet_done);
+               g_free(uri_text);
+               }
        acquire_cabinet_free(acquire_cabinet);
 }
 
@@ -213,31 +221,39 @@ GnomeVFSHandle *handle;
 
        g_return_if_fail(uri!=NULL);
 
-       if (GNOME_VFS_OK!=(errvfsresult=gnome_vfs_open_uri(&handle,uri,GNOME_VFS_OPEN_READ)))
+       if (GNOME_VFS_OK!=(errvfsresult=gnome_vfs_open_uri(&handle,uri,GNOME_VFS_OPEN_READ|GNOME_VFS_OPEN_RANDOM)))
                goto fail;
+       CAPTIVE_MEMZERO(&file_info_local);
        if (GNOME_VFS_OK!=(errvfsresult=gnome_vfs_get_file_info_from_handle(handle,&file_info_local,GNOME_VFS_FILE_INFO_DEFAULT)))
                goto fail_close_handle;
-       if (file_info_local.type!=GNOME_VFS_FILE_TYPE_REGULAR) {
+       if (1
+                       && file_info_local.type!=GNOME_VFS_FILE_TYPE_REGULAR
+                       /* FC4 gnome-vfs2-2.10.0-5 "http" returns GNOME_VFS_FILE_TYPE_UNKNOWN
+                        * on the original info query so we need to try directory first.
+                        */
+           && file_info_local.type!=GNOME_VFS_FILE_TYPE_UNKNOWN) {
                errvfsresult=GNOME_VFS_ERROR_WRONG_FORMAT;
-               goto fail_close_handle;
+               goto fail_file_info_local_clear;
                }
        if (!(file_info_local.valid_fields & GNOME_VFS_FILE_INFO_FIELDS_SIZE)) {
                errvfsresult=GNOME_VFS_ERROR_WRONG_FORMAT;
-               goto fail_close_handle;
+               goto fail_file_info_local_clear;
                }
-       if (!captivemodid_module_length_is_valid(file_info_local.size)) {
+       if (!captive_captivemodid_module_length_is_valid(file_info_local.size)) {
                errvfsresult=GNOME_VFS_ERROR_WRONG_FORMAT;
-               goto fail_close_handle;
+               goto fail_file_info_local_clear;
                }
        if (file_info_local.size<=MAX_FILE_LOAD_LENGTH)
                mod_uri_load_file_handle_to_memory(handle,&file_info_local,uri);
        else {
-gint cabinet_used=captivemodid_cabinet_length_to_used(file_info_local.size);
+gint cabinet_used=captive_captivemodid_cabinet_length_to_used(file_info_local.size);
 
-               mod_uri_load_file_handle_remote_cabinet(handle,&file_info_local,uri,cabinet_used);
+               mod_uri_load_file_handle_remote_cabinet(&handle,&file_info_local,uri,cabinet_used);
                }
        errvfsresult=GNOME_VFS_OK;
        /* PASSTHRU */
+fail_file_info_local_clear:
+       gnome_vfs_file_info_clear(&file_info_local);
 fail_close_handle:
        gnome_vfs_close(handle);
 fail:;
@@ -307,6 +323,13 @@ GnomeVFSResult errvfsresult;
                        GNOME_VFS_DIRECTORY_VISIT_SAMEFS,       /* visit_options; 'GNOME_VFS_DIRECTORY_VISIT_LOOPCHECK'? */
                        (GnomeVFSDirectoryVisitFunc)mod_uri_load_directory_visit_func,
                        uri);   /* data */
+       /* FC4 gnome-vfs2-2.10.0-5 "http" returns GNOME_VFS_FILE_TYPE_UNKNOWN
+        * on the original info query so we need to try directory first.
+        */
+       if (errvfsresult==GNOME_VFS_ERROR_NOT_A_DIRECTORY) {
+               mod_uri_load_file(uri);
+               return;
+               }
        if (errvfsresult!=GNOME_VFS_OK) {
 gchar *uri_text;
 
@@ -316,7 +339,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;
@@ -331,13 +354,42 @@ gchar *uri_text;
                g_free(uri_text);
                }
 
+       CAPTIVE_MEMZERO(&file_info_local);
        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);
-               default:                            return /* GNOME_VFS_ERROR_WRONG_FORMAT */;
+               case GNOME_VFS_FILE_TYPE_REGULAR:   mod_uri_load_file(uri);      break;
+               case GNOME_VFS_FILE_TYPE_DIRECTORY: mod_uri_load_directory(uri); break;
+               /* FC4 gnome-vfs2-2.10.0-5 "http" returns GNOME_VFS_FILE_TYPE_UNKNOWN
+                * on the original info query so we need to try directory first.
+                */
+               case GNOME_VFS_FILE_TYPE_UNKNOWN:   mod_uri_load_directory(uri); break;
+               default:                            /* GNOME_VFS_ERROR_WRONG_FORMAT */;
                }
-       /* NOTREACHED */
+       gnome_vfs_file_info_clear(&file_info_local);
+}
+
+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 */
 }