diff options
author | Philip Langdale <philipl@overt.org> | 2012-10-13 14:27:03 -0700 |
---|---|---|
committer | Philip Langdale <philipl@overt.org> | 2013-01-11 20:30:49 -0800 |
commit | 72fe42f0781c29f5c426896bd37e9d2e7b7b9bce (patch) | |
tree | a7be33510c6b2afa6a9118cb51b56fb15b6093a7 | |
parent | 1751084b681cc6294b250880ef33d89d11ac50e3 (diff) | |
download | gvfs-72fe42f0781c29f5c426896bd37e9d2e7b7b9bce.tar.gz |
MTP: Use do_make_directory to handle an attempt to upload a directory.
It's better than nothing.
-rw-r--r-- | daemon/gvfsbackendmtp.c | 107 |
1 files changed, 57 insertions, 50 deletions
diff --git a/daemon/gvfsbackendmtp.c b/daemon/gvfsbackendmtp.c index cd0a55f1..8e3d621a 100644 --- a/daemon/gvfsbackendmtp.c +++ b/daemon/gvfsbackendmtp.c @@ -53,6 +53,7 @@ #include "gvfsjobenumerate.h" #include "gvfsdaemonprotocol.h" #include "gvfsjobcreatemonitor.h" +#include "gvfsjobmakedirectory.h" #include "gvfsmonitor.h" @@ -904,6 +905,51 @@ static int mtp_progress (uint64_t const sent, uint64_t const total, } static void +do_make_directory (GVfsBackend *backend, + GVfsJobMakeDirectory *job, + const char *filename) +{ + DEBUG ("(I) do_make_directory (filename = %s) ", filename); + g_mutex_lock (&G_VFS_BACKEND_MTP(backend)->mutex); + + gchar **elements = g_strsplit_set(filename, "/", -1); + unsigned int ne = 0; + for (ne = 0; elements[ne] != NULL; ne++); + + if (ne < 3) { + g_vfs_job_failed (G_VFS_JOB (job), + G_IO_ERROR, G_IO_ERROR_FAILED, + _("Cannot make directory in this location")); + goto exit; + } + + LIBMTP_mtpdevice_t *device; + device = G_VFS_BACKEND_MTP(backend)->device; + + int parent_id = 0; + if (ne > 3) { + parent_id = strtol(elements[ne-2], NULL, 10); + } + + int ret = LIBMTP_Create_Folder(device, elements[ne-1], parent_id, strtol(elements[1], NULL, 10)); + if (ret == 0) { + fail_job(G_VFS_JOB(job), device); + goto exit; + } + + g_vfs_job_succeeded (G_VFS_JOB (job)); + + g_hash_table_foreach(G_VFS_BACKEND_MTP(backend)->monitors, emit_create_event, (char *)filename); + + exit: + g_strfreev(elements); + g_mutex_unlock (&G_VFS_BACKEND_MTP(backend)->mutex); + + DEBUG ("(I) do_make_directory done."); +} + + +static void do_pull(GVfsBackend *backend, GVfsJobPull *job, const char *source, @@ -989,11 +1035,6 @@ do_pull(GVfsBackend *backend, static void -do_make_directory (GVfsBackend *backend, - GVfsJobMakeDirectory *job, - const char *filename); - -static void do_push(GVfsBackend *backend, GVfsJobPush *job, const char *destination, @@ -1036,6 +1077,17 @@ do_push(GVfsBackend *backend, goto exit; } + if (g_file_query_file_type(file, G_FILE_QUERY_INFO_NONE, + G_VFS_JOB(job)->cancellable) == + G_FILE_TYPE_DIRECTORY) { + /* + * It happens to be the case that we can reuse do_make_directory + * here. + */ + return do_make_directory(backend, G_VFS_JOB_MAKE_DIRECTORY(job), + elements[ne-1]); + } + GError *error = NULL; info = g_file_query_info(file, G_FILE_ATTRIBUTE_STANDARD_SIZE, G_FILE_QUERY_INFO_NONE, G_VFS_JOB(job)->cancellable, @@ -1086,51 +1138,6 @@ do_push(GVfsBackend *backend, static void -do_make_directory (GVfsBackend *backend, - GVfsJobMakeDirectory *job, - const char *filename) -{ - DEBUG ("(I) do_make_directory (filename = %s) ", filename); - g_mutex_lock (&G_VFS_BACKEND_MTP(backend)->mutex); - - gchar **elements = g_strsplit_set(filename, "/", -1); - unsigned int ne = 0; - for (ne = 0; elements[ne] != NULL; ne++); - - if (ne < 3) { - g_vfs_job_failed (G_VFS_JOB (job), - G_IO_ERROR, G_IO_ERROR_FAILED, - _("Can't make directory in this location.")); - goto exit; - } - - LIBMTP_mtpdevice_t *device; - device = G_VFS_BACKEND_MTP(backend)->device; - - int parent_id = 0; - if (ne > 3) { - parent_id = strtol(elements[ne-2], NULL, 10); - } - - int ret = LIBMTP_Create_Folder(device, elements[ne-1], parent_id, strtol(elements[1], NULL, 10)); - if (ret == 0) { - fail_job(G_VFS_JOB(job), device); - goto exit; - } - - g_vfs_job_succeeded (G_VFS_JOB (job)); - - g_hash_table_foreach(G_VFS_BACKEND_MTP(backend)->monitors, emit_create_event, (char *)filename); - - exit: - g_strfreev(elements); - g_mutex_unlock (&G_VFS_BACKEND_MTP(backend)->mutex); - - DEBUG ("(I) do_make_directory done."); -} - - -static void do_delete (GVfsBackend *backend, GVfsJobDelete *job, const char *filename) |