file_open/file_create: +commits retrying code
[captive.git] / src / libcaptive / client / file-parent.c
index 1338ede..038bdc5 100644 (file)
@@ -182,6 +182,8 @@ GnomeVFSResult captive_file_parent_new_open(CaptiveFileObject **captive_file_obj
 {
 CaptiveFileParentObject *captive_file_parent_object;
 GnomeVFSResult r;
+gint retried=0;
+gint retried_commit=0;
 
        g_return_val_if_fail(captive_file_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
        g_return_val_if_fail(CAPTIVE_VFS_PARENT_IS_OBJECT(captive_vfs_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
@@ -195,18 +197,30 @@ GnomeVFSResult r;
 
        captive_file_parent_init(captive_file_parent_object,captive_vfs_object);
 
-       if (GNOME_VFS_OK!=(r=captive_parent_connector_connect(CAPTIVE_PARENT_CONNECTOR(captive_file_parent_object))))
-               return r;
-
-       if (GNOME_VFS_OK!=(r=captive_sandbox_parent_file_new_open(captive_file_parent_object))) {
-               g_object_unref(captive_file_parent_object);
-               *captive_file_object_return=NULL;
-               return r;
-               }
-
-       *captive_file_object_return=CAPTIVE_FILE_OBJECT(captive_file_parent_object);
-       return (*captive_file_parent_object_captive_parent_connector_open_orig)
-                       (CAPTIVE_PARENT_CONNECTOR(captive_file_parent_object));
+       do {
+               if (GNOME_VFS_OK!=(r=captive_parent_connector_connect(CAPTIVE_PARENT_CONNECTOR(captive_file_parent_object))))
+                       return r;
+               if (GNOME_VFS_ERROR_SERVICE_NOT_AVAILABLE
+                               !=(r=captive_sandbox_parent_file_new_open(captive_file_parent_object))) {
+                       if (GNOME_VFS_ERROR_SERVICE_OBSOLETE==r) {
+                               if (!retried_commit++) {
+                                       if (GNOME_VFS_OK!=(r=captive_vfs_commit(captive_vfs_object)))
+                                               return r;
+                                       retried=0;
+                                       continue;
+                                       }
+                               }
+                       if (GNOME_VFS_OK!=r) {
+                               g_object_unref(captive_file_parent_object);
+                               *captive_file_object_return=NULL;
+                               return r;
+                               }
+                       *captive_file_object_return=CAPTIVE_FILE_OBJECT(captive_file_parent_object);
+                       return (*captive_file_parent_object_captive_parent_connector_open_orig)
+                                       (CAPTIVE_PARENT_CONNECTOR(captive_file_parent_object));
+                       }
+               } while (!retried++);
+       return r;
 }
 
 
@@ -215,6 +229,8 @@ GnomeVFSResult captive_file_parent_new_create(CaptiveFileObject **captive_file_o
 {
 CaptiveFileParentObject *captive_file_parent_object;
 GnomeVFSResult r;
+gint retried=0;
+gint retried_commit=0;
 
        g_return_val_if_fail(captive_file_object_return!=NULL,GNOME_VFS_ERROR_BAD_PARAMETERS);
        g_return_val_if_fail(CAPTIVE_VFS_PARENT_IS_OBJECT(captive_vfs_object),GNOME_VFS_ERROR_BAD_PARAMETERS);
@@ -231,16 +247,31 @@ GnomeVFSResult r;
        if (GNOME_VFS_OK!=(r=captive_parent_connector_connect(CAPTIVE_PARENT_CONNECTOR(captive_file_parent_object))))
                return r;
 
-       if (GNOME_VFS_OK!=(r=captive_sandbox_parent_file_new_create(captive_file_parent_object,exclusive,perm))) {
-               g_object_unref(captive_file_parent_object);
-               *captive_file_object_return=NULL;
-               return r;
-               }
-       captive_parent_connector_set_dirty(CAPTIVE_PARENT_CONNECTOR(captive_file_parent_object));
-
-       *captive_file_object_return=CAPTIVE_FILE_OBJECT(captive_file_parent_object);
-       return (*captive_file_parent_object_captive_parent_connector_open_orig)
-                       (CAPTIVE_PARENT_CONNECTOR(captive_file_parent_object));
+       do {
+               if (GNOME_VFS_OK!=(r=captive_parent_connector_connect(CAPTIVE_PARENT_CONNECTOR(captive_file_parent_object))))
+                       return r;
+               if (GNOME_VFS_ERROR_SERVICE_NOT_AVAILABLE
+                               !=(r=captive_sandbox_parent_file_new_create(captive_file_parent_object,exclusive,perm))) {
+                       if (GNOME_VFS_ERROR_SERVICE_OBSOLETE==r) {
+                               if (!retried_commit++) {
+                                       if (GNOME_VFS_OK!=(r=captive_vfs_commit(captive_vfs_object)))
+                                               return r;
+                                       retried=0;
+                                       continue;
+                                       }
+                               }
+                       if (GNOME_VFS_OK!=r) {
+                               g_object_unref(captive_file_parent_object);
+                               *captive_file_object_return=NULL;
+                               return r;
+                               }
+                       captive_parent_connector_set_dirty(CAPTIVE_PARENT_CONNECTOR(captive_file_parent_object));
+                       *captive_file_object_return=CAPTIVE_FILE_OBJECT(captive_file_parent_object);
+                       return (*captive_file_parent_object_captive_parent_connector_open_orig)
+                                       (CAPTIVE_PARENT_CONNECTOR(captive_file_parent_object));
+                       }
+               } while (!retried++);
+       return r;
 }