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)
}
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) {
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;
}
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
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);
}
-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;
}
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 = {
#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 {