[gnome-control-center] printers: Subscribe to jobs notifications



commit 5302047ff1bf3c2d9dffe27d101fa23f7d32d52f
Author: Felipe Borges <felipeborges gnome org>
Date:   Fri Feb 24 11:32:59 2017 +0100

    printers: Subscribe to jobs notifications
    
    The previous implementation of the panel was unable to individually
    update a PpPrinterEntry jobs count and its PpJobsDialog.
    
    These changes make the job notifications trigger updates in the
    PpPrinterEntry UIs, keeping track of job events on the go.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=779079

 panels/printers/cc-printers-panel.c |  114 +++++++++++++++++++++++++++++++++--
 panels/printers/pp-printer-entry.c  |   11 +++-
 panels/printers/pp-printer-entry.h  |    2 +
 3 files changed, 118 insertions(+), 9 deletions(-)
---
diff --git a/panels/printers/cc-printers-panel.c b/panels/printers/cc-printers-panel.c
index 9d7b3f5..7cc0ec3 100644
--- a/panels/printers/cc-printers-panel.c
+++ b/panels/printers/cc-printers-panel.c
@@ -38,6 +38,7 @@
 #include "pp-utils.h"
 #include "pp-cups.h"
 #include "pp-printer-entry.h"
+#include "pp-job.h"
 
 CC_PANEL_REGISTER (CcPrintersPanel, cc_printers_panel)
 
@@ -250,6 +251,58 @@ cc_printers_panel_class_init (CcPrintersPanelClass *klass)
 }
 
 static void
