[gnome-builder/wip/greeter] context: load doap during context load



commit b677f2ce525fef55b0c73a8f2b5283fc62cbfef4
Author: Christian Hergert <christian hergert me>
Date:   Sun May 10 14:42:23 2015 -0700

    context: load doap during context load
    
    Not everything will have this, but for those that do, we can provide
    better information.
    
    In the future, some build systems I assume will also provide bits of
    this information.

 libide/ide-context.c |   97 ++++++++++++++++++++++++++++++++------------------
 1 files changed, 62 insertions(+), 35 deletions(-)
---
diff --git a/libide/ide-context.c b/libide/ide-context.c
index 3c02004..e1143fb 100644
--- a/libide/ide-context.c
+++ b/libide/ide-context.c
@@ -44,6 +44,8 @@
 #include "ide-unsaved-files.h"
 #include "ide-vcs.h"
 
+#include "doap/ide-doap.h"
+
 #define RESTORE_FILES_MAX_FILES 20
 
 struct _IdeContext
@@ -54,6 +56,7 @@ struct _IdeContext
   IdeBufferManager         *buffer_manager;
   IdeBuildSystem           *build_system;
   IdeDeviceManager         *device_manager;
+  IdeDoap                  *doap;
   GtkRecentManager         *recent_manager;
   IdeScriptManager         *script_manager;
   IdeSearchEngine          *search_engine;
@@ -536,6 +539,7 @@ ide_context_finalize (GObject *object)
 
   g_clear_object (&self->build_system);
   g_clear_object (&self->device_manager);
+  g_clear_object (&self->doap);
   g_clear_object (&self->project);
   g_clear_object (&self->project_file);
   g_clear_object (&self->recent_manager);
@@ -796,41 +800,71 @@ ide_context_init (IdeContext *self)
 }
 
 static void
-ide_context_init_project_name_cb (GObject      *object,
-                                  GAsyncResult *result,
-                                  gpointer      user_data)
+ide_context_load_doap_worker (GTask        *task,
+                              gpointer      source_object,
+                              gpointer      task_data,
+                              GCancellable *cancellable)
 {
-  IdeContext *self;
-  g_autoptr(GTask) task = user_data;
-  g_autoptr(GFileInfo) file_info = NULL;
-  GFile *file = (GFile *)object;
+  IdeContext *self = source_object;
+  g_autofree gchar *name = NULL;
+  g_autoptr(GFile) directory = NULL;
+  g_autoptr(GFileEnumerator) enumerator = NULL;
 
-  g_return_if_fail (G_IS_FILE (file));
-  g_return_if_fail (G_IS_TASK (task));
+  g_assert (G_IS_TASK (task));
+  g_assert (IDE_IS_CONTEXT (self));
 
-  self = g_task_get_source_object (task);
+  if (g_file_query_file_type (self->project_file, 0, cancellable) == G_FILE_TYPE_DIRECTORY)
+    directory = g_object_ref (self->project_file);
+  else
+    directory = g_file_get_parent (self->project_file);
 
-  file_info = g_file_query_info_finish (file, result, NULL);
+  name = g_file_get_basename (directory);
 
-  if (file_info &&
-      (G_FILE_TYPE_DIRECTORY == g_file_info_get_file_type (file_info)))
-    {
-      g_autofree gchar *name = NULL;
+  enumerator = g_file_enumerate_children (directory,
+                                          G_FILE_ATTRIBUTE_STANDARD_NAME,
+                                          G_FILE_QUERY_INFO_NONE,
+                                          cancellable,
+                                          NULL);
 
-      name = g_file_get_basename (file);
-      _ide_project_set_name (self->project, name);
-    }
-  else
+  if (enumerator != NULL)
     {
-      g_autoptr(GFile) parent = NULL;
-      g_autofree gchar *name = NULL;
+      gpointer infoptr;
+
+      while ((infoptr = g_file_enumerator_next_file (enumerator, cancellable, NULL)))
+        {
+          g_autoptr(GFileInfo) file_info = infoptr;
+          const gchar *filename;
+
+          filename = g_file_info_get_name (file_info);
+
+          if (!ide_str_empty0 (filename) && g_str_has_suffix (filename, ".doap"))
+            {
+              g_autoptr(GFile) file = NULL;
+              g_autoptr(IdeDoap) doap = NULL;
+
+              file = g_file_get_child (directory, filename);
+              doap = ide_doap_new ();
+
+              if (ide_doap_load_from_file (doap, file, cancellable, NULL))
+                {
+                  const gchar *doap_name;
 
-      parent = g_file_get_parent (file);
-      name = g_file_get_basename (parent);
+                  if ((doap_name = ide_doap_get_name (doap)))
+                    {
+                      g_free (name);
+                      name = g_strdup (doap_name);
+                    }
 
-      _ide_project_set_name (self->project, name);
+                  self->doap = g_object_ref (doap);
+
+                  break;
+                }
+            }
+        }
     }
 
+  _ide_project_set_name (self->project, name);
+
   g_task_return_boolean (task, TRUE);
 }
 
@@ -846,17 +880,7 @@ ide_context_init_project_name (gpointer             source_object,
   g_return_if_fail (IDE_IS_CONTEXT (self));
 
   task = g_task_new (source_object, cancellable, callback, user_data);
-
-  if (!ide_project_get_name (self->project))
-    g_file_query_info_async (self->project_file,
-                             G_FILE_ATTRIBUTE_STANDARD_TYPE,
-                             G_FILE_QUERY_INFO_NONE,
-                             G_PRIORITY_DEFAULT,
-                             g_task_get_cancellable (task),
-                             ide_context_init_project_name_cb,
-                             g_object_ref (task));
-  else
-    g_task_return_boolean (task, TRUE);
+  g_task_run_in_thread (task, ide_context_load_doap_worker);
 }
 
 static void
@@ -1310,6 +1334,9 @@ ide_context_init_add_recent (gpointer             source_object,
   recent_data.groups = (gchar **)groups;
   recent_data.is_private = FALSE;
 
+  if (self->doap != NULL)
+    recent_data.description = (gchar *)ide_doap_get_shortdesc (self->doap);
+
   IDE_TRACE_MSG ("Registering %s as recent project.", uri);
 
   if (!gtk_recent_manager_add_full (self->recent_manager, uri, &recent_data))


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