[gnome-control-center] printers: Introduce PpPrinter class



commit a95bdb91bb79f72d8941226183d4c601ea1b1408
Author: Martin Hatina <mhatina redhat com>
Date:   Mon Jun 20 13:56:35 2016 +0200

    printers: Introduce PpPrinter class
    
    Introduce new class that represents printer.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=761539

 panels/printers/Makefile.am  |    2 +
 panels/printers/pp-printer.c |  288 ++++++++++++++++++++++++++++++++++++++++++
 panels/printers/pp-printer.h |   49 +++++++
 3 files changed, 339 insertions(+), 0 deletions(-)
---
diff --git a/panels/printers/Makefile.am b/panels/printers/Makefile.am
index 938e3b0..512cda5 100644
--- a/panels/printers/Makefile.am
+++ b/panels/printers/Makefile.am
@@ -20,6 +20,8 @@ BUILT_SOURCES =                       \
 
 libprinters_la_SOURCES =               \
        $(BUILT_SOURCES)                \
+       pp-printer.c                    \
+       pp-printer.h                    \
        pp-new-printer.c                \
        pp-new-printer.h                \
        pp-maintenance-command.c        \
diff --git a/panels/printers/pp-printer.c b/panels/printers/pp-printer.c
new file mode 100644
index 0000000..220c932
--- /dev/null
+++ b/panels/printers/pp-printer.c
@@ -0,0 +1,288 @@
+/*
+ * Copyright (C) 2016 Red Hat, Inc
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ *
+ * Authors: Martin Hatina <mhatina redhat com>
+ *          Marek Kasik <mkasik redhat com>
+ */
+
+#include "pp-printer.h"
+
+#include "pp-utils.h"
+
+typedef struct _PpPrinter        PpPrinter;
+typedef struct _PpPrinterPrivate PpPrinterPrivate;
+
+struct _PpPrinter
+{
+  GObject           parent_instance;
+  PpPrinterPrivate *priv;
+};
+
+struct _PpPrinterPrivate
+{
+  gchar *printer_name;
+};
+
+G_DEFINE_TYPE_WITH_PRIVATE (PpPrinter, pp_printer, G_TYPE_OBJECT)
+
+enum
+{
+  PROP_0 = 0,
+  PROP_NAME
+};
+
+static void
+pp_printer_dispose (GObject *object)
+{
+  PpPrinterPrivate *priv = PP_PRINTER (object)->priv;
+
+  g_free (priv->printer_name);
+
+  G_OBJECT_CLASS (pp_printer_parent_class)->dispose (object);
+}
+
+static void
+pp_printer_finalize (GObject *object)
+{
+  G_OBJECT_CLASS (pp_printer_parent_class)->finalize (object);
+}
+
+static void
+pp_printer_get_property (GObject    *object,
+                         guint       property_id,
+                         GValue     *value,
+                         GParamSpec *pspec)
+{
+  PpPrinter *self = PP_PRINTER (object);
+
+  switch (property_id)
+    {
+      case PROP_NAME:
+        g_value_set_string (value, self->priv->printer_name);
+        break;
+      default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+        break;
+    }
+}
+
+static void
+pp_printer_set_property (GObject      *object,
+                         guint         property_id,
+                         const GValue *value,
+                         GParamSpec   *pspec)
+{
+  PpPrinter *self = PP_PRINTER (object);
+
+  switch (property_id)
+    {
+      case PROP_NAME:
+        g_free (self->priv->printer_name);
+        self->priv->printer_name = g_value_dup_string (value);
+        break;
+      default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+        break;
+    }
+
+}
+
+static void
+pp_printer_class_init (PpPrinterClass *klass)
+{
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+  gobject_class->set_property = pp_printer_set_property;
+  gobject_class->get_property = pp_printer_get_property;
+  gobject_class->dispose = pp_printer_dispose;
+  gobject_class->finalize = pp_printer_finalize;
+
+  g_object_class_install_property (gobject_class, PROP_NAME,
+    g_param_spec_string ("printer-name",
+                         "Printer name",
+                         "Name of this printer",
+                         NULL,
+                         G_PARAM_READWRITE));
+}
+
+static void
+pp_printer_init (PpPrinter *printer)
+{
+  printer->priv = G_TYPE_INSTANCE_GET_PRIVATE (printer,
+                                               PP_TYPE_PRINTER,
+                                               PpPrinterPrivate);
+}
+
+PpPrinter *
+pp_printer_new (const gchar *name)
+{
+  PpPrinter *self = g_object_new (PP_TYPE_PRINTER, "printer-name", name, NULL);
+
+  return self;
+}
+
+static void
+printer_rename_thread (GTask        *task,
+                       gpointer      source_object,
+                       gpointer      task_data,
+                       GCancellable *cancellable)
+{
+  PpPrinter *printer = PP_PRINTER (source_object);
+  gboolean   result;
+  gchar     *new_printer_name = task_data;
+  gchar     *old_printer_name;
+
+  g_object_get (printer, "printer-name", &old_printer_name, NULL);
+
+  result = printer_rename (old_printer_name, new_printer_name);
+
+  if (result)
+    {
+      g_object_set (printer, "printer-name", new_printer_name, NULL);
+    }
+
+  g_free (old_printer_name);
+
+  g_task_return_boolean (task, result);
+}
+
+static void
+printer_rename_dbus_cb (GObject      *source_object,
+                        GAsyncResult *res,
+                        gpointer      user_data)
+{
+  PpPrinter *printer;
+  GVariant  *output;
+  gboolean   result = FALSE;
+  GError    *error = NULL;
+  GTask     *task = user_data;
+  gchar     *old_printer_name;
+
+  output = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source_object),
+                                          res,
+                                          &error);
+  g_object_unref (source_object);
+
+  if (output != NULL)
+    {
+      const gchar *ret_error;
+
+      printer = g_task_get_source_object (task);
+      g_object_get (printer, "printer-name", &old_printer_name, NULL);
+
+      g_variant_get (output, "(&s)", &ret_error);
+      if (ret_error[0] != '\0')
+        {
+          g_warning ("cups-pk-helper: renaming of printer %s failed: %s", old_printer_name, ret_error);
+        }
+      else
+        {
+          result = TRUE;
+          g_object_set (printer, "printer-name", g_task_get_task_data (task), NULL);
+        }
+
+      g_task_return_boolean (task, result);
+
+      g_free (old_printer_name);
+      g_variant_unref (output);
+    }
+  else
+    {
+      if (error->domain == G_DBUS_ERROR &&
+          (error->code == G_DBUS_ERROR_SERVICE_UNKNOWN ||
+           error->code == G_DBUS_ERROR_UNKNOWN_METHOD))
+        {
+          g_warning ("Update cups-pk-helper to at least 0.2.6 please to be able to use PrinterRename 
method.");
+          g_error_free (error);
+
+          g_task_run_in_thread (task, printer_rename_thread);
+        }
+      else
+        {
+          g_task_return_boolean (task, FALSE);
+        }
+    }
+}
+
+static void
+get_bus_cb (GObject      *source_object,
+            GAsyncResult *res,
+            gpointer      user_data)
+{
+  GDBusConnection *bus;
+  GError          *error = NULL;
+  GTask           *task = user_data;
+  gchar           *printer_name;
+
+  bus = g_bus_get_finish (res, &error);
+  if (bus != NULL)
+    {
+      g_object_get (g_task_get_source_object (task),
+                    "printer-name", &printer_name,
+                    NULL);
+      g_dbus_connection_call (bus,
+                              MECHANISM_BUS,
+                              "/",
+                              MECHANISM_BUS,
+                              "PrinterRename",
+                              g_variant_new ("(ss)",
+                                             printer_name,
+                                             g_task_get_task_data (task)),
+                              G_VARIANT_TYPE ("(s)"),
+                              G_DBUS_CALL_FLAGS_NONE,
+                              -1,
+                              g_task_get_cancellable (task),
+                              printer_rename_dbus_cb,
+                              task);
+
+      g_free (printer_name);
+    }
+  else
+    {
+      g_warning ("Failed to get system bus: %s", error->message);
+      g_error_free (error);
+      g_task_return_boolean (task, FALSE);
+    }
+}
+
+void
+pp_printer_rename_async (PpPrinter           *printer,
+                         const gchar         *new_printer_name,
+                         GCancellable        *cancellable,
+                         GAsyncReadyCallback  callback,
+                         gpointer             user_data)
+{
+  GTask *task;
+
+  task = g_task_new (G_OBJECT (printer), cancellable, callback, user_data);
+  g_task_set_task_data (task, g_strdup (new_printer_name), g_free);
+
+  g_bus_get (G_BUS_TYPE_SYSTEM,
+             cancellable,
+             get_bus_cb,
+             task);
+}
+
+gboolean
+pp_printer_rename_finish (PpPrinter     *printer,
+                          GAsyncResult  *res,
+                          GError       **error)
+{
+  g_return_val_if_fail (g_task_is_valid (res, printer), FALSE);
+  g_object_unref (res);
+
+  return g_task_propagate_boolean (G_TASK (res), error);
+}
diff --git a/panels/printers/pp-printer.h b/panels/printers/pp-printer.h
new file mode 100644
index 0000000..4a0da70
--- /dev/null
+++ b/panels/printers/pp-printer.h
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2016 Red Hat, Inc
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ *
+ * Authors: Martin Hatina <mhatina redhat com>
+ *          Marek Kasik <mkasik redhat com>
+ */
+
+#ifndef __PP_PRINTER_H__
+#define __PP_PRINTER_H__
+
+#include <glib-object.h>
+#include <gio/gio.h>
+
+G_BEGIN_DECLS
+
+#define PP_TYPE_PRINTER (pp_printer_get_type ())
+
+G_DECLARE_FINAL_TYPE (PpPrinter, pp_printer, PP, PRINTER, GObject)
+
+GType        pp_printer_get_type      (void) G_GNUC_CONST;
+
+PpPrinter   *pp_printer_new           (const gchar          *name);
+
+void         pp_printer_rename_async  (PpPrinter            *printer,
+                                       const gchar          *new_printer_name,
+                                       GCancellable         *cancellable,
+                                       GAsyncReadyCallback   callback,
+                                       gpointer              user_data);
+
+gboolean     pp_printer_rename_finish (PpPrinter            *printer,
+                                       GAsyncResult         *res,
+                                       GError              **error);
+
+G_END_DECLS
+
+#endif /* __PP_PRINTER_H__ */


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