[monkey-bubble: 338/753] Implemented the new CORBA API.



commit 7f3a1b6d0d5abb799dc6e8841aa60b06c57b96c4
Author: Martin Baulig <baulig suse de>
Date:   Thu May 31 16:39:59 2001 +0000

    Implemented the new CORBA API.
    
    2001-05-31  Martin Baulig  <baulig suse de>
    
    	* gnome-selector.c: Implemented the new CORBA API.
    
    	* gnome-selector.h (GnomeSelectorClass): Renamed "clear" to "clear_uri_list",
    	added "scan_directory" and added `gboolean directory_ok' to "check_uri".
    	(gnome_selector_scan_uri, gnome_selector_set_directory_filter): New functions.
    
    	* gnome-async-context.c
    	(GnomeAsyncFunc): Added `gboolean completed' and `const BonoboArg *result'.
    	(gnome_async_context_get_handle_by_id): New function.
    	(gnome_async_handle_set_result): New function.
    	(gnome_async_handle_call_async_func): New function.
    	(gnome_async_handle_get_id): New function.
    
    	* gnome-file-selector.[ch]: Derive from GnomeDirectoryFilter.
    
    	* gnome-selector-dialog.[ch]: Removed.

 libgnome/ChangeLog                |   19 ++
 libgnome/Makefile.am              |    2 -
 libgnome/gnome-directory-filter.c |  111 ++++++--
 libgnome/gnome-directory-filter.h |    1 +
 libgnome/gnome-file-selector.c    |  530 ++++++-------------------------------
 libgnome/gnome-file-selector.h    |    6 +-
 libgnome/gnome-marshal.list       |    1 +
 libgnome/gnome-selector-dialog.c  |   82 ------
 libgnome/gnome-selector-dialog.h  |   66 -----
 9 files changed, 188 insertions(+), 630 deletions(-)
---
diff --git a/libgnome/ChangeLog b/libgnome/ChangeLog
index f07c1e5..beb4022 100644
--- a/libgnome/ChangeLog
+++ b/libgnome/ChangeLog
@@ -1,3 +1,22 @@
+2001-05-31  Martin Baulig  <baulig suse de>
+
+	* gnome-selector.c: Implemented the new CORBA API.
+
+	* gnome-selector.h (GnomeSelectorClass): Renamed "clear" to "clear_uri_list",
+	added "scan_directory" and added `gboolean directory_ok' to "check_uri".
+	(gnome_selector_scan_uri, gnome_selector_set_directory_filter): New functions.
+
+	* gnome-async-context.c
+	(GnomeAsyncFunc): Added `gboolean completed' and `const BonoboArg *result'.
+	(gnome_async_context_get_handle_by_id): New function.
+	(gnome_async_handle_set_result): New function.
+	(gnome_async_handle_call_async_func): New function.
+	(gnome_async_handle_get_id): New function.
+
+	* gnome-file-selector.[ch]: Derive from GnomeDirectoryFilter.
+
+	* gnome-selector-dialog.[ch]: Removed.
+
 2001-05-25  Martin Baulig  <baulig suse de>
 
 	* gnome-selector.[ch]: Merged `check_filename' and `check_directory'
diff --git a/libgnome/Makefile.am b/libgnome/Makefile.am
index 93738e1..767d82a 100644
--- a/libgnome/Makefile.am
+++ b/libgnome/Makefile.am
@@ -60,7 +60,6 @@ libgnome_src = \
 	gnome-selector.c	\
 	gnome-file-selector.c	\
 	gnome-selector-factory.c\
-	gnome-selector-dialog.c	\
 	gnome-directory-filter.c\
 	gnome-config.c		\
 	gnome-ditem.c		\
@@ -106,7 +105,6 @@ libgnome_headers = \
 	gnome-selectorP.h	\
 	gnome-file-selector.h	\
 	gnome-selector-factory.h\
-	gnome-selector-dialog.h	\
 	gnome-directory-filter.h\
 	libgnome-init.h		\
 	libgnome.h
