X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gio%2Fgsocks5proxy.c;h=d093c81a9e68b91c67cb77e2114eb4a1b18caf81;hb=e55a953642a9e402f4363f9fa347b6061dd78990;hp=431a13a6e074adcf23d45eba5e518f70c45001cc;hpb=63adeda0861a26b38ec0adc76255666554c18951;p=platform%2Fupstream%2Fglib.git diff --git a/gio/gsocks5proxy.c b/gio/gsocks5proxy.c index 431a13a..d093c81 100644 --- a/gio/gsocks5proxy.c +++ b/gio/gsocks5proxy.c @@ -14,9 +14,7 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General - * Public License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place, Suite 330, - * Boston, MA 02111-1307, USA. + * Public License along with this library; if not, see . * * Author: Youness Alaoui SOCKS5_MAX_LEN || plen > SOCKS5_MAX_LEN) { - g_set_error (error, G_IO_ERROR, G_IO_ERROR_PROXY_FAILED, - _("Username or password is too long for SOCKSv5 " - "protocol (max. is %i)."), - SOCKS5_MAX_LEN); + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_PROXY_FAILED, + _("Username or password is too long for SOCKSv5 " + "protocol.")); return FALSE; } @@ -286,9 +283,8 @@ set_connect_msg (guint8 *msg, if (host_len > SOCKS5_MAX_LEN) { g_set_error (error, G_IO_ERROR, G_IO_ERROR_PROXY_FAILED, - _("Hostname '%s' too long for SOCKSv5 protocol " - "(maximum is %i bytes)"), - hostname, SOCKS5_MAX_LEN); + _("Hostname '%s' is too long for SOCKSv5 protocol"), + hostname); return -1; } @@ -349,7 +345,7 @@ parse_connect_reply (const guint8 *data, gint *atype, GError **error) default: g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_PROXY_FAILED, - _("The SOCKSv5 proxy server uses unkown address type.")); + _("The SOCKSv5 proxy server uses unknown address type.")); return FALSE; } break; @@ -399,7 +395,7 @@ parse_connect_reply (const guint8 *data, gint *atype, GError **error) default: /* Unknown error */ g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_PROXY_FAILED, - _("Unkown SOCKSv5 proxy error.")); + _("Unknown SOCKSv5 proxy error.")); return FALSE; break; } @@ -444,7 +440,7 @@ g_socks5_proxy_connect (GProxy *proxy, goto error; } - /* Recieve SOCKS5 response and reply with authentication if required */ + /* Receive SOCKS5 response and reply with authentication if required */ { guint8 data[SOCKS5_NEGO_REP_LEN]; gboolean must_auth = FALSE; @@ -540,7 +536,6 @@ error: typedef struct { - GSimpleAsyncResult *simple; GIOStream *io_stream; gchar *hostname; guint16 port; @@ -549,7 +544,6 @@ typedef struct guint8 *buffer; gssize length; gssize offset; - GCancellable *cancellable; } ConnectAsyncData; static void nego_msg_write_cb (GObject *source, @@ -564,7 +558,7 @@ static void auth_msg_write_cb (GObject *source, static void auth_reply_read_cb (GObject *source, GAsyncResult *result, gpointer user_data); -static void send_connect_msg (ConnectAsyncData *data); +static void send_connect_msg (GTask *task); static void connect_msg_write_cb (GObject *source, GAsyncResult *result, gpointer user_data); @@ -581,54 +575,40 @@ static void connect_addr_read_cb (GObject *source, static void free_connect_data (ConnectAsyncData *data) { - if (data->io_stream) - g_object_unref (data->io_stream); + g_object_unref (data->io_stream); g_free (data->hostname); g_free (data->username); g_free (data->password); g_free (data->buffer); - - if (data->cancellable) - g_object_unref (data->cancellable); g_slice_free (ConnectAsyncData, data); } static void -complete_async_from_error (ConnectAsyncData *data, GError *error) -{ - GSimpleAsyncResult *simple = data->simple; - g_simple_async_result_set_from_error (data->simple, - error); - g_error_free (error); - g_simple_async_result_set_op_res_gpointer (simple, NULL, NULL); - g_simple_async_result_complete (simple); - g_object_unref (simple); -} - -static void -do_read (GAsyncReadyCallback callback, ConnectAsyncData *data) +do_read (GAsyncReadyCallback callback, GTask *task, ConnectAsyncData *data) { GInputStream *in; in = g_io_stream_get_input_stream (data->io_stream); g_input_stream_read_async (in, data->buffer + data->offset, data->length - data->offset, - G_PRIORITY_DEFAULT, data->cancellable, - callback, data); + g_task_get_priority (task), + g_task_get_cancellable (task), + callback, task); } static void -do_write (GAsyncReadyCallback callback, ConnectAsyncData *data) +do_write (GAsyncReadyCallback callback, GTask *task, ConnectAsyncData *data) { GOutputStream *out; out = g_io_stream_get_output_stream (data->io_stream); g_output_stream_write_async (out, data->buffer + data->offset, data->length - data->offset, - G_PRIORITY_DEFAULT, data->cancellable, - callback, data); + g_task_get_priority (task), + g_task_get_cancellable (task), + callback, task); } static void @@ -639,20 +619,14 @@ g_socks5_proxy_connect_async (GProxy *proxy, GAsyncReadyCallback callback, gpointer user_data) { - GSimpleAsyncResult *simple; + GTask *task; ConnectAsyncData *data; - simple = g_simple_async_result_new (G_OBJECT (proxy), - callback, user_data, - g_socks5_proxy_connect_async); - data = g_slice_new0 (ConnectAsyncData); - - data->simple = simple; data->io_stream = g_object_ref (io_stream); - if (cancellable) - data->cancellable = g_object_ref (cancellable); + task = g_task_new (proxy, cancellable, callback, user_data); + g_task_set_task_data (task, data, (GDestroyNotify) free_connect_data); g_object_get (G_OBJECT (proxy_address), "destination-hostname", &data->hostname, @@ -661,15 +635,12 @@ g_socks5_proxy_connect_async (GProxy *proxy, "password", &data->password, NULL); - g_simple_async_result_set_op_res_gpointer (simple, data, - (GDestroyNotify) free_connect_data); - data->buffer = g_malloc0 (SOCKS5_NEGO_MSG_LEN); data->length = set_nego_msg (data->buffer, data->username || data->password); data->offset = 0; - do_write (nego_msg_write_cb, data); + do_write (nego_msg_write_cb, task, data); } @@ -678,8 +649,9 @@ nego_msg_write_cb (GObject *source, GAsyncResult *res, gpointer user_data) { + GTask *task = user_data; + ConnectAsyncData *data = g_task_get_task_data (task); GError *error = NULL; - ConnectAsyncData *data = user_data; gssize written; written = g_output_stream_write_finish (G_OUTPUT_STREAM (source), @@ -687,7 +659,8 @@ nego_msg_write_cb (GObject *source, if (written < 0) { - complete_async_from_error (data, error); + g_task_return_error (task, error); + g_object_unref (task); return; } @@ -701,11 +674,11 @@ nego_msg_write_cb (GObject *source, data->length = SOCKS5_NEGO_REP_LEN; data->offset = 0; - do_read (nego_reply_read_cb, data); + do_read (nego_reply_read_cb, task, data); } else { - do_write (nego_msg_write_cb, data); + do_write (nego_msg_write_cb, task, data); } } @@ -714,8 +687,9 @@ nego_reply_read_cb (GObject *source, GAsyncResult *res, gpointer user_data) { + GTask *task = user_data; + ConnectAsyncData *data = g_task_get_task_data (task); GError *error = NULL; - ConnectAsyncData *data = user_data; gssize read; read = g_input_stream_read_finish (G_INPUT_STREAM (source), @@ -723,7 +697,8 @@ nego_reply_read_cb (GObject *source, if (read < 0) { - complete_async_from_error (data, error); + g_task_return_error (task, error); + g_object_unref (task); return; } @@ -731,13 +706,14 @@ nego_reply_read_cb (GObject *source, if (data->offset == data->length) { - GError *error; + GError *error = NULL; gboolean must_auth = FALSE; gboolean has_auth = data->username || data->password; if (!parse_nego_reply (data->buffer, has_auth, &must_auth, &error)) { - complete_async_from_error (data, error); + g_task_return_error (task, error); + g_object_unref (task); return; } @@ -754,20 +730,21 @@ nego_reply_read_cb (GObject *source, if (data->length < 0) { - complete_async_from_error (data, error); + g_task_return_error (task, error); + g_object_unref (task); return; } - do_write (auth_msg_write_cb, data); + do_write (auth_msg_write_cb, task, data); } else { - send_connect_msg (data); + send_connect_msg (task); } } else { - do_read (nego_reply_read_cb, data); + do_read (nego_reply_read_cb, task, data); } } @@ -776,8 +753,9 @@ auth_msg_write_cb (GObject *source, GAsyncResult *result, gpointer user_data) { + GTask *task = user_data; + ConnectAsyncData *data = g_task_get_task_data (task); GError *error = NULL; - ConnectAsyncData *data = user_data; gssize written; written = g_output_stream_write_finish (G_OUTPUT_STREAM (source), @@ -785,7 +763,8 @@ auth_msg_write_cb (GObject *source, if (written < 0) { - complete_async_from_error (data, error); + g_task_return_error (task, error); + g_object_unref (task); return; } @@ -799,11 +778,11 @@ auth_msg_write_cb (GObject *source, data->length = SOCKS5_NEGO_REP_LEN; data->offset = 0; - do_read (auth_reply_read_cb, data); + do_read (auth_reply_read_cb, task, data); } else { - do_write (auth_msg_write_cb, data); + do_write (auth_msg_write_cb, task, data); } } @@ -812,8 +791,9 @@ auth_reply_read_cb (GObject *source, GAsyncResult *result, gpointer user_data) { + GTask *task = user_data; + ConnectAsyncData *data = g_task_get_task_data (task); GError *error = NULL; - ConnectAsyncData *data = user_data; gssize read; read = g_input_stream_read_finish (G_INPUT_STREAM (source), @@ -821,7 +801,8 @@ auth_reply_read_cb (GObject *source, if (read < 0) { - complete_async_from_error (data, error); + g_task_return_error (task, error); + g_object_unref (task); return; } @@ -831,21 +812,23 @@ auth_reply_read_cb (GObject *source, { if (!check_auth_status (data->buffer, &error)) { - complete_async_from_error (data, error); + g_task_return_error (task, error); + g_object_unref (task); return; } - send_connect_msg (data); + send_connect_msg (task); } else { - do_read (auth_reply_read_cb, data); + do_read (auth_reply_read_cb, task, data); } } static void -send_connect_msg (ConnectAsyncData *data) +send_connect_msg (GTask *task) { + ConnectAsyncData *data = g_task_get_task_data (task); GError *error = NULL; g_free (data->buffer); @@ -859,11 +842,12 @@ send_connect_msg (ConnectAsyncData *data) if (data->length < 0) { - complete_async_from_error (data, error); + g_task_return_error (task, error); + g_object_unref (task); return; } - do_write (connect_msg_write_cb, data); + do_write (connect_msg_write_cb, task, data); } static void @@ -871,8 +855,9 @@ connect_msg_write_cb (GObject *source, GAsyncResult *result, gpointer user_data) { + GTask *task = user_data; + ConnectAsyncData *data = g_task_get_task_data (task); GError *error = NULL; - ConnectAsyncData *data = user_data; gssize written; written = g_output_stream_write_finish (G_OUTPUT_STREAM (source), @@ -880,7 +865,8 @@ connect_msg_write_cb (GObject *source, if (written < 0) { - complete_async_from_error (data, error); + g_task_return_error (task, error); + g_object_unref (task); return; } @@ -894,11 +880,11 @@ connect_msg_write_cb (GObject *source, data->length = 4; data->offset = 0; - do_read (connect_reply_read_cb, data); + do_read (connect_reply_read_cb, task, data); } else { - do_write (connect_msg_write_cb, data); + do_write (connect_msg_write_cb, task, data); } } @@ -907,8 +893,9 @@ connect_reply_read_cb (GObject *source, GAsyncResult *result, gpointer user_data) { + GTask *task = user_data; + ConnectAsyncData *data = g_task_get_task_data (task); GError *error = NULL; - ConnectAsyncData *data = user_data; gssize read; read = g_input_stream_read_finish (G_INPUT_STREAM (source), @@ -916,7 +903,8 @@ connect_reply_read_cb (GObject *source, if (read < 0) { - complete_async_from_error (data, error); + g_task_return_error (task, error); + g_object_unref (task); return; } @@ -928,7 +916,8 @@ connect_reply_read_cb (GObject *source, if (!parse_connect_reply (data->buffer, &atype, &error)) { - complete_async_from_error (data, error); + g_task_return_error (task, error); + g_object_unref (task); return; } @@ -937,25 +926,25 @@ connect_reply_read_cb (GObject *source, case SOCKS5_ATYP_IPV4: data->length = 6; data->offset = 0; - do_read (connect_addr_read_cb, data); + do_read (connect_addr_read_cb, task, data); break; case SOCKS5_ATYP_IPV6: data->length = 18; data->offset = 0; - do_read (connect_addr_read_cb, data); + do_read (connect_addr_read_cb, task, data); break; case SOCKS5_ATYP_DOMAINNAME: data->length = 1; data->offset = 0; - do_read (connect_addr_len_read_cb, data); + do_read (connect_addr_len_read_cb, task, data); break; } } else { - do_read (connect_reply_read_cb, data); + do_read (connect_reply_read_cb, task, data); } } @@ -964,8 +953,9 @@ connect_addr_len_read_cb (GObject *source, GAsyncResult *result, gpointer user_data) { + GTask *task = user_data; + ConnectAsyncData *data = g_task_get_task_data (task); GError *error = NULL; - ConnectAsyncData *data = user_data; gssize read; read = g_input_stream_read_finish (G_INPUT_STREAM (source), @@ -973,14 +963,15 @@ connect_addr_len_read_cb (GObject *source, if (read < 0) { - complete_async_from_error (data, error); + g_task_return_error (task, error); + g_object_unref (task); return; } data->length = data->buffer[0] + 2; data->offset = 0; - do_read (connect_addr_read_cb, data); + do_read (connect_addr_read_cb, task, data); } static void @@ -988,8 +979,9 @@ connect_addr_read_cb (GObject *source, GAsyncResult *result, gpointer user_data) { + GTask *task = user_data; + ConnectAsyncData *data = g_task_get_task_data (task); GError *error = NULL; - ConnectAsyncData *data = user_data; gssize read; read = g_input_stream_read_finish (G_INPUT_STREAM (source), @@ -997,7 +989,8 @@ connect_addr_read_cb (GObject *source, if (read < 0) { - complete_async_from_error (data, error); + g_task_return_error (task, error); + g_object_unref (task); return; } @@ -1005,13 +998,13 @@ connect_addr_read_cb (GObject *source, if (data->offset == data->length) { - GSimpleAsyncResult *simple = data->simple; - g_simple_async_result_complete (simple); - g_object_unref (simple); + g_task_return_pointer (task, g_object_ref (data->io_stream), g_object_unref); + g_object_unref (task); + return; } else { - do_read (connect_reply_read_cb, data); + do_read (connect_reply_read_cb, task, data); } } @@ -1020,13 +1013,7 @@ g_socks5_proxy_connect_finish (GProxy *proxy, GAsyncResult *result, GError **error) { - GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result); - ConnectAsyncData *data = g_simple_async_result_get_op_res_gpointer (simple); - - if (g_simple_async_result_propagate_error (simple, error)) - return NULL; - - return g_object_ref (data->io_stream); + return g_task_propagate_pointer (G_TASK (result), error); } static gboolean