]> www.infradead.org Git - pidgin-chime.git/commitdiff
Clean up presence status handling
authorDavid Woodhouse <dwmw@amazon.co.uk>
Thu, 10 Aug 2017 21:01:26 +0000 (22:01 +0100)
committerDavid Woodhouse <dwmw@amazon.co.uk>
Thu, 10 Aug 2017 21:01:26 +0000 (22:01 +0100)
buddy.c
chime-contact.c
chime-contact.h
chime.c
chime.h

diff --git a/buddy.c b/buddy.c
index f60a99bae2c0e0114a3a02e1083757c08750ea20..bde8b7b8fc46589297183ad7854d8618d0048775 100644 (file)
--- a/buddy.c
+++ b/buddy.c
@@ -35,7 +35,8 @@ static void on_contact_availability(ChimeContact *contact, GParamSpec *ignored,
        ChimeAvailability availability = chime_contact_get_availability(contact);
 
        if (availability)
-               purple_prpl_got_user_status(conn->account, chime_contact_get_email(contact), chime_statuses[availability], NULL);
+               purple_prpl_got_user_status(conn->account, chime_contact_get_email(contact),
+                                           chime_availability_name(availability), NULL);
 }
 
 static void on_contact_display_name(ChimeContact *contact, GParamSpec *ignored, PurpleConnection *conn)
