Implemented sub-second W32 filesystem interface by new: CaptiveFileInfoObject
authorlace <>
Sun, 1 Jan 2006 07:24:34 +0000 (07:24 +0000)
committerlace <>
Sun, 1 Jan 2006 07:24:34 +0000 (07:24 +0000)
 - Fixed FUSE uninitialized sub-seconds fields.
   - Bugreported by: Frederic L. W. Meunier

41 files changed:
configure.ac
src/client/bug-replay/main.c
src/client/cmdline/cmd_info.c
src/client/cmdline/cmd_ls.c
src/client/cmdline/file_info.c
src/client/cmdline/file_info.h
src/client/fuse/Makefile.am
src/client/fuse/capfuse_captive_file_info_object.c [new file with mode: 0644]
src/client/fuse/capfuse_captive_file_info_object.h [moved from src/client/fuse/gnomevfsfileinfo.h with 67% similarity]
src/client/fuse/gnomevfsfileinfo.c [deleted file]
src/client/fuse/op_chmod.c
src/client/fuse/op_getattr.c
src/client/fuse/op_readdir.c
src/client/fuse/op_utime.c
src/client/gnomevfs/gnome-vfs-method.c
src/libcaptive/client/Makefile.am
src/libcaptive/client/directory-parent.c
src/libcaptive/client/directory-slave.c
src/libcaptive/client/directory.c
src/libcaptive/client/directory.h
src/libcaptive/client/file-info.c [new file with mode: 0644]
src/libcaptive/client/file-parent.c
src/libcaptive/client/file-slave.c
src/libcaptive/client/file.c
src/libcaptive/client/file.h
src/libcaptive/include/captive/Makefile.am
src/libcaptive/include/captive/client-directory.h
src/libcaptive/include/captive/client-file-info.h [new file with mode: 0644]
src/libcaptive/include/captive/client-file.h
src/libcaptive/include/captive/rtl-time.h [new file with mode: 0644]
src/libcaptive/rtl/Makefile.am
src/libcaptive/rtl/time.c [new file with mode: 0644]
src/libcaptive/sandbox/FileInfo.c
src/libcaptive/sandbox/FileInfo.h
src/libcaptive/sandbox/parent-Directory.c
src/libcaptive/sandbox/parent-Directory.h
src/libcaptive/sandbox/parent-File.c
src/libcaptive/sandbox/parent-File.h
src/libcaptive/sandbox/sandbox.idl
src/libcaptive/sandbox/server-Directory.c
src/libcaptive/sandbox/server-File.c

index bbddb7d..51d8f47 100644 (file)
@@ -336,6 +336,14 @@ if test x$enable_fuse != xno;then
                fi
                ])
 fi
+if $have_fuse;then
+       AC_CHECK_MEMBERS([struct stat.st_atim])
+       AC_CHECK_MEMBERS([struct stat.st_atimensec])
+       AC_CHECK_MEMBERS([struct stat.st_mtim])
+       AC_CHECK_MEMBERS([struct stat.st_mtimensec])
+       AC_CHECK_MEMBERS([struct stat.st_ctim])
+       AC_CHECK_MEMBERS([struct stat.st_ctimensec])
+fi
 AM_CONDITIONAL(ENABLE_FUSE,[ $have_fuse ])
 # Avoid default backward compatibility mode - see the heading of: <fuse.h>
 FUSE_CFLAGS="$FUSE_CFLAGS -DFUSE_USE_VERSION=22"
