#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>
#include <unistd.h>
#include <captive/macros.h>
+#include <captive/captivemodid.h>
/* Config: */
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;
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)().
*/
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);
- file_md5=calc_md5(file_base,file_length);
- if (!(module=captivemodid_module_md5_lookup(file_md5)))
+ if ((*ui_progress)(uri))
+ return;
+
+ 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;
/* 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);
}
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);
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);
+ 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);
}
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
- mod_uri_load_file_handle_remote_cabinet(handle,&file_info_local,uri);
+ else {
+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);
+ }
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:;
*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;
* 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 */
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;
}
}
-void mod_uri_load(GnomeVFSURI *uri)
+static void mod_uri_load_internal(GnomeVFSURI *uri,gboolean base_reporting)
{
GnomeVFSFileInfo file_info_local;
GnomeVFSResult errvfsresult;
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 */
}