[empathy/gnome-3-2: 1/7] TpChat: hide guts of Telepathy properties.



commit 23afe1c84b4567a8dac9e9cf2caa99596679d1de
Author: Will Thompson <will thompson collabora co uk>
Date:   Thu Sep 8 08:07:08 2011 +0100

    TpChat: hide guts of Telepathy properties.
    
    This will make it easier to replace these with new stuff. The funky
    indentation in the callbacks for the subject and title changing is to
    make it clear that I didn't change that code; I'll reindent it in
    another patch.

 libempathy-gtk/empathy-chat.c |   68 +++++++++---------------
 libempathy/empathy-tp-chat.c  |  121 +++++++++++++++++++++++++++++++++++------
 libempathy/empathy-tp-chat.h  |   22 +++-----
 3 files changed, 136 insertions(+), 75 deletions(-)
---
diff --git a/libempathy-gtk/empathy-chat.c b/libempathy-gtk/empathy-chat.c
index 570d73b..9754b09 100644
--- a/libempathy-gtk/empathy-chat.c
+++ b/libempathy-gtk/empathy-chat.c
@@ -756,26 +756,20 @@ chat_command_topic (EmpathyChat *chat,
 		    GStrv        strv)
 {
 	EmpathyChatPriv *priv = GET_PRIV (chat);
-	EmpathyTpChatProperty *property;
-	GValue value = {0, };
 
-	property = empathy_tp_chat_get_property (priv->tp_chat, "subject");
-	if (property == NULL) {
+	if (!empathy_tp_chat_supports_subject (priv->tp_chat)) {
 		empathy_chat_view_append_event (chat->view,
 			_("Topic not supported on this conversation"));
 		return;
 	}
 
-	if (!(property->flags & TP_PROPERTY_FLAG_WRITE)) {
+	if (!empathy_tp_chat_can_set_subject (priv->tp_chat)) {
 		empathy_chat_view_append_event (chat->view,
 			_("You are not allowed to change the topic"));
 		return;
 	}
 
-	g_value_init (&value, G_TYPE_STRING);
-	g_value_set_string (&value, strv[1]);
-	empathy_tp_chat_set_property (priv->tp_chat, "subject", &value);
-	g_value_unset (&value);
+	empathy_tp_chat_set_subject (priv->tp_chat, strv[1]);
 }
 
 void
@@ -1528,16 +1522,12 @@ chat_topic_expander_activate_cb (GtkExpander *expander,
 }
 
 static void
-chat_property_changed_cb (EmpathyTpChat *tp_chat,
-			  const gchar   *name,
-			  GValue        *value,
-			  EmpathyChat   *chat)
+chat_subject_changed_cb (EmpathyChat *chat)
 {
 	EmpathyChatPriv *priv = GET_PRIV (chat);
 
-	if (!tp_strdiff (name, "subject")) {
 		g_free (priv->subject);
-		priv->subject = g_value_dup_string (value);
+		priv->subject = g_strdup (empathy_tp_chat_get_subject (priv->tp_chat));
 		g_object_notify (G_OBJECT (chat), "subject");
 
 		if (EMP_STR_EMPTY (priv->subject)) {
@@ -1567,12 +1557,16 @@ chat_property_changed_cb (EmpathyTpChat *tp_chat,
 			empathy_chat_view_append_event (EMPATHY_CHAT (chat)->view, str);
 			g_free (str);
 		}
-	}
-	else if (!tp_strdiff (name, "name")) {
+}
+
+static void
+chat_title_changed_cb (EmpathyChat *chat)
+{
+	EmpathyChatPriv *priv = GET_PRIV (chat);
+
 		g_free (priv->name);
-		priv->name = g_value_dup_string (value);
+		priv->name = g_strdup (empathy_tp_chat_get_title (priv->tp_chat));
 		g_object_notify (G_OBJECT (chat), "name");
-	}
 }
 
 static gboolean
@@ -3086,11 +3080,13 @@ chat_finalize (GObject *object)
 		g_signal_handlers_disconnect_by_func (priv->tp_chat,
 			chat_state_changed_cb, chat);
 		g_signal_handlers_disconnect_by_func (priv->tp_chat,
-			chat_property_changed_cb, chat);
-		g_signal_handlers_disconnect_by_func (priv->tp_chat,
 			chat_members_changed_cb, chat);
 		g_signal_handlers_disconnect_by_func (priv->tp_chat,
 			chat_remote_contact_changed_cb, chat);
+		g_signal_handlers_disconnect_by_func (priv->tp_chat,
+			chat_title_changed_cb, chat);
+		g_signal_handlers_disconnect_by_func (priv->tp_chat,
+			chat_subject_changed_cb, chat);
 		empathy_tp_chat_leave (priv->tp_chat, "");
 		g_object_unref (priv->tp_chat);
 	}
@@ -3770,7 +3766,6 @@ empathy_chat_set_tp_chat (EmpathyChat   *chat,
 			  EmpathyTpChat *tp_chat)
 {
 	EmpathyChatPriv *priv = GET_PRIV (chat);
-	GPtrArray       *properties;
 
 	g_return_if_fail (EMPATHY_IS_CHAT (chat));
 	g_return_if_fail (EMPATHY_IS_TP_CHAT (tp_chat));
@@ -3801,9 +3796,6 @@ empathy_chat_set_tp_chat (EmpathyChat   *chat,
 	g_signal_connect (tp_chat, "chat-state-changed-empathy",
 			  G_CALLBACK (chat_state_changed_cb),
 			  chat);
-	g_signal_connect (tp_chat, "property-changed",
-			  G_CALLBACK (chat_property_changed_cb),
-			  chat);
 	g_signal_connect (tp_chat, "members-changed",
 			  G_CALLBACK (chat_members_changed_cb),
 			  chat);
@@ -3822,28 +3814,18 @@ empathy_chat_set_tp_chat (EmpathyChat   *chat,
 	g_signal_connect_swapped (tp_chat, "notify::n-messages-sending",
 				  G_CALLBACK (chat_n_messages_sending_changed_cb),
 				  chat);
+	g_signal_connect_swapped (tp_chat, "notify::title",
+				  G_CALLBACK (chat_title_changed_cb),
+				  chat);
+	g_signal_connect_swapped (tp_chat, "notify::subject",
+				  G_CALLBACK (chat_subject_changed_cb),
+				  chat);
 
 	/* Get initial value of properties */
-	properties = empathy_tp_chat_get_properties (priv->tp_chat);
-	if (properties != NULL) {
-		guint i;
-
-		for (i = 0; i < properties->len; i++) {
-			EmpathyTpChatProperty *property;
-
-			property = g_ptr_array_index (properties, i);
-			if (property->value == NULL)
-				continue;
-
-			chat_property_changed_cb (priv->tp_chat,
-						  property->name,
-						  property->value,
-						  chat);
-		}
-	}
-
 	chat_sms_channel_changed_cb (chat);
 	chat_remote_contact_changed_cb (chat);
+	chat_title_changed_cb (chat);
+	chat_subject_changed_cb (chat);
 
 	if (chat->input_text_view) {
 		gtk_widget_set_sensitive (chat->input_text_view, TRUE);
diff --git a/libempathy/empathy-tp-chat.c b/libempathy/empathy-tp-chat.c
index 9eaff95..3621f28 100644
--- a/libempathy/empathy-tp-chat.c
+++ b/libempathy/empathy-tp-chat.c
@@ -38,6 +38,13 @@
 #define DEBUG_FLAG EMPATHY_DEBUG_TP | EMPATHY_DEBUG_CHAT
 #include "empathy-debug.h"
 
+typedef struct {
+	gchar          *name;
+	guint           id;
+	TpPropertyFlags flags;
+	GValue         *value;
+} EmpathyTpChatProperty;
+
 struct _EmpathyTpChatPrivate {
 	TpAccount             *account;
 	EmpathyContact        *user;
@@ -64,13 +71,14 @@ enum {
 	PROP_ACCOUNT,
 	PROP_REMOTE_CONTACT,
 	PROP_N_MESSAGES_SENDING,
+	PROP_TITLE,
+	PROP_SUBJECT,
 };
 
 enum {
 	MESSAGE_RECEIVED,
 	SEND_ERROR,
 	CHAT_STATE_CHANGED,
-	PROPERTY_CHANGED,
 	MESSAGE_ACKNOWLEDGED,
 	LAST_SIGNAL
 };
@@ -652,8 +660,13 @@ tp_chat_properties_changed_cb (TpProxy         *proxy,
 				}
 
 				DEBUG ("property %s changed", property->name);
-				g_signal_emit (chat, signals[PROPERTY_CHANGED], 0,
-					       property->name, property->value);
+
+				if (!tp_strdiff (property->name, "name")) {
+					g_object_notify (chat, "title");
+				} else if (!tp_strdiff (property->name, "subject")) {
+					g_object_notify (chat, "subject");
+				}
+
 				break;
 			}
 		}
@@ -722,7 +735,7 @@ tp_chat_list_properties_cb (TpProxy         *proxy,
 	g_array_free (ids, TRUE);
 }
 
-void
+static void
 empathy_tp_chat_set_property (EmpathyTpChat *self,
 			      const gchar   *name,
 			      const GValue  *value)
@@ -774,7 +787,19 @@ empathy_tp_chat_set_property (EmpathyTpChat *self,
 	}
 }
 
-EmpathyTpChatProperty *
+void
+empathy_tp_chat_set_subject (EmpathyTpChat *self,
+			     const gchar   *subject)
+{
+	GValue value = { 0, };
+
+	g_value_init (&value, G_TYPE_STRING);
+	g_value_set_string (&value, subject);
+	empathy_tp_chat_set_property (self, "subject", &value);
+	g_value_unset (&value);
+}
+
+static EmpathyTpChatProperty *
 empathy_tp_chat_get_property (EmpathyTpChat *self,
 			      const gchar   *name)
 {
@@ -795,10 +820,54 @@ empathy_tp_chat_get_property (EmpathyTpChat *self,
 	return NULL;
 }
 
-GPtrArray *
-empathy_tp_chat_get_properties (EmpathyTpChat *self)
+const gchar *
+empathy_tp_chat_get_title (EmpathyTpChat *self)
+{
+	EmpathyTpChatProperty *property;
+
+	property = empathy_tp_chat_get_property (self, "title");
+
+	if (property == NULL || !G_VALUE_HOLDS_STRING (property->value)) {
+		return NULL;
+	} else {
+		return g_value_get_string (property->value);
+	}
+}
+
+gboolean
+empathy_tp_chat_supports_subject (EmpathyTpChat *self)
+{
+	return (empathy_tp_chat_get_property (self, "subject") != NULL);
+}
+
+gboolean
+empathy_tp_chat_can_set_subject (EmpathyTpChat *self)
+{
+	EmpathyTpChatProperty *property;
+
+	property = empathy_tp_chat_get_property (self, "subject");
+
+	if (property == NULL) {
+		return FALSE;
+	} else if (property->flags & TP_PROPERTY_FLAG_WRITE) {
+		return TRUE;
+	} else {
+		return FALSE;
+	}
+}
+
+const gchar *
+empathy_tp_chat_get_subject (EmpathyTpChat *self)
 {
-	return self->priv->properties;
+	EmpathyTpChatProperty *property;
+
+	property = empathy_tp_chat_get_property (self, "subject");
+
+	if (property == NULL || !G_VALUE_HOLDS_STRING (property->value)) {
+		return NULL;
+	} else {
+		return g_value_get_string (property->value);
+	}
 }
 
 static void
@@ -1235,6 +1304,14 @@ tp_chat_get_property (GObject    *object,
 		g_value_set_uint (value,
 			g_hash_table_size (self->priv->messages_being_sent));
 		break;
+	case PROP_TITLE:
+		g_value_set_string (value,
+			empathy_tp_chat_get_title (self));
+		break;
+	case PROP_SUBJECT:
+		g_value_set_string (value,
+			empathy_tp_chat_get_subject (self));
+		break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
 		break;
@@ -1324,6 +1401,24 @@ empathy_tp_chat_class_init (EmpathyTpChatClass *klass)
 							    0, G_MAXUINT, 0,
 							    G_PARAM_READABLE));
 
+	g_object_class_install_property (object_class,
+					 PROP_TITLE,
+					 g_param_spec_string ("title",
+							      "Title",
+							      "A human-readable name for the room, if any",
+							      NULL,
+							      G_PARAM_READABLE |
+							      G_PARAM_STATIC_STRINGS));
+
+	g_object_class_install_property (object_class,
+					 PROP_SUBJECT,
+					 g_param_spec_string ("subject",
+							      "Subject",
+							      "The room's current subject, if any",
+							      NULL,
+							      G_PARAM_READABLE |
+							      G_PARAM_STATIC_STRINGS));
+
 	/* Signals */
 	signals[MESSAGE_RECEIVED] =
 		g_signal_new ("message-received-empathy",
@@ -1355,16 +1450,6 @@ 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[MESSAGE_ACKNOWLEDGED] =
 		g_signal_new ("message-acknowledged",
 			      G_TYPE_FROM_CLASS (klass),
diff --git a/libempathy/empathy-tp-chat.h b/libempathy/empathy-tp-chat.h
index 810cb51..cc1c16a 100644
--- a/libempathy/empathy-tp-chat.h
+++ b/libempathy/empathy-tp-chat.h
@@ -53,13 +53,6 @@ struct _EmpathyTpChatClass {
 	TpTextChannelClass parent_class;
 };
 
-typedef struct {
-	gchar          *name;
-	guint           id;
-	TpPropertyFlags flags;
-	GValue         *value;
-} EmpathyTpChatProperty;
-
 typedef enum {
 	EMPATHY_DELIVERY_STATUS_NONE,
 	EMPATHY_DELIVERY_STATUS_SENDING,
@@ -83,13 +76,14 @@ EmpathyContact *empathy_tp_chat_get_remote_contact   (EmpathyTpChat      *chat);
 TpAccount    * empathy_tp_chat_get_account          (EmpathyTpChat      *chat);
 void           empathy_tp_chat_send                 (EmpathyTpChat      *chat,
 						     TpMessage     *message);
-void           empathy_tp_chat_set_property         (EmpathyTpChat      *chat,
-						     const gchar        *name,
-						     const GValue       *value);
-EmpathyTpChatProperty *
-	       empathy_tp_chat_get_property         (EmpathyTpChat      *chat,
-						     const gchar        *name);
-GPtrArray *    empathy_tp_chat_get_properties       (EmpathyTpChat      *chat);
+
+const gchar *  empathy_tp_chat_get_title            (EmpathyTpChat *self);
+
+gboolean       empathy_tp_chat_supports_subject     (EmpathyTpChat *self);
+const gchar *  empathy_tp_chat_get_subject          (EmpathyTpChat *self);
+gboolean       empathy_tp_chat_can_set_subject      (EmpathyTpChat *self);
+void           empathy_tp_chat_set_subject          (EmpathyTpChat *self,
+						     const gchar   *subject);
 
 /* Returns a read-only list of pending messages (should be a copy maybe ?) */
 const GList *  empathy_tp_chat_get_pending_messages (EmpathyTpChat *chat);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]