}
+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:
*
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;
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; */
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;
+}