printers: Allow adding of JetDirect and LPD printers manually

Check the entered address for AppSocket/HP JetDirect and LPD printers.
If there is a printer found, it has a default name which
will be changed right after user selects model of the printer
in the PPD selection dialog.

https://bugzilla.gnome.org/show_bug.cgi?id=695564
This commit is contained in:
Marek Kasik 2014-07-29 17:26:51 +02:00
parent 7eded1afa5
commit b43f05f740

View file

@ -113,6 +113,8 @@ struct _PpNewPrinterDialogPrivate
GIcon *authenticated_server_icon;
PpHost *snmp_host;
PpHost *socket_host;
PpHost *lpd_host;
PpHost *remote_cups_host;
PpSamba *samba_host;
guint host_search_timeout_id;
@ -615,7 +617,10 @@ add_device_to_list (PpNewPrinterDialog *dialog,
(device->host_name &&
device->acquisition_method == ACQUISITION_METHOD_REMOTE_CUPS_SERVER) ||
device->acquisition_method == ACQUISITION_METHOD_SAMBA_HOST ||
device->acquisition_method == ACQUISITION_METHOD_SAMBA)
device->acquisition_method == ACQUISITION_METHOD_SAMBA ||
(device->device_uri &&
(device->acquisition_method == ACQUISITION_METHOD_JETDIRECT ||
device->acquisition_method == ACQUISITION_METHOD_LPD)))
{
store_device = pp_print_device_copy (device);
g_free (store_device->device_original_name);
@ -694,6 +699,8 @@ update_spinner_state (PpNewPrinterDialog *dialog)
if (priv->cups_searching ||
priv->remote_cups_host != NULL ||
priv->snmp_host != NULL ||
priv->socket_host != NULL ||
priv->lpd_host != NULL ||
priv->samba_host != NULL ||
priv->samba_authenticated_searching ||
priv->samba_searching)
@ -1228,6 +1235,114 @@ get_samba_devices_cb (GObject *source_object,
}
}
static void
get_jetdirect_devices_cb (GObject *source_object,
GAsyncResult *res,
gpointer user_data)
{
PpNewPrinterDialog *dialog;
PpNewPrinterDialogPrivate *priv;
PpHost *host = (PpHost *) source_object;
GError *error = NULL;
PpDevicesList *result;
result = pp_host_get_jetdirect_devices_finish (host, res, &error);
g_object_unref (source_object);
if (result != NULL)
{
dialog = PP_NEW_PRINTER_DIALOG (user_data);
priv = dialog->priv;
if ((gpointer) source_object == (gpointer) priv->socket_host)
priv->socket_host = NULL;
update_spinner_state (dialog);
if (result->devices != NULL)
{
add_devices_to_list (dialog,
result->devices,
FALSE);
}
actualize_devices_list (dialog);
pp_devices_list_free (result);
}
else
{
if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
{
dialog = PP_NEW_PRINTER_DIALOG (user_data);
priv = dialog->priv;
g_warning ("%s", error->message);
if ((gpointer) source_object == (gpointer) priv->socket_host)
priv->socket_host = NULL;
update_spinner_state (dialog);
}
g_error_free (error);
}
}
static void
get_lpd_devices_cb (GObject *source_object,
GAsyncResult *res,
gpointer user_data)
{
PpNewPrinterDialog *dialog;
PpNewPrinterDialogPrivate *priv;
PpHost *host = (PpHost *) source_object;
GError *error = NULL;
PpDevicesList *result;
result = pp_host_get_lpd_devices_finish (host, res, &error);
g_object_unref (source_object);
if (result != NULL)
{
dialog = PP_NEW_PRINTER_DIALOG (user_data);
priv = dialog->priv;
if ((gpointer) source_object == (gpointer) priv->lpd_host)
priv->lpd_host = NULL;
update_spinner_state (dialog);
if (result->devices != NULL)
{
add_devices_to_list (dialog,
result->devices,
FALSE);
}
actualize_devices_list (dialog);
pp_devices_list_free (result);
}
else
{
if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
{
dialog = PP_NEW_PRINTER_DIALOG (user_data);
priv = dialog->priv;
g_warning ("%s", error->message);
if ((gpointer) source_object == (gpointer) priv->lpd_host)
priv->lpd_host = NULL;
update_spinner_state (dialog);
}
g_error_free (error);
}
}
static void
get_cups_devices (PpNewPrinterDialog *dialog)
{
@ -1243,6 +1358,7 @@ get_cups_devices (PpNewPrinterDialog *dialog)
static gboolean
parse_uri (const gchar *uri,
gchar **scheme,
gchar **host,
gint *port)
{
@ -1252,10 +1368,16 @@ parse_uri (const gchar *uri,
*port = PP_HOST_UNSET_PORT;
if (g_strrstr (uri, "://"))
tmp = g_strrstr (uri, "://") + 3;
position = g_strrstr (uri, "://");
if (position != NULL)
{
*scheme = g_strndup (uri, position - uri);
tmp = position + 3;
}
else
tmp = uri;
{
tmp = uri;
}
if (g_strrstr (tmp, "@"))
tmp = g_strrstr (tmp, "@") + 1;
@ -1267,7 +1389,9 @@ parse_uri (const gchar *uri,
*position = '/';
}
else
resulting_host = g_strdup (tmp);
{
resulting_host = g_strdup (tmp);
}
if ((position = g_strrstr (resulting_host, ":")))
{
@ -1283,6 +1407,7 @@ parse_uri (const gchar *uri,
typedef struct
{
PpNewPrinterDialog *dialog;
gchar *host_scheme;
gchar *host_name;
gint host_port;
} THostSearchData;
@ -1290,6 +1415,7 @@ typedef struct
static void
search_for_remote_printers_free (THostSearchData *data)
{
g_free (data->host_scheme);
g_free (data->host_name);
g_free (data);
}
@ -1309,11 +1435,24 @@ search_for_remote_printers (THostSearchData *data)
priv->remote_cups_host = pp_host_new (data->host_name);
priv->snmp_host = pp_host_new (data->host_name);
priv->socket_host = pp_host_new (data->host_name);
priv->lpd_host = pp_host_new (data->host_name);
if (data->host_port != PP_HOST_UNSET_PORT)
{
g_object_set (priv->remote_cups_host, "port", data->host_port, NULL);
g_object_set (priv->snmp_host, "port", data->host_port, NULL);
/* Accept port different from the default one only if user specifies
* scheme (for socket and lpd printers).
*/
if (data->host_scheme != NULL &&
g_ascii_strcasecmp (data->host_scheme, "socket") == 0)
g_object_set (priv->socket_host, "port", data->host_port, NULL);
if (data->host_scheme != NULL &&
g_ascii_strcasecmp (data->host_scheme, "lpd") == 0)
g_object_set (priv->lpd_host, "port", data->host_port, NULL);
}
priv->samba_host = pp_samba_new (GTK_WINDOW (priv->dialog),
@ -1331,6 +1470,16 @@ search_for_remote_printers (THostSearchData *data)
get_snmp_devices_cb,
data->dialog);
pp_host_get_jetdirect_devices_async (priv->socket_host,
priv->remote_host_cancellable,
get_jetdirect_devices_cb,
data->dialog);
pp_host_get_lpd_devices_async (priv->lpd_host,
priv->remote_host_cancellable,
get_lpd_devices_cb,
data->dialog);
pp_samba_get_devices_async (priv->samba_host,
TRUE,
priv->remote_host_cancellable,
@ -1412,6 +1561,8 @@ search_address (const gchar *text,
if (device->acquisition_method == ACQUISITION_METHOD_REMOTE_CUPS_SERVER ||
device->acquisition_method == ACQUISITION_METHOD_SNMP ||
device->acquisition_method == ACQUISITION_METHOD_JETDIRECT ||
device->acquisition_method == ACQUISITION_METHOD_LPD ||
device->acquisition_method == ACQUISITION_METHOD_SAMBA_HOST)
{
tmp = iter;
@ -1430,6 +1581,8 @@ search_address (const gchar *text,
if (device->acquisition_method == ACQUISITION_METHOD_REMOTE_CUPS_SERVER ||
device->acquisition_method == ACQUISITION_METHOD_SNMP ||
device->acquisition_method == ACQUISITION_METHOD_JETDIRECT ||
device->acquisition_method == ACQUISITION_METHOD_LPD ||
device->acquisition_method == ACQUISITION_METHOD_SAMBA_HOST)
{
tmp = iter;
@ -1443,16 +1596,18 @@ search_address (const gchar *text,
if (text && text[0] != '\0')
{
gchar *scheme = NULL;
gchar *host = NULL;
gint port;
parse_uri (text, &host, &port);
parse_uri (text, &scheme, &host, &port);
if (host)
{
THostSearchData *search_data;
search_data = g_new (THostSearchData, 1);
search_data->host_scheme = scheme;
search_data->host_name = host;
search_data->host_port = port;
search_data->dialog = dialog;
@ -1568,6 +1723,9 @@ actualize_devices_list (PpNewPrinterDialog *dialog)
device->device_ppd ||
(device->host_name &&
device->acquisition_method == ACQUISITION_METHOD_REMOTE_CUPS_SERVER) ||
(device->device_uri &&
(device->acquisition_method == ACQUISITION_METHOD_JETDIRECT ||
device->acquisition_method == ACQUISITION_METHOD_LPD)) ||
device->acquisition_method == ACQUISITION_METHOD_SAMBA_HOST ||
device->acquisition_method == ACQUISITION_METHOD_SAMBA) &&
device->show)
@ -1621,6 +1779,8 @@ actualize_devices_list (PpNewPrinterDialog *dialog)
!priv->cups_searching &&
priv->remote_cups_host == NULL &&
priv->snmp_host == NULL &&
priv->socket_host == NULL &&
priv->lpd_host == NULL &&
priv->samba_host == NULL &&
!priv->samba_authenticated_searching &&
!priv->samba_searching)
@ -1838,9 +1998,12 @@ ppd_selection_cb (GtkDialog *_dialog,
PpNewPrinterDialogPrivate *priv = dialog->priv;
PpNewPrinter *new_printer;
gchar *ppd_name;
gchar *ppd_display_name;
gchar *printer_name;
guint window_id = 0;
ppd_name = pp_ppd_selection_dialog_get_ppd_name (priv->ppd_selection_dialog);
ppd_display_name = pp_ppd_selection_dialog_get_ppd_display_name (priv->ppd_selection_dialog);
pp_ppd_selection_dialog_free (priv->ppd_selection_dialog);
priv->ppd_selection_dialog = NULL;
@ -1848,6 +2011,29 @@ ppd_selection_cb (GtkDialog *_dialog,
{
priv->new_device->device_ppd = ppd_name;
if ((priv->new_device->acquisition_method == ACQUISITION_METHOD_JETDIRECT ||
priv->new_device->acquisition_method == ACQUISITION_METHOD_LPD) &&
ppd_display_name != NULL)
{
g_free (priv->new_device->device_name);
g_free (priv->new_device->device_original_name);
priv->new_device->device_name = g_strdup (ppd_display_name);
priv->new_device->device_original_name = g_strdup (ppd_display_name);
printer_name = canonicalize_device_name (priv->devices,
priv->new_devices,
priv->dests,
priv->num_of_dests,
priv->new_device);
g_free (priv->new_device->device_name);
g_free (priv->new_device->device_original_name);
priv->new_device->device_name = printer_name;
priv->new_device->device_original_name = g_strdup (printer_name);
}
emit_pre_response (dialog,
priv->new_device->device_name,
priv->new_device->device_location,
@ -1859,7 +2045,7 @@ ppd_selection_cb (GtkDialog *_dialog,
new_printer = pp_new_printer_new ();
g_object_set (new_printer,
"name", priv->new_device->device_name,
"original-name""", priv->new_device->device_original_name,
"original-name", priv->new_device->device_original_name,
"device-uri", priv->new_device->device_uri,
"device-id", priv->new_device->device_id,
"ppd-name", priv->new_device->device_ppd,
@ -1934,7 +2120,9 @@ new_printer_dialog_response_cb (GtkDialog *_dialog,
guint window_id = 0;
if (device->acquisition_method == ACQUISITION_METHOD_SAMBA ||
device->acquisition_method == ACQUISITION_METHOD_SAMBA_HOST)
device->acquisition_method == ACQUISITION_METHOD_SAMBA_HOST ||
device->acquisition_method == ACQUISITION_METHOD_JETDIRECT ||
device->acquisition_method == ACQUISITION_METHOD_LPD)
{
priv->new_device = pp_print_device_copy (device);
priv->ppd_selection_dialog =