Implemented sub-second W32 filesystem interface by new: CaptiveFileInfoObject
[captive.git] / src / libcaptive / sandbox / parent-Directory.c
index 993d32e..ebcaa54 100644 (file)
@@ -28,6 +28,7 @@
 #include "FileInfo.h"
 #include "captive/macros.h"
 #include "../client/vfs-parent.h"
+#include "captive/client-file-info.h"
 
 
 GnomeVFSResult captive_sandbox_parent_directory_new_open
@@ -142,16 +143,17 @@ GList *file_info_last_l=g_list_last(captive_directory_parent_object->corba_Direc
        return r;
 }
 
-static GnomeVFSResult captive_sandbox_parent_directory_read_fill1
-               (CaptiveDirectoryParentObject *captive_directory_parent_object,GnomeVFSFileInfo *file_info_captive)
+static GnomeVFSResult captive_sandbox_parent_directory_read_get1
+               (CaptiveDirectoryParentObject *captive_directory_parent_object,CaptiveFileInfoObject **file_info_captive_return)
 {
 xmlNode *xml_action=NULL;
-Captive_GnomeVFSFileInfo *file_info_corba;
+Captive_CaptiveFileInfoObject *file_info_corba;
 GnomeVFSResult r;
 CaptiveVfsParentObject *captive_vfs_parent_object;
+CaptiveFileInfoObject *file_info_captive;
 
        g_return_val_if_fail(CAPTIVE_DIRECTORY_PARENT_IS_OBJECT(captive_directory_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
-       g_return_val_if_fail(file_info_captive!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
+       g_return_val_if_fail(file_info_captive_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
 
        captive_vfs_parent_object=CAPTIVE_VFS_PARENT_OBJECT(CAPTIVE_DIRECTORY_OBJECT(captive_directory_parent_object)->vfs);
 
@@ -167,35 +169,40 @@ CaptiveVfsParentObject *captive_vfs_parent_object;
        if (r!=GNOME_VFS_OK)
                return r;
 
-       r=captive_sandbox_file_info_corba_to_captive(file_info_captive,file_info_corba);
+       r=captive_file_info_object_new(&file_info_captive);
        if (xml_action)
                xmlSetProp(xml_action,BAD_CAST "result",BAD_CAST gnome_vfs_result_to_string(r));
        if (r!=GNOME_VFS_OK)
                return r;       /* 'file_info_corba' leak */
 
-       Captive_GnomeVFSFileInfo__freekids(file_info_corba,NULL/* 'd'; meaning? */);
+       r=captive_sandbox_file_info_corba_to_captive(file_info_captive,file_info_corba);
+       if (xml_action)
+               xmlSetProp(xml_action,BAD_CAST "result",BAD_CAST gnome_vfs_result_to_string(r));
+       if (r!=GNOME_VFS_OK) {
+               g_object_unref(file_info_captive);
+               return r;       /* 'file_info_corba' leak */
+               }
+
+       Captive_CaptiveFileInfoObject__freekids(file_info_corba,NULL/* 'd'; meaning? */);
        CORBA_free(file_info_corba);
 
+       *file_info_captive_return=file_info_captive;
        return GNOME_VFS_OK;
 }
 
 static GnomeVFSResult captive_sandbox_parent_directory_read_filldir(CaptiveDirectoryParentObject *captive_directory_parent_object)
 {
-GnomeVFSFileInfo *file_info_captive;
+CaptiveFileInfoObject *file_info_captive;
 GnomeVFSResult r;
 
        g_return_val_if_fail(CAPTIVE_DIRECTORY_PARENT_IS_OBJECT(captive_directory_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
        g_return_val_if_fail(captive_directory_parent_object->corba_Directory_file_info_list==NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
 
        for (;;) {
-               file_info_captive=gnome_vfs_file_info_new();
-               r=captive_sandbox_parent_directory_read_fill1(captive_directory_parent_object,file_info_captive);
-               if (r==GNOME_VFS_ERROR_EOF) {
-                       gnome_vfs_file_info_unref(file_info_captive);
+               r=captive_sandbox_parent_directory_read_get1(captive_directory_parent_object,&file_info_captive);
+               if (r==GNOME_VFS_ERROR_EOF)
                        break;
-                       }
                if (r!=GNOME_VFS_OK) {
-                       gnome_vfs_file_info_unref(file_info_captive);
                        gnome_vfs_file_info_list_free(captive_directory_parent_object->corba_Directory_file_info_list);
                        captive_directory_parent_object->corba_Directory_file_info_list=NULL;
                        return r;
@@ -214,14 +221,15 @@ GnomeVFSResult r;
 
 /* We have to read the whole directory atomically
  * as during valid child restart we would loose our reading position.
+ * Returned 'CaptiveFileInfoObject' has 1 reference for yourself, you must g_object_unref() it.
  */
 GnomeVFSResult captive_sandbox_parent_directory_read
-               (CaptiveDirectoryParentObject *captive_directory_parent_object,GnomeVFSFileInfo *file_info_captive)
+               (CaptiveDirectoryParentObject *captive_directory_parent_object,CaptiveFileInfoObject **file_info_captive_return)
 {
 GnomeVFSResult r;
 
        g_return_val_if_fail(CAPTIVE_DIRECTORY_PARENT_IS_OBJECT(captive_directory_parent_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
-       g_return_val_if_fail(file_info_captive!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
+       g_return_val_if_fail(file_info_captive_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
 
        if (!captive_directory_parent_object->corba_Directory_file_info_list)
                if (GNOME_VFS_OK!=(r=captive_sandbox_parent_directory_read_filldir(captive_directory_parent_object)))
@@ -234,10 +242,7 @@ GnomeVFSResult r;
                }
        else {
                /* Cut first list item. */
-               gnome_vfs_file_info_copy(
-                               file_info_captive,  /* dest */
-                               captive_directory_parent_object->corba_Directory_file_info_list->data); /* src */
-               gnome_vfs_file_info_unref(captive_directory_parent_object->corba_Directory_file_info_list->data);
+               *file_info_captive_return=captive_directory_parent_object->corba_Directory_file_info_list->data;
                captive_directory_parent_object->corba_Directory_file_info_list=g_list_delete_link(
                                captive_directory_parent_object->corba_Directory_file_info_list,
                                captive_directory_parent_object->corba_Directory_file_info_list);