[gnome-builder/wip/chergert/perspective] workbench: implement content-type discovery
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder/wip/chergert/perspective] workbench: implement content-type discovery
- Date: Tue, 17 Nov 2015 23:09:43 +0000 (UTC)
commit 5234a38a88c151b93aebf81b1766427ce55b6c6e
Author: Christian Hergert <christian hergert me>
Date: Tue Nov 17 15:00:29 2015 -0800
workbench: implement content-type discovery
libide/ide-workbench-open.c | 92 +++++++++++++++++++++++++++++++++++++-----
1 files changed, 81 insertions(+), 11 deletions(-)
---
diff --git a/libide/ide-workbench-open.c b/libide/ide-workbench-open.c
index d02522f..e9608e0 100644
--- a/libide/ide-workbench-open.c
+++ b/libide/ide-workbench-open.c
@@ -31,10 +31,12 @@ typedef struct
typedef struct
{
- GTask *task;
- IdeUri *uri;
- GArray *loaders;
- gchar *content_type;
+ IdeWorkbench *self;
+ GTask *task;
+ IdeUri *uri;
+ GArray *loaders;
+ gchar *content_type;
+ guint did_collect : 1;
} IdeWorkbenchOpenUriState;
typedef struct
@@ -135,6 +137,15 @@ ide_workbench_open_uri_try_next (IdeWorkbenchOpenUriState *open_uri_state)
g_assert (open_uri_state->loaders != NULL);
g_assert (open_uri_state->uri != NULL);
+ if (open_uri_state->did_collect == FALSE)
+ {
+ open_uri_state->did_collect = TRUE;
+ peas_extension_set_foreach (open_uri_state->self->addins,
+ ide_workbench_collect_loaders,
+ open_uri_state);
+ g_array_sort (open_uri_state->loaders, ide_workbench_loader_compare);
+ }
+
if (open_uri_state->loaders->len == 0)
{
gchar *uristr;
@@ -143,8 +154,8 @@ ide_workbench_open_uri_try_next (IdeWorkbenchOpenUriState *open_uri_state)
g_task_return_new_error (open_uri_state->task,
G_IO_ERROR,
G_IO_ERROR_NOT_SUPPORTED,
- "No handler responded to %s",
- uristr);
+ "No handler responded to \"%s\" with content-type \"%s\"",
+ uristr, open_uri_state->content_type ?: "");
g_clear_object (&open_uri_state->task);
g_free (uristr);
@@ -162,6 +173,60 @@ ide_workbench_open_uri_try_next (IdeWorkbenchOpenUriState *open_uri_state)
open_uri_state);
}
+static void
+ide_workbench_open_discover_content_type_cb (GObject *object,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ IdeWorkbenchOpenUriState *open_uri_state = user_data;
+ GFileInfo *file_info;
+ GFile *file = (GFile *)object;
+ GError *error = NULL;
+
+ g_assert (G_IS_FILE (file));
+ g_assert (open_uri_state != NULL);
+ g_assert (G_IS_TASK (open_uri_state->task));
+
+ file_info = g_file_query_info_finish (file, result, &error);
+
+ if (file_info == NULL)
+ {
+ g_warning ("%s", error->message);
+ g_clear_error (&error);
+ }
+ else
+ {
+ open_uri_state->content_type = g_strdup (g_file_info_get_content_type (file_info));
+ g_clear_object (&file_info);
+ }
+
+ ide_workbench_open_uri_try_next (open_uri_state);
+}
+
+static void
+ide_workbench_open_discover_content_type (IdeWorkbenchOpenUriState *open_uri_state)
+{
+ g_autoptr(GFile) file = NULL;
+
+ g_assert (open_uri_state != NULL);
+ g_assert (G_IS_TASK (open_uri_state->task));
+ g_assert (open_uri_state->loaders != NULL);
+ g_assert (open_uri_state->uri != NULL);
+
+ file = ide_uri_to_file (open_uri_state->uri);
+
+ if (file != NULL)
+ g_file_query_info_async (file,
+ G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
+ G_FILE_QUERY_INFO_NONE,
+ G_PRIORITY_DEFAULT,
+ g_task_get_cancellable (open_uri_state->task),
+ ide_workbench_open_discover_content_type_cb,
+ open_uri_state);
+ else
+ ide_workbench_open_uri_try_next (open_uri_state);
+}
+
void
ide_workbench_open_uri_async (IdeWorkbench *self,
IdeUri *uri,
@@ -176,15 +241,20 @@ ide_workbench_open_uri_async (IdeWorkbench *self,
g_return_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable));
open_uri_state = g_new0 (IdeWorkbenchOpenUriState, 1);
+ open_uri_state->self = self;
open_uri_state->uri = ide_uri_ref (uri);
+ open_uri_state->content_type = NULL;
open_uri_state->loaders = g_array_new (FALSE, FALSE, sizeof (IdeWorkbenchLoader));
open_uri_state->task = g_task_new (self, cancellable, callback, user_data);
- g_array_set_clear_func (open_uri_state->loaders, ide_workbench_loader_destroy);
- peas_extension_set_foreach (self->addins, ide_workbench_collect_loaders, open_uri_state);
- g_array_sort (open_uri_state->loaders, ide_workbench_loader_compare);
- g_task_set_task_data (open_uri_state->task, open_uri_state, ide_workbench_open_uri_state_free);
- ide_workbench_open_uri_try_next (open_uri_state);
+ g_array_set_clear_func (open_uri_state->loaders,
+ ide_workbench_loader_destroy);
+
+ g_task_set_task_data (open_uri_state->task,
+ open_uri_state,
+ ide_workbench_open_uri_state_free);
+
+ ide_workbench_open_discover_content_type (open_uri_state);
}
gboolean
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]