[Telepathy-commits] [telepathy-salut/master] SalutConnection: Implement GetAliases and refactor the alias getting

Sjoerd Simons sjoerd.simons at collabora.co.uk
Tue Aug 19 09:30:53 PDT 2008


---
 src/salut-connection.c |  120 +++++++++++++++++++++++++++++-------------------
 1 files changed, 72 insertions(+), 48 deletions(-)

diff --git a/src/salut-connection.c b/src/salut-connection.c
index b86b53a..a104479 100644
--- a/src/salut-connection.c
+++ b/src/salut-connection.c
@@ -1007,6 +1007,39 @@ salut_connection_get_alias_flags (TpSvcConnectionInterfaceAliasing *self,
       0);
 }
 
+static const gchar *
+salut_connection_get_alias (SalutConnection *self, TpHandle handle)
+{
+  SalutConnectionPrivate *priv = SALUT_CONNECTION_GET_PRIVATE (self);
+  TpBaseConnection *base = TP_BASE_CONNECTION (self);
+  TpHandleRepoIface *handle_repo = tp_base_connection_get_handles (base,
+    TP_HANDLE_TYPE_CONTACT);
+  const gchar *alias;
+
+  if (handle == base->self_handle)
+    {
+      alias = salut_self_get_alias (priv->self);
+    }
+  else
+    {
+      SalutContact *contact;
+       contact = salut_contact_manager_get_contact (priv->contact_manager,
+         handle);
+
+       if (contact == NULL)
+         {
+           alias = tp_handle_inspect (handle_repo, handle);
+         }
+       else
+         {
+           alias = salut_contact_get_alias (contact);
+           g_object_unref (contact);
+         }
+    }
+
+  return alias;
+}
+
 /**
  * salut_connection_request_aliases
  *
@@ -1019,7 +1052,6 @@ salut_connection_request_aliases (TpSvcConnectionInterfaceAliasing *iface,
     const GArray *contacts, DBusGMethodInvocation *context)
 {
   SalutConnection *self = SALUT_CONNECTION (iface);
-  SalutConnectionPrivate *priv = SALUT_CONNECTION_GET_PRIVATE (self);
   TpBaseConnection *base = TP_BASE_CONNECTION (self);
   int i;
   const gchar **aliases;
@@ -1042,26 +1074,8 @@ salut_connection_request_aliases (TpSvcConnectionInterfaceAliasing *iface,
   for (i = 0; i < contacts->len; i++)
     {
       TpHandle handle = g_array_index (contacts, TpHandle, i);
-      SalutContact *contact;
-      if (handle == TP_BASE_CONNECTION (self)->self_handle)
-        {
-          aliases[i] = salut_self_get_alias (priv->self);
-        }
-      else
-        {
-          contact = salut_contact_manager_get_contact (priv->contact_manager,
-            handle);
-          if (contact == NULL)
-            {
-              DEBUG ("RequestAliases called for offline contact");
-              aliases[i] = tp_handle_inspect (contact_handles, handle);
-            }
-          else
-            {
-              aliases[i] = salut_contact_get_alias (contact);
-              g_object_unref (contact);
-          }
-        }
+
+      aliases[i] = salut_connection_get_alias (self, handle);
     }
 
   tp_svc_connection_interface_aliasing_return_from_request_aliases (context,
@@ -1072,43 +1086,52 @@ salut_connection_request_aliases (TpSvcConnectionInterfaceAliasing *iface,
 }
 
 static void
+salut_connection_get_aliases (TpSvcConnectionInterfaceAliasing *iface,
+    const GArray *contacts, DBusGMethodInvocation *context)
+{
+  SalutConnection *self = SALUT_CONNECTION (iface);
+  TpBaseConnection *base = TP_BASE_CONNECTION (self);
+  TpHandleRepoIface *handle_repo = tp_base_connection_get_handles (base,
+    TP_HANDLE_TYPE_CONTACT);
+  guint i;
+  GError *error = NULL;
+  GHashTable *result = g_hash_table_new_full (g_direct_hash, g_direct_equal,
+    NULL, NULL);
+
+  if (!tp_handles_are_valid (handle_repo, contacts, FALSE, &error))
+    {
+      dbus_g_method_return_error (context, error);
+      g_error_free (error);
+      return;
+    }
+
+  for (i = 0; i < contacts->len; i++)
+    {
+      TpHandle handle = g_array_index (contacts, TpHandle, i);
+
+      g_hash_table_insert (result, GUINT_TO_POINTER (handle),
+        (gchar *)salut_connection_get_alias (self, handle));
+    }
+
+   tp_svc_connection_interface_aliasing_return_from_get_aliases (context,
+       result);
+
+   g_hash_table_destroy (result);
+}
+
+static void
 salut_connection_aliasing_fill_contact_attributes (GObject *obj,
     const GArray *contacts, GHashTable *attributes_hash)
 {
-  guint i;
   SalutConnection *self = SALUT_CONNECTION (obj);
-  SalutConnectionPrivate *priv = SALUT_CONNECTION_GET_PRIVATE (self);
-  TpBaseConnection *base = TP_BASE_CONNECTION (base);
-  TpHandleRepoIface *handle_repo = tp_base_connection_get_handles (base,
-    TP_HANDLE_TYPE_CONTACT);
+  guint i;
 
   for (i = 0; i < contacts->len; i++)
     {
       TpHandle handle = g_array_index (contacts, TpHandle, i);
       GValue *val = tp_g_value_slice_new (G_TYPE_STRING);
-      gchar *alias;
 
-      if (handle == base->self_handle)
-        {
-          g_value_set_string (val, salut_self_get_alias (priv->self));
-        }
-      else
-        {
-          SalutContact *contact;
-           contact = salut_contact_manager_get_contact (priv->contact_manager,
-             handle);
-
-           if (contact == NULL)
-             {
-               g_value_set_static_string (val,
-                 tp_handle_inspect (handle_repo, handle));
-             }
-           else
-             {
-               g_value_set_string (val, salut_contact_get_alias (contact));
-               g_object_unref (contact);
-             }
-        }
+      g_value_set_string (val, salut_connection_get_alias (self, handle));
 
       tp_contacts_mixin_set_contact_attribute (attributes_hash, handle,
          TP_IFACE_CONNECTION_INTERFACE_ALIASING"/alias", val);
@@ -1183,6 +1206,7 @@ salut_connection_aliasing_service_iface_init (gpointer g_iface,
     (klass, salut_connection_##x)
   IMPLEMENT (get_alias_flags);
   IMPLEMENT (request_aliases);
+  IMPLEMENT (get_aliases);
   IMPLEMENT (set_aliases);
 #undef IMPLEMENT
 }
-- 
1.5.6.3




More information about the Telepathy-commits mailing list