[bijiben] manager: rework how the manager is constructed



commit 020069220466ecb718fb18e00f3c4f0c31cc48da
Author: Cosimo Cecchi <cosimoc gnome org>
Date:   Wed Jul 1 00:16:13 2015 +0200

    manager: rework how the manager is constructed
    
    We want to use the manager from the shell search provider, to be able to
    load note thumbnails now that we don't save them to disk anymore.
    Split it in sync and async constructors using GInitable, and have the
    main application still use the async constructor. The search provider
    wants all the information loaded upfront so it will use the synchronous
    constructor.
    Along the way, code was ported to use g_icon_serialize() and many leaks
    were fixed.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=751683

 src/Makefile.am                     |    1 +
 src/bijiben-shell-search-provider.c |  117 ++++++------
 src/bjb-bijiben.c                   |  134 +++-----------
 src/bjb-controller.c                |    3 +-
 src/libbiji/biji-manager.c          |  375 ++++++++++++++++++++---------------
 src/libbiji/biji-manager.h          |   19 +-
 6 files changed, 306 insertions(+), 343 deletions(-)
---
diff --git a/src/Makefile.am b/src/Makefile.am
index e8e1811..d0214a4 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -109,6 +109,7 @@ bijiben_shell_search_provider_SOURCES =     \
        $(NULL)
 
 nodist_bijiben_shell_search_provider_SOURCES =         \
+       $(bijiben_built_sources) \
        $(dbus_shell_search_provider_built_sources)     \
        $(NULL)
 
