# HG changeset patch # User Eric Warmenhoven # Date 988593930 0 # Node ID 213607e8959853c237673f0cd5ee0d201f812c5a # Parent 7249312f46dc541e46334edeac9126a949ffa35d [gaim-migrate @ 1781] plug mem leak. don't show evil level if it decreased. mid's utf8 patch for jabber. my girlfriend got an accounting calculator today, you know, with the paper and the printing and things. it's kinda loud. she's really happy about having it. she had bought a different one yesterday but it didn't work so we returned it today. we also went to Albertson's and bought groceries. we bought 72 cans of soda for $15. That's 20 cents per soda. Not bad. we also bought a cow; i'm going to cook it tonight. ben&jerry's ice cream is good. committer: Tailor Script diff -r 7249312f46dc -r 213607e89598 plugins/jabber/jabber.c --- a/plugins/jabber/jabber.c Sun Apr 29 01:33:09 2001 +0000 +++ b/plugins/jabber/jabber.c Mon Apr 30 01:25:30 2001 +0000 @@ -470,6 +470,47 @@ return FALSE; } +static unsigned char *utf8_to_str(unsigned char *in) +{ + int n = 0,i = 0; + int inlen; + unsigned char *result; + + if (!in) + return NULL; + + inlen = strlen(in); + + result = (unsigned char*)malloc(inlen+1); + + while(n <= inlen-1) { + long c = (long)in[n]; + if(c<0x80) + result[i++] = (char)c; + else { + if((c&0xC0) == 0xC0) + result[i++] = (char)(((c&0x03)<<6)|(((unsigned char)in[++n])&0x3F)); + else if((c&0xE0) == 0xE0) { + if (n + 2 <= inlen) { + result[i] = (char)(((c&0xF)<<4)|(((unsigned char)in[++n])&0x3F)); + result[i] = (char)(((unsigned char)result[i]) |(((unsigned char)in[++n])&0x3F)); + i++; + } else n += 2; + } + else if((c&0xF0) == 0xF0) + n += 3; + else if((c&0xF8) == 0xF8) + n += 4; + else if((c&0xFC) == 0xFC) + n += 5; + } + n++; + } + result[i] = '\0'; + + return result; +} + static void jabber_handlemessage(gjconn j, jpacket p) { xmlnode y, xmlns; @@ -487,10 +528,14 @@ type = xmlnode_get_attrib(xmlns, "xmlns"); from = jid_full(p->from); - if ((y = xmlnode_get_tag(p->x, "body"))) { + if ((y = xmlnode_get_tag(p->x, "html"))) { + msg = xmlnode_get_data(y); + } else if ((y = xmlnode_get_tag(p->x, "body"))) { msg = xmlnode_get_data(y); } + msg = utf8_to_str(msg); + if (!from || !msg) { return; } @@ -515,6 +560,8 @@ g_free(from); } + free(msg); + } else if (!strcmp(type, "error")) { if ((y = xmlnode_get_tag(p->x, "error"))) { type = xmlnode_get_attrib(y, "code"); @@ -530,9 +577,15 @@ struct conversation *b; static int i = 0; from = jid_full(p->from); - if ((y = xmlnode_get_tag(p->x, "body"))) { + + if ((y = xmlnode_get_tag(p->x, "html"))) { + msg = xmlnode_get_data(y); + } else if ((y = xmlnode_get_tag(p->x, "body"))) { msg = xmlnode_get_data(y); } + + msg = utf8_to_str(msg); + b = find_chat(GJ_GC(j), p->from->user); if (!b) { jid chat = NULL; @@ -569,11 +622,10 @@ g_snprintf(buf, sizeof(buf), "%s", msg); serv_got_chat_in(GJ_GC(j), b->id, p->from->resource, 0, buf, time((time_t)NULL)); } - /* - } else if (msg) { - write_to_conv(b, msg, WFLAG_SYSTEM, NULL); - */ } + + free(msg); + } else { debug_printf("unhandled message %s\n", type); } diff -r 7249312f46dc -r 213607e89598 src/multi.h --- a/src/multi.h Sun Apr 29 01:33:09 2001 +0000 +++ b/src/multi.h Mon Apr 30 01:25:30 2001 +0000 @@ -71,6 +71,8 @@ char *away; int is_auto_away; + + int evil; }; /* now that we have our struct, we're going to need lots of them. Maybe even a list of them. */ diff -r 7249312f46dc -r 213607e89598 src/server.c --- a/src/server.c Sun Apr 29 01:33:09 2001 +0000 +++ b/src/server.c Mon Apr 30 01:25:30 2001 +0000 @@ -541,16 +541,21 @@ void serv_got_eviled(struct gaim_connection *gc, char *name, int lev) { - char *buf2 = g_malloc(1024); + char buf2[1024]; GtkWidget *d, *label, *close; - plugin_event(event_warned, gc, name, (void *)lev, 0); - g_snprintf(buf2, 1023, "%s has just been warned by %s.\nYour new warning level is %d%%", + if (gc->evil > lev) { + gc->evil = lev; + return; + } + + gc->evil = lev; + + g_snprintf(buf2, sizeof(buf2), "%s has just been warned by %s.\nYour new warning level is %d%%", gc->username, ((name == NULL)? "an anonymous person" : name), lev); - d = gtk_dialog_new(); gtk_widget_realize(d); aol_icon(d->window);