[gnome-software/eula-dialog] temp commit



commit 46e4726232d0c206f43440cc0ecb737eca21267f
Author: Jonathan Kang <jonathankang gnome org>
Date:   Fri Oct 25 08:44:00 2019 +0800

    temp commit

 src/gnome-software.gresource.xml |   1 +
 src/gs-eula-dialog.c             | 117 ++++++++++++++++++++++++++++
 src/gs-eula-dialog.h             |  21 ++++++
 src/gs-eula-dialog.ui            |  51 +++++++++++++
 src/gs-shell.c                   |  43 +++++++++++
 src/gs-task.c                    | 159 +++++++++++++++++++++++++++++++++++++++
 src/gs-task.h                    |  28 +++++++
 src/meson.build                  |   2 +
 8 files changed, 422 insertions(+)
---
diff --git a/src/gnome-software.gresource.xml b/src/gnome-software.gresource.xml
index 2a523021..b5142750 100644
--- a/src/gnome-software.gresource.xml
+++ b/src/gnome-software.gresource.xml
@@ -8,6 +8,7 @@
   <file preprocess="xml-stripblanks">gs-category-page.ui</file>
   <file preprocess="xml-stripblanks">gs-category-tile.ui</file>
   <file preprocess="xml-stripblanks">gs-details-page.ui</file>
+  <file preprocess="xml-stripblanks">gs-eula-dialog.ui</file>
   <file preprocess="xml-stripblanks">gs-extras-page.ui</file>
   <file preprocess="xml-stripblanks">gs-feature-tile.ui</file>
   <file preprocess="xml-stripblanks">gs-first-run-dialog.ui</file>