diff --git a/src/bijiben-shell-search-provider.c b/src/bijiben-shell-search-provider.c
index dd1a2b7..4ef4c06 100644
--- a/src/bijiben-shell-search-provider.c
+++ b/src/bijiben-shell-search-provider.c
@@ -50,6 +50,7 @@
 typedef struct {
   GApplication parent;
 
+  BijiManager *manager;
   BijibenShellSearchProvider2 *skeleton;
   TrackerSparqlConnection *connection;
 
@@ -197,64 +198,49 @@ handle_get_subsearch_result_set (BijibenShellSearchProvider2  *skeleton,
   g_application_release (user_data);
 }
 
-static gchar *
-get_note_icon (const gchar *note__nie_url)
+static GVariant *
+get_note_icon (BijibenShellSearchProviderApp *self,
+               const gchar *note__nie_url)
 {
-  gchar **split;
-  gchar *path, *basename, *hash;
-  GFile *file;
+  GVariant *variant;
   GIcon *gicon;
+  gint scale_factor;
+  GdkScreen *screen;
+  BijiItem *item;
 
+  screen = gdk_screen_get_default ();
+  scale_factor = gdk_screen_get_monitor_scale_factor (screen,
+                                                      gdk_screen_get_primary_monitor (screen));
 
-  /*
-   *      FIXME - below is ok for local notes only
-   * 
-   * URL  :  DATA_DIR/bijiben/bf74f3b4-9363-44a1-852a-5746f3118ea7.note
-   * URL  :  davs://..../Notes/Trial.txt
-   *
-   * ICON :  CACHE_DIR/bijiben/bf74f3b4-9363-44a1-852a-5746f3118ea7.png
-   * ICON :  CACHE_DIR/bijiben/Trial.png
-   */
-  split = g_strsplit (note__nie_url, "/", 20);
-
-  basename = biji_str_mass_replace (split [g_strv_length (split)-1],
-                                    ".note",
-                                    ".png",
-                                    ".txt",
-                                    ".png",
-                                    NULL);
-
-  path = g_build_filename (g_get_user_cache_dir (),
-                           "bijiben",
-                           basename,
-                           NULL);
-
-
-
-  file = g_file_new_for_path (path);
-
-  if (g_file_query_exists (file, NULL))
-    goto out;
-
-  /* Well, else, just pick up something generic */
-  if (path)
-    g_free (path);
-  if (file)
-    g_object_unref (file);
-
-  path = g_build_filename (DATADIR, "bijiben", "icons", "hicolor",
-                           "48x48", "actions", "note.png", NULL);
-  file = g_file_new_for_path (path);
-
-out:
-  g_strfreev (split);
-  gicon = g_file_icon_new (file);
-  hash = g_icon_to_string (gicon);
-  g_free (path);
-  g_object_unref (file);
+  gicon = NULL;
+  item = biji_manager_get_item_at_path (self->manager, note__nie_url);
+  if (item != NULL)
+    {
+      /* Load the icon from the note */
+      cairo_surface_t *surface = biji_item_get_icon (item, scale_factor);
+      gicon = G_ICON (gdk_pixbuf_get_from_surface (surface, 0, 0,
+                                                   cairo_image_surface_get_width (surface),
+                                                   cairo_image_surface_get_height (surface)));
+
+      cairo_surface_destroy (surface);
+    }
+
+  if (gicon == NULL)
+    {
+      /* Fallback to generic icon */
+      char *path = g_build_filename (DATADIR, "bijiben", "icons", "hicolor",
+                                     "48x48", "actions", "note.png", NULL);
+      GFile *file = g_file_new_for_path (path);
+      gicon = g_file_icon_new (file);
+
+      g_free (path);
+      g_object_unref (file);
+    }
+
+  variant = g_icon_serialize (gicon);
   g_object_unref (gicon);
 
-  return hash;
+  return variant;
 }
 
 static void
@@ -266,6 +252,7 @@ add_single_note_meta (BijibenShellSearchProviderApp *self,
   const gchar *url;
   const gchar *result;
   TrackerSparqlCursor *cursor;
+  GVariant *icon;
 
   query = g_strdup_printf ("SELECT nie:url(<%s>) nie:title(<%s>) WHERE { }",
                            note__id, note__id);
@@ -291,8 +278,8 @@ add_single_note_meta (BijibenShellSearchProviderApp *self,
    /* ICON is currently generic icon,        *
     * TODO serialize icons in libbiji        *
     *      or deserialize note here )        */
-    result = get_note_icon (url);
-    g_variant_builder_add (results, "{sv}", "gicon", g_variant_new_string (result));
+    icon = get_note_icon (self, url);
+    g_variant_builder_add (results, "{sv}", "icon", icon);
 
     g_variant_builder_close (results);
   }
@@ -416,7 +403,8 @@ search_provider_app_dispose (GObject *obj)
 {
   BijibenShellSearchProviderApp *self = BIJIBEN_SHELL_SEARCH_PROVIDER_APP (obj);
 
-  g_object_unref (self->connection);
+  g_clear_object (&self->connection);
+  g_clear_object (&self->manager);
 
   G_OBJECT_CLASS (bijiben_shell_search_provider_app_parent_class)->dispose (obj);
 }
@@ -435,12 +423,29 @@ static void
 bijiben_shell_search_provider_app_init (BijibenShellSearchProviderApp *self)
 {
   GError *error = NULL;
+  char *storage_path;
+  GFile *storage;
+  GdkRGBA color = { 0, 0, 0, 0 };
 
   self->connection = tracker_sparql_connection_get (NULL, &error);
 
   if (error)
   {
-     g_message ("%s", error->message);
+     g_warning ("Unable to connect to Tracker: %s", error->message);
+     g_clear_error (&error);
+  }
+
+  storage_path = g_build_filename (g_get_user_data_dir (), "bijiben", NULL);
+  storage = g_file_new_for_path (storage_path);
+  g_free (storage_path);
+
+  self->manager = biji_manager_new (storage, &color, &error);
+  g_object_unref (storage);
+
+  if (error)
+  {
+     g_warning ("Unable to create BijiManager: %s", error->message);
+     g_clear_error (&error);
   }
 }
 
diff --git a/src/bjb-bijiben.c b/src/bjb-bijiben.c
index fdd993f..e035e22 100644
--- a/src/bjb-bijiben.c
+++ b/src/bjb-bijiben.c
@@ -246,105 +246,6 @@ bijiben_import_notes (Bijiben *self, gchar *uri)
                            uri);
 }
 
