Implemented sub-second W32 filesystem interface by new: CaptiveFileInfoObject
[captive.git] / src / client / gnomevfs / gnome-vfs-method.c
index 447925b..6506a05 100644 (file)
@@ -217,6 +217,7 @@ static GnomeVFSResult captive_gnomevfs_read_directory(GnomeVFSMethod *method,
 {
 GnomeVFSResult errvfsresult;
 CaptiveDirectoryObject *captive_directory_object;
+CaptiveFileInfoObject *captive_file_info_object;
 
        g_return_val_if_fail(method==&GnomeVFSMethod_static,GNOME_VFS_ERROR_BAD_PARAMETERS);
        captive_directory_object=(CaptiveDirectoryObject *)method_handle;
@@ -224,10 +225,17 @@ CaptiveDirectoryObject *captive_directory_object;
        g_return_val_if_fail(file_info!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
 
        G_LOCK(libcaptive);
-       errvfsresult=captive_directory_read(captive_directory_object,file_info);
+       errvfsresult=captive_directory_read(captive_directory_object,&captive_file_info_object);
        G_UNLOCK(libcaptive);
+       if (GNOME_VFS_OK!=errvfsresult)
+               return errvfsresult;
 
-       return errvfsresult;
+       gnome_vfs_file_info_copy(file_info,&captive_file_info_object->p);
+       G_LOCK(libcaptive);
+       g_object_unref(captive_file_info_object);
+       G_UNLOCK(libcaptive);
+
+       return GNOME_VFS_OK;
 }
 
 
@@ -491,6 +499,7 @@ static GnomeVFSResult captive_gnomevfs_get_file_info(GnomeVFSMethod *method,
 GnomeVFSResult errvfsresult;
 CaptiveVfsObject *captive_vfs_object;
 CaptiveFileObject *captive_file_object;
+CaptiveFileInfoObject *captive_file_info_object;
 
        g_return_val_if_fail(method==&GnomeVFSMethod_static,GNOME_VFS_ERROR_BAD_PARAMETERS);
        g_return_val_if_fail(file_info!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
@@ -510,9 +519,17 @@ CaptiveFileObject *captive_file_object;
                return errvfsresult;
 
        G_LOCK(libcaptive);
-       errvfsresult=captive_file_file_info_get(captive_file_object,file_info);
+       errvfsresult=captive_file_file_info_get(captive_file_object,&captive_file_info_object);
        G_UNLOCK(libcaptive);
+       if (GNOME_VFS_OK!=errvfsresult)
+               goto fail_g_object_unref_captive_file_object;
 
+       gnome_vfs_file_info_copy(file_info,&captive_file_info_object->p);
+       G_LOCK(libcaptive);
+       g_object_unref(captive_file_info_object);
+       G_UNLOCK(libcaptive);
+
+fail_g_object_unref_captive_file_object:
        G_LOCK(libcaptive);
        g_object_unref(captive_file_object);
        G_UNLOCK(libcaptive);
@@ -526,6 +543,7 @@ GnomeVFSResult captive_gnomevfs_get_file_info_from_handle(GnomeVFSMethod *method
 {
 GnomeVFSResult errvfsresult;
 CaptiveFileObject *captive_file_object;
+CaptiveFileInfoObject *captive_file_info_object;
 
        g_return_val_if_fail(method==&GnomeVFSMethod_static,GNOME_VFS_ERROR_BAD_PARAMETERS);
        captive_file_object=(CaptiveFileObject *)method_handle;
@@ -534,10 +552,17 @@ CaptiveFileObject *captive_file_object;
        /* handle 'options & GNOME_VFS_FILE_INFO_GET_MIME_TYPE'? */
 
        G_LOCK(libcaptive);
-       errvfsresult=captive_file_file_info_get(captive_file_object,file_info);
+       errvfsresult=captive_file_file_info_get(captive_file_object,&captive_file_info_object);
        G_UNLOCK(libcaptive);
+       if (GNOME_VFS_OK!=errvfsresult)
+               return errvfsresult;
 
-       return errvfsresult;
+       gnome_vfs_file_info_copy(file_info,&captive_file_info_object->p);
+       G_LOCK(libcaptive);
+       g_object_unref(captive_file_info_object);
+       G_UNLOCK(libcaptive);
+
+       return GNOME_VFS_OK;
 }
 
 
@@ -661,6 +686,7 @@ GnomeVFSResult captive_gnomevfs_set_file_info(GnomeVFSMethod *method,
 GnomeVFSResult errvfsresult;
 CaptiveVfsObject *captive_vfs_object;
 CaptiveFileObject *captive_file_object;
+CaptiveFileInfoObject *captive_file_info_object;
 
        g_return_val_if_fail(method==&GnomeVFSMethod_static,GNOME_VFS_ERROR_BAD_PARAMETERS);
        g_return_val_if_fail(info!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
@@ -679,9 +705,26 @@ CaptiveFileObject *captive_file_object;
                return errvfsresult;
 
        G_LOCK(libcaptive);
-       errvfsresult=captive_file_file_info_set(captive_file_object,info,mask);
+       errvfsresult=captive_file_info_object_new(&captive_file_info_object);
+       G_UNLOCK(libcaptive);
+       if (errvfsresult!=GNOME_VFS_OK)
+               goto fail_g_object_unref_captive_file_object;
+
+       captive_file_info_object->p=*info;
+       /* Unsupported by GnomeVFS, see: http://bugzilla.gnome.org/show_bug.cgi?id=325427 */
+       captive_file_info_object->atime_nsec=0;
+       captive_file_info_object->mtime_nsec=0;
+       captive_file_info_object->ctime_nsec=0;
+
+       G_LOCK(libcaptive);
+       errvfsresult=captive_file_file_info_set(captive_file_object,captive_file_info_object,mask);
+       G_UNLOCK(libcaptive);
+
+       G_LOCK(libcaptive);
+       g_object_unref(captive_file_info_object);
        G_UNLOCK(libcaptive);
 
+fail_g_object_unref_captive_file_object:
        G_LOCK(libcaptive);
        g_object_unref(captive_file_object);
        G_UNLOCK(libcaptive);