[gnome-control-center] printers: Allow to add AppSocket/HP JetDirect printers



commit 89fe4eda12e02cd5d9525d6bc33fe7d09884e9ce
Author: Marek Kasik <mkasik redhat com>
Date:   Mon Jul 21 10:49:37 2014 +0200

    printers: Allow to add AppSocket/HP JetDirect printers
    
    Add pp_host_get_socket_devices_async() and
    pp_host_get_socket_devices_finish() functions to PpHost class.
    pp_host_get_socket_devices_async() starts searching for socket printer
    on given address.
    The test consist in connection to the default port 9100 (or the one
    given by creator of PpHost) of the address.
    We suppose that there is an AppSocket/HP JetDirect printer on the address
    if the connection succeeds.
    
    See these links for additional info:
    http://en.wikipedia.org/wiki/JetDirect
    http://www.cups.org/documentation.php/network.html
    
    https://bugzilla.gnome.org/show_bug.cgi?id=695564

 panels/printers/pp-host.c  |  129 ++++++++++++++++++++++++++++++++++++++++++++
 panels/printers/pp-host.h  |   14 ++++-
 panels/printers/pp-utils.h |    3 +-
 3 files changed, 143 insertions(+), 3 deletions(-)
---
diff --git a/panels/printers/pp-host.c b/panels/printers/pp-host.c
index fbbcecb..4ce6652 100644
--- a/panels/printers/pp-host.c
+++ b/panels/printers/pp-host.c
@@ -20,6 +20,8 @@
 
 #include "pp-host.h"
 
