]> git.0d.be Git - empathy.git/blobdiff - libempathy/gossip-presence.c
[darcs-to-svn @ do not assert when there is an unknown state str]
[empathy.git] / libempathy / gossip-presence.c
index e41ae5548da077b52f7c6be204bc593f5abfa38c..e78c11b2f3b295619e791af07daaf49c972bff95 100644 (file)
 typedef struct _GossipPresencePriv GossipPresencePriv;
 
 struct _GossipPresencePriv {
-       GossipPresenceState  state;
-
-       gchar               *status;
-       gchar               *resource;
-
-       gint                 priority;
-       GossipTime           timestamp;
+       McPresence  state;
+       gchar      *status;
+       GossipTime  timestamp;
 };
 
-static void         presence_finalize           (GObject             *object);
-static void         presence_get_property       (GObject             *object,
-                                                guint                param_id,
-                                                GValue              *value,
-                                                GParamSpec          *pspec);
-static void         presence_set_property       (GObject             *object,
-                                                guint                param_id,
-                                                const GValue        *value,
-                                                GParamSpec          *pspec);
+static void         presence_finalize     (GObject      *object);
+static void         presence_get_property (GObject      *object,
+                                          guint         param_id,
+                                          GValue       *value,
+                                          GParamSpec   *pspec);
+static void         presence_set_property (GObject      *object,
+                                          guint         param_id,
+                                          const GValue *value,
+                                          GParamSpec   *pspec);
 
 enum {
        PROP_0,
        PROP_STATE,
-       PROP_STATUS,
-       PROP_RESOURCE,
-       PROP_PRIORITY
+       PROP_STATUS
 };
 
 G_DEFINE_TYPE (GossipPresence, gossip_presence, G_TYPE_OBJECT);
@@ -79,9 +73,9 @@ gossip_presence_class_init (GossipPresenceClass *class)
                                         g_param_spec_int ("state",
                                                           "Presence State",
                                                           "The current state of the presence",
-                                                          GOSSIP_PRESENCE_STATE_AVAILABLE,
-                                                          GOSSIP_PRESENCE_STATE_EXT_AWAY,
-                                                          GOSSIP_PRESENCE_STATE_AVAILABLE,
+                                                          MC_PRESENCE_UNSET,
+                                                          LAST_MC_PRESENCE,
+                                                          MC_PRESENCE_AVAILABLE,
                                                           G_PARAM_READWRITE));
        g_object_class_install_property (object_class,
                                         PROP_STATUS,
@@ -90,22 +84,6 @@ gossip_presence_class_init (GossipPresenceClass *class)
                                                              "Status string set on presence",
                                                              NULL,
                                                              G_PARAM_READWRITE));
-       g_object_class_install_property (object_class,
-                                        PROP_RESOURCE,
-                                        g_param_spec_string ("resource",
-                                                             "Presence Resource",
-                                                             "Resource that this presence is for",
-                                                             NULL,
-                                                             G_PARAM_READWRITE));
-       g_object_class_install_property (object_class,
-                                        PROP_PRIORITY,
-                                        g_param_spec_int ("priority",
-                                                          "Presence Priority",
-                                                          "Priority value of presence",
-                                                          G_MININT,
-                                                          G_MAXINT,
-                                                          0,
-                                                          G_PARAM_READWRITE));
 
        g_type_class_add_private (object_class, sizeof (GossipPresencePriv));
 }
@@ -117,13 +95,8 @@ gossip_presence_init (GossipPresence *presence)
 
        priv = GET_PRIV (presence);
 
-       priv->state = GOSSIP_PRESENCE_STATE_AVAILABLE;
-
+       priv->state = MC_PRESENCE_AVAILABLE;
        priv->status = NULL;
-       priv->resource = NULL;
-
-       priv->priority = 0;
-
        priv->timestamp = gossip_time_get_current ();
 }
 
@@ -135,7 +108,6 @@ presence_finalize (GObject *object)
        priv = GET_PRIV (object);
 
        g_free (priv->status);
-       g_free (priv->resource);
 
        (G_OBJECT_CLASS (gossip_presence_parent_class)->finalize) (object);
 }
