Mercurial > pidgin.yaz
diff libpurple/protocols/oscar/oscar.c @ 27760:e9cf897bd873
propagate from branch 'im.pidgin.pidgin' (head ae7f8e3acb446776f833c3b44514295ae56184b3)
to branch 'im.pidgin.pidgin.yaz' (head 952151791a1f3b4e3469a5621f4cfa2de608a8b8)
author | Yoshiki Yazawa <yaz@honeyplanet.jp> |
---|---|
date | Wed, 30 Jan 2008 10:53:22 +0000 |
parents | 4426e530c156 19ace070f0e5 |
children | ed6de6a3604f |
line wrap: on
line diff
--- a/libpurple/protocols/oscar/oscar.c Thu Jan 10 05:32:41 2008 +0000 +++ b/libpurple/protocols/oscar/oscar.c Wed Jan 30 10:53:22 2008 +0000 @@ -197,7 +197,6 @@ static void purple_icons_fetch(PurpleConnection *gc); -static void recent_buddies_cb(const char *name, PurplePrefType type, gconstpointer value, gpointer data); void oscar_set_info(PurpleConnection *gc, const char *info); static void oscar_set_info_and_status(PurpleAccount *account, gboolean setinfo, const char *rawinfo, gboolean setstatus, PurpleStatus *status); static void oscar_set_extendedstatus(PurpleConnection *gc); @@ -1203,6 +1202,48 @@ return 1; } +static void +idle_reporting_pref_cb(const char *name, PurplePrefType type, + gconstpointer value, gpointer data) +{ + PurpleConnection *gc; + OscarData *od; + gboolean report_idle; + guint32 presence; + + gc = data; + od = gc->proto_data; + report_idle = strcmp((const char *)value, "none") != 0; + presence = aim_ssi_getpresence(od->ssi.local); + + if (report_idle) + aim_ssi_setpresence(od, presence | 0x400); + else + aim_ssi_setpresence(od, presence & ~0x400); +} + +/** + * Should probably make a "Use recent buddies group" account preference + * so that this option is surfaced to the user. + */ +static void +recent_buddies_pref_cb(const char *name, PurplePrefType type, + gconstpointer value, gpointer data) +{ + PurpleConnection *gc; + OscarData *od; + guint32 presence; + + gc = data; + od = gc->proto_data; + presence = aim_ssi_getpresence(od->ssi.local); + + if (value) + aim_ssi_setpresence(od, presence & ~AIM_SSI_PRESENCE_FLAG_NORECENTBUDDIES); + else + aim_ssi_setpresence(od, presence | AIM_SSI_PRESENCE_FLAG_NORECENTBUDDIES); +} + void oscar_login(PurpleAccount *account) { @@ -1293,7 +1334,8 @@ } /* Connect to core Purple signals */ - purple_prefs_connect_callback(gc, "/plugins/prpl/oscar/recent_buddies", recent_buddies_cb, gc); + purple_prefs_connect_callback(gc, "/purple/away/idle_reporting", idle_reporting_pref_cb, gc); + purple_prefs_connect_callback(gc, "/plugins/prpl/oscar/recent_buddies", recent_buddies_pref_cb, gc); newconn = flap_connection_new(od, SNAC_FAMILY_AUTH); newconn->connect_data = purple_proxy_connect(NULL, account, @@ -1538,6 +1580,7 @@ { struct pieceofcrap *pos = data; gchar *buf; + ssize_t result; if (!PURPLE_CONNECTION_IS_VALID(pos->gc)) { @@ -1549,8 +1592,8 @@ pos->fd = source; if (source < 0) { - buf = g_strdup_printf(_("You may be disconnected shortly. You may want to use TOC until " - "this is fixed. Check %s for updates."), PURPLE_WEBSITE); + buf = g_strdup_printf(_("You may be disconnected shortly. " + "Check %s for updates."), PURPLE_WEBSITE); purple_notify_warning(pos->gc, NULL, _("Unable to get a valid AIM login hash."), buf); @@ -1562,7 +1605,18 @@ buf = g_strdup_printf("GET " AIMHASHDATA "?offset=%ld&len=%ld&modname=%s HTTP/1.0\n\n", pos->offset, pos->len, pos->modname ? pos->modname : ""); - write(pos->fd, buf, strlen(buf)); + result = send(pos->fd, buf, strlen(buf), 0); + if (result != strlen(buf)) { + if (result < 0) + purple_debug_error("oscar", "Error writing %" G_GSIZE_FORMAT + " bytes to fetch AIM hash data: %s\n", + strlen(buf), g_strerror(errno)); + else + purple_debug_error("oscar", "Tried to write %" + G_GSIZE_FORMAT " bytes to fetch AIM hash data but " + "instead wrote %" G_GSIZE_FORMAT " bytes\n", + strlen(buf), result); + } g_free(buf); g_free(pos->modname); pos->inpa = purple_input_add(pos->fd, PURPLE_INPUT_READ, damn_you, pos); @@ -1744,7 +1798,6 @@ int type = 0; gboolean buddy_is_away = FALSE; const char *status_id; - char *itmsurl = NULL; va_list ap; aim_userinfo_t *info; @@ -1792,11 +1845,6 @@ status_id = OSCAR_STATUS_ID_AVAILABLE; } - if (info->itmsurl_encoding && info->itmsurl && info->itmsurl_len) - /* Grab the iTunes Music Store URL */ - itmsurl = oscar_encoding_to_utf8(account, info->itmsurl_encoding, - info->itmsurl, info->itmsurl_len); - if (info->flags & AIM_FLAG_WIRELESS) { purple_prpl_got_user_status(account, info->sn, OSCAR_STATUS_ID_MOBILE, NULL); @@ -1804,27 +1852,31 @@ purple_prpl_got_user_status_deactive(account, info->sn, OSCAR_STATUS_ID_MOBILE); } - if (status_id == OSCAR_STATUS_ID_AVAILABLE) + if (strcmp(status_id, OSCAR_STATUS_ID_AVAILABLE) == 0) { char *message = NULL; + char *itmsurl = NULL; if (info->status != NULL && info->status[0] != '\0') /* Grab the available message */ message = oscar_encoding_to_utf8(account, info->status_encoding, info->status, info->status_len); + if (info->itmsurl_encoding && info->itmsurl && info->itmsurl_len) + /* Grab the iTunes Music Store URL */ + itmsurl = oscar_encoding_to_utf8(account, info->itmsurl_encoding, + info->itmsurl, info->itmsurl_len); + purple_prpl_got_user_status(account, info->sn, status_id, "message", message, "itmsurl", itmsurl, NULL); g_free(message); + g_free(itmsurl); } else { - purple_prpl_got_user_status(account, info->sn, status_id, - "itmsurl", itmsurl, NULL); - } - - g_free(itmsurl); + purple_prpl_got_user_status(account, info->sn, status_id, NULL); + } /* Login time stuff */ if (info->present & AIM_USERINFO_PRESENT_ONLINESINCE) @@ -4471,7 +4523,6 @@ PurplePresence *presence; PurpleStatusType *status_type; PurpleStatusPrimitive primitive; - gboolean invisible; char *htmlinfo; char *info_encoding = NULL; @@ -4486,7 +4537,6 @@ status_type = purple_status_get_type(status); primitive = purple_status_type_get_primitive(status_type); presence = purple_account_get_presence(account); - invisible = purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_INVISIBLE); if (!setinfo) { @@ -4924,9 +4974,21 @@ } } /* Presence settings (idle time visibility) */ - if ((tmp = aim_ssi_getpresence(od->ssi.local)) != 0xFFFFFFFF) - if (!(tmp & 0x400)) + tmp = aim_ssi_getpresence(od->ssi.local); + if (tmp != 0xFFFFFFFF) { + const char *idle_reporting_pref; + gboolean report_idle; + + idle_reporting_pref = purple_prefs_get_string("/purple/away/idle_reporting"); + report_idle = strcmp(idle_reporting_pref, "none") != 0; + + if (report_idle) aim_ssi_setpresence(od, tmp | 0x400); + else + aim_ssi_setpresence(od, tmp & ~0x400); + } + + } /* end pruning buddies from local list */ /* Add from server list to local list */ @@ -6002,7 +6064,7 @@ _("Because this reveals your IP address, it " "may be considered a security risk. Do you " "wish to continue?"), - 0, + 0, /* Default action is "connect" */ purple_connection_get_account(gc), data->who, NULL, data, 2, _("C_onnect"), G_CALLBACK(oscar_ask_directim_yes_cb), @@ -6565,33 +6627,6 @@ } } -static void -recent_buddies_cb(const char *name, PurplePrefType type, - gconstpointer value, gpointer data) -{ - PurpleConnection *gc = data; - OscarData *od = gc->proto_data; - guint32 presence; - - presence = aim_ssi_getpresence(od->ssi.local); - - if (value) { - presence &= ~AIM_SSI_PRESENCE_FLAG_NORECENTBUDDIES; - aim_ssi_setpresence(od, presence); - } else { - presence |= AIM_SSI_PRESENCE_FLAG_NORECENTBUDDIES; - aim_ssi_setpresence(od, presence); - } -} - -#ifdef USE_PRPL_PREFERENCES - ppref = purple_plugin_pref_new_with_name_and_label("/plugins/prpl/oscar/recent_buddies", _("Use recent buddies group")); - purple_plugin_pref_frame_add(frame, ppref); - - ppref = purple_plugin_pref_new_with_name_and_label("/plugins/prpl/oscar/show_idle", _("Show how long you have been idle")); - purple_plugin_pref_frame_add(frame, ppref); -#endif - const char * oscar_normalize(const PurpleAccount *account, const char *str) { @@ -6754,7 +6789,7 @@ /* Preferences */ purple_prefs_add_none("/plugins/prpl/oscar"); purple_prefs_add_bool("/plugins/prpl/oscar/recent_buddies", FALSE); - purple_prefs_add_bool("/plugins/prpl/oscar/show_idle", FALSE); + purple_prefs_remove("/plugins/prpl/oscar/show_idle"); purple_prefs_remove("/plugins/prpl/oscar/always_use_rv_proxy"); /* protocol handler */