/* -*- 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
*
* 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"
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,
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;
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",
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",
}
static void
-contact_init (EmpathyContact *contact)
+empathy_contact_init (EmpathyContact *contact)
{
}
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
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;
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));
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,
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)
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)
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)
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;
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;
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
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 *
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