summaryrefslogtreecommitdiff
path: root/gvfs/gvfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'gvfs/gvfs.c')
-rw-r--r--gvfs/gvfs.c638
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);