summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCédric Bosdonnat <cedric.bosdonnat@free.fr>2013-04-10 16:58:10 +0200
committerCédric Bosdonnat <cedric.bosdonnat@free.fr>2013-04-10 16:58:10 +0200
commit1e679f71ce15fe9a549b654ca69b14c02ef0c88c (patch)
treec3204a083c4d1f547f9c98d1ed46238ecf79d73d
parent44cf06810a1bd6fa837b945ef8224b3b7a14278b (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.c185
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);
}