diff --git a/libgnome/gnome-directory-filter.c b/libgnome/gnome-directory-filter.c
index d2c2b77..bbc457a 100644
--- a/libgnome/gnome-directory-filter.c
+++ b/libgnome/gnome-directory-filter.c
@@ -67,41 +67,104 @@ impl_GNOME_DirectoryFilter_getEventSource (PortableServer_Servant servant,
 
 static void
 check_uri_async_cb (GnomeAsyncContext *async_ctx, GnomeAsyncHandle *async_handle,
-		    GnomeAsyncType async_type, GObject *object,
-		    const gchar *uri, const gchar *error, gboolean success, gpointer user_data)
+		    GnomeAsyncType async_type, GObject *object, const gchar *uri,
+		    gboolean completed, gboolean success, const gchar *error,
+		    const BonoboArg *result, gpointer user_data)
 {
+    GnomeDirectoryFilter *filter = GNOME_DIRECTORY_FILTER (object);
+    GNOME_DirectoryFilter_Event *event;
+    CORBA_any *any;
+
     g_message (G_STRLOC);
+
+    event = GNOME_DirectoryFilter_Event__alloc ();
+    event->uri = CORBA_string_dup (uri);
+    event->success = success;
+    CORBA_any__copy (&event->result, result);
+    CORBA_any__copy (&event->user_data, (CORBA_any *) user_data);
+
+    any = CORBA_any__alloc ();
+    any->_type = TC_GNOME_DirectoryFilter_Event;
+    any->_value = event;
+    any->_release = TRUE;
+
+    bonobo_event_source_notify_listeners_full (filter->_priv->event_source,
+					       "GNOME/DirectoryFilter",
+					       "async", "check_uri",
+					       any, NULL);
+
+    CORBA_free (any);
 }
 
 static void
 impl_GNOME_DirectoryFilter_checkURI (PortableServer_Servant servant,
-				     const CORBA_char * uri, CORBA_Environment * ev)
+				     const CORBA_char * uri, const CORBA_boolean directory_ok,
+				     const CORBA_any * user_data, CORBA_Environment * ev)
 {
     GnomeDirectoryFilter *filter = GNOME_DIRECTORY_FILTER (bonobo_object_from_servant (servant));
     GnomeAsyncHandle *async_handle;
+    CORBA_any *any;
+
+    any = CORBA_any__alloc ();
+    CORBA_any__copy (any, user_data);
 
     async_handle = gnome_async_context_get (filter->_priv->async_ctx, 0, check_uri_async_cb,
-					    G_OBJECT (filter), NULL, NULL, NULL);
+					    G_OBJECT (filter), NULL, any, (GDestroyNotify) CORBA_free);
 
-    g_signal_emit (G_OBJECT (filter),
-		   gnome_directory_filter_signals [CHECK_URI_SIGNAL], 0,
-		   uri, async_handle);
+    g_signal_emit (G_OBJECT (filter), gnome_directory_filter_signals [CHECK_URI_SIGNAL], 0,
+		   uri, directory_ok, async_handle);
 }
 
 static void
-impl_GNOME_DirectoryFilter_scanDirectory (PortableServer_Servant servant,
-					  const CORBA_char * directory,
-					  CORBA_Environment * ev)
+scan_directory_async_cb (GnomeAsyncContext *async_ctx, GnomeAsyncHandle *async_handle,
+			 GnomeAsyncType async_type, GObject *object, const gchar *uri,
+			 gboolean completed, gboolean success, const gchar *error,
+			 const BonoboArg *result, gpointer user_data)
 {
+    GnomeDirectoryFilter *filter = GNOME_DIRECTORY_FILTER (object);
+    GNOME_DirectoryFilter_Event *event;
+    CORBA_any *arg;
+
+    g_message (G_STRLOC ": %d - %d - `%s'", completed, success, uri);
+
+    event = GNOME_DirectoryFilter_Event__alloc ();
+    event->uri = CORBA_string_dup (uri);
+    event->completed = completed;
+    event->success = success;
+    CORBA_any__copy (&event->result, result);
+    CORBA_any__copy (&event->user_data, (CORBA_any *) user_data);
+
+    arg = CORBA_any__alloc ();
+    arg->_type = TC_GNOME_DirectoryFilter_Event;
+    arg->_value = event;
+    arg->_release = TRUE;
+
+    bonobo_event_source_notify_listeners_full (filter->_priv->event_source,
+					       "GNOME/DirectoryFilter",
+					       "async", "scan_directory",
+					       arg, NULL);
+
+    CORBA_free (arg);
 }
 
 static void
-gnome_directory_filter_check_uri (GnomeDirectoryFilter *filter, const gchar *uri,
-				  GnomeAsyncHandle *async_handle)
+impl_GNOME_DirectoryFilter_scanDirectory (PortableServer_Servant servant,
+					  const CORBA_char * directory,
+					  const CORBA_any * user_data,
+					  CORBA_Environment * ev)
 {
-    g_message (G_STRLOC ": `%s'", uri);
+    GnomeDirectoryFilter *filter = GNOME_DIRECTORY_FILTER (bonobo_object_from_servant (servant));
+    GnomeAsyncHandle *async_handle;
+    CORBA_any *any;
 
-    gnome_async_handle_completed (async_handle, FALSE);
+    any = CORBA_any__alloc ();
+    CORBA_any__copy (any, user_data);
+
+    async_handle = gnome_async_context_get (filter->_priv->async_ctx, 0, scan_directory_async_cb,
+					    G_OBJECT (filter), NULL, any, (GDestroyNotify) CORBA_free);
+
+    g_signal_emit (G_OBJECT (filter), gnome_directory_filter_signals [SCAN_DIRECTORY_SIGNAL], 0,
+		   directory, async_handle);
 }
 
 static void
