# HG changeset patch # User Mark Doliner # Date 1100647793 0 # Node ID 760e690a5f30695034dc08c3857f65438c9b0bc0 # Parent fa4973f356a1e375d63051a3cacd4403b394050c [gaim-migrate @ 11313] A few steps closer to being able to set an oscar away message. committer: Tailor Script diff -r fa4973f356a1 -r 760e690a5f30 src/account.c --- a/src/account.c Tue Nov 16 03:56:09 2004 +0000 +++ b/src/account.c Tue Nov 16 23:29:53 2004 +0000 @@ -553,6 +553,11 @@ gboolean active, ...) { GaimStatus *status; + gboolean changed = FALSE; + va_list args; + const char *id, *string_data; + int int_data; + gboolean boolean_data; g_return_if_fail(account != NULL); g_return_if_fail(status_id != NULL); @@ -575,7 +580,52 @@ return; } - if (gaim_status_is_active(status) == active) + if (gaim_status_is_active(status) != active) + changed = TRUE; + + /* Set any attributes */ + va_start(args, active); + while ((id = va_arg(args, const char *)) != NULL) + { + GaimValue *value; + value = gaim_status_get_attr_value(status, id); + if (value->type == GAIM_TYPE_STRING) + { + string_data = va_arg(args, const char *); + if (((string_data == NULL) && (value->data.string_data == NULL)) || + ((string_data != NULL) && (value->data.string_data != NULL) && + !strcmp(string_data, value->data.string_data))) + { + continue; + } + gaim_status_set_attr_string(status, id, string_data); + changed = TRUE; + } + else if (value->type == GAIM_TYPE_INT) + { + int_data = va_arg(args, int); + if (int_data == value->data.int_data) + continue; + gaim_status_set_attr_int(status, id, int_data); + changed = TRUE; + } + else if (value->type == GAIM_TYPE_BOOLEAN) + { + boolean_data = va_arg(args, gboolean); + if (boolean_data == value->data.boolean_data) + continue; + gaim_status_set_attr_int(status, id, boolean_data); + changed = TRUE; + } + else + { + /* We don't know what the data is--skip over it */ + va_arg(args, void *); + } + } + va_end(args); + + if (!changed) return; gaim_status_set_active(status, active); diff -r fa4973f356a1 -r 760e690a5f30 src/protocols/oscar/oscar.c --- a/src/protocols/oscar/oscar.c Tue Nov 16 03:56:09 2004 +0000 +++ b/src/protocols/oscar/oscar.c Tue Nov 16 23:29:53 2004 +0000 @@ -5549,7 +5549,7 @@ GaimPresence *presence; const gchar *status_id; int charset = 0; - gchar *text_html = NULL; + const gchar *text_html = NULL; char *msg = NULL; gsize msglen = 0; @@ -5558,14 +5558,13 @@ status_id = gaim_status_get_id(status); presence = gaim_account_get_presence(account); + gaim_debug_info("oscar", "Setting status to %s\n", status_id); + if (primitive == GAIM_STATUS_HIDDEN) aim_setextstatus(od->sess, AIM_ICQ_STATE_INVISIBLE); else aim_setextstatus(od->sess, AIM_ICQ_STATE_NORMAL); - - aim_setextstatus(od->sess, AIM_ICQ_STATE_NORMAL); - if (od->rights.maxawaymsglen == 0) gaim_notify_warning(gc, NULL, _("Unable to set AIM away message."), _("You have probably requested to set your " @@ -5578,56 +5577,49 @@ aim_locate_setprofile(od->sess, NULL, NULL, 0, NULL, "", 0); #if 0 /* Set an available message */ - aim_locate_setprofile(od->sess, NULL, NULL, 0, NULL, "", 0); aim_srv_setavailmsg(od->sess, text); #endif - return; - } - - /* - * XXX - Using status_id below is definitely wrong. We want to get - * the away message that the Gaim user just set. We probably want - * to get a certain attribute from status->attr_values, but I don't - * think any of that is implemented yet. - * - * Something like - * text_html = gaim_status_get_attr_string(status, "message"); - */ - status_id = gaim_status_get_name(status); - text_html = gaim_strdup_withhtml(status_id); - - charset = oscar_charset_check(text_html); - if (charset == AIM_CHARSET_UNICODE) { - msg = g_convert(text_html, strlen(text_html), "UCS-2BE", "UTF-8", NULL, &msglen, NULL); - aim_locate_setprofile(od->sess, NULL, NULL, 0, "unicode-2-0", msg, - (msglen > od->rights.maxawaymsglen ? od->rights.maxawaymsglen : msglen)); - g_free(msg); - } else if (charset == AIM_CHARSET_CUSTOM) { - msg = g_convert(text_html, strlen(text_html), "ISO-8859-1", "UTF-8", NULL, &msglen, NULL); - aim_locate_setprofile(od->sess, NULL, NULL, 0, "iso-8859-1", msg, - (msglen > od->rights.maxawaymsglen ? od->rights.maxawaymsglen : msglen)); - g_free(msg); + + } else if (primitive == GAIM_STATUS_AWAY) { + text_html = gaim_status_get_attr_string(status, "message"); + + if (text_html == NULL) { + text_html = _("Away"); + } + + charset = oscar_charset_check(text_html); + if (charset == AIM_CHARSET_UNICODE) { + msg = g_convert(text_html, strlen(text_html), "UCS-2BE", "UTF-8", NULL, &msglen, NULL); + aim_locate_setprofile(od->sess, NULL, NULL, 0, "unicode-2-0", msg, + (msglen > od->rights.maxawaymsglen ? od->rights.maxawaymsglen : msglen)); + g_free(msg); + } else if (charset == AIM_CHARSET_CUSTOM) { + msg = g_convert(text_html, strlen(text_html), "ISO-8859-1", "UTF-8", NULL, &msglen, NULL); + aim_locate_setprofile(od->sess, NULL, NULL, 0, "iso-8859-1", msg, + (msglen > od->rights.maxawaymsglen ? od->rights.maxawaymsglen : msglen)); + g_free(msg); + } else { + msglen = strlen(text_html); + aim_locate_setprofile(od->sess, NULL, NULL, 0, "us-ascii", text_html, + (msglen > od->rights.maxawaymsglen ? od->rights.maxawaymsglen : msglen)); + } + + if (msglen > od->rights.maxawaymsglen) { + gchar *errstr; + + errstr = g_strdup_printf(ngettext("The maximum away message length of %d byte " + "has been exceeded. Gaim has truncated it for you.", + "The maximum away message length of %d bytes " + "has been exceeded. Gaim has truncated it for you.", + od->rights.maxawaymsglen), od->rights.maxawaymsglen); + gaim_notify_warning(gc, NULL, _("Away message too long."), errstr); + g_free(errstr); + } + } else { - msglen = strlen(text_html); - aim_locate_setprofile(od->sess, NULL, NULL, 0, "us-ascii", text_html, - (msglen > od->rights.maxawaymsglen ? od->rights.maxawaymsglen : msglen)); - } - - if (msglen > od->rights.maxawaymsglen) { - gchar *errstr; - - errstr = g_strdup_printf(ngettext("The maximum away message length of %d byte " - "has been exceeded. Gaim has truncated it for you.", - "The maximum away message length of %d bytes " - "has been exceeded. Gaim has truncated it for you.", - od->rights.maxawaymsglen), od->rights.maxawaymsglen); - gaim_notify_warning(gc, NULL, _("Away message too long."), errstr); - g_free(errstr); - } - - g_free(text_html); - - return; + gaim_debug_info("oscar", "Don't know what to do for this status\n"); + + } } static void diff -r fa4973f356a1 -r 760e690a5f30 src/status.c --- a/src/status.c Tue Nov 16 03:56:09 2004 +0000 +++ b/src/status.c Tue Nov 16 23:29:53 2004 +0000 @@ -750,7 +750,7 @@ attr = gaim_status_type_get_attr(status_type, id); g_return_if_fail(attr != NULL); - attr_value = gaim_status_attr_get_value_type(attr); + attr_value = gaim_status_get_attr_value(status, id); g_return_if_fail(gaim_value_get_type(attr_value) == GAIM_TYPE_STRING); gaim_value_set_string(attr_value, value); @@ -833,6 +833,12 @@ primitive != GAIM_STATUS_OFFLINE); } +/* + * What's the difference between + * gaim_status_get_attr_value(GaimStatus *status, const char *id) + * gaim_status_attr_get_value_type(GaimStatusAttr *attr) + * and I think there was another similar one... + */ GaimValue * gaim_status_get_attr_value(const GaimStatus *status, const char *id) {