telepathy-gabble: Support requesting delivery reports when asked to.
Will Thompson
wjt at kemper.freedesktop.org
Thu Dec 6 10:37:22 PST 2012
Module: telepathy-gabble
Branch: master
Commit: ee3a7d4deec58856d7d1a01ad71157a9b88185b8
URL: http://cgit.freedesktop.org/telepathy/telepathy-gabble/commit/?id=ee3a7d4deec58856d7d1a01ad71157a9b88185b8
Author: Will Thompson <will.thompson at collabora.co.uk>
Date: Wed Oct 31 22:44:07 2012 +0000
Support requesting delivery reports when asked to.
---
src/im-channel.c | 48 ++++++++++++++++++++++++++++++++++++++++++------
1 files changed, 42 insertions(+), 6 deletions(-)
diff --git a/src/im-channel.c b/src/im-channel.c
index c6e40b5..ff5163f 100644
--- a/src/im-channel.c
+++ b/src/im-channel.c
@@ -81,6 +81,7 @@ typedef struct {
GabbleIMChannel *channel;
TpMessage *message;
gchar *token;
+ TpMessageSendingFlags flags;
} _GabbleIMSendMessageCtx;
static GPtrArray *
@@ -144,6 +145,10 @@ gabble_im_channel_constructed (GObject *obj)
tp_message_mixin_init (obj, G_STRUCT_OFFSET (GabbleIMChannel, message_mixin),
base_conn);
+ /* We deliberately do not include
+ * TP_DELIVERY_REPORTING_SUPPORT_FLAG_RECEIVE_SUCCESSES here, even though we
+ * support requesting receipts, because XEP-0184 provides no guarantees.
+ */
tp_message_mixin_implement_sending (obj, _gabble_im_channel_send_message,
G_N_ELEMENTS (types), types, 0,
TP_DELIVERY_REPORTING_SUPPORT_FLAG_RECEIVE_FAILURES,
@@ -237,6 +242,28 @@ chat_states_supported (GabbleIMChannel *self,
}
}
+static gboolean
+receipts_conceivably_supported (
+ GabbleIMChannel *self)
+{
+ TpBaseChannel *base = (TpBaseChannel *) self;
+ GabbleConnection *conn =
+ GABBLE_CONNECTION (tp_base_channel_get_connection (base));
+ GabblePresence *presence;
+
+ presence = gabble_presence_cache_get (conn->presence_cache,
+ tp_base_channel_get_target_handle (base));
+
+ /* ...except it's never null because _parse_message_message() in
+ * presence-cache.c. I hate this exactly as much as I did when I wrote the
+ * FIXME on that function. */
+ if (presence != NULL)
+ return gabble_presence_has_cap (presence, NS_RECEIPTS);
+
+ /* Otherwise ... who knows. Why not ask for one? */
+ return TRUE;
+}
+
static void
gabble_im_channel_dispose (GObject *object)
{
@@ -300,7 +327,7 @@ _gabble_im_channel_message_sent_cb (GObject *source,
if (wocky_porter_send_finish (porter, res, &error))
{
- tp_message_mixin_sent ((GObject *) chan, message, 0,
+ tp_message_mixin_sent ((GObject *) chan, message, context->flags,
context->token, NULL);
}
else
@@ -345,21 +372,30 @@ _gabble_im_channel_send_message (GObject *object,
tp_base_connection_get_self_handle (base_conn), state);
}
- /* We don't support providing successful delivery reports. */
- flags = 0;
-
stanza = gabble_message_util_build_stanza (message,
gabble_conn, 0, state, priv->peer_jid,
priv->send_nick, &id, &error);
-
if (stanza != NULL)
{
+ if ((flags & TP_MESSAGE_SENDING_FLAG_REPORT_DELIVERY) &&
+ receipts_conceivably_supported (self))
+ {
+ wocky_node_add_child_ns (wocky_stanza_get_top_node (stanza),
+ "request", NS_RECEIPTS);
+ flags = TP_MESSAGE_SENDING_FLAG_REPORT_DELIVERY;
+ }
+ else
+ {
+ flags = 0;
+ }
+
porter = gabble_connection_dup_porter (gabble_conn);
context = g_slice_new0 (_GabbleIMSendMessageCtx);
context->channel = g_object_ref (base);
context->message = g_object_ref (message);
context->token = id;
+ context->flags = flags;
wocky_porter_send_async (porter, stanza, NULL,
_gabble_im_channel_message_sent_cb, context);
g_object_unref (porter);
@@ -367,7 +403,7 @@ _gabble_im_channel_send_message (GObject *object,
}
else
{
- tp_message_mixin_sent (object, message, flags, NULL, error);
+ tp_message_mixin_sent (object, message, 0, NULL, error);
g_error_free (error);
}
More information about the telepathy-commits
mailing list