[gnome-software] snap: Implement gs_plugin_url_to_app



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]