]> git.0d.be Git - empathy.git/blobdiff - libempathy/empathy-contact.c
Cleanup code from previous merge
[empathy.git] / libempathy / empathy-contact.c
index 774a18f77bd029222c893c5da2778a53c3df2676..69861257235869da416c1ce2fe0ec8290d6eba69 100644 (file)
@@ -1,6 +1,7 @@
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
 /*
- * Copyright (C) 2004-2007 Imendio AB
+ * Copyright (C) 2004 Imendio AB
+ * Copyright (C) 2007 Collabora Ltd.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
@@ -19,6 +20,7 @@
  *
  * Authors: Mikael Hallendal <micke@imendio.com>
  *          Martyn Russell <martyn@imendio.com>
+ *          Xavier Claessens <xclaesse@gmail.com>
  */
 
 #include "config.h"
 
 #include <glib/gi18n.h>
 
+#include <telepathy-glib/util.h>
+
 #include "empathy-contact.h"
 #include "empathy-utils.h"
 #include "empathy-debug.h"
+#include "empathy-enum-types.h"
 
 #define DEBUG_DOMAIN "Contact"
 
@@ -40,26 +45,28 @@ typedef struct _EmpathyContactPriv EmpathyContactPriv;
 struct _EmpathyContactPriv {
        gchar              *id;
        gchar              *name;
-       EmpathyAvatar       *avatar;
+       EmpathyAvatar      *avatar;
        McAccount          *account;
-       EmpathyPresence     *presence;
-       GList              *groups;
-       EmpathySubscription  subscription;
+       McPresence          presence;
+       gchar              *presence_message;
        guint               handle;
+       EmpathyCapabilities capabilities;
        gboolean            is_user;
 };
 
-static void contact_class_init    (EmpathyContactClass *class);
-static void contact_init          (EmpathyContact      *contact);
-static void contact_finalize      (GObject            *object);
-static void contact_get_property  (GObject            *object,
-                                  guint               param_id,
-                                  GValue             *value,
-                                  GParamSpec         *pspec);
-static void contact_set_property  (GObject            *object,
-                                  guint               param_id,
-                                  const GValue       *value,
-                                  GParamSpec         *pspec);
+static void empathy_contact_class_init (EmpathyContactClass *class);
+static void empathy_contact_init       (EmpathyContact      *contact);
+static void contact_finalize           (GObject             *object);
+static void contact_get_property       (GObject             *object,
+                                       guint                param_id,
+                                       GValue              *value,
+                                       GParamSpec          *pspec);
+static void contact_set_property       (GObject             *object,
+                                       guint                param_id,
+                                       const GValue        *value,
+                                       GParamSpec          *pspec);
+
+G_DEFINE_TYPE (EmpathyContact, empathy_contact, G_TYPE_OBJECT);
 
 enum {
        PROP_0,
@@ -68,47 +75,20 @@ enum {
        PROP_AVATAR,
        PROP_ACCOUNT,
        PROP_PRESENCE,
+       PROP_PRESENCE_MESSAGE,
        PROP_GROUPS,
        PROP_SUBSCRIPTION,
        PROP_HANDLE,
+       PROP_CAPABILITIES,
        PROP_IS_USER
 };
 
-static gpointer parent_class = NULL;
-
-GType
-empathy_contact_get_gtype (void)
-{
-       static GType type = 0;
-
-       if (!type) {
-               static const GTypeInfo info = {
-                       sizeof (EmpathyContactClass),
-                       NULL, /* base_init */
-                       NULL, /* base_finalize */
-                       (GClassInitFunc) contact_class_init,
-                       NULL, /* class_finalize */
-                       NULL, /* class_data */
-                       sizeof (EmpathyContact),
-                       0,    /* n_preallocs */
-                       (GInstanceInitFunc) contact_init
-               };
-
-               type = g_type_register_static (G_TYPE_OBJECT,
-                                              "EmpathyContact",
-                                              &info, 0);
-       }
-
-       return type;
-}
-
 static void
-contact_class_init (EmpathyContactClass *class)
+empathy_contact_class_init (EmpathyContactClass *class)
 {
        GObjectClass *object_class;
 
        object_class = G_OBJECT_CLASS (class);
-       parent_class = g_type_class_peek_parent (class);
 
        object_class->finalize     = contact_finalize;
        object_class->get_property = contact_get_property;
@@ -148,30 +128,21 @@ contact_class_init (EmpathyContactClass *class)
 
        g_object_class_install_property (object_class,
                                         PROP_PRESENCE,
-                                        g_param_spec_object ("presence",
-                                                             "Contact presence",
-                                                             "Presence of contact",
-                                                             EMPATHY_TYPE_PRESENCE,
-                                                             G_PARAM_READWRITE));
-
-       g_object_class_install_property (object_class,
-                                        PROP_GROUPS,
-                                        g_param_spec_pointer ("groups",
-                                                              "Contact groups",
-                                                              "Groups of contact",
-                                                              G_PARAM_READWRITE));
+                                        g_param_spec_uint ("presence",
+                                                           "Contact presence",
+                                                           "Presence of contact",
+                                                           MC_PRESENCE_UNSET,
+                                                           LAST_MC_PRESENCE,
+                                                           MC_PRESENCE_UNSET,
+                                                           G_PARAM_READWRITE));
 
        g_object_class_install_property (object_class,
-                                        PROP_SUBSCRIPTION,
-                                        g_param_spec_int ("subscription",
-                                                          "Contact Subscription",
-                                                          "The subscription status of the contact",
-                                                          EMPATHY_SUBSCRIPTION_NONE,
-                                                          EMPATHY_SUBSCRIPTION_BOTH,
-                                                          EMPATHY_SUBSCRIPTION_NONE,
-                                                          G_PARAM_READWRITE));
-
-
+                                        PROP_PRESENCE_MESSAGE,
+                                        g_param_spec_string ("presence-message",
+                                                             "Contact presence message",
+                                                             "Presence message of contact",
+                                                             NULL,
+                                                             G_PARAM_READWRITE));
        g_object_class_install_property (object_class,
                                         PROP_HANDLE,
                                         g_param_spec_uint ("handle",
@@ -181,6 +152,16 @@ contact_class_init (EmpathyContactClass *class)
                                                            G_MAXUINT,
                                                            0,
                                                            G_PARAM_READWRITE));
