Implemented sub-second W32 filesystem interface by new: CaptiveFileInfoObject
[captive.git] / src / libcaptive / sandbox / server-Directory.c
index 75f9ff6..c77a605 100644 (file)
 #include "../client/directory.h"
 #include "FileInfo.h"
 #include "split.h"
+#include "../client/vfs-slave.h"
 
 
 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_GnomeVFSFileInfo **file_info,CORBA_Environment *ev);
+               (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 PortableServer_ServantBase__epv impl_Captive_Directory_base_epv={
@@ -43,6 +45,7 @@ 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,
@@ -97,6 +100,8 @@ 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;
@@ -123,6 +128,8 @@ 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;
@@ -143,10 +150,10 @@ GnomeVFSResult errvfsresult;
 
 
 static void impl_Captive_Directory_read
-               (impl_POA_Captive_Directory *servant,Captive_GnomeVFSFileInfo **file_info_corba_return,CORBA_Environment *ev)
+               (impl_POA_Captive_Directory *servant,Captive_CaptiveFileInfoObject **file_info_corba_return,CORBA_Environment *ev)
 {
-GnomeVFSFileInfo file_info_captive;
-Captive_GnomeVFSFileInfo *file_info_corba;
+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))) {
@@ -154,12 +161,14 @@ GnomeVFSResult errvfsresult;
                return;
                }
 
-       file_info_corba=Captive_GnomeVFSFileInfo__alloc();
+       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_file_info_captive_to_corba(
-                       file_info_corba,&file_info_captive))) {
+       if (GNOME_VFS_OK!=errvfsresult) {
                captive_sandbox_child_GnomeVFSResultException_throw(ev,errvfsresult);
-               Captive_GnomeVFSFileInfo__freekids(file_info_corba,NULL/* 'd'; meaning? */);
+               Captive_CaptiveFileInfoObject__freekids(file_info_corba,NULL/* 'd'; meaning? */);
                CORBA_free(file_info_corba);
                return;
                }
@@ -177,3 +186,40 @@ GnomeVFSResult 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);
+}