diff options
Diffstat (limited to 'gvfs')
| -rw-r--r-- | gvfs/gvfs.c | 638 |
1 files changed, 293 insertions, 345 deletions
diff --git a/gvfs/gvfs.c b/gvfs/gvfs.c index f62cfaa..a0de5cf 100644 --- a/gvfs/gvfs.c +++ b/gvfs/gvfs.c @@ -28,8 +28,8 @@ -#define VERSION "0.2.0" -#define BUILD_DATE "2009-11-21" +#define VERSION "0.2.1" +#define BUILD_DATE "2009-12-09" #define DEFAULT_BLOCK_SIZE 0x10000 /* 64kB */ #define CONST_DEFAULT_QUERY_INFO_ATTRIBUTES G_FILE_ATTRIBUTE_STANDARD_TYPE "," G_FILE_ATTRIBUTE_STANDARD_IS_SYMLINK "," \ @@ -50,7 +50,7 @@ struct TVFSGlobs { gboolean enum_add_full_path; GMainLoop *mount_main_loop; - TVFSResult mount_result; + GError *mount_error; int mount_try; gboolean ftp_anonymous; @@ -65,62 +65,6 @@ struct TVFSGlobs { -static TVFSResult -g_error_to_TVFSResult (GError *error) -{ - g_print ("g_error_to_TVFSResult: code = %d\n", error->code); - switch (error->code) { - case G_IO_ERROR_FAILED: - case G_IO_ERROR_NOT_FOUND: - return cVFS_Failed; - break; - case G_IO_ERROR_PERMISSION_DENIED: - return cVFS_PermissionDenied; - break; - case G_IO_ERROR_CANCELLED: - return cVFS_Cancelled; - break; - case G_IO_ERROR_NOT_SUPPORTED: - case G_IO_ERROR_FILENAME_TOO_LONG: - return cVFS_Not_Supported; - break; - case G_IO_ERROR_NO_SPACE: - return cVFS_NoSpaceLeft; - break; - case G_IO_ERROR_IS_DIRECTORY: - case G_IO_ERROR_NOT_REGULAR_FILE: - case G_IO_ERROR_NOT_SYMBOLIC_LINK: - case G_IO_ERROR_NOT_MOUNTABLE_FILE: - case G_IO_ERROR_INVALID_FILENAME: - case G_IO_ERROR_TOO_MANY_LINKS: - case G_IO_ERROR_INVALID_ARGUMENT: - case G_IO_ERROR_NOT_DIRECTORY: - case G_IO_ERROR_NOT_MOUNTED: - case G_IO_ERROR_ALREADY_MOUNTED: - case G_IO_ERROR_WRONG_ETAG: - case G_IO_ERROR_TIMED_OUT: - case G_IO_ERROR_WOULD_RECURSE: - case G_IO_ERROR_HOST_NOT_FOUND: - return cVFS_ReadErr; - break; - case G_IO_ERROR_EXISTS: - case G_IO_ERROR_NOT_EMPTY: - case G_IO_ERROR_CLOSED: - case G_IO_ERROR_PENDING: - case G_IO_ERROR_READ_ONLY: - case G_IO_ERROR_CANT_CREATE_BACKUP: - case G_IO_ERROR_BUSY: - case G_IO_ERROR_WOULD_BLOCK: - case G_IO_ERROR_WOULD_MERGE: - return cVFS_WriteErr; - break; - case G_IO_ERROR_FAILED_HANDLED: - default: - return cVFS_Failed; - } -} - - static void ask_password_cb (GMountOperation *op, const char *message, @@ -246,28 +190,22 @@ mount_done_cb (GObject *object, { struct TVFSGlobs *globs; gboolean succeeded; - GError *error = NULL; globs = (struct TVFSGlobs*) user_data; g_assert (globs != NULL); - succeeded = g_file_mount_enclosing_volume_finish (G_FILE (object), res, &error); + succeeded = g_file_mount_enclosing_volume_finish (G_FILE (object), res, &globs->mount_error); - if (! succeeded) { - g_print ("(EE) Error mounting location: %s\n", error->message); - globs->mount_result = g_error_to_TVFSResult (error); - g_error_free (error); - } - else { - globs->mount_result = cVFS_OK; + if (! succeeded) + g_print ("(EE) Error mounting location: %s\n", globs->mount_error->message); + else g_print ("(II) Mount successful.\n"); - } g_main_loop_quit (globs->mount_main_loop); } -static TVFSResult +static GError * vfs_handle_mount (struct TVFSGlobs *globs, GFile *file) { GMountOperation *op; @@ -277,7 +215,7 @@ vfs_handle_mount (struct TVFSGlobs *globs, GFile *file) op = g_mount_operation_new (); g_signal_connect (op, "ask-password", (GCallback)ask_password_cb, globs); g_signal_connect (op, "ask-question", (GCallback)ask_question_cb, globs); - globs->mount_result = cVFS_Failed; + globs->mount_error = NULL; globs->mount_try = 0; /* Inspiration taken from Bastien Nocera's http://svn.gnome.org/viewvc/totem-pl-parser/trunk/plparse/totem-disc.c?view=markup */ @@ -289,7 +227,7 @@ vfs_handle_mount (struct TVFSGlobs *globs, GFile *file) globs->mount_main_loop = NULL; g_object_unref (op); - return globs->mount_result; + return globs->mount_error; } @@ -407,13 +345,12 @@ VFSGetNetworkServices () } -TVFSResult -VFSOpenURI (struct TVFSGlobs *globs, const char *sURI) +gboolean +VFSOpenURI (struct TVFSGlobs *globs, const char *sURI, GError **error) { GFile *f, *f2; GFileInfo *info; - GError *error; - TVFSResult res; + GError *local_error; globs->file = NULL; globs->ftp_anonymous = FALSE; @@ -427,49 +364,49 @@ VFSOpenURI (struct TVFSGlobs *globs, const char *sURI) f = g_file_new_for_commandline_arg (sURI); while (1) { - error = NULL; + local_error = NULL; info = g_file_query_info (f, CONST_DEFAULT_QUERY_INFO_ATTRIBUTES, - G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, &error); + G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, &local_error); /* Fallback to parent directory if specified path doesn't exist */ - if (error && g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND)) { + if (local_error && g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND)) { f2 = g_file_get_parent (f); if (f2) { g_object_unref (f); f = f2; - g_error_free (error); + g_error_free (local_error); continue; } } /* Mount the target */ - if (error && g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_MOUNTED)) { - g_error_free (error); - error = NULL; - res = vfs_handle_mount (globs, f); - if (res != cVFS_OK) - return res; + if (local_error && g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_NOT_MOUNTED)) { + g_error_free (local_error); + local_error = vfs_handle_mount (globs, f); + if (local_error != NULL) { + g_propagate_error (error, local_error); + return FALSE; + } else continue; } /* Any other errors --> report */ - if (error) { - g_print ("(EE) VFSOpenURI: g_file_query_info() error: %s\n", error->message); - res = g_error_to_TVFSResult (error); - g_error_free (error); + if (local_error) { + g_print ("(EE) VFSOpenURI: g_file_query_info() error: %s\n", local_error->message); + g_propagate_error (error, local_error); g_object_unref (f); - return res; + return FALSE; } /* everything ok? */ break; } globs->file = f; - return cVFS_OK; + return TRUE; } -TVFSResult -VFSClose (struct TVFSGlobs *globs) +gboolean +VFSClose (struct TVFSGlobs *globs, GError **error) { g_print ("(II) VFSClose\n"); @@ -477,7 +414,7 @@ VFSClose (struct TVFSGlobs *globs) g_object_unref (globs->file); globs->file = NULL; - return cVFS_OK; + return TRUE; } @@ -531,12 +468,11 @@ VFSGetPathURI (struct TVFSGlobs *globs) } -TVFSResult +void VFSGetFileSystemInfo (struct TVFSGlobs *globs, const char *APath, gint64 *FSSize, gint64 *FSFree, char **FSLabel) { GFileInfo *info; GError *error; - TVFSResult res; if (FSSize) *FSSize = -1; @@ -546,44 +482,41 @@ VFSGetFileSystemInfo (struct TVFSGlobs *globs, const char *APath, gint64 *FSSize *FSLabel = NULL; if (globs->file == NULL) - return cVFS_Failed; + return; error = NULL; info = g_file_query_filesystem_info (globs->file, G_FILE_ATTRIBUTE_FILESYSTEM_SIZE "," G_FILE_ATTRIBUTE_FILESYSTEM_FREE, NULL, &error); if (error) { g_print ("(EE) VFSGetFileSystemInfo: %s\n", error->message); g_error_free (error); - res = cVFS_Failed; } else { if (FSSize) *FSSize = g_file_info_get_attribute_uint64 (info, G_FILE_ATTRIBUTE_FILESYSTEM_SIZE); if (FSFree) *FSFree = g_file_info_get_attribute_uint64 (info, G_FILE_ATTRIBUTE_FILESYSTEM_FREE); - res = cVFS_OK; } if (info) g_object_unref (info); - return res; } /**************************************************************************************************************************************/ /**************************************************************************************************************************************/ -TVFSResult -VFSChangeDir (struct TVFSGlobs *globs, const char *NewPath) +gboolean +VFSChangeDir (struct TVFSGlobs *globs, const char *NewPath, GError **error) { GFile *f; GFileEnumerator *en; - GError *error, *error_shortcut; - TVFSResult res; + GError *local_error; GFileInfo *info; gchar *target_uri; if (globs->file == NULL) { g_print ("(EE) VFSChangeDir: globs->file == NULL !\n"); - return cVFS_Failed; + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, "globs->file == NULL"); + return FALSE; } g_print ("(II) VFSChangeDir: changing dir to '%s'\n", NewPath); @@ -591,20 +524,19 @@ VFSChangeDir (struct TVFSGlobs *globs, const char *NewPath) f = g_file_resolve_relative_path (globs->file, NewPath); if (f == NULL) { g_print ("(EE) VFSChangeDir: g_file_resolve_relative_path() failed.\n"); - return cVFS_Failed; + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, "Cannot resolve relative path."); + return FALSE; } - res = cVFS_OK; while (1) { - error = NULL; + local_error = NULL; en = g_file_enumerate_children (f, CONST_DEFAULT_QUERY_INFO_ATTRIBUTES, - G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, &error); + G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, &local_error); /* if the target is shortcut, change the URI */ - if (error && g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_DIRECTORY)) { - error_shortcut = NULL; + if (local_error && g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_NOT_DIRECTORY)) { info = g_file_query_info (f, G_FILE_ATTRIBUTE_STANDARD_TARGET_URI, - G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, &error_shortcut); + G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, NULL); if (info) { target_uri = g_strdup (g_file_info_get_attribute_string (info, G_FILE_ATTRIBUTE_STANDARD_TARGET_URI)); g_object_unref (info); @@ -613,31 +545,29 @@ VFSChangeDir (struct TVFSGlobs *globs, const char *NewPath) g_object_unref (f); f = g_file_new_for_uri (target_uri); g_free (target_uri); - g_error_free (error); + g_error_free (local_error); continue; } } - if (error_shortcut) - g_error_free (error_shortcut); } /* Mount the target */ - if (error && g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_MOUNTED)) { - g_error_free (error); - res = vfs_handle_mount (globs, f); - if (res != cVFS_OK) { + if (local_error && g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_NOT_MOUNTED)) { + g_error_free (local_error); + local_error = vfs_handle_mount (globs, f); + if (local_error != NULL) { g_object_unref (f); - return res; + g_propagate_error (error, local_error); + return FALSE; } else continue; } /* Any other errors --> report */ - if (error) { - g_print ("(EE) VFSChangeDir: g_file_enumerate_children() error: %s\n", error->message); - res = g_error_to_TVFSResult (error); - g_error_free (error); + if (local_error) { + g_print ("(EE) VFSChangeDir: g_file_enumerate_children() error: %s\n", local_error->message); + g_propagate_error (error, local_error); g_object_unref (f); - return res; + return FALSE; } /* everything ok? */ break; @@ -648,22 +578,23 @@ VFSChangeDir (struct TVFSGlobs *globs, const char *NewPath) g_object_unref (globs->file); globs->file = f; - return res; + return TRUE; } /**************************************************************************************************************************************/ /**************************************************************************************************************************************/ -static void -g_file_info_to_TVFSItem (GFileInfo *info, struct TVFSItem *Item, GFile *reference_file, gboolean follow_symlinks, gboolean add_full_path) +static struct TVFSItem * +g_file_info_to_TVFSItem (GFileInfo *info, GFile *reference_file, gboolean follow_symlinks, gboolean add_full_path) { GFileInfo *symlink_info = NULL; GError *error; + struct TVFSItem *Item; g_assert (info != NULL); - g_assert (Item != NULL); + Item = g_malloc0 (sizeof (struct TVFSItem)); if (add_full_path) { Item->FName = get_absolute_path (reference_file); if (Item->FName == NULL) @@ -727,55 +658,60 @@ g_file_info_to_TVFSItem (GFileInfo *info, struct TVFSItem *Item, GFile *referenc if (symlink_info) g_object_unref (symlink_info); + + return Item; } -TVFSResult -VFSListNext (struct TVFSGlobs *globs, struct TVFSItem *Item) + +struct TVFSItem * +VFSListNext (struct TVFSGlobs *globs, GError **error) { - GError *error; GFileInfo *info; - TVFSResult res; GFile *f; + GError *local_error; + struct TVFSItem *Item; if (globs->file == NULL) { g_print ("(EE) VFSListNext: globs->file == NULL !\n"); - return cVFS_Failed; + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, "globs->file == NULL"); + return NULL; } if (globs->enumerator == NULL) { g_print ("(EE) VFSListNext: globs->enumerator == NULL !\n"); - return cVFS_Failed; + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, "globs->enumerator == NULL"); + return NULL; } - error = NULL; - info = g_file_enumerator_next_file (globs->enumerator, NULL, &error); - if (error) { - g_print ("(EE) VFSListNext: g_file_enumerator_next_file() error: %s\n", error->message); - res = g_error_to_TVFSResult (error); - g_error_free (error); - return res; + local_error = NULL; + info = g_file_enumerator_next_file (globs->enumerator, NULL, &local_error); + if (local_error) { + g_print ("(EE) VFSListNext: g_file_enumerator_next_file() error: %s\n", local_error->message); + g_propagate_error (error, local_error); + return FALSE; } - if (! error && ! info) - return cVFS_No_More_Files; + if (! info) + return NULL; f = g_file_get_child (globs->enumerated_file, g_file_info_get_name (info)); - g_file_info_to_TVFSItem (info, Item, f, globs->enum_follow_symlinks, globs->enum_add_full_path); + Item = g_file_info_to_TVFSItem (info, f, globs->enum_follow_symlinks, globs->enum_add_full_path); g_object_unref (f); g_object_unref (info); - return cVFS_OK; + return Item; } -TVFSResult -VFSListFirst (struct TVFSGlobs *globs, const char *sDir, struct TVFSItem *Item, gboolean FollowSymlinks, gboolean AddFullPath) + +struct TVFSItem * +VFSListFirst (struct TVFSGlobs *globs, const char *sDir, gboolean FollowSymlinks, gboolean AddFullPath, GError **error) { GFile *list_file; - GError *error; - TVFSResult res; + GError *local_error; list_file = g_file_resolve_relative_path (globs->file, sDir); if (! list_file) { g_print ("(EE) VFSListFirst: list_file == NULL !\n"); - return cVFS_Failed; + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, "Cannot resolve relative path."); + return NULL; } if (globs->enumerator == NULL || ! g_file_equal (globs->file, list_file)) { @@ -787,15 +723,14 @@ VFSListFirst (struct TVFSGlobs *globs, const char *sDir, struct TVFSItem *Item, if (globs->enumerated_file) g_object_unref (globs->enumerated_file); globs->enumerated_file = NULL; - error = NULL; + local_error = NULL; globs->enumerator = g_file_enumerate_children (list_file, CONST_DEFAULT_QUERY_INFO_ATTRIBUTES, - G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, &error); - if (error) { - g_print ("(EE) VFSListFirst: g_file_enumerate_children() error: %s\n", error->message); - res = g_error_to_TVFSResult (error); - g_error_free (error); + G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, &local_error); + if (local_error) { + g_print ("(EE) VFSListFirst: g_file_enumerate_children() error: %s\n", local_error->message); + g_propagate_error (error, local_error); g_object_unref (list_file); - return res; + return NULL; } globs->enumerated_file = g_object_ref (list_file); } @@ -803,320 +738,331 @@ VFSListFirst (struct TVFSGlobs *globs, const char *sDir, struct TVFSItem *Item, globs->enum_add_full_path = AddFullPath; g_object_unref (list_file); - return VFSListNext (globs, Item); + return VFSListNext (globs, error); } -TVFSResult -VFSListClose (struct TVFSGlobs *globs) + +gboolean +VFSListClose (struct TVFSGlobs *globs, GError **error) { - GError *error; - TVFSResult res; + GError *local_error; if (globs->enumerator == NULL) { g_print ("(EE) VFSListClose: globs->enumerator == NULL !\n"); - return cVFS_Failed; + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, "globs->enumerator == NULL"); + return FALSE; } g_print ("(II) VFSListClose\n"); - error = NULL; - g_file_enumerator_close (globs->enumerator, NULL, &error); + local_error = NULL; + g_file_enumerator_close (globs->enumerator, NULL, &local_error); g_object_unref (globs->enumerator); globs->enumerator = NULL; g_object_unref (globs->enumerated_file); globs->enumerated_file = NULL; - if (error) { - g_print ("(EE) VFSListClose: g_file_enumerator_close() error: %s\n", error->message); - res = g_error_to_TVFSResult (error); - g_error_free (error); - return res; + if (local_error) { + g_print ("(EE) VFSListClose: g_file_enumerator_close() error: %s\n", local_error->message); + g_propagate_error (error, local_error); + return FALSE; } - return cVFS_OK; + return TRUE; } /**************************************************************************************************************************************/ /**************************************************************************************************************************************/ -TVFSResult -VFSFileInfo (struct TVFSGlobs *globs, const char *AFileName, struct TVFSItem *Item, gboolean FollowSymlinks, gboolean AddFullPath) +struct TVFSItem * +VFSFileInfo (struct TVFSGlobs *globs, const char *AFileName, gboolean FollowSymlinks, gboolean AddFullPath, GError **error) { GFile *f; - GError *error; + GError *local_error; GFileInfo *info; - TVFSResult res; + struct TVFSItem *Item; if (globs->file == NULL) { g_print ("(EE) VFSFileInfo: globs->file == NULL !\n"); - return cVFS_Failed; + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, "globs->file == NULL"); + return NULL; } f = g_file_resolve_relative_path (globs->file, AFileName); if (f == NULL) { g_print ("(EE) VFSMkDir: g_file_resolve_relative_path() failed.\n"); - return cVFS_Failed; + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, "Cannot resolve relative path."); + return NULL; } - error = NULL; + local_error = NULL; info = g_file_query_info (f, CONST_DEFAULT_QUERY_INFO_ATTRIBUTES, - G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, &error); - if (error) { - g_print ("(EE) VFSFileInfo: g_file_query_info() error: %s\n", error->message); - res = g_error_to_TVFSResult (error); - g_error_free (error); + G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, &local_error); + if (local_error) { + g_print ("(EE) VFSFileInfo: g_file_query_info() error: %s\n", local_error->message); + g_propagate_error (error, local_error); g_object_unref (f); - return res; + return NULL; } - g_file_info_to_TVFSItem (info, Item, f, FollowSymlinks, AddFullPath); + Item = g_file_info_to_TVFSItem (info, f, FollowSymlinks, AddFullPath); + g_object_unref (info); g_object_unref (f); - return cVFS_OK; + return Item; } -TVFSResult -VFSMkDir (struct TVFSGlobs *globs, const char *sDirName) + +gboolean +VFSMkDir (struct TVFSGlobs *globs, const char *sDirName, GError **error) { GFile *f; - GError *error; - TVFSResult res; + GError *local_error; if (globs->file == NULL) { g_print ("(EE) VFSMkDir: globs->file == NULL !\n"); - return cVFS_Failed; + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, "globs->file == NULL"); + return FALSE; } f = g_file_resolve_relative_path (globs->file, sDirName); if (f == NULL) { g_print ("(EE) VFSMkDir: g_file_resolve_relative_path() failed.\n"); - return cVFS_Failed; + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, "Cannot resolve relative path."); + return FALSE; } - error = NULL; - g_file_make_directory (f, NULL, &error); + local_error = NULL; + g_file_make_directory (f, NULL, &local_error); g_object_unref (f); - if (error) { - g_print ("(EE) VFSMkDir: g_file_make_directory() error: %s\n", error->message); - res = g_error_to_TVFSResult (error); - g_error_free (error); - return res; + if (local_error) { + g_print ("(EE) VFSMkDir: g_file_make_directory() error: %s\n", local_error->message); + g_propagate_error (error, local_error); + return FALSE; } - return cVFS_OK; + return TRUE; } -TVFSResult -VFSRemove (struct TVFSGlobs *globs, const char *APath) + +gboolean +VFSRemove (struct TVFSGlobs *globs, const char *APath, GError **error) { GFile *f; - GError *error; - TVFSResult res; + GError *local_error; if (globs->file == NULL) { g_print ("(EE) VFSRemove: globs->file == NULL !\n"); - return cVFS_Failed; + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, "globs->file == NULL"); + return FALSE; } f = g_file_resolve_relative_path (globs->file, APath); if (f == NULL) { g_print ("(EE) VFSRemove: g_file_resolve_relative_path() failed.\n"); - return cVFS_Failed; + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, "Cannot resolve relative path."); + return FALSE; } - error = NULL; - g_file_delete (f, NULL, &error); + local_error = NULL; + g_file_delete (f, NULL, &local_error); g_object_unref (f); - if (error) { - g_print ("(EE) VFSRemove: g_file_delete() error: %s\n", error->message); - res = g_error_to_TVFSResult (error); - g_error_free (error); - return res; + if (local_error) { + g_print ("(EE) VFSRemove: g_file_delete() error: %s\n", local_error->message); + g_propagate_error (error, local_error); + return FALSE; } - return cVFS_OK; + return TRUE; } -TVFSResult -VFSRename (struct TVFSGlobs *globs, const char *sSrcName, const char *sDstName) + +gboolean +VFSRename (struct TVFSGlobs *globs, const char *sSrcName, const char *sDstName, GError **error) { GFile *src, *dst; - GError *error; - TVFSResult res; + GError *local_error; if (globs->file == NULL) { g_print ("(EE) VFSRename: globs->file == NULL !\n"); - return cVFS_Failed; + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, "globs->file == NULL"); + return FALSE; } src = g_file_resolve_relative_path (globs->file, sSrcName); if (src == NULL) { g_print ("(EE) VFSRename: g_file_resolve_relative_path() failed.\n"); - return cVFS_Failed; + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, "Cannot resolve relative path."); + return FALSE; } g_print ("VFSRename: '%s' --> '%s'\n", sSrcName, sDstName); - error = NULL; - g_file_set_display_name (src, sDstName, NULL, &error); - if (error) { - g_print ("(WW) VFSRename: g_file_set_display_name() failed (\"%s\"), using fallback g_file_move()\n", error->message); - g_error_free (error); + local_error = NULL; + g_file_set_display_name (src, sDstName, NULL, &local_error); + if (local_error) { + g_print ("(WW) VFSRename: g_file_set_display_name() failed (\"%s\"), using fallback g_file_move()\n", local_error->message); + g_error_free (local_error); dst = g_file_resolve_relative_path (src, sDstName); if (dst == NULL) { g_print ("(EE) VFSRename: g_file_resolve_relative_path() failed.\n"); + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, "Cannot resolve relative path for target file."); g_object_unref (src); - return cVFS_Failed; + return FALSE; } - error = NULL; - g_file_move (src, dst, G_FILE_COPY_NO_FALLBACK_FOR_MOVE, NULL, NULL, NULL, &error); - if (error) { - g_print ("(EE) VFSRename: g_file_move() error: %s\n", error->message); - res = g_error_to_TVFSResult (error); - g_error_free (error); + + local_error = NULL; + g_file_move (src, dst, G_FILE_COPY_NO_FALLBACK_FOR_MOVE, NULL, NULL, NULL, &local_error); + if (local_error) { + g_print ("(EE) VFSRename: g_file_move() error: %s\n", local_error->message); + g_propagate_error (error, local_error); g_object_unref (src); g_object_unref (dst); - return res; + return FALSE; } g_object_unref (dst); } g_object_unref (src); - return cVFS_OK; + return TRUE; } -TVFSResult -VFSMakeSymLink (struct TVFSGlobs *globs, const char *NewFileName, const char *PointTo) + +gboolean +VFSMakeSymLink (struct TVFSGlobs *globs, const char *NewFileName, const char *PointTo, GError **error) { GFile *f; - GError *error; - TVFSResult res; + GError *local_error; if (globs->file == NULL) { g_print ("(EE) VFSMakeSymLink: globs->file == NULL !\n"); - return cVFS_Failed; + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, "globs->file == NULL"); + return FALSE; } f = g_file_resolve_relative_path (globs->file, NewFileName); if (f == NULL) { g_print ("(EE) VFSMakeSymLink: g_file_resolve_relative_path() failed.\n"); - return cVFS_Failed; + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, "Cannot resolve relative path."); + return FALSE; } - error = NULL; - g_file_make_symbolic_link (f, PointTo, NULL, &error); + local_error = NULL; + g_file_make_symbolic_link (f, PointTo, NULL, &local_error); g_object_unref (f); - if (error) { - g_print ("(EE) VFSMakeSymLink: g_file_make_symbolic_link() error: %s\n", error->message); - res = g_error_to_TVFSResult (error); - g_error_free (error); - return res; + if (local_error) { + g_print ("(EE) VFSMakeSymLink: g_file_make_symbolic_link() error: %s\n", local_error->message); + g_propagate_error (error, local_error); + return FALSE; } - return cVFS_OK; + return TRUE; } -TVFSResult -VFSChmod (struct TVFSGlobs *globs, const char *FileName, guint32 Mode) + +gboolean +VFSChmod (struct TVFSGlobs *globs, const char *FileName, guint32 Mode, GError **error) { GFile *f; - GError *error; - TVFSResult res; + GError *local_error; if (globs->file == NULL) { g_print ("(EE) VFSChmod: globs->file == NULL !\n"); - return cVFS_Failed; + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, "globs->file == NULL"); + return FALSE; } f = g_file_resolve_relative_path (globs->file, FileName); if (f == NULL) { g_print ("(EE) VFSChmod: g_file_resolve_relative_path() failed.\n"); - return cVFS_Failed; + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, "Cannot resolve relative path."); + return FALSE; } -// g_print ("(II) VFSChmod (%s, %d): Going to set permissions on '%s'\n", FileName, Mode, g_file_get_uri (f)); - error = NULL; - g_file_set_attribute_uint32 (f, G_FILE_ATTRIBUTE_UNIX_MODE, Mode, G_FILE_QUERY_INFO_NONE, NULL, &error); + local_error = NULL; + g_file_set_attribute_uint32 (f, G_FILE_ATTRIBUTE_UNIX_MODE, Mode, G_FILE_QUERY_INFO_NONE, NULL, &local_error); g_object_unref (f); - if (error) { - g_print ("(EE) VFSChmod: g_file_set_attribute_uint32() error: %s\n", error->message); - res = g_error_to_TVFSResult (error); - g_error_free (error); - return res; + if (local_error) { + g_print ("(EE) VFSChmod: g_file_set_attribute_uint32() error: %s\n", local_error->message); + g_propagate_error (error, local_error); + return FALSE; } - return cVFS_OK; + return TRUE; } -TVFSResult -VFSChown (struct TVFSGlobs *globs, const char *FileName, guint32 UID, guint32 GID) + +gboolean +VFSChown (struct TVFSGlobs *globs, const char *FileName, guint32 UID, guint32 GID, GError **error) { GFile *f; - GError *error; - TVFSResult res; + GError *local_error; if (globs->file == NULL) { g_print ("(EE) VFSChown: globs->file == NULL !\n"); - return cVFS_Failed; + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, "globs->file == NULL"); + return FALSE; } f = g_file_resolve_relative_path (globs->file, FileName); if (f == NULL) { g_print ("(EE) VFSChown: g_file_resolve_relative_path() failed.\n"); - return cVFS_Failed; + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, "Cannot resolve relative path."); + return FALSE; } - error = NULL; - g_file_set_attribute_uint32 (f, G_FILE_ATTRIBUTE_UNIX_UID, UID, G_FILE_QUERY_INFO_NONE, NULL, &error); - if (error) { - g_print ("(EE) VFSChown: g_file_set_attribute_uint32() error: %s\n", error->message); - res = g_error_to_TVFSResult (error); - g_error_free (error); + local_error = NULL; + g_file_set_attribute_uint32 (f, G_FILE_ATTRIBUTE_UNIX_UID, UID, G_FILE_QUERY_INFO_NONE, NULL, &local_error); + if (local_error) { + g_print ("(EE) VFSChown: g_file_set_attribute_uint32() error: %s\n", local_error->message); + g_propagate_error (error, local_error); g_object_unref (f); - return res; + return FALSE; } - error = NULL; - g_file_set_attribute_uint32 (f, G_FILE_ATTRIBUTE_UNIX_GID, GID, G_FILE_QUERY_INFO_NONE, NULL, &error); - if (error) { - g_print ("(EE) VFSChown: g_file_set_attribute_uint32() error: %s\n", error->message); - res = g_error_to_TVFSResult (error); - g_error_free (error); + local_error = NULL; + g_file_set_attribute_uint32 (f, G_FILE_ATTRIBUTE_UNIX_GID, GID, G_FILE_QUERY_INFO_NONE, NULL, &local_error); + if (local_error) { + g_print ("(EE) VFSChown: g_file_set_attribute_uint32() error: %s\n", local_error->message); + g_propagate_error (error, local_error); g_object_unref (f); - return res; + return FALSE; } g_object_unref (f); - return cVFS_OK; + return TRUE; } -TVFSResult -VFSChangeTimes (struct TVFSGlobs *globs, const char *APath, guint32 mtime, guint32 atime) + +gboolean +VFSChangeTimes (struct TVFSGlobs *globs, const char *APath, guint32 mtime, guint32 atime, GError **error) { GFile *f; - GError *error; - TVFSResult res; + GError *local_error; if (globs->file == NULL) { g_print ("(EE) VFSChangeTimes: globs->file == NULL !\n"); - return cVFS_Failed; + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, "globs->file == NULL"); + return FALSE; } f = g_file_resolve_relative_path (globs->file, APath); if (f == NULL) { g_print ("(EE) VFSChangeTimes: g_file_resolve_relative_path() failed.\n"); - return cVFS_Failed; + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, "Cannot resolve relative path."); + return FALSE; } - error = NULL; - g_file_set_attribute_uint64 (f, G_FILE_ATTRIBUTE_TIME_MODIFIED, mtime, G_FILE_QUERY_INFO_NONE, NULL, &error); - if (error) { - g_print ("(EE) VFSChangeTimes: g_file_set_attribute_uint64() error: %s\n", error->message); - res = g_error_to_TVFSResult (error); - g_error_free (error); + /* TODO: add nanoseconds */ + /* TODO: change to g_file_set_attributes_from_info () */ + local_error = NULL; + g_file_set_attribute_uint64 (f, G_FILE_ATTRIBUTE_TIME_MODIFIED, mtime, G_FILE_QUERY_INFO_NONE, NULL, &local_error); + if (local_error) { + g_print ("(EE) VFSChangeTimes: g_file_set_attribute_uint64() error: %s\n", local_error->message); + g_propagate_error (error, local_error); g_object_unref (f); - return res; + return FALSE; } - error = NULL; - g_file_set_attribute_uint64 (f, G_FILE_ATTRIBUTE_TIME_ACCESS, atime, G_FILE_QUERY_INFO_NONE, NULL, &error); - if (error) { - g_print ("(EE) VFSChangeTimes: g_file_set_attribute_uint64() error: %s\n", error->message); - g_error_free (error); + local_error = NULL; + g_file_set_attribute_uint64 (f, G_FILE_ATTRIBUTE_TIME_ACCESS, atime, G_FILE_QUERY_INFO_NONE, NULL, &local_error); + if (local_error) { + g_print ("(EE) VFSChangeTimes: g_file_set_attribute_uint64() error: %s\n", local_error->message); + g_error_free (local_error); /* Silently drop the error, atime is not commonly supported on most systems */ } g_object_unref (f); - return cVFS_OK; + return TRUE; } @@ -1212,6 +1158,7 @@ VFSBreakGetDirSize (struct TVFSGlobs *globs) /**************************************************************************************************************************************/ /**************************************************************************************************************************************/ +#if 0 TVFSFileDes VFSOpenFile (struct TVFSGlobs *globs, const char *APath, int Mode, int *Error) { @@ -1246,6 +1193,8 @@ VFSWriteFile (struct TVFSGlobs *globs, TVFSFileDes FileDescriptor, gpointer Buff printf("(WW) VFSWriteFile: Not supported in GVFS plugin.\n"); return cVFS_Not_Supported; } +#endif + void VFSSetBlockSize (struct TVFSGlobs *globs, guint32 Value) @@ -1254,6 +1203,7 @@ VFSSetBlockSize (struct TVFSGlobs *globs, guint32 Value) globs->block_size = Value; } + gboolean VFSIsOnSameFS (struct TVFSGlobs *globs, const char *Path1, const char *Path2, gboolean FollowSymlinks) { @@ -1313,6 +1263,7 @@ VFSIsOnSameFS (struct TVFSGlobs *globs, const char *Path1, const char *Path2, gb return res; } + gboolean VFSTwoSameFiles (struct TVFSGlobs *globs, const char *Path1, const char *Path2, gboolean FollowSymlinks) { @@ -1361,51 +1312,48 @@ vfs_copy_progress_callback (goffset current_num_bytes, globs = (struct TVFSGlobs *)user_data; if (globs->callback_progress) { - if (! globs->callback_progress (current_num_bytes, total_num_bytes, globs->callback_data)) + if (! globs->callback_progress (current_num_bytes, NULL, globs->callback_data)) g_cancellable_cancel (globs->cancellable); } } #define TUXCMD_DEFAULT_COPY_FLAGS G_FILE_COPY_OVERWRITE | G_FILE_COPY_NOFOLLOW_SYMLINKS | G_FILE_COPY_ALL_METADATA -TVFSResult -VFSCopyToLocal (struct TVFSGlobs *globs, const char *sSrcName, const char *sDstName, gboolean Append) +gboolean +VFSCopyToLocal (struct TVFSGlobs *globs, const char *sSrcName, const char *sDstName, gboolean Append, GError **error) { GFile *src, *dst; - GError *error; - TVFSResult res; - + GError *local_error; + gboolean res; if (globs->file == NULL) { g_print ("(EE) VFSCopyToLocal: globs->file == NULL !\n"); - return cVFS_Failed; + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, "globs->file == NULL"); + return FALSE; } g_print ("(II) VFSCopyToLocal: '%s' --> '%s'\n", sSrcName, sDstName); - src = g_file_resolve_relative_path (globs->file, sSrcName); if (src == NULL) { g_print ("(EE) VFSCopyToLocal: g_file_resolve_relative_path() failed.\n"); - return cVFS_Failed; + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, "Cannot resolve relative path for source file."); + return FALSE; } dst = g_file_new_for_path (sDstName); if (dst == NULL) { g_print ("(EE) VFSCopyToLocal: g_file_resolve_relative_path() failed.\n"); - return cVFS_Failed; + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, "Cannot get target file."); + return FALSE; } + res = TRUE; + local_error = NULL; globs->cancellable = g_cancellable_new (); - - res = cVFS_OK; - error = NULL; - g_file_copy (src, dst, TUXCMD_DEFAULT_COPY_FLAGS, globs->cancellable, vfs_copy_progress_callback, globs, &error); - if (error) { - g_print ("(EE) VFSCopyToLocal: g_file_copy() error: %s\n", error->message); -// res = g_error_to_TVFSResult (error); - if (error->code == G_IO_ERROR_CANCELLED) - res = cVFS_Cancelled; - else res = cVFS_ReadErr; - g_error_free (error); + g_file_copy (src, dst, TUXCMD_DEFAULT_COPY_FLAGS, globs->cancellable, vfs_copy_progress_callback, globs, &local_error); + if (local_error) { + g_print ("(EE) VFSCopyToLocal: g_file_copy() error: %s\n", local_error->message); + g_propagate_error (error, local_error); + res = FALSE; } g_object_unref (globs->cancellable); @@ -1414,45 +1362,45 @@ VFSCopyToLocal (struct TVFSGlobs *globs, const char *sSrcName, const char *sDstN return res; } -TVFSResult -VFSCopyFromLocal (struct TVFSGlobs *globs, const char *sSrcName, const char *sDstName, gboolean Append) + +gboolean +VFSCopyFromLocal (struct TVFSGlobs *globs, const char *sSrcName, const char *sDstName, gboolean Append, GError **error) { GFile *src, *dst; - GError *error; - TVFSResult res; - + GError *local_error; + gboolean res; if (globs->file == NULL) { g_print ("(EE) VFSCopyFromLocal: globs->file == NULL !\n"); - return cVFS_Failed; + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, "globs->file == NULL"); + return FALSE; } g_print ("(II) VFSCopyFromLocal: '%s' --> '%s'\n", sSrcName, sDstName); - src = g_file_new_for_path (sSrcName); if (src == NULL) { g_print ("(EE) VFSCopyFromLocal: g_file_resolve_relative_path() failed.\n"); - return cVFS_Failed; + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, "Cannot get source file."); + return FALSE; } dst = g_file_resolve_relative_path (globs->file, sDstName); if (dst == NULL) { g_print ("(EE) VFSCopyFromLocal: g_file_resolve_relative_path() failed.\n"); - return cVFS_Failed; + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, "Cannot resolve relative path for target file."); + return FALSE; } globs->cancellable = g_cancellable_new (); - res = cVFS_OK; - error = NULL; + res = TRUE; + local_error = NULL; + globs->cancellable = g_cancellable_new (); /* FIXME: Appending not supported */ - g_file_copy (src, dst, TUXCMD_DEFAULT_COPY_FLAGS, globs->cancellable, vfs_copy_progress_callback, globs, &error); - if (error) { - g_print ("(EE) VFSCopyFromLocal: g_file_copy() error: %s\n", error->message); -// res = g_error_to_TVFSResult (error); - if (error->code == G_IO_ERROR_CANCELLED) - res = cVFS_Cancelled; - else res = cVFS_WriteErr; - g_error_free (error); + g_file_copy (src, dst, TUXCMD_DEFAULT_COPY_FLAGS, globs->cancellable, vfs_copy_progress_callback, globs, &local_error); + if (local_error) { + g_print ("(EE) VFSCopyFromLocal: g_file_copy() error: %s\n", local_error->message); + g_propagate_error (error, local_error); + res = FALSE; } g_object_unref (globs->cancellable); |