+
+       g_object_class_install_property (object_class,
+                                        PROP_CAPABILITIES,
+                                        g_param_spec_flags ("capabilities",
+                                                            "Contact Capabilities",
+                                                            "Capabilities of the contact",
+                                                            EMPATHY_TYPE_CAPABILITIES,
+                                                            EMPATHY_CAPABILITIES_UNKNOWN,
+                                                            G_PARAM_READWRITE));
+
        g_object_class_install_property (object_class,
                                         PROP_IS_USER,
                                         g_param_spec_boolean ("is-user",
@@ -193,7 +174,7 @@ contact_class_init (EmpathyContactClass *class)
 }
 
 static void
-contact_init (EmpathyContact *contact)
+empathy_contact_init (EmpathyContact *contact)
 {
 }
 
@@ -208,25 +189,17 @@ contact_finalize (GObject *object)
 
        g_free (priv->name);
        g_free (priv->id);
+       g_free (priv->presence_message);
 
        if (priv->avatar) {
                empathy_avatar_unref (priv->avatar);
        }
 
-       if (priv->presence) {
-               g_object_unref (priv->presence);
-       }
-
-       if (priv->groups) {
-               g_list_foreach (priv->groups, (GFunc) g_free, NULL);
-               g_list_free (priv->groups);
-       }
-
        if (priv->account) {
                g_object_unref (priv->account);
        }
 
-       (G_OBJECT_CLASS (parent_class)->finalize) (object);
+       G_OBJECT_CLASS (empathy_contact_parent_class)->finalize (object);
 }
 
 static void
