+void
+empathy_tp_chat_close (EmpathyTpChat *chat) {
+ EmpathyTpChatPriv *priv = GET_PRIV (chat);
+
+ /* If there are still messages left, it'll come back..
+ We loose the ordering of sent messages though */
+ g_signal_handlers_disconnect_by_func (priv->channel,
+ tp_chat_invalidated_cb, chat);
+
+ tp_cli_channel_call_close (priv->channel, -1, tp_chat_async_cb,
+ "closing channel", NULL, NULL);
+
+ g_object_unref (priv->channel);
+ priv->channel = NULL;
+
+ g_signal_emit (chat, signals[DESTROY], 0);
+}
+
+const gchar *
+empathy_tp_chat_get_id (EmpathyTpChat *chat)
+{
+ EmpathyTpChatPriv *priv = GET_PRIV (chat);
+
+ g_return_val_if_fail (EMPATHY_IS_TP_CHAT (chat), NULL);
+
+ return tp_channel_get_identifier (priv->channel);
+}
+
+EmpathyContact *
+empathy_tp_chat_get_remote_contact (EmpathyTpChat *chat)
+{
+ EmpathyTpChatPriv *priv = GET_PRIV (chat);
+
+ g_return_val_if_fail (EMPATHY_IS_TP_CHAT (chat), NULL);
+ g_return_val_if_fail (priv->ready, NULL);
+
+ return priv->remote_contact;
+}
+
+TpChannel *
+empathy_tp_chat_get_channel (EmpathyTpChat *chat)
+{
+ EmpathyTpChatPriv *priv = GET_PRIV (chat);
+
+ g_return_val_if_fail (EMPATHY_IS_TP_CHAT (chat), NULL);
+
+ return priv->channel;
+}
+
+TpConnection *
+empathy_tp_chat_get_connection (EmpathyTpChat *chat)
+{
+ EmpathyTpChatPriv *priv = GET_PRIV (chat);
+
+ g_return_val_if_fail (EMPATHY_IS_TP_CHAT (chat), NULL);
+
+ return tp_channel_borrow_connection (priv->channel);
+}
+
+gboolean
+empathy_tp_chat_is_ready (EmpathyTpChat *chat)
+{
+ EmpathyTpChatPriv *priv = GET_PRIV (chat);
+
+ g_return_val_if_fail (EMPATHY_IS_TP_CHAT (chat), FALSE);
+
+ return priv->ready;
+}
+