# HG changeset patch # User Sadrul Habib Chowdhury # Date 1207182260 0 # Node ID f9cdfdae0594e92cf11b81898457216763904828 # Parent 0f8fe131008a22ef17e5570c2487e4f1f9c3055e Between an offline presence with offline-message capability, and a mobile online presence, choose the latter over the former when sending an instant message. diff -r 0f8fe131008a -r f9cdfdae0594 libpurple/status.c --- a/libpurple/status.c Wed Apr 02 16:45:07 2008 +0000 +++ b/libpurple/status.c Thu Apr 03 00:24:20 2008 +0000 @@ -1547,14 +1547,37 @@ return purple_presence_is_online(presence) ? presence->login_time : 0; } +static int +purple_presence_compute_score(const PurplePresence *presence) +{ + GList *l; + int score = 0; + + for (l = purple_presence_get_statuses(presence); l != NULL; l = l->next) { + PurpleStatus *status = (PurpleStatus *)l->data; + PurpleStatusType *type = purple_status_get_type(status); + + if (purple_status_is_active(status)) { + score += primitive_scores[purple_status_type_get_primitive(type)]; + if (!purple_status_is_online(status)) { + PurpleBuddy *b = purple_presence_get_buddy(presence); + if (b && purple_account_supports_offline_message(purple_buddy_get_account(b), b)) + score += primitive_scores[SCORE_OFFLINE_MESSAGE]; + } + } + } + score += purple_account_get_int(purple_presence_get_account(presence), "score", 0); + if (purple_presence_is_idle(presence)) + score += primitive_scores[SCORE_IDLE]; + return score; +} + gint purple_presence_compare(const PurplePresence *presence1, const PurplePresence *presence2) { - gboolean idle1, idle2; time_t idle_time_1, idle_time_2; int score1 = 0, score2 = 0; - GList *l; if (presence1 == presence2) return 0; @@ -1563,49 +1586,18 @@ else if (presence2 == NULL) return -1; - /* Compute the score of the first set of statuses. */ - for (l = purple_presence_get_statuses(presence1); l != NULL; l = l->next) - { - PurpleStatus *status = (PurpleStatus *)l->data; - PurpleStatusType *type = purple_status_get_type(status); + if (purple_presence_is_online(presence1) && + !purple_presence_is_online(presence2)) + return -1; + else if (purple_presence_is_online(presence2) && + !purple_presence_is_online(presence1)) + return 1; - if (purple_status_is_active(status)) { - score1 += primitive_scores[purple_status_type_get_primitive(type)]; - if (!purple_status_is_online(status)) { - PurpleBuddy *b = purple_presence_get_buddy(presence1); - if (b && purple_account_supports_offline_message(purple_buddy_get_account(b),b)) - score1 += primitive_scores[SCORE_OFFLINE_MESSAGE]; - } - } - } - score1 += purple_account_get_int(purple_presence_get_account(presence1), "score", 0); + /* Compute the score of the first set of statuses. */ + score1 = purple_presence_compute_score(presence1); /* Compute the score of the second set of statuses. */ - for (l = purple_presence_get_statuses(presence2); l != NULL; l = l->next) - { - PurpleStatus *status = (PurpleStatus *)l->data; - PurpleStatusType *type = purple_status_get_type(status); - - if (purple_status_is_active(status)) { - score2 += primitive_scores[purple_status_type_get_primitive(type)]; - if (!purple_status_is_online(status)) { - PurpleBuddy *b = purple_presence_get_buddy(presence2); - if (b && purple_account_supports_offline_message(purple_buddy_get_account(b),b)) - score2 += primitive_scores[SCORE_OFFLINE_MESSAGE]; - } - - } - } - score2 += purple_account_get_int(purple_presence_get_account(presence2), "score", 0); - - idle1 = purple_presence_is_idle(presence1); - idle2 = purple_presence_is_idle(presence2); - - if (idle1) - score1 += primitive_scores[SCORE_IDLE]; - - if (idle2) - score2 += primitive_scores[SCORE_IDLE]; + score2 = purple_presence_compute_score(presence2); idle_time_1 = time(NULL) - purple_presence_get_idle_time(presence1); idle_time_2 = time(NULL) - purple_presence_get_idle_time(presence2);