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);
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,
"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));
}
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 ();
}
priv = GET_PRIV (object);
g_free (priv->status);
- g_free (priv->resource);
(G_OBJECT_CLASS (gossip_presence_parent_class)->finalize) (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;
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;
}
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,
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)
{
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);
}
void
-gossip_presence_set_state (GossipPresence *presence,
- GossipPresenceState state)
+gossip_presence_set_state (GossipPresence *presence,
+ McPresence state)
{
GossipPresencePriv *priv;
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)
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);
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;
}
+