- Fixed FUSE uninitialized sub-seconds fields.
- Bugreported by: Frederic L. W. Meunier
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"
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")) {
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")) {
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);
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;
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;
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;
}
-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;
}
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);
}
#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())
} 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 */
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)
--- /dev/null
+/* $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;
+}
*/
-#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 */
+++ /dev/null
-/* $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;
-}
#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);
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);
#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);
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;
}
#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); */
{
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);
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;
#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);
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);
{
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;
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;
}
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);
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);
{
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;
/* 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;
}
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);
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);
file-slave.h \
file.c \
file.h \
+ file-info.c \
giochannel-blind.c \
giochannel-blind.h \
giochannel-subrange.c \
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);
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);
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;
#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);
}
-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)
/* '->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
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(×pec,&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(×pec,
/* 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(×pec,&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;
}
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;
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);
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);
}
-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);
}
#include <glib/gtypes.h>
#include "captive/client-vfs.h"
#include "captive/client-directory.h"
+#include "captive/client-file-info.h"
G_BEGIN_DECLS
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);
};
--- /dev/null
+/* $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;
+}
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);
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);
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;
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);
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;
#include "vfs.h"
#include "vfs-slave.h"
#include "../cc/sharedcachemap.h"
+#include "captive/rtl-time.h"
/* Config: */
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);
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);
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;
/* 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;
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;
}
/* 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(×pec,&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(×pec,
/* 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(×pec,&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;
/* 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;
+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;
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 */
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 */
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);
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;
}
/* 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? */
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 */
+ ×pec); /* 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 */
+ ×pec); /* 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 */
+ ×pec); /* timespec */
+ g_return_val_if_fail(GNOME_VFS_OK==errvfsresult,errvfsresult);
}
}
}
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 */
}
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);
}
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);
};
# $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
client-directory.h \
client-file.h \
client-vfs.h \
+ client-file-info.h \
client.h \
config2.h \
ldr.h \
options.h \
ps_reactos.h \
rtl-file.h \
+ rtl-time.h \
signal.h \
storage.h \
unicode.h \
#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"
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);
--- /dev/null
+/* $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 */
#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
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);
--- /dev/null
+/* $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 */
memmove.c \
memset.c \
string.c \
+ time.c \
unicode.c \
unicode_reactos.c \
version.c
+
+librtl_la_CFLAGS=$(GNOME_VFS_CFLAGS)
--- /dev/null
+/* $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;
+}
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;
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);
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;
/* $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
#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
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);
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;
/* 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)))
}
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);
(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
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);
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;
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;
}
(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
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;
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;
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;
};
interface Directory {
- void read(out GnomeVFSFileInfo file_info)
+ void read(out CaptiveFileInfoObject file_info)
raises (GnomeVFSResultException,GLogMessageFatal);
void remove()
raises (GnomeVFSResultException,GLogMessageFatal);
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);
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);
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))) {
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;
}
(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
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;
}
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;
}