diff options
author | Cédric Bosdonnat <cedric.bosdonnat@free.fr> | 2013-04-10 16:58:10 +0200 |
---|---|---|
committer | Cédric Bosdonnat <cedric.bosdonnat@free.fr> | 2013-04-10 16:58:10 +0200 |
commit | 1e679f71ce15fe9a549b654ca69b14c02ef0c88c (patch) | |
tree | c3204a083c4d1f547f9c98d1ed46238ecf79d73d | |
parent | 44cf06810a1bd6fa837b945ef8224b3b7a14278b (diff) |
CMIS backend: enumerate repositories and improved mount display name
Also got rid of the custom logger used for debugging purpose: to get the
g_print output, start gvfsd manually.
-rw-r--r-- | daemon/gvfsbackendcmis.c | 185 |
1 files changed, 145 insertions, 40 deletions
diff --git a/daemon/gvfsbackendcmis.c b/daemon/gvfsbackendcmis.c index 31b702da..20ca85cf 100644 --- a/daemon/gvfsbackendcmis.c +++ b/daemon/gvfsbackendcmis.c @@ -26,25 +26,18 @@ #include <glib/gstdio.h> #include <libcmis-c/error.h> +#include <libcmis-c/repository.h> +#include <libcmis-c/session.h> #include <libcmis-c/session-factory.h> +#include <gvfsuriutils.h> #include "gvfsbackendcmis.h" #include "gvfskeyring.h" +#include "gvfsjobenumerate.h" G_DEFINE_TYPE (GVfsBackendCmis, g_vfs_backend_cmis, G_VFS_TYPE_BACKEND) static void -logger (const gchar* domain, - GLogLevelFlags level, - const gchar* message, - gpointer data) -{ - FILE* fd = fopen ("/home/cbosdo/gvfscmisbackend.log", "a"); - fwrite (message, 1, strlen(message), fd); - fclose (fd); -} - -static void do_mount (GVfsBackend *backend, GVfsJobMount *job, GMountSpec *mount_spec, @@ -61,11 +54,13 @@ do_mount (GVfsBackend *backend, gboolean failed = FALSE; GPasswordSave password_save = G_PASSWORD_SAVE_NEVER; char *prompt = NULL; + GDecodedUri *decoded = NULL; + char *display_host = NULL; GVfsBackendCmis *cmis_backend = G_VFS_BACKEND_CMIS (backend); spec_str = g_mount_spec_to_string (mount_spec); - g_log ("cmis", G_LOG_LEVEL_DEBUG, "mount_spec: %s\n", spec_str); + g_print ("mount_spec: %s\n", spec_str); g_free (spec_str); /* In CMIS urls, the host is the url-encoded binding URL */ @@ -78,9 +73,18 @@ do_mount (GVfsBackend *backend, _("Invalid mount spec")); return; } - binding_url = g_uri_unescape_string (host, ":/"); + binding_url = g_uri_unescape_string (host, NULL); - /* TODO Get the hostname from the binding_url as display host */ + /* Get the hostname from the binding_url as display host */ + decoded = g_vfs_decode_uri (binding_url); + if (decoded && decoded->host) + { + display_host = g_strdup (decoded->host); + if (decoded) + g_vfs_decoded_uri_free (decoded); + } + else + display_host = g_strdup (binding_url); /* TODO We may have the repository ID encoded after the binding URL. both elements are separated by a '#'. */ @@ -105,11 +109,11 @@ do_mount (GVfsBackend *backend, gboolean aborted; if (username == NULL) { - prompt = g_strdup_printf (_("Enter password for %s"), binding_url); + prompt = g_strdup_printf (_("Enter password for %s"), display_host); flags |= G_ASK_PASSWORD_NEED_USERNAME; } else - prompt = g_strdup_printf (_("Enter password for %s on %s"), username, binding_url); + prompt = g_strdup_printf (_("Enter password for %s on %s"), username, display_host); if (g_vfs_keyring_is_available ()) flags |= G_ASK_PASSWORD_SAVING_SUPPORTED; @@ -141,15 +145,13 @@ do_mount (GVfsBackend *backend, /* Try to create the CMIS session */ libcmis_ErrorPtr error = libcmis_error_create (); - g_log ("cmis", G_LOG_LEVEL_DEBUG, "about to create session\n"); cmis_backend->session = libcmis_createSession (binding_url, repository_id, username, password, NULL, false, error); - g_log ("cmis", G_LOG_LEVEL_DEBUG, "createSession finished\n"); if (libcmis_error_getMessage (error) != NULL || libcmis_error_getType(error) != NULL) { const char* error_type = libcmis_error_getType (error); - g_log ("cmis", G_LOG_LEVEL_DEBUG, "Got an error when creating libcmis session: [%]%s\n", + g_print ("Got an error when creating libcmis session: [%s]%s\n", error_type, libcmis_error_getMessage(error)); g_vfs_job_failed (G_VFS_JOB (job), G_IO_ERROR, strcmp (error_type, "permissionDenied") == 0 ? @@ -175,7 +177,7 @@ do_mount (GVfsBackend *backend, g_free (prompt); } - display_name = g_strdup_printf (_("CMIS: %s on %s"), username, binding_url); + display_name = g_strdup_printf (_("CMIS: %s on %s"), username, display_host); g_vfs_backend_set_display_name (backend, display_name); g_free (display_name); @@ -195,6 +197,7 @@ do_mount (GVfsBackend *backend, g_free (username); if (password != NULL) g_free (password); + g_free (display_host); } static void @@ -215,7 +218,8 @@ do_open_for_read (GVfsBackend *backend, GVfsJobOpenForRead *job, const char *filename) { - g_print ( "TODO Implement do_open_for_read\n"); + g_print ("TODO Implement do_open_for_read\n"); + g_vfs_job_succeeded (G_VFS_JOB (job)); } static void @@ -223,7 +227,8 @@ do_close_read (GVfsBackend * backend, GVfsJobCloseRead *job, GVfsBackendHandle handle) { - g_print ( "TODO Implement do_close_read\n"); + g_print ("TODO Implement do_close_read\n"); + g_vfs_job_succeeded (G_VFS_JOB (job)); } static void @@ -233,7 +238,8 @@ do_read (GVfsBackend * backend, char * buffer, gsize bytes_requested) { - g_print ( "TODO Implement do_read\n"); + g_print ("TODO Implement do_read\n"); + g_vfs_job_succeeded (G_VFS_JOB (job)); } static void @@ -242,7 +248,8 @@ do_create (GVfsBackend *backend, const char *filename, GFileCreateFlags flags) { - g_print ( "TODO Implement do_create\n"); + g_print ("TODO Implement do_create\n"); + g_vfs_job_succeeded (G_VFS_JOB (job)); } static void @@ -251,7 +258,8 @@ do_append (GVfsBackend *backend, const char *filename, GFileCreateFlags flags) { - g_print ( "TODO Implement do_append\n"); + g_print ("TODO Implement do_append\n"); + g_vfs_job_succeeded (G_VFS_JOB (job)); } static void @@ -262,7 +270,8 @@ do_replace (GVfsBackend *backend, gboolean make_backup, GFileCreateFlags flags) { - g_print ( "TODO Implement do_replace\n"); + g_print ("TODO Implement do_replace\n"); + g_vfs_job_succeeded (G_VFS_JOB (job)); } static void @@ -270,7 +279,8 @@ do_close_write (GVfsBackend *backend, GVfsJobCloseWrite *job, GVfsBackendHandle handle) { - g_print ( "TODO Implement do_close_write\n"); + g_print ("TODO Implement do_close_write\n"); + g_vfs_job_succeeded (G_VFS_JOB (job)); } static void @@ -280,7 +290,8 @@ do_write (GVfsBackend *backend, char *buffer, gsize buffer_size) { - g_print ( "TODO Implement do_write\n"); + g_print ("TODO Implement do_write\n"); + g_vfs_job_succeeded (G_VFS_JOB (job)); } static void @@ -291,7 +302,43 @@ do_query_info (GVfsBackend *backend, GFileInfo *info, GFileAttributeMatcher *matcher) { - g_print ( "TODO Implement do_query_info\n"); + g_print ("TODO Implement do_query_info\n"); + g_vfs_job_succeeded (G_VFS_JOB (job)); +} + +static void +repository_to_file_info (libcmis_RepositoryPtr repository, + GFileInfo *info) +{ + char *id; + char *name; + GIcon *icon = NULL; + GIcon *symbolic_icon = NULL; + + id = libcmis_repository_getId (repository); + name = libcmis_repository_getName (repository); + + g_file_info_set_name (info, id); + g_file_info_set_display_name (info, name); + + /* Repositories can't be edited through CMIS */ + g_file_info_set_attribute_boolean (info, + G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE, + FALSE); + + g_file_info_set_file_type (info, G_FILE_TYPE_DIRECTORY); + g_file_info_set_content_type (info, "inode/directory"); + + icon = g_themed_icon_new ("folder-remote"); + symbolic_icon = g_themed_icon_new ("folder-remote-symbolic"); + + g_file_info_set_icon (info, icon); + g_object_unref (icon); + g_file_info_set_symbolic_icon (info, symbolic_icon); + g_object_unref (symbolic_icon); + + g_free (id); + g_free (name); } static void @@ -301,7 +348,61 @@ do_enumerate (GVfsBackend *backend, GFileAttributeMatcher *matcher, GFileQueryInfoFlags query_flags) { - g_print ( "TODO Implement do_enumerate\n"); + GVfsBackendCmis *cmis_backend = G_VFS_BACKEND_CMIS (backend); + libcmis_RepositoryPtr repository = NULL; + libcmis_ErrorPtr error; + + g_print ("TODO Implement do_enumerate (%s)\n", dirname); + + if (cmis_backend->session == NULL) + { + g_vfs_job_failed (G_VFS_JOB (job), G_IO_ERROR, + G_IO_ERROR_NOT_MOUNTED, + _("CMIS session not initialized")); + return; + } + + error = libcmis_error_create (); + repository = libcmis_session_getRepository (cmis_backend->session, NULL); + if (!repository) + { + /* We don't have a repository, then list the repositories as folders, + * whatever the dirname is */ + libcmis_vector_Repository_Ptr repositories = NULL; + + repositories = libcmis_session_getRepositories (cmis_backend->session); + + size_t repositories_count = libcmis_vector_repository_size (repositories); + size_t i; + + g_print ("%d repositories found\n", repositories_count); + + for (i = 0; i < repositories_count; ++i) + { + libcmis_RepositoryPtr repo; + GFileInfo *info; + + repo = libcmis_vector_repository_get (repositories, i); + info = g_file_info_new (); + + repository_to_file_info (repo, info); + + g_vfs_job_enumerate_add_info (job, info); + } + g_vfs_job_succeeded (G_VFS_JOB (job)); + g_vfs_job_enumerate_done (G_VFS_JOB_ENUMERATE (job)); + } + else + { + libcmis_repository_free (repository); + + /* TODO List the files and folders for the given directory name */ + g_vfs_job_succeeded (G_VFS_JOB (job)); + g_vfs_job_enumerate_done (G_VFS_JOB_ENUMERATE (job)); + } + + /* Clean up */ + libcmis_error_free (error); } static void @@ -310,7 +411,8 @@ do_set_display_name (GVfsBackend *backend, const char *filename, const char *display_name) { - g_print ( "TODO Implement do_set_display_name\n"); + g_print ("TODO Implement do_set_display_name\n"); + g_vfs_job_succeeded (G_VFS_JOB (job)); } static void @@ -318,7 +420,8 @@ do_delete (GVfsBackend *backend, GVfsJobDelete *job, const char *filename) { - g_print ( "TODO Implement do_delete\n"); + g_print ("TODO Implement do_delete\n"); + g_vfs_job_succeeded (G_VFS_JOB (job)); } static void @@ -326,7 +429,8 @@ do_make_directory (GVfsBackend *backend, GVfsJobMakeDirectory *job, const char *filename) { - g_print ( "TODO Implement do_make_directory\n"); + g_print ("TODO Implement do_make_directory\n"); + g_vfs_job_succeeded (G_VFS_JOB (job)); } static void @@ -338,7 +442,8 @@ do_move (GVfsBackend *backend, GFileProgressCallback progress_callback, gpointer progress_callback_data) { - g_print ( "TODO Implement do_move\n"); + g_print ("TODO Implement do_move\n"); + g_vfs_job_succeeded (G_VFS_JOB (job)); } static gboolean @@ -346,7 +451,8 @@ try_query_settable_attributes (GVfsBackend *backend, GVfsJobQueryAttributes *job, const char *filename) { - g_print ( "TODO Implement try_query_settable_attributes\n"); + g_print ("TODO Implement try_query_settable_attributes\n"); + g_vfs_job_succeeded (G_VFS_JOB (job)); } static void @@ -358,7 +464,8 @@ do_set_attribute (GVfsBackend *backend, gpointer value_p, GFileQueryInfoFlags flags) { - g_print ( "TODO Implement do_set_attribute\n"); + g_print ("TODO Implement do_set_attribute\n"); + g_vfs_job_succeeded (G_VFS_JOB (job)); } static void @@ -371,7 +478,8 @@ do_pull (GVfsBackend * backend, GFileProgressCallback progress_callback, gpointer progress_callback_data) { - g_print ( "TODO Implement do_pull\n"); + g_print ("TODO Implement do_pull\n"); + g_vfs_job_succeeded (G_VFS_JOB (job)); } static void @@ -420,7 +528,4 @@ g_vfs_backend_cmis_class_init (GVfsBackendCmisClass *klass) backend_class->try_query_settable_attributes = try_query_settable_attributes; backend_class->set_attribute = do_set_attribute; backend_class->pull = do_pull; - - /* Set logger for debugging purpose */ - g_log_set_handler ("cmis", G_LOG_LEVEL_MASK, logger, NULL); } |