#include "reactos/ntos/types.h" /* for HANDLE */
#include "reactos/ddk/iotypes.h" /* for IO_STATUS_BLOCK */
#include "reactos/ddk/iofuncs.h" /* for IoCreateFile() */
-#include "captive/sandbox.h"
#include "result.h"
#include "captive/leave.h"
#include "captive/usecount.h"
+#include "vfs.h"
+#include "captive/parent-Directory.h"
static gpointer captive_directory_object_parent_class=NULL;
static void captive_directory_object_finalize(CaptiveDirectoryObject *captive_directory_object)
{
-GnomeVFSResult errvfsresult;
-
g_return_if_fail(captive_directory_object!=NULL);
- errvfsresult=captive_directory_close(captive_directory_object);
- g_assert(errvfsresult==GNOME_VFS_OK);
+ captive_directory_close(captive_directory_object); /* errors ignored */
G_OBJECT_CLASS(captive_directory_object_parent_class)->finalize((GObject *)captive_directory_object);
}
}
-static GnomeVFSResult captive_directory_new_internal(CaptiveDirectoryObject **captive_directory_object_return,
- CaptiveVfsObject *captive_vfs_object,const gchar *pathname,gboolean create,guint create_perm)
+static GnomeVFSResult captive_directory_new_internal
+ (CaptiveDirectoryObject *captive_directory_object,const gchar *pathname,gboolean create,guint create_perm)
{
GnomeVFSResult errvfsresult;
OBJECT_ATTRIBUTES dir_ObjectAttributes;
HANDLE dir_Handle;
IO_STATUS_BLOCK dir_IoStatusBlock;
NTSTATUS err;
-CaptiveDirectoryObject *captive_directory_object;
- g_return_val_if_fail(captive_directory_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
- g_return_val_if_fail(captive_vfs_object!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
+ g_return_val_if_fail(captive_directory_object!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
g_return_val_if_fail(pathname!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
- *captive_directory_object_return=NULL;
-
errvfsresult=captive_ObjectAttributes_init(pathname,&dir_ObjectAttributes);
g_return_val_if_fail(errvfsresult==GNOME_VFS_OK,errvfsresult);
==(!create ? FILE_OPENED : FILE_CREATED),
GNOME_VFS_ERROR_GENERIC);
- captive_directory_object=g_object_new(
- CAPTIVE_DIRECTORY_TYPE_OBJECT, /* object_type */
- NULL); /* first_property_name; FIXME: support properties */
-
- captive_directory_object->vfs=captive_vfs_object;
captive_directory_object->dir_Handle=dir_Handle;
- *captive_directory_object_return=captive_directory_object;
return GNOME_VFS_OK;
}
CaptiveVfsObject *captive_vfs_object,const gchar *pathname)
{
GnomeVFSResult r;
-
- if (CAPTIVE_IS_SANDBOX_PARENT())
- return captive_sandbox_parent_directory_new_open(captive_directory_object_return,pathname);
+CaptiveDirectoryObject *captive_directory_object;
g_return_val_if_fail(captive_directory_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
g_return_val_if_fail(captive_vfs_object!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
g_return_val_if_fail(pathname!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
- r=captive_directory_new_internal(captive_directory_object_return,captive_vfs_object,pathname,
+ captive_directory_object=g_object_new(
+ CAPTIVE_DIRECTORY_TYPE_OBJECT, /* object_type */
+ NULL); /* first_property_name; FIXME: support properties */
+ captive_directory_object->dir_Handle=NULL;
+ captive_directory_object->vfs=captive_vfs_object;
+ *captive_directory_object_return=captive_directory_object;
+
+ if (captive_vfs_object->is_sandbox_parent)
+ return captive_sandbox_parent_directory_new_open(captive_directory_object,pathname);
+
+ r=captive_directory_new_internal(captive_directory_object,pathname,
FALSE, /* create */
0); /* create_perm; ignored */
captive_leave();
if (r==GNOME_VFS_OK)
captive_usecount(+1);
+ else
+ g_object_unref(captive_directory_object);
return r;
}
CaptiveVfsObject *captive_vfs_object,const gchar *pathname,guint perm)
{
GnomeVFSResult r;
+CaptiveDirectoryObject *captive_directory_object;
g_return_val_if_fail(captive_directory_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
g_return_val_if_fail(captive_vfs_object!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
g_return_val_if_fail(pathname!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
- r=captive_directory_new_internal(captive_directory_object_return,captive_vfs_object,pathname,
+ captive_directory_object=g_object_new(
+ CAPTIVE_DIRECTORY_TYPE_OBJECT, /* object_type */
+ NULL); /* first_property_name; FIXME: support properties */
+ captive_directory_object->dir_Handle=NULL;
+ captive_directory_object->vfs=captive_vfs_object;
+ *captive_directory_object_return=captive_directory_object;
+
+ if (captive_vfs_object->is_sandbox_parent)
+ return captive_sandbox_parent_directory_new_make(captive_directory_object,pathname,perm);
+
+ r=captive_directory_new_internal(captive_directory_object,pathname,
TRUE, /* create */
perm); /* create_perm; ignored */
captive_leave();
if (r==GNOME_VFS_OK)
captive_usecount(+1);
+ else
+ g_object_unref(captive_directory_object);
return r;
}
NTSTATUS err;
HANDLE dir_Handle;
- if (CAPTIVE_IS_SANDBOX_PARENT())
- return captive_sandbox_parent_directory_close(captive_directory_object);
-
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 */
+ if (captive_directory_object->vfs->is_sandbox_parent)
+ return captive_sandbox_parent_directory_close(captive_directory_object);
- 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);
+ if (captive_directory_object->dir_Handle!=NULL) { /* not yet 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;
FILE_BOTH_DIR_INFORMATION *FileBothDirInformation;
GnomeVFSResult errvfsresult;
- if (CAPTIVE_IS_SANDBOX_PARENT())
+ g_return_val_if_fail(captive_directory_object!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
+ g_return_val_if_fail(file_info!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
+
+ if (captive_directory_object->vfs->is_sandbox_parent)
return captive_sandbox_parent_directory_read(captive_directory_object,file_info);
- 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);
- g_return_val_if_fail(file_info!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
FileIdBothDirInformation=(void *)captive_directory_object->QueryDirectory_buf.FileIdBothDirInformation;
retry:
GnomeVFSResult errvfsresult;
g_return_val_if_fail(captive_directory_object!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
+
+ if (captive_directory_object->vfs->is_sandbox_parent)
+ return captive_sandbox_parent_directory_remove(captive_directory_object);
+
g_return_val_if_fail(captive_directory_object->dir_Handle!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
FileDispositionInformation_struct.DoDeleteFile=TRUE;