@@ -158,13 +130,6 @@ presence_get_property (GObject    *object,
                g_value_set_string (value,
                                    gossip_presence_get_status (GOSSIP_PRESENCE (object)));
                break;
-       case PROP_RESOURCE:
-               g_value_set_string (value,
-                                   gossip_presence_get_resource (GOSSIP_PRESENCE (object)));
-               break;
-       case PROP_PRIORITY:
-               g_value_set_int (value, priv->priority);
-               break;
        default:
                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
                break;
@@ -188,13 +153,6 @@ presence_set_property (GObject      *object,
                gossip_presence_set_status (GOSSIP_PRESENCE (object),
                                            g_value_get_string (value));
                break;
-       case PROP_RESOURCE:
-               gossip_presence_set_resource (GOSSIP_PRESENCE (object),
-                                             g_value_get_string (value));
-               break;
-       case PROP_PRIORITY:
-               priv->priority = g_value_get_int (value);
-               break;
        default:
                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
                break;
@@ -208,8 +166,8 @@ gossip_presence_new (void)
 }
 
 GossipPresence *
-gossip_presence_new_full (GossipPresenceState  state,
-                         const gchar         *status)
+gossip_presence_new_full (McPresence   state,
+                         const gchar *status)
 {
        return g_object_new (GOSSIP_TYPE_PRESENCE,
                             "state", state,
@@ -217,22 +175,6 @@ gossip_presence_new_full (GossipPresenceState  state,
                             NULL);
 }
 
-const gchar *
-gossip_presence_get_resource (GossipPresence *presence)
-{
-       GossipPresencePriv *priv;
-
-       g_return_val_if_fail (GOSSIP_IS_PRESENCE (presence), NULL);
-
-       priv = GET_PRIV (presence);
-
-       if (priv->resource) {
-               return priv->resource;
-       }
-
-       return NULL;
-}
-
 const gchar *
 gossip_presence_get_status (GossipPresence *presence)
 {
@@ -246,41 +188,13 @@ gossip_presence_get_status (GossipPresence *presence)
        return priv->status;
 }
 
-gint
-gossip_presence_get_priority (GossipPresence *presence)
-{
-       GossipPresencePriv *priv;
-
-       priv = GET_PRIV (presence);
-       g_return_val_if_fail (GOSSIP_IS_PRESENCE (presence), 0);
-
-       return priv->priority;
-}
-
-void
-gossip_presence_set_resource (GossipPresence *presence,
-                             const gchar    *resource)
-{
-       GossipPresencePriv *priv;
-
-       g_return_if_fail (GOSSIP_IS_PRESENCE (presence));
-       g_return_if_fail (resource != NULL);
-
-       priv = GET_PRIV (presence);
-
-       g_free (priv->resource);
-       priv->resource = g_strdup (resource);
-
-       g_object_notify (G_OBJECT (presence), "resource");
-}
-
-GossipPresenceState
+McPresence
 gossip_presence_get_state (GossipPresence *presence)
 {
        GossipPresencePriv *priv;
 
        g_return_val_if_fail (GOSSIP_IS_PRESENCE (presence),
-                             GOSSIP_PRESENCE_STATE_AVAILABLE);
+                             MC_PRESENCE_AVAILABLE);
 
        priv = GET_PRIV (presence);
 
@@ -288,8 +202,8 @@ gossip_presence_get_state (GossipPresence *presence)
 }
 
 void
-gossip_presence_set_state (GossipPresence      *presence,
-                          GossipPresenceState  state)
+gossip_presence_set_state (GossipPresence *presence,
+                          McPresence      state)
 {
        GossipPresencePriv *priv;
 
@@ -322,53 +236,6 @@ gossip_presence_set_status (GossipPresence *presence,
        g_object_notify (G_OBJECT (presence), "status");
 }
 
-void
-gossip_presence_set_priority (GossipPresence *presence,
-                             gint            priority)
-{
-       GossipPresencePriv *priv;
-
-       g_return_if_fail (GOSSIP_IS_PRESENCE (presence));
-
-       priv = GET_PRIV (presence);
-
-       priv->priority = priority;
-
-       g_object_notify (G_OBJECT (presence), "priority");
-}
-
-gboolean
-gossip_presence_resource_equal (gconstpointer a,
-                               gconstpointer b)
-{
-       GossipPresencePriv *priv1;
-       GossipPresencePriv *priv2;
-
-       g_return_val_if_fail (GOSSIP_IS_PRESENCE (a), FALSE);
-       g_return_val_if_fail (GOSSIP_IS_PRESENCE (b), FALSE);
-
-       priv1 = GET_PRIV (a);
-       priv2 = GET_PRIV (b);
-
-       if (!priv1->resource) {
-               if (!priv2->resource) {
-                       return TRUE;
-               }
-
-               return FALSE;
-       }
-
-       if (!priv2->resource) {
-               return FALSE;
-       }
-
-       if (strcmp (priv1->resource, priv2->resource) == 0) {
-               return TRUE;
-       }
-
-       return FALSE;
-}
-
 gint
 gossip_presence_sort_func (gconstpointer a,
                           gconstpointer b)
@@ -379,16 +246,6 @@ gossip_presence_sort_func (gconstpointer a,
 
        g_return_val_if_fail (GOSSIP_IS_PRESENCE (a), 0);
        g_return_val_if_fail (GOSSIP_IS_PRESENCE (b), 0);
-
-       /* We sort here by priority AND status, in theory, the
-        * priority would be enough for JUST Jabber contacts which
-        * actually abide to the protocol, but for other protocols and
-        * dodgy clients, we will sort by:
-        *   
-        *    1. State
-        *    2. Priority
-        *    3. Time it was set (most recent first).
-        */
         
        priv_a = GET_PRIV (a);
        priv_b = GET_PRIV (b);
@@ -399,43 +256,84 @@ gossip_presence_sort_func (gconstpointer a,
                return diff < 1 ? -1 : +1;
        }
 
-       /* 2. Priority */
-       diff = priv_a->priority - priv_b->priority;
-       if (diff != 0) {
-               return diff < 1 ? -1 : +1;
-       }
-
        /* 3. Time (newest first) */
        diff = priv_b->timestamp - priv_a->timestamp;
        if (diff != 0) {
                return diff < 1 ? -1 : +1;
        }
                
-       /* No real difference, except maybe resource */
+       /* No real difference */
        return 0;
 }
 
 const gchar *
-gossip_presence_state_get_default_status (GossipPresenceState state)
+gossip_presence_state_get_default_status (McPresence state)
 {
        switch (state) {
-       case GOSSIP_PRESENCE_STATE_AVAILABLE:
+       case MC_PRESENCE_AVAILABLE:
                return _("Available");
-               break;
-
-       case GOSSIP_PRESENCE_STATE_BUSY:
+       case MC_PRESENCE_DO_NOT_DISTURB:
                return _("Busy");
-               break;
-
-       case GOSSIP_PRESENCE_STATE_AWAY:
-       case GOSSIP_PRESENCE_STATE_EXT_AWAY:
+       case MC_PRESENCE_AWAY:
+       case MC_PRESENCE_EXTENDED_AWAY:
                return _("Away");
-               break;
-
-       case GOSSIP_PRESENCE_STATE_HIDDEN:
-       case GOSSIP_PRESENCE_STATE_UNAVAILABLE:
+       case MC_PRESENCE_HIDDEN:
                return _("Unavailable");
+       case MC_PRESENCE_OFFLINE:
+               return _("Offline");
+       case MC_PRESENCE_UNSET:
+               return _("Unset");
+       default:
+               g_assert_not_reached ();
+       }
+
+       return NULL;
+}
+
+const gchar *
+gossip_presence_state_to_str (McPresence state)
+{
+       switch (state) {
+       case MC_PRESENCE_AVAILABLE:
+               return "available";
+       case MC_PRESENCE_DO_NOT_DISTURB:
+               return "busy";
+       case MC_PRESENCE_AWAY:
+               return "away";
+       case MC_PRESENCE_EXTENDED_AWAY:
+               return "ext_away";
+       case MC_PRESENCE_HIDDEN:
+               return "hidden";
+       case MC_PRESENCE_OFFLINE:
+               return "offline";
+       case MC_PRESENCE_UNSET:
+               return "unset";
+       default:
+               g_assert_not_reached ();
+       }
+
+       return NULL;
+}
+
+McPresence
+gossip_presence_state_from_str (const gchar *str)
+{
+       if (strcmp (str, "available") == 0) {
+               return MC_PRESENCE_AVAILABLE;
+       } else if ((strcmp (str, "dnd") == 0) || (strcmp (str, "busy") == 0)) {
+               return MC_PRESENCE_DO_NOT_DISTURB;
+       } else if ((strcmp (str, "away") == 0) || (strcmp (str, "brb") == 0)) {
+               return MC_PRESENCE_AWAY;
+       } else if ((strcmp (str, "xa") == 0) || (strcmp (str, "ext_away") == 0)) {
+               return MC_PRESENCE_EXTENDED_AWAY;
+       } else if (strcmp (str, "hidden") == 0) {
+               return MC_PRESENCE_HIDDEN;
+       } else if (strcmp (str, "offline") == 0) {
+               return MC_PRESENCE_OFFLINE;
+       } else if (strcmp (str, "unset") == 0) {
+               return MC_PRESENCE_UNSET;
        }
 
-       return _("Available");
+       return MC_PRESENCE_AVAILABLE;
 }
+