From: short <> Date: Mon, 3 Feb 2003 10:48:27 +0000 (+0000) Subject: +file truncate X-Git-Tag: captive-0_2~228 X-Git-Url: http://git.jankratochvil.net/?a=commitdiff_plain;h=7ae9e93a42d666432c977f07221a3d903150e388;p=captive.git +file truncate --- diff --git a/src/client/libcaptive-gnomevfs/gnome-vfs-method.c b/src/client/libcaptive-gnomevfs/gnome-vfs-method.c index d8598f0..25c44c4 100644 --- a/src/client/libcaptive-gnomevfs/gnome-vfs-method.c +++ b/src/client/libcaptive-gnomevfs/gnome-vfs-method.c @@ -416,6 +416,53 @@ CaptiveFileObject *captive_file_object; } +GnomeVFSResult captive_gnomevfs_truncate_handle(GnomeVFSMethod *method, + GnomeVFSMethodHandle *handle,GnomeVFSFileSize length,GnomeVFSContext *context) +{ +GnomeVFSResult errvfsresult; +CaptiveFileObject *captive_file_object; + + g_return_val_if_fail(method==&GnomeVFSMethod_static,GNOME_VFS_ERROR_BAD_PARAMETERS); + captive_file_object=(CaptiveFileObject *)handle; + g_return_val_if_fail(CAPTIVE_FILE_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS); + + G_LOCK(libcaptive); + errvfsresult=captive_file_truncate(captive_file_object,length); + G_UNLOCK(libcaptive); + + return errvfsresult; +} + +GnomeVFSResult captive_gnomevfs_truncate(GnomeVFSMethod *method, + GnomeVFSURI *uri,GnomeVFSFileSize length,GnomeVFSContext *context) +{ +GnomeVFSResult errvfsresult; +CaptiveFileObject *captive_file_object; + + g_return_val_if_fail(method==&GnomeVFSMethod_static,GNOME_VFS_ERROR_BAD_PARAMETERS); + + errvfsresult=captive_gnomevfs_uri_parent_init(uri); + g_return_val_if_fail(errvfsresult==GNOME_VFS_OK,errvfsresult); + + G_LOCK(libcaptive); + errvfsresult=captive_file_new_open(&captive_file_object,uri->text, + (GNOME_VFS_OPEN_READ | GNOME_VFS_OPEN_WRITE | GNOME_VFS_OPEN_RANDOM)); /* mode; is it OK? */ + G_UNLOCK(libcaptive); + if (errvfsresult!=GNOME_VFS_OK) + return errvfsresult; + + G_LOCK(libcaptive); + errvfsresult=captive_file_truncate(captive_file_object,length); + G_UNLOCK(libcaptive); + + G_LOCK(libcaptive); + g_object_unref(captive_file_object); + G_UNLOCK(libcaptive); + + return errvfsresult; +} + + /** * captive_gnomevfs_init: * @@ -437,7 +484,7 @@ GnomeVFSMethod *captive_gnomevfs_method_init(const gchar *fs_path) GnomeVFSMethod_static.write =captive_gnomevfs_write; GnomeVFSMethod_static.seek =captive_gnomevfs_seek; GnomeVFSMethod_static.tell =captive_gnomevfs_tell; - /* TODO: GnomeVFSMethodTruncateHandleFunc truncate_handle; */ + GnomeVFSMethod_static.truncate_handle =captive_gnomevfs_truncate_handle; GnomeVFSMethod_static.open_directory =captive_gnomevfs_open_directory; GnomeVFSMethod_static.close_directory =captive_gnomevfs_close_directory; GnomeVFSMethod_static.read_directory =captive_gnomevfs_read_directory; @@ -450,7 +497,7 @@ GnomeVFSMethod *captive_gnomevfs_method_init(const gchar *fs_path) GnomeVFSMethod_static.unlink =captive_gnomevfs_unlink; /* TODO: GnomeVFSMethodCheckSameFSFunc check_same_fs; */ /* TODO: GnomeVFSMethodSetFileInfo set_file_info; */ - /* TODO: GnomeVFSMethodTruncateFunc truncate; */ + GnomeVFSMethod_static.truncate =captive_gnomevfs_truncate; /* TODO: GnomeVFSMethodFindDirectoryFunc find_directory; */ /* TODO: GnomeVFSMethodCreateSymbolicLinkFunc create_symbolic_link; */ /* TODO: GnomeVFSMethodMonitorAddFunc monitor_add; */ diff --git a/src/libcaptive/client/file.c b/src/libcaptive/client/file.c index 3b87dd9..7b9921f 100644 --- a/src/libcaptive/client/file.c +++ b/src/libcaptive/client/file.c @@ -477,3 +477,29 @@ char QueryFile_buf[sizeof(FILE_ALL_INFORMATION) return GNOME_VFS_OK; } + + +GnomeVFSResult captive_file_truncate(CaptiveFileObject *captive_file_object,GnomeVFSFileSize file_size) +{ +NTSTATUS err; +FILE_END_OF_FILE_INFORMATION FileEndOfFileInformation_struct; +IO_STATUS_BLOCK file_IoStatusBlock; +GnomeVFSResult errvfsresult; + + 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); + + FileEndOfFileInformation_struct.EndOfFile.QuadPart=file_size; + + err=NtSetInformationFile( + captive_file_object->file_Handle, /* FileHandle */ + &file_IoStatusBlock, /* IoStatusBlock */ + &FileEndOfFileInformation_struct, /* FileInformation */ + sizeof(FileEndOfFileInformation_struct), /* Length */ + FileEndOfFileInformation); /* FileInformationClass */ + if (GNOME_VFS_OK!=(errvfsresult=captive_NTSTATUS_to_GnomeVFSResult(err))) + return errvfsresult; + g_return_val_if_fail(NT_SUCCESS(err),GNOME_VFS_ERROR_GENERIC); + + return GNOME_VFS_OK; +} diff --git a/src/libcaptive/include/captive/client-file.h b/src/libcaptive/include/captive/client-file.h index d64055c..81b3d86 100644 --- a/src/libcaptive/include/captive/client-file.h +++ b/src/libcaptive/include/captive/client-file.h @@ -64,6 +64,7 @@ GnomeVFSResult captive_file_seek GnomeVFSResult captive_file_tell(CaptiveFileObject *captive_file_object,GnomeVFSFileOffset *offset_return); GnomeVFSResult captive_file_remove(CaptiveFileObject *captive_file_object); GnomeVFSResult captive_file_file_info_get(CaptiveFileObject *captive_file_object,GnomeVFSFileInfo *file_info); +GnomeVFSResult captive_file_truncate(CaptiveFileObject *captive_file_object,GnomeVFSFileSize file_size); G_END_DECLS