diff --git a/src/gs-eula-dialog.c b/src/gs-eula-dialog.c
new file mode 100644
index 00000000..edd4ea66
--- /dev/null
+++ b/src/gs-eula-dialog.c
@@ -0,0 +1,117 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2019 Jonathan Kang <jonathankang gnome com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <gtk/gtk.h>
+
+#include "gs-eula-dialog.h"
+#include "gs-task.h"
+
+enum
+{
+    CANCEL,
+    AGREE,
+    LAST_SIGNAL
+};
+
+struct _GsEulaDialog
+{
+    /*< private >*/
+    GtkDialog parent_instance;
+};
+
+typedef struct
+{
+    GtkWidget *agree_button;
+    GtkWidget *cancel_button;
+    GtkWidget *details_textview;
+} GsEulaDialogPrivate;
+
+G_DEFINE_TYPE_WITH_PRIVATE (GsEulaDialog, gs_eula_dialog, GTK_TYPE_DIALOG)
+
+static guint signals[LAST_SIGNAL] = { 0 };
+
+void
+gs_eula_dialog_populate_license_agreement (GsEulaDialog *self,
+                                           const gchar *license_agreement)
+{
+    g_autoptr(GtkTextBuffer) buffer = NULL;
+    GsEulaDialogPrivate *priv;
+
+    priv = gs_eula_dialog_get_instance_private (self);
+
+    buffer = gtk_text_buffer_new (NULL);
+    gtk_text_buffer_insert_at_cursor (buffer,
+                                      license_agreement, strlen (license_agreement));
+    gtk_text_view_set_buffer (GTK_TEXT_VIEW (priv->details_textview), buffer);
+}
+
+static void
+gs_eula_dialog_response_cb (GtkDialog *dialog,
+                            gint response_id,
+                            gpointer user_data)
+{
+    GsEulaDialog *self = GS_EULA_DIALOG (dialog);
+
+    if (response_id == GTK_RESPONSE_CANCEL)
+    {
+        g_signal_emit (self, signals[CANCEL], 0);
+    }
+
+    if (response_id == GTK_RESPONSE_ACCEPT)
+    {
+        g_signal_emit (self, signals[AGREE], 0);
+    }
+}
+
+static void
+gs_eula_dialog_class_init (GsEulaDialogClass *klass)
+{
+    GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+    signals[CANCEL] = g_signal_new ("cancel",
+                                    G_TYPE_FROM_CLASS (klass),
+                                    G_SIGNAL_RUN_LAST,
+                                    0,
+                                    NULL,
+                                    NULL,
+                                    NULL,
+                                    G_TYPE_NONE,
+                                    0);
+
+    signals[CANCEL] = g_signal_new ("agree",
+                                    G_TYPE_FROM_CLASS (klass),
+                                    G_SIGNAL_RUN_LAST,
+                                    0,
+                                    NULL,
+                                    NULL,
+                                    NULL,
+                                    G_TYPE_NONE,
+                                    0);
+
+    gtk_widget_class_set_template_from_resource (widget_class,
+                                                 "/org/gnome/Software/gs-eula-window.ui");
+    gtk_widget_class_bind_template_child_private (widget_class, GsEulaDialog,
+                                                  agree_button);
+    gtk_widget_class_bind_template_child_private (widget_class, GsEulaDialog,
+                                                  cancel_button);
+    gtk_widget_class_bind_template_child_private (widget_class, GsEulaDialog,
+                                                  details_textview);
+    gtk_widget_class_bind_template_callback (widget_class, gs_eula_dialog_response_cb);
+}
+
+static void
+gs_eula_dialog_init (GsEulaDialog *self)
+{
+    gtk_widget_init_template (GTK_WIDGET (self));
+}
+
+GsEulaDialog *
+gs_eula_dialog_new (void)
+{
+    g_print ("newing a eula dialog\n");
+    return g_object_new (GS_TYPE_EULA_DIALOG, NULL);
+}
diff --git a/src/gs-eula-dialog.h b/src/gs-eula-dialog.h
new file mode 100644
index 00000000..9cd17389
--- /dev/null
+++ b/src/gs-eula-dialog.h
@@ -0,0 +1,21 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2019 Jonathan Kang <jonathankang gnome com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define GS_TYPE_EULA_DIALOG (gs_eula_dialog_get_type ())
+G_DECLARE_FINAL_TYPE (GsEulaDialog, gs_eula_dialog, GS, EULA_DIALOG, GtkWindow)
+
+void gs_eula_dialog_populate_license_agreement (GsEulaDialog *dialog,
+                                                const gchar *license_agreement);
+GsEulaDialog *gs_eula_dialog_new (void);
+
+G_END_DECLS
diff --git a/src/gs-eula-dialog.ui b/src/gs-eula-dialog.ui
new file mode 100644
index 00000000..b0e93fc6
--- /dev/null
+++ b/src/gs-eula-dialog.ui
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <template class="GtkDialog" parent="GtkDialog">
+    <property name="width-request">100</property>
+    <property name="height-request">200</property>
+    <signal name="response" handler="gs_eula_dialog_response_cb"/>
+    <child type="action">
+      <object class="GtkButton" id="cancel_button">
+        <property name="label">Cancel</property>
+        <property name="title" translatable="yes">License Agreement Required</property>
+        <property name="visible">True</property>
+      </object>
+    </child>
+    <child type="action">
+      <object class="GtkButton" id="agree_button">
+        <property name="can-default">True</property>
+        <property name="label" translatable="yes">_Accept Agreement</property>
+        <property name="sensitive">False</property>
+        <property name="visible">True</property>
+      </object>
+    </child>
+    <child internal-child="vbox">
+      <object class="GtkBox">
+        <property name="orientation">vertical</property>
+        <property name="valign">center</property>
+        <child>
+          <object class="GtkScrolledWindow" id="scrolledwindow">
+            <property name="can-focus">False</property>
+            <property name="shadow-type">in</property>
+            <property name="visible">True</property>
+            <child>
+              <object class="GtkTextView" id="details_textview">
+                <property name="visible">True</property>
+                <property name="can-focus">True</property>
+                <property name="border-width">6</property>
+                <property name="editable">False</property>
+                <property name="wrap-mode">word</property>
+                <property name="cursor-visible">False</property>
+                <property name="accepts-tab">False</property>
+              </object>
+            </child>
+          </object>
+        </child>
+      </object>
+    </child>
+    <action-widgets>
+      <action-widget response="cancel">cancel_button</action-widget>
+      <action-widget response="agree">agree_button</action-widget>
+    </action-widgets>
+  </template>
+</interface>
diff --git a/src/gs-shell.c b/src/gs-shell.c
index 918b794f..84e76da5 100644
--- a/src/gs-shell.c
+++ b/src/gs-shell.c
@@ -13,6 +13,7 @@
 #include <glib/gi18n.h>
 
 #include "gs-common.h"
+#include "gs-eula-dialog.h"
 #include "gs-shell.h"
 #include "gs-details-page.h"
 #include "gs-installed-page.h"
@@ -25,6 +26,7 @@
 #include "gs-extras-page.h"
 #include "gs-repos-dialog.h"
 #include "gs-prefs-dialog.h"
+#include "gs-task.h"
 #include "gs-update-dialog.h"
 #include "gs-update-monitor.h"
 #include "gs-utils.h"
