[gnome-software] snap: Implement gs_plugin_url_to_app
- From: Robert Ancell <rancell src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-software] snap: Implement gs_plugin_url_to_app
- Date: Thu, 2 Feb 2017 21:50:33 +0000 (UTC)
commit 4e36b420bcae79543d4e7f506f5a39bd518e1d9d
Author: Robert Ancell <robert ancell canonical com>
Date: Fri Feb 3 10:50:18 2017 +1300
snap: Implement gs_plugin_url_to_app
src/plugins/gs-plugin-snap.c | 62 ++++++++++++++++++++++++++---------------
src/plugins/gs-snapd.c | 49 +++++++++++++++++++++++++++++++++
src/plugins/gs-snapd.h | 6 ++++
3 files changed, 94 insertions(+), 23 deletions(-)
---
diff --git a/src/plugins/gs-plugin-snap.c b/src/plugins/gs-plugin-snap.c
index 50f8bcb..3cdf3c9 100644
--- a/src/plugins/gs-plugin-snap.c
+++ b/src/plugins/gs-plugin-snap.c
@@ -74,29 +74,6 @@ gs_plugin_setup (GsPlugin *plugin, GCancellable *cancellable, GError **error)
return TRUE;
}
-gboolean
-gs_plugin_url_to_app (GsPlugin *plugin,
- GsAppList *list,
- const gchar *url,
- GCancellable *cancellable,
- GError **error)
-{
-// g_autofree gchar *path = NULL;
- g_autofree gchar *scheme = NULL;
-// g_autoptr(GsApp) app = NULL;
-
- /* not us */
- scheme = gs_utils_get_url_scheme (url);
- if (g_strcmp0 (scheme, "snap") != 0)
- return TRUE;
-
- /* create app */
-// path = gs_utils_get_url_path (url);
-//FIXME: find/create an app using the URL path
-// gs_app_list_add (list, app);
- return TRUE;
-}
-
static void
get_macaroon (GsPlugin *plugin, gchar **macaroon, gchar ***discharges)
{
@@ -251,6 +228,45 @@ refine_app (GsPlugin *plugin, GsApp *app, JsonObject *package, gboolean from_sea
}
}
+gboolean
+gs_plugin_url_to_app (GsPlugin *plugin,
+ GsAppList *list,
+ const gchar *url,
+ GCancellable *cancellable,
+ GError **error)
+{
+ g_autofree gchar *scheme = NULL;
+ g_autofree gchar *macaroon = NULL;
+ g_auto(GStrv) discharges = NULL;
+ g_autoptr(JsonArray) snaps = NULL;
+ JsonObject *snap;
+ g_autofree gchar *path = NULL;
+ g_autoptr(GsApp) app = NULL;
+
+ /* not us */
+ scheme = gs_utils_get_url_scheme (url);
+ if (g_strcmp0 (scheme, "snap") != 0)
+ return TRUE;
+
+ /* create app */
+ path = gs_utils_get_url_path (url);
+ get_macaroon (plugin, &macaroon, &discharges);
+ snaps = gs_snapd_find_name (macaroon, discharges, path, cancellable, NULL);
+ if (snaps == NULL || json_array_get_length (snaps) < 1)
+ return TRUE;
+
+ snap = json_array_get_object_element (snaps, 0);
+ app = gs_app_new (json_object_get_string_member (snap, "name"));
+ gs_app_set_scope (app, AS_APP_SCOPE_SYSTEM);
+ gs_app_set_bundle_kind (app, AS_BUNDLE_KIND_SNAP);
+ gs_app_set_management_plugin (app, "snap");
+ gs_app_add_quirk (app, AS_APP_QUIRK_NOT_REVIEWABLE);
+ refine_app (plugin, app, snap, TRUE, cancellable);
+ gs_app_list_add (list, app);
+
+ return TRUE;
+}
+
void
gs_plugin_destroy (GsPlugin *plugin)
{
diff --git a/src/plugins/gs-snapd.c b/src/plugins/gs-snapd.c
index dc0f60d..74899d8 100644
--- a/src/plugins/gs-snapd.c
+++ b/src/plugins/gs-snapd.c
@@ -464,6 +464,55 @@ gs_snapd_find (const gchar *macaroon, gchar **discharges,
return json_array_ref (result);
}
+JsonArray *
+gs_snapd_find_name (const gchar *macaroon, gchar **discharges,
+ const gchar *name,
+ GCancellable *cancellable, GError **error)
+{
+ g_autofree gchar *escaped = NULL;
+ g_autofree gchar *path = NULL;
+ guint status_code;
+ g_autofree gchar *reason_phrase = NULL;
+ g_autofree gchar *response_type = NULL;
+ g_autofree gchar *response = NULL;
+ g_autoptr(JsonParser) parser = NULL;
+ JsonObject *root;
+ JsonArray *result;
+
+ escaped = soup_uri_encode (name, NULL);
+ path = g_strdup_printf ("/v2/find?name=%s", escaped);
+ if (!send_request ("GET", path, NULL,
+ macaroon, discharges,
+ &status_code, &reason_phrase,
+ &response_type, &response, NULL,
+ cancellable, error))
+ return NULL;
+
+ if (status_code != SOUP_STATUS_OK) {
+ g_set_error (error,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_FAILED,
+ "snapd returned status code %u: %s",
+ status_code, reason_phrase);
+ return NULL;
+ }
+
+ parser = parse_result (response, response_type, error);
+ if (parser == NULL)
+ return NULL;
+ root = json_node_get_object (json_parser_get_root (parser));
+ result = json_object_get_array_member (root, "result");
+ if (result == NULL) {
+ g_set_error (error,
+ GS_PLUGIN_ERROR,
+ GS_PLUGIN_ERROR_FAILED,
+ "snapd returned no result");
+ return NULL;
+ }
+
+ return json_array_ref (result);
+}
+
JsonObject *
gs_snapd_get_interfaces (const gchar *macaroon, gchar **discharges, GCancellable *cancellable, GError
**error)
{
diff --git a/src/plugins/gs-snapd.h b/src/plugins/gs-snapd.h
index af28bd1..fb038a2 100644
--- a/src/plugins/gs-snapd.h
+++ b/src/plugins/gs-snapd.h
@@ -46,6 +46,12 @@ JsonArray *gs_snapd_find (const gchar *macaroon,
GCancellable *cancellable,
GError **error);
+JsonArray *gs_snapd_find_name (const gchar *macaroon,
+ gchar **discharges,
+ const gchar *name,
+ GCancellable *cancellable,
+ GError **error);
+
JsonObject *gs_snapd_get_interfaces (const gchar *macaroon,
gchar **discharges,
GCancellable *cancellable,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]