Initial original import from: fuse-2.4.2-2.fc4
[captive.git] / src / libcaptive / client / directory-parent.c
index be8970e..796a05b 100644 (file)
@@ -35,15 +35,29 @@ static GnomeVFSResult captive_directory_parent_read
 static GnomeVFSResult captive_directory_parent_remove(CaptiveDirectoryObject *captive_directory_object);
 
 
-static void captive_directory_parent_object_finalize(CaptiveDirectoryParentObject *captive_directory_parent_object)
+static void captive_directory_parent_object_dispose(CaptiveDirectoryParentObject *captive_directory_parent_object)
 {
        g_return_if_fail(captive_directory_parent_object!=NULL);
 
        captive_directory_parent_close(CAPTIVE_DIRECTORY_OBJECT(captive_directory_parent_object));      /* errors ignored */
 
-       G_OBJECT_CLASS(captive_directory_parent_object_parent_class)->finalize((GObject *)captive_directory_parent_object);
+       if (captive_parent_connector_dispose(CAPTIVE_PARENT_CONNECTOR(captive_directory_parent_object)))
+               return;
+
+       G_OBJECT_CLASS(captive_directory_parent_object_parent_class)->dispose((GObject *)captive_directory_parent_object);
 }
 
+static void captive_directory_parent_object_finalize(CaptiveDirectoryParentObject *captive_directory_parent_object)
+{
+       g_return_if_fail(captive_directory_parent_object!=NULL);
+
+       captive_parent_connector_finalize(CAPTIVE_PARENT_CONNECTOR(captive_directory_parent_object));
+
+       g_free(captive_directory_parent_object->pathname);
+       captive_directory_parent_object->pathname=NULL;
+
+       G_OBJECT_CLASS(captive_directory_parent_object_parent_class)->finalize((GObject *)captive_directory_parent_object);
+}
 
 static void captive_directory_parent_object_class_init(CaptiveDirectoryParentObjectClass *class)
 {
@@ -51,6 +65,7 @@ GObjectClass *gobject_class=G_OBJECT_CLASS(class);
 CaptiveDirectoryObjectClass *captive_directory_object_class=CAPTIVE_DIRECTORY_OBJECT_CLASS(class);
 
        captive_directory_parent_object_parent_class=g_type_class_ref(g_type_parent(G_TYPE_FROM_CLASS(class)));
+       gobject_class->dispose=(void (*)(GObject *object))captive_directory_parent_object_dispose;
        gobject_class->finalize=(void (*)(GObject *object))captive_directory_parent_object_finalize;
 
        captive_directory_object_class->read=captive_directory_parent_read;
@@ -68,6 +83,9 @@ static GnomeVFSResult captive_directory_parent_object_captive_parent_connector_c
 static GnomeVFSResult (*captive_directory_parent_object_captive_parent_connector_close_orig)
                (CaptiveParentConnector *captive_parent_connector);
 
+static G_CONST_RETURN gchar *captive_directory_parent_object_captive_parent_connector_get_pathname
+               (CaptiveParentConnector *captive_parent_connector);
+
 static void captive_directory_parent_object_captive_parent_connector_init(CaptiveParentConnectorIface *captive_parent_connector_iface)
 {
        g_return_if_fail(CAPTIVE_IS_PARENT_CONNECTOR_CLASS(captive_parent_connector_iface));
@@ -77,6 +95,8 @@ static void captive_directory_parent_object_captive_parent_connector_init(Captiv
 
        captive_directory_parent_object_captive_parent_connector_close_orig=captive_parent_connector_iface->close;
        captive_parent_connector_iface->close=captive_directory_parent_object_captive_parent_connector_close;
+
+       captive_parent_connector_iface->get_pathname=captive_directory_parent_object_captive_parent_connector_get_pathname;
 }
 
 
@@ -192,6 +212,7 @@ GnomeVFSResult r;
                *captive_directory_object_return=NULL;
                return r;
                }
+       captive_parent_connector_set_dirty(CAPTIVE_PARENT_CONNECTOR(captive_directory_parent_object));
 
        *captive_directory_object_return=CAPTIVE_DIRECTORY_OBJECT(captive_directory_parent_object);
        return (*captive_directory_parent_object_captive_parent_connector_open_orig)
@@ -203,18 +224,19 @@ static GnomeVFSResult captive_directory_parent_close(CaptiveDirectoryObject *cap
 {
 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);
 
        captive_directory_parent_object=CAPTIVE_DIRECTORY_PARENT_OBJECT(captive_directory_object);
 
-       r=captive_parent_connector_close(CAPTIVE_PARENT_CONNECTOR(captive_directory_parent_object));
-
-       captive_parent_connector_finalize(CAPTIVE_PARENT_CONNECTOR(captive_directory_parent_object));
-
-       g_free(captive_directory_parent_object->pathname);
-       captive_directory_parent_object->pathname=NULL;
-
+       do {
+               if (GNOME_VFS_OK!=(r=captive_parent_connector_open(CAPTIVE_PARENT_CONNECTOR(captive_directory_parent_object))))
+                       break;
+               if (GNOME_VFS_ERROR_SERVICE_NOT_AVAILABLE
+                               !=(r=captive_parent_connector_close(CAPTIVE_PARENT_CONNECTOR(captive_directory_parent_object))))
+                       break;
+               } while (!retried++);
        return r;
 }
 
@@ -249,6 +271,22 @@ GnomeVFSResult r;
 }
 
 
+static G_CONST_RETURN gchar *captive_directory_parent_object_captive_parent_connector_get_pathname
+               (CaptiveParentConnector *captive_parent_connector)
+{
+CaptiveDirectoryParentObject *captive_directory_parent_object;
+
+       g_return_val_if_fail(CAPTIVE_IS_PARENT_CONNECTOR(captive_parent_connector),NULL);
+       g_return_val_if_fail(CAPTIVE_DIRECTORY_PARENT_IS_OBJECT(captive_parent_connector),NULL);
+
+       captive_directory_parent_object=CAPTIVE_DIRECTORY_PARENT_OBJECT(captive_parent_connector);
+
+       g_return_val_if_fail(captive_directory_parent_object->pathname!=NULL,NULL);
+
+       return captive_directory_parent_object->pathname;
+}
+
+
 static GnomeVFSResult captive_directory_parent_read
                (CaptiveDirectoryObject *captive_directory_object,GnomeVFSFileInfo *file_info)
 {