summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2010-10-27 12:05:09 +0200
committerGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2010-10-27 16:36:34 +0200
commit13285043020ed6bdaa72b30bf65ac9b7d6b0207e (patch)
treedefcf6e8ac06ad8ebef922414b57a7fee4fa9692 /src
parentb68ed195e7cb46b92dae6de5061cd1f94e9ff732 (diff)
add delivery report
Diffstat (limited to 'src')
-rw-r--r--src/sip-text-channel.c84
1 files changed, 82 insertions, 2 deletions
diff --git a/src/sip-text-channel.c b/src/sip-text-channel.c
index 1472661..23159fd 100644
--- a/src/sip-text-channel.c
+++ b/src/sip-text-channel.c
@@ -103,6 +103,8 @@ typedef struct _TpsipTextPendingMessage TpsipTextPendingMessage;
struct _TpsipTextPendingMessage
{
nua_handle_t *nh;
+ gchar *token;
+ TpMessageSendingFlags flags;
};
typedef struct _TpsipTextChannelPrivate TpsipTextChannelPrivate;
@@ -134,6 +136,8 @@ static void tpsip_text_pending_free (TpsipTextPendingMessage *msg,
if (msg->nh)
nua_handle_unref (msg->nh);
+ g_free (msg->token);
+
g_slice_free (TpsipTextPendingMessage, msg);
}
@@ -193,7 +197,8 @@ tpsip_text_channel_constructed (GObject *obj)
tp_message_mixin_implement_sending (obj, tpsip_text_channel_send_message,
G_N_ELEMENTS (types), types, 0,
- TP_DELIVERY_REPORTING_SUPPORT_FLAG_RECEIVE_FAILURES,
+ TP_DELIVERY_REPORTING_SUPPORT_FLAG_RECEIVE_FAILURES |
+ TP_DELIVERY_REPORTING_SUPPORT_FLAG_RECEIVE_SUCCESSES,
supported_content_types);
bus = tp_get_bus();
@@ -701,8 +706,10 @@ tpsip_text_channel_send_message (GObject *object,
msg = _tpsip_text_pending_new0 ();
msg->nh = msg_nh;
+ msg->token = g_strdup_printf ("%u", priv->sent_id++);
+ msg->flags = flags;
- tp_message_mixin_sent (object, message, flags, "", NULL);
+ tp_message_mixin_sent (object, message, flags, msg->token, NULL);
g_queue_push_tail (priv->sending_messages, msg);
DEBUG ("message queued for delivery");
@@ -714,6 +721,70 @@ fail:
g_error_free (error);
}
+static gchar *
+text_send_error_to_dbus_error (TpChannelTextSendError error)
+{
+ switch (error)
+ {
+ case TP_CHANNEL_TEXT_SEND_ERROR_OFFLINE:
+ return TP_ERROR_STR_OFFLINE;
+
+ case TP_CHANNEL_TEXT_SEND_ERROR_INVALID_CONTACT:
+ return TP_ERROR_STR_INVALID_HANDLE;
+
+ case TP_CHANNEL_TEXT_SEND_ERROR_PERMISSION_DENIED:
+ return TP_ERROR_STR_PERMISSION_DENIED;
+
+ case TP_CHANNEL_TEXT_SEND_ERROR_TOO_LONG:
+ return TP_ERROR_STR_INVALID_ARGUMENT;
+
+ case TP_CHANNEL_TEXT_SEND_ERROR_NOT_IMPLEMENTED:
+ return TP_ERROR_STR_NOT_IMPLEMENTED;
+
+ case TP_CHANNEL_TEXT_SEND_ERROR_UNKNOWN:
+ default:
+ return TP_ERROR_STR_INVALID_ARGUMENT;
+ }
+
+ return NULL;
+}
+
+static void
+delivery_report (TpsipTextChannel *self,
+ const gchar *token,
+ TpDeliveryStatus status,
+ TpChannelTextSendError send_error)
+{
+ TpsipTextChannelPrivate *priv = TPSIP_TEXT_CHANNEL_GET_PRIVATE (self);
+ TpBaseConnection *base_conn;
+ TpMessage *msg;
+
+ base_conn = (TpBaseConnection *) priv->conn;
+
+ msg = tp_message_new (base_conn, 1, 1);
+
+ tp_message_set_handle (msg, 0, "message-sender", TP_HANDLE_TYPE_CONTACT,
+ priv->handle);
+
+ tp_message_set_uint32 (msg, 0, "message-type",
+ TP_CHANNEL_TEXT_MESSAGE_TYPE_DELIVERY_REPORT);
+
+ tp_message_set_string (msg, 0, "delivery-token", token);
+ tp_message_set_uint32 (msg, 0, "delivery-status", status);
+
+ if (status == TP_DELIVERY_STATUS_TEMPORARILY_FAILED ||
+ status == TP_DELIVERY_STATUS_PERMANENTLY_FAILED)
+ {
+ if (send_error != TP_CHANNEL_TEXT_SEND_ERROR_UNKNOWN)
+ tp_message_set_uint32 (msg, 0, "delivery-error", send_error);
+
+ tp_message_set_string (msg, 0, "delivery-dbus-error",
+ text_send_error_to_dbus_error (send_error));
+ }
+
+ tp_message_mixin_take_received((GObject *) self, msg);
+}
+
static gboolean
tpsip_text_channel_nua_r_message_cb (TpsipTextChannel *self,
const TpsipNuaEvent *ev,
@@ -749,6 +820,12 @@ tpsip_text_channel_nua_r_message_cb (TpsipTextChannel *self,
if (ev->status >= 200 && ev->status < 300)
{
DEBUG ("message delivered");
+
+ if (msg->flags & TP_MESSAGE_SENDING_FLAG_REPORT_DELIVERY)
+ {
+ DEBUG ("Sending delivery report");
+ delivery_report (self, msg->token, TP_DELIVERY_STATUS_DELIVERED, 0);
+ }
}
else
{
@@ -787,6 +864,9 @@ tpsip_text_channel_nua_r_message_cb (TpsipTextChannel *self,
default:
send_error = TP_CHANNEL_TEXT_SEND_ERROR_UNKNOWN;
}
+
+ delivery_report (self, msg->token, TP_DELIVERY_STATUS_PERMANENTLY_FAILED,
+ send_error);
}
g_queue_remove(priv->sending_messages, msg);