@@ -116,22 +179,22 @@ gnome_directory_filter_class_init (GnomeDirectoryFilterClass *klass)
 
     gnome_directory_filter_signals [CHECK_URI_SIGNAL] =
 	g_signal_newc ("check_uri",
-		       G_TYPE_FROM_CLASS (object_class),
+		       G_TYPE_FROM_CLASS (klass),
 		       G_SIGNAL_RUN_LAST,
 		       G_STRUCT_OFFSET (GnomeDirectoryFilterClass,
 					check_uri),
 		       NULL, NULL,
-		       gnome_marshal_VOID__STRING_BOXED,
-		       G_TYPE_NONE, 2,
-		       G_TYPE_STRING,
+		       gnome_marshal_VOID__STRING_BOOLEAN_BOXED,
+		       G_TYPE_NONE, 3,
+		       G_TYPE_STRING, G_TYPE_BOOLEAN,
 		       GNOME_TYPE_ASYNC_HANDLE);
 
     gnome_directory_filter_signals [SCAN_DIRECTORY_SIGNAL] =
 	g_signal_newc ("scan_directory",
-		       G_TYPE_FROM_CLASS (object_class),
+		       G_TYPE_FROM_CLASS (klass),
 		       G_SIGNAL_RUN_LAST,
 		       G_STRUCT_OFFSET (GnomeDirectoryFilterClass,
-					check_uri),
+					scan_directory),
 		       NULL, NULL,
 		       gnome_marshal_VOID__STRING_BOXED,
 		       G_TYPE_NONE, 2,
@@ -142,8 +205,6 @@ gnome_directory_filter_class_init (GnomeDirectoryFilterClass *klass)
     epv->checkURI = impl_GNOME_DirectoryFilter_checkURI;
     epv->scanDirectory = impl_GNOME_DirectoryFilter_scanDirectory;
 
-    klass->check_uri = gnome_directory_filter_check_uri;
-
     object_class->finalize = gnome_directory_filter_finalize;
 }
 
@@ -151,6 +212,9 @@ static void
 gnome_directory_filter_init (GnomeDirectoryFilter *filter)
 {
     filter->_priv = g_new0 (GnomeDirectoryFilterPrivate, 1);
+
+    filter->_priv->event_source = bonobo_event_source_new ();
+    filter->_priv->async_ctx = gnome_async_context_new ();
 }
 
 static void
@@ -177,9 +241,6 @@ gnome_directory_filter_new (void)
 
     filter = g_object_new (gnome_directory_filter_get_type (), NULL);
 
-    filter->_priv->event_source = bonobo_event_source_new ();
-    filter->_priv->async_ctx = gnome_async_context_new ();
-
     return filter;
 }
 