@@ -255,17 +228,17 @@ contact_get_property (GObject    *object,
                g_value_set_object (value, priv->account);
                break;
        case PROP_PRESENCE:
-               g_value_set_object (value, priv->presence);
-               break;
-       case PROP_GROUPS:
-               g_value_set_pointer (value, priv->groups);
+               g_value_set_uint (value, priv->presence);
                break;
-       case PROP_SUBSCRIPTION:
-               g_value_set_int (value, priv->subscription);
+       case PROP_PRESENCE_MESSAGE:
+               g_value_set_string (value, priv->presence_message);
                break;
        case PROP_HANDLE:
                g_value_set_uint (value, priv->handle);
                break;
+       case PROP_CAPABILITIES:
+               g_value_set_flags (value, priv->capabilities);
+               break;
        case PROP_IS_USER:
                g_value_set_boolean (value, priv->is_user);
                break;
@@ -304,20 +277,20 @@ contact_set_property (GObject      *object,
                break;
        case PROP_PRESENCE:
                empathy_contact_set_presence (EMPATHY_CONTACT (object),
-                                            EMPATHY_PRESENCE (g_value_get_object (value)));
-               break;
-       case PROP_GROUPS:
-               empathy_contact_set_groups (EMPATHY_CONTACT (object),
-                                          g_value_get_pointer (value));
+                                             g_value_get_uint (value));
                break;
-       case PROP_SUBSCRIPTION:
-               empathy_contact_set_subscription (EMPATHY_CONTACT (object),
-                                                g_value_get_int (value));
+       case PROP_PRESENCE_MESSAGE:
+               empathy_contact_set_presence_message (EMPATHY_CONTACT (object),
+                                                     g_value_get_string (value));
                break;
        case PROP_HANDLE:
                empathy_contact_set_handle (EMPATHY_CONTACT (object),
                                           g_value_get_uint (value));
                break;
+       case PROP_CAPABILITIES:
+               empathy_contact_set_capabilities (EMPATHY_CONTACT (object),
+                                                 g_value_get_flags (value));
+               break;
        case PROP_IS_USER:
                empathy_contact_set_is_user (EMPATHY_CONTACT (object),
                                            g_value_get_boolean (value));
@@ -338,8 +311,8 @@ empathy_contact_new (McAccount *account)
 
 EmpathyContact *
 empathy_contact_new_full (McAccount   *account,
-                        const gchar *id,
-                        const gchar *name)
+                         const gchar *id,
+                         const gchar *name)
 {
        return g_object_new (EMPATHY_TYPE_CONTACT,
                             "account", account,
@@ -364,107 +337,6 @@ empathy_contact_get_id (EmpathyContact *contact)
        return "";
 }
 
-const gchar *
-empathy_contact_get_name (EmpathyContact *contact)
-{
-       EmpathyContactPriv *priv;
-
-       g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), "");
-
-       priv = GET_PRIV (contact);
-
-       if (G_STR_EMPTY (priv->name)) {
-               return empathy_contact_get_id (contact);
-       }
-
-       return priv->name;
-}
-
-EmpathyAvatar *
-empathy_contact_get_avatar (EmpathyContact *contact)
-{
-       EmpathyContactPriv *priv;
-
-       g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL);
-
-       priv = GET_PRIV (contact);
-
-       return priv->avatar;
-}
-
-McAccount *
-empathy_contact_get_account (EmpathyContact *contact)
-{
-       EmpathyContactPriv *priv;
-
-       g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL);
-
-       priv = GET_PRIV (contact);
-
-       return priv->account;
-}
-
-EmpathyPresence *
-empathy_contact_get_presence (EmpathyContact *contact)
-{
-       EmpathyContactPriv *priv;
-
-       g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL);
-
-       priv = GET_PRIV (contact);
-
-       return priv->presence;
-}
-
-GList *
-empathy_contact_get_groups (EmpathyContact *contact)
-{
-       EmpathyContactPriv *priv;
-
-       g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL);
-
-       priv = GET_PRIV (contact);
-
-       return priv->groups;
-}
-
-EmpathySubscription
-empathy_contact_get_subscription (EmpathyContact *contact)
-{
-       EmpathyContactPriv *priv;
-
-       g_return_val_if_fail (EMPATHY_IS_CONTACT (contact),
-                             EMPATHY_SUBSCRIPTION_NONE);
-
-       priv = GET_PRIV (contact);
-
-       return priv->subscription;
-}
-
-guint
-empathy_contact_get_handle (EmpathyContact *contact)
-{
-       EmpathyContactPriv *priv;
-
-       g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), 0);
-
-       priv = GET_PRIV (contact);
-
-       return priv->handle;
-}
-
-gboolean
-empathy_contact_is_user (EmpathyContact *contact)
-{
-       EmpathyContactPriv *priv;
-
-       g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), FALSE);
-
-       priv = GET_PRIV (contact);
-
-       return priv->is_user;
-}
-
 void
 empathy_contact_set_id (EmpathyContact *contact,
                       const gchar   *id)
@@ -486,6 +358,22 @@ empathy_contact_set_id (EmpathyContact *contact,
        g_object_notify (G_OBJECT (contact), "id");
 }
 
+const gchar *
+empathy_contact_get_name (EmpathyContact *contact)
+{
+       EmpathyContactPriv *priv;
+
+       g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), "");
+
+       priv = GET_PRIV (contact);
+
+       if (G_STR_EMPTY (priv->name)) {
+               return empathy_contact_get_id (contact);
+       }
+
+       return priv->name;
+}
+
 void
 empathy_contact_set_name (EmpathyContact *contact,
                         const gchar   *name)
