# HG changeset patch # User Eric Warmenhoven # Date 976885495 0 # Node ID d8eaf65ca9c3ce8497ae8556a385b2afb00c5a85 # Parent cbb8d7a9be43681f0728dac875ee63283015c46b [gaim-migrate @ 1298] libfaim changes, clean up warn dialog committer: Tailor Script diff -r cbb8d7a9be43 -r d8eaf65ca9c3 libfaim/CHANGES --- a/libfaim/CHANGES Fri Dec 15 02:31:36 2000 +0000 +++ b/libfaim/CHANGES Fri Dec 15 13:04:55 2000 +0000 @@ -1,6 +1,13 @@ No release numbers ------------------ + - Fri Dec 15 02:04:12 UTC 2000 + - Parse rate changes *properly* + - Add sample code to faimtest demonstrating my approximations + on how to fiddle with aim_conn_setlatency() in relation + to the rate changes (properly wildly conservative). [I also + copied this stuff into mfaim.] + - Thu Dec 14 03:39:34 UTC 2000 - Change the 0x01 to a 0x00 in auth request to make buddy lists work again - Rearrange bytes in setversions() to match winaim diff -r cbb8d7a9be43 -r d8eaf65ca9c3 libfaim/aim_rxhandlers.c --- a/libfaim/aim_rxhandlers.c Fri Dec 15 02:31:36 2000 +0000 +++ b/libfaim/aim_rxhandlers.c Fri Dec 15 13:04:55 2000 +0000 @@ -574,6 +574,8 @@ workingPtr->handled = aim_parse_hostonline(sess, workingPtr); else if (subtype == 0x0007) workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, 0x0001, 0x0007, workingPtr); + else if (subtype == 0x000a) + workingPtr->handled = aim_parse_ratechange_middle(sess, workingPtr); else workingPtr->handled = aim_callhandler_noparam(sess, workingPtr->conn, family, subtype, workingPtr); } else if (family == 0x000e) { @@ -657,17 +659,36 @@ { rxcallback_t userfunc = NULL; int ret = 1; - unsigned long newrate; + int i; + int code; + unsigned long parmid, windowsize, clear, alert, limit, disconnect; + unsigned long currentavg, maxavg; + + i = 10; + + code = aimutil_get16(command->data+i); + i += 2; + + parmid = aimutil_get16(command->data+i); + i += 2; - if (command->commandlen != 0x2f) { - printf("faim: unknown rate change length 0x%04x\n", command->commandlen); - return 1; - } - - newrate = aimutil_get32(command->data+34); + windowsize = aimutil_get32(command->data+i); + i += 4; + clear = aimutil_get32(command->data+i); + i += 4; + alert = aimutil_get32(command->data+i); + i += 4; + limit = aimutil_get32(command->data+i); + i += 4; + disconnect = aimutil_get32(command->data+i); + i += 4; + currentavg = aimutil_get32(command->data+i); + i += 4; + maxavg = aimutil_get32(command->data+i); + i += 4; if ((userfunc = aim_callhandler(command->conn, 0x0001, 0x000a))) - ret = userfunc(sess, command, newrate); + ret = userfunc(sess, command, code, parmid, windowsize, clear, alert, limit, disconnect, currentavg, maxavg); return ret; } diff -r cbb8d7a9be43 -r d8eaf65ca9c3 libfaim/faim/aim.h --- a/libfaim/faim/aim.h Fri Dec 15 02:31:36 2000 +0000 +++ b/libfaim/faim/aim.h Fri Dec 15 13:04:55 2000 +0000 @@ -577,7 +577,13 @@ int aim_parse_last_bad(struct aim_session_t *, struct command_rx_struct *, ...); faim_internal int aim_parse_generalerrs(struct aim_session_t *, struct command_rx_struct *command, ...); faim_internal int aim_parsemotd_middle(struct aim_session_t *sess, struct command_rx_struct *command, ...); + +#define AIM_RATE_CODE_CHANGE 0x0001 +#define AIM_RATE_CODE_WARNING 0x0002 +#define AIM_RATE_CODE_LIMIT 0x0003 +#define AIM_RATE_CODE_CLEARLIMIT 0x0004 faim_internal int aim_parse_ratechange_middle(struct aim_session_t *sess, struct command_rx_struct *command); + faim_internal int aim_parse_evilnotify_middle(struct aim_session_t *sess, struct command_rx_struct *command); faim_internal int aim_parse_msgack_middle(struct aim_session_t *sess, struct command_rx_struct *command); diff -r cbb8d7a9be43 -r d8eaf65ca9c3 plugins/irc.c --- a/plugins/irc.c Fri Dec 15 02:31:36 2000 +0000 +++ b/plugins/irc.c Fri Dec 15 13:04:55 2000 +0000 @@ -40,9 +40,6 @@ #include "prpl.h" #include "gaim.h" -#include "pixmaps/cancel.xpm" -#include "pixmaps/ok.xpm" - #include "pixmaps/free_icon.xpm" #define IRC_BUF_LEN 4096 diff -r cbb8d7a9be43 -r d8eaf65ca9c3 src/dialogs.c --- a/src/dialogs.c Fri Dec 15 02:31:36 2000 +0000 +++ b/src/dialogs.c Fri Dec 15 13:04:55 2000 +0000 @@ -321,6 +321,10 @@ destroy_dialog(NULL, w->window); } +static void free_warn_data(GtkObject *obj, struct warning *w) +{ + g_free(w); +} void show_warn_dialog(struct gaim_connection *gc, char *who) { @@ -331,77 +335,65 @@ GtkWidget *bbox; GtkWidget *frame; GtkWidget *fbox; + char buf[128]; struct warning *w = g_new0(struct warning, 1); + w->who = who; + w->gc = gc; - char *buf = g_malloc(128); w->window = gtk_window_new(GTK_WINDOW_DIALOG); + dialogwindows = g_list_prepend(dialogwindows, w->window); gtk_window_set_wmclass(GTK_WINDOW(w->window), "warning", "Gaim"); gtk_window_set_policy(GTK_WINDOW(w->window), FALSE, FALSE, TRUE); - gtk_widget_show(w->window); - dialogwindows = g_list_prepend(dialogwindows, w->window); - bbox = gtk_hbox_new(TRUE, 10); - vbox = gtk_vbox_new(FALSE, 5); + gtk_window_set_title(GTK_WINDOW(w->window), _("Gaim - Warn user?")); + gtk_container_set_border_width(GTK_CONTAINER(w->window), 5); + gtk_signal_connect(GTK_OBJECT(w->window), "delete_event", + GTK_SIGNAL_FUNC(destroy_dialog), w->window); + gtk_signal_connect(GTK_OBJECT(w->window), "delete_event", + GTK_SIGNAL_FUNC(free_warn_data), w); + gtk_widget_realize(w->window); + aol_icon(w->window->window); + fbox = gtk_vbox_new(FALSE, 5); + gtk_container_add(GTK_CONTAINER(w->window), fbox); + gtk_widget_show(fbox); frame = gtk_frame_new(_("Warn")); - - warn = picture_button(w->window, _("Warn"), warn_xpm); - - cancel = picture_button(w->window, _("Cancel"), cancel_xpm); - - if (display_options & OPT_DISP_COOL_LOOK) - { - gtk_button_set_relief(GTK_BUTTON(cancel), GTK_RELIEF_NONE); - gtk_button_set_relief(GTK_BUTTON(warn), GTK_RELIEF_NONE); - } - - /* Put the buttons in the box */ - - gtk_box_pack_start(GTK_BOX(bbox), warn, FALSE, FALSE, 5); - gtk_box_pack_end(GTK_BOX(bbox), cancel, FALSE, FALSE, 5); + gtk_box_pack_start(GTK_BOX(fbox), frame, FALSE, FALSE, 5); + gtk_widget_show(frame); + + vbox = gtk_vbox_new(FALSE, 5); + gtk_container_add(GTK_CONTAINER(frame), vbox); + gtk_widget_show(vbox); g_snprintf(buf, 127, _("Do you really want to warn %s?"), who); label = gtk_label_new(buf); gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 5); gtk_widget_show(label); + w->anon = gtk_check_button_new_with_label(_("Warn anonymously?")); gtk_box_pack_start(GTK_BOX(vbox), w->anon, TRUE, TRUE, 5); + gtk_widget_show(w->anon); label = gtk_label_new(_("Anonymous warnings are less harsh.")); gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 5); gtk_widget_show(label); - w->who = who; - w->gc = gc; - - gtk_container_add(GTK_CONTAINER(frame), vbox); - - gtk_box_pack_start(GTK_BOX(fbox), frame, FALSE, FALSE, 5); + bbox = gtk_hbox_new(TRUE, 10); gtk_box_pack_start(GTK_BOX(fbox), bbox, FALSE, FALSE, 5); - - /* Handle closes right */ - gtk_signal_connect(GTK_OBJECT(w->window), "delete_event", - GTK_SIGNAL_FUNC(destroy_dialog), w->window); - gtk_signal_connect(GTK_OBJECT(cancel), "clicked", - GTK_SIGNAL_FUNC(destroy_dialog), w->window); + gtk_widget_show(bbox); + + warn = picture_button(w->window, _("Warn"), warn_xpm); + gtk_box_pack_start(GTK_BOX(bbox), warn, FALSE, FALSE, 5); gtk_signal_connect(GTK_OBJECT(warn), "clicked", GTK_SIGNAL_FUNC(do_warn), w); - /* Finish up */ - gtk_widget_show(w->anon); - gtk_widget_show(bbox); - gtk_widget_show(vbox); - gtk_widget_show(frame); - gtk_widget_show(fbox); - - gtk_window_set_title(GTK_WINDOW(w->window), _("Gaim - Warn user?")); - gtk_container_add(GTK_CONTAINER(w->window), fbox); - gtk_container_set_border_width(GTK_CONTAINER(w->window), 5); - gtk_widget_realize(w->window); - aol_icon(w->window->window); + + cancel = picture_button(w->window, _("Cancel"), cancel_xpm); + gtk_box_pack_end(GTK_BOX(bbox), cancel, FALSE, FALSE, 5); + gtk_signal_connect(GTK_OBJECT(cancel), "clicked", + GTK_SIGNAL_FUNC(destroy_dialog), w->window); gtk_widget_show(w->window); - g_free(buf); } diff -r cbb8d7a9be43 -r d8eaf65ca9c3 src/oscar.c --- a/src/oscar.c Fri Dec 15 02:31:36 2000 +0000 +++ b/src/oscar.c Fri Dec 15 13:04:55 2000 +0000 @@ -1512,14 +1512,47 @@ } int gaim_parse_ratechange(struct aim_session_t *sess, struct command_rx_struct *command, ...) { + static char *codes[5] = {"invalid", + "change", + "warning", + "limit", + "limit cleared"}; va_list ap; - unsigned long newrate; + int code; + unsigned long parmid, windowsize, clear, alert, limit, disconnect; + unsigned long currentavg, maxavg; va_start(ap, command); - newrate = va_arg(ap, unsigned long); + code = va_arg(ap, int); + parmid = va_arg(ap, int); + windowsize = va_arg(ap, unsigned long); + clear = va_arg(ap, unsigned long); + alert = va_arg(ap, unsigned long); + limit = va_arg(ap, unsigned long); + disconnect = va_arg(ap, unsigned long); + currentavg = va_arg(ap, unsigned long); + maxavg = va_arg(ap, unsigned long); va_end(ap); - debug_printf("ratechange: %lu\n", newrate); + debug_printf("rate %s (paramid 0x%04lx): curavg = %ld, maxavg = %ld, alert at %ld, " + "clear warning at %ld, limit at %ld, disconnect at %ld (window size = %ld)\n", + (code < 5) ? codes[code] : codes[0], + parmid, + currentavg, maxavg, + alert, clear, + limit, disconnect, + windowsize); + + if (code == AIM_RATE_CODE_CHANGE) { + if (currentavg >= clear) + aim_conn_setlatency(command->conn, 0); + } else if (code == AIM_RATE_CODE_WARNING) { + aim_conn_setlatency(command->conn, windowsize/4); + } else if (code == AIM_RATE_CODE_LIMIT) { + aim_conn_setlatency(command->conn, windowsize/2); + } else if (code == AIM_RATE_CODE_CLEARLIMIT) { + aim_conn_setlatency(command->conn, 0); + } return 1; }