+#include <glib/gi18n.h>
+
 struct _PpHostPrivate
 {
   gchar *hostname;
@@ -448,3 +450,130 @@ pp_host_get_remote_cups_devices_finish (PpHost        *host,
 
   return result;
 }
+
+typedef struct
+{
+  PpDevicesList *devices;
+  PpHost        *host;
+  gint           port;
+} JetDirectData;
+
+static void
+jetdirect_data_free (JetDirectData *data)
+{
+  if (data != NULL)
+    {
+      pp_devices_list_free (data->devices);
+      g_clear_object (&data->host);
+      g_free (data);
+    }
+}
+
+static void
+jetdirect_connection_test_cb (GObject      *source_object,
+                              GAsyncResult *res,
+                              gpointer      user_data)
+{
+  GSocketConnection *connection;
+  PpHostPrivate     *priv;
+  PpPrintDevice     *device;
+  JetDirectData     *data;
+  gpointer           result;
+  GError            *error = NULL;
+  GTask             *task = G_TASK (user_data);
+
+  data = g_task_get_task_data (task);
+
+  connection = g_socket_client_connect_to_host_finish (G_SOCKET_CLIENT (source_object),
+                                                       res,
+                                                       &error);
+
+  if (connection != NULL)
+    {
+      g_io_stream_close (G_IO_STREAM (connection), NULL, NULL);
+      g_object_unref (connection);
+
+      priv = data->host->priv;
+
+      device = g_new0 (PpPrintDevice, 1);
+      device->device_class = g_strdup ("network");
+      device->device_uri = g_strdup_printf ("socket://%s:%d",
+                                            priv->hostname,
+                                            data->port);
+      /* Translators: The found device is a JetDirect printer */
+      device->device_name = g_strdup (_("JetDirect Printer"));
+      device->host_name = g_strdup (priv->hostname);
+      device->host_port = data->port;
+      device->acquisition_method = ACQUISITION_METHOD_JETDIRECT;
+
+      data->devices->devices = g_list_append (data->devices->devices, device);
+    }
+
+  result = data->devices;
+  data->devices = NULL;
+  g_task_return_pointer (task, result, (GDestroyNotify) pp_devices_list_free);
+  g_object_unref (task);
+}
+
+/* Test whether given host has an AppSocket/HP JetDirect printer connected.
+   See http://en.wikipedia.org/wiki/JetDirect
+       http://www.cups.org/documentation.php/network.html */
+void
+pp_host_get_jetdirect_devices_async (PpHost              *host,
+                                     GCancellable        *cancellable,
+                                     GAsyncReadyCallback  callback,
+                                     gpointer             user_data)
+{
+  PpHostPrivate *priv = host->priv;
+  GSocketClient *client;
+  JetDirectData *data;
+  GTask         *task;
+  gchar         *address;
+  gpointer       result;
+
+  data = g_new0 (JetDirectData, 1);
+  data->host = g_object_ref (host);
+  data->devices = g_new0 (PpDevicesList, 1);
+
+  if (priv->port == PP_HOST_UNSET_PORT)
+    data->port = PP_HOST_DEFAULT_JETDIRECT_PORT;
+  else
+    data->port = priv->port;
+
+  task = g_task_new (G_OBJECT (host), cancellable, callback, user_data);
+  g_task_set_task_data (task, data, (GDestroyNotify) jetdirect_data_free);
+
+  address = g_strdup_printf ("%s:%d", priv->hostname, data->port);
+  if (address != NULL && address[0] != '/')
+    {
+      client = g_socket_client_new ();
+
+      g_socket_client_connect_to_host_async (client,
+                                             address,
+                                             data->port,
+                                             cancellable,
+                                             jetdirect_connection_test_cb,
+                                             task);
+
+      g_object_unref (client);
+    }
+  else
+    {
+      result = data->devices;
+      data->devices = NULL;
+      g_task_return_pointer (task, result, (GDestroyNotify) pp_devices_list_free);
+      g_object_unref (task);
+    }
+
+  g_free (address);
+}
+
+PpDevicesList *
+pp_host_get_jetdirect_devices_finish (PpHost        *host,
+                                      GAsyncResult  *res,
+                                      GError       **error)
+{
+  g_return_val_if_fail (g_task_is_valid (res, host), NULL);
+
+  return g_task_propagate_pointer (G_TASK (res), error);
+}
diff --git a/panels/printers/pp-host.h b/panels/printers/pp-host.h
index d701834..b5347a5 100644
--- a/panels/printers/pp-host.h
+++ b/panels/printers/pp-host.h
@@ -34,8 +34,9 @@ G_BEGIN_DECLS
 #define PP_IS_HOST_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), PP_TYPE_HOST))
 #define PP_HOST_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), PP_TYPE_HOST, PpHostClass))
 
-#define PP_HOST_UNSET_PORT        -1
-#define PP_HOST_DEFAULT_IPP_PORT 631
+#define PP_HOST_UNSET_PORT               -1
+#define PP_HOST_DEFAULT_IPP_PORT        631
+#define PP_HOST_DEFAULT_JETDIRECT_PORT 9100
 
 typedef struct _PpHost        PpHost;
 typedef struct _PpHostClass   PpHostClass;
@@ -74,6 +75,15 @@ PpDevicesList *pp_host_get_remote_cups_devices_finish (PpHost               *hos
                                                        GAsyncResult         *result,
                                                        GError              **error);
 
+void           pp_host_get_jetdirect_devices_async    (PpHost               *host,
+                                                       GCancellable         *cancellable,
+                                                       GAsyncReadyCallback   callback,
+                                                       gpointer              user_data);
+
+PpDevicesList *pp_host_get_jetdirect_devices_finish   (PpHost               *host,
+                                                       GAsyncResult         *result,
+                                                       GError              **error);
+
 G_END_DECLS
 
 #endif /* __PP_HOST_H__ */
diff --git a/panels/printers/pp-utils.h b/panels/printers/pp-utils.h
index 0274fae..cd7a515 100644
--- a/panels/printers/pp-utils.h
+++ b/panels/printers/pp-utils.h
@@ -53,7 +53,8 @@ enum
   ACQUISITION_METHOD_REMOTE_CUPS_SERVER,
   ACQUISITION_METHOD_SNMP,
   ACQUISITION_METHOD_SAMBA,
-  ACQUISITION_METHOD_SAMBA_HOST
+  ACQUISITION_METHOD_SAMBA_HOST,
+  ACQUISITION_METHOD_JETDIRECT
 };
 
 typedef struct


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