+on_get_job_attributes_cb (GObject      *source_object,
+                          GAsyncResult *res,
+                          gpointer      user_data)
+{
+  CcPrintersPanel        *self = (CcPrintersPanel*) user_data;
+  CcPrintersPanelPrivate *priv;
+  const gchar            *job_originating_user_name;
+  const gchar            *job_printer_uri;
+  GVariant               *attributes;
+  GVariant               *username;
+  GVariant               *printer_uri;
+  GError                 *error = NULL;
+
+  priv = PRINTERS_PANEL_PRIVATE (self);
+
+  attributes = pp_job_get_attributes_finish (PP_JOB (source_object), res, &error);
+  g_object_unref (source_object);
+
+  if (attributes != NULL)
+    {
+      if ((username = g_variant_lookup_value (attributes, "job-originating-user-name", G_VARIANT_TYPE 
("as"))) != NULL)
+        {
+          if ((printer_uri = g_variant_lookup_value (attributes, "job-printer-uri", G_VARIANT_TYPE ("as"))) 
!= NULL)
+            {
+              job_originating_user_name = g_variant_get_string (g_variant_get_child_value (username, 0), 
NULL);
+              job_printer_uri = g_variant_get_string (g_variant_get_child_value (printer_uri, 0), NULL);
+
+              if (job_originating_user_name != NULL && job_printer_uri != NULL &&
+                  g_strcmp0 (job_originating_user_name, cupsUser ()) == 0 &&
+                  g_strrstr (job_printer_uri, "/") != 0 &&
+                  priv->dests != NULL)
+                {
+                  PpPrinterEntry *printer_entry;
+                  gchar *printer_name;
+
+                  printer_name = g_strrstr (job_printer_uri, "/") + 1;
+                  printer_entry = PP_PRINTER_ENTRY (g_hash_table_lookup (priv->printer_entries, 
printer_name));
+
+                  pp_printer_entry_update_jobs_count (printer_entry);
+                }
+
+              g_variant_unref (printer_uri);
+            }
+
+          g_variant_unref (username);
+        }
+
+      g_variant_unref (attributes);
+    }
+}
+
+static void
 on_cups_notification (GDBusConnection *connection,
                       const char      *sender_name,
                       const char      *object_path,
@@ -259,7 +312,22 @@ on_cups_notification (GDBusConnection *connection,
                       gpointer         user_data)
 {
   CcPrintersPanel        *self = (CcPrintersPanel*) user_data;
+  gboolean                printer_is_accepting_jobs;
+  gchar                  *printer_name = NULL;
   gchar                  *text = NULL;
+  gchar                  *printer_uri = NULL;
+  gchar                  *printer_state_reasons = NULL;
+  PpJob                  *job;
+  gchar                  *job_state_reasons = NULL;
+  gchar                  *job_name = NULL;
+  guint                   job_id;
+  gint                    printer_state;
+  gint                    job_state;
+  gint                    job_impressions_completed;
+  static gchar *requested_attrs[] = {
+    "job-printer-uri",
+    "job-originating-user-name",
+    NULL };
 
   if (g_strcmp0 (signal_name, "PrinterAdded") != 0 &&
       g_strcmp0 (signal_name, "PrinterDeleted") != 0 &&
@@ -271,13 +339,47 @@ on_cups_notification (GDBusConnection *connection,
 
   if (g_variant_n_children (parameters) == 1)
     g_variant_get (parameters, "(&s)", &text);
-  else if (g_strcmp0 (signal_name, "PrinterAdded") == 0 ||
-           g_strcmp0 (signal_name, "PrinterDeleted") == 0 ||
-           g_strcmp0 (signal_name, "PrinterStateChanged") == 0 ||
-           g_strcmp0 (signal_name, "PrinterStopped") == 0 ||
-           g_strcmp0 (signal_name, "JobCreated") == 0 ||
-           g_strcmp0 (signal_name, "JobCompleted") == 0)
+ else if (g_variant_n_children (parameters) == 6)
+    {
+      g_variant_get (parameters, "(&s&s&su&sb)",
+                     &text,
+                     &printer_uri,
+                     &printer_name,
+                     &printer_state,
+                     &printer_state_reasons,
+                     &printer_is_accepting_jobs);
+    }
+  else if (g_variant_n_children (parameters) == 11)
+    {
+      g_variant_get (parameters, "(&s&s&su&sbuu&s&su)",
+                     &text,
+                     &printer_uri,
+                     &printer_name,
+                     &printer_state,
+                     &printer_state_reasons,
+                     &printer_is_accepting_jobs,
+                     &job_id,
+                     &job_state,
+                     &job_state_reasons,
+                     &job_name,
+                     &job_impressions_completed);
+    }
+
+  if (g_strcmp0 (signal_name, "PrinterAdded") == 0 ||
+      g_strcmp0 (signal_name, "PrinterDeleted") == 0 ||
+      g_strcmp0 (signal_name, "PrinterStateChanged") == 0 ||
+      g_strcmp0 (signal_name, "PrinterStopped") == 0)
     actualize_printers_list (self);
+  else if (g_strcmp0 (signal_name, "JobCreated") == 0 ||
+           g_strcmp0 (signal_name, "JobCompleted") == 0)
+    {
+      job = g_object_new (PP_TYPE_JOB, "id", job_id, NULL);
+      pp_job_get_attributes_async (job,
+                                   requested_attrs,
+                                   NULL,
+                                   on_get_job_attributes_cb,
+                                   self);
+    }
 }
 
 static gchar *subscription_events[] = {
diff --git a/panels/printers/pp-printer-entry.c b/panels/printers/pp-printer-entry.c
index cc33ed2..136512c 100644
--- a/panels/printers/pp-printer-entry.c
+++ b/panels/printers/pp-printer-entry.c
@@ -390,8 +390,8 @@ remove_printer (GtkButton      *button,
   printer_delete (self->printer_name);
 }
 
-static void
-update_jobs_count (PpPrinterEntry *self)
+void
+pp_printer_entry_update_jobs_count (PpPrinterEntry *self)
 {
   cups_job_t *jobs = NULL;
   gchar *button_label;
@@ -414,6 +414,11 @@ update_jobs_count (PpPrinterEntry *self)
   gtk_button_set_label (GTK_BUTTON (self->show_jobs_dialog_button), button_label);
   gtk_widget_set_sensitive (self->show_jobs_dialog_button, num_jobs > 0);
 
+  if (self->pp_jobs_dialog != NULL)
+    {
+      pp_jobs_dialog_update (self->pp_jobs_dialog);
+    }
+
   g_free (button_label);
 }
 
@@ -707,7 +712,7 @@ pp_printer_entry_new (cups_dest_t  printer,
 
   g_signal_connect (self->supply_drawing_area, "draw", G_CALLBACK (supply_levels_draw_cb), inklevel);
 
-  update_jobs_count (self);
+  pp_printer_entry_update_jobs_count (self);
 
   gtk_widget_set_sensitive (GTK_WIDGET (self->printer_default_checkbutton), self->is_authorized);
   gtk_widget_set_sensitive (GTK_WIDGET (self->remove_printer_menuitem), self->is_authorized);
diff --git a/panels/printers/pp-printer-entry.h b/panels/printers/pp-printer-entry.h
index 87ab996..8f37d80 100644
--- a/panels/printers/pp-printer-entry.h
+++ b/panels/printers/pp-printer-entry.h
@@ -34,4 +34,6 @@ GType       pp_printer_entry_get_type (void);
 PpPrinterEntry *pp_printer_entry_new  (cups_dest_t printer,
                                        gboolean    is_authorized);
 
+void            pp_printer_entry_update_jobs_count (PpPrinterEntry *self);
+
 #endif /* PP_PRINTER_ENTRY_H */


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