@@ -66,6 +68,7 @@ typedef struct
        gchar                   *events_info_uri;
        gboolean                 in_mode_change;
        GsPage                  *page;
+       GsTask                  *task;
 } GsShellPrivate;
 
 G_DEFINE_TYPE_WITH_PRIVATE (GsShell, gs_shell, G_TYPE_OBJECT)
@@ -127,6 +130,41 @@ gs_shell_get_window (GsShell *shell)
        return priv->main_window;
 }
 
+static void
+eula_question_cb (GsTask *task,
+                 gpointer user_data)
+{
+       const gchar *package_id;
+       const gchar *vendor_name;
+       const gchar *license_agreement;
+       g_autofree gchar *printable = NULL;
+       g_auto(GStrv) split = NULL;
+       GsEulaDialog *eula_dialog;
+       GsShell *shell;
+       GsShellPrivate *priv;
+
+       g_warning ("eula question cb in gs-shell\n");
+       shell = GS_SHELL (user_data);
+       priv = gs_shell_get_instance_private (shell);
+
+       /* Get needed data from GsTask and populate them to GsEulaDialog. */
+       package_id = gs_task_get_package_id (task);
+       vendor_name = gs_task_get_vendor_name (task);
+       license_agreement = gs_task_get_license_agreement (task);
+       split = pk_package_id_split (package_id);
+       printable = g_markup_printf_escaped ("<b><big>License required for %s by %s</big></b>",
+                                            split[0], vendor_name);
+
+       eula_dialog = gs_eula_dialog_new ();
+       /* gs_eula_dialog_set_label here. */
+       gs_eula_dialog_populate_license_agreement (eula_dialog,
+                                                  license_agreement);
+
+       gtk_window_set_transient_for (GTK_WINDOW (eula_dialog),
+                                     priv->main_window);
+       gtk_widget_show (GTK_WIDGET (eula_dialog));
+}
+
 void
 gs_shell_activate (GsShell *shell)
 {
@@ -2040,6 +2078,10 @@ gs_shell_setup (GsShell *shell, GsPluginLoader *plugin_loader, GCancellable *can
 
        /* show loading page, which triggers the initial refresh */
        gs_shell_change_mode (shell, GS_SHELL_MODE_LOADING, NULL, TRUE);
+
+       priv->task = gs_task_new ();
+       g_signal_connect (priv->task, "eula-question",
+                         G_CALLBACK (eula_question_cb), shell);
 }
 
 void
@@ -2224,6 +2266,7 @@ gs_shell_dispose (GObject *object)
        g_clear_object (&priv->header_start_widget);
        g_clear_object (&priv->header_end_widget);
        g_clear_object (&priv->page);
+       g_clear_object (&priv->task);
        g_clear_pointer (&priv->pages, g_hash_table_unref);
        g_clear_pointer (&priv->events_info_uri, g_free);
        g_clear_pointer (&priv->modal_dialogs, g_ptr_array_unref);
diff --git a/src/gs-task.c b/src/gs-task.c
new file mode 100644
index 00000000..bf643e1f
--- /dev/null
+++ b/src/gs-task.c
@@ -0,0 +1,159 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2019 Jonathan Kang <jonathankang gnome com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <packagekit-glib2/packagekit.h>
+
+#include "gs-task.h"
+
+enum
+{
+    EULA_QUESTION,
+    LAST_SIGNAL
+};
+
+struct _GsTask
+{
+    /*< private >*/
+    PkTask parent_instance;
+};
+
+typedef struct
+{
+    gchar *package_id;
+    gchar *vendor_name;
+    gchar *license_agreement;
+    guint request;
+} GsTaskPrivate;
+
+G_DEFINE_TYPE_WITH_PRIVATE (GsTask, gs_task, PK_TYPE_TASK)
+
+static guint signals[LAST_SIGNAL] = { 0 };
+
+const gchar *
+gs_task_get_package_id (GsTask *self)
+{
+    GsTaskPrivate *priv;
+
+    g_return_val_if_fail (GS_IS_TASK (self), NULL);
+
+    priv = gs_task_get_instance_private (self);
+
+    return priv->package_id;
+}
+
+const gchar *
+gs_task_get_vendor_name (GsTask *self)
+{
+    GsTaskPrivate *priv;
+
+    g_return_val_if_fail (GS_IS_TASK (self), NULL);
+
+    priv = gs_task_get_instance_private (self);
+
+    return priv->vendor_name;
+}
+
+const gchar *
+gs_task_get_license_agreement (GsTask *self)
+{
+    GsTaskPrivate *priv;
+
+    g_return_val_if_fail (GS_IS_TASK (self), NULL);
+
+    priv = gs_task_get_instance_private (self);
+
+    return priv->license_agreement;
+}
+
+static void
+gs_task_eula_question (PkTask *task,
+                       guint request,
+                       PkResults *results)
+{
+    PkEulaRequired *item;
+    g_autoptr(GPtrArray) array = NULL;
+    GsTask *self;
+    GsTaskPrivate *priv;
+
+    g_warning ("eula question\n");
+
+    self = GS_TASK (task);
+    priv = gs_task_get_instance_private (self);
+
+    /* Save the current request. */
+    priv->request = request;
+
+    array = pk_results_get_eula_required_array (results);
+    if (array->len != 1)
+    {
+        g_warning ("array length %u, aborting", array->len);
+    }
+
+    item = g_ptr_array_index (array, 0);
+    g_object_get (item,
+                  "package-id", &priv->package_id,
+                  "vendor-name", &priv->vendor_name,
+                  "license-agreement", &priv->license_agreement,
+                  NULL);
+
+    /* Show the eula window here. Emit a signal? */
+    g_signal_emit (GS_TASK (task), signals[EULA_QUESTION], 0);
+}
+
+static void
+gs_task_finalize (GObject *object)
+{
+    GsTask *self;
+    GsTaskPrivate *priv;
+
+    self = GS_TASK (object);
+    priv = gs_task_get_instance_private (self);
+
+    g_free (priv->package_id);
+    g_free (priv->vendor_name);
+    g_free (priv->license_agreement);
+
+    G_OBJECT_CLASS (gs_task_parent_class)->finalize (object);
+}
+
+static void
+gs_task_class_init (GsTaskClass *klass)
+{
+    GObjectClass *object_class = G_OBJECT_CLASS (klass);
+    PkTaskClass *task_class = PK_TASK_CLASS (klass);
+
+    g_warning ("gs task class init\n");
+    object_class->finalize = gs_task_finalize;
+    task_class->eula_question = gs_task_eula_question;
+
+    signals[EULA_QUESTION] = g_signal_new ("eula-question",
+                                           G_TYPE_FROM_CLASS (klass),
+                                           G_SIGNAL_RUN_LAST,
+                                           0,
+                                           NULL,
+                                           NULL,
+                                           NULL,
+                                           G_TYPE_NONE,
+                                           0);
+}
+
+static void
+gs_task_init (GsTask *self)
+{
+    GsTaskPrivate *priv = gs_task_get_instance_private (self);
+
+    priv->package_id = NULL;
+    priv->vendor_name = NULL;
+    priv->license_agreement = NULL;
+}
+
+GsTask *
+gs_task_new (void)
+{
+    g_warning ("newing GsTask \n");
+    return g_object_new (GS_TYPE_TASK, NULL);
+}
diff --git a/src/gs-task.h b/src/gs-task.h
new file mode 100644
index 00000000..e550b99f
--- /dev/null
+++ b/src/gs-task.h
@@ -0,0 +1,28 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2019 Jonathan Kang <jonathankang gnome com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#pragma once
+
+#include <glib-object.h>
+#include <packagekit-glib2/packagekit.h>
+
+G_BEGIN_DECLS
+
+#define GS_TYPE_TASK (gs_task_get_type ())
+G_DECLARE_FINAL_TYPE (GsTask, gs_task, GS, TASK, PkTask)
+
+struct _GsTaskClass
+{
+    PkTaskClass parent_class;
+};
+
+const gchar *gs_task_get_package_id (GsTask *task);
+const gchar *gs_task_get_vendor_name (GsTask *task);
+const gchar *gs_task_get_license_agreement (GsTask *task);
+GsTask *gs_task_new (void);
+
+G_END_DECLS
diff --git a/src/meson.build b/src/meson.build
index 5e18c750..cb438d7f 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -27,6 +27,7 @@ gnome_software_sources = [
   'gs-css.c',
   'gs-content-rating.c',
   'gs-details-page.c',
+  'gs-eula-dialog.c',
   'gs-extras-page.c',
   'gs-feature-tile.c',
   'gs-first-run-dialog.c',
@@ -59,6 +60,7 @@ gnome_software_sources = [
   'gs-shell-search-provider.c',
   'gs-star-widget.c',
   'gs-summary-tile.c',
+  'gs-task.c',
   'gs-third-party-repo-row.c',
   'gs-update-dialog.c',
   'gs-update-list.c',


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