[next] telepathy-gabble: avatars: be more precise about what we' re returning

Simon McVittie smcv at kemper.freedesktop.org
Thu Apr 3 07:26:41 PDT 2014


Module: telepathy-gabble
Branch: next
Commit: c3c3bb5c6f22269e0a130f96917972ad7263316c
URL:    http://cgit.freedesktop.org/telepathy/telepathy-gabble/commit/?id=c3c3bb5c6f22269e0a130f96917972ad7263316c

Author: Simon McVittie <simon.mcvittie at collabora.co.uk>
Date:   Mon Mar 24 20:12:03 2014 +0000

avatars: be more precise about what we're returning

The dbus-glib codegen tolerated use of the wrong return_from function,
because dbus_g_method_return used unterminated varargs anyway, so it
had no way to detect excess arguments.
g_dbus_method_invocation_return_value *does* have a way to detect
excess arguments, and treats them as programming error. Unfortunately,
we had always used
tp_svc_connection_interface_avatars1_return_from_set_avatar()
(returning (s)) to return from ClearAvatar (returning ()).

---

 src/conn-avatars.c |   40 +++++++++++++++++++++++-----------------
 1 file changed, 23 insertions(+), 17 deletions(-)

diff --git a/src/conn-avatars.c b/src/conn-avatars.c
index cdb957b..ea531a6 100644
--- a/src/conn-avatars.c
+++ b/src/conn-avatars.c
@@ -427,6 +427,7 @@ struct _set_avatar_ctx {
   GabbleConnection *conn;
   GDBusMethodInvocation *invocation;
   GString *avatar;
+  gboolean is_clear;
 };
 
 
@@ -483,8 +484,13 @@ _set_avatar_cb2 (GabbleVCardManager *manager,
 
       if (conn_presence_signal_own_presence (ctx->conn, NULL, &error))
         {
-          tp_svc_connection_interface_avatars1_return_from_set_avatar (
-              ctx->invocation, presence->avatar_sha1);
+          if (ctx->is_clear)
+            tp_svc_connection_interface_avatars1_return_from_clear_avatar (
+                ctx->invocation);
+          else
+            tp_svc_connection_interface_avatars1_return_from_set_avatar (
+                ctx->invocation, presence->avatar_sha1);
+
           tp_svc_connection_interface_avatars1_emit_avatar_updated (
               ctx->conn, tp_base_connection_get_self_handle (base),
               presence->avatar_sha1);
@@ -499,21 +505,11 @@ _set_avatar_cb2 (GabbleVCardManager *manager,
   _set_avatar_ctx_free (ctx);
 }
 
-
-/**
- * gabble_connection_set_avatar
- *
- * Implements D-Bus method SetAvatar
- * on interface Connection.Interface.Avatars
- *
- * @context: The D-Bus invocation context to use to return values
- *           or throw an error.
- */
 static void
-gabble_connection_set_avatar (TpSvcConnectionInterfaceAvatars1 *iface,
-                              const GArray *avatar,
-                              const gchar *mime_type,
-                              GDBusMethodInvocation *context)
+set_avatar_internal (TpSvcConnectionInterfaceAvatars1 *iface,
+    const GArray *avatar,
+    const gchar *mime_type,
+    GDBusMethodInvocation *context)
 {
   GabbleConnection *self = GABBLE_CONNECTION (iface);
   TpBaseConnection *base = (TpBaseConnection *) self;
@@ -527,6 +523,7 @@ gabble_connection_set_avatar (TpSvcConnectionInterfaceAvatars1 *iface,
   ctx = g_new0 (struct _set_avatar_ctx, 1);
   ctx->conn = self;
   ctx->invocation = context;
+  ctx->is_clear = (avatar == NULL);
 
   if (avatar != NULL && avatar->len > 0)
     {
@@ -567,6 +564,15 @@ gabble_connection_set_avatar (TpSvcConnectionInterfaceAvatars1 *iface,
       edits);
 }
 
+static void
+gabble_connection_set_avatar (TpSvcConnectionInterfaceAvatars1 *iface,
+                              const GArray *avatar,
+                              const gchar *mime_type,
+                              GDBusMethodInvocation *context)
+{
+  g_assert (avatar != NULL);
+  set_avatar_internal (iface, avatar, mime_type, context);
+}
 
 /**
  * gabble_connection_clear_avatar
@@ -581,7 +587,7 @@ static void
 gabble_connection_clear_avatar (TpSvcConnectionInterfaceAvatars1 *iface,
                                 GDBusMethodInvocation *context)
 {
-  gabble_connection_set_avatar (iface, NULL, NULL, context);
+  set_avatar_internal (iface, NULL, NULL, context);
 }
 
 gboolean



More information about the telepathy-commits mailing list