diff options
author | Cédric Bosdonnat <cedric.bosdonnat@free.fr> | 2013-04-08 17:11:50 +0200 |
---|---|---|
committer | Cédric Bosdonnat <cedric.bosdonnat@free.fr> | 2013-07-31 12:57:50 +0200 |
commit | 2b81439e97f555829ccb889e6a632186802d347a (patch) | |
tree | 177d94269a36441b62483f2569559cd15afaf33a | |
parent | ce0ffe231e7dd162394cb61467be8e75bfd9eae1 (diff) |
cmis backend code skeleton
Conflicts:
daemon/Makefile.am
-rw-r--r-- | configure.ac | 26 | ||||
-rw-r--r-- | daemon/Makefile.am | 20 | ||||
-rw-r--r-- | daemon/cmis.mount.in | 5 | ||||
-rw-r--r-- | daemon/gvfsbackendcmis.c | 273 | ||||
-rw-r--r-- | daemon/gvfsbackendcmis.h | 56 |
5 files changed, 380 insertions, 0 deletions
diff --git a/configure.ac b/configure.ac index 408a9f54..6cd7fc73 100644 --- a/configure.ac +++ b/configure.ac @@ -441,6 +441,31 @@ AC_SUBST(EXPAT_CFLAGS) AC_SUBST(EXPAT_LIBS) AM_CONDITIONAL(USE_OBEXFTP, [test "$msg_obexftp" = "yes"]) +dnl ***************************************************** +dnl *** Check if we should build with CMIS backend *** +dnl ***************************************************** +AC_ARG_ENABLE(cmis, AS_HELP_STRING([--disable-cmis],[build without CMIS backend])) +msg_cmis=no +CMIS_LIBS= +CMIS_CFLAGS= + +if test "x$enable_cmis" != "xno"; then + PKG_CHECK_EXISTS(libcmis-c-0.4 >= 0.4, msg_cmis=yes) + + if test "x$msg_cmis" = "xyes"; then + PKG_CHECK_MODULES(CMIS, libcmis-c-0.4 >= 0.4) + AC_SUBST(CMIS_LIBS) + AC_SUBST(CMIS_CFLAGS) + + msg_cmis=yes + AC_DEFINE(HAVE_CMIS, 1, [Define to 1 if CMIS is going to be built]) + else + msg_cmis=no + fi +fi + +AM_CONDITIONAL(USE_CMIS, [test "$msg_cmis" = "yes"]) + dnl ************************* dnl *** Check for gphoto2 *** dnl ************************* @@ -922,6 +947,7 @@ echo " AFC support: $msg_afc AFP support: $msg_afp DNS-SD support: $msg_avahi + CMIS support: $msg_cmis Build HAL volume monitor: $msg_hal (with fast init path: $have_hal_fast_init) Build GDU volume monitor: $msg_gdu Build udisks2 volume monitor: $msg_udisks2 diff --git a/daemon/Makefile.am b/daemon/Makefile.am index 6e63464e..57d4b5aa 100644 --- a/daemon/Makefile.am +++ b/daemon/Makefile.am @@ -128,6 +128,12 @@ mount_DATA += afp-browse.mount afp.mount libexec_PROGRAMS += gvfsd-afp-browse gvfsd-afp endif +mount_in_files += cmis.mount.in +if USE_CMIS +mount_DATA += cmis.mount +libexec_PROGRAMS += gvfsd-cmis +endif + noinst_DATA = $(mount_DATA:.mount=.localmount) EXTRA_DIST = \ @@ -295,6 +301,20 @@ gvfsd_ftp_CPPFLAGS = \ gvfsd_ftp_LDADD = $(libraries) +gvfsd_cmis_SOURCES = \ + gvfsbackendcmis.c gvfsbackendcmis.h \ + daemon-main.c daemon-main.h \ + daemon-main-generic.c + +gvfsd_cmis_CPPFLAGS = \ + $(CMIS_CFLAGS) \ + -DBACKEND_HEADER=gvfsbackendcmis.h \ + -DDEFAULT_BACKEND_TYPE=cmis \ + -DMAX_JOB_THREADS=10 \ + -DBACKEND_TYPES='"cmis", G_VFS_TYPE_BACKEND_CMIS,' + +gvfsd_cmis_LDADD = $(CMIS_LIBS) $(libraries) + gvfsd_sftp_SOURCES = \ sftp.h \ gvfsbackendsftp.c gvfsbackendsftp.h \ diff --git a/daemon/cmis.mount.in b/daemon/cmis.mount.in new file mode 100644 index 00000000..4653555d --- /dev/null +++ b/daemon/cmis.mount.in @@ -0,0 +1,5 @@ +[Mount] +Type=cmis +Exec=@libexecdir@/gvfsd-cmis +AutoMount=false +Scheme=cmis diff --git a/daemon/gvfsbackendcmis.c b/daemon/gvfsbackendcmis.c new file mode 100644 index 00000000..30857cb5 --- /dev/null +++ b/daemon/gvfsbackendcmis.c @@ -0,0 +1,273 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2013 Cédric Bosdonnat <cbosdonnat@suse.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + * Author: Cédric Bosdonnat <cbosdonnat@suse.com> + */ + +#include <glib/gstdio.h> + +#include "gvfsbackendcmis.h" + +G_DEFINE_TYPE (GVfsBackendCmis, g_vfs_backend_cmis, G_VFS_TYPE_BACKEND) + +static void +do_mount (GVfsBackend *backend, + GVfsJobMount *job, + GMountSpec *mount_spec, + GMountSource *mount_source, + gboolean is_automount) +{ + g_print ("TODO Implement do_mount\n"); + GVfsBackendCmis *cmis_backend = G_VFS_BACKEND_CMIS (backend); + + /* TODO Setup the proxy settings on libcmis if any */ + + /* TODO Try to create the CMIS session */ + /* cmis_backend->session = libcmis_createSession( ); */ + + g_vfs_backend_set_display_name (backend, "CMIS test"); + + g_vfs_backend_set_mount_spec (backend, mount_spec); + g_vfs_backend_set_icon_name (backend, "folder-remote"); + g_vfs_job_succeeded (G_VFS_JOB (job)); +} + +static void +do_unmount (GVfsBackend * backend, + GVfsJobUnmount *job, + GMountUnmountFlags flags, + GMountSource *mount_source) +{ + g_print ( "TODO Implement do_unmount\n"); + g_vfs_job_succeeded (G_VFS_JOB (job)); +} + +static void +do_open_for_read (GVfsBackend *backend, + GVfsJobOpenForRead *job, + const char *filename) +{ + g_print ( "TODO Implement do_open_for_read\n"); +} + +static void +do_close_read (GVfsBackend * backend, + GVfsJobCloseRead *job, + GVfsBackendHandle handle) +{ + g_print ( "TODO Implement do_close_read\n"); +} + +static void +do_read (GVfsBackend * backend, + GVfsJobRead * job, + GVfsBackendHandle handle, + char * buffer, + gsize bytes_requested) +{ + g_print ( "TODO Implement do_read\n"); +} + +static void +do_create (GVfsBackend *backend, + GVfsJobOpenForWrite *job, + const char *filename, + GFileCreateFlags flags) +{ + g_print ( "TODO Implement do_create\n"); +} + +static void +do_append (GVfsBackend *backend, + GVfsJobOpenForWrite *job, + const char *filename, + GFileCreateFlags flags) +{ + g_print ( "TODO Implement do_append\n"); +} + +static void +do_replace (GVfsBackend *backend, + GVfsJobOpenForWrite *job, + const char *filename, + const char *etag, + gboolean make_backup, + GFileCreateFlags flags) +{ + g_print ( "TODO Implement do_replace\n"); +} + +static void +do_close_write (GVfsBackend *backend, + GVfsJobCloseWrite *job, + GVfsBackendHandle handle) +{ + g_print ( "TODO Implement do_close_write\n"); +} + +static void +do_write (GVfsBackend *backend, + GVfsJobWrite *job, + GVfsBackendHandle handle, + char *buffer, + gsize buffer_size) +{ + g_print ( "TODO Implement do_write\n"); +} + +static void +do_query_info (GVfsBackend *backend, + GVfsJobQueryInfo *job, + const char *filename, + GFileQueryInfoFlags query_flags, + GFileInfo *info, + GFileAttributeMatcher *matcher) +{ + g_print ( "TODO Implement do_query_info\n"); +} + +static void +do_enumerate (GVfsBackend *backend, + GVfsJobEnumerate *job, + const char *dirname, + GFileAttributeMatcher *matcher, + GFileQueryInfoFlags query_flags) +{ + g_print ( "TODO Implement do_enumerate\n"); +} + +static void +do_set_display_name (GVfsBackend *backend, + GVfsJobSetDisplayName *job, + const char *filename, + const char *display_name) +{ + g_print ( "TODO Implement do_set_display_name\n"); +} + +static void +do_delete (GVfsBackend *backend, + GVfsJobDelete *job, + const char *filename) +{ + g_print ( "TODO Implement do_delete\n"); +} + +static void +do_make_directory (GVfsBackend *backend, + GVfsJobMakeDirectory *job, + const char *filename) +{ + g_print ( "TODO Implement do_make_directory\n"); +} + +static void +do_move (GVfsBackend *backend, + GVfsJobMove *job, + const char *source, + const char *destination, + GFileCopyFlags flags, + GFileProgressCallback progress_callback, + gpointer progress_callback_data) +{ + g_print ( "TODO Implement do_move\n"); +} + +static gboolean +try_query_settable_attributes (GVfsBackend *backend, + GVfsJobQueryAttributes *job, + const char *filename) +{ + g_print ( "TODO Implement try_query_settable_attributes\n"); +} + +static void +do_set_attribute (GVfsBackend *backend, + GVfsJobSetAttribute *job, + const char *filename, + const char *attribute, + GFileAttributeType type, + gpointer value_p, + GFileQueryInfoFlags flags) +{ + g_print ( "TODO Implement do_set_attribute\n"); +} + +static void +do_pull (GVfsBackend * backend, + GVfsJobPull * job, + const char * source, + const char * local_path, + GFileCopyFlags flags, + gboolean remove_source, + GFileProgressCallback progress_callback, + gpointer progress_callback_data) +{ + g_print ( "TODO Implement do_pull\n"); +} + +static void +g_vfs_backend_cmis_init (GVfsBackendCmis *cmis) +{ + GVfsBackendCmis *cmis_backend = G_VFS_BACKEND_CMIS (object); + + cmis_backend->session = NULL; +} + +static void +g_vfs_backend_cmis_finalize (GObject *object) +{ + GVfsBackendCmis *cmis_backend = G_VFS_BACKEND_CMIS (object); + + /* Should have been done by do_unmount, but better be sure it's clean */ + if (cmis_backend->session) + libcmis_session_free (cmis_backend->session); + + G_OBJECT_CLASS (g_vfs_backend_afp_parent_class)->finalize (object); +} + +static void +g_vfs_backend_cmis_class_init (GVfsBackendCmisClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GVfsBackendClass *backend_class = G_VFS_BACKEND_CLASS (klass); + + gobject_class->finalize = g_vfs_backend_cmis_finalize; + + backend_class->mount = do_mount; + backend_class->try_mount = NULL; + backend_class->unmount = do_unmount; + backend_class->open_for_read = do_open_for_read; + backend_class->close_read = do_close_read; + backend_class->read = do_read; + backend_class->create = do_create; + backend_class->append_to = do_append; + backend_class->replace = do_replace; + backend_class->close_write = do_close_write; + backend_class->write = do_write; + backend_class->query_info = do_query_info; + backend_class->enumerate = do_enumerate; + backend_class->set_display_name = do_set_display_name; + backend_class->delete = do_delete; + backend_class->make_directory = do_make_directory; + backend_class->move = do_move; + backend_class->try_query_settable_attributes = try_query_settable_attributes; + backend_class->set_attribute = do_set_attribute; + backend_class->pull = do_pull; +} diff --git a/daemon/gvfsbackendcmis.h b/daemon/gvfsbackendcmis.h new file mode 100644 index 00000000..070fab1f --- /dev/null +++ b/daemon/gvfsbackendcmis.h @@ -0,0 +1,56 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2013 Cédric Bosdonnat <cbosdonnat@suse.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + * Author: Cédric Bosdonnat <cbosdonnat@suse.com> + */ + +#ifndef __G_VFS_BACKEND_CMIS_H__ +#define __G_VFS_BACKEND_CMIS_H__ + +#include <libcmis-c/session.h> + +#include <gvfsbackend.h> + +G_BEGIN_DECLS + +#define G_VFS_TYPE_BACKEND_CMIS (g_vfs_backend_cmis_get_type ()) +#define G_VFS_BACKEND_CMIS(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_VFS_TYPE_BACKEND_CMIS, GVfsBackendCmis)) +#define G_VFS_BACKEND_CMIS_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_VFS_TYPE_BACKEND_CMIS, GVfsBackendCmisClass)) +#define G_VFS_IS_BACKEND_CMIS(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_VFS_TYPE_BACKEND_CMIS)) +#define G_VFS_IS_BACKEND_CMIS_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_VFS_TYPE_BACKEND_CMIS)) +#define G_VFS_BACKEND_CMIS_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_VFS_TYPE_BACKEND_CMIS, GVfsBackendCmisClass)) + +typedef struct _GVfsBackendCmis GVfsBackendCmis; +typedef struct _GVfsBackendCmisClass GVfsBackendCmisClass; + +struct _GVfsBackendCmis +{ + GVfsBackend backend; + libcmis_SessionPtr session; +}; + +struct _GVfsBackendCmisClass +{ + GVfsBackendClass parent_class; +}; + + +G_END_DECLS + +#endif /* __G_VFS_BACKEND_CMIS_H__ */ |