@@ -99,7 +100,7 @@ static void on_buddystatus_changed(ChimeContact *contact, GParamSpec *ignored, P
                        }
                        if (availability)
                                purple_prpl_got_user_status(conn->account, email,
-                                                           chime_statuses[availability], NULL);
+                                                           chime_availability_name(availability), NULL);
                } else {
                        PurpleGroup *group = purple_find_group(_("Chime Contacts"));
                        if (!group) {
@@ -152,7 +153,7 @@ void chime_purple_add_buddy(PurpleConnection *conn, PurpleBuddy *buddy, PurpleGr
                purple_blist_server_alias_buddy(buddy, chime_contact_get_display_name(contact));
                if (availability)
                        purple_prpl_got_user_status(conn->account, purple_buddy_get_name(buddy),
-                                                   chime_statuses[availability], NULL);
+                                                   chime_availability_name(availability), NULL);
                if (chime_contact_get_contacts_list(contact))
                        return;
        }
index f05c4b6527af0e4c473b5ba0e938700f643f1eed..10bc88b560340497f762db1b096cb24338b4f377 100644 (file)
@@ -52,6 +52,26 @@ struct _ChimeContact {
 
 G_DEFINE_TYPE(ChimeContact, chime_contact, CHIME_TYPE_OBJECT)
 
+#define CHIME_AVAILABILITY_VALUES \
+       { CHIME_AVAILABILITY_UNKNOWN,   "unknown",      N_("Unknown") },\
+       { CHIME_AVAILABILITY_OFFLINE,   "offline",      N_("Offline") },\
+       { CHIME_AVAILABILITY_AVAILABLE, "available",    N_("Availabie") },\
+       { CHIME_AVAILABILITY_AWAY,      "away",         N_("Away") },\
+       { CHIME_AVAILABILITY_BUSY,      "busy",         N_("Busy") },\
+       { CHIME_AVAILABILITY_MOBILE,    "mobile",       N_("Mobile") },\
+       { CHIME_AVAILABILITY_PRIVATE,   "private",      N_("Private") },
+
+CHIME_DEFINE_ENUM_TYPE(ChimeAvailability, chime_availability, CHIME_AVAILABILITY_VALUES)
+
+
+const gchar *chime_availability_name(ChimeAvailability av)
+{
+       gpointer klass = g_type_class_ref(CHIME_TYPE_AVAILABILITY);
+       GEnumValue *val = g_enum_get_value(klass, av);
+       g_type_class_unref(klass);
+       return val->value_name;
+}
+
 static void unsubscribe_contact(gpointer key, gpointer val, gpointer data);
 
 static void
index 56db97ac1d5cbf916944ba3ae01213aea038e00f..530759e45d13f68958b6ff0879be5dfb4cf933c7 100644 (file)
@@ -36,10 +36,21 @@ typedef enum {
        CHIME_AVAILABILITY_AWAY,
        CHIME_AVAILABILITY_BUSY,
        CHIME_AVAILABILITY_MOBILE,
-       CHIME_AVAILABILITY_SIX,
+       CHIME_AVAILABILITY_PRIVATE,
        CHIME_AVAILABILITY_LAST
 } ChimeAvailability;
 
+#define CHIME_TYPE_AVAILABILITY (chime_availability_get_type ())
+GType chime_availability_get_type (void) G_GNUC_CONST;
+
+typedef enum {
+       CHIME_PRESENCE_AUTOMATIC = 0,
+       CHIME_PRESENCE_AVAILABLE,
+       CHIME_PRESENCE_BUSY,
+} ChimeManualPresence;
+
+const gchar *chime_availability_name(ChimeAvailability av);
+
 const gchar *chime_contact_get_profile_id(ChimeContact *contact);
 
 const gchar *chime_contact_get_email(ChimeContact *contact);
diff --git a/chime.c b/chime.c
index 4ce921eeb49e4de25ea2c0efd810def13b651abb..a4a4b7d50817af5384c82e2a64ce16aab34c96e3 100644 (file)
--- a/chime.c
+++ b/chime.c
@@ -242,33 +242,33 @@ static void chime_purple_close(PurpleConnection *conn)
 }
 
 
-const gchar *chime_statuses[CHIME_AVAILABILITY_LAST] = {
-       "zero", "offline", "Automatic", "three", "Busy", "Mobile", "six"
+static const PurpleStatusPrimitive purple_statuses[] = {
+       [CHIME_AVAILABILITY_OFFLINE] = PURPLE_STATUS_OFFLINE,
+       [CHIME_AVAILABILITY_AVAILABLE] = PURPLE_STATUS_AVAILABLE,
+       [CHIME_AVAILABILITY_AWAY] = PURPLE_STATUS_AWAY,
+       [CHIME_AVAILABILITY_BUSY] = PURPLE_STATUS_UNAVAILABLE,
+       [CHIME_AVAILABILITY_MOBILE] = PURPLE_STATUS_MOBILE,
+       [CHIME_AVAILABILITY_PRIVATE] = PURPLE_STATUS_INVISIBLE,
 };
 
 static GList *chime_purple_status_types(PurpleAccount *account)
 {
        PurpleStatusType *type;
+       ChimeAvailability av;
        GList *types = NULL;
 
-       type = purple_status_type_new(PURPLE_STATUS_OFFLINE, chime_statuses[1],
-                                     _("Offline"), TRUE);
-       types = g_list_append(types, type);
-       type = purple_status_type_new(PURPLE_STATUS_AVAILABLE, chime_statuses[2],
-                                     _("Available"), TRUE);
-       types = g_list_append(types, type);
-       type = purple_status_type_new(PURPLE_STATUS_AWAY, chime_statuses[3],
-                                     _("Status 3"), FALSE);
-       types = g_list_append(types, type);
-       type = purple_status_type_new(PURPLE_STATUS_UNAVAILABLE, chime_statuses[4],
-                                     _("Busy"), TRUE);
-       types = g_list_append(types, type);
-       type = purple_status_type_new(PURPLE_STATUS_MOBILE, chime_statuses[5],
-                                     _("Mobile"), FALSE);
-       types = g_list_append(types, type);
-       type = purple_status_type_new(PURPLE_STATUS_UNAVAILABLE, chime_statuses[6],
-                                     _("Six"), FALSE);
-       types = g_list_append(types, type);
+       gpointer klass = g_type_class_ref(CHIME_TYPE_AVAILABILITY);
+
+       for (av = CHIME_AVAILABILITY_OFFLINE; av <= CHIME_AVAILABILITY_PRIVATE; av++) {
+               GEnumValue *val = g_enum_get_value(klass, av);
+
+               type = purple_status_type_new(purple_statuses[av], val->value_name,
+                                             _(val->value_nick),
+                                             (av == CHIME_AVAILABILITY_AVAILABLE ||
+                                              av == CHIME_AVAILABILITY_BUSY));
+               types = g_list_append(types, type);
+       }
+       g_type_class_unref(klass);
 
        return types;
 }
@@ -287,11 +287,12 @@ static void on_set_status_ready(GObject *source, GAsyncResult *result, gpointer
 static void chime_purple_set_status(PurpleAccount *account, PurpleStatus *status)
 {
        ChimeConnection *cxn = purple_connection_get_protocol_data(account->gc);
-       printf("set status %s\n", purple_status_get_id(status));
+       const gchar *status_str  = purple_status_is_available(status) ? "Automatic" : "Busy";
+
+       printf("set status %s for %s\n", status_str, purple_status_get_id(status));
 
-       chime_connection_set_presence_async(cxn, purple_status_get_id(status), NULL,
-                                           NULL, on_set_status_ready,
-                                           NULL);
+       chime_connection_set_presence_async(cxn, status_str, NULL, NULL,
+                                           on_set_status_ready, NULL);
 }
 
 static PurplePluginProtocolInfo chime_prpl_info = {
diff --git a/chime.h b/chime.h
index e4111d1671a7306d8e62a11646700a0c8add14b1..77624996a64b3f591760cbee31b0445bb43f39c3 100644 (file)
--- a/chime.h
+++ b/chime.h
@@ -31,9 +31,6 @@
 #define CHIME_DEVICE_CAP_WEBINAR                       (1<<3)
 #define CHIME_DEVICE_CAP_PRESENCE_SUBSCRIPTION         (1<<4)
 
-#define CHIME_MAX_STATUS 7
-extern const gchar *chime_statuses[CHIME_MAX_STATUS];
-
 /* SoupMessage handling for Chime communication, with retry on re-auth
  * and JSON parsing. XX: MAke this a proper superclass of SoupMessage */
 struct chime_msg {