@@ -507,6 +395,18 @@ empathy_contact_set_name (EmpathyContact *contact,
        g_object_notify (G_OBJECT (contact), "name");
 }
 
+EmpathyAvatar *
+empathy_contact_get_avatar (EmpathyContact *contact)
+{
+       EmpathyContactPriv *priv;
+
+       g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL);
+
+       priv = GET_PRIV (contact);
+
+       return priv->avatar;
+}
+
 void
 empathy_contact_set_avatar (EmpathyContact *contact,
                           EmpathyAvatar  *avatar)
@@ -533,9 +433,21 @@ empathy_contact_set_avatar (EmpathyContact *contact,
        g_object_notify (G_OBJECT (contact), "avatar");
 }
 
+McAccount *
+empathy_contact_get_account (EmpathyContact *contact)
+{
+       EmpathyContactPriv *priv;
+
+       g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL);
+
+       priv = GET_PRIV (contact);
+
+       return priv->account;
+}
+
 void
 empathy_contact_set_account (EmpathyContact *contact,
-                           McAccount     *account)
+                            McAccount      *account)
 {
        EmpathyContactPriv *priv;
 
@@ -556,9 +468,21 @@ empathy_contact_set_account (EmpathyContact *contact,
        g_object_notify (G_OBJECT (contact), "account");
 }
 
+McPresence
+empathy_contact_get_presence (EmpathyContact *contact)
+{
+       EmpathyContactPriv *priv;
+
+       g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), MC_PRESENCE_UNSET);
+
+       priv = GET_PRIV (contact);
+
+       return priv->presence;
+}
+
 void
-empathy_contact_set_presence (EmpathyContact  *contact,
-                            EmpathyPresence *presence)
+empathy_contact_set_presence (EmpathyContact *contact,
+                             McPresence      presence)
 {
        EmpathyContactPriv *priv;
 
@@ -570,60 +494,51 @@ empathy_contact_set_presence (EmpathyContact  *contact,
                return;
        }
 
-       if (priv->presence) {
-               g_object_unref (priv->presence);
-               priv->presence = NULL;
-       }
-
-       if (presence) {
-               priv->presence = g_object_ref (presence);
-       }
+       priv->presence = presence;
 
        g_object_notify (G_OBJECT (contact), "presence");
 }
 
-void
-empathy_contact_set_groups (EmpathyContact *contact,
-                          GList         *groups)
+const gchar *
+empathy_contact_get_presence_message (EmpathyContact *contact)
 {
        EmpathyContactPriv *priv;
-       GList             *old_groups, *l;
 
-       g_return_if_fail (EMPATHY_IS_CONTACT (contact));
+       g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL);
 
        priv = GET_PRIV (contact);
 
-       old_groups = priv->groups;
-       priv->groups = NULL;
+       return priv->presence_message;
+}
+
+void
+empathy_contact_set_presence_message (EmpathyContact *contact,
+                                     const gchar    *message)
+{
+       EmpathyContactPriv *priv = GET_PRIV (contact);
+
+       g_return_if_fail (EMPATHY_IS_CONTACT (contact));
 
-       for (l = groups; l; l = l->next) {
-               priv->groups = g_list_append (priv->groups,
-                                             g_strdup (l->data));
+       if (!tp_strdiff (message, priv->presence_message)) {
+               return;
        }
 
-       g_list_foreach (old_groups, (GFunc) g_free, NULL);
-       g_list_free (old_groups);
+       g_free (priv->presence_message);
+       priv->presence_message = g_strdup (message);
 
-       g_object_notify (G_OBJECT (contact), "groups");
+       g_object_notify (G_OBJECT (contact), "presence-message");
 }
 
-void
-empathy_contact_set_subscription (EmpathyContact      *contact,
-                                EmpathySubscription  subscription)
+guint
+empathy_contact_get_handle (EmpathyContact *contact)
 {
        EmpathyContactPriv *priv;
 
-       g_return_if_fail (EMPATHY_IS_CONTACT (contact));
+       g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), 0);
 
        priv = GET_PRIV (contact);
 
-       if (priv->subscription == subscription) {
-               return;
-       }
-
-       priv->subscription = subscription;
-
-       g_object_notify (G_OBJECT (contact), "subscription");
+       return priv->handle;
 }
 
 void
@@ -645,94 +560,78 @@ empathy_contact_set_handle (EmpathyContact *contact,
        g_object_notify (G_OBJECT (contact), "handle");
 }
 
