+file truncate
authorshort <>
Mon, 3 Feb 2003 10:48:27 +0000 (10:48 +0000)
committershort <>
Mon, 3 Feb 2003 10:48:27 +0000 (10:48 +0000)
src/client/libcaptive-gnomevfs/gnome-vfs-method.c
src/libcaptive/client/file.c
src/libcaptive/include/captive/client-file.h

index d8598f0..25c44c4 100644 (file)
@@ -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; */
index 3b87dd9..7b9921f 100644 (file)
@@ -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;
+}
index d64055c..81b3d86 100644 (file)
@@ -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