[gnome-control-center] printers: Allow to add AppSocket/HP JetDirect printers
- From: Marek Kašík <mkasik src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-control-center] printers: Allow to add AppSocket/HP JetDirect printers
- Date: Thu, 31 Jul 2014 09:46:27 +0000 (UTC)
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]