X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gio%2Fgsocks5proxy.c;h=d093c81a9e68b91c67cb77e2114eb4a1b18caf81;hb=7a1aaaa1fa02679ecf335a19fffe3f55505921b5;hp=a4da21ef0c846807a392afc5957768db064b66cd;hpb=d8ca6404229e5b64d2bf2e1a3660ad9fe7feefdd;p=platform%2Fupstream%2Fglib.git diff --git a/gio/gsocks5proxy.c b/gio/gsocks5proxy.c index a4da21e..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; @@ -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,52 +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_take_error (data->simple, 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 @@ -637,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, @@ -659,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); } @@ -676,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), @@ -685,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; } @@ -699,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); } } @@ -712,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), @@ -721,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; } @@ -729,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; } @@ -752,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); } } @@ -774,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), @@ -783,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; } @@ -797,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); } } @@ -810,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), @@ -819,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; } @@ -829,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); @@ -857,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 @@ -869,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), @@ -878,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; } @@ -892,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); } } @@ -905,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), @@ -914,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; } @@ -926,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; } @@ -935,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); } } @@ -962,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), @@ -971,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 @@ -986,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), @@ -995,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; } @@ -1003,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); } } @@ -1018,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