index 2c4b5cf..4e6d5c3 100644 (file)
@@ -388,11 +388,13 @@ CaptiveVfsVolumeInfo volume_info;
                        continue;
                        }
                if (!xmlStrcmp(xml_node->name,BAD_CAST "directory_read")) {
-GnomeVFSFileInfo file_info;
+CaptiveFileInfoObject *captive_file_info_object;
 
                        captive_directory_object=CAPTIVE_DIRECTORY_OBJECT(object);
-                       errgnomevfsresult=captive_directory_read(captive_directory_object,&file_info);
+                       errgnomevfsresult=captive_directory_read(captive_directory_object,&captive_file_info_object);
                        g_assert(!strcmp(gnome_vfs_result_to_string(errgnomevfsresult),GET_PROP_STRING("result")));
+                       if (GNOME_VFS_OK==errgnomevfsresult)
+                               g_object_unref(captive_file_info_object);
                        continue;
                        }
                if (!xmlStrcmp(xml_node->name,BAD_CAST "directory_remove")) {
@@ -492,23 +494,26 @@ GnomeVFSFileOffset offset;
                        continue;
                        }
                if (!xmlStrcmp(xml_node->name,BAD_CAST "file_file_info_get")) {
-GnomeVFSFileInfo file_info;
+CaptiveFileInfoObject *captive_file_info_object;
 
                        captive_file_object=CAPTIVE_FILE_OBJECT(object);
-                       errgnomevfsresult=captive_file_file_info_get(captive_file_object,&file_info);
+                       errgnomevfsresult=captive_file_file_info_get(captive_file_object,&captive_file_info_object);
                        g_assert(!strcmp(gnome_vfs_result_to_string(errgnomevfsresult),GET_PROP_STRING("result")));
+                       if (GNOME_VFS_OK==errgnomevfsresult)
+                               g_object_unref(captive_file_info_object);
                        continue;
                        }
                if (!xmlStrcmp(xml_node->name,BAD_CAST "file_file_info_set")) {
-GnomeVFSFileInfo file_info;
+CaptiveFileInfoObject *captive_file_info_object;
 
                        captive_file_object=CAPTIVE_FILE_OBJECT(object);
-                       /* FIXME: We do not have 'file_info' content in the bug file! */
-                       errgnomevfsresult=captive_file_file_info_get(captive_file_object,&file_info);
+                       /* FIXME: We do not have 'captive_file_info_object' content in the bug file! */
+                       errgnomevfsresult=captive_file_file_info_get(captive_file_object,&captive_file_info_object);
                        g_assert(errgnomevfsresult==GNOME_VFS_OK);
-                       errgnomevfsresult=captive_file_file_info_set(captive_file_object,&file_info,
+                       errgnomevfsresult=captive_file_file_info_set(captive_file_object,captive_file_info_object,
                                        GET_PROP_GINT64("mask"));
                        g_assert(!strcmp(gnome_vfs_result_to_string(errgnomevfsresult),GET_PROP_STRING("result")));
+                       g_object_unref(captive_file_info_object);
                        continue;
                        }
                if (!xmlStrcmp(xml_node->name,BAD_CAST "file_truncate")) {
index f937429..a58e173 100644 (file)
@@ -53,7 +53,7 @@ const struct poptOption cmd_info_table[]={
 void cmd_info(const char **cmd_argv,GError **errp)
 {
 CaptiveFileObject *captive_file_object;
-GnomeVFSFileInfo file_info;
+CaptiveFileInfoObject *captive_file_info_object;
 const gchar *filepath;
 
        g_return_if_fail(!errp || !*errp);
@@ -73,13 +73,14 @@ const gchar *filepath;
 
        if (!errvfsresult_to_gerr(errp,captive_file_file_info_get(
                        captive_file_object,    /* captive_file_object */
-                       &file_info))) { /* file_info */
+                       &captive_file_info_object))) {  /* file_info */
                err_cleanup(errp);
                g_set_error(errp,CMDLINE_CMD_INFO_ERROR,CMDLINE_CMD_INFO_ERROR_GETTING_FILE_INFO,
                                _("Cannot get file information about: %s"),CMD_LOCALE_FROM_UTF8_ALLOCA(filepath));
                goto err_unref;
                }
-       file_info_dump_full(&file_info,errp);
+       cmdline_captive_file_info_object_dump_full(captive_file_info_object,errp);
+       g_object_unref(captive_file_info_object);
        if (*errp)
                goto err_unref;
 
index 0ed1b35..dc1479f 100644 (file)
@@ -53,7 +53,7 @@ const struct poptOption cmd_ls_table[]={
 void cmd_ls(const char **cmd_argv,GError **errp)
 {
 CaptiveDirectoryObject *captive_directory_object;
-GnomeVFSFileInfo file_info;
+CaptiveFileInfoObject *captive_file_info_object;
 GnomeVFSResult errvfsresult;
 const gchar *targetdir;
 
@@ -73,11 +73,11 @@ const gchar *targetdir;
 
        while (GNOME_VFS_OK==(errvfsresult=captive_directory_read(
                        captive_directory_object,       /* captive_directory_object */
-                       &file_info))) { /* file_info */
-               file_info_dump_line(&file_info,errp);
+                       &captive_file_info_object))) {  /* captive_file_info_object_return */
+               cmdline_captive_file_info_object_dump_line(captive_file_info_object,errp);
+               g_object_unref(captive_file_info_object);
                if (*errp)
                        goto err_unref;
-               /* FIXME: Memory leaked 'file_info'? */
                }
        if (GNOME_VFS_ERROR_EOF!=errvfsresult) {
 gboolean errbool;
index eab9d62..f3fc342 100644 (file)
@@ -42,47 +42,61 @@ GQuark r=0;
 }
 
 
-void file_info_dump_line(const GnomeVFSFileInfo *file_info,GError **errp)
+void cmdline_captive_file_info_object_dump_line(CaptiveFileInfoObject *captive_file_info_object,GError **errp)
 {
 const gchar *file_type,*file_perms;
 gchar *file_size;
 
+       g_return_if_fail(CAPTIVE_FILE_INFO_IS_OBJECT(captive_file_info_object));
        g_return_if_fail(!errp || !*errp);
 
-       switch (!(file_info->valid_fields & GNOME_VFS_FILE_INFO_FIELDS_TYPE) ? GNOME_VFS_FILE_TYPE_UNKNOWN : file_info->type) {
+       switch (!(captive_file_info_object->p.valid_fields & GNOME_VFS_FILE_INFO_FIELDS_TYPE) ? GNOME_VFS_FILE_TYPE_UNKNOWN : captive_file_info_object->p.type) {
                case GNOME_VFS_FILE_TYPE_REGULAR:   file_type="FILE"; break;
                case GNOME_VFS_FILE_TYPE_DIRECTORY: file_type="DIR ";  break;
                case GNOME_VFS_FILE_TYPE_SOCKET:    file_type="DEV ";  break;
                default:                            file_type="??? ";  break;
                }
 
-       if (!(file_info->valid_fields & GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS))
+       if (!(captive_file_info_object->p.valid_fields & GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS))
                file_perms="???";
-       else if (file_info->permissions & GNOME_VFS_PERM_USER_WRITE)
+       else if (captive_file_info_object->p.permissions & GNOME_VFS_PERM_USER_WRITE)
                file_perms="r/w";
        else
                file_perms="r/o";
 
-       if (file_info->valid_fields & GNOME_VFS_FILE_INFO_FIELDS_SIZE)
-               file_size=g_strdup_printf("%8" GNOME_VFS_SIZE_FORMAT_STR,file_info->size);
+       if (captive_file_info_object->p.valid_fields & GNOME_VFS_FILE_INFO_FIELDS_SIZE)
+               file_size=g_strdup_printf("%8" GNOME_VFS_SIZE_FORMAT_STR,captive_file_info_object->p.size);
        else
                file_size=g_strdup_printf("%8s","???");
 
        /*      type pm sz nm */
-       printf("[%s] %s %s %s\n",file_type,file_perms,file_size,CMD_LOCALE_FROM_UTF8_ALLOCA(file_info->name));
+       printf("[%s] %s %s %s\n",file_type,file_perms,file_size,CMD_LOCALE_FROM_UTF8_ALLOCA(captive_file_info_object->p.name));
        
        g_free(file_size);
 }
 
+static void timespec_split_print(time_t sec,guint nsec)
+{
+char *ctime_buf,*s;
+
+       g_return_if_fail(sec!=0);
+       g_return_if_fail(nsec<1000000000);
+
+       ctime_buf=ctime(&sec);
+       if ((s=strchr(ctime_buf,'\n')))
+               *s='\0';
+       printf("%s +%09u nsec\n",ctime_buf,(unsigned)nsec);
+}
 
-void file_info_dump_full(const GnomeVFSFileInfo *file_info,GError **errp)
+void cmdline_captive_file_info_object_dump_full(CaptiveFileInfoObject *captive_file_info_object,GError **errp)
 {
+       g_return_if_fail(CAPTIVE_FILE_INFO_IS_OBJECT(captive_file_info_object));
        g_return_if_fail(!errp || !*errp);
 
-       printf("Filename: %s\n",CMD_LOCALE_FROM_UTF8_ALLOCA(file_info->name));
+       printf("Filename: %s\n",CMD_LOCALE_FROM_UTF8_ALLOCA(captive_file_info_object->p.name));
 
        fputs("File type: ",stdout);
-       switch (!(file_info->valid_fields & GNOME_VFS_FILE_INFO_FIELDS_TYPE) ? GNOME_VFS_FILE_TYPE_UNKNOWN : file_info->type) {
+       switch (!(captive_file_info_object->p.valid_fields & GNOME_VFS_FILE_INFO_FIELDS_TYPE) ? GNOME_VFS_FILE_TYPE_UNKNOWN : captive_file_info_object->p.type) {
                case GNOME_VFS_FILE_TYPE_REGULAR:   puts("REGULAR");   break;
                case GNOME_VFS_FILE_TYPE_DIRECTORY: puts("DIRECTORY"); break;
                case GNOME_VFS_FILE_TYPE_SOCKET:    puts("SOCKET");    break;
@@ -90,40 +104,40 @@ void file_info_dump_full(const GnomeVFSFileInfo *file_info,GError **errp)
                }
 
        fputs("File size: ",stdout);
-       if (file_info->valid_fields & GNOME_VFS_FILE_INFO_FIELDS_SIZE)
-               printf("%" GNOME_VFS_SIZE_FORMAT_STR "\n",file_info->size);
+       if (captive_file_info_object->p.valid_fields & GNOME_VFS_FILE_INFO_FIELDS_SIZE)
+               printf("%" GNOME_VFS_SIZE_FORMAT_STR "\n",captive_file_info_object->p.size);
        else
                puts("???");
 
        fputs("Block count: ",stdout);
-       if (file_info->valid_fields & GNOME_VFS_FILE_INFO_FIELDS_BLOCK_COUNT)
-               printf("%" GNOME_VFS_SIZE_FORMAT_STR "\n",file_info->block_count);
+       if (captive_file_info_object->p.valid_fields & GNOME_VFS_FILE_INFO_FIELDS_BLOCK_COUNT)
+               printf("%" GNOME_VFS_SIZE_FORMAT_STR "\n",captive_file_info_object->p.block_count);
        else
                puts("???");
 
        fputs("Writable?: ",stdout);
-       if (!(file_info->valid_fields & GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS))
+       if (!(captive_file_info_object->p.valid_fields & GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS))
                puts("???");
-       else if (file_info->permissions & GNOME_VFS_PERM_USER_WRITE)
+       else if (captive_file_info_object->p.permissions & GNOME_VFS_PERM_USER_WRITE)
                puts("read/write");
        else
                puts("read/only");
 
        fputs("Access-time (atime): ",stdout);
-       if (!(file_info->valid_fields & GNOME_VFS_FILE_INFO_FIELDS_ATIME))
+       if (!(captive_file_info_object->p.valid_fields & GNOME_VFS_FILE_INFO_FIELDS_ATIME))
                puts("???");
        else
-               fputs(ctime(&file_info->atime),stdout);
+               timespec_split_print(captive_file_info_object->p.atime,captive_file_info_object->atime_nsec);
 
        fputs("Modification-time (mtime): ",stdout);
-       if (!(file_info->valid_fields & GNOME_VFS_FILE_INFO_FIELDS_MTIME))
+       if (!(captive_file_info_object->p.valid_fields & GNOME_VFS_FILE_INFO_FIELDS_MTIME))
                puts("???");
        else
-               fputs(ctime(&file_info->mtime),stdout);
+               timespec_split_print(captive_file_info_object->p.mtime,captive_file_info_object->mtime_nsec);
 
        fputs("Change-time (ctime): ",stdout);
-       if (!(file_info->valid_fields & GNOME_VFS_FILE_INFO_FIELDS_CTIME))
+       if (!(captive_file_info_object->p.valid_fields & GNOME_VFS_FILE_INFO_FIELDS_CTIME))
                puts("???");
        else
-               fputs(ctime(&file_info->ctime),stdout);
+               timespec_split_print(captive_file_info_object->p.ctime,captive_file_info_object->ctime_nsec);
 }
index 8881837..5c7ac66 100644 (file)
@@ -23,6 +23,7 @@
 
 #include <glib/gerror.h>
 #include <libgnomevfs/gnome-vfs-file-info.h>
+#include <captive/client-file-info.h>
 
 
 #define CMDLINE_FILE_INFO_ERROR (cmdline_file_info_error_quark())
@@ -33,8 +34,8 @@ typedef enum {
        } CmdlineFileInfoError;
 
 
-void file_info_dump_line(const GnomeVFSFileInfo *file_info,GError **errp);
-void file_info_dump_full(const GnomeVFSFileInfo *file_info,GError **errp);
+void cmdline_captive_file_info_object_dump_line(CaptiveFileInfoObject *captive_file_info_object,GError **errp);
+void cmdline_captive_file_info_object_dump_full(CaptiveFileInfoObject *captive_file_info_object,GError **errp);
 
 
 #endif /* _CAPTIVE_CLIENT_CMDLINE_FILE_INFO_H */
index ee1bbc8..78fcb62 100644 (file)
@@ -60,8 +60,8 @@ mount_captive_SOURCES= \
                op_utime.h \
                gnomevfsresult.c \
                gnomevfsresult.h \
-               gnomevfsfileinfo.c \
-               gnomevfsfileinfo.h \
+               capfuse_captive_file_info_object.c \
+               capfuse_captive_file_info_object.h \
                main.c \
                main.h
 mount_captive_CFLAGS=                   $(GNOME_VFS_CFLAGS) $(LIBXML_CFLAGS) $(FUSE_CFLAGS)
diff --git a/src/client/fuse/capfuse_captive_file_info_object.c b/src/client/fuse/capfuse_captive_file_info_object.c
new file mode 100644 (file)
index 0000000..ca50361
--- /dev/null
@@ -0,0 +1,164 @@
+/* $Id$
+ * Client fuse interface handling of 'GnomeVFSFileInfo' for libcaptive
+ * Copyright (C) 2005 Jan Kratochvil <project-captive@jankratochvil.net>
+ * 
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; exactly version 2 of June 1991 is required
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+
+#include "config.h"
+
+#include <glib/gmessages.h>
+#include <errno.h>
+#include <sys/stat.h>
+#include <time.h>
+#include <sys/time.h>
+
+#include <captive/client-file-info.h>
+#include <captive/client-vfs.h>
+
+#include "capfuse_captive_file_info_object.h"  /* self */
+#include "gnomevfsresult.h"
+#include "main.h"
+
+
+static CaptiveVfsVolumeInfo volume_info;
+static gboolean volume_info_valid=FALSE;
+
+
+int capfuse_captive_file_info_object_to_stat(struct stat *stat,CaptiveFileInfoObject *captive_file_info_object)
+{
+guint nsec;
+
+       g_return_val_if_fail(stat!=NULL,-EINVAL);
+       g_return_val_if_fail(CAPTIVE_FILE_INFO_IS_OBJECT(captive_file_info_object),-EINVAL);
+
+       if (!volume_info_valid) {
+GnomeVFSResult errvfsresult;
+
+               if (GNOME_VFS_OK!=(errvfsresult=captive_vfs_volume_info_get(capfuse_captive_vfs_object,&volume_info)))
+                       return -gnomevfsresult_to_errno(errvfsresult);
+               volume_info_valid=TRUE;
+               }
+
+       stat->st_mode=0;
+
+       if (captive_file_info_object->p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_TYPE)
+               switch (captive_file_info_object->p.type) {
+                       case GNOME_VFS_FILE_TYPE_REGULAR:
+                               stat->st_mode|=S_IFREG;
+                               if (1 /* !private */)
+                                       stat->st_mode|=0444;
+                               break;
+                       case GNOME_VFS_FILE_TYPE_DIRECTORY:
+                               stat->st_mode|=S_IFDIR;
+                               if (1 /* !private */)
+                                       stat->st_mode|=0555;
+                               break;
+                       default:
+                               g_warning("Unknown GnomeVFSFileInfo.type=%d of: %s",(int)captive_file_info_object->p.type,captive_file_info_object->p.name);
+                               return -EINVAL;
+                       }
+       if (captive_file_info_object->p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS)
+               stat->st_mode|=captive_file_info_object->p.permissions & 0777;
+       else
+               stat->st_mode|=0600;
+
+       if (!(captive_file_info_object->p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_LINK_COUNT))
+               stat->st_nlink=1;
+       else
+               stat->st_nlink=captive_file_info_object->p.link_count;
+
+       stat->st_uid=0; /* we own the file */
+       stat->st_gid=0; /* we own the file */
+
+       if (!(captive_file_info_object->p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_SIZE))
+               stat->st_size=0;
+       else
+               stat->st_size=captive_file_info_object->p.size;
+
+       if (!(captive_file_info_object->p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_ATIME))
+               capfuse_timespec_split_get(&stat->st_atime,&nsec);
+       else {
+               stat->st_atime=captive_file_info_object->p.atime;
+               nsec=captive_file_info_object->atime_nsec;
+               }
+#if defined(HAVE_STRUCT_STAT_ST_ATIM)
+       g_assert(&stat->st_atim.tv_sec==&stat->st_atime);
+       stat->st_atim.tv_nsec=nsec;
+#elif defined(HAVE_STRUCT_STAT_ST_ATIMENSEC)
+       stat->st_atimensec=nsec;
+#endif
+
+       if (!(captive_file_info_object->p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_MTIME))
+               capfuse_timespec_split_get(&stat->st_mtime,&nsec);
+       else {
+               stat->st_mtime=captive_file_info_object->p.mtime;
+               nsec=captive_file_info_object->mtime_nsec;
+               }
+#if defined(HAVE_STRUCT_STAT_ST_MTIM)
+       g_assert(&stat->st_mtim.tv_sec==&stat->st_mtime);
+       stat->st_mtim.tv_nsec=nsec;
+#elif defined(HAVE_STRUCT_STAT_ST_MTIMENSEC)
+       stat->st_mtimensec=nsec;
+#endif
+
+       if (!(captive_file_info_object->p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_CTIME))
+               capfuse_timespec_split_get(&stat->st_ctime,&nsec);
+       else {
+               stat->st_ctime=captive_file_info_object->p.ctime;
+               nsec=captive_file_info_object->ctime_nsec;
+               }
+#if defined(HAVE_STRUCT_STAT_ST_CTIM)
+       g_assert(&stat->st_ctim.tv_sec==&stat->st_ctime);
+       stat->st_ctim.tv_nsec=nsec;
+#elif defined(HAVE_STRUCT_STAT_ST_CTIMENSEC)
+       stat->st_ctimensec=nsec;
+#endif
+
+       stat->st_blksize=volume_info.block_size;
+
+       if (!(captive_file_info_object->p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_BLOCK_COUNT)) {
+               /* Rounding? */
+               /* 0? */
+               stat->st_blocks=stat->st_size/volume_info.block_size;
+               }
+       else
+               stat->st_blocks=captive_file_info_object->p.block_count;
+
+       stat->st_dev=0;
+       stat->st_rdev=0;        /* Never to be used. */
+       stat->st_ino=0;
+
+       return 0;
+}
+
+
+void capfuse_timespec_split_get(time_t *sec_return,guint *nsec_return)
+{
+int errint;
+struct timeval timeval;
+
+       g_return_if_fail(sec_return!=NULL);
+       g_return_if_fail(nsec_return!=NULL);
+
+       errint=gettimeofday(
+                       &timeval,       /* (struct timeval *)tv */
+                       NULL);  /* (struct timezone *)tz */
+       g_assert(!errint);
+
+       *sec_return=timeval.tv_sec;
+       /* FIXME: Where to get 'usec' precision? */
+       *nsec_return=timeval.tv_usec*1000;
+}
similarity index 67%
rename from src/client/fuse/gnomevfsfileinfo.h
rename to src/client/fuse/capfuse_captive_file_info_object.h
index f37098c..e00fee7 100644 (file)
  */
 
 
-#ifndef _CAPTIVE_CLIENT_FUSE_GNOMEVFSFILEINFO_H
-#define _CAPTIVE_CLIENT_FUSE_GNOMEVFSFILEINFO_H 1
+#ifndef _CAPTIVE_CLIENT_FUSE_CAPFUSE_CAPTIVE_FILE_INFO_OBJECT_H
+#define _CAPTIVE_CLIENT_FUSE_CAPFUSE_CAPTIVE_FILE_INFO_OBJECT_H 1
 
 
-#include <libgnomevfs/gnome-vfs-file-info.h>
 #include <sys/stat.h>
 
+#include <captive/client-file-info.h>
 
-int gnomevfsfileinfo_to_stat(struct stat *stat,const GnomeVFSFileInfo *file_info);
 
+int capfuse_captive_file_info_object_to_stat(struct stat *stat,CaptiveFileInfoObject *captive_file_info_object);
+void capfuse_timespec_split_get(time_t *sec_return,guint *nsec_return);
 
-#endif /* _CAPTIVE_CLIENT_FUSE_GNOMEVFSFILEINFO_H */
+
+#endif /* _CAPTIVE_CLIENT_FUSE_CAPFUSE_CAPTIVE_FILE_INFO_OBJECT_H */
diff --git a/src/client/fuse/gnomevfsfileinfo.c b/src/client/fuse/gnomevfsfileinfo.c
deleted file mode 100644 (file)
index 4f07b76..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-/* $Id$
- * Client fuse interface handling of 'GnomeVFSFileInfo' for libcaptive
- * Copyright (C) 2005 Jan Kratochvil <project-captive@jankratochvil.net>
- * 
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; exactly version 2 of June 1991 is required
- * 
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-#include "config.h"
-
-#include <libgnomevfs/gnome-vfs-result.h>
-#include <glib/gmessages.h>
-#include <errno.h>
-#include <sys/stat.h>
-#include <libgnomevfs/gnome-vfs-file-info.h>
-#include <time.h>
-
-#include <captive/client-vfs.h>
-
-#include "gnomevfsresult.h"    /* self */
-#include "main.h"
-
-
-static CaptiveVfsVolumeInfo volume_info;
-static gboolean volume_info_valid=FALSE;
-
-
-int gnomevfsfileinfo_to_stat(struct stat *stat,const GnomeVFSFileInfo *file_info)
-{
-       g_return_val_if_fail(stat!=NULL,-EINVAL);
-       g_return_val_if_fail(file_info!=NULL,-EINVAL);
-
-       if (!volume_info_valid) {
-GnomeVFSResult errvfsresult;
-
-               if (GNOME_VFS_OK!=(errvfsresult=captive_vfs_volume_info_get(capfuse_captive_vfs_object,&volume_info)))
-                       return -gnomevfsresult_to_errno(errvfsresult);
-               volume_info_valid=TRUE;
-               }
-
-       stat->st_mode=0;
-
-       if (file_info->valid_fields&GNOME_VFS_FILE_INFO_FIELDS_TYPE)
-               switch (file_info->type) {
-                       case GNOME_VFS_FILE_TYPE_REGULAR:
-                               stat->st_mode|=S_IFREG;
-                               if (1 /* !private */)
-                                       stat->st_mode|=0444;
-                               break;
-                       case GNOME_VFS_FILE_TYPE_DIRECTORY:
-                               stat->st_mode|=S_IFDIR;
-                               if (1 /* !private */)
-                                       stat->st_mode|=0555;
-                               break;
-                       default:
-                               g_warning("Unknown GnomeVFSFileInfo.type=%d of: %s",(int)file_info->type,file_info->name);
-                               return -EINVAL;
-                       }
-       if (file_info->valid_fields&GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS)
-               stat->st_mode|=file_info->permissions & 0777;
-       else
-               stat->st_mode|=0600;
-
-       if (!(file_info->valid_fields&GNOME_VFS_FILE_INFO_FIELDS_LINK_COUNT))
-               stat->st_nlink=1;
-       else
-               stat->st_nlink=file_info->link_count;
-
-       stat->st_uid=0; /* we own the file */
-       stat->st_gid=0; /* we own the file */
-
-       if (!(file_info->valid_fields&GNOME_VFS_FILE_INFO_FIELDS_SIZE))
-               stat->st_size=0;
-       else
-               stat->st_size=file_info->size;
-
-       if (!(file_info->valid_fields&GNOME_VFS_FILE_INFO_FIELDS_ATIME))
-               stat->st_atime=time(NULL);
-       else
-               stat->st_atime=file_info->atime;
-
-       if (!(file_info->valid_fields&GNOME_VFS_FILE_INFO_FIELDS_MTIME))
-               stat->st_mtime=time(NULL);
-       else
-               stat->st_mtime=file_info->mtime;
-
-       if (!(file_info->valid_fields&GNOME_VFS_FILE_INFO_FIELDS_CTIME))
-               stat->st_ctime=time(NULL);
-       else
-               stat->st_ctime=file_info->ctime;
-
-       stat->st_blksize=volume_info.block_size;
-
-       if (!(file_info->valid_fields&GNOME_VFS_FILE_INFO_FIELDS_BLOCK_COUNT)) {
-               /* Rounding? */
-               /* 0? */
-               stat->st_blocks=stat->st_size/volume_info.block_size;
-               }
-       else
-               stat->st_blocks=file_info->block_count;
-
-       stat->st_dev=0;
-       stat->st_rdev=0;        /* Never to be used. */
-       stat->st_ino=0;
-
-       return 0;
-}
index e09e6c3..3813a67 100644 (file)
 #include <captive/client-file.h>
 #include <sys/stat.h>
 #include <captive/macros.h>
+#include <captive/client-file-info.h>
 
 #include "op_chmod.h"  /* self */
 #include "main.h"
 #include "gnomevfsresult.h"
-#include "gnomevfsfileinfo.h"
 
 
 int op_chmod(const char *path,mode_t mode)
 {
 CaptiveFileObject *captive_file_object;
 GnomeVFSResult errvfsresult;
-GnomeVFSFileInfo file_info;
+CaptiveFileInfoObject *captive_file_info_object;
 
        g_return_val_if_fail(path!=NULL,-EINVAL);
 
@@ -51,12 +51,18 @@ GnomeVFSFileInfo file_info;
        if (GNOME_VFS_OK!=(errvfsresult=captive_file_new_open(&captive_file_object,capfuse_captive_vfs_object,path,0)))
                return -gnomevfsresult_to_errno(errvfsresult);
 
-       file_info.valid_fields=0
+       if (GNOME_VFS_OK!=(errvfsresult=captive_file_info_object_new(&captive_file_info_object))) {
+               g_object_unref(captive_file_object);
+               return -gnomevfsresult_to_errno(errvfsresult);
+               }
+
+       captive_file_info_object->p.valid_fields=0
                        |GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS
                        |GNOME_VFS_FILE_INFO_FIELDS_ACCESS;
-       file_info.permissions=mode;
-       errvfsresult=captive_file_file_info_set(captive_file_object,&file_info,GNOME_VFS_SET_FILE_INFO_PERMISSIONS);
+       captive_file_info_object->p.permissions=mode;
+       errvfsresult=captive_file_file_info_set(captive_file_object,captive_file_info_object,GNOME_VFS_SET_FILE_INFO_PERMISSIONS);
 
+       g_object_unref(captive_file_info_object);
        g_object_unref(captive_file_object);
        if (GNOME_VFS_OK!=errvfsresult)
                return -gnomevfsresult_to_errno(errvfsresult);
index 071027e..f72a8a9 100644 (file)
 #include "op_getattr.h"        /* self */
 #include "main.h"
 #include "gnomevfsresult.h"
-#include "gnomevfsfileinfo.h"
+#include "capfuse_captive_file_info_object.h"
 
 
 int op_getattr(const char *path,struct stat *buf)
 {
 CaptiveFileObject *captive_file_object;
 GnomeVFSResult errvfsresult;
-GnomeVFSFileInfo file_info;
+CaptiveFileInfoObject *captive_file_info_object;
 int errint;
 
        g_return_val_if_fail(path!=NULL,-EINVAL);
@@ -45,15 +45,13 @@ int errint;
        if (GNOME_VFS_OK!=(errvfsresult=captive_file_new_open(&captive_file_object,capfuse_captive_vfs_object,path,0)))
                return -gnomevfsresult_to_errno(errvfsresult);
 
-       /* Pre-clear to take care of any fields not touched by libcaptive there. */
-       CAPTIVE_MEMZERO(&file_info);
-       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_object_unref(captive_file_object);
        if (GNOME_VFS_OK!=errvfsresult)
                return -gnomevfsresult_to_errno(errvfsresult);
-       errint=gnomevfsfileinfo_to_stat(buf,&file_info);
-       gnome_vfs_file_info_clear(&file_info);
+       errint=capfuse_captive_file_info_object_to_stat(buf,captive_file_info_object);
+       g_object_unref(captive_file_info_object);
 
        return errint;
 }
index 5bec35f..6aceb66 100644 (file)
@@ -28,7 +28,7 @@
 #include "op_readdir.h"        /* self */
 #include "main.h"
 #include "gnomevfsresult.h"
-#include "gnomevfsfileinfo.h"
+#include "capfuse_captive_file_info_object.h"
 
 
 /* int (*fuse_fill_dir_t)(void *buf,const char *name,const struct stat *stbuf,off_t off); */
@@ -37,7 +37,7 @@ int op_readdir(const char *path,void *buf,fuse_fill_dir_t fill_dir,off_t off,str
 {
 CaptiveDirectoryObject *captive_directory_object;
 GnomeVFSResult errvfsresult;
-GnomeVFSFileInfo file_info;
+CaptiveFileInfoObject *captive_file_info_object;
 
        g_return_val_if_fail(path!=NULL,-EINVAL);
        g_return_val_if_fail(fill_dir!=NULL,-EINVAL);
@@ -46,23 +46,21 @@ GnomeVFSFileInfo file_info;
        captive_directory_object=(gpointer)fi->fh;
        g_return_val_if_fail(CAPTIVE_DIRECTORY_IS_OBJECT(captive_directory_object),-EINVAL);
 
-       /* Pre-clear to take care of any fields not touched by libcaptive there. */
-       CAPTIVE_MEMZERO(&file_info);
-       gnome_vfs_file_info_clear(&file_info);
        while (GNOME_VFS_OK==(errvfsresult=captive_directory_read(
                        captive_directory_object,       /* captive_directory_object */
-                       &file_info))) { /* file_info */
+                       &captive_file_info_object))) {  /* captive_file_info_object */
 struct stat stat;
 int errint;
 
-               if ((errint=gnomevfsfileinfo_to_stat(&stat,&file_info)))
+               errint=capfuse_captive_file_info_object_to_stat(&stat,captive_file_info_object);
+               g_object_unref(captive_file_info_object);
+               if (errint)
                        return errint;
                errint=(*fill_dir)(
                                buf,    /* buf; opaque */
-                               file_info.name, /* name */
+                               captive_file_info_object->p.name,       /* name */
                                &stat,  /* stbuf */
                                0);     /* off; operation mode 1 - <fuse.h>/(*readdir) */
-               gnome_vfs_file_info_clear(&file_info);
                if (errint) {
                        /* FIXME: Is it right? Examples do so. */
                        break;
index 99f74fb..22b9386 100644 (file)
 #include <sys/stat.h>
 #include <captive/macros.h>
 #include <time.h>
+#include <captive/client-file-info.h>
 
 #include "op_utime.h"  /* self */
 #include "main.h"
 #include "gnomevfsresult.h"
-#include "gnomevfsfileinfo.h"
+#include "capfuse_captive_file_info_object.h"
 
 
 int op_utime(const char *path,struct utimbuf *buf)
 {
 CaptiveFileObject *captive_file_object;
 GnomeVFSResult errvfsresult;
-GnomeVFSFileInfo file_info;
+CaptiveFileInfoObject *captive_file_info_object;
 
        g_return_val_if_fail(path!=NULL,-EINVAL);
        g_return_val_if_fail(buf!=NULL,-EINVAL);
@@ -48,22 +49,30 @@ GnomeVFSFileInfo file_info;
                        GNOME_VFS_OPEN_WRITE|GNOME_VFS_OPEN_RANDOM)))
                return -gnomevfsresult_to_errno(errvfsresult);
 
-       file_info.valid_fields=0
+       if (GNOME_VFS_OK!=(errvfsresult=captive_file_info_object_new(&captive_file_info_object))) {
+               g_object_unref(captive_file_object);
+               return -gnomevfsresult_to_errno(errvfsresult);
+               }
+
+       captive_file_info_object->p.valid_fields=0
                        |GNOME_VFS_FILE_INFO_FIELDS_ATIME
                        |GNOME_VFS_FILE_INFO_FIELDS_MTIME
                        |GNOME_VFS_FILE_INFO_FIELDS_CTIME;
-       file_info.atime=buf->actime;
-       file_info.mtime=buf->modtime;
-       file_info.ctime=time(NULL);
+       captive_file_info_object->p.atime=buf->actime;
+       captive_file_info_object->atime_nsec=0;
+       captive_file_info_object->p.mtime=buf->modtime;
+       captive_file_info_object->mtime_nsec=0;
+       capfuse_timespec_split_get(&captive_file_info_object->p.ctime,&captive_file_info_object->ctime_nsec);
        /* Do not:  * It is probably not GnomeVFS compliant but still libcaptive compatible.
         *          * GnomeVFS looks as assuming all the three fields set.
         *          * GnomeVFS also does not check 'valid_fields' at all.
-        *         file_info.ctime=0;   * Just sanity for sure. *
-        *         file_info.valid_fields&=~GNOME_VFS_FILE_INFO_FIELDS_CTIME;
+        *         captive_file_info_object->p.ctime=0; * Just sanity for sure. *
+        *         captive_file_info_object->p.valid_fields&=~GNOME_VFS_FILE_INFO_FIELDS_CTIME;
         * as utime() syscall should really update 'ctime' to the current time.
         */
-       errvfsresult=captive_file_file_info_set(captive_file_object,&file_info,GNOME_VFS_SET_FILE_INFO_TIME);
+       errvfsresult=captive_file_file_info_set(captive_file_object,captive_file_info_object,GNOME_VFS_SET_FILE_INFO_TIME);
 
+       g_object_unref(captive_file_info_object);
        g_object_unref(captive_file_object);
        if (GNOME_VFS_OK!=errvfsresult)
                return -gnomevfsresult_to_errno(errvfsresult);
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);
index 55a700a..a45f90c 100644 (file)
@@ -39,6 +39,7 @@ libclient_la_SOURCES= \
                file-slave.h \
                file.c \
                file.h \
+               file-info.c \
                giochannel-blind.c \
                giochannel-blind.h \
                giochannel-subrange.c \
index 796a05b..e52f386 100644 (file)
@@ -31,7 +31,7 @@ static gpointer captive_directory_parent_object_parent_class=NULL;
 
 static GnomeVFSResult captive_directory_parent_close(CaptiveDirectoryObject *captive_directory_object);
 static GnomeVFSResult captive_directory_parent_read
-               (CaptiveDirectoryObject *captive_directory_object,GnomeVFSFileInfo *file_info);
+               (CaptiveDirectoryObject *captive_directory_object,CaptiveFileInfoObject **captive_file_info_object_return);
 static GnomeVFSResult captive_directory_parent_remove(CaptiveDirectoryObject *captive_directory_object);
 
 
@@ -288,14 +288,14 @@ CaptiveDirectoryParentObject *captive_directory_parent_object;
 
 
 static GnomeVFSResult captive_directory_parent_read
-               (CaptiveDirectoryObject *captive_directory_object,GnomeVFSFileInfo *file_info)
+               (CaptiveDirectoryObject *captive_directory_object,CaptiveFileInfoObject **captive_file_info_object_return)
 {
 CaptiveDirectoryParentObject *captive_directory_parent_object;
 GnomeVFSResult r;
 gint retried=0;
 
        g_return_val_if_fail(CAPTIVE_DIRECTORY_PARENT_IS_OBJECT(captive_directory_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
-       g_return_val_if_fail(file_info!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
+       g_return_val_if_fail(captive_file_info_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
 
        captive_directory_parent_object=CAPTIVE_DIRECTORY_PARENT_OBJECT(captive_directory_object);
 
@@ -303,7 +303,7 @@ gint retried=0;
                if (GNOME_VFS_OK!=(r=captive_parent_connector_open(CAPTIVE_PARENT_CONNECTOR(captive_directory_parent_object))))
                        return r;
                if (GNOME_VFS_ERROR_SERVICE_NOT_AVAILABLE
-                               !=(r=captive_sandbox_parent_directory_read(captive_directory_parent_object,file_info)))
+                               !=(r=captive_sandbox_parent_directory_read(captive_directory_parent_object,captive_file_info_object_return)))
                        return r;
                } while (!retried++);
        return r;
index 1a6f6b6..3e8c4be 100644 (file)
 #include "captive/usecount.h"
 #include "vfs.h"
 #include "vfs-slave.h"
+#include "captive/rtl-time.h"
 
 
 static gpointer captive_directory_slave_object_parent_class=NULL;
 
 static GnomeVFSResult captive_directory_slave_close(CaptiveDirectoryObject *captive_directory_object);
 static GnomeVFSResult captive_directory_slave_read
-               (CaptiveDirectoryObject *captive_directory_object,GnomeVFSFileInfo *file_info);
+               (CaptiveDirectoryObject *captive_directory_object,CaptiveFileInfoObject **captive_file_info_object_return);
 static GnomeVFSResult captive_directory_slave_remove(CaptiveDirectoryObject *captive_directory_object);
 
 
@@ -218,16 +219,21 @@ CaptiveDirectorySlaveObject *captive_directory_slave_object;
 }
 
 
-static GnomeVFSResult FileIdBothDirInformation_to_GnomeVFSFileInfo(GnomeVFSFileInfo *file_info,
+static GnomeVFSResult FileIdBothDirInformation_to_CaptiveFileInfoObject(
+               CaptiveFileInfoObject **captive_file_info_object_return,
                FILE_ID_BOTH_DIR_INFORMATION *FileIdBothDirInformation,IO_STATUS_BLOCK *IoStatusBlock)
 {
 UNICODE_STRING FileName_UnicodeString;
-ULONG tmp_ULONG;
+GnomeVFSResult errvfsresult;
+CaptiveFileInfoObject *captive_file_info_object;
 
-       g_return_val_if_fail(file_info!=NULL,GNOME_VFS_ERROR_GENERIC);
+       g_return_val_if_fail(captive_file_info_object_return!=NULL,GNOME_VFS_ERROR_GENERIC);
        g_return_val_if_fail(FileIdBothDirInformation!=NULL,GNOME_VFS_ERROR_GENERIC);
        g_return_val_if_fail(IoStatusBlock!=NULL,GNOME_VFS_ERROR_GENERIC);
 
+       errvfsresult=captive_file_info_object_new(&captive_file_info_object);
+       g_return_val_if_fail(GNOME_VFS_OK==errvfsresult,errvfsresult);
+
        g_return_val_if_fail(NT_SUCCESS(IoStatusBlock->Status),GNOME_VFS_ERROR_GENERIC);
        /* do not exceed the returned buffer by this record; Redundant now, see below. */
        g_assert((gpointer)(((char *)FileIdBothDirInformation)+FileIdBothDirInformation->NextEntryOffset)
@@ -235,7 +241,7 @@ ULONG tmp_ULONG;
        /* '->NextEntryOffset' is ==0 as we used 'ReturnSingleEntry==TRUE' */
        g_assert(FileIdBothDirInformation->NextEntryOffset==0);
 
-       file_info->valid_fields=0;
+       captive_file_info_object->p.valid_fields=0;
 
        FileName_UnicodeString.Length=FileIdBothDirInformation->FileNameLength;
        FileName_UnicodeString.MaximumLength=FileIdBothDirInformation->FileNameLength
@@ -246,65 +252,74 @@ ULONG tmp_ULONG;
        FileIdBothDirInformation->FileName[FileIdBothDirInformation->FileNameLength
                        /sizeof(*FileIdBothDirInformation->FileName)]=0;        /* 0-terminate it */
        FileName_UnicodeString.Buffer=FileIdBothDirInformation->FileName;
-       file_info->name=captive_UnicodeString_to_utf8_malloc(&FileName_UnicodeString);
-       /* '->name' assumed for 'file_info->valid_fields' */
+       captive_file_info_object->p.name=captive_UnicodeString_to_utf8_malloc(&FileName_UnicodeString);
+       /* '->name' assumed for 'captive_file_info_object->p.valid_fields' */
 
        /* FIXME: What is 'FILE_ATTRIBUTE_NORMAL'? */
        switch (FileIdBothDirInformation->FileAttributes & (0
                        | FILE_ATTRIBUTE_DIRECTORY
                        | FILE_ATTRIBUTE_DEVICE)) {
-               case 0:                        file_info->type=GNOME_VFS_FILE_TYPE_REGULAR;   break;
-               case FILE_ATTRIBUTE_DIRECTORY: file_info->type=GNOME_VFS_FILE_TYPE_DIRECTORY; break;
-               case FILE_ATTRIBUTE_DEVICE:    file_info->type=GNOME_VFS_FILE_TYPE_SOCKET;
+               case 0:                        captive_file_info_object->p.type=GNOME_VFS_FILE_TYPE_REGULAR;   break;
+               case FILE_ATTRIBUTE_DIRECTORY: captive_file_info_object->p.type=GNOME_VFS_FILE_TYPE_DIRECTORY; break;
+               case FILE_ATTRIBUTE_DEVICE:    captive_file_info_object->p.type=GNOME_VFS_FILE_TYPE_SOCKET;
                        /* or GNOME_VFS_FILE_TYPE_CHARACTER_DEVICE or GNOME_VFS_FILE_TYPE_BLOCK_DEVICE ? */
                        break;
-               default:                       file_info->type=GNOME_VFS_FILE_TYPE_UNKNOWN;   break;
+               default:                       captive_file_info_object->p.type=GNOME_VFS_FILE_TYPE_UNKNOWN;   break;
                }
-       file_info->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_TYPE;
+       captive_file_info_object->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_TYPE;
 
        /* we use 0600 for r/w files, 0400 for FILE_ATTRIBUTE_READONLY */
-       file_info->permissions=GNOME_VFS_PERM_USER_READ;
-       if (file_info->type==GNOME_VFS_FILE_TYPE_DIRECTORY)
-               file_info->permissions|=GNOME_VFS_PERM_USER_EXEC;
+       captive_file_info_object->p.permissions=GNOME_VFS_PERM_USER_READ;
+       if (captive_file_info_object->p.type==GNOME_VFS_FILE_TYPE_DIRECTORY)
+               captive_file_info_object->p.permissions|=GNOME_VFS_PERM_USER_EXEC;
        if (!(FileIdBothDirInformation->FileAttributes & FILE_ATTRIBUTE_READONLY))
-               file_info->permissions|=GNOME_VFS_PERM_USER_WRITE;
-       file_info->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS;
+               captive_file_info_object->p.permissions|=GNOME_VFS_PERM_USER_WRITE;
+       captive_file_info_object->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS;
 
-       file_info->size=FileIdBothDirInformation->EndOfFile.QuadPart;
-       file_info->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_SIZE;
+       captive_file_info_object->p.size=FileIdBothDirInformation->EndOfFile.QuadPart;
+       captive_file_info_object->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_SIZE;
 
-       file_info->block_count=FileIdBothDirInformation->AllocationSize.QuadPart/512;
-       file_info->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_BLOCK_COUNT;
+       captive_file_info_object->p.block_count=FileIdBothDirInformation->AllocationSize.QuadPart/512;
+       captive_file_info_object->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_BLOCK_COUNT;
 
-       file_info->flags=GNOME_VFS_FILE_FLAGS_LOCAL;
-       file_info->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_FLAGS;
+       captive_file_info_object->p.flags=GNOME_VFS_FILE_FLAGS_LOCAL;
+       captive_file_info_object->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_FLAGS;
 
        if (FileIdBothDirInformation->LastAccessTime.QuadPart) {        /* it may be 0 if not set */
-               if (RtlTimeToSecondsSince1970(&FileIdBothDirInformation->LastAccessTime,&tmp_ULONG)) {
-                       file_info->atime=tmp_ULONG;
-                       file_info->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_ATIME;
-                       }
+struct timespec timespec;
+
+               errvfsresult=Time_to_timespec(&timespec,&FileIdBothDirInformation->LastAccessTime);
+               g_return_val_if_fail(GNOME_VFS_OK==errvfsresult,errvfsresult);
+               captive_file_info_object->p.atime=timespec.tv_sec;
+               captive_file_info_object->atime_nsec=timespec.tv_nsec;
+               captive_file_info_object->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_ATIME;
                }
 
        /* it may be 0 if not set */
        if (FileIdBothDirInformation->LastWriteTime.QuadPart || FileIdBothDirInformation->ChangeTime.QuadPart) {
-               if (RtlTimeToSecondsSince1970(
+struct timespec timespec;
+
+               errvfsresult=Time_to_timespec(&timespec,
                                /* take the more recent (==bigger) time: */
                                (FileIdBothDirInformation->LastWriteTime.QuadPart > FileIdBothDirInformation->ChangeTime.QuadPart
-                                               ? &FileIdBothDirInformation->LastWriteTime : &FileIdBothDirInformation->ChangeTime),
-                               &tmp_ULONG)) {
-                       file_info->mtime=tmp_ULONG;
-                       file_info->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_MTIME;
-                       }
+                                               ? &FileIdBothDirInformation->LastWriteTime : &FileIdBothDirInformation->ChangeTime));
+               g_return_val_if_fail(GNOME_VFS_OK==errvfsresult,errvfsresult);
+               captive_file_info_object->p.mtime=timespec.tv_sec;
+               captive_file_info_object->mtime_nsec=timespec.tv_nsec;
+               captive_file_info_object->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_MTIME;
                }
 
        if (FileIdBothDirInformation->CreationTime.QuadPart) {  /* it may be 0 if not set */
-               if (RtlTimeToSecondsSince1970(&FileIdBothDirInformation->CreationTime,&tmp_ULONG)) {
-                       file_info->ctime=tmp_ULONG;
-                       file_info->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_CTIME;
-                       }
+struct timespec timespec;
+
+               errvfsresult=Time_to_timespec(&timespec,&FileIdBothDirInformation->CreationTime);
+               g_return_val_if_fail(GNOME_VFS_OK==errvfsresult,errvfsresult);
+               captive_file_info_object->p.ctime=timespec.tv_sec;
+               captive_file_info_object->ctime_nsec=timespec.tv_nsec;
+               captive_file_info_object->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_CTIME;
                }
 
+       *captive_file_info_object_return=captive_file_info_object;
        return GNOME_VFS_OK;
 }
 
@@ -385,7 +400,7 @@ HANDLE dir_Handle;
 
 
 static GnomeVFSResult captive_directory_slave_read
-               (CaptiveDirectoryObject *captive_directory_object,GnomeVFSFileInfo *file_info)
+               (CaptiveDirectoryObject *captive_directory_object,CaptiveFileInfoObject **captive_file_info_object_return)
 {
 CaptiveDirectorySlaveObject *captive_directory_slave_object;
 NTSTATUS err;
@@ -395,7 +410,7 @@ FILE_BOTH_DIR_INFORMATION *FileBothDirInformation;
 GnomeVFSResult errvfsresult;
 
        g_return_val_if_fail(CAPTIVE_DIRECTORY_SLAVE_IS_OBJECT(captive_directory_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
-       g_return_val_if_fail(file_info!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
+       g_return_val_if_fail(captive_file_info_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
 
        captive_directory_slave_object=CAPTIVE_DIRECTORY_SLAVE_OBJECT(captive_directory_object);
 
@@ -473,7 +488,7 @@ retry:
                default: g_assert_not_reached();
                }
 
-       errvfsresult=FileIdBothDirInformation_to_GnomeVFSFileInfo(file_info,FileIdBothDirInformation,
+       errvfsresult=FileIdBothDirInformation_to_CaptiveFileInfoObject(captive_file_info_object_return,FileIdBothDirInformation,
                        &dir_IoStatusBlock);
        g_return_val_if_fail(errvfsresult==GNOME_VFS_OK,errvfsresult);
 
index eacc458..2f5a1ac 100644 (file)
@@ -140,13 +140,14 @@ CaptiveVfsObject *captive_directory_ref_vfs(CaptiveDirectoryObject *captive_dire
 }
 
 
-GnomeVFSResult captive_directory_read(CaptiveDirectoryObject *captive_directory_object,GnomeVFSFileInfo *file_info)
+GnomeVFSResult captive_directory_read(CaptiveDirectoryObject *captive_directory_object,
+               CaptiveFileInfoObject **captive_file_info_object_return)
 {
        g_return_val_if_fail(CAPTIVE_DIRECTORY_IS_OBJECT(captive_directory_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
-       g_return_val_if_fail(file_info!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
+       g_return_val_if_fail(captive_file_info_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
 
        return (*CAPTIVE_DIRECTORY_OBJECT_GET_CLASS(captive_directory_object)->read)
-                       (captive_directory_object,file_info);
+                       (captive_directory_object,captive_file_info_object_return);
 }
 
 
index 59da556..4dc099f 100644 (file)
@@ -25,6 +25,7 @@
 #include <glib/gtypes.h>
 #include "captive/client-vfs.h"
 #include "captive/client-directory.h"
+#include "captive/client-file-info.h"
 
 
 G_BEGIN_DECLS
@@ -38,7 +39,8 @@ struct _CaptiveDirectoryObject {
 struct _CaptiveDirectoryObjectClass {
        GObjectClass parent_class;
 
-       GnomeVFSResult (*read)(CaptiveDirectoryObject *captive_directory_object,GnomeVFSFileInfo *file_info);
+       GnomeVFSResult (*read)(CaptiveDirectoryObject *captive_directory_object,
+                       CaptiveFileInfoObject **captive_file_info_object_return);
        GnomeVFSResult (*remove)(CaptiveDirectoryObject *captive_directory_object);
        };
 
diff --git a/src/libcaptive/client/file-info.c b/src/libcaptive/client/file-info.c
new file mode 100644 (file)
index 0000000..ee3ba78
--- /dev/null
@@ -0,0 +1,95 @@
+/* $Id$
+ * captive wrapper of GnomeVFSFileInfo interface to reactos
+ * Copyright (C) 2005 Jan Kratochvil <project-captive@jankratochvil.net>
+ * 
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; exactly version 2 of June 1991 is required
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+
+#include "config.h"
+
+#include "captive/client-file-info.h"  /* self */
+#include <glib/gmessages.h>
+#include "vfs.h"
+#include "reactos/ntos/types.h"        /* for ULONG */
+
+
+struct _CaptiveFileInfoObjectClass {
+       GObjectClass parent_class;
+       };
+
+
+static gpointer captive_file_info_object_parent_class=NULL;
+
+
+static void captive_file_info_object_finalize(CaptiveFileInfoObject *captive_file_info_object)
+{
+       g_return_if_fail(captive_file_info_object!=NULL);
+
+       gnome_vfs_file_info_clear(&captive_file_info_object->p);
+
+       G_OBJECT_CLASS(captive_file_info_object_parent_class)->finalize((GObject *)captive_file_info_object);
+}
+
+
+static void captive_file_info_object_class_init(CaptiveFileInfoObjectClass *class)
+{
+GObjectClass *gobject_class=G_OBJECT_CLASS(class);
+
+       captive_file_info_object_parent_class=g_type_class_ref(g_type_parent(G_TYPE_FROM_CLASS(class)));
+       gobject_class->finalize=(void (*)(GObject *object))captive_file_info_object_finalize;
+}
+
+
+static void captive_file_info_object_init(CaptiveFileInfoObject *captive_file_info_object)
+{
+}
+
+
+GType captive_file_info_object_get_type(void)
+{
+static GType captive_file_info_object_type=0;
+
+       if (!captive_file_info_object_type) {
+static const GTypeInfo captive_file_info_object_info={
+                               sizeof(CaptiveFileInfoObjectClass),
+                               NULL,   /* base_init */
+                               NULL,   /* base_finalize */
+                               (GClassInitFunc)captive_file_info_object_class_init,
+                               NULL,   /* class_finalize */
+                               NULL,   /* class_data */
+                               sizeof(CaptiveFileInfoObject),
+                               5,      /* n_preallocs */
+                               (GInstanceInitFunc)captive_file_info_object_init,
+                               };
+
+               captive_file_info_object_type=g_type_register_static(G_TYPE_OBJECT,
+                               "CaptiveFileInfoObject",&captive_file_info_object_info,0);
+               }
+
+       return captive_file_info_object_type;
+}
+
+
+GnomeVFSResult captive_file_info_object_new(CaptiveFileInfoObject **captive_file_info_object_return)
+{
+       g_return_val_if_fail(captive_file_info_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
+
+       *captive_file_info_object_return=g_object_new(
+                       CAPTIVE_FILE_INFO_TYPE_OBJECT, /* object_type */
+                       NULL);  /* first_property_name; FIXME: support properties */
+       g_assert(*captive_file_info_object_return!=NULL);
+
+       return GNOME_VFS_OK;
+}
index cf680b6..8fdf41e 100644 (file)
@@ -42,9 +42,9 @@ static GnomeVFSResult captive_file_parent_seek
 static GnomeVFSResult captive_file_parent_tell(CaptiveFileObject *captive_file_object,GnomeVFSFileOffset *offset_return);
 static GnomeVFSResult captive_file_parent_remove(CaptiveFileObject *captive_file_object);
 static GnomeVFSResult captive_file_parent_file_info_get
-               (CaptiveFileObject *captive_file_object,GnomeVFSFileInfo *file_info);
+               (CaptiveFileObject *captive_file_object,CaptiveFileInfoObject **captive_file_info_object_return);
 static GnomeVFSResult captive_file_parent_file_info_set
-               (CaptiveFileObject *captive_file_object,const GnomeVFSFileInfo *info,GnomeVFSSetFileInfoMask mask);
+               (CaptiveFileObject *captive_file_object,CaptiveFileInfoObject *captive_file_info_object,GnomeVFSSetFileInfoMask mask);
 static GnomeVFSResult captive_file_parent_truncate(CaptiveFileObject *captive_file_object,GnomeVFSFileSize file_size);
 static GnomeVFSResult captive_file_parent_move
                (CaptiveFileObject *captive_file_object_old,const gchar *pathname_new,gboolean force_replace);
@@ -485,14 +485,14 @@ gint retried=0;
 
 
 static GnomeVFSResult captive_file_parent_file_info_get
-               (CaptiveFileObject *captive_file_object,GnomeVFSFileInfo *file_info)
+               (CaptiveFileObject *captive_file_object,CaptiveFileInfoObject **captive_file_info_object_return)
 {
 CaptiveFileParentObject *captive_file_parent_object;
 GnomeVFSResult r;
 gint retried=0;
 
        g_return_val_if_fail(CAPTIVE_FILE_PARENT_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
-       g_return_val_if_fail(file_info!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
+       g_return_val_if_fail(captive_file_info_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
 
        captive_file_parent_object=CAPTIVE_FILE_PARENT_OBJECT(captive_file_object);
 
@@ -500,7 +500,7 @@ gint retried=0;
                if (GNOME_VFS_OK!=(r=captive_parent_connector_open(CAPTIVE_PARENT_CONNECTOR(captive_file_parent_object))))
                        return r;
                if (GNOME_VFS_ERROR_SERVICE_NOT_AVAILABLE
-                               !=(r=captive_sandbox_parent_file_file_info_get(captive_file_parent_object,file_info)))
+                               !=(r=captive_sandbox_parent_file_file_info_get(captive_file_parent_object,captive_file_info_object_return)))
                        return r;
                } while (!retried++);
        return r;
@@ -508,14 +508,14 @@ gint retried=0;
 
 
 static GnomeVFSResult captive_file_parent_file_info_set
-               (CaptiveFileObject *captive_file_object,const GnomeVFSFileInfo *info,GnomeVFSSetFileInfoMask mask)
+               (CaptiveFileObject *captive_file_object,CaptiveFileInfoObject *captive_file_info_object,GnomeVFSSetFileInfoMask mask)
 {
 CaptiveFileParentObject *captive_file_parent_object;
 GnomeVFSResult r;
 gint retried=0;
 
        g_return_val_if_fail(CAPTIVE_FILE_PARENT_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
-       g_return_val_if_fail(info!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
+       g_return_val_if_fail(CAPTIVE_FILE_INFO_IS_OBJECT(captive_file_info_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
 
        captive_file_parent_object=CAPTIVE_FILE_PARENT_OBJECT(captive_file_object);
 
@@ -523,7 +523,7 @@ gint retried=0;
                if (GNOME_VFS_OK!=(r=captive_parent_connector_open(CAPTIVE_PARENT_CONNECTOR(captive_file_parent_object))))
                        return r;
                if (GNOME_VFS_ERROR_SERVICE_NOT_AVAILABLE
-                               !=(r=captive_sandbox_parent_file_file_info_set(captive_file_parent_object,info,mask))) {
+                               !=(r=captive_sandbox_parent_file_file_info_set(captive_file_parent_object,captive_file_info_object,mask))) {
                        if (GNOME_VFS_OK==r)
                                captive_parent_connector_set_dirty(CAPTIVE_PARENT_CONNECTOR(captive_file_parent_object));
                        return r;
index 8193e38..08bc4d5 100644 (file)
@@ -38,6 +38,7 @@
 #include "vfs.h"
 #include "vfs-slave.h"
 #include "../cc/sharedcachemap.h"
+#include "captive/rtl-time.h"
 
 
 /* Config: */
@@ -70,9 +71,9 @@ static GnomeVFSResult captive_file_slave_seek
 static GnomeVFSResult captive_file_slave_tell(CaptiveFileObject *captive_file_object,GnomeVFSFileOffset *offset_return);
 static GnomeVFSResult captive_file_slave_remove(CaptiveFileObject *captive_file_object);
 static GnomeVFSResult captive_file_slave_file_info_get
-               (CaptiveFileObject *captive_file_object,GnomeVFSFileInfo *file_info);
+               (CaptiveFileObject *captive_file_object,CaptiveFileInfoObject **captive_file_info_object_return);
 static GnomeVFSResult captive_file_slave_file_info_set
-               (CaptiveFileObject *captive_file_object,const GnomeVFSFileInfo *info,GnomeVFSSetFileInfoMask mask);
+               (CaptiveFileObject *captive_file_object,CaptiveFileInfoObject *captive_file_info_object,GnomeVFSSetFileInfoMask mask);
 static GnomeVFSResult captive_file_slave_truncate(CaptiveFileObject *captive_file_object,GnomeVFSFileSize file_size);
 static GnomeVFSResult captive_file_slave_move
                (CaptiveFileObject *captive_file_object_old,const gchar *pathname_new,gboolean force_replace);
@@ -357,10 +358,11 @@ CaptiveFileSlaveObject *captive_file_slave_object;
 NTSTATUS err;
 IO_STATUS_BLOCK file_IoStatusBlock;
 LARGE_INTEGER file_offset;
-GnomeVFSFileInfo file_info;
+CaptiveFileInfoObject *captive_file_info_object;
 GnomeVFSFileSize endoffile_wanted;
 GnomeVFSResult errvfsresult;
 static GnomeVFSFileSize total_written=0;
+gboolean extension_needed;
 
        g_return_val_if_fail(CAPTIVE_FILE_SLAVE_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
        g_return_val_if_fail(buffer!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
@@ -380,9 +382,12 @@ static GnomeVFSFileSize total_written=0;
                return GNOME_VFS_ERROR_TOO_BIG;
        endoffile_wanted=captive_file_slave_object->offset+num_bytes;
        if (GNOME_VFS_OK!=(errvfsresult=captive_file_slave_file_info_get(
-                       CAPTIVE_FILE_OBJECT(captive_file_slave_object),&file_info)))
+                       CAPTIVE_FILE_OBJECT(captive_file_slave_object),&captive_file_info_object)))
                return errvfsresult;
-       if (file_info.size<endoffile_wanted) {
+       g_assert(captive_file_info_object->p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_SIZE);
+       extension_needed=(captive_file_info_object->p.size<endoffile_wanted);
+       g_object_unref(captive_file_info_object);
+       if (extension_needed) {
                if (GNOME_VFS_OK!=(errvfsresult=captive_file_slave_truncate(
                                CAPTIVE_FILE_OBJECT(captive_file_slave_object),endoffile_wanted)))
                        return errvfsresult;
@@ -502,12 +507,12 @@ GnomeVFSResult errvfsresult;
 /* Use 'FileNameInformationStruct' identifier instead of the logical 'FileNameInformation'
  * to prevent override of enum member 'FileNameInformation'
  */
-static GnomeVFSResult FileNameInformationStruct_to_GnomeVFSFileInfo(GnomeVFSFileInfo *file_info,
-               FILE_NAME_INFORMATION *FileNameInformationStruct)
+static GnomeVFSResult FileNameInformationStruct_to_CaptiveFileInfoObject_in_place
+               (CaptiveFileInfoObject *captive_file_info_object,FILE_NAME_INFORMATION *FileNameInformationStruct)
 {
 UNICODE_STRING FileName_UnicodeString;
 
-       g_return_val_if_fail(file_info!=NULL,GNOME_VFS_ERROR_GENERIC);
+       g_return_val_if_fail(CAPTIVE_FILE_INFO_IS_OBJECT(captive_file_info_object),GNOME_VFS_ERROR_GENERIC);
        g_return_val_if_fail(FileNameInformationStruct!=NULL,GNOME_VFS_ERROR_GENERIC);
 
        FileName_UnicodeString.Length=FileNameInformationStruct->FileNameLength;
@@ -523,8 +528,8 @@ UNICODE_STRING FileName_UnicodeString;
        FileNameInformationStruct->FileName[FileNameInformationStruct->FileNameLength
                        /sizeof(*FileNameInformationStruct->FileName)]=0;       /* 0-terminate it */
        FileName_UnicodeString.Buffer=FileNameInformationStruct->FileName;
-       file_info->name=captive_UnicodeString_to_utf8_malloc(&FileName_UnicodeString);
-       /* '->name' assumed for 'file_info->valid_fields' */
+       captive_file_info_object->p.name=captive_UnicodeString_to_utf8_malloc(&FileName_UnicodeString);
+       /* '->name' assumed for 'captive_file_info_object->p.valid_fields' */
 
        return GNOME_VFS_OK;
 }
@@ -533,57 +538,66 @@ UNICODE_STRING FileName_UnicodeString;
 /* Use 'FileBasicInformationStruct' identifier instead of the logical 'FileBasicInformation'
  * to prevent override of enum member 'FileBasicInformation'
  */
-static GnomeVFSResult FileBasicInformationStruct_to_GnomeVFSFileInfo(GnomeVFSFileInfo *file_info,
-               FILE_BASIC_INFORMATION *FileBasicInformationStruct)
+static GnomeVFSResult FileBasicInformationStruct_to_CaptiveFileInfoObject_in_place
+               (CaptiveFileInfoObject *captive_file_info_object,FILE_BASIC_INFORMATION *FileBasicInformationStruct)
 {
-BOOLEAN errBOOLEAN;
-ULONG tmp_ULONG;
+GnomeVFSResult errvfsresult;
+
+       g_return_val_if_fail(CAPTIVE_FILE_INFO_IS_OBJECT(captive_file_info_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
 
        /* FIXME: What is 'FILE_ATTRIBUTE_NORMAL'? */
        switch (FileBasicInformationStruct->FileAttributes & (0
                        | FILE_ATTRIBUTE_DIRECTORY
                        | FILE_ATTRIBUTE_DEVICE)) {
-               case 0:                        file_info->type=GNOME_VFS_FILE_TYPE_REGULAR;   break;
-               case FILE_ATTRIBUTE_DIRECTORY: file_info->type=GNOME_VFS_FILE_TYPE_DIRECTORY; break;
-               case FILE_ATTRIBUTE_DEVICE:    file_info->type=GNOME_VFS_FILE_TYPE_SOCKET;
+               case 0:                        captive_file_info_object->p.type=GNOME_VFS_FILE_TYPE_REGULAR;   break;
+               case FILE_ATTRIBUTE_DIRECTORY: captive_file_info_object->p.type=GNOME_VFS_FILE_TYPE_DIRECTORY; break;
+               case FILE_ATTRIBUTE_DEVICE:    captive_file_info_object->p.type=GNOME_VFS_FILE_TYPE_SOCKET;
                        /* or GNOME_VFS_FILE_TYPE_CHARACTER_DEVICE or GNOME_VFS_FILE_TYPE_BLOCK_DEVICE ? */
                        break;
-               default:                       file_info->type=GNOME_VFS_FILE_TYPE_UNKNOWN;   break;
+               default:                       captive_file_info_object->p.type=GNOME_VFS_FILE_TYPE_UNKNOWN;   break;
                }
-       file_info->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_TYPE;
+       captive_file_info_object->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_TYPE;
 
        /* we use 0600 for r/w files, 0400 for FILE_ATTRIBUTE_READONLY */
-       file_info->permissions=GNOME_VFS_PERM_USER_READ;
-       if (file_info->type==GNOME_VFS_FILE_TYPE_DIRECTORY)
-               file_info->permissions|=GNOME_VFS_PERM_USER_EXEC;
+       captive_file_info_object->p.permissions=GNOME_VFS_PERM_USER_READ;
+       if (captive_file_info_object->p.type==GNOME_VFS_FILE_TYPE_DIRECTORY)
+               captive_file_info_object->p.permissions|=GNOME_VFS_PERM_USER_EXEC;
        if (!(FileBasicInformationStruct->FileAttributes & FILE_ATTRIBUTE_READONLY))
-               file_info->permissions|=GNOME_VFS_PERM_USER_WRITE;
-       file_info->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS;
+               captive_file_info_object->p.permissions|=GNOME_VFS_PERM_USER_WRITE;
+       captive_file_info_object->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS;
 
        if (FileBasicInformationStruct->LastAccessTime.QuadPart) {      /* it may be 0 if not set */
-               errBOOLEAN=RtlTimeToSecondsSince1970(&FileBasicInformationStruct->LastAccessTime,&tmp_ULONG);
-               g_assert(errBOOLEAN==TRUE);
-               file_info->atime=tmp_ULONG;
-               file_info->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_ATIME;
+struct timespec timespec;
+
+               errvfsresult=Time_to_timespec(&timespec,&FileBasicInformationStruct->LastAccessTime);
+               g_return_val_if_fail(GNOME_VFS_OK==errvfsresult,errvfsresult);
+               captive_file_info_object->p.atime=timespec.tv_sec;
+               captive_file_info_object->atime_nsec=timespec.tv_nsec;
+               captive_file_info_object->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_ATIME;
                }
 
        /* it may be 0 if not set */
        if (FileBasicInformationStruct->LastWriteTime.QuadPart || FileBasicInformationStruct->ChangeTime.QuadPart) {
-               errBOOLEAN=RtlTimeToSecondsSince1970(
+struct timespec timespec;
+
+               errvfsresult=Time_to_timespec(&timespec,
                                /* take the more recent (==bigger) time: */
                                (FileBasicInformationStruct->LastWriteTime.QuadPart > FileBasicInformationStruct->ChangeTime.QuadPart
-                                               ? &FileBasicInformationStruct->LastWriteTime : &FileBasicInformationStruct->ChangeTime),
-                               &tmp_ULONG);
-               g_assert(errBOOLEAN==TRUE);
-               file_info->mtime=tmp_ULONG;
-               file_info->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_MTIME;
+                                               ? &FileBasicInformationStruct->LastWriteTime : &FileBasicInformationStruct->ChangeTime));
+               g_return_val_if_fail(GNOME_VFS_OK==errvfsresult,errvfsresult);
+               captive_file_info_object->p.mtime=timespec.tv_sec;
+               captive_file_info_object->mtime_nsec=timespec.tv_nsec;
+               captive_file_info_object->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_MTIME;
                }
 
        if (FileBasicInformationStruct->CreationTime.QuadPart) {        /* it may be 0 if not set */
-               errBOOLEAN=RtlTimeToSecondsSince1970(&FileBasicInformationStruct->CreationTime,&tmp_ULONG);
-               g_assert(errBOOLEAN==TRUE);
-               file_info->ctime=tmp_ULONG;
-               file_info->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_CTIME;
+struct timespec timespec;
+
+               errvfsresult=Time_to_timespec(&timespec,&FileBasicInformationStruct->CreationTime);
+               g_return_val_if_fail(GNOME_VFS_OK==errvfsresult,errvfsresult);
+               captive_file_info_object->p.ctime=timespec.tv_sec;
+               captive_file_info_object->ctime_nsec=timespec.tv_nsec;
+               captive_file_info_object->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_CTIME;
                }
 
        return GNOME_VFS_OK;
@@ -593,22 +607,25 @@ ULONG tmp_ULONG;
 /* Use 'FileStandardInformationStruct' identifier instead of the logical 'FileStandardInformation'
  * to prevent override of enum member 'FileStandardInformation'
  */
-static GnomeVFSResult FileStandardInformationStruct_to_GnomeVFSFileInfo(GnomeVFSFileInfo *file_info,
-               FILE_STANDARD_INFORMATION *FileStandardInformationStruct)
+static GnomeVFSResult FileStandardInformationStruct_to_CaptiveFileInfoObject_in_place
+               (CaptiveFileInfoObject *captive_file_info_object,FILE_STANDARD_INFORMATION *FileStandardInformationStruct)
 {
-       file_info->size=FileStandardInformationStruct->EndOfFile.QuadPart;
-       file_info->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_SIZE;
+       g_return_val_if_fail(CAPTIVE_FILE_INFO_IS_OBJECT(captive_file_info_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
+
+       captive_file_info_object->p.size=FileStandardInformationStruct->EndOfFile.QuadPart;
+       captive_file_info_object->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_SIZE;
 
-       file_info->block_count=FileStandardInformationStruct->AllocationSize.QuadPart/512;
-       file_info->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_BLOCK_COUNT;
+       captive_file_info_object->p.block_count=FileStandardInformationStruct->AllocationSize.QuadPart/512;
+       captive_file_info_object->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_BLOCK_COUNT;
 
        return GNOME_VFS_OK;
 }
 
 
 GnomeVFSResult captive_file_slave_file_info_get(CaptiveFileObject *captive_file_object,
-               GnomeVFSFileInfo *file_info)
+               CaptiveFileInfoObject **captive_file_info_object_return)
 {
+CaptiveFileInfoObject *captive_file_info_object;
 CaptiveFileSlaveObject *captive_file_slave_object;
 NTSTATUS err;
 IO_STATUS_BLOCK file_IoStatusBlock;
@@ -620,22 +637,23 @@ char QueryFile_buf[sizeof(FILE_NAME_INFORMATION)
                +0x1000 /* max 'FileName' length, 255 should be enough */ * sizeof(WCHAR /* *FILE_ALL_INFORMATION.NameInformation.FileName */ )];
 
        g_return_val_if_fail(CAPTIVE_FILE_SLAVE_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
-       g_return_val_if_fail(file_info!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
+       g_return_val_if_fail(captive_file_info_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
 
        captive_file_slave_object=CAPTIVE_FILE_SLAVE_OBJECT(captive_file_object);
 
        g_return_val_if_fail(captive_file_slave_object->file_Handle!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
 
+       errvfsresult=captive_file_info_object_new(&captive_file_info_object);
+       g_return_val_if_fail(GNOME_VFS_OK==errvfsresult,errvfsresult);
+
        /* ntfs.sys of NT-5.1sp1 has *(FILE_BASIC_INFORMATION *)FILE_ALL_INFORMATION.BasicInformation
         * size 0x28 although reactos includes and all the information says 0x24.
         * fastfat.sys of NT-5.1sp1 also has the 'official' sizeof 0x24.
         * It would be a bit of heuristic to correctly detect its expected sizeof.
         */
 
-       file_info->valid_fields=0;
-
-       file_info->flags=GNOME_VFS_FILE_FLAGS_LOCAL;
-       file_info->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_FLAGS;
+       captive_file_info_object->p.flags=GNOME_VFS_FILE_FLAGS_LOCAL;
+       captive_file_info_object->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_FLAGS;
 
        /* query NameInformation */
        FileNameInformationStruct=(void *)QueryFile_buf;
@@ -650,7 +668,8 @@ char QueryFile_buf[sizeof(FILE_NAME_INFORMATION)
                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);
-       errvfsresult=FileNameInformationStruct_to_GnomeVFSFileInfo(file_info,FileNameInformationStruct);
+       errvfsresult=FileNameInformationStruct_to_CaptiveFileInfoObject_in_place(captive_file_info_object,
+                       FileNameInformationStruct);
        g_return_val_if_fail(errvfsresult==GNOME_VFS_OK,errvfsresult);
 
        /* query BasicInformation */
@@ -665,7 +684,8 @@ char QueryFile_buf[sizeof(FILE_NAME_INFORMATION)
                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);
-       errvfsresult=FileBasicInformationStruct_to_GnomeVFSFileInfo(file_info,FileBasicInformationStruct);
+       errvfsresult=FileBasicInformationStruct_to_CaptiveFileInfoObject_in_place(captive_file_info_object,
+                       FileBasicInformationStruct);
        g_return_val_if_fail(errvfsresult==GNOME_VFS_OK,errvfsresult);
 
        /* query StandardInformation */
@@ -680,21 +700,23 @@ char QueryFile_buf[sizeof(FILE_NAME_INFORMATION)
                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);
-       errvfsresult=FileStandardInformationStruct_to_GnomeVFSFileInfo(file_info,FileStandardInformationStruct);
+       errvfsresult=FileStandardInformationStruct_to_CaptiveFileInfoObject_in_place(captive_file_info_object,
+                       FileStandardInformationStruct);
        g_return_val_if_fail(errvfsresult==GNOME_VFS_OK,errvfsresult);
 
+       *captive_file_info_object_return=captive_file_info_object;
        captive_leave();
        return GNOME_VFS_OK;
 }
 
 
-GnomeVFSResult captive_file_slave_file_info_set(CaptiveFileObject *captive_file_object,
-    const GnomeVFSFileInfo *info,GnomeVFSSetFileInfoMask mask)
+static GnomeVFSResult captive_file_slave_file_info_set
+               (CaptiveFileObject *captive_file_object,CaptiveFileInfoObject *captive_file_info_object,GnomeVFSSetFileInfoMask mask)
 {
 CaptiveFileSlaveObject *captive_file_slave_object;
 
        g_return_val_if_fail(CAPTIVE_FILE_SLAVE_IS_OBJECT(captive_file_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
-       g_return_val_if_fail(info!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
+       g_return_val_if_fail(CAPTIVE_FILE_INFO_IS_OBJECT(captive_file_info_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
 
        captive_file_slave_object=CAPTIVE_FILE_SLAVE_OBJECT(captive_file_object);
 
@@ -710,7 +732,7 @@ NTSTATUS err=STATUS_SUCCESS;        /* Prevent: ... might be used uninitialized in this
 GnomeVFSResult errvfsresult;
 
                /* non-existing dirname assertion */
-               name_dirname=g_path_get_dirname(info->name);
+               name_dirname=g_path_get_dirname(captive_file_info_object->p.name);
                if (*name_dirname) {
                        g_assert_not_reached();
                        errvfsresult=GNOME_VFS_ERROR_BAD_PARAMETERS;
@@ -718,14 +740,14 @@ GnomeVFSResult errvfsresult;
                        }
 
                /* fully-matching basename assertion */
-               name_basename=g_path_get_basename(info->name);
-               if (strcmp(name_basename,info->name)) {
+               name_basename=g_path_get_basename(captive_file_info_object->p.name);
+               if (strcmp(name_basename,captive_file_info_object->p.name)) {
                        g_assert_not_reached();
                        errvfsresult=GNOME_VFS_ERROR_BAD_PARAMETERS;
                        goto err_free_name_dirname;
                        }
 
-               name_UnicodeString=captive_utf8_to_UnicodeString_alloca(info->name);
+               name_UnicodeString=captive_utf8_to_UnicodeString_alloca(captive_file_info_object->p.name);
                FileRenameInformation_struct_len=sizeof(*FileRenameInformation_structp)
                                +name_UnicodeString->MaximumLength;     /* ==Length+(0-terminator); is the terminator needed? */
 
@@ -778,31 +800,49 @@ NTSTATUS err;
 
                if (mask & GNOME_VFS_SET_FILE_INFO_PERMISSIONS) {
                        FileBasicInformationp->FileAttributes&=~FILE_ATTRIBUTE_READONLY;
-                       g_assert(info->valid_fields & GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS);
-                       if (!(info->permissions&0200))
+                       g_assert(captive_file_info_object->p.valid_fields & GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS);
+                       if (!(captive_file_info_object->p.permissions&0200))
                                FileBasicInformationp->FileAttributes|=FILE_ATTRIBUTE_READONLY;
                        }
 
                if (mask & GNOME_VFS_SET_FILE_INFO_TIME) {
-                       g_assert(info->valid_fields & (0
+                       g_assert(captive_file_info_object->p.valid_fields & (0
                                        | GNOME_VFS_FILE_INFO_FIELDS_ATIME
-                                       | GNOME_VFS_FILE_INFO_FIELDS_MTIME));
-                       /* !GNOME_VFS_FILE_INFO_FIELDS_CTIME is used by FUSE op_utime(). */
-                       if (info->valid_fields&GNOME_VFS_FILE_INFO_FIELDS_ATIME) {
-                               RtlSecondsSince1970ToTime(
-                                               info->atime,    /* SecondsSince1970 */
-                                               &FileBasicInformationp->LastAccessTime);        /* Time */
+                                       | GNOME_VFS_FILE_INFO_FIELDS_MTIME
+                                       | GNOME_VFS_FILE_INFO_FIELDS_CTIME));
+                       if (captive_file_info_object->p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_ATIME) {
+struct timespec timespec;
+GnomeVFSResult errvfsresult;
+
+                               timespec.tv_sec=captive_file_info_object->p.atime;
+                               timespec.tv_nsec=captive_file_info_object->atime_nsec;
+                               errvfsresult=timespec_to_Time(
+                                               &FileBasicInformationp->LastAccessTime, /* Time */
+                                               &timespec);     /* timespec */
+                               g_return_val_if_fail(GNOME_VFS_OK==errvfsresult,errvfsresult);
                                }
-                       if (info->valid_fields&GNOME_VFS_FILE_INFO_FIELDS_MTIME) {
-                               RtlSecondsSince1970ToTime(
-                                               info->mtime,    /* SecondsSince1970 */
-                                               &FileBasicInformationp->LastWriteTime); /* Time */
+                       if (captive_file_info_object->p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_MTIME) {
+struct timespec timespec;
+GnomeVFSResult errvfsresult;
+
+                               timespec.tv_sec=captive_file_info_object->p.mtime;
+                               timespec.tv_nsec=captive_file_info_object->mtime_nsec;
+                               errvfsresult=timespec_to_Time(
+                                               &FileBasicInformationp->LastWriteTime,  /* Time */
+                                               &timespec);     /* timespec */
+                               g_return_val_if_fail(GNOME_VFS_OK==errvfsresult,errvfsresult);
                                FileBasicInformationp->ChangeTime=FileBasicInformationp->LastWriteTime;
                                }
-                       if (info->valid_fields&GNOME_VFS_FILE_INFO_FIELDS_CTIME) {
-                               RtlSecondsSince1970ToTime(
-                                               info->ctime,    /* SecondsSince1970 */
-                                               &FileBasicInformationp->CreationTime);  /* Time */
+                       if (captive_file_info_object->p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_CTIME) {
+struct timespec timespec;
+GnomeVFSResult errvfsresult;
+
+                               timespec.tv_sec=captive_file_info_object->p.ctime;
+                               timespec.tv_nsec=captive_file_info_object->ctime_nsec;
+                               errvfsresult=timespec_to_Time(
+                                               &FileBasicInformationp->CreationTime,   /* Time */
+                                               &timespec);     /* timespec */
+                               g_return_val_if_fail(GNOME_VFS_OK==errvfsresult,errvfsresult);
                                }
                        }
 
@@ -816,7 +856,7 @@ NTSTATUS err;
                }
 
        if (mask & GNOME_VFS_SET_FILE_INFO_OWNER) {
-               /* FIXME: g_assert(info->valid_fields & ???); */
+               /* FIXME: g_assert(captive_file_info_object->p.valid_fields & ???); */
                /* owner ignored for W32 */
                }
 
index b1268be..ce6d4e2 100644 (file)
@@ -196,24 +196,24 @@ GnomeVFSResult captive_file_remove(CaptiveFileObject *captive_file_object)
 
 
 GnomeVFSResult captive_file_file_info_get(CaptiveFileObject *captive_file_object,
-               GnomeVFSFileInfo *file_info)
+               CaptiveFileInfoObject **captive_file_info_object_return)
 {
        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);
+       g_return_val_if_fail(captive_file_info_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
 
        return (*CAPTIVE_FILE_OBJECT_GET_CLASS(captive_file_object)->file_info_get)
-                       (captive_file_object,file_info);
+                       (captive_file_object,captive_file_info_object_return);
 }
 
 
 GnomeVFSResult captive_file_file_info_set(CaptiveFileObject *captive_file_object,
-    const GnomeVFSFileInfo *info,GnomeVFSSetFileInfoMask mask)
+               CaptiveFileInfoObject *captive_file_info_object,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);
+       g_return_val_if_fail(CAPTIVE_FILE_INFO_IS_OBJECT(captive_file_info_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
 
        return (*CAPTIVE_FILE_OBJECT_GET_CLASS(captive_file_object)->file_info_set)
-                       (captive_file_object,info,mask);
+                       (captive_file_object,captive_file_info_object,mask);
 }
 
 
index e4f1af5..23826f9 100644 (file)
@@ -46,9 +46,9 @@ struct _CaptiveFileObjectClass {
        GnomeVFSResult (*tell)(CaptiveFileObject *captive_file_object,GnomeVFSFileOffset *offset_return);
        GnomeVFSResult (*remove)(CaptiveFileObject *captive_file_object);
        GnomeVFSResult (*file_info_get)(CaptiveFileObject *captive_file_object,
-                       GnomeVFSFileInfo *file_info);
+                       CaptiveFileInfoObject **captive_file_info_object_return);
        GnomeVFSResult (*file_info_set)(CaptiveFileObject *captive_file_object,
-                       const GnomeVFSFileInfo *info,GnomeVFSSetFileInfoMask mask);
+                       CaptiveFileInfoObject *captive_file_info_object,GnomeVFSSetFileInfoMask mask);
        GnomeVFSResult (*truncate)(CaptiveFileObject *captive_file_object,GnomeVFSFileSize file_size);
        GnomeVFSResult (*move)(CaptiveFileObject *captive_file_object_old,const gchar *pathname_new,gboolean force_replace);
        };
index ca75698..d89e46b 100644 (file)
@@ -1,6 +1,6 @@
 # $Id$
 # automake source for include/captive directory Makefile
-# Copyright (C) 2002-2003 Jan Kratochvil <project-captive@jankratochvil.net>
+# Copyright (C) 2002-2005 Jan Kratochvil <project-captive@jankratochvil.net>
 # 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -25,6 +25,7 @@ pkginclude_HEADERS+= \
                client-directory.h \
                client-file.h \
                client-vfs.h \
+               client-file-info.h \
                client.h \
                config2.h \
                ldr.h \
@@ -37,6 +38,7 @@ pkginclude_HEADERS+= \
                options.h \
                ps_reactos.h \
                rtl-file.h \
+               rtl-time.h \
                signal.h \
                storage.h \
                unicode.h \
index 82f34ae..9f9ce31 100644 (file)
@@ -24,6 +24,7 @@
 #include <glib/gmacros.h>
 #include <glib-object.h>
 #include <libgnomevfs/gnome-vfs-file-info.h>   /* for GnomeVFSFileInfo */
+#include "captive/client-file-info.h"
 #include "captive/client-vfs.h"
 
 
@@ -46,7 +47,8 @@ GnomeVFSResult captive_directory_new_open(CaptiveDirectoryObject **captive_direc
 GnomeVFSResult captive_directory_new_make(CaptiveDirectoryObject **captive_directory_object_return,
                CaptiveVfsObject *captive_vfs_object,const gchar *pathname,guint perm);
 CaptiveVfsObject *captive_directory_ref_vfs(CaptiveDirectoryObject *captive_directory_object);
-GnomeVFSResult captive_directory_read(CaptiveDirectoryObject *captive_directory_object,GnomeVFSFileInfo *file_info);
+GnomeVFSResult captive_directory_read(CaptiveDirectoryObject *captive_directory_object,
+               CaptiveFileInfoObject **captive_file_info_object_return);
 GnomeVFSResult captive_directory_remove(CaptiveDirectoryObject *captive_directory_object);
 
 
diff --git a/src/libcaptive/include/captive/client-file-info.h b/src/libcaptive/include/captive/client-file-info.h
new file mode 100644 (file)
index 0000000..349f5f9
--- /dev/null
@@ -0,0 +1,60 @@
+/* $Id$
+ * Include file with client-application 'file' access to libcaptive
+ * Copyright (C) 2005 Jan Kratochvil <project-captive@jankratochvil.net>
+ * 
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; exactly version 2 of June 1991 is required
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+
+#ifndef _CAPTIVE_CLIENT_FILE_INFO_H
+#define _CAPTIVE_CLIENT_FILE_INFO_H 1
+
+
+#include <glib/gmacros.h>
+#include <glib-object.h>
+#include <libgnomevfs/gnome-vfs-file-info.h>   /* for GnomeVFSFileInfo*/
+
+
+G_BEGIN_DECLS
+
+#define CAPTIVE_FILE_INFO_TYPE_OBJECT            (captive_file_info_object_get_type())
+#define CAPTIVE_FILE_INFO_OBJECT(object)         (G_TYPE_CHECK_INSTANCE_CAST((object),CAPTIVE_FILE_INFO_TYPE_OBJECT,CaptiveFileInfoObject))
+#define CAPTIVE_FILE_INFO_OBJECT_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass),CAPTIVE_FILE_INFO_TYPE_OBJECT,CaptiveFileInfoObjectClass))
+#define CAPTIVE_FILE_INFO_IS_OBJECT(object)      (G_TYPE_CHECK_INSTANCE_TYPE((object),CAPTIVE_FILE_INFO_TYPE_OBJECT))
+#define CAPTIVE_FILE_INFO_IS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),CAPTIVE_FILE_INFO_TYPE_OBJECT))
+#define CAPTIVE_FILE_INFO_OBJECT_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj),CAPTIVE_FILE_INFO_TYPE_OBJECT,CaptiveFileInfoObjectClass))
+typedef struct _CaptiveFileInfoObject      CaptiveFileInfoObject;
+typedef struct _CaptiveFileInfoObjectClass CaptiveFileInfoObjectClass;
+
+
+struct _CaptiveFileInfoObject {
+       GObject parent_instance;
+
+       /*< public >*/
+       GnomeVFSFileInfo p;
+       /* Unsupported by GnomeVFS, see: http://bugzilla.gnome.org/show_bug.cgi?id=325427 */
+       guint atime_nsec;       /* Valid if: p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_ATIME */
+       guint mtime_nsec;       /* Valid if: p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_MTIME */
+       guint ctime_nsec;       /* Valid if: p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_CTIME */
+       };
+
+
+GType captive_file_info_object_get_type(void);
+
+GnomeVFSResult captive_file_info_object_new(CaptiveFileInfoObject **captive_file_info_object_return);
+
+G_END_DECLS
+
+
+#endif /* _CAPTIVE_CLIENT_FILE_INFO_H */
index 421ace2..5b3238f 100644 (file)
@@ -25,6 +25,7 @@
 #include <glib-object.h>
 #include <libgnomevfs/gnome-vfs-handle.h>      /* for GnomeVFSOpenMode */
 #include "captive/client-vfs.h"
+#include "captive/client-file-info.h"
 
 
 G_BEGIN_DECLS
@@ -55,9 +56,9 @@ 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);
+               CaptiveFileInfoObject **captive_file_info_object_return);
 GnomeVFSResult captive_file_file_info_set(CaptiveFileObject *captive_file_object,
-               const GnomeVFSFileInfo *info,GnomeVFSSetFileInfoMask mask);
+               CaptiveFileInfoObject *captive_file_info_object,GnomeVFSSetFileInfoMask mask);
 GnomeVFSResult captive_file_truncate(CaptiveFileObject *captive_file_object,GnomeVFSFileSize file_size);
 GnomeVFSResult captive_file_move(CaptiveFileObject *captive_file_object_old,const gchar *pathname_new,gboolean force_replace);
 
diff --git a/src/libcaptive/include/captive/rtl-time.h b/src/libcaptive/include/captive/rtl-time.h
new file mode 100644 (file)
index 0000000..1de7733
--- /dev/null
@@ -0,0 +1,38 @@
+/* $Id$
+ * Include file for internal (rtl/) time handling utilities of libcaptive
+ * Copyright (C) 2005 Jan Kratochvil <project-captive@jankratochvil.net>
+ * 
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; exactly version 2 of June 1991 is required
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+
+#ifndef _CAPTIVE_RTL_TIME_H
+#define _CAPTIVE_RTL_TIME_H 1
+
+
+#include <glib/gmacros.h>
+#include <libgnomevfs/gnome-vfs-result.h>
+#include "reactos/ntos/types.h"        /* For PLARGE_INTEGER */
+#include <time.h>
+
+
+G_BEGIN_DECLS
+
+GnomeVFSResult timespec_to_Time(PLARGE_INTEGER Time,const struct timespec *timespec);
+GnomeVFSResult Time_to_timespec(struct timespec *timespec,const PLARGE_INTEGER Time);
+
+G_END_DECLS
+
+
+#endif /* _CAPTIVE_RTL_TIME_H */
index b54b0c0..a3403ec 100644 (file)
@@ -30,6 +30,9 @@ librtl_la_SOURCES= \
                memmove.c \
                memset.c \
                string.c \
+               time.c \
                unicode.c \
                unicode_reactos.c \
                version.c
+
+librtl_la_CFLAGS=$(GNOME_VFS_CFLAGS)
diff --git a/src/libcaptive/rtl/time.c b/src/libcaptive/rtl/time.c
new file mode 100644 (file)
index 0000000..0e7d0d8
--- /dev/null
@@ -0,0 +1,100 @@
+/* $Id$
+ * reactos time user/kernel memory handling functions emulation of libcaptive
+ * Copyright (C) 2005 Jan Kratochvil <project-captive@jankratochvil.net>
+ * 
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; exactly version 2 of June 1991 is required
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+
+#include "config.h"
+
+#include "captive/rtl-time.h"  /* self */
+#include <glib/gmessages.h>
+#include "reactos/ntos/rtl.h"  /* For RtlSecondsSince1970ToTime() */
+
+
+/* It MUST match those of: reactos/ntoskrnl/rtl/time.c */
+#define TICKSPERSEC        10000000
+#define TICKSTO1970         0x019db1ded53e8000LL
+
+
+/** timespec_to_Time:
+ * @Time: Target %PLARGE_INTEGER type target MS-Windows timestamp.
+ * %NULL value is forbidden.
+ * @timespec: Source %struct %timespec type UNIX timestamp.
+ * %NULL value is forbidden.
+ *
+ * Converts the timestamp format including the sub-second part not handled by
+ * just ReactOS RtlSecondsSince1970ToTime().
+ *
+ * Returns: %GNOME_VFS_OK if everything got converted OK.
+ */
+GnomeVFSResult timespec_to_Time(PLARGE_INTEGER Time,const struct timespec *timespec)
+{
+       g_return_val_if_fail(Time!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
+       g_return_val_if_fail(timespec!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
+       g_return_val_if_fail(timespec->tv_nsec<0,GNOME_VFS_ERROR_BAD_PARAMETERS);
+       g_return_val_if_fail(timespec->tv_nsec>1000000000,GNOME_VFS_ERROR_BAD_PARAMETERS);
+
+       RtlSecondsSince1970ToTime(timespec->tv_sec,Time);
+
+       /* #define TICKSPERSEC 10000000 */
+#if TICKSPERSEC<1000000000 && !(1000000000%TICKSPERSEC)
+       Time->QuadPart+=timespec->tv_nsec / (1000000000/TICKSPERSEC);
+#else
+#error "Unsupported: TICKSPERSEC"
+#endif
+
+       return GNOME_VFS_OK;
+}
+
+/** Time_to_timespec:
+ * @timespec: Target %struct %timespec type UNIX timestamp.
+ * %NULL value is forbidden.
+ * @Time: Source %PLARGE_INTEGER type target MS-Windows timestamp.
+ * %NULL value is forbidden.
+ *
+ * Converts the timestamp format including the sub-second part not handled by
+ * just ReactOS RtlTimeToSecondsSince1970().
+ *
+ * Returns: %GNOME_VFS_OK if everything got converted OK.
+ */
+GnomeVFSResult Time_to_timespec(struct timespec *timespec,const PLARGE_INTEGER Time)
+{
+ULONG SecondsSince1970;
+BOOLEAN errBOOLEAN;
+
+       g_return_val_if_fail(timespec!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
+       g_return_val_if_fail(Time!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
+
+       errBOOLEAN=RtlTimeToSecondsSince1970(Time,&SecondsSince1970);
+       g_assert(errBOOLEAN==TRUE);
+
+       timespec->tv_sec=SecondsSince1970;
+
+       /* #define TICKSPERSEC 10000000 */
+
+       /* Some problem with the remainer? */
+#if TICKSTO1970%TICKSPERSEC
+#error "Unsupported: TICKSTO1970
+#endif
+
+#if TICKSPERSEC<1000000000 && !(1000000000%TICKSPERSEC)
+       timespec->tv_nsec=(Time->QuadPart%TICKSPERSEC) * (1000000000/TICKSPERSEC);
+#else
+#error "Unsupported: TICKSPERSEC"
+#endif
+
+       return GNOME_VFS_OK;
+}
index 1c5bb89..d70b25b 100644 (file)
 
 
 GnomeVFSResult captive_sandbox_file_info_corba_to_captive
-               (GnomeVFSFileInfo *file_info_captive,const Captive_GnomeVFSFileInfo *file_info_corba)
+               (CaptiveFileInfoObject *file_info_captive,const Captive_CaptiveFileInfoObject *file_info_corba)
 {
        g_return_val_if_fail(file_info_captive!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
        g_return_val_if_fail(file_info_corba!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
+       g_return_val_if_fail(file_info_captive->p.valid_fields==0,GNOME_VFS_ERROR_BAD_PARAMETERS);
+       g_return_val_if_fail(file_info_captive->p.name==NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
 
-       file_info_captive->valid_fields=0;
-       file_info_captive->name=g_strdup(file_info_corba->name);
+       file_info_captive->p.valid_fields=0;
+       file_info_captive->p.name=g_strdup(file_info_corba->name);
        if (file_info_corba->type_valid) {
-               file_info_captive->type=file_info_corba->type;
-               file_info_captive->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_TYPE;
+               file_info_captive->p.type=file_info_corba->type;
+               file_info_captive->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_TYPE;
                }
        if (file_info_corba->permissions_valid) {
-               file_info_captive->permissions=file_info_corba->permissions;
-               file_info_captive->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS;
+               file_info_captive->p.permissions=file_info_corba->permissions;
+               file_info_captive->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS;
                }
        if (file_info_corba->size_valid) {
-               file_info_captive->size=file_info_corba->size;
-               file_info_captive->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_SIZE;
+               file_info_captive->p.size=file_info_corba->size;
+               file_info_captive->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_SIZE;
                }
        if (file_info_corba->block_count_valid) {
-               file_info_captive->block_count=file_info_corba->block_count;
-               file_info_captive->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_BLOCK_COUNT;
+               file_info_captive->p.block_count=file_info_corba->block_count;
+               file_info_captive->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_BLOCK_COUNT;
                }
        if (file_info_corba->atime) {
-               file_info_captive->atime=file_info_corba->atime;
-               file_info_captive->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_ATIME;
+               file_info_captive->p.atime=file_info_corba->atime;
+               file_info_captive->atime_nsec=file_info_corba->atime_nsec;
+               file_info_captive->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_ATIME;
                }
        if (file_info_corba->mtime) {
-               file_info_captive->mtime=file_info_corba->mtime;
-               file_info_captive->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_MTIME;
+               file_info_captive->p.mtime=file_info_corba->mtime;
+               file_info_captive->mtime_nsec=file_info_corba->mtime_nsec;
+               file_info_captive->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_MTIME;
                }
        if (file_info_corba->ctime) {
-               file_info_captive->ctime=file_info_corba->ctime;
-               file_info_captive->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_CTIME;
+               file_info_captive->p.ctime=file_info_corba->ctime;
+               file_info_captive->ctime_nsec=file_info_corba->ctime_nsec;
+               file_info_captive->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_CTIME;
                }
        if (file_info_corba->flags_valid) {
-               file_info_captive->flags=file_info_corba->flags;
-               file_info_captive->valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_FLAGS;
+               file_info_captive->p.flags=file_info_corba->flags;
+               file_info_captive->p.valid_fields|=GNOME_VFS_FILE_INFO_FIELDS_FLAGS;
                }
 
        return GNOME_VFS_OK;
@@ -69,35 +74,56 @@ GnomeVFSResult captive_sandbox_file_info_corba_to_captive
 
 
 GnomeVFSResult captive_sandbox_file_info_captive_to_corba
-               (Captive_GnomeVFSFileInfo *file_info_corba,const GnomeVFSFileInfo *file_info_captive)
+               (Captive_CaptiveFileInfoObject *file_info_corba,const CaptiveFileInfoObject *file_info_captive)
 {
        g_return_val_if_fail(file_info_corba!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
        g_return_val_if_fail(file_info_captive!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
 
-       if (!file_info_captive->name)
+       if (!file_info_captive->p.name)
                file_info_corba->name=CORBA_string_dup("");
        else
-               file_info_corba->name=CORBA_string_dup(file_info_captive->name);
-       if ((file_info_corba->type_valid=!!(file_info_captive->valid_fields&GNOME_VFS_FILE_INFO_FIELDS_TYPE)))
-               file_info_corba->type=file_info_captive->type;
-       if ((file_info_corba->permissions_valid=!!(file_info_captive->valid_fields&GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS)))
-               file_info_corba->permissions=file_info_captive->permissions;
-       if ((file_info_corba->size_valid=!!(file_info_captive->valid_fields&GNOME_VFS_FILE_INFO_FIELDS_SIZE)))
-               file_info_corba->size=file_info_captive->size;
-       if ((file_info_corba->block_count_valid=!!(file_info_captive->valid_fields&GNOME_VFS_FILE_INFO_FIELDS_BLOCK_COUNT)))
-               file_info_corba->block_count=file_info_captive->block_count;
-       file_info_corba->atime=(!(file_info_captive->valid_fields&GNOME_VFS_FILE_INFO_FIELDS_ATIME) ? 0 : file_info_captive->atime);
-       file_info_corba->mtime=(!(file_info_captive->valid_fields&GNOME_VFS_FILE_INFO_FIELDS_MTIME) ? 0 : file_info_captive->mtime);
-       file_info_corba->ctime=(!(file_info_captive->valid_fields&GNOME_VFS_FILE_INFO_FIELDS_CTIME) ? 0 : file_info_captive->ctime);
-       if ((file_info_corba->flags_valid=!!(file_info_captive->valid_fields&GNOME_VFS_FILE_INFO_FIELDS_FLAGS)))
-               file_info_corba->flags=file_info_captive->flags;
+               file_info_corba->name=CORBA_string_dup(file_info_captive->p.name);
+       if ((file_info_corba->type_valid=!!(file_info_captive->p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_TYPE)))
+               file_info_corba->type=file_info_captive->p.type;
+       if ((file_info_corba->permissions_valid=!!(file_info_captive->p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS)))
+               file_info_corba->permissions=file_info_captive->p.permissions;
+       if ((file_info_corba->size_valid=!!(file_info_captive->p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_SIZE)))
+               file_info_corba->size=file_info_captive->p.size;
+       if ((file_info_corba->block_count_valid=!!(file_info_captive->p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_BLOCK_COUNT)))
+               file_info_corba->block_count=file_info_captive->p.block_count;
+       if (!file_info_captive->p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_ATIME) {
+               file_info_corba->atime     =0;
+               file_info_corba->atime_nsec=0;
+               }
+       else {
+               file_info_corba->atime=file_info_captive->p.atime;
+               file_info_corba->atime_nsec=file_info_captive->atime_nsec;
+               }
+       if (!file_info_captive->p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_MTIME) {
+               file_info_corba->mtime     =0;
+               file_info_corba->mtime_nsec=0;
+               }
+       else {
+               file_info_corba->mtime=file_info_captive->p.mtime;
+               file_info_corba->mtime_nsec=file_info_captive->mtime_nsec;
+               }
+       if (!file_info_captive->p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_CTIME) {
+               file_info_corba->ctime     =0;
+               file_info_corba->ctime_nsec=0;
+               }
+       else {
+               file_info_corba->ctime=file_info_captive->p.ctime;
+               file_info_corba->ctime_nsec=file_info_captive->ctime_nsec;
+               }
+       if ((file_info_corba->flags_valid=!!(file_info_captive->p.valid_fields&GNOME_VFS_FILE_INFO_FIELDS_FLAGS)))
+               file_info_corba->flags=file_info_captive->p.flags;
 
        return GNOME_VFS_OK;
 }
 
 
 GnomeVFSResult captive_sandbox_file_info_set_mask_captive_to_corba
-               (Captive_GnomeVFSFileInfo *file_info_corba,const GnomeVFSFileInfo *file_info_captive,GnomeVFSSetFileInfoMask mask)
+               (Captive_CaptiveFileInfoObject *file_info_corba,const CaptiveFileInfoObject *file_info_captive,GnomeVFSSetFileInfoMask mask)
 {
        g_return_val_if_fail(file_info_corba!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
        g_return_val_if_fail(file_info_captive!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
@@ -107,22 +133,28 @@ GnomeVFSResult captive_sandbox_file_info_set_mask_captive_to_corba
        file_info_corba->permissions_valid=CORBA_FALSE;
        file_info_corba->size_valid=CORBA_FALSE;
        file_info_corba->block_count_valid=CORBA_FALSE;
-       file_info_corba->atime=0;
-       file_info_corba->mtime=0;
-       file_info_corba->ctime=0;
+       file_info_corba->atime     =0;
+       file_info_corba->atime_nsec=0;
+       file_info_corba->mtime     =0;
+       file_info_corba->mtime_nsec=0;
+       file_info_corba->ctime     =0;
+       file_info_corba->ctime_nsec=0;
        file_info_corba->flags_valid=CORBA_FALSE;
 
        if (!(mask&GNOME_VFS_SET_FILE_INFO_NAME))
                file_info_corba->name=CORBA_string_dup("");
        else
-               file_info_corba->name=CORBA_string_dup(file_info_captive->name);
+               file_info_corba->name=CORBA_string_dup(file_info_captive->p.name);
        if ((file_info_corba->permissions_valid=!!(mask&GNOME_VFS_SET_FILE_INFO_PERMISSIONS)))
-               file_info_corba->permissions=file_info_captive->permissions;
+               file_info_corba->permissions=file_info_captive->p.permissions;
        /* Not implemented by libcaptive: GNOME_VFS_SET_FILE_INFO_OWNER */
        if (mask&GNOME_VFS_SET_FILE_INFO_TIME) {
-               file_info_corba->atime=file_info_captive->atime;
-               file_info_corba->mtime=file_info_captive->mtime;
-               file_info_corba->ctime=file_info_captive->ctime;
+               file_info_corba->atime     =file_info_captive->p.atime;
+               file_info_corba->atime_nsec=file_info_captive->atime_nsec;
+               file_info_corba->mtime     =file_info_captive->p.mtime;
+               file_info_corba->mtime_nsec=file_info_captive->mtime_nsec;
+               file_info_corba->ctime     =file_info_captive->p.ctime;
+               file_info_corba->ctime_nsec=file_info_captive->ctime_nsec;
                }
 
        return GNOME_VFS_OK;
index d9efbc8..1ab8ac9 100644 (file)
@@ -1,5 +1,5 @@
 /* $Id$
- * Include file for CORBA/ORBit server side of GnomeVFSFileInfo handling
+ * Include file for CORBA/ORBit server side of CaptiveFileInfoObject handling
  * Copyright (C) 2003 Jan Kratochvil <project-captive@jankratochvil.net>
  * 
  * This program is free software; you can redistribute it and/or modify
 
 #include <glib/gmacros.h>
 #include "sandbox.h"
-#include <libgnomevfs/gnome-vfs-file-info.h>
+#include "captive/client-file-info.h"
 
 
 G_BEGIN_DECLS
 
 GnomeVFSResult captive_sandbox_file_info_corba_to_captive
-               (GnomeVFSFileInfo *file_info_captive,const Captive_GnomeVFSFileInfo *file_info_corba);
+               (CaptiveFileInfoObject *file_info_captive,const Captive_CaptiveFileInfoObject *file_info_corba);
 GnomeVFSResult captive_sandbox_file_info_captive_to_corba
-               (Captive_GnomeVFSFileInfo *file_info_corba,const GnomeVFSFileInfo *file_info_captive);
+               (Captive_CaptiveFileInfoObject *file_info_corba,const CaptiveFileInfoObject *file_info_captive);
 GnomeVFSResult captive_sandbox_file_info_set_mask_captive_to_corba
-               (Captive_GnomeVFSFileInfo *file_info_corba,const GnomeVFSFileInfo *file_info_captive,GnomeVFSSetFileInfoMask mask);
+               (Captive_CaptiveFileInfoObject *file_info_corba,const CaptiveFileInfoObject *file_info_captive,GnomeVFSSetFileInfoMask mask);
 
 G_END_DECLS
 
index 993d32e..ebcaa54 100644 (file)
@@ -28,6 +28,7 @@
 #include "FileInfo.h"
 #include "captive/macros.h"
 #include "../client/vfs-parent.h"
+#include "captive/client-file-info.h"
 
 
 GnomeVFSResult captive_sandbox_parent_directory_new_open
@@ -142,16 +143,17 @@ GList *file_info_last_l=g_list_last(captive_directory_parent_object->corba_Direc
        return r;
 }
 
-static GnomeVFSResult captive_sandbox_parent_directory_read_fill1
-               (CaptiveDirectoryParentObject *captive_directory_parent_object,GnomeVFSFileInfo *file_info_captive)
+static GnomeVFSResult captive_sandbox_parent_directory_read_get1
+               (CaptiveDirectoryParentObject *captive_directory_parent_object,CaptiveFileInfoObject **file_info_captive_return)
 {
 xmlNode *xml_action=NULL;
-Captive_GnomeVFSFileInfo *file_info_corba;
+Captive_CaptiveFileInfoObject *file_info_corba;
 GnomeVFSResult r;
 CaptiveVfsParentObject *captive_vfs_parent_object;
+CaptiveFileInfoObject *file_info_captive;
 
        g_return_val_if_fail(CAPTIVE_DIRECTORY_PARENT_IS_OBJECT(captive_directory_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
-       g_return_val_if_fail(file_info_captive!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
+       g_return_val_if_fail(file_info_captive_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
 
        captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(CAPTIVE_DIRECTORY_OBJECT(captive_directory_parent_object)->vfs);
 
@@ -167,35 +169,40 @@ CaptiveVfsParentObject *captive_vfs_parent_object;
        if (r!=GNOME_VFS_OK)
                return r;
 
-       r=captive_sandbox_file_info_corba_to_captive(file_info_captive,file_info_corba);
+       r=captive_file_info_object_new(&file_info_captive);
        if (xml_action)
                xmlSetProp(xml_action,BAD_CAST "result",BAD_CAST gnome_vfs_result_to_string(r));
        if (r!=GNOME_VFS_OK)
                return r;       /* 'file_info_corba' leak */
 
-       Captive_GnomeVFSFileInfo__freekids(file_info_corba,NULL/* 'd'; meaning? */);
+       r=captive_sandbox_file_info_corba_to_captive(file_info_captive,file_info_corba);
+       if (xml_action)
+               xmlSetProp(xml_action,BAD_CAST "result",BAD_CAST gnome_vfs_result_to_string(r));
+       if (r!=GNOME_VFS_OK) {
+               g_object_unref(file_info_captive);
+               return r;       /* 'file_info_corba' leak */
+               }
+
+       Captive_CaptiveFileInfoObject__freekids(file_info_corba,NULL/* 'd'; meaning? */);
        CORBA_free(file_info_corba);
 
+       *file_info_captive_return=file_info_captive;
        return GNOME_VFS_OK;
 }
 
 static GnomeVFSResult captive_sandbox_parent_directory_read_filldir(CaptiveDirectoryParentObject *captive_directory_parent_object)
 {
-GnomeVFSFileInfo *file_info_captive;
+CaptiveFileInfoObject *file_info_captive;
 GnomeVFSResult r;
 
        g_return_val_if_fail(CAPTIVE_DIRECTORY_PARENT_IS_OBJECT(captive_directory_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
        g_return_val_if_fail(captive_directory_parent_object->corba_Directory_file_info_list==NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
 
        for (;;) {
-               file_info_captive=gnome_vfs_file_info_new();
-               r=captive_sandbox_parent_directory_read_fill1(captive_directory_parent_object,file_info_captive);
-               if (r==GNOME_VFS_ERROR_EOF) {
-                       gnome_vfs_file_info_unref(file_info_captive);
+               r=captive_sandbox_parent_directory_read_get1(captive_directory_parent_object,&file_info_captive);
+               if (r==GNOME_VFS_ERROR_EOF)
                        break;
-                       }
                if (r!=GNOME_VFS_OK) {
-                       gnome_vfs_file_info_unref(file_info_captive);
                        gnome_vfs_file_info_list_free(captive_directory_parent_object->corba_Directory_file_info_list);
                        captive_directory_parent_object->corba_Directory_file_info_list=NULL;
                        return r;
@@ -214,14 +221,15 @@ GnomeVFSResult r;
 
 /* We have to read the whole directory atomically
  * as during valid child restart we would loose our reading position.
+ * Returned 'CaptiveFileInfoObject' has 1 reference for yourself, you must g_object_unref() it.
  */
 GnomeVFSResult captive_sandbox_parent_directory_read
-               (CaptiveDirectoryParentObject *captive_directory_parent_object,GnomeVFSFileInfo *file_info_captive)
+               (CaptiveDirectoryParentObject *captive_directory_parent_object,CaptiveFileInfoObject **file_info_captive_return)
 {
 GnomeVFSResult r;
 
        g_return_val_if_fail(CAPTIVE_DIRECTORY_PARENT_IS_OBJECT(captive_directory_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
-       g_return_val_if_fail(file_info_captive!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
+       g_return_val_if_fail(file_info_captive_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
 
        if (!captive_directory_parent_object->corba_Directory_file_info_list)
                if (GNOME_VFS_OK!=(r=captive_sandbox_parent_directory_read_filldir(captive_directory_parent_object)))
@@ -234,10 +242,7 @@ GnomeVFSResult r;
                }
        else {
                /* Cut first list item. */
-               gnome_vfs_file_info_copy(
-                               file_info_captive,  /* dest */
-                               captive_directory_parent_object->corba_Directory_file_info_list->data); /* src */
-               gnome_vfs_file_info_unref(captive_directory_parent_object->corba_Directory_file_info_list->data);
+               *file_info_captive_return=captive_directory_parent_object->corba_Directory_file_info_list->data;
                captive_directory_parent_object->corba_Directory_file_info_list=g_list_delete_link(
                                captive_directory_parent_object->corba_Directory_file_info_list,
                                captive_directory_parent_object->corba_Directory_file_info_list);
index 483c844..abf2cdd 100644 (file)
@@ -35,7 +35,7 @@ GnomeVFSResult captive_sandbox_parent_directory_new_make
                (CaptiveDirectoryParentObject *captive_directory_parent_object,guint perm);
 GnomeVFSResult captive_sandbox_parent_directory_close(CaptiveDirectoryParentObject *captive_directory_parent_object);
 GnomeVFSResult captive_sandbox_parent_directory_read
-               (CaptiveDirectoryParentObject *captive_directory_parent_object,GnomeVFSFileInfo *file_info_captive);
+               (CaptiveDirectoryParentObject *captive_directory_parent_object,CaptiveFileInfoObject **file_info_captive_return);
 GnomeVFSResult captive_sandbox_parent_directory_remove(CaptiveDirectoryParentObject *captive_directory_parent_object);
 
 G_END_DECLS
index 46e4889..ca062f5 100644 (file)
@@ -396,15 +396,16 @@ CaptiveVfsParentObject *captive_vfs_parent_object;
 
 
 GnomeVFSResult captive_sandbox_parent_file_file_info_get(CaptiveFileParentObject *captive_file_parent_object,
-               GnomeVFSFileInfo *file_info_captive)
+               CaptiveFileInfoObject **captive_file_info_object_return)
 {
-Captive_GnomeVFSFileInfo *file_info_corba;
+Captive_CaptiveFileInfoObject *file_info_corba;
 GnomeVFSResult r;
 xmlNode *xml_action=NULL;
 CaptiveVfsParentObject *captive_vfs_parent_object;
+CaptiveFileInfoObject *captive_file_info_object;
 
        g_return_val_if_fail(CAPTIVE_FILE_PARENT_IS_OBJECT(captive_file_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
-       g_return_val_if_fail(file_info_captive!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
+       g_return_val_if_fail(captive_file_info_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
 
        captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(CAPTIVE_FILE_OBJECT(captive_file_parent_object)->vfs);
 
@@ -420,22 +421,34 @@ CaptiveVfsParentObject *captive_vfs_parent_object;
        if (r!=GNOME_VFS_OK)
                return r;
 
-       r=captive_sandbox_file_info_corba_to_captive(file_info_captive,file_info_corba);
-       Captive_GnomeVFSFileInfo__freekids(file_info_corba,NULL/* 'd'; meaning? */);
+       r=captive_file_info_object_new(&captive_file_info_object);
+       if (xml_action)
+               xmlNewProp(xml_action,BAD_CAST "result",BAD_CAST gnome_vfs_result_to_string(r));
+       if (r!=GNOME_VFS_OK) {
+               Captive_CaptiveFileInfoObject__freekids(file_info_corba,NULL/* 'd'; meaning? */);
+               CORBA_free(file_info_corba);
+               return r;
+               }
+
+       r=captive_sandbox_file_info_corba_to_captive(captive_file_info_object,file_info_corba);
+       Captive_CaptiveFileInfoObject__freekids(file_info_corba,NULL/* 'd'; meaning? */);
        CORBA_free(file_info_corba);
        if (xml_action)
                xmlSetProp(xml_action,BAD_CAST "result",BAD_CAST gnome_vfs_result_to_string(r));
-       if (r!=GNOME_VFS_OK)
+       if (r!=GNOME_VFS_OK) {
+               g_object_unref(captive_file_info_object);
                return r;
+               }
 
+       *captive_file_info_object_return=captive_file_info_object;
        return GNOME_VFS_OK;
 }
 
 
 GnomeVFSResult captive_sandbox_parent_file_file_info_set(CaptiveFileParentObject *captive_file_parent_object,
-    const GnomeVFSFileInfo *file_info_captive,GnomeVFSSetFileInfoMask mask)
+    CaptiveFileInfoObject *file_info_captive,GnomeVFSSetFileInfoMask mask)
 {
-Captive_GnomeVFSFileInfo file_info_corba;
+Captive_CaptiveFileInfoObject file_info_corba;
 GnomeVFSResult r;
 xmlNode *xml_action=NULL;
 CaptiveVfsParentObject *captive_vfs_parent_object;
@@ -461,7 +474,7 @@ CaptiveVfsParentObject *captive_vfs_parent_object;
        if (r!=GNOME_VFS_OK)
                return r;
 
-       Captive_GnomeVFSFileInfo__freekids(&file_info_corba,NULL/* 'd'; meaning? */);
+       Captive_CaptiveFileInfoObject__freekids(&file_info_corba,NULL/* 'd'; meaning? */);
 
        return GNOME_VFS_OK;
 }
index d8cd094..0d10081 100644 (file)
@@ -43,9 +43,9 @@ GnomeVFSResult captive_sandbox_parent_file_tell
                (CaptiveFileParentObject *captive_file_parent_object,GnomeVFSFileOffset *offset_return);
 GnomeVFSResult captive_sandbox_parent_file_remove(CaptiveFileParentObject *captive_file_parent_object);
 GnomeVFSResult captive_sandbox_parent_file_file_info_get(CaptiveFileParentObject *captive_file_parent_object,
-               GnomeVFSFileInfo *file_info);
+               CaptiveFileInfoObject **captive_file_info_object_return);
 GnomeVFSResult captive_sandbox_parent_file_file_info_set(CaptiveFileParentObject *captive_file_parent_object,
-    const GnomeVFSFileInfo *info,GnomeVFSSetFileInfoMask mask);
+    CaptiveFileInfoObject *file_info_captive,GnomeVFSSetFileInfoMask mask);
 GnomeVFSResult captive_sandbox_parent_file_truncate
                (CaptiveFileParentObject *captive_file_parent_object,GnomeVFSFileSize file_size);
 GnomeVFSResult captive_sandbox_parent_file_move
index 7e3cb44..74c0fae 100644 (file)
@@ -52,6 +52,7 @@ module Captive
 
        typedef unsigned long      GnomeVFSFileType;        /* enum */
        typedef unsigned short     GnomeVFSFilePermissions;
+       typedef unsigned long      guint;
        typedef unsigned long long time_t;
        typedef unsigned long long GnomeVFSFileSize;
        typedef unsigned long long GnomeVFSFileFlags;
@@ -59,7 +60,7 @@ module Captive
        typedef unsigned long      GnomeVFSSeekPosition;    /* enum */
        typedef unsigned long      GnomeVFSSetFileInfoMask; /* enum mask */
        typedef unsigned long long GnomeVFSOpenMode;          /* enum mask */
-       struct GnomeVFSFileInfo {
+       struct CaptiveFileInfoObject {
                string name;    /* Base name of the file (no path). */
                /* File type (i.e. regular, directory, block device...). */
                GnomeVFSFileType type;
@@ -72,8 +73,11 @@ module Captive
                boolean block_count_valid;
                /* Access, modification and change times. */
                time_t atime;   /* not valid if ==(time_t)0 */
+               guint atime_nsec;
                time_t mtime;   /* not valid if ==(time_t)0 */
+               guint mtime_nsec;
                time_t ctime;   /* not valid if ==(time_t)0 */
+               guint ctime_nsec;
                GnomeVFSFileFlags flags;
                boolean flags_valid;
                };
@@ -123,7 +127,7 @@ module Captive
 
 
        interface Directory {
-               void read(out GnomeVFSFileInfo file_info)
+               void read(out CaptiveFileInfoObject file_info)
                        raises (GnomeVFSResultException,GLogMessageFatal);
                void remove()
                        raises (GnomeVFSResultException,GLogMessageFatal);
@@ -142,9 +146,9 @@ module Captive
                        raises (GnomeVFSResultException,GLogMessageFatal);
                void remove()
                        raises (GnomeVFSResultException,GLogMessageFatal);
-               void file_info_get(out GnomeVFSFileInfo file_info)
+               void file_info_get(out CaptiveFileInfoObject file_info)
                        raises (GnomeVFSResultException,GLogMessageFatal);
-               void file_info_set(in GnomeVFSFileInfo file_info,in GnomeVFSSetFileInfoMask mask)
+               void file_info_set(in CaptiveFileInfoObject file_info,in GnomeVFSSetFileInfoMask mask)
                        raises (GnomeVFSResultException,GLogMessageFatal);
                void truncate(in GnomeVFSFileSize file_size)
                        raises (GnomeVFSResultException,GLogMessageFatal);
index 069db40..c77a605 100644 (file)
@@ -31,7 +31,7 @@
 
 static void impl_Captive_Directory_fini(impl_POA_Captive_Directory *servant,CORBA_Environment *ev);
 static void impl_Captive_Directory_read
-               (impl_POA_Captive_Directory *servant,Captive_GnomeVFSFileInfo **file_info,CORBA_Environment *ev);
+               (impl_POA_Captive_Directory *servant,Captive_CaptiveFileInfoObject **file_info,CORBA_Environment *ev);
 static void impl_Captive_Directory_remove(impl_POA_Captive_Directory *servant,CORBA_Environment *ev);
 static void impl_Captive_Directory_shutdown(impl_POA_Captive_Directory *servant,CORBA_Environment *ev);
 
@@ -150,10 +150,10 @@ GnomeVFSResult errvfsresult;
 
 
 static void impl_Captive_Directory_read
-               (impl_POA_Captive_Directory *servant,Captive_GnomeVFSFileInfo **file_info_corba_return,CORBA_Environment *ev)
+               (impl_POA_Captive_Directory *servant,Captive_CaptiveFileInfoObject **file_info_corba_return,CORBA_Environment *ev)
 {
-GnomeVFSFileInfo file_info_captive;
-Captive_GnomeVFSFileInfo *file_info_corba;
+CaptiveFileInfoObject *file_info_captive;
+Captive_CaptiveFileInfoObject *file_info_corba;
 GnomeVFSResult errvfsresult;
 
        if (GNOME_VFS_OK!=(errvfsresult=captive_directory_read(servant->captive_directory_object,&file_info_captive))) {
@@ -161,12 +161,14 @@ GnomeVFSResult errvfsresult;
                return;
                }
 
-       file_info_corba=Captive_GnomeVFSFileInfo__alloc();
+       file_info_corba=Captive_CaptiveFileInfoObject__alloc();
 
-       if (GNOME_VFS_OK!=(errvfsresult=captive_sandbox_file_info_captive_to_corba(
-                       file_info_corba,&file_info_captive))) {
+       errvfsresult=captive_sandbox_file_info_captive_to_corba(file_info_corba,file_info_captive);
+       g_object_unref(file_info_captive);
+
+       if (GNOME_VFS_OK!=errvfsresult) {
                captive_sandbox_child_GnomeVFSResultException_throw(ev,errvfsresult);
-               Captive_GnomeVFSFileInfo__freekids(file_info_corba,NULL/* 'd'; meaning? */);
+               Captive_CaptiveFileInfoObject__freekids(file_info_corba,NULL/* 'd'; meaning? */);
                CORBA_free(file_info_corba);
                return;
                }
index 48e94d8..b5a144b 100644 (file)
@@ -39,9 +39,9 @@ static void impl_Captive_File_tell
                (impl_POA_Captive_File *servant,Captive_GnomeVFSFileOffset *offset_return,CORBA_Environment *ev);
 static void impl_Captive_File_remove(impl_POA_Captive_File *servant,CORBA_Environment *ev);
 static void impl_Captive_File_file_info_get
-               (impl_POA_Captive_File *servant,Captive_GnomeVFSFileInfo **file_info,CORBA_Environment *ev);
+               (impl_POA_Captive_File *servant,Captive_CaptiveFileInfoObject **file_info,CORBA_Environment *ev);
 static void impl_Captive_File_file_info_set(impl_POA_Captive_File *servant,
-               const Captive_GnomeVFSFileInfo *file_info,const Captive_GnomeVFSSetFileInfoMask mask,CORBA_Environment *ev);
+               const Captive_CaptiveFileInfoObject *file_info,const Captive_GnomeVFSSetFileInfoMask mask,CORBA_Environment *ev);
 static void impl_Captive_File_truncate
                (impl_POA_Captive_File *servant,const Captive_GnomeVFSFileSize file_size,CORBA_Environment *ev);
 static void impl_Captive_File_move
@@ -250,23 +250,25 @@ GnomeVFSResult errvfsresult;
 
 
 static void impl_Captive_File_file_info_get
-               (impl_POA_Captive_File *servant,Captive_GnomeVFSFileInfo **file_info_corba_return,CORBA_Environment *ev)
+               (impl_POA_Captive_File *servant,Captive_CaptiveFileInfoObject **file_info_corba_return,CORBA_Environment *ev)
 {
-GnomeVFSFileInfo file_info_captive;
+CaptiveFileInfoObject *file_info_captive;
 GnomeVFSResult errvfsresult;
-Captive_GnomeVFSFileInfo *file_info_corba;
+Captive_CaptiveFileInfoObject *file_info_corba;
 
        if (GNOME_VFS_OK!=(errvfsresult=captive_file_file_info_get(servant->captive_file_object,&file_info_captive))) {
                captive_sandbox_child_GnomeVFSResultException_throw(ev,errvfsresult);
                return;
                }
 
-       file_info_corba=Captive_GnomeVFSFileInfo__alloc();
+       file_info_corba=Captive_CaptiveFileInfoObject__alloc();
 
-       if (GNOME_VFS_OK!=(errvfsresult=captive_sandbox_file_info_captive_to_corba(
-                       file_info_corba,&file_info_captive))) {
+       errvfsresult=captive_sandbox_file_info_captive_to_corba(file_info_corba,file_info_captive);
+       g_object_unref(file_info_captive);
+
+       if (GNOME_VFS_OK!=errvfsresult) {
                captive_sandbox_child_GnomeVFSResultException_throw(ev,errvfsresult);
-               Captive_GnomeVFSFileInfo__freekids(file_info_corba,NULL/* 'd'; meaning? */);
+               Captive_CaptiveFileInfoObject__freekids(file_info_corba,NULL/* 'd'; meaning? */);
                CORBA_free(file_info_corba);
                return;
                }
@@ -276,18 +278,21 @@ Captive_GnomeVFSFileInfo *file_info_corba;
 
 
 static void impl_Captive_File_file_info_set(impl_POA_Captive_File *servant,
-               const Captive_GnomeVFSFileInfo *file_info_corba,const Captive_GnomeVFSSetFileInfoMask mask,CORBA_Environment *ev)
+               const Captive_CaptiveFileInfoObject *file_info_corba,const Captive_GnomeVFSSetFileInfoMask mask,CORBA_Environment *ev)
 {
-GnomeVFSFileInfo file_info_captive;
+CaptiveFileInfoObject *file_info_captive;
 GnomeVFSResult errvfsresult;
 
        if (GNOME_VFS_OK!=(errvfsresult=captive_sandbox_file_info_corba_to_captive(
-                       &file_info_captive,file_info_corba))) {
+                       file_info_captive,file_info_corba))) {
                captive_sandbox_child_GnomeVFSResultException_throw(ev,errvfsresult);
                return;
                }
 
-       if (GNOME_VFS_OK!=(errvfsresult=captive_file_file_info_set(servant->captive_file_object,&file_info_captive,mask))) {
+       errvfsresult=captive_file_file_info_set(servant->captive_file_object,file_info_captive,mask);
+       g_object_unref(file_info_captive);
+
+       if (GNOME_VFS_OK!=errvfsresult) {
                captive_sandbox_child_GnomeVFSResultException_throw(ev,errvfsresult);
                return;
                }