diff --git a/libgnome/gnome-directory-filter.h b/libgnome/gnome-directory-filter.h
index 3f47f46..ba6c451 100644
--- a/libgnome/gnome-directory-filter.h
+++ b/libgnome/gnome-directory-filter.h
@@ -60,6 +60,7 @@ struct _GnomeDirectoryFilterClass {
 
     void     (*check_uri)             (GnomeDirectoryFilter     *filter,
                                        const gchar              *uri,
+				       gboolean                  directory_ok,
                                        GnomeAsyncHandle         *async_handle);
 
     void     (*scan_directory)        (GnomeDirectoryFilter     *filter,
diff --git a/libgnome/gnome-file-selector.c b/libgnome/gnome-file-selector.c
index 11e3181..0a232a4 100644
--- a/libgnome/gnome-file-selector.c
+++ b/libgnome/gnome-file-selector.c
@@ -33,6 +33,8 @@
 
 #include <stdio.h>
 #include <string.h>
+#include <gobject/gboxed.h>
+#include <gobject/gvaluearray.h>
 #include <gobject/gvaluetypes.h>
 #include <libgnome/gnome-i18n.h>
 #include <libgnome/gnome-file-selector.h>
@@ -40,10 +42,10 @@
 
 #include <libgnomevfs/gnome-vfs.h>
 
-#undef DEBUG_ASYNC_STUFF
+#define DEBUG_ASYNC_STUFF
 
-#define PARENT_TYPE gnome_selector_get_type()
-GnomeSelectorClass *gnome_file_selector_parent_class = NULL;
+#define PARENT_TYPE gnome_directory_filter_get_type()
+GnomeDirectoryFilterClass *gnome_file_selector_parent_class = NULL;
 
 typedef struct _GnomeFileAsyncData      GnomeFileAsyncData;
 typedef struct _GnomeFileSelectorSubAsyncData   GnomeFileSelectorSubAsyncData;
@@ -54,8 +56,11 @@ struct _GnomeFileAsyncData {
     GnomeAsyncType type;
     GnomeFileSelector *fselector;
 
+    gboolean directory_ok;
+
     GSList *async_ops;
     gboolean completed;
+    gboolean success;
 
     GnomeVFSAsyncHandle *vfs_handle;
     GnomeVFSURI *uri;
@@ -80,51 +85,31 @@ static void gnome_file_selector_class_init  (GnomeFileSelectorClass *class);
 static void gnome_file_selector_init        (GnomeFileSelector      *fselector);
 static void gnome_file_selector_finalize    (GObject                *object);
 
-static void      add_uri_handler                (GnomeSelector            *selector,
+static void      check_uri_handler              (GnomeDirectoryFilter     *filter,
                                                  const gchar              *uri,
-                                                 gint                      position,
-						 guint                     list_id,
-						 GnomeAsyncHandle *async_handle);
-
-static void      add_directory_handler          (GnomeSelector            *selector,
-						 const gchar              *uri,
-						 gint                      position,
-						 guint                     list_id,
+						 gboolean                  directory_ok,
 						 GnomeAsyncHandle         *async_handle);
 
-static void      add_uri_list_handler           (GnomeSelector            *selector,
-						 GSList                   *list,
-						 gint                      position,
-						 guint                     list_id,
-						 GnomeAsyncHandle *async_handle);
-
-static void      check_uri_handler              (GnomeSelector            *selector,
-                                                 const gchar              *filename,
-						 GnomeAsyncHandle *async_handle);
-
-static void      activate_entry_handler         (GnomeSelector   *selector);
+static void      scan_directory_handler         (GnomeDirectoryFilter     *filter,
+                                                 const gchar              *uri,
+						 GnomeAsyncHandle         *async_handle);
 
 
 static void
 gnome_file_selector_class_init (GnomeFileSelectorClass *class)
 {
-    GnomeSelectorClass *selector_class;
     GObjectClass *object_class;
+    GnomeDirectoryFilterClass *filter_class;
 
     gnome_file_selector_parent_class = g_type_class_peek_parent (class);
 
-    selector_class = (GnomeSelectorClass *) class;
     object_class = (GObjectClass *) class;
+    filter_class = (GnomeDirectoryFilterClass *) class;
 
     object_class->finalize = gnome_file_selector_finalize;
 
-    selector_class->add_uri = add_uri_handler;
-
-    selector_class->add_uri_list = add_uri_list_handler; 
-
-    selector_class->activate_entry = activate_entry_handler;
-
-    selector_class->check_uri = check_uri_handler;
+    filter_class->check_uri = check_uri_handler;
+    filter_class->scan_directory = scan_directory_handler;
 }
 
 static void
@@ -147,336 +132,9 @@ free_the_async_data (gpointer data)
 }
 
 static void
-add_uri_async_done_cb (GnomeFileAsyncData *async_data)
-{
-    GnomeAsyncHandle *async_handle;
-    gchar *path;
-
-    g_return_if_fail (async_data != NULL);
-
-    /* When we finish our async reading, we set async_data->completed -
-     * but we need to wait until all our async operations are completed as
-     * well.
-     */
-
-#ifdef DEBUG_ASYNC_STUFF
-    g_message (G_STRLOC ": %p - %d - %p", async_data, async_data->completed,
-	       async_data->async_ops);
-#endif
-
-    if (!async_data->completed || async_data->async_ops != NULL)
-	return;
-
-    async_handle = async_data->async_handle;
-
-    path = gnome_vfs_uri_to_string (async_data->uri,
-				    GNOME_VFS_URI_HIDE_NONE);
-    if (gnome_file_selector_parent_class->add_uri)
-	gnome_file_selector_parent_class->add_uri
-	    (GNOME_SELECTOR (async_data->fselector), path,
-	     async_data->position, async_data->list_id,
-	     async_handle);
-
-#ifdef DEBUG_ASYNC_STUFF
-    g_message (G_STRLOC ": %p - async reading completed (%s).",
-	       async_data->fselector, path);
-#endif
-
-    g_free (path);
-
-    gnome_async_handle_remove (async_handle, async_data);
-}
-
-static void
-add_uri_async_add_cb (GnomeAsyncContext *context,
-		      GnomeAsyncHandle *async_handle,
-		      GnomeAsyncType async_type,
-		      GObject *object,
-		      const gchar *uri, const gchar *error,
-		      gboolean success, gpointer user_data)
-{
-    GnomeFileSelectorSubAsyncData *sub_async_data = user_data;
-    GnomeFileAsyncData *async_data;
-
-    g_return_if_fail (sub_async_data != NULL);
-    g_assert (sub_async_data->async_data != NULL);
-    async_data = sub_async_data->async_data;
-
-    /* This operation is completed, remove it from the list and call
-     * add_uri_async_done_cb() - this function will check whether
-     * this was the last one and the uri checking is done as well.
-     */
-
-    async_data->async_ops = g_slist_remove (async_data->async_ops,
-					    sub_async_data);
-
-#ifdef DEBUG_ASYNC_STUFF
-    g_message (G_STRLOC ": %p - %p - `%s'", async_data->async_ops,
-	       sub_async_data, uri);
-#endif
-
-    add_uri_async_done_cb (async_data);
-}
-
-
-static void
-add_uri_async_cb (GnomeVFSAsyncHandle *handle, GList *results,
-		  gpointer callback_data)
-{
-    GnomeFileAsyncData *async_data;
-    GnomeFileSelector *fselector;
-    GList *list;
-
-    g_return_if_fail (callback_data != NULL);
-
-    async_data = callback_data;
-    g_assert (async_data->vfs_handle == handle);
-    g_assert (GNOME_IS_FILE_SELECTOR (async_data->fselector));
-    g_assert (async_data->type == GNOME_ASYNC_TYPE_ADD_URI);
-
-    fselector = GNOME_FILE_SELECTOR (async_data->fselector);
-
-    for (list = results; list; list = list->next) {
-	GnomeVFSGetFileInfoResult *file = list->data;
-	gchar *uri;
-
-	/* better assert this than risking a crash. */
-	g_assert (file != NULL);
-
-	uri = gnome_vfs_uri_to_string (file->uri, GNOME_VFS_URI_HIDE_NONE);
-
-	if (file->result != GNOME_VFS_OK) {
-	    g_message (G_STRLOC ": `%s': %s", uri,
-		       gnome_vfs_result_to_string (file->result));
-	    g_free (uri);
-	    continue;
-	}
-
-	if (file->file_info->type == GNOME_VFS_FILE_TYPE_DIRECTORY) {
-	    GnomeFileSelectorSubAsyncData *sub_async_data;
-	    GnomeAsyncContext *async_ctx;
-
-	    sub_async_data = g_new0 (GnomeFileSelectorSubAsyncData, 1);
-	    sub_async_data->async_data = async_data;
-
-	    async_data->async_ops = g_slist_prepend
-		(async_data->async_ops, sub_async_data);
-
-	    async_ctx = gnome_selector_get_async_context (GNOME_SELECTOR (fselector));
-	    sub_async_data->async_handle = gnome_async_context_get (async_ctx,
-								    GNOME_ASYNC_TYPE_ADD_URI,
-								    add_uri_async_add_cb,
-								    G_OBJECT (fselector), uri,
-								    sub_async_data, NULL);
-
-	    add_directory_handler (GNOME_SELECTOR (fselector), uri, async_data->position,
-				   async_data->list_id, sub_async_data->async_handle);
-
-	    g_free (uri);
-	    continue;
-	}
-
-	if (fselector->_priv->filter &&
-	    !gnome_vfs_directory_filter_apply (fselector->_priv->filter,
-					       file->file_info)) {
-
-	    g_message (G_STRLOC ": dropped by directory filter");
-
-	    g_free (uri);
-	    continue;
-	}
-
-	if (file->file_info->type == GNOME_VFS_FILE_TYPE_REGULAR) {
-	    GnomeFileSelectorSubAsyncData *sub_async_data;
-
-	    sub_async_data = g_new0 (GnomeFileSelectorSubAsyncData, 1);
-	    sub_async_data->async_data = async_data;
-
-	    async_data->async_ops = g_slist_prepend
-		(async_data->async_ops, sub_async_data);
-
-	    gnome_selector_add_uri (GNOME_SELECTOR (fselector),
-				    &sub_async_data->async_handle, uri,
-				    async_data->position, GNOME_SELECTOR_ACTIVE_LIST,
-				    add_uri_async_add_cb, sub_async_data);
-
-	    g_free (uri);
-	    continue;
-	}
-
-	g_free (uri);
-    }
-
-    /* Completed, but we may have async operations running. We set
-     * async_data->completed here to inform add_uri_async_done_cb()
-     * that we're done with our async operation.
-     */
-    async_data->completed = TRUE;
-    add_uri_async_done_cb (async_data);
-}
-
-void
-add_uri_handler (GnomeSelector *selector, const gchar *uri, gint position,
-		 guint list_id, GnomeAsyncHandle *async_handle)
-{
-    GnomeFileSelector *fselector;
-    GnomeFileAsyncData *async_data;
-    GnomeVFSURI *vfs_uri;
-    GList fake_list;
-
-    g_message (G_STRLOC ": `%s' - %d - %d", uri, position, list_id);
-
-    g_return_if_fail (selector != NULL);
-    g_return_if_fail (GNOME_IS_FILE_SELECTOR (selector));
-    g_return_if_fail (position >= -1);
-    g_return_if_fail (uri != NULL);
-    g_return_if_fail (async_handle != NULL);
-
-    fselector = GNOME_FILE_SELECTOR (selector);
-
-    if (list_id != GNOME_SELECTOR_URI_LIST) {
-	if (gnome_file_selector_parent_class->add_uri)
-	    gnome_file_selector_parent_class->add_uri (selector, uri, position,
-						       list_id, async_handle);
-
-	gnome_async_handle_completed (async_handle, TRUE);
-	return;
-    }
-
-    vfs_uri = gnome_vfs_uri_new (uri);
-    if (!vfs_uri) {
-	gnome_async_handle_completed (async_handle, FALSE);
-	return;
-    }
-
-    async_data = g_new0 (GnomeFileAsyncData, 1);
-    async_data->async_handle = async_handle;
-    async_data->type = GNOME_ASYNC_TYPE_ADD_URI;
-    async_data->fselector = fselector;
-    async_data->uri = vfs_uri;
-    async_data->position = position;
-    async_data->list_id = list_id;
-
-    gnome_vfs_uri_ref (async_data->uri);
-    g_object_ref (G_OBJECT (async_data->fselector));
-
-    fake_list.data = async_data->uri;
-    fake_list.prev = NULL;
-    fake_list.next = NULL;
-
-    gnome_async_handle_add (async_handle, async_data, free_the_async_data);
-
-    gnome_vfs_async_get_file_info (&async_data->vfs_handle, &fake_list,
-				   fselector->_priv->file_info_options,
-				   add_uri_async_cb, async_data);
-
-    gnome_vfs_uri_unref (fake_list.data);
-}
-
-static void
-add_uri_list_async_done_cb (GnomeFileAsyncData *async_data)
-{
-    GnomeAsyncHandle *async_handle;
-
-    g_return_if_fail (async_data != NULL);
-
-    /* When we finish our directory reading, we set async_data->completed -
-     * but we need to wait until all our async operations are completed as
-     * well.
-     */
-
-    if (!async_data->completed || async_data->async_ops != NULL)
-	return;
-
-    async_handle = async_data->async_handle;
-
-    if (gnome_file_selector_parent_class->add_uri_list)
-	gnome_file_selector_parent_class->add_uri_list
-	    (GNOME_SELECTOR (async_data->fselector),
-	     async_data->uri_list, async_data->position,
-	     async_data->list_id, async_handle);
-
-    gnome_async_handle_remove (async_handle, async_data);
-}
-
-static void
-add_uri_list_async_cb (GnomeAsyncContext *context,
-		       GnomeAsyncHandle *async_handle,
-		       GnomeAsyncType async_type,
-		       GObject *object,
-		       const gchar *uri, const gchar *error,
-		       gboolean success, gpointer user_data)
-{
-    GnomeFileSelectorSubAsyncData *sub_async_data = user_data;
-    GnomeFileAsyncData *async_data;
-
-    g_return_if_fail (sub_async_data != NULL);
-    g_assert (sub_async_data->async_data != NULL);
-    async_data = sub_async_data->async_data;
-
-    /* This operation is completed, remove it from the list and call
-     * add_uri_list_async_done_cb() - this function will check whether
-     * this was the last one and the directory reading is done as well.
-     */
-
-    async_data->async_ops = g_slist_remove (async_data->async_ops,
-					    sub_async_data);
-
-    add_uri_list_async_done_cb (async_data);
-}
-
-static void
-add_uri_list_handler (GnomeSelector *selector, GSList *list,
-		      gint position, guint list_id,
-		      GnomeAsyncHandle *async_handle)
-{
-    GnomeFileAsyncData *async_data;
-    GnomeFileSelector *fselector;
-    GSList *c;
-
-    g_return_if_fail (selector != NULL);
-    g_return_if_fail (GNOME_IS_FILE_SELECTOR (selector));
-    g_return_if_fail (async_handle != NULL);
-
-    fselector = GNOME_FILE_SELECTOR (selector);
-
-    async_data = g_new0 (GnomeFileAsyncData, 1);
-    async_data->async_handle = async_handle;
-    async_data->type = GNOME_ASYNC_TYPE_ADD_URI_LIST;
-    async_data->fselector = fselector;
-    async_data->position = position;
-    async_data->uri_list = _gnome_selector_deep_copy_slist (list);
-    async_data->list_id = list_id;
-
-    g_object_ref (G_OBJECT (async_data->fselector));
-
-    gnome_async_handle_add (async_handle, async_data, free_the_async_data);
-
-    for (c = list; c; c = c->next) {
-	GnomeFileSelectorSubAsyncData *sub_async_data;
-
-	sub_async_data = g_new0 (GnomeFileSelectorSubAsyncData, 1);
-	sub_async_data->async_data = async_data;
-
-	async_data->async_ops = g_slist_prepend
-	    (async_data->async_ops, sub_async_data);
-
-	gnome_selector_add_uri (GNOME_SELECTOR (fselector),
-				&sub_async_data->async_handle,
-				c->data, position, list_id,
-				add_uri_list_async_cb,
-				sub_async_data);
-    }
-
-    async_data->completed = TRUE;
-    add_uri_list_async_done_cb (async_data);
-}
-
-static void
 add_directory_async_done_cb (GnomeFileAsyncData *async_data)
 {
     GnomeAsyncHandle *async_handle;
-    gchar *path;
 
     g_return_if_fail (async_data != NULL);
 
@@ -490,46 +148,11 @@ add_directory_async_done_cb (GnomeFileAsyncData *async_data)
 
     async_handle = async_data->async_handle;
 
-    path = gnome_vfs_uri_to_string (async_data->uri,
-				    GNOME_VFS_URI_HIDE_NONE);
-    if (gnome_file_selector_parent_class->add_uri)
-	gnome_file_selector_parent_class->add_uri
-	    (GNOME_SELECTOR (async_data->fselector), path,
-	     async_data->position, async_data->list_id,
-	     async_handle);
-
-    g_free (path);
-
+    gnome_async_handle_completed (async_handle, async_data->success);
     gnome_async_handle_remove (async_handle, async_data);
 }
 
 static void
-add_directory_async_file_cb (GnomeAsyncContext *context,
-			     GnomeAsyncHandle *async_handle,
-			     GnomeAsyncType async_type,
-			     GObject *object,
-			     const gchar *uri, const gchar *error,
-			     gboolean success, gpointer user_data)
-{
-    GnomeFileSelectorSubAsyncData *sub_async_data = user_data;
-    GnomeFileAsyncData *async_data;
-
-    g_return_if_fail (sub_async_data != NULL);
-    g_assert (sub_async_data->async_data != NULL);
-    async_data = sub_async_data->async_data;
-
-    /* This operation is completed, remove it from the list and call
-     * add_directory_async_done_cb() - this function will check whether
-     * this was the last one and the directory reading is done as well.
-     */
-
-    async_data->async_ops = g_slist_remove (async_data->async_ops,
-					    sub_async_data);
-
-    add_directory_async_done_cb (async_data);
-}
-
-static void
 add_directory_async_cb (GnomeVFSAsyncHandle *handle, GnomeVFSResult result,
 			GList *list, guint entries_read, gpointer callback_data)
 {
@@ -545,12 +168,20 @@ add_directory_async_cb (GnomeVFSAsyncHandle *handle, GnomeVFSResult result,
 
     fselector = GNOME_FILE_SELECTOR (async_data->fselector);
 
+    g_message (G_STRLOC ": %d (%s) - %p - %d", result,
+	       gnome_vfs_result_to_string (result), list, entries_read);
+
     if (list != NULL) {
+	BonoboArg *arg;
+	GNOME_stringlist *stringlist;
 	GList *c;
 
+	stringlist = GNOME_stringlist__alloc ();
+	stringlist->_maximum = g_list_length (list);
+	stringlist->_buffer = CORBA_sequence_CORBA_string_allocbuf (stringlist->_maximum);
+
 	for (c = list; c; c = c->next) {
 	    GnomeVFSFileInfo *info = c->data;
-	    GnomeFileSelectorSubAsyncData *sub_async_data;
 	    GnomeVFSURI *uri;
 	    gchar *text;
 
@@ -563,58 +194,69 @@ add_directory_async_cb (GnomeVFSAsyncHandle *handle, GnomeVFSResult result,
 	    uri = gnome_vfs_uri_append_file_name (async_data->uri, info->name);
 	    text = gnome_vfs_uri_to_string (uri, GNOME_VFS_URI_HIDE_NONE);
 
-	    /* We keep a list of currently running async operations in
-	     * async_data->async_ops. This is that add_directory_async_done_cb()
-	     * knows whether we're really done or whether we still need to wait.
-	     */
-
-	    sub_async_data = g_new0 (GnomeFileSelectorSubAsyncData, 1);
-	    sub_async_data->async_data = async_data;
-
-	    async_data->async_ops = g_slist_prepend
-		(async_data->async_ops, sub_async_data);
-
-	    gnome_selector_add_uri (GNOME_SELECTOR (fselector),
-				    &sub_async_data->async_handle,
-				    text, async_data->position,
-				    GNOME_SELECTOR_ACTIVE_LIST,
-				    add_directory_async_file_cb,
-				    sub_async_data);
+	    stringlist->_buffer [stringlist->_length++] = CORBA_string_dup (text);
 
 	    gnome_vfs_uri_unref (uri);
 	    g_free (text);
 	}
+
+	arg = CORBA_any__alloc ();
+	arg->_type = TC_GNOME_stringlist;
+	arg->_release = TRUE;
+	arg->_value = stringlist;
+
+	gnome_async_handle_call_async_func (async_data->async_handle, arg);
+
+	CORBA_free (arg);
     }
 
-    if (result == GNOME_VFS_ERROR_EOF) {
+    if (result == GNOME_VFS_ERROR_NOT_A_DIRECTORY) {
+	BonoboArg *arg;
+	gchar *text;
+
+	text = gnome_vfs_uri_to_string (async_data->uri, GNOME_VFS_URI_HIDE_NONE);
+
+	arg = bonobo_arg_new (TC_string);
+	BONOBO_ARG_SET_STRING (arg, text);
+
+	gnome_async_handle_set_result (async_data->async_handle, arg);
+
+	bonobo_arg_release (arg);
+	g_free (text);
+    }
+
+    if (result != GNOME_VFS_OK) {
 	/* Completed, but we may have async operations running. We set
 	 * async_data->completed here to inform add_directory_async_done_cb()
 	 * that we're done with our directory reading.
 	 */
+	if ((result == GNOME_VFS_ERROR_EOF) || (result == GNOME_VFS_ERROR_NOT_A_DIRECTORY))
+	    async_data->success = TRUE;
+	else
+	    async_data->success = FALSE;
 	async_data->completed = TRUE;
 	add_directory_async_done_cb (async_data);
+	return;
     }
 }
 
 static void
-add_directory_handler (GnomeSelector *selector, const gchar *uri,
-		       gint position, guint list_id, GnomeAsyncHandle *async_handle)
+scan_directory_handler (GnomeDirectoryFilter *filter, const gchar *uri, GnomeAsyncHandle *async_handle)
 {
     GnomeFileSelector *fselector;
     GnomeFileAsyncData *async_data;
     GnomeVFSURI *vfs_uri;
 
-    g_return_if_fail (selector != NULL);
-    g_return_if_fail (GNOME_IS_FILE_SELECTOR (selector));
-    g_return_if_fail (position >= -1);
+    g_return_if_fail (filter != NULL);
+    g_return_if_fail (GNOME_IS_FILE_SELECTOR (filter));
     g_return_if_fail (uri != NULL);
     g_return_if_fail (async_handle != NULL);
 
-    fselector = GNOME_FILE_SELECTOR (selector);
+    fselector = GNOME_FILE_SELECTOR (filter);
 
 #ifdef DEBUG_ASYNC_STUFF
     g_message (G_STRLOC ": %p - starting async reading (%s).",
-	       selector, uri);
+	       fselector, uri);
 #endif
 
     vfs_uri = gnome_vfs_uri_new (uri);
@@ -623,8 +265,6 @@ add_directory_handler (GnomeSelector *selector, const gchar *uri,
     async_data->type = GNOME_ASYNC_TYPE_ADD_URI;
     async_data->fselector = fselector;
     async_data->uri = vfs_uri;
-    async_data->position = position;
-    async_data->list_id = list_id;
     async_data->async_handle = async_handle;
 
     gnome_vfs_uri_ref (async_data->uri);
@@ -679,29 +319,6 @@ gnome_file_selector_clear_filter (GnomeFileSelector *fselector)
 }
 
 static void
-activate_entry_handler (GnomeSelector *selector)
-{
-    GnomeFileSelector *fselector;
-#ifdef FIXME
-    gchar *text;
-#endif
-
-    g_return_if_fail (selector != NULL);
-    g_return_if_fail (GNOME_IS_FILE_SELECTOR (selector));
-
-    fselector = GNOME_FILE_SELECTOR (selector);
-
-    if (gnome_file_selector_parent_class->activate_entry)
-	gnome_file_selector_parent_class->activate_entry (selector);
-
-#ifdef FIXME
-    text = gnome_selector_get_entry_text (selector);
-    gnome_selector_add_uri (selector, NULL, text, 0, FALSE, NULL, NULL);
-    g_free (text);
-#endif
-}
-
-static void
 gnome_file_selector_init (GnomeFileSelector *fselector)
 {
     fselector->_priv = g_new0 (GnomeFileSelectorPrivate, 1);
@@ -734,7 +351,15 @@ check_uri_async_cb (GnomeVFSAsyncHandle *handle, GList *results, gpointer callba
 
 	gnome_async_handle_remove (async_handle, async_data);
 
-	if (file->result != GNOME_VFS_OK) {
+	if ((file->result != GNOME_VFS_OK) ||
+	    ((file->file_info->type != GNOME_VFS_FILE_TYPE_REGULAR) &&
+	     (file->file_info->type != GNOME_VFS_FILE_TYPE_DIRECTORY))) {
+	    gnome_async_handle_completed (async_handle, FALSE);
+	    return;
+	}
+
+	if ((file->file_info->type == GNOME_VFS_FILE_TYPE_DIRECTORY) &&
+	    !async_data->directory_ok) {
 	    gnome_async_handle_completed (async_handle, FALSE);
 	    return;
 	}
@@ -752,25 +377,26 @@ check_uri_async_cb (GnomeVFSAsyncHandle *handle, GList *results, gpointer callba
 }
 
 static void
-check_uri_handler (GnomeSelector *selector, const gchar *uri,
-		   GnomeAsyncHandle *async_handle)
+check_uri_handler (GnomeDirectoryFilter *filter, const gchar *uri,
+		   gboolean directory_ok, GnomeAsyncHandle *async_handle)
 {
     GnomeFileAsyncData *async_data;
     GnomeFileSelector *fselector;
     GList fake_list;
 
-    g_return_if_fail (selector != NULL);
-    g_return_if_fail (GNOME_IS_FILE_SELECTOR (selector));
+    g_return_if_fail (filter != NULL);
+    g_return_if_fail (GNOME_IS_FILE_SELECTOR (filter));
     g_return_if_fail (uri != NULL);
     g_return_if_fail (async_handle != NULL);
 
-    fselector = GNOME_FILE_SELECTOR (selector);
+    fselector = GNOME_FILE_SELECTOR (filter);
 
     async_data = g_new0 (GnomeFileAsyncData, 1);
     async_data->async_handle = async_handle;
     async_data->type = GNOME_ASYNC_TYPE_CHECK_URI;
     async_data->fselector = fselector;
     async_data->uri = gnome_vfs_uri_new (uri);
+    async_data->directory_ok = directory_ok;
 
     gnome_vfs_uri_ref (async_data->uri);
     g_object_ref (G_OBJECT (async_data->fselector));
diff --git a/libgnome/gnome-file-selector.h b/libgnome/gnome-file-selector.h
index b73b324..dacd7fd 100644
--- a/libgnome/gnome-file-selector.h
+++ b/libgnome/gnome-file-selector.h
@@ -33,7 +33,7 @@
 #define GNOME_FILE_SELECTOR_H
 
 
-#include <libgnome/gnome-selector.h>
+#include <libgnome/gnome-directory-filter.h>
 
 #include <libgnomevfs/gnome-vfs-types.h>
 #include <libgnomevfs/gnome-vfs-directory-filter.h>
@@ -54,14 +54,14 @@ typedef struct _GnomeFileSelectorPrivate  GnomeFileSelectorPrivate;
 typedef struct _GnomeFileSelectorClass    GnomeFileSelectorClass;
 
 struct _GnomeFileSelector {
-    GnomeSelector selector;
+    GnomeDirectoryFilter filter;
         
     /*< private >*/
     GnomeFileSelectorPrivate *_priv;
 };
 
 struct _GnomeFileSelectorClass {
-    GnomeSelectorClass parent_class;
+    GnomeDirectoryFilterClass parent_class;
 };
 
 
diff --git a/libgnome/gnome-marshal.list b/libgnome/gnome-marshal.list
index 4c8a5df..159eca4 100644
--- a/libgnome/gnome-marshal.list
+++ b/libgnome/gnome-marshal.list
@@ -7,6 +7,7 @@ VOID:STRING,INT,UINT,BOXED
 VOID:POINTER,INT,BOOLEAN,BOXED
 VOID:UINT,UINT,UINT,UINT
 VOID:STRING,BOXED
+VOID:STRING,BOOLEAN,BOXED
 INT:VOID
 ENUM:VOID
 BOOLEAN:OBJECT



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]