X-Git-Url: http://git.jankratochvil.net/?a=blobdiff_plain;f=src%2Flibcaptive%2Fclient%2Ffile.c;h=b1268be13e9ec4e09d8a580d8fff64709032c5e6;hb=a2dd38f86df22c46ae18f3ad7d9850eaacb02b92;hp=c5254e08c10838d83b3960180aea9049c9fd93c1;hpb=bfcb2c30c155047e0c108c057520e3f290a8119b;p=captive.git diff --git a/src/libcaptive/client/file.c b/src/libcaptive/client/file.c index c5254e0..b1268be 100644 --- a/src/libcaptive/client/file.c +++ b/src/libcaptive/client/file.c @@ -20,14 +20,10 @@ #include "config.h" #include "captive/client-file.h" /* self */ -#include "lib.h" +#include "file.h" /* self-priv */ #include -#include "captive/unicode.h" -#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 "vfs.h" +#include "reactos/ntos/types.h" /* for ULONG */ static gpointer captive_file_object_parent_class=NULL; @@ -37,12 +33,9 @@ static GnomeVFSResult captive_file_close(CaptiveFileObject *captive_file_object) static void captive_file_object_finalize(CaptiveFileObject *captive_file_object) { -GnomeVFSResult errvfsresult; - g_return_if_fail(captive_file_object!=NULL); - errvfsresult=captive_file_close(captive_file_object); - g_assert(errvfsresult==GNOME_VFS_OK); + captive_file_close(captive_file_object); /* errors ignored */ G_OBJECT_CLASS(captive_file_object_parent_class)->finalize((GObject *)captive_file_object); } @@ -52,14 +45,13 @@ static void captive_file_object_class_init(CaptiveFileObjectClass *class) { GObjectClass *gobject_class=G_OBJECT_CLASS(class); - captive_file_object_parent_class=g_type_class_ref(G_TYPE_OBJECT); + captive_file_object_parent_class=g_type_class_ref(g_type_parent(G_TYPE_FROM_CLASS(class))); gobject_class->finalize=(void (*)(GObject *object))captive_file_object_finalize; } static void captive_file_object_init(CaptiveFileObject *captive_file_object) { - captive_file_object->file_Handle=NULL; } @@ -81,248 +73,164 @@ static const GTypeInfo captive_file_object_info={ }; captive_file_object_type=g_type_register_static(G_TYPE_OBJECT, - "CaptiveFileObject",&captive_file_object_info,0); + "CaptiveFileObject",&captive_file_object_info,G_TYPE_FLAG_ABSTRACT); } return captive_file_object_type; } -static GnomeVFSResult captive_file_new_internal(CaptiveFileObject **captive_file_object_return, - const gchar *pathname,GnomeVFSOpenMode mode,gboolean create,gboolean create_exclusive,guint create_perm) +GnomeVFSResult captive_file_new_open(CaptiveFileObject **captive_file_object_return, + CaptiveVfsObject *captive_vfs_object,const gchar *pathname,GnomeVFSOpenMode mode) { -IO_STATUS_BLOCK file_IoStatusBlock; -GnomeVFSResult errvfsresult; -OBJECT_ATTRIBUTES file_ObjectAttributes; -HANDLE file_Handle; -CaptiveFileObject *captive_file_object; -NTSTATUS err; - - if (CAPTIVE_IS_SANDBOX_PARENT()) - return captive_sandbox_parent_file_new_open(captive_file_object_return,pathname,mode); - g_return_val_if_fail(captive_file_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); + g_return_val_if_fail(CAPTIVE_VFS_IS_OBJECT(captive_vfs_object),GNOME_VFS_ERROR_BAD_PARAMETERS); g_return_val_if_fail(pathname!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); - *captive_file_object_return=NULL; - - errvfsresult=captive_ObjectAttributes_init(pathname,&file_ObjectAttributes); - g_return_val_if_fail(errvfsresult==GNOME_VFS_OK,errvfsresult); - - /* open */ - err=IoCreateFile( - &file_Handle, /* FileHandle */ - 0 - |(!(mode&GNOME_VFS_OPEN_READ ) ? 0 : FILE_READ_DATA) - |(!(mode&GNOME_VFS_OPEN_WRITE) ? 0 : FILE_WRITE_DATA | FILE_APPEND_DATA) - , /* DesiredAccess */ - &file_ObjectAttributes, /* ObjectAttributes */ - &file_IoStatusBlock, /* IoStatusBlock */ - NULL, /* AllocationSize; ignored for open */ - (!create || create_perm&0200 ? FILE_ATTRIBUTE_NORMAL: FILE_ATTRIBUTE_READONLY), /* FileAttributes; ignored for open */ - (!create || !create_exclusive ? FILE_SHARE_DELETE : 0), /* ShareAccess; 0 means exclusive */ - (!create ? FILE_OPEN : FILE_CREATE), /* CreateDisposition */ - /* FILE_SYNCHRONOUS_IO_{,NON}ALERT: We need to allow W32 filesystem - * any waits to not to let it return STATUS_CANT_WAIT us. - * Alertability should have only effect on asynchronous events - * from KeWaitForSingleObject() by setting/clearing its parameter 'Alertable'. - */ - FILE_SYNCHRONOUS_IO_ALERT, /* CreateOptions */ - NULL, /* EaBuffer */ - 0, /* EaLength */ - CreateFileTypeNone, /* CreateFileType */ - NULL, /* ExtraCreateParameters */ - 0); /* Options */ - g_free(file_ObjectAttributes.ObjectName); /* left from captive_file_uri_parent_init() */ - g_return_val_if_fail(NT_SUCCESS(err)==NT_SUCCESS(file_IoStatusBlock.Status),GNOME_VFS_ERROR_GENERIC); - if (GNOME_VFS_OK!=(errvfsresult=captive_NTSTATUS_to_GnomeVFSResult(err))) - return errvfsresult; - g_return_val_if_fail(NT_SUCCESS(err),GNOME_VFS_ERROR_GENERIC); - g_return_val_if_fail(file_IoStatusBlock.Information - ==(!create ? FILE_OPENED : FILE_CREATED), - GNOME_VFS_ERROR_GENERIC); - - captive_file_object=g_object_new( - CAPTIVE_FILE_TYPE_OBJECT, /* object_type */ - NULL); /* first_property_name; FIXME: support properties */ - - captive_file_object->file_Handle=file_Handle; - captive_file_object->offset=0; - - *captive_file_object_return=captive_file_object; - return GNOME_VFS_OK; + return (*CAPTIVE_VFS_OBJECT_GET_CLASS(captive_vfs_object)->file_new_open) + (captive_file_object_return,captive_vfs_object,pathname,mode); } -GnomeVFSResult captive_file_new_open - (CaptiveFileObject **captive_file_object_return,const gchar *pathname,GnomeVFSOpenMode mode) +GnomeVFSResult captive_file_new_create(CaptiveFileObject **captive_file_object_return, + CaptiveVfsObject *captive_vfs_object,const gchar *pathname,GnomeVFSOpenMode mode,gboolean exclusive,guint perm) { g_return_val_if_fail(captive_file_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); + g_return_val_if_fail(CAPTIVE_VFS_IS_OBJECT(captive_vfs_object),GNOME_VFS_ERROR_BAD_PARAMETERS); g_return_val_if_fail(pathname!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); - return captive_file_new_internal(captive_file_object_return,pathname,mode, - FALSE, /* create */ - FALSE, /* create_exclusive; ignored */ - 0); /* create_perm; ignored */ + return (*CAPTIVE_VFS_OBJECT_GET_CLASS(captive_vfs_object)->file_new_create) + (captive_file_object_return,captive_vfs_object,pathname,mode,exclusive,perm); } -GnomeVFSResult captive_file_new_create - (CaptiveFileObject **captive_file_object_return,const gchar *pathname,GnomeVFSOpenMode mode,gboolean exclusive,guint perm) +GnomeVFSResult captive_file_init(CaptiveFileObject *captive_file_object,CaptiveVfsObject *captive_vfs_object) { - g_return_val_if_fail(captive_file_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); - g_return_val_if_fail(pathname!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); + g_return_val_if_fail(CAPTIVE_FILE_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS); + g_return_val_if_fail(CAPTIVE_VFS_IS_OBJECT(captive_vfs_object),GNOME_VFS_ERROR_BAD_PARAMETERS); + + g_return_val_if_fail(captive_file_object->vfs==NULL,GNOME_VFS_ERROR_GENERIC); - return captive_file_new_internal(captive_file_object_return,pathname,mode, - TRUE, /* create */ - exclusive, /* create_exclusive */ - perm); /* create_perm */ + captive_file_object->vfs=g_object_ref(captive_vfs_object); + + return GNOME_VFS_OK; } static GnomeVFSResult captive_file_close(CaptiveFileObject *captive_file_object) { -NTSTATUS err; -HANDLE file_Handle; + g_return_val_if_fail(CAPTIVE_FILE_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS); - if (CAPTIVE_IS_SANDBOX_PARENT()) - return captive_sandbox_parent_file_close(captive_file_object); + if (captive_file_object->vfs!=NULL) { + g_assert(CAPTIVE_VFS_IS_OBJECT(captive_file_object->vfs)); + g_object_unref(captive_file_object->vfs); + captive_file_object->vfs=NULL; + } - g_return_val_if_fail(captive_file_object!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); - g_return_val_if_fail(captive_file_object->file_Handle!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); /* already closed */ + return GNOME_VFS_OK; +} - file_Handle=captive_file_object->file_Handle; - captive_file_object->file_Handle=NULL; - err=NtClose(file_Handle); - g_return_val_if_fail(NT_SUCCESS(err),GNOME_VFS_ERROR_GENERIC); - return GNOME_VFS_OK; +CaptiveVfsObject *captive_file_ref_vfs(CaptiveFileObject *captive_file_object) +{ + g_return_val_if_fail(CAPTIVE_FILE_IS_OBJECT(captive_file_object),NULL); + + g_return_val_if_fail(CAPTIVE_VFS_IS_OBJECT(captive_file_object->vfs),NULL); + + return g_object_ref(captive_file_object->vfs); } GnomeVFSResult captive_file_read(CaptiveFileObject *captive_file_object, gpointer buffer,GnomeVFSFileSize num_bytes,GnomeVFSFileSize *bytes_read_return) { -NTSTATUS err; -IO_STATUS_BLOCK file_IoStatusBlock; -LARGE_INTEGER file_offset; -GnomeVFSResult errvfsresult; - - if (CAPTIVE_IS_SANDBOX_PARENT()) - return captive_sandbox_parent_file_read(captive_file_object,buffer,num_bytes,bytes_read_return); - - g_return_val_if_fail(captive_file_object!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); - g_return_val_if_fail(captive_file_object->file_Handle!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); + g_return_val_if_fail(CAPTIVE_FILE_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS); g_return_val_if_fail(buffer!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); g_return_val_if_fail(bytes_read_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); g_return_val_if_fail(num_bytes==(ULONG)num_bytes,GNOME_VFS_ERROR_BAD_PARAMETERS); - file_offset.QuadPart=captive_file_object->offset; - err=NtReadFile( - captive_file_object->file_Handle, /* FileHandle */ - NULL, /* EventHandle; completion signalling; optional */ - NULL, /* ApcRoutine; optional */ - NULL, /* ApcContext; optional */ - &file_IoStatusBlock, /* IoStatusBlock */ - buffer, /* Buffer */ - num_bytes, /* Length */ - &file_offset, /* ByteOffset */ - NULL); /* Key; NULL means no file locking key */ - if (err==STATUS_END_OF_FILE) { - g_return_val_if_fail(file_IoStatusBlock.Status==STATUS_END_OF_FILE,GNOME_VFS_ERROR_GENERIC); - g_return_val_if_fail(file_IoStatusBlock.Information==0,GNOME_VFS_ERROR_GENERIC); - *bytes_read_return=0; - return GNOME_VFS_ERROR_EOF; - } - if (GNOME_VFS_OK!=(errvfsresult=captive_NTSTATUS_to_GnomeVFSResult(err))) - return errvfsresult; - g_return_val_if_fail(NT_SUCCESS(err)==NT_SUCCESS(file_IoStatusBlock.Status),GNOME_VFS_ERROR_GENERIC); - g_return_val_if_fail(NT_SUCCESS(err),GNOME_VFS_ERROR_GENERIC); - g_return_val_if_fail(file_IoStatusBlock.Information<=num_bytes,GNOME_VFS_ERROR_GENERIC); - - captive_file_object->offset+=file_IoStatusBlock.Information; - *bytes_read_return=file_IoStatusBlock.Information; - return GNOME_VFS_OK; + return (*CAPTIVE_FILE_OBJECT_GET_CLASS(captive_file_object)->read) + (captive_file_object,buffer,num_bytes,bytes_read_return); } GnomeVFSResult captive_file_write(CaptiveFileObject *captive_file_object, gconstpointer buffer,GnomeVFSFileSize num_bytes,GnomeVFSFileSize *bytes_written_return) { -NTSTATUS err; -IO_STATUS_BLOCK file_IoStatusBlock; -LARGE_INTEGER file_offset; - - if (CAPTIVE_IS_SANDBOX_PARENT()) - return captive_sandbox_parent_file_write(captive_file_object,buffer,num_bytes,bytes_written_return); - - g_return_val_if_fail(captive_file_object!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); - g_return_val_if_fail(captive_file_object->file_Handle!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); + g_return_val_if_fail(CAPTIVE_FILE_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS); g_return_val_if_fail(buffer!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); g_return_val_if_fail(bytes_written_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); g_return_val_if_fail(num_bytes==(ULONG)num_bytes,GNOME_VFS_ERROR_BAD_PARAMETERS); - file_offset.QuadPart=captive_file_object->offset; - err=NtWriteFile( - captive_file_object->file_Handle, /* FileHandle */ - NULL, /* Event; completion signalling; optional */ - NULL, /* ApcRoutine; optional */ - NULL, /* ApcContext; optional */ - &file_IoStatusBlock, /* IoStatusBlock */ - (gpointer /* de-const */ )buffer, /* Buffer */ - num_bytes, /* Length */ - &file_offset, /* ByteOffset */ - NULL); /* Key; NULL means no file locking key */ - g_return_val_if_fail(NT_SUCCESS(err)==NT_SUCCESS(file_IoStatusBlock.Status),GNOME_VFS_ERROR_GENERIC); - g_return_val_if_fail(NT_SUCCESS(err),GNOME_VFS_ERROR_GENERIC); - g_return_val_if_fail(file_IoStatusBlock.Information==num_bytes,GNOME_VFS_ERROR_GENERIC); - - captive_file_object->offset+=file_IoStatusBlock.Information; - *bytes_written_return=file_IoStatusBlock.Information; - return GNOME_VFS_OK; + return (*CAPTIVE_FILE_OBJECT_GET_CLASS(captive_file_object)->write) + (captive_file_object,buffer,num_bytes,bytes_written_return); } GnomeVFSResult captive_file_seek (CaptiveFileObject *captive_file_object,GnomeVFSSeekPosition whence,GnomeVFSFileOffset offset) { - if (CAPTIVE_IS_SANDBOX_PARENT()) - return captive_sandbox_parent_file_seek(captive_file_object,whence,offset); - - g_return_val_if_fail(captive_file_object!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); - g_return_val_if_fail(captive_file_object->file_Handle!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); - - switch (whence) { - case GNOME_VFS_SEEK_START: - captive_file_object->offset=offset; - break; - case GNOME_VFS_SEEK_CURRENT: - if (0 - || (offset>0 && (captive_file_object->offset+offset)offset) - || (offset<0 && (captive_file_object->offset+offset)>captive_file_object->offset)) - return GNOME_VFS_ERROR_BAD_PARAMETERS; - captive_file_object->offset+=offset; - break; - case GNOME_VFS_SEEK_END: - g_assert_not_reached(); /* NOT IMPLEMENTED YET */ - break; - default: - g_return_val_if_reached(GNOME_VFS_ERROR_BAD_PARAMETERS); - } + g_return_val_if_fail(CAPTIVE_FILE_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS); - return GNOME_VFS_OK; + return (*CAPTIVE_FILE_OBJECT_GET_CLASS(captive_file_object)->seek) + (captive_file_object,whence,offset); } GnomeVFSResult captive_file_tell(CaptiveFileObject *captive_file_object,GnomeVFSFileOffset *offset_return) { - if (CAPTIVE_IS_SANDBOX_PARENT()) - return captive_sandbox_parent_file_tell(captive_file_object,offset_return); + g_return_val_if_fail(CAPTIVE_FILE_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS); - g_return_val_if_fail(captive_file_object!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); - g_return_val_if_fail(captive_file_object->file_Handle!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); - g_return_val_if_fail(offset_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); + return (*CAPTIVE_FILE_OBJECT_GET_CLASS(captive_file_object)->tell) + (captive_file_object,offset_return); +} - *offset_return=captive_file_object->offset; - return GNOME_VFS_OK; + +GnomeVFSResult captive_file_remove(CaptiveFileObject *captive_file_object) +{ + g_return_val_if_fail(CAPTIVE_FILE_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS); + + return (*CAPTIVE_FILE_OBJECT_GET_CLASS(captive_file_object)->remove) + (captive_file_object); +} + + +GnomeVFSResult captive_file_file_info_get(CaptiveFileObject *captive_file_object, + GnomeVFSFileInfo *file_info) +{ + g_return_val_if_fail(CAPTIVE_FILE_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS); + g_return_val_if_fail(file_info!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); + + return (*CAPTIVE_FILE_OBJECT_GET_CLASS(captive_file_object)->file_info_get) + (captive_file_object,file_info); +} + + +GnomeVFSResult captive_file_file_info_set(CaptiveFileObject *captive_file_object, + const GnomeVFSFileInfo *info,GnomeVFSSetFileInfoMask mask) +{ + g_return_val_if_fail(CAPTIVE_FILE_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS); + g_return_val_if_fail(info!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); + + return (*CAPTIVE_FILE_OBJECT_GET_CLASS(captive_file_object)->file_info_set) + (captive_file_object,info,mask); +} + + +GnomeVFSResult captive_file_truncate(CaptiveFileObject *captive_file_object,GnomeVFSFileSize file_size) +{ + g_return_val_if_fail(CAPTIVE_FILE_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS); + + return (*CAPTIVE_FILE_OBJECT_GET_CLASS(captive_file_object)->truncate) + (captive_file_object,file_size); +} + + +GnomeVFSResult captive_file_move(CaptiveFileObject *captive_file_object_old,const gchar *pathname_new,gboolean force_replace) +{ + g_return_val_if_fail(CAPTIVE_FILE_IS_OBJECT(captive_file_object_old),GNOME_VFS_ERROR_BAD_PARAMETERS); + g_return_val_if_fail(pathname_new!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS); + + return (*CAPTIVE_FILE_OBJECT_GET_CLASS(captive_file_object_old)->move) + (captive_file_object_old,pathname_new,force_replace); }