[Telepathy-commits] [telepathy-glib/master] Fix up echo2 example for TpMessage-based API

Simon McVittie simon.mcvittie at collabora.co.uk
Thu Dec 18 10:41:43 PST 2008


20080514131110-53eee-46c5817d94a66a451f7df7446f0a4ccb4dd640cb.gz
---
 examples/cm/echo-message-parts/chan.c |   96 +++++++++------------------------
 1 files changed, 25 insertions(+), 71 deletions(-)

diff --git a/examples/cm/echo-message-parts/chan.c b/examples/cm/echo-message-parts/chan.c
index 7f09d0a..d15f199 100644
--- a/examples/cm/echo-message-parts/chan.c
+++ b/examples/cm/echo-message-parts/chan.c
@@ -82,32 +82,24 @@ example_echo_2_channel_init (ExampleEcho2Channel *self)
 
 static void
 send_message (GObject *object,
-              TpMessageMixinOutgoingMessage *message)
+              TpMessage *message,
+              TpMessageSendingFlags flags)
 {
   ExampleEcho2Channel *self = EXAMPLE_ECHO_2_CHANNEL (object);
-  TpHandleRepoIface *contact_repo = tp_base_connection_get_handles
-      (self->priv->conn, TP_HANDLE_TYPE_CONTACT);
   time_t timestamp = time (NULL);
-  GPtrArray *parts;
-  gboolean valid;
+  guint len = tp_message_count_parts (message);
+  TpMessage *received = tp_message_new (self->priv->conn, 1, len);
   guint i;
 
-  g_return_if_fail (message->parts->len >= 1);
-
-  parts = g_ptr_array_sized_new (message->parts->len);
-
   /* Copy/modify the headers for the "received" message */
     {
-      GHashTable *header = g_hash_table_new_full (g_str_hash, g_str_equal,
-            NULL, (GDestroyNotify) tp_g_value_slice_free);
       TpChannelTextMessageType message_type;
+      gboolean valid;
 
-      tp_handle_ref (contact_repo, self->priv->handle);
-
-      g_hash_table_insert (header, "message-sender",
-          tp_g_value_slice_new_uint (self->priv->handle));
+      tp_message_set_handle (received, 0, "message-sender",
+          TP_HANDLE_TYPE_CONTACT, self->priv->handle);
 
-      message_type = tp_asv_get_uint32 (g_ptr_array_index (message->parts, 0),
+      message_type = tp_asv_get_uint32 (tp_message_peek (message, 0),
           "message-type", &valid);
 
       /* The check for 'valid' means that if message-type is missing or of the
@@ -115,25 +107,19 @@ send_message (GObject *object,
        * NORMAL == 0 and tp_asv_get_uint32 returns 0 on missing or wrongly
        * typed values) */
       if (valid && message_type != TP_CHANNEL_TEXT_MESSAGE_TYPE_NORMAL)
-        g_hash_table_insert (header, "message-type",
-            tp_g_value_slice_new_uint (message_type));
+        tp_message_set_uint32 (received, 0, "message-type", message_type);
 
-      g_hash_table_insert (header, "message-sent",
-          tp_g_value_slice_new_uint (timestamp));
-
-      g_hash_table_insert (header, "message-received",
-          tp_g_value_slice_new_uint (timestamp));
-
-      g_ptr_array_add (parts, header);
+      tp_message_set_uint32 (received, 0, "message-sent", timestamp);
+      tp_message_set_uint32 (received, 0, "message-received", timestamp);
     }
 
   /* Copy the content for the "received" message */
-  for (i = 1; i < message->parts->len; i++)
+  for (i = 1; i < len; i++)
     {
-      GHashTable *input = g_ptr_array_index (message->parts, i);
-      GHashTable *output;
+      const GHashTable *input = tp_message_peek (message, i);
       const gchar *s;
-      GValue *value;
+      const GValue *value;
+      guint j;
 
       /* in this example we ignore interface-specific parts */
 
@@ -149,39 +135,31 @@ send_message (GObject *object,
 
       /* OK, we want to copy this part */
 
-      output = g_hash_table_new_full (g_str_hash, g_str_equal,
-            NULL, (GDestroyNotify) tp_g_value_slice_free);
+      j = tp_message_append_part (received);
 
       s = tp_asv_get_string (input, "type");
       g_assert (s != NULL);   /* already checked */
-      g_hash_table_insert (output, "type",
-          tp_g_value_slice_new_string (s));
+      tp_message_set_string (received, j, "type", s);
 
       s = tp_asv_get_string (input, "identifier");
 
       if (s != NULL)
-        g_hash_table_insert (output, "identifier",
-            tp_g_value_slice_new_string (s));
+        tp_message_set_string (received, j, "identifier", s);
 
       s = tp_asv_get_string (input, "alternative");
 
       if (s != NULL)
-        g_hash_table_insert (output, "alternative",
-            tp_g_value_slice_new_string (s));
+        tp_message_set_string (received, j, "alternative", s);
 
       s = tp_asv_get_string (input, "lang");
 
       if (s != NULL)
-        g_hash_table_insert (output, "lang",
-            tp_g_value_slice_new_string (s));
+        tp_message_set_string (received, j, "lang", s);
 
-      value = g_hash_table_lookup (input, "content");
+      value = tp_asv_lookup (input, "content");
 
       if (value != NULL)
-        g_hash_table_insert (output, "content",
-            tp_g_value_slice_dup (value));
-
-      g_ptr_array_add (parts, output);
+        tp_message_set (received, j, "content", value);
     }
 
   /* "OK, we've sent the message" (after calling this, message must not be
@@ -189,32 +167,8 @@ send_message (GObject *object,
   tp_message_mixin_sent (object, message, "", NULL);
 
   /* Pretend the other user sent us back the same message. After this call,
-   * the parts array is owned by the mixin, and must not be modified or freed
-   * until clean_up_received() is called */
-  tp_message_mixin_take_received (object, parts, NULL);
-}
-
-
-static void
-clean_up_received (GObject *obj,
-                   GPtrArray *parts,
-                   gpointer user_data)
-{
-  ExampleEcho2Channel *self = EXAMPLE_ECHO_2_CHANNEL (obj);
-  TpHandleRepoIface *contact_repo = tp_base_connection_get_handles
-      (self->priv->conn, TP_HANDLE_TYPE_CONTACT);
-  TpHandle sender;
-
-  /* this is what we passed to tp_message_mixin_take_received() */
-  g_assert (user_data == NULL);
-
-  sender = tp_asv_get_uint32 (g_ptr_array_index (parts, 0), "sender", NULL);
-
-  if (sender != 0)
-    tp_handle_unref (contact_repo, sender);
-
-  g_ptr_array_foreach (parts, (GFunc) g_hash_table_destroy, NULL);
-  g_ptr_array_free (parts, TRUE);
+   * the received message is owned by the mixin */
+  tp_message_mixin_take_received (object, received);
 }
 
 
@@ -245,7 +199,7 @@ constructor (GType type,
   dbus_g_connection_register_g_object (bus, self->priv->object_path, object);
 
   tp_message_mixin_init (object, G_STRUCT_OFFSET (ExampleEcho2Channel, text),
-      clean_up_received);
+      self->priv->conn);
 
   tp_message_mixin_implement_sending (object, send_message,
       (sizeof (types) / sizeof (types[0])), types);
-- 
1.5.6.5




More information about the Telepathy-commits mailing list