#include "empathy-marshal.h"
+#include "extensions/extensions.h"
+
#define DEBUG_FLAG EMPATHY_DEBUG_DISPATCHER
#include <libempathy/empathy-debug.h>
gboolean incoming;
gboolean approved;
gulong invalidated_handler;
+ gulong ready_handler;
};
#define GET_PRIV(o) \
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",
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);
}
}
+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)
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);
{
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);
}
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);
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)
{
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;
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);
}
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;
}
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);
}
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);
}
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));
}
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;
}
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;
}