]> git.0d.be Git - empathy.git/blobdiff - libempathy/empathy-dispatch-operation.c
empathy-tp-tube: remove initiator and type member variables as they are not used
[empathy.git] / libempathy / empathy-dispatch-operation.c
index 7c307945238cfddf92ec484c4b4b7f2353e2e45b..1786e4169039c37a110ea3116c26613ef4782a91 100644 (file)
@@ -30,6 +30,8 @@
 
 #include "empathy-marshal.h"
 
+#include "extensions/extensions.h"
+
 #define DEBUG_FLAG EMPATHY_DEBUG_DISPATCHER
 #include <libempathy/empathy-debug.h>
 
@@ -82,6 +84,7 @@ struct _EmpathyDispatchOperationPriv
   gboolean incoming;
   gboolean approved;
   gulong invalidated_handler;
+  gulong ready_handler;
 };
 
 #define GET_PRIV(o)  \
@@ -234,7 +237,7 @@ empathy_dispatch_operation_class_init (
       0,
       NULL, NULL,
       _empathy_marshal_VOID__UINT_INT_STRING,
-      G_TYPE_NONE, 0);
+      G_TYPE_NONE, 3, G_TYPE_UINT, G_TYPE_INT, G_TYPE_STRING);
 
   param_spec = g_param_spec_object ("connection",
     "connection", "The telepathy connection",
@@ -295,9 +298,18 @@ empathy_dispatch_operation_dispose (GObject *object)
 
   g_object_unref (priv->connection);
 
+  if (priv->channel_wrapper != NULL)
+    g_object_unref (priv->channel_wrapper);
+
+  if (priv->ready_handler != 0)
+    g_signal_handler_disconnect (priv->channel_wrapper,
+      priv->invalidated_handler);
+
+
   g_signal_handler_disconnect (priv->channel, priv->invalidated_handler);
   g_object_unref (priv->channel);
 
+
   if (priv->contact != NULL)
     g_object_unref (priv->contact);
 
@@ -335,6 +347,23 @@ empathy_dispatch_operation_set_status (EmpathyDispatchOperation *self,
     }
 }
 
+static void
+empathy_dispatcher_operation_tp_chat_ready_cb (GObject *object,
+  GParamSpec *spec, gpointer user_data)
+{
+  EmpathyDispatchOperation *self = EMPATHY_DISPATCH_OPERATION (user_data);
+  EmpathyDispatchOperationPriv *priv = GET_PRIV (self);
+
+  if (!empathy_tp_chat_is_ready (EMPATHY_TP_CHAT (priv->channel_wrapper)))
+    return;
+
+  g_signal_handler_disconnect (priv->channel_wrapper, priv->ready_handler);
+  priv->ready_handler = 0;
+
+  empathy_dispatch_operation_set_status (self,
+    EMPATHY_DISPATCHER_OPERATION_STATE_PENDING);
+}
+
 static void
 empathy_dispatch_operation_channel_ready_cb (TpChannel *channel,
   const GError *error, gpointer user_data)
