+captive_leave() to replace g_idle*() function calls postponing
[captive.git] / src / libcaptive / client / directory.c
index 534e5f8..e77e76f 100644 (file)
@@ -29,6 +29,8 @@
 #include "reactos/ddk/iofuncs.h"       /* for IoCreateFile() */
 #include "captive/sandbox.h"
 #include "result.h"
+#include "captive/leave.h"
+#include "captive/usecount.h"
 
 
 static gpointer captive_directory_object_parent_class=NULL;
@@ -102,9 +104,6 @@ IO_STATUS_BLOCK dir_IoStatusBlock;
 NTSTATUS err;
 CaptiveDirectoryObject *captive_directory_object;
 
-       if (CAPTIVE_IS_SANDBOX_PARENT())
-               return captive_sandbox_parent_directory_new_open(captive_directory_object_return,pathname);
-
        g_return_val_if_fail(captive_directory_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
        g_return_val_if_fail(pathname!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
 
@@ -159,24 +158,41 @@ CaptiveDirectoryObject *captive_directory_object;
 GnomeVFSResult captive_directory_new_open(CaptiveDirectoryObject **captive_directory_object_return,
                const gchar *pathname)
 {
+GnomeVFSResult r;
+
+       if (CAPTIVE_IS_SANDBOX_PARENT())
+               return captive_sandbox_parent_directory_new_open(captive_directory_object_return,pathname);
+
        g_return_val_if_fail(captive_directory_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
        g_return_val_if_fail(pathname!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
 
-       return captive_directory_new_internal(captive_directory_object_return,pathname,
+       r=captive_directory_new_internal(captive_directory_object_return,pathname,
                        FALSE,  /* create */
                        0);     /* create_perm; ignored */
+
+       captive_leave();
+       if (r==GNOME_VFS_OK)
+               captive_usecount(+1);
+       return r;
 }
 
 
 GnomeVFSResult captive_directory_new_make(CaptiveDirectoryObject **captive_directory_object_return,
                const gchar *pathname,guint perm)
 {
+GnomeVFSResult r;
+
        g_return_val_if_fail(captive_directory_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
        g_return_val_if_fail(pathname!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
 
-       return captive_directory_new_internal(captive_directory_object_return,pathname,
+       r=captive_directory_new_internal(captive_directory_object_return,pathname,
                        TRUE,   /* create */
                        perm);  /* create_perm; ignored */
+
+       captive_leave();
+       if (r==GNOME_VFS_OK)
+               captive_usecount(+1);
+       return r;
 }
 
 
@@ -334,11 +350,14 @@ HANDLE dir_Handle;
        g_return_val_if_fail(captive_directory_object!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
        g_return_val_if_fail(captive_directory_object->dir_Handle!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);        /* already closed */
 
+       captive_usecount(-1);   /* close() errors notwithstanding */
+
        dir_Handle=captive_directory_object->dir_Handle;
        captive_directory_object->dir_Handle=NULL;
        err=NtClose(dir_Handle);
        g_return_val_if_fail(NT_SUCCESS(err),GNOME_VFS_ERROR_GENERIC);
 
+       captive_leave();
        return GNOME_VFS_OK;
 }
 
@@ -432,6 +451,7 @@ retry:
                        &dir_IoStatusBlock);
        g_return_val_if_fail(errvfsresult==GNOME_VFS_OK,errvfsresult);
 
+       captive_leave();
        return GNOME_VFS_OK;
 }
 
@@ -458,5 +478,6 @@ GnomeVFSResult errvfsresult;
                return errvfsresult;
        g_return_val_if_fail(NT_SUCCESS(err),GNOME_VFS_ERROR_GENERIC);
 
+       captive_leave();
        return GNOME_VFS_OK;
 }