From 9e8347e6a025798eab64f80d2982a42f7ceb547a Mon Sep 17 00:00:00 2001 From: Date: Wed, 22 Feb 2006 17:31:53 +0000 Subject: manually pulled the send_with_reply patch from telepathy-gabble-voip 20060222173153-25e70-235dcddbfa8ab60aba4aebecbcb16be5b8ff3bce.gz --- src/gabble-connection.c | 87 +++++++++++++++++++++++++++++++++++++++++++++++++ src/gabble-connection.h | 7 ++++ 2 files changed, 94 insertions(+) diff --git a/src/gabble-connection.c b/src/gabble-connection.c index 17d73c4ea..2d75336e6 100644 --- a/src/gabble-connection.c +++ b/src/gabble-connection.c @@ -744,6 +744,93 @@ _gabble_connection_send (GabbleConnection *conn, LmMessage *msg, GError **error) return TRUE; } +typedef struct { + GabbleConnectionMsgReplyFunc reply_func; + + GabbleConnection *conn; + LmMessage *sent_msg; + gpointer user_data; +} GabbleMsgHandlerData; + +static LmHandlerResult +message_send_reply_cb (LmMessageHandler *handler, + LmConnection *connection, + LmMessage *reply_msg, + gpointer user_data) +{ + GabbleMsgHandlerData *handler_data = user_data; + LmMessageSubType sub_type; + + sub_type = lm_message_get_sub_type (reply_msg); + if (sub_type != LM_MESSAGE_SUB_TYPE_RESULT && + sub_type != LM_MESSAGE_SUB_TYPE_ERROR) + { + lm_message_unref (handler_data->sent_msg); + + return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; + } + + handler_data->reply_func (handler_data->conn, + handler_data->sent_msg, + reply_msg, + handler_data->user_data); + + lm_message_unref (handler_data->sent_msg); + + return LM_HANDLER_RESULT_REMOVE_MESSAGE; +} + +/** + * _gabble_connection_send_with_reply + * + * Send a tracked LmMessage and trap network errors appropriately. + */ +gboolean +_gabble_connection_send_with_reply (GabbleConnection *conn, + LmMessage *msg, + GabbleConnectionMsgReplyFunc reply_func, + gpointer user_data, + GError **error) +{ + GabbleConnectionPrivate *priv; + LmMessageHandler *handler; + GabbleMsgHandlerData *handler_data; + gboolean ret; + GError *lmerror = NULL; + + g_assert (GABBLE_IS_CONNECTION (conn)); + + priv = GABBLE_CONNECTION_GET_PRIVATE (conn); + + lm_message_ref (msg); + + handler_data = g_new (GabbleMsgHandlerData, 1); + handler_data->reply_func = reply_func; + handler_data->conn = conn; + handler_data->sent_msg = msg; + handler_data->user_data = user_data; + + handler = lm_message_handler_new (message_send_reply_cb, handler_data, g_free); + + ret = lm_connection_send_with_reply (priv->conn, msg, handler, &lmerror); + if (!ret) + { + g_debug ("_gabble_connection_send_with_reply failed: %s", lmerror->message); + + if (error) + { + *error = g_error_new (TELEPATHY_ERRORS, NetworkError, + "message send failed: %s", lmerror->message); + } + + g_error_free (lmerror); + } + + lm_message_handler_unref (handler); + + return ret; +} + static LmHandlerResult connection_message_cb (LmMessageHandler*, LmConnection*, LmMessage*, gpointer); static LmHandlerResult connection_presence_cb (LmMessageHandler*, LmConnection*, LmMessage*, gpointer); static LmHandlerResult connection_iq_roster_cb (LmMessageHandler*, LmConnection*, LmMessage*, gpointer); diff --git a/src/gabble-connection.h b/src/gabble-connection.h index 6058613be..1d8510053 100644 --- a/src/gabble-connection.h +++ b/src/gabble-connection.h @@ -31,6 +31,11 @@ G_BEGIN_DECLS typedef struct _GabbleConnection GabbleConnection; typedef struct _GabbleConnectionClass GabbleConnectionClass; +typedef void (*GabbleConnectionMsgReplyFunc) (GabbleConnection *conn, + LmMessage *sent_msg, + LmMessage *reply_msg, + gpointer user_data); + struct _GabbleConnectionClass { GObjectClass parent_class; }; @@ -60,6 +65,8 @@ gboolean _gabble_connection_register (GabbleConnection *conn, char **bus_name, c gboolean _gabble_connection_connect (GabbleConnection *conn, GError **error); GabbleHandleRepo *_gabble_connection_get_handles (GabbleConnection *conn); gboolean _gabble_connection_send (GabbleConnection *conn, LmMessage *msg, GError **error); +gboolean _gabble_connection_send_with_reply (GabbleConnection *conn, LmMessage *msg, GabbleConnectionMsgReplyFunc reply_func, gpointer user_data, GError **error); +void _gabble_connection_send_iq_ack (GabbleConnection *conn, LmMessageNode *iq_node, LmMessageSubType type); void _gabble_connection_client_hold_handle (GabbleConnection *conn, gchar* client_name, GabbleHandle handle, TpHandleType type); gboolean _gabble_connection_client_release_handle (GabbleConnection *conn, gchar* client_name, GabbleHandle handle, TpHandleType type); -- cgit v1.2.3