From 8f169336e681a4dc5e7f9ded5e5ac46aaa001157 Mon Sep 17 00:00:00 2001 From: Marek Kasik Date: Tue, 8 Oct 2019 18:04:30 +0200 Subject: [PATCH] printers: Provide a scheme to address parser Add a scheme to the address which we test for correctness by g_network_address_parse_uri(). It does not work without it. Use "none" scheme if user did not entered one. Use port number 0 if user did not specify any. Fixes #679 --- panels/printers/pp-new-printer-dialog.c | 66 +++++++++++++++---------- 1 file changed, 40 insertions(+), 26 deletions(-) diff --git a/panels/printers/pp-new-printer-dialog.c b/panels/printers/pp-new-printer-dialog.c index 651c0d8f3..81a4cc1f6 100644 --- a/panels/printers/pp-new-printer-dialog.c +++ b/panels/printers/pp-new-printer-dialog.c @@ -1607,43 +1607,57 @@ search_address (const gchar *text, if (text && text[0] != '\0') { - g_autoptr(GSocketConnectable) conn; + g_autoptr(GSocketConnectable) conn = NULL; + g_autofree gchar *test_uri = NULL; + g_autofree gchar *test_port = NULL; gchar *scheme = NULL; gchar *host = NULL; gint port; parse_uri (text, &scheme, &host, &port); - conn = g_network_address_parse_uri (host, port, NULL); - - if (host != NULL && conn != NULL) + if (host != NULL) { - THostSearchData *search_data; + if (port >= 0) + test_port = g_strdup_printf (":%d", port); + else + test_port = g_strdup (""); - search_data = g_new (THostSearchData, 1); - search_data->host_scheme = scheme; - search_data->host_name = host; - search_data->host_port = port; - search_data->dialog = self; + test_uri = g_strdup_printf ("%s://%s%s", + scheme != NULL && scheme[0] != '\0' ? scheme : "none", + host, + test_port); - if (self->host_search_timeout_id != 0) + conn = g_network_address_parse_uri (test_uri, 0, NULL); + if (conn != NULL) { - g_source_remove (self->host_search_timeout_id); - self->host_search_timeout_id = 0; - } + THostSearchData *search_data; - if (delay_search) - { - self->host_search_timeout_id = g_timeout_add_full (G_PRIORITY_DEFAULT, - HOST_SEARCH_DELAY, - (GSourceFunc) search_for_remote_printers, - search_data, - (GDestroyNotify) search_for_remote_printers_free); - } - else - { - search_for_remote_printers (search_data); - search_for_remote_printers_free (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 = self; + + if (self->host_search_timeout_id != 0) + { + g_source_remove (self->host_search_timeout_id); + self->host_search_timeout_id = 0; + } + + if (delay_search) + { + self->host_search_timeout_id = g_timeout_add_full (G_PRIORITY_DEFAULT, + HOST_SEARCH_DELAY, + (GSourceFunc) search_for_remote_printers, + search_data, + (GDestroyNotify) search_for_remote_printers_free); + } + else + { + search_for_remote_printers (search_data); + search_for_remote_printers_free (search_data); + } } } } -- 2.21.0