aboutsummaryrefslogtreecommitdiffstats
path: root/libempathy/empathy-tp-chat.c
diff options
context:
space:
mode:
Diffstat (limited to 'libempathy/empathy-tp-chat.c')
-rw-r--r--libempathy/empathy-tp-chat.c86
1 files changed, 82 insertions, 4 deletions
diff --git a/libempathy/empathy-tp-chat.c b/libempathy/empathy-tp-chat.c
index 141c20ffe..a7aabca69 100644
--- a/libempathy/empathy-tp-chat.c
+++ b/libempathy/empathy-tp-chat.c
@@ -49,8 +49,15 @@ struct _EmpathyTpChatPriv {
TpChan *tp_chan;
gboolean had_pending_messages;
GSList *message_queue;
+ GPtrArray *properties;
};
+typedef struct {
+ gchar *name;
+ guint id;
+ GValue *value;
+} TpChatProperty;
+
static void empathy_tp_chat_class_init (EmpathyTpChatClass *klass);
static void empathy_tp_chat_init (EmpathyTpChat *chat);
@@ -65,6 +72,7 @@ enum {
MESSAGE_RECEIVED,
SEND_ERROR,
CHAT_STATE_CHANGED,
+ PROPERTY_CHANGED,
DESTROY,
LAST_SIGNAL
};
@@ -375,6 +383,37 @@ tp_chat_properties_changed_cb (TpProxy *proxy,
gpointer user_data,
GObject *chat)
{
+ EmpathyTpChatPriv *priv = GET_PRIV (chat);
+ guint i, j;
+
+ for (i = 0; i < properties->len; i++) {
+ GValueArray *prop_struct;
+ TpChatProperty *property;
+ guint id;
+ GValue *src_value;
+
+ prop_struct = g_ptr_array_index (properties, i);
+ id = g_value_get_uint (g_value_array_get_nth (prop_struct, 0));
+ src_value = g_value_array_get_nth (prop_struct, 1);
+
+ for (j = 0; j < priv->properties->len; j++) {
+ property = g_ptr_array_index (priv->properties, j);
+ if (property->id == id) {
+ if (property->value) {
+ g_value_unset (property->value);
+ } else {
+ property->value = g_slice_new0 (GValue);
+ }
+ g_value_copy (src_value, property->value);
+
+ empathy_debug (DEBUG_DOMAIN, "property %s changed",
+ property->name);
+ g_signal_emit (chat, signals[PROPERTY_CHANGED], 0,
+ property->name, property->value);
+ break;
+ }
+ }
+ }
}
static void
@@ -394,16 +433,26 @@ tp_chat_list_properties_cb (TpProxy *proxy,
gpointer user_data,
GObject *chat)
{
- GArray *ids;
- guint i;
+ EmpathyTpChatPriv *priv = GET_PRIV (chat);
+ GArray *ids;
+ guint i;
ids = g_array_sized_new (FALSE, FALSE, sizeof (guint), properties->len);
+ priv->properties = g_ptr_array_sized_new (properties->len);
for (i = 0; i < properties->len; i++) {
- GValueArray *prop_struct;
- guint id;
+ GValueArray *prop_struct;
+ TpChatProperty *property;
+ guint id;
+ const gchar *name;
prop_struct = g_ptr_array_index (properties, i);
id = g_value_get_uint (g_value_array_get_nth (prop_struct, 0));
+ name = g_value_get_string (g_value_array_get_nth (prop_struct, 1));
+
+ property = g_slice_new0 (TpChatProperty);
+ property->id = id;
+ property->name = g_strdup (name);
+ g_ptr_array_add (priv->properties, property);
g_array_append_val (ids, id);
}
@@ -416,6 +465,13 @@ tp_chat_list_properties_cb (TpProxy *proxy,
g_array_free (ids, TRUE);
}
+void
+empathy_tp_chat_set_property (EmpathyTpChat *chat,
+ const GValue *value)
+{
+ /* FIXME: not implemented */
+}
+
static gboolean
tp_chat_channel_ready_cb (EmpathyTpChat *chat)
{
@@ -466,6 +522,7 @@ static void
tp_chat_finalize (GObject *object)
{
EmpathyTpChatPriv *priv = GET_PRIV (object);
+ guint i;
if (priv->acknowledge && priv->channel) {
empathy_debug (DEBUG_DOMAIN, "Closing channel...");
@@ -485,6 +542,17 @@ tp_chat_finalize (GObject *object)
g_object_unref (priv->tp_chan);
}
+ for (i = 0; i < priv->properties->len; i++) {
+ TpChatProperty *property;
+
+ property = g_ptr_array_index (priv->properties, i);
+ g_free (property->name);
+ g_value_unset (property->value);
+ g_slice_free (GValue, property->value);
+ g_slice_free (TpChatProperty, property);
+ }
+ g_ptr_array_free (priv->properties, TRUE);
+
g_object_unref (priv->factory);
g_object_unref (priv->user);
g_object_unref (priv->account);
@@ -645,6 +713,16 @@ empathy_tp_chat_class_init (EmpathyTpChatClass *klass)
G_TYPE_NONE,
2, EMPATHY_TYPE_CONTACT, G_TYPE_UINT);
+ signals[PROPERTY_CHANGED] =
+ g_signal_new ("property-changed",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ 0,
+ NULL, NULL,
+ _empathy_marshal_VOID__STRING_BOXED,
+ G_TYPE_NONE,
+ 2, G_TYPE_STRING, G_TYPE_VALUE);
+
signals[DESTROY] =
g_signal_new ("destroy",
G_TYPE_FROM_CLASS (klass),