X-Git-Url: http://git.jankratochvil.net/?a=blobdiff_plain;f=src%2Flibcaptive%2Fsandbox%2Fserver-Directory.c;h=c77a6055b2474f341c581689656e5691c01ee1b4;hb=21dea5024c2fba9bcbe080dbd917dd27562c1190;hp=f86354097f40face5b920e6ad284a0e44aed108a;hpb=b0ea568364223ff4e8bb5a6bf03f23bc7e211f36;p=captive.git diff --git a/src/libcaptive/sandbox/server-Directory.c b/src/libcaptive/sandbox/server-Directory.c index f863540..c77a605 100644 --- a/src/libcaptive/sandbox/server-Directory.c +++ b/src/libcaptive/sandbox/server-Directory.c @@ -23,24 +23,29 @@ #include "sandbox.h" #include #include "captive/macros.h" +#include "../client/directory.h" +#include "FileInfo.h" +#include "split.h" +#include "../client/vfs-slave.h" -typedef struct { - POA_Captive_Directory servant; - PortableServer_POA poa; - } impl_POA_Captive_Directory; +static void impl_Captive_Directory_fini(impl_POA_Captive_Directory *servant,CORBA_Environment *ev); +static void impl_Captive_Directory_read + (impl_POA_Captive_Directory *servant,Captive_CaptiveFileInfoObject **file_info,CORBA_Environment *ev); +static void impl_Captive_Directory_remove(impl_POA_Captive_Directory *servant,CORBA_Environment *ev); +static void impl_Captive_Directory_shutdown(impl_POA_Captive_Directory *servant,CORBA_Environment *ev); -static Captive_GnomeVFSFileInfo *impl_Captive_Directory_read - (impl_POA_Captive_Directory *servant,CORBA_Environment *ev); static PortableServer_ServantBase__epv impl_Captive_Directory_base_epv={ NULL, /* _private data */ - NULL, /* finalize routine */ + (gpointer)&impl_Captive_Directory_fini, /* finalize routine */ NULL, /* default_POA routine */ }; static POA_Captive_Directory__epv impl_Captive_Directory_epv={ NULL, /* _private */ (gpointer)&impl_Captive_Directory_read, + (gpointer)&impl_Captive_Directory_remove, + (gpointer)&impl_Captive_Directory_shutdown, }; static POA_Captive_Directory__vepv impl_Captive_Directory_vepv={ &impl_Captive_Directory_base_epv, @@ -57,6 +62,7 @@ PortableServer_ObjectId *objid; captive_new0(newservant); /* FIXME: leak */ newservant->servant.vepv=&impl_Captive_Directory_vepv; newservant->poa=poa; + newservant->captive_directory_object=NULL; POA_Captive_Directory__init((PortableServer_Servant)newservant,ev); objid=PortableServer_POA_activate_object(poa,newservant,ev); CORBA_free(objid); @@ -66,21 +72,154 @@ PortableServer_ObjectId *objid; } -static Captive_GnomeVFSFileInfo *impl_Captive_Directory_read - (impl_POA_Captive_Directory *servant,CORBA_Environment *ev) +static void impl_Captive_Directory_fini(impl_POA_Captive_Directory *servant,CORBA_Environment *ev) { -Captive_GnomeVFSFileInfo *retval; - - retval=Captive_GnomeVFSFileInfo__alloc(); -/* - CORBA_string name; - Captive_Directory_GnomeVFSFileType type; - Captive_Directory_GnomeVFSFilePermissions permissions; - Captive_Directory_GnomeVFSFileSize size; - Captive_Directory_GnomeVFSFileSize block_count; - Captive_Directory_time_t atime; - Captive_Directory_time_t mtime; - Captive_Directory_time_t ctime; -*/ + if (servant->captive_directory_object) { + g_object_unref(servant->captive_directory_object); + servant->captive_directory_object=NULL; + } +} + + +static void impl_Captive_Directory__destroy(impl_POA_Captive_Directory *servant,CORBA_Environment *ev) +{ +PortableServer_ObjectId *objid; + + objid=PortableServer_POA_servant_to_id(servant->poa,servant,ev); + PortableServer_POA_deactivate_object(servant->poa,objid,ev); + CORBA_free(objid); + impl_Captive_Directory_fini(servant,ev); + g_free(servant); +} + + +Captive_Directory impl_Captive_Vfs_directory_new_open + (impl_POA_Captive_Vfs *servant,const CORBA_char *pathname,CORBA_Environment *ev) +{ +Captive_Directory retval; +impl_POA_Captive_Directory *retval_servant; +GnomeVFSResult errvfsresult; + + g_return_val_if_fail(CAPTIVE_VFS_SLAVE_IS_OBJECT(servant->captive_vfs_object),NULL); /* not yet initialized? */ + + retval=impl_Captive_Directory__create(servant->poa,ev); + if (ev->_major!=CORBA_NO_EXCEPTION) + return NULL; + + retval_servant=PortableServer_POA_reference_to_servant(servant->poa,retval,ev); + if (ev->_major!=CORBA_NO_EXCEPTION) + return NULL; /* 'retval' leak */ + + if (GNOME_VFS_OK!=(errvfsresult=captive_directory_new_open(&retval_servant->captive_directory_object, + servant->captive_vfs_object,pathname))) { + impl_Captive_Directory__destroy(retval_servant,ev); + captive_sandbox_child_GnomeVFSResultException_throw(ev,errvfsresult); + return NULL; + } + + return retval; +} + + +Captive_Directory impl_Captive_Vfs_directory_new_make(impl_POA_Captive_Vfs *servant, + const CORBA_char *pathname,const Captive_GnomeVFSFilePermissions perm,CORBA_Environment *ev) +{ +Captive_Directory retval; +impl_POA_Captive_Directory *retval_servant; +GnomeVFSResult errvfsresult; + + g_return_val_if_fail(CAPTIVE_VFS_SLAVE_IS_OBJECT(servant->captive_vfs_object),NULL); /* not yet initialized? */ + + retval=impl_Captive_Directory__create(servant->poa,ev); + if (ev->_major!=CORBA_NO_EXCEPTION) + return NULL; + + retval_servant=PortableServer_POA_reference_to_servant(servant->poa,retval,ev); + if (ev->_major!=CORBA_NO_EXCEPTION) + return NULL; /* 'retval' leak */ + + if (GNOME_VFS_OK!=(errvfsresult=captive_directory_new_make(&retval_servant->captive_directory_object, + servant->captive_vfs_object,pathname,perm))) { + impl_Captive_Directory__destroy(retval_servant,ev); + captive_sandbox_child_GnomeVFSResultException_throw(ev,errvfsresult); + return NULL; + } + return retval; } + + +static void impl_Captive_Directory_read + (impl_POA_Captive_Directory *servant,Captive_CaptiveFileInfoObject **file_info_corba_return,CORBA_Environment *ev) +{ +CaptiveFileInfoObject *file_info_captive; +Captive_CaptiveFileInfoObject *file_info_corba; +GnomeVFSResult errvfsresult; + + if (GNOME_VFS_OK!=(errvfsresult=captive_directory_read(servant->captive_directory_object,&file_info_captive))) { + captive_sandbox_child_GnomeVFSResultException_throw(ev,errvfsresult); + return; + } + + file_info_corba=Captive_CaptiveFileInfoObject__alloc(); + + errvfsresult=captive_sandbox_file_info_captive_to_corba(file_info_corba,file_info_captive); + g_object_unref(file_info_captive); + + if (GNOME_VFS_OK!=errvfsresult) { + captive_sandbox_child_GnomeVFSResultException_throw(ev,errvfsresult); + Captive_CaptiveFileInfoObject__freekids(file_info_corba,NULL/* 'd'; meaning? */); + CORBA_free(file_info_corba); + return; + } + + *file_info_corba_return=file_info_corba; +} + + +static void impl_Captive_Directory_remove(impl_POA_Captive_Directory *servant,CORBA_Environment *ev) +{ +GnomeVFSResult errvfsresult; + + if (GNOME_VFS_OK!=(errvfsresult=captive_directory_remove(servant->captive_directory_object))) { + captive_sandbox_child_GnomeVFSResultException_throw(ev,errvfsresult); + return; + } +} + + +static gboolean impl_Captive_Directory_shutdown_idle(impl_POA_Captive_Directory *servant /* data */) +{ + impl_Captive_Directory__destroy(servant,&captive_corba_ev); + g_assert(validate_CORBA_Environment(&captive_corba_ev)); + + return FALSE; /* remove me */ +} + +static void impl_Captive_Directory_shutdown(impl_POA_Captive_Directory *servant,CORBA_Environment *ev) +{ +GSource *source; + + /* Shutdown 'servant->captive_directory_object' synchronously as it may + * flush its buffers needed to be transferred to our parent. + */ + impl_Captive_Directory_fini(servant,&captive_corba_ev); + g_assert(validate_CORBA_Environment(&captive_corba_ev)); + + /* Do not call impl_Captive_Directory__destroy() directly as we would fail + * to finish this CORBA method call properly. + * Do not call g_idle_add_full() as it would miss linc main loop. + * FIXME: STATUS_SHARING_VIOLATION error during batch processing. + * - probably exclusive access to be changed to shareable one + */ + source=g_idle_source_new (); + g_source_set_priority(source,G_PRIORITY_LOW); + g_source_set_callback( + source, /* source */ + (GSourceFunc)impl_Captive_Directory_shutdown_idle, /* func */ + servant, /* data */ + NULL); /* notify */ + g_source_attach(source, + captive_corba_get_context()); /* context; NULL means 'default context' */ + g_source_unref(source); +}