[kdbus] Fix problem with receiving async messages
[platform/upstream/glib.git] / gio / gsocks4aproxy.c
index 91ca29d..d54a816 100644 (file)
@@ -13,9 +13,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 <http://www.gnu.org/licenses/>.
  *
  * Author: Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
  */
@@ -26,7 +24,6 @@
 
 #include <string.h>
 
-#include "gasyncresult.h"
 #include "giomodule.h"
 #include "giomodule-priv.h"
 #include "giostream.h"
@@ -36,7 +33,7 @@
 #include "goutputstream.h"
 #include "gproxy.h"
 #include "gproxyaddress.h"
-#include "gsimpleasyncresult.h"
+#include "gtask.h"
 
 #define SOCKS4_VERSION           4
 
@@ -135,9 +132,8 @@ set_connect_msg (guint8      *msg,
 
       if (user_len > SOCKS4_MAX_LEN)
        {
-         g_set_error (error, G_IO_ERROR, G_IO_ERROR_PROXY_FAILED,
-                      _("SOCKSv4 implementation limits username to %i characters"),
-                      SOCKS4_MAX_LEN);
+         g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_PROXY_FAILED,
+                              _("Username is too long for SOCKSv4 protocol"));
          return -1;
        }
 
@@ -154,8 +150,8 @@ set_connect_msg (guint8      *msg,
       if (host_len > SOCKS4_MAX_LEN)
        {
          g_set_error (error, G_IO_ERROR, G_IO_ERROR_PROXY_FAILED,
-                      _("SOCKSv4a implementation limits hostname to %i characters"),
-                      SOCKS4_MAX_LEN);
+                      _("Hostname '%s' is too long for SOCKSv4 protocol"),
+                      hostname);
          return -1;
        }
 
@@ -250,10 +246,7 @@ error:
 
 typedef struct
 {
-  GSimpleAsyncResult *simple;
   GIOStream *io_stream;
-  GProxyAddress *proxy_address;
-  GCancellable *cancellable;
 
   /* For connecting */
   guint8 *buffer;
@@ -272,50 +265,34 @@ static void connect_reply_read_cb     (GObject          *source,
 static void
 free_connect_data (ConnectAsyncData *data)
 {
-  if (data->io_stream)
-    g_object_unref (data->io_stream);
-  
-  if (data->proxy_address)
-    g_object_unref (data->proxy_address);
-
-  if (data->cancellable)
-    g_object_unref (data->cancellable);
-
+  g_object_unref (data->io_stream);
   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);
 }
 
 
@@ -329,26 +306,17 @@ g_socks4a_proxy_connect_async (GProxy               *proxy,
                               gpointer              user_data)
 {
   GError *error = NULL;
-  GSimpleAsyncResult *simple;
+  GTask *task;
   ConnectAsyncData *data;
   const gchar *hostname;
   guint16 port;
   const gchar *username;
 
-  simple = g_simple_async_result_new (G_OBJECT (proxy),
-                                     callback, user_data,
-                                     g_socks4a_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);
-
-  g_simple_async_result_set_op_res_gpointer (simple, data, 
-                                            (GDestroyNotify) free_connect_data);
+  task = g_task_new (proxy, cancellable, callback, user_data);
+  g_task_set_task_data (task, data, (GDestroyNotify) free_connect_data);
 
   hostname = g_proxy_address_get_destination_hostname (proxy_address);
   port = g_proxy_address_get_destination_port (proxy_address);
@@ -362,14 +330,12 @@ g_socks4a_proxy_connect_async (GProxy               *proxy,
 
   if (data->length < 0)
     {
-      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_in_idle (simple);
-      g_object_unref (simple);
+      g_task_return_error (task, error);
+      g_object_unref (task);
     }
   else
     {
-      do_write (connect_msg_write_cb, data);
+      do_write (connect_msg_write_cb, task, data);
     }
 }
 
@@ -378,8 +344,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),
@@ -387,7 +354,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;
     }
 
@@ -401,11 +369,11 @@ connect_msg_write_cb (GObject      *source,
       data->length = SOCKS4_CONN_REP_LEN;
       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);
     }
 }
 
@@ -414,8 +382,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),
@@ -423,7 +392,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;
     }
 
@@ -433,18 +403,20 @@ connect_reply_read_cb (GObject       *source,
     {
       if (!parse_connect_reply (data->buffer, &error))
        {
-         complete_async_from_error (data, error);
+         g_task_return_error (task, error);
+         g_object_unref (task);
+         return;
        }
       else
        {
-         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);
     }
 }
 
@@ -457,13 +429,7 @@ g_socks4a_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