-
-/* Just filter on ownCloud accounts
- * TODO : settings to force activate & inactivate
- * but, up to libbiji to survey GoaObject
- */
-static void
-on_client_got (GObject *source_object,
-               GAsyncResult *res,
-               gpointer user_data)
-{
-  Bijiben *self;
-  GoaClient *client;
-  GError *error;
-  GList *accounts, *l;
-  GoaObject *object;
-  GoaAccount *account;
-  const gchar *type;
-
-  self = BIJIBEN_APPLICATION (user_data);
-  error = NULL;
-  client =  goa_client_new_finish  (res, &error);
-
-  if (error)
-  {
-     g_warning ("%s", error->message);
-     g_error_free (error);
-     return;
-  }
-
-  accounts = goa_client_get_accounts (client);
-
-  for (l=accounts; l!=NULL; l=l->next)
-  {
-    object = GOA_OBJECT (l->data);
-    account =  goa_object_get_account (object);
-
-    if (GOA_IS_ACCOUNT (account))
-    {
-      type = goa_account_get_provider_type (account);
-
-
-      /* We do not need to store any object here.
-       * account_get_id can be used to talk with libbji */
-
-      if (g_strcmp0 (type, "owncloud") ==0)
-      {
-        g_message ("Loading account %s", goa_account_get_id (account));
-        biji_manager_add_goa_object (self->priv->manager, object);
-      }
-
-      else
-      {
-        g_object_unref (object);
-      }
-    }
-  }
-
-  g_list_free (accounts);
-}
-
-
-
-
-
-/*
- * Currently bjb checks eds accounts
- * and asks libbiji about them.
- * This, in case we want a setting
- * Another way might be to let libbiji live its life
- */
-void
-on_registry_got (GObject *obj,
-                 GAsyncResult *res,
-                 gpointer user_data)
-{
-  GError *error;
-  ESourceRegistry *registry;
-  GList *list, *l;
-  Bijiben *self = BIJIBEN_APPLICATION (user_data);
-
-  error = NULL;
-  registry = e_source_registry_new_finish (res, &error);
-
-  if (error)
-  {
-    g_warning ("no registry :(, %s", error->message);
-    return;
-  }
-
-  list = e_source_registry_list_sources (registry, E_SOURCE_EXTENSION_MEMO_LIST);
-  for (l=list; l!= NULL; l=l->next)
-  {
-    biji_manager_add_e_source_extension_memo (self->priv->manager, l->data);
-  }
-
-  g_list_free_full (list, g_object_unref);
-}
-
-
 static void
 theme_changed (GtkSettings *settings)
 {
@@ -396,6 +297,27 @@ bjb_apply_style (void)
 }
 
 static void
+manager_ready_cb (GObject *source,
+                  GAsyncResult *res,
+                  gpointer user_data)
+{
+  Bijiben *self = user_data;
+  GError *error = NULL;
+
+  self->priv->manager = biji_manager_new_finish (res, &error);
+  g_application_release (G_APPLICATION (self));
+
+  if (error != NULL)
+    {
+      g_warning ("Cannot initialize BijiManager: %s\n", error->message);
+      g_clear_error (&error);
+      return;
+    }
+
+  bijiben_new_window_internal (self, NULL, NULL, NULL);
+}
+
+static void
 bijiben_startup (GApplication *application)
 {
   Bijiben        *self;
@@ -443,15 +365,8 @@ bijiben_startup (GApplication *application)
   g_object_get (self->priv->settings, "color", &default_color, NULL);
   gdk_rgba_parse (&color, default_color);
 
-  error = NULL;
-  self->priv->manager = biji_manager_new (storage, &color, &error);
-  if (error)
-    goto out;
-
-  /* Goa, e-d-s */
-  goa_client_new  (NULL, on_client_got, self); // cancellable
-  e_source_registry_new (NULL, on_registry_got, self);
-
+  g_application_hold (application);
+  biji_manager_new_async (storage, &color, manager_ready_cb, self);
 
   /* Automatic imports on startup */
   if (self->priv->first_run == TRUE)
@@ -469,9 +384,6 @@ bijiben_startup (GApplication *application)
     g_free (uri);
   }
 
-  /* Create the first window */
-  out:
-  bijiben_new_window_internal (BIJIBEN_APPLICATION (application), NULL, NULL, error);
   g_free (default_color);
   g_free (storage_path);
   g_object_unref (storage);