@@ -343,10 +372,15 @@ empathy_dispatch_operation_channel_ready_cb (TpChannel *channel,
   EmpathyDispatchOperationPriv *priv = GET_PRIV (self);
   GQuark channel_type;
 
+  /* The error will be handled in empathy_dispatch_operation_invalidated */
+  if (error != NULL)
+    return;
+
   g_assert (channel == priv->channel);
 
+  /* If the channel wrapper is defined, we assume it's ready */
   if (priv->channel_wrapper != NULL)
-    goto out;
+    goto ready;
 
   channel_type = tp_channel_get_channel_type_id (channel);
 
@@ -354,19 +388,28 @@ empathy_dispatch_operation_channel_ready_cb (TpChannel *channel,
     {
       EmpathyTpChat *chat= empathy_tp_chat_new (channel);
       priv->channel_wrapper = G_OBJECT (chat);
+
+      if (!empathy_tp_chat_is_ready (chat))
+        {
+          priv->ready_handler = g_signal_connect (chat, "notify::ready",
+            G_CALLBACK (empathy_dispatcher_operation_tp_chat_ready_cb), self);
+          return;
+        }
+
     }
   else if (channel_type == TP_IFACE_QUARK_CHANNEL_TYPE_STREAMED_MEDIA)
     {
        EmpathyTpCall *call = empathy_tp_call_new (channel);
        priv->channel_wrapper = G_OBJECT (call);
+
     }
-  else if (channel_type == EMP_IFACE_QUARK_CHANNEL_TYPE_FILE_TRANSFER)
+  else if (channel_type == TP_IFACE_QUARK_CHANNEL_TYPE_FILE_TRANSFER)
     {
        EmpathyTpFile *file = empathy_tp_file_new (channel);
        priv->channel_wrapper = G_OBJECT (file);
     }
 
-out:
+ready:
   empathy_dispatch_operation_set_status (self,
     EMPATHY_DISPATCHER_OPERATION_STATE_PENDING);
 }
@@ -400,7 +443,12 @@ empathy_dispatch_operation_new_with_wrapper (TpConnection *connection,
 void
 empathy_dispatch_operation_start (EmpathyDispatchOperation *operation)
 {
-  EmpathyDispatchOperationPriv *priv = GET_PRIV (operation);
+  EmpathyDispatchOperationPriv *priv;
+
+  g_return_if_fail (EMPATHY_IS_DISPATCH_OPERATION (operation));
+
+  priv = GET_PRIV (operation);
+
   g_return_if_fail (
     priv->status == EMPATHY_DISPATCHER_OPERATION_STATE_PENDING);
 
@@ -415,7 +463,11 @@ empathy_dispatch_operation_start (EmpathyDispatchOperation *operation)
 void
 empathy_dispatch_operation_approve (EmpathyDispatchOperation *operation)
 {
-  EmpathyDispatchOperationPriv *priv = GET_PRIV (operation);
+  EmpathyDispatchOperationPriv *priv;
+
+  g_return_if_fail (EMPATHY_IS_DISPATCH_OPERATION (operation));
+
+  priv = GET_PRIV (operation);
 
   if (priv->status == EMPATHY_DISPATCHER_OPERATION_STATE_APPROVING)
     {
@@ -427,19 +479,29 @@ empathy_dispatch_operation_approve (EmpathyDispatchOperation *operation)
 
       g_signal_emit (operation, signals[APPROVED], 0);
     }
-  else
+  else if (priv->status < EMPATHY_DISPATCHER_OPERATION_STATE_APPROVING)
     {
       DEBUG ("Pre-approving operation %s",
         empathy_dispatch_operation_get_object_path (operation));
       priv->approved = TRUE;
     }
+  else
+    {
+      DEBUG (
+        "Ignoring approval for %s as it's already past the approval stage",
+        empathy_dispatch_operation_get_object_path (operation));
+    }
 }
 
 /* Returns whether or not the operation was successfully claimed */
 gboolean
 empathy_dispatch_operation_claim (EmpathyDispatchOperation *operation)
 {
-  EmpathyDispatchOperationPriv *priv = GET_PRIV (operation);
+  EmpathyDispatchOperationPriv *priv;
+
+  g_return_val_if_fail (EMPATHY_IS_DISPATCH_OPERATION (operation), FALSE);
+
+  priv = GET_PRIV (operation);
 
   if (priv->status == EMPATHY_DISPATCHER_OPERATION_STATE_CLAIMED)
     return FALSE;
@@ -456,7 +518,11 @@ TpConnection *
 empathy_dispatch_operation_get_tp_connection (
   EmpathyDispatchOperation *operation)
 {
-  EmpathyDispatchOperationPriv *priv = GET_PRIV (operation);
+  EmpathyDispatchOperationPriv *priv;
+
+  g_return_val_if_fail (EMPATHY_IS_DISPATCH_OPERATION (operation), NULL);
+
+  priv = GET_PRIV (operation);
 
   return g_object_ref (priv->connection);
 }
@@ -464,19 +530,24 @@ empathy_dispatch_operation_get_tp_connection (
 TpChannel *
 empathy_dispatch_operation_get_channel (EmpathyDispatchOperation *operation)
 {
-  EmpathyDispatchOperationPriv *priv = GET_PRIV (operation);
+  EmpathyDispatchOperationPriv *priv;
+
+  g_return_val_if_fail (EMPATHY_IS_DISPATCH_OPERATION (operation), NULL);
 
-  return TP_CHANNEL (g_object_ref (priv->channel));
+  priv = GET_PRIV (operation);
+
+  return priv->channel;
 }
 
 GObject *
 empathy_dispatch_operation_get_channel_wrapper (
   EmpathyDispatchOperation *operation)
 {
-  EmpathyDispatchOperationPriv *priv = GET_PRIV (operation);
+  EmpathyDispatchOperationPriv *priv;
 
-  if (priv->channel_wrapper != NULL)
-    g_object_ref (priv->channel_wrapper);
+  g_return_val_if_fail (EMPATHY_IS_DISPATCH_OPERATION (operation), NULL);
+
+  priv = GET_PRIV (operation);
 
   return priv->channel_wrapper;
 }
@@ -485,7 +556,11 @@ const gchar *
 empathy_dispatch_operation_get_channel_type (
   EmpathyDispatchOperation *operation)
 {
-  EmpathyDispatchOperationPriv *priv = GET_PRIV (operation);
+  EmpathyDispatchOperationPriv *priv;
+
+  g_return_val_if_fail (EMPATHY_IS_DISPATCH_OPERATION (operation), NULL);
+
+  priv = GET_PRIV (operation);
 
   return tp_channel_get_channel_type (priv->channel);
 }
@@ -494,7 +569,11 @@ GQuark
 empathy_dispatch_operation_get_channel_type_id (
   EmpathyDispatchOperation *operation)
 {
-  EmpathyDispatchOperationPriv *priv = GET_PRIV (operation);
+  EmpathyDispatchOperationPriv *priv;
+
+  g_return_val_if_fail (EMPATHY_IS_DISPATCH_OPERATION (operation), 0);
+
+  priv = GET_PRIV (operation);
 
   return tp_channel_get_channel_type_id (priv->channel);
 }
@@ -503,7 +582,11 @@ const gchar *
 empathy_dispatch_operation_get_object_path (
   EmpathyDispatchOperation *operation)
 {
-  EmpathyDispatchOperationPriv *priv = GET_PRIV (operation);
+  EmpathyDispatchOperationPriv *priv;
+
+  g_return_val_if_fail (EMPATHY_IS_DISPATCH_OPERATION (operation), NULL);
+
+  priv = GET_PRIV (operation);
 
   return tp_proxy_get_object_path (TP_PROXY (priv->channel));
 }
@@ -511,7 +594,12 @@ empathy_dispatch_operation_get_object_path (
 EmpathyDispatchOperationState
 empathy_dispatch_operation_get_status (EmpathyDispatchOperation *operation)
 {
-  EmpathyDispatchOperationPriv *priv = GET_PRIV (operation);
+  EmpathyDispatchOperationPriv *priv;
+
+  g_return_val_if_fail (EMPATHY_IS_DISPATCH_OPERATION (operation),
+    EMPATHY_DISPATCHER_OPERATION_STATE_PREPARING);
+
+  priv = GET_PRIV (operation);
 
   return priv->status;
 }
@@ -519,7 +607,11 @@ empathy_dispatch_operation_get_status (EmpathyDispatchOperation *operation)
 gboolean
 empathy_dispatch_operation_is_incoming (EmpathyDispatchOperation *operation)
 {
-  EmpathyDispatchOperationPriv *priv = GET_PRIV (operation);
+  EmpathyDispatchOperationPriv *priv;
+
+  g_return_val_if_fail (EMPATHY_IS_DISPATCH_OPERATION (operation), FALSE);
+
+  priv = GET_PRIV (operation);
 
   return priv->incoming;
 }