-void
-empathy_contact_set_is_user (EmpathyContact *contact,
-                           gboolean       is_user)
+EmpathyCapabilities
+empathy_contact_get_capabilities (EmpathyContact *contact)
 {
        EmpathyContactPriv *priv;
 
-       g_return_if_fail (EMPATHY_IS_CONTACT (contact));
+       g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), 0);
 
        priv = GET_PRIV (contact);
 
-       if (priv->is_user == is_user) {
-               return;
-       }
-
-       priv->is_user = is_user;
-
-       g_object_notify (G_OBJECT (contact), "is-user");
+       return priv->capabilities;
 }
 
 void
-empathy_contact_add_group (EmpathyContact *contact,
-                         const gchar   *group)
+empathy_contact_set_capabilities (EmpathyContact      *contact,
+                                 EmpathyCapabilities  capabilities)
 {
        EmpathyContactPriv *priv;
 
        g_return_if_fail (EMPATHY_IS_CONTACT (contact));
-       g_return_if_fail (group != NULL);
 
        priv = GET_PRIV (contact);
 
-       if (!g_list_find_custom (priv->groups, group, (GCompareFunc) strcmp)) {
-               priv->groups = g_list_prepend (priv->groups, g_strdup (group));
-               g_object_notify (G_OBJECT (contact), "groups");
+       if (priv->capabilities == capabilities) {
+               return;
        }
+
+       priv->capabilities = capabilities;
+
+       g_object_notify (G_OBJECT (contact), "capabilities");
 }
 
-void
-empathy_contact_remove_group (EmpathyContact *contact,
-                            const gchar   *group)
+gboolean
+empathy_contact_is_user (EmpathyContact *contact)
 {
        EmpathyContactPriv *priv;
-       GList             *l;
 
-       g_return_if_fail (EMPATHY_IS_CONTACT (contact));
-       g_return_if_fail (group != NULL);
+       g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), FALSE);
 
        priv = GET_PRIV (contact);
 
-       l = g_list_find_custom (priv->groups, group, (GCompareFunc) strcmp);
-       if (l) {
-               g_free (l->data);
-               priv->groups = g_list_delete_link (priv->groups, l);
-               g_object_notify (G_OBJECT (contact), "groups");
-       }
+       return priv->is_user;
 }
 
-gboolean
-empathy_contact_is_online (EmpathyContact *contact)
+void
+empathy_contact_set_is_user (EmpathyContact *contact,
+                           gboolean       is_user)
 {
        EmpathyContactPriv *priv;
 
-       g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), FALSE);
+       g_return_if_fail (EMPATHY_IS_CONTACT (contact));
 
        priv = GET_PRIV (contact);
 
-       if (!priv->presence) {
-               return FALSE;
+       if (priv->is_user == is_user) {
+               return;
        }
 
-       return (empathy_presence_get_state (priv->presence) > MC_PRESENCE_OFFLINE);
+       priv->is_user = is_user;
+
+       g_object_notify (G_OBJECT (contact), "is-user");
 }
 
 gboolean
-empathy_contact_is_in_group (EmpathyContact *contact,
-                           const gchar   *group)
+empathy_contact_is_online (EmpathyContact *contact)
 {
        EmpathyContactPriv *priv;
 
        g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), FALSE);
-       g_return_val_if_fail (!G_STR_EMPTY (group), FALSE);
 
        priv = GET_PRIV (contact);
 
-       if (g_list_find_custom (priv->groups, group, (GCompareFunc) strcmp)) {
-               return TRUE;
-       }
-
-       return FALSE;
+       return (priv->presence > MC_PRESENCE_OFFLINE);
 }
 
 const gchar *
@@ -744,21 +643,24 @@ empathy_contact_get_status (EmpathyContact *contact)
 
        priv = GET_PRIV (contact);
 
-       if (priv->presence) {
-               const gchar *status;
+       if (priv->presence_message) {
+               return priv->presence_message;
+       }
 
-               status = empathy_presence_get_status (priv->presence);
-               if (!status) {
-                       McPresence state;
+       return empathy_presence_get_default_message (priv->presence);
+}
 
-                       state = empathy_presence_get_state (priv->presence);
-                       status = empathy_presence_state_get_default_status (state);
-               }
+gboolean
+empathy_contact_can_voip (EmpathyContact *contact)
+{
+       EmpathyContactPriv *priv;
 
-               return status;
-       }
+       g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), FALSE);
+
+       priv = GET_PRIV (contact);
 
-       return empathy_presence_state_get_default_status (MC_PRESENCE_OFFLINE);
+       return priv->capabilities & (EMPATHY_CAPABILITIES_AUDIO |
+                                    EMPATHY_CAPABILITIES_VIDEO);
 }
 
 gboolean