diff --git a/src/bjb-controller.c b/src/bjb-controller.c
index b7a2fa2..c6022fb 100644
--- a/src/bjb-controller.c
+++ b/src/bjb-controller.c
@@ -605,10 +605,11 @@ on_manager_changed (BijiManager            *manager,
   GtkTreeIter iter;
   GtkTreeIter *p_iter = &iter;
 
-
+  g_print ("manager changed\n");
 
   if (group != self->priv->group)
   {
+    g_print ("no controller\n");
     g_debug ("Controller received signal for group %i while %i",
              group, self->priv->group);
     return;
diff --git a/src/libbiji/biji-manager.c b/src/libbiji/biji-manager.c
index 6fa464e..e50913d 100644
--- a/src/libbiji/biji-manager.c
+++ b/src/libbiji/biji-manager.c
@@ -46,7 +46,6 @@ struct _BijiManagerPrivate
   gulong note_renamed ;
 
   GFile *location;
-  GError *error;
   TrackerSparqlConnection *connection;
 
 
@@ -63,7 +62,6 @@ enum {
   PROP_0,
   PROP_LOCATION,
   PROP_COLOR,
-  PROP_ERROR,
   BIJI_MANAGER_PROPERTIES
 };
 
@@ -76,17 +74,203 @@ enum {
 
 static guint biji_manager_signals[BIJI_MANAGER_SIGNALS] = { 0 };
 static GParamSpec *properties[BIJI_MANAGER_PROPERTIES] = { NULL, };
+static void biji_manager_initable_iface_init (GInitableIface *iface);
+static void biji_manager_async_initable_iface_init (GAsyncInitableIface *iface);
 
+#define BIJI_MANAGER_PRIVATE(o)  (G_TYPE_INSTANCE_GET_PRIVATE ((o), BIJI_TYPE_MANAGER, BijiManagerPrivate))
 
+G_DEFINE_TYPE_WITH_CODE (BijiManager, biji_manager, G_TYPE_OBJECT,
+                         G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, biji_manager_initable_iface_init)
+                         G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_INITABLE, 
biji_manager_async_initable_iface_init))
 
-#define BIJI_MANAGER_PRIVATE(o)  (G_TYPE_INSTANCE_GET_PRIVATE ((o), BIJI_TYPE_MANAGER, BijiManagerPrivate))
+static void
+on_provider_loaded_cb (BijiProvider *provider,
+                       GList *items,
+                       BijiItemsGroup  group,
+                       BijiManager *manager)
+{
+  GList *l;
+
+  switch (group)
+  {
+    case BIJI_LIVING_ITEMS:
+      for (l=items; l!=NULL; l=l->next)
+      {
+        if (BIJI_IS_ITEM (l->data))
+          biji_manager_add_item (manager, l->data, BIJI_LIVING_ITEMS, FALSE);
+      }
+      break;
+
+    case BIJI_ARCHIVED_ITEMS:
+      for (l=items; l!= NULL; l=l->next)
+      {
+        if (BIJI_IS_ITEM (l->data))
+          biji_manager_add_item (manager, l->data, BIJI_ARCHIVED_ITEMS, FALSE);
+      }
+      break;
+
+   default:
+     break;
+  }
+
+  /* More cautious to ask to fully rebuild the model
+   * because this might be the first provider.
+   * See #708458
+   * There are more performant fixes but not worth it */
+  biji_manager_notify_changed (manager, group, BIJI_MANAGER_MASS_CHANGE, NULL);
+  g_print ("sending the mass change\n");
+}
+
+static void
+on_provider_abort_cb (BijiProvider *provider,
+                      BijiManager  *self)
+{
+  const BijiProviderInfo *info;
+
+  info = biji_provider_get_info (provider);
+  g_hash_table_remove (self->priv->providers, (gpointer) info->unique_id);
+
+  g_object_unref (G_OBJECT (provider));
+}
+
+/*
+ * It should be the right place
+ * to stock somehow providers list
+ * in order to handle properly manager__note_new ()
+ *
+ */
+static void
+_add_provider (BijiManager *self,
+               BijiProvider *provider)
+{
+  /* we can safely cast get_id from const to gpointer
+   * since there is no key free func */
+
+  const BijiProviderInfo *info;
+
+  info = biji_provider_get_info (provider);
+  g_hash_table_insert (self->priv->providers, (gpointer) info->unique_id, provider);
+
+  g_signal_connect (provider, "loaded",
+                    G_CALLBACK (on_provider_loaded_cb), self);
+  g_signal_connect (provider, "abort",
+                    G_CALLBACK (on_provider_abort_cb), self);
+}
+
+static void
+load_goa_client (BijiManager *self,
+                 GoaClient *client)
+{
+  GList *accounts, *l;
+  GoaObject *object;
+  GoaAccount *account;
+  const gchar *type;
+  BijiProvider *provider;
+
+  accounts = goa_client_get_accounts (client);
+
+  for (l = accounts; l != NULL; l = l->next)
+  {
+    object = GOA_OBJECT (l->data);
+    account =  goa_object_peek_account (object);
+
+    if (GOA_IS_ACCOUNT (account))
+    {
+      type = goa_account_get_provider_type (account);
+
+      /* We do not need to store any object here.
+       * account_get_id can be used to talk with libbji */
+      if (g_strcmp0 (type, "owncloud") == 0)
+      {
+        g_message ("Loading account %s", goa_account_get_id (account));
+        provider = biji_own_cloud_provider_new (self, object);
+        _add_provider (self, provider);
+      }
+    }
+  }
+
+  g_list_free_full (accounts, g_object_unref);
+}
+
+static void
+load_eds_registry (BijiManager *self,
+                   ESourceRegistry *registry)
+{
+  GList *list, *l;
+  BijiProvider *provider;
 
-G_DEFINE_TYPE (BijiManager, biji_manager, G_TYPE_OBJECT);
+  list = e_source_registry_list_sources (registry, E_SOURCE_EXTENSION_MEMO_LIST);
+  for (l = list; l != NULL; l = l->next)
+  {
+    provider = biji_memo_provider_new (self, l->data);
+    _add_provider (self, provider);
+  }
+
+  g_list_free_full (list, g_object_unref);
+}
+
+static gboolean
+biji_manager_initable_init (GInitable *initable,
+                            GCancellable *cancellable,
+                            GError **error)
+{
+  BijiManager *self = BIJI_MANAGER (initable);
+  BijiManagerPrivate *priv = self->priv;
+  GError *local_error = NULL;
+  GoaClient *client;
+  ESourceRegistry *registry;
+
+  /* If tracker fails for some reason,
+   * do not attempt anything */
+  priv->connection = tracker_sparql_connection_get (NULL, &local_error);
+
+  if (local_error)
+  {
+    g_warning ("Unable to connect to Tracker: %s", local_error->message);
+    g_propagate_error (error, local_error);
+    return FALSE;
+  }
+
+  client = goa_client_new_sync (NULL, &local_error);
+  if (local_error)
+  {
+    g_warning ("Unable to connect to GOA: %s", local_error->message);
+    g_propagate_error (error, local_error);
+    return FALSE;
+  }
 
+  registry = e_source_registry_new_sync (NULL, &local_error);
+  if (local_error)
+  {
+    g_object_unref (client);
+    g_warning ("Unable to connect to EDS: %s", local_error->message);
+    g_propagate_error (error, local_error);
+    return FALSE;
+  }
+
+  priv->local_provider = biji_local_provider_new (self, self->priv->location);
+  _add_provider (self, priv->local_provider);
+
+  load_goa_client (self, client);
+  load_eds_registry (self, registry);
 
+  g_object_unref (client);
+  g_object_unref (registry);
 
+  return TRUE;
+}
 
+static void
+biji_manager_initable_iface_init (GInitableIface *iface)
+{
+  iface->init = biji_manager_initable_init;
+}
 
+static void
+biji_manager_async_initable_iface_init (GAsyncInitableIface *iface)
+{
+  /* Use default */
+}
 
 static void
 biji_manager_init (BijiManager *self)
@@ -186,10 +370,6 @@ biji_manager_set_property (GObject      *object,
       self->priv->location = g_value_dup_object (value);
       break;
 
-    case PROP_ERROR:
-      self->priv->error = g_value_get_pointer (value);
-      break;
-
     case PROP_COLOR:
       color = g_value_get_pointer (value);
       self->priv->color.red = color->red;
@@ -463,155 +643,13 @@ biji_manager_add_item (BijiManager *manager,
   return retval;
 }
 
-
-
-
-static void
-on_provider_loaded_cb (BijiProvider *provider,
-                       GList *items,
-                       BijiItemsGroup  group,
-                       BijiManager *manager)
-{
-  GList *l;
-
-
-  switch (group)
-  {
-    case BIJI_LIVING_ITEMS:
-      for (l=items; l!=NULL; l=l->next)
-      {
-        if (BIJI_IS_ITEM (l->data))
-          biji_manager_add_item (manager, l->data, BIJI_LIVING_ITEMS, FALSE);
-      }
-      break;
-
-    case BIJI_ARCHIVED_ITEMS:
-      for (l=items; l!= NULL; l=l->next)
-      {
-        if (BIJI_IS_ITEM (l->data))
-          biji_manager_add_item (manager, l->data, BIJI_ARCHIVED_ITEMS, FALSE);
-      }
-      break;
-
-   default:
-     break;
-  }
-
-
-  /* More cautious to ask to fully rebuild the model
-   * because this might be the first provider.
-   * See #708458
-   * There are more performant fixes but not worth it */
-  biji_manager_notify_changed (manager, group, BIJI_MANAGER_MASS_CHANGE, NULL);
-}
-
-
-static void
-on_provider_abort_cb (BijiProvider *provider,
-                      BijiManager  *self)
-{
-  const BijiProviderInfo *info;
-
-  info = biji_provider_get_info (provider);
-  g_hash_table_remove (self->priv->providers, (gpointer) info->unique_id);
-
-  g_object_unref (G_OBJECT (provider));
-}
-
-
-
-/* 
- * It should be the right place
- * to stock somehow providers list
- * in order to handle properly manager__note_new ()
- * 
- */
-static void
-_add_provider (BijiManager *self,
-               BijiProvider *provider)
-{
-  g_return_if_fail (BIJI_IS_PROVIDER (provider));
-
-
-  /* we can safely cast get_id from const to gpointer
-   * since there is no key free func */
-
-  const BijiProviderInfo *info;
-
-  info = biji_provider_get_info (provider);
-  g_hash_table_insert (self->priv->providers, (gpointer) info->unique_id, provider);  info = 
biji_provider_get_info (provider);
-  g_hash_table_insert (self->priv->providers, (gpointer) info->unique_id, provider);
-
-  g_signal_connect (provider, "loaded",
-                    G_CALLBACK (on_provider_loaded_cb), self);
-  g_signal_connect (provider, "abort",
-                    G_CALLBACK (on_provider_abort_cb), self);
-}
-
-
-
-
-void
-biji_manager_add_e_source_extension_memo (BijiManager *self,
-                                          ESource *source)
-{
-  BijiProvider *provider = NULL;
-
-  provider = biji_memo_provider_new (self, source);
-  _add_provider (self, provider);
-}
-
-
-void
-biji_manager_add_goa_object (BijiManager *self,
-                               GoaObject *object)
-{
-  BijiProvider *provider;
-  GoaAccount *account;
-  const gchar *type;
-
-  provider = NULL;
-  account =  goa_object_get_account (object);
-
-  if (GOA_IS_ACCOUNT (account))
-  {
-    type = goa_account_get_provider_type (account);
-
-    if (g_strcmp0 (type, "owncloud") ==0)
-      provider = biji_own_cloud_provider_new (self, object);
-  }
-
-  _add_provider (self, provider);
-}
-
-
 static void
 biji_manager_constructed (GObject *object)
 {
-  BijiManager *self;
-  BijiManagerPrivate *priv;
   gchar *filename;
   GFile *cache;
-  GError *error;
-
 
   G_OBJECT_CLASS (biji_manager_parent_class)->constructed (object);
-  self = BIJI_MANAGER (object);
-  priv = self->priv;
-  error = NULL;
-
-  /* If tracker fails for some reason,
-   * do not attempt anything */
-  priv->connection = tracker_sparql_connection_get (NULL, &error);
-
-  if (error)
-  {
-    g_warning ("%s", error->message);
-    g_error_free (error);
-    priv->error = g_error_new (BIJI_ERROR, BIJI_ERROR_TRACKER, "Tracker is not available");
-    return;
-  }
-
 
 #ifdef BUILD_ZEITGEIST
   priv->log = biji_zeitgeist_init ();
@@ -625,12 +663,8 @@ biji_manager_constructed (GObject *object)
   g_free (filename);
   g_file_make_directory (cache, NULL, NULL);
   g_object_unref (cache);
-
-  priv->local_provider = biji_local_provider_new (self, self->priv->location);
-  _add_provider (self, priv->local_provider);
 }
 
-
 static void
 biji_manager_class_init (BijiManagerClass *klass)
 {
@@ -662,12 +696,6 @@ biji_manager_class_init (BijiManagerClass *klass)
                          G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY);
 
 
-  properties[PROP_ERROR] =
-    g_param_spec_pointer ("error",
-                          "Unrecoverable error",
-                          "Note manager unrecoverable error",
-                          G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY);
-
   g_object_class_install_properties (object_class, BIJI_MANAGER_PROPERTIES, properties);
   g_type_class_add_private (klass, sizeof (BijiManagerPrivate));
 }
@@ -752,20 +780,39 @@ biji_manager_new (GFile *location, GdkRGBA *color, GError **error)
 {
   BijiManager *retval;
 
-  retval = g_object_new (BIJI_TYPE_MANAGER,
+  retval = g_initable_new (BIJI_TYPE_MANAGER, NULL, error,
                            "location", location,
                            "color", color,
-                           "error", *error,
                            NULL);
 
-  *error = retval->priv->error;
   return retval;
 }
 
+void
+biji_manager_new_async (GFile *location, GdkRGBA *color,
+                        GAsyncReadyCallback callback, gpointer user_data)
+{
+  g_async_initable_new_async (BIJI_TYPE_MANAGER, G_PRIORITY_DEFAULT,
+                              NULL,
+                              callback, user_data,
+                              "location", location,
+                              "color", color,
+                              NULL);
+}
 
+BijiManager *
+biji_manager_new_finish (GAsyncResult *res,
+                         GError **error)
+{
+  GObject *source_obj;
+  GObject *object;
 
+  source_obj = g_async_result_get_source_object (res);
+  object = g_async_initable_new_finish (G_ASYNC_INITABLE (source_obj), res, error);
+  g_object_unref (source_obj);
 
-
+  return object != NULL ? BIJI_MANAGER (object) : NULL;
+}
 
 /* Create the importer == switch depending on the uri.
  * That's all, the importer is responsible
diff --git a/src/libbiji/biji-manager.h b/src/libbiji/biji-manager.h
index ac23b2b..6e346c4 100644
--- a/src/libbiji/biji-manager.h
+++ b/src/libbiji/biji-manager.h
@@ -75,22 +75,19 @@ BijiManager     *biji_manager_new                   (GFile *location,
                                                     GdkRGBA *color,
                                                     GError **error);
 
+void             biji_manager_new_async             (GFile *location,
+                                                     GdkRGBA *color,
+                                                     GAsyncReadyCallback callback,
+                                                     gpointer user_data);
+
+BijiManager     *biji_manager_new_finish            (GAsyncResult *res,
+                                                     GError **error);
+
 
 void             biji_manager_import_uri            (BijiManager *manager,
                                                      gchar *target_provider_id,
                                                      gchar *uri);
 
-
-
-void             biji_manager_add_e_source_extension_memo
-                                                    (BijiManager *self,
-                                                     ESource *source);
-
-
-void             biji_manager_add_goa_object        (BijiManager *manager,
-                                                     GoaObject *object);
-
-
 GList           *biji_manager_get_providers         (BijiManager *manager); /* <ProviderInfo*> */
 
 


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