From: <the...@us...> - 2006-07-16 19:08:39
|
Revision: 16496 Author: thekingant Date: 2006-07-16 12:08:31 -0700 (Sun, 16 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16496&view=rev Log Message: ----------- Rename gaim_buffer.c and .h to circbuffer.c and .h Modified Paths: -------------- trunk/src/Makefile.am trunk/src/Makefile.mingw trunk/src/protocols/irc/irc.h trunk/src/protocols/jabber/jabber.h trunk/src/protocols/msn/httpconn.h trunk/src/protocols/oscar/oscar.h trunk/src/protocols/sametime/sametime.c trunk/src/protocols/simple/simple.h trunk/src/protocols/yahoo/yahoo.h Added Paths: ----------- trunk/src/circbuffer.c trunk/src/circbuffer.h Removed Paths: ------------- trunk/src/gaim_buffer.c trunk/src/gaim_buffer.h Modified: trunk/src/Makefile.am =================================================================== --- trunk/src/Makefile.am 2006-07-16 16:59:27 UTC (rev 16495) +++ trunk/src/Makefile.am 2006-07-16 19:08:31 UTC (rev 16496) @@ -70,6 +70,7 @@ blist.c \ buddyicon.c \ cipher.c \ + circbuffer.c \ cmds.c \ connection.c \ conversation.c \ @@ -78,7 +79,6 @@ desktopitem.c \ eventloop.c \ ft.c \ - gaim_buffer.c \ idle.c \ imgstore.c \ log.c \ @@ -117,6 +117,7 @@ blist.h \ buddyicon.h \ cipher.h \ + circbuffer.h \ cmds.h \ connection.h \ conversation.h \ @@ -126,7 +127,6 @@ desktopitem.h \ eventloop.h \ ft.h \ - gaim_buffer.h \ idle.h \ imgstore.h \ log.h \ Modified: trunk/src/Makefile.mingw =================================================================== --- trunk/src/Makefile.mingw 2006-07-16 16:59:27 UTC (rev 16495) +++ trunk/src/Makefile.mingw 2006-07-16 19:08:31 UTC (rev 16496) @@ -89,6 +89,7 @@ blist.c \ buddyicon.c \ cipher.c \ + circbuffer.c \ cmds.c \ connection.c \ conversation.c \ @@ -97,7 +98,6 @@ dnssrv.c \ eventloop.c \ ft.c \ - gaim_buffer.c \ gtkaccount.c \ gtkblist.c \ gtkconn.c \ Copied: trunk/src/circbuffer.c (from rev 16491, trunk/src/gaim_buffer.c) =================================================================== --- trunk/src/circbuffer.c (rev 0) +++ trunk/src/circbuffer.c 2006-07-16 19:08:31 UTC (rev 16496) @@ -0,0 +1,142 @@ +/* + * @file circbuffer.h Buffer Utility Functions + * @ingroup core + * + * Gaim is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include "internal.h" + +#include "circbuffer.h" + +#define DEFAULT_BUF_SIZE 256 + +GaimCircBuffer * +gaim_circ_buffer_new(gsize growsize) { + GaimCircBuffer *buf = g_new0(GaimCircBuffer, 1); + buf->growsize = growsize ? growsize : DEFAULT_BUF_SIZE; + return buf; +} + +void gaim_circ_buffer_destroy(GaimCircBuffer *buf) { + g_return_if_fail(buf); + g_free(buf->buffer); + g_free(buf); +} + +static void grow_circ_buffer(GaimCircBuffer *buf, gsize len) { + int in_offset = 0, out_offset = 0; + int start_buflen = buf->buflen; + + while ((buf->buflen - buf->bufused) < len) + buf->buflen += buf->growsize; + + if (buf->inptr != NULL) { + in_offset = buf->inptr - buf->buffer; + out_offset = buf->outptr - buf->buffer; + } + buf->buffer = g_realloc(buf->buffer, buf->buflen); + + /* adjust the fill and remove pointer locations */ + if (buf->inptr == NULL) { + buf->inptr = buf->outptr = buf->buffer; + } else { + buf->inptr = buf->buffer + in_offset; + buf->outptr = buf->buffer + out_offset; + } + + /* If the fill pointer is wrapped to before the remove + * pointer, we need to shift the data */ + if (in_offset < out_offset) { + int shift_n = MIN(buf->buflen - start_buflen, + in_offset); + memcpy(buf->buffer + start_buflen, buf->buffer, + shift_n); + + /* If we couldn't fit the wrapped read buffer + * at the end */ + if (shift_n < in_offset) { + memmove(buf->buffer, + buf->buffer + shift_n, + in_offset - shift_n); + buf->inptr = buf->buffer + + (in_offset - shift_n); + } else { + buf->inptr = buf->buffer + + start_buflen + in_offset; + } + } +} + +void gaim_circ_buffer_append(GaimCircBuffer *buf, gconstpointer src, gsize len) { + + int len_stored; + + /* Grow the buffer, if necessary */ + if ((buf->buflen - buf->bufused) < len) + grow_circ_buffer(buf, len); + + /* If there is not enough room to copy all of src before hitting + * the end of the buffer then we will need to do two copies. + * One copy from inptr to the end of the buffer, and the + * second copy from the start of the buffer to the end of src. */ + if (buf->inptr >= buf->outptr) + len_stored = MIN(len, buf->buflen + - (buf->inptr - buf->buffer)); + else + len_stored = len; + + memcpy(buf->inptr, src, len_stored); + + if (len_stored < len) { + memcpy(buf->buffer, src + len_stored, len - len_stored); + buf->inptr = buf->buffer + (len - len_stored); + } else if ((buf->buffer - buf->inptr) == len_stored) { + buf->inptr = buf->buffer; + } else { + buf->inptr += len_stored; + } + + buf->bufused += len; +} + +gsize gaim_circ_buffer_get_max_read(GaimCircBuffer *buf) { + int max_read; + + if (buf->bufused == 0) + max_read = 0; + else if ((buf->outptr - buf->inptr) >= 0) + max_read = buf->buflen - (buf->outptr - buf->buffer); + else + max_read = buf->inptr - buf->outptr; + + return max_read; +} + +gboolean gaim_circ_buffer_mark_read(GaimCircBuffer *buf, gsize len) { + g_return_val_if_fail(gaim_circ_buffer_get_max_read(buf) >= len, FALSE); + + buf->outptr += len; + buf->bufused -= len; + /* wrap to the start if we're at the end */ + if ((buf->outptr - buf->buffer) == buf->buflen) + buf->outptr = buf->buffer; + + return TRUE; +} + Property changes on: trunk/src/circbuffer.c ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:keywords + Author Date Id Revision Name: svn:eol-style + native Copied: trunk/src/circbuffer.h (from rev 16491, trunk/src/gaim_buffer.h) =================================================================== --- trunk/src/circbuffer.h (rev 0) +++ trunk/src/circbuffer.h 2006-07-16 19:08:31 UTC (rev 16496) @@ -0,0 +1,117 @@ +/* + * @file circbuffer.h Buffer Utility Functions + * @ingroup core + * + * Gaim is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef _CIRCBUFFER_H +#define _CIRCBUFFER_H + +#include <glib.h> + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct _GaimCircBuffer { + + /** A pointer to the starting address of our chunk of memory. */ + gchar *buffer; + + /** The incremental amount to increase this buffer by when + * the buffer is not big enough to hold incoming data, in bytes. */ + gsize growsize; + + /** The length of this buffer, in bytes. */ + gsize buflen; + + /** The number of bytes of this buffer that contain unread data. */ + gsize bufused; + + /** A pointer to the next byte where new incoming data is + * buffered to. */ + gchar *inptr; + + /** A pointer to the next byte of buffered data that should be + * read by the consumer. */ + gchar *outptr; + +} GaimCircBuffer; + +/** + * Creates a new circular buffer. This will not allocate any memory for the + * actual buffer until data is appended to it. + * + * @param growsize The amount that the buffer should grow the first time data + * is appended and every time more space is needed. Pass in + * "0" to use the default of 256 bytes. + * + * @return The new GaimCircBuffer. This should be freed with + * gaim_circ_buffer_destroy when you are done with it + */ +GaimCircBuffer *gaim_circ_buffer_new(gsize growsize); + +/** + * Dispose of the GaimCircBuffer and free any memory used by it (including any + * memory used by the internal buffer). + * + * @param buf The GaimCircBuffer to free + */ +void gaim_circ_buffer_destroy(GaimCircBuffer *buf); + +/** + * Append data to the GaimCircBuffer. This will grow the internal + * buffer to fit the added data, if needed. + * + * @param buf The GaimCircBuffer to which to append the data + * @param src pointer to the data to copy into the buffer + * @param len number of bytes to copy into the buffer + */ +void gaim_circ_buffer_append(GaimCircBuffer *buf, gconstpointer src, gsize len); + +/** + * Determine the maximum number of contiguous bytes that can be read from the + * GaimCircBuffer. + * Note: This may not be the total number of bytes that are buffered - a + * subsequent call after calling gaim_circ_buffer_mark_read() may indicate more + * data is available to read. + * + * @param buf the GaimCircBuffer for which to determine the maximum contiguous + * bytes that can be read. + * + * @return the number of bytes that can be read from the GaimCircBuffer + */ +gsize gaim_circ_buffer_get_max_read(GaimCircBuffer *buf); + +/** + * Mark the number of bytes that have been read from the buffer. + * + * @param buf The GaimCircBuffer to mark bytes read from + * @param len The number of bytes to mark as read + * + * @return TRUE if we successfully marked the bytes as having been read, FALSE + * otherwise. + */ +gboolean gaim_circ_buffer_mark_read(GaimCircBuffer *buf, gsize len); + +#ifdef __cplusplus +} +#endif + +#endif /* _CIRCBUFFER_H */ Property changes on: trunk/src/circbuffer.h ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:keywords + Author Date Id Revision Name: svn:eol-style + native Deleted: trunk/src/gaim_buffer.c =================================================================== --- trunk/src/gaim_buffer.c 2006-07-16 16:59:27 UTC (rev 16495) +++ trunk/src/gaim_buffer.c 2006-07-16 19:08:31 UTC (rev 16496) @@ -1,142 +0,0 @@ -/* - * @file gaim_buffer.h Buffer Utility Functions - * @ingroup core - * - * Gaim is the legal property of its developers, whose names are too numerous - * to list here. Please refer to the COPYRIGHT file distributed with this - * source distribution. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include "internal.h" - -#include "gaim_buffer.h" - -#define DEFAULT_BUF_SIZE 256 - -GaimCircBuffer * -gaim_circ_buffer_new(gsize growsize) { - GaimCircBuffer *buf = g_new0(GaimCircBuffer, 1); - buf->growsize = growsize ? growsize : DEFAULT_BUF_SIZE; - return buf; -} - -void gaim_circ_buffer_destroy(GaimCircBuffer *buf) { - g_return_if_fail(buf); - g_free(buf->buffer); - g_free(buf); -} - -static void grow_circ_buffer(GaimCircBuffer *buf, gsize len) { - int in_offset = 0, out_offset = 0; - int start_buflen = buf->buflen; - - while ((buf->buflen - buf->bufused) < len) - buf->buflen += buf->growsize; - - if (buf->inptr != NULL) { - in_offset = buf->inptr - buf->buffer; - out_offset = buf->outptr - buf->buffer; - } - buf->buffer = g_realloc(buf->buffer, buf->buflen); - - /* adjust the fill and remove pointer locations */ - if (buf->inptr == NULL) { - buf->inptr = buf->outptr = buf->buffer; - } else { - buf->inptr = buf->buffer + in_offset; - buf->outptr = buf->buffer + out_offset; - } - - /* If the fill pointer is wrapped to before the remove - * pointer, we need to shift the data */ - if (in_offset < out_offset) { - int shift_n = MIN(buf->buflen - start_buflen, - in_offset); - memcpy(buf->buffer + start_buflen, buf->buffer, - shift_n); - - /* If we couldn't fit the wrapped read buffer - * at the end */ - if (shift_n < in_offset) { - memmove(buf->buffer, - buf->buffer + shift_n, - in_offset - shift_n); - buf->inptr = buf->buffer + - (in_offset - shift_n); - } else { - buf->inptr = buf->buffer + - start_buflen + in_offset; - } - } -} - -void gaim_circ_buffer_append(GaimCircBuffer *buf, gconstpointer src, gsize len) { - - int len_stored; - - /* Grow the buffer, if necessary */ - if ((buf->buflen - buf->bufused) < len) - grow_circ_buffer(buf, len); - - /* If there is not enough room to copy all of src before hitting - * the end of the buffer then we will need to do two copies. - * One copy from inptr to the end of the buffer, and the - * second copy from the start of the buffer to the end of src. */ - if (buf->inptr >= buf->outptr) - len_stored = MIN(len, buf->buflen - - (buf->inptr - buf->buffer)); - else - len_stored = len; - - memcpy(buf->inptr, src, len_stored); - - if (len_stored < len) { - memcpy(buf->buffer, src + len_stored, len - len_stored); - buf->inptr = buf->buffer + (len - len_stored); - } else if ((buf->buffer - buf->inptr) == len_stored) { - buf->inptr = buf->buffer; - } else { - buf->inptr += len_stored; - } - - buf->bufused += len; -} - -gsize gaim_circ_buffer_get_max_read(GaimCircBuffer *buf) { - int max_read; - - if (buf->bufused == 0) - max_read = 0; - else if ((buf->outptr - buf->inptr) >= 0) - max_read = buf->buflen - (buf->outptr - buf->buffer); - else - max_read = buf->inptr - buf->outptr; - - return max_read; -} - -gboolean gaim_circ_buffer_mark_read(GaimCircBuffer *buf, gsize len) { - g_return_val_if_fail(gaim_circ_buffer_get_max_read(buf) >= len, FALSE); - - buf->outptr += len; - buf->bufused -= len; - /* wrap to the start if we're at the end */ - if ((buf->outptr - buf->buffer) == buf->buflen) - buf->outptr = buf->buffer; - - return TRUE; -} - Deleted: trunk/src/gaim_buffer.h =================================================================== --- trunk/src/gaim_buffer.h 2006-07-16 16:59:27 UTC (rev 16495) +++ trunk/src/gaim_buffer.h 2006-07-16 19:08:31 UTC (rev 16496) @@ -1,115 +0,0 @@ -/* - * @file gaim_buffer.h Buffer Utility Functions - * @ingroup core - * - * Gaim is the legal property of its developers, whose names are too numerous - * to list here. Please refer to the COPYRIGHT file distributed with this - * source distribution. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#ifndef _GAIM_BUFFER_H -#define _GAIM_BUFFER_H - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct _GaimCircBuffer { - - /** A pointer to the starting address of our chunk of memory. */ - gchar *buffer; - - /** The incremental amount to increase this buffer by when - * the buffer is not big enough to hold incoming data, in bytes. */ - gsize growsize; - - /** The length of this buffer, in bytes. */ - gsize buflen; - - /** The number of bytes of this buffer that contain unread data. */ - gsize bufused; - - /** A pointer to the next byte where new incoming data is - * buffered to. */ - gchar *inptr; - - /** A pointer to the next byte of buffered data that should be - * read by the consumer. */ - gchar *outptr; - -} GaimCircBuffer; - -/** - * Creates a new circular buffer. This will not allocate any memory for the - * actual buffer until data is appended to it. - * - * @param growsize The amount that the buffer should grow the first time data - * is appended and every time more space is needed. Pass in - * "0" to use the default of 256 bytes. - * - * @return The new GaimCircBuffer. This should be freed with - * gaim_circ_buffer_destroy when you are done with it - */ -GaimCircBuffer *gaim_circ_buffer_new(gsize growsize); - -/** - * Dispose of the GaimCircBuffer and free any memory used by it (including any - * memory used by the internal buffer). - * - * @param buf The GaimCircBuffer to free - */ -void gaim_circ_buffer_destroy(GaimCircBuffer *buf); - -/** - * Append data to the GaimCircBuffer. This will grow the internal - * buffer to fit the added data, if needed. - * - * @param buf The GaimCircBuffer to which to append the data - * @param src pointer to the data to copy into the buffer - * @param len number of bytes to copy into the buffer - */ -void gaim_circ_buffer_append(GaimCircBuffer *buf, gconstpointer src, gsize len); - -/** - * Determine the maximum number of contiguous bytes that can be read from the - * GaimCircBuffer. - * Note: This may not be the total number of bytes that are buffered - a - * subsequent call after calling gaim_circ_buffer_mark_read() may indicate more - * data is available to read. - * - * @param buf the GaimCircBuffer for which to determine the maximum contiguous - * bytes that can be read. - * - * @return the number of bytes that can be read from the GaimCircBuffer - */ -gsize gaim_circ_buffer_get_max_read(GaimCircBuffer *buf); - -/** - * Mark the number of bytes that have been read from the buffer. - * - * @param buf The GaimCircBuffer to mark bytes read from - * @param len The number of bytes to mark as read - * - * @return TRUE if we successfully marked the bytes as having been read, FALSE - * otherwise. - */ -gboolean gaim_circ_buffer_mark_read(GaimCircBuffer *buf, gsize len); - -#ifdef __cplusplus -} -#endif - -#endif /* _GAIM_BUFFER_H */ Modified: trunk/src/protocols/irc/irc.h =================================================================== --- trunk/src/protocols/irc/irc.h 2006-07-16 16:59:27 UTC (rev 16495) +++ trunk/src/protocols/irc/irc.h 2006-07-16 19:08:31 UTC (rev 16496) @@ -25,8 +25,8 @@ #include <glib.h> +#include "circbuffer.h" #include "ft.h" -#include "gaim_buffer.h" #include "roomlist.h" #include "sslconn.h" Modified: trunk/src/protocols/jabber/jabber.h =================================================================== --- trunk/src/protocols/jabber/jabber.h 2006-07-16 16:59:27 UTC (rev 16495) +++ trunk/src/protocols/jabber/jabber.h 2006-07-16 19:08:31 UTC (rev 16496) @@ -26,10 +26,10 @@ #include <libxml/parser.h> #endif #include <glib.h> +#include "circbuffer.h" #include "connection.h" #include "roomlist.h" #include "sslconn.h" -#include "gaim_buffer.h" #include "jutil.h" #include "xmlnode.h" Modified: trunk/src/protocols/msn/httpconn.h =================================================================== --- trunk/src/protocols/msn/httpconn.h 2006-07-16 16:59:27 UTC (rev 16495) +++ trunk/src/protocols/msn/httpconn.h 2006-07-16 19:08:31 UTC (rev 16496) @@ -26,8 +26,8 @@ typedef struct _MsnHttpConn MsnHttpConn; +#include "circbuffer.h" #include "servconn.h" -#include "gaim_buffer.h" /** * An HTTP Connection. Modified: trunk/src/protocols/oscar/oscar.h =================================================================== --- trunk/src/protocols/oscar/oscar.h 2006-07-16 16:59:27 UTC (rev 16495) +++ trunk/src/protocols/oscar/oscar.h 2006-07-16 19:08:31 UTC (rev 16496) @@ -29,9 +29,9 @@ #ifndef _OSCAR_H_ #define _OSCAR_H_ +#include "circbuffer.h" #include "debug.h" #include "eventloop.h" -#include "gaim_buffer.h" #include "internal.h" #include <stdio.h> Modified: trunk/src/protocols/sametime/sametime.c =================================================================== --- trunk/src/protocols/sametime/sametime.c 2006-07-16 16:59:27 UTC (rev 16495) +++ trunk/src/protocols/sametime/sametime.c 2006-07-16 19:08:31 UTC (rev 16496) @@ -32,25 +32,25 @@ #include <glib/glist.h> /* gaim includes */ -#include <internal.h> -#include <gaim.h> -#include <config.h> +#include "internal.h" +#include "gaim.h" +#include "config.h" -#include <account.h> -#include <accountopt.h> -#include <conversation.h> -#include <debug.h> -#include <ft.h> -#include <gaim_buffer.h> -#include <imgstore.h> -#include <mime.h> -#include <notify.h> -#include <plugin.h> -#include <privacy.h> -#include <prpl.h> -#include <request.h> -#include <util.h> -#include <version.h> +#include "account.h" +#include "accountopt.h" +#include "circbuffer.h" +#include "conversation.h" +#include "debug.h" +#include "ft.h" +#include "imgstore.h" +#include "mime.h" +#include "notify.h" +#include "plugin.h" +#include "privacy.h" +#include "prpl.h" +#include "request.h" +#include "util.h" +#include "version.h" /* meanwhile includes */ #include <mw_cipher.h> Modified: trunk/src/protocols/simple/simple.h =================================================================== --- trunk/src/protocols/simple/simple.h 2006-07-16 16:59:27 UTC (rev 16495) +++ trunk/src/protocols/simple/simple.h 2006-07-16 19:08:31 UTC (rev 16496) @@ -26,9 +26,9 @@ #include <glib.h> #include <time.h> -#include <cipher.h> -#include <gaim_buffer.h> -#include <prpl.h> +#include "cipher.h" +#include "circbuffer.h" +#include "prpl.h" #include "sipmsg.h" Modified: trunk/src/protocols/yahoo/yahoo.h =================================================================== --- trunk/src/protocols/yahoo/yahoo.h 2006-07-16 16:59:27 UTC (rev 16495) +++ trunk/src/protocols/yahoo/yahoo.h 2006-07-16 19:08:31 UTC (rev 16496) @@ -25,8 +25,8 @@ #ifndef _YAHOO_H_ #define _YAHOO_H_ +#include "circbuffer.h" #include "prpl.h" -#include "gaim_buffer.h" #define YAHOO_PAGER_HOST "scs.msg.yahoo.com" #define YAHOO_PAGER_PORT 5050 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <the...@us...> - 2006-07-17 04:33:36
|
Revision: 16502 Author: thekingant Date: 2006-07-16 21:33:32 -0700 (Sun, 16 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16502&view=rev Log Message: ----------- Extremely minor memleak fix in the tcl loader plugin Modified Paths: -------------- trunk/plugins/tcl/tcl.c trunk/src/plugin.c Modified: trunk/plugins/tcl/tcl.c =================================================================== --- trunk/plugins/tcl/tcl.c 2006-07-17 04:30:50 UTC (rev 16501) +++ trunk/plugins/tcl/tcl.c 2006-07-17 04:33:32 UTC (rev 16502) @@ -380,10 +380,12 @@ gaim_stringref_unref(GaimTclRefConnection); gaim_stringref_unref(GaimTclRefConversation); gaim_stringref_unref(GaimTclRefPointer); + gaim_stringref_unref(GaimTclRefPlugin); gaim_stringref_unref(GaimTclRefPresence); gaim_stringref_unref(GaimTclRefStatus); gaim_stringref_unref(GaimTclRefStatusAttr); gaim_stringref_unref(GaimTclRefStatusType); + gaim_stringref_unref(GaimTclRefXfer); return TRUE; } Modified: trunk/src/plugin.c =================================================================== --- trunk/src/plugin.c 2006-07-17 04:30:50 UTC (rev 16501) +++ trunk/src/plugin.c 2006-07-17 04:33:32 UTC (rev 16502) @@ -843,8 +843,8 @@ } } - if (plugin->path != NULL) g_free(plugin->path); - if (plugin->error != NULL) g_free(plugin->error); + g_free(plugin->path); + g_free(plugin->error); GAIM_DBUS_UNREGISTER_POINTER(plugin); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <the...@us...> - 2006-07-17 05:50:31
|
Revision: 16503 Author: thekingant Date: 2006-07-16 22:50:28 -0700 (Sun, 16 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16503&view=rev Log Message: ----------- Get rid of an assertion failure when trying to load our D-BUS example plugin if the D-BUS subsystem is not initialized for whatever reason. Not only that, the plugin gracefully fails to load and prints an error message. These error messages could be improved. If you're familiar with how D-BUS works then go for it. Also, do we need to be uninitializing any of the D-BUS stuff? Modified Paths: -------------- trunk/plugins/dbus-example.c trunk/src/core.c trunk/src/dbus-server.c trunk/src/dbus-server.h Modified: trunk/plugins/dbus-example.c =================================================================== --- trunk/plugins/dbus-example.c 2006-07-17 04:33:32 UTC (rev 16502) +++ trunk/plugins/dbus-example.c 2006-07-17 05:50:28 UTC (rev 16503) @@ -37,8 +37,9 @@ #include "internal.h" +#include "blist.h" +#include "notify.h" #include "plugin.h" -#include "blist.h" #include "version.h" #include <stdio.h> @@ -108,6 +109,17 @@ static gboolean plugin_load(GaimPlugin *plugin) { + const char *dbus_init_error; + + dbus_init_error = gaim_dbus_get_init_error(); + if (dbus_init_error != NULL) + { + gaim_notify_error(NULL, _("Unable to Load Plugin"), + _("Gaim's D-BUS server is not running for the reason listed below"), + _(dbus_init_error)); + return FALSE; + } + /* First, we have to register our four exported functions with the main gaim dbus loop. Without this statement, the gaim dbus code wouldn't know about our functions. */ Modified: trunk/src/core.c =================================================================== --- trunk/src/core.c 2006-07-17 04:33:32 UTC (rev 16502) +++ trunk/src/core.c 2006-07-17 05:50:28 UTC (rev 16503) @@ -99,7 +99,6 @@ gaim_dbus_init(); #endif - /* Initialize all static protocols. */ static_proto_init(); @@ -193,6 +192,10 @@ gaim_plugins_uninit(); gaim_signals_uninit(); +#ifdef HAVE_DBUS + gaim_dbus_uninit(); +#endif + if (core->ui != NULL) { g_free(core->ui); core->ui = NULL; Modified: trunk/src/dbus-server.c =================================================================== --- trunk/src/dbus-server.c 2006-07-17 04:33:32 UTC (rev 16502) +++ trunk/src/dbus-server.c 2006-07-17 05:50:28 UTC (rev 16503) @@ -36,6 +36,7 @@ #include "dbus-bindings.h" #include "debug.h" #include "core.h" +#include "internal.h" #include "savedstatuses.h" #include "value.h" @@ -59,7 +60,9 @@ static GHashTable *map_id_node; static GHashTable *map_id_type; +static gchar *init_error; + /* This function initializes the pointer-id traslation system. It creates the three above hashtables and defines parents of some types. */ @@ -229,7 +232,7 @@ DBusMessageIter *sub; sub = va_arg (var_args, DBusMessageIter*); dbus_message_iter_recurse(iter, sub); - g_print("subiter %i:%i\n", (int) sub, * (int*) sub); + gaim_debug_info("dbus", "subiter %p:%p\n", sub, * (gpointer*) sub); break; /* for testing only! */ } @@ -383,12 +386,6 @@ #include "dbus-bindings.c" -void *gaim_dbus_get_handle(void) { - static int handle; - - return &handle; -} - static gboolean gaim_dbus_dispatch_cb(DBusConnection *connection, DBusMessage *message, @@ -437,7 +434,7 @@ } -static const char *gettext(const char **ptr) { +static const char *dbus_gettext(const char **ptr) { const char *text = *ptr; *ptr += strlen(text) + 1; return text; @@ -478,9 +475,9 @@ while (*text) { const char *name, *direction, *type; - direction = gettext(&text); - type = gettext(&text); - name = gettext(&text); + direction = dbus_gettext(&text); + type = dbus_gettext(&text); + name = dbus_gettext(&text); g_string_append_printf(str, "<arg name='%s' type='%s' direction='%s'/>\n", @@ -539,7 +536,7 @@ -static gboolean gaim_dbus_dispatch_init(void) +static void gaim_dbus_dispatch_init(void) { static DBusObjectPathVTable vtable = {NULL, &gaim_dbus_dispatch, NULL, NULL, NULL, NULL}; @@ -550,17 +547,17 @@ gaim_dbus_connection = dbus_bus_get (DBUS_BUS_STARTER, &error); if (gaim_dbus_connection == NULL) { - gaim_debug_error("dbus", "Failed to get connection\n"); + init_error = g_strdup_printf(N_("Failed to get connection: %s"), error.message); dbus_error_free(&error); - return FALSE; + return; } if (!dbus_connection_register_object_path (gaim_dbus_connection, DBUS_PATH_GAIM, &vtable, NULL)) { - gaim_debug_error("dbus", "Failed to get name: %s\n", error.name); + init_error = g_strdup_printf(N_("Failed to get name: %s"), error.name); dbus_error_free(&error); - return FALSE; + return; } @@ -571,8 +568,8 @@ dbus_connection_unref(gaim_dbus_connection); dbus_error_free(&error); gaim_dbus_connection = NULL; - gaim_debug_error("dbus", "Failed to get serv name: %s\n", error.name); - return FALSE; + init_error = g_strdup_printf(N_("Failed to get serv name: %s"), error.name); + return; } dbus_connection_setup_with_g_main(gaim_dbus_connection, NULL); @@ -590,8 +587,6 @@ gaim_value_new_outgoing(GAIM_TYPE_POINTER)); GAIM_DBUS_REGISTER_BINDINGS(gaim_dbus_get_handle()); - - return TRUE; } @@ -709,15 +704,37 @@ dbus_message_unref(signal); } +const char * +gaim_dbus_get_init_error(void) +{ + return init_error; +} +void * +gaim_dbus_get_handle(void) +{ + static int handle; + return &handle; +} - - -gboolean gaim_dbus_init(void) +void +gaim_dbus_init(void) { gaim_dbus_init_ids(); - return gaim_dbus_dispatch_init() ; + + g_free(init_error); + init_error = NULL; + gaim_dbus_dispatch_init(); + if (init_error != NULL) + gaim_debug_error("dbus", "%s\n", init_error); } +void +gaim_dbus_uninit(void) +{ + /* Surely we must do SOME kind of uninitialization? */ + g_free(init_error); + init_error = NULL; +} Modified: trunk/src/dbus-server.h =================================================================== --- trunk/src/dbus-server.h 2006-07-17 04:33:32 UTC (rev 16502) +++ trunk/src/dbus-server.h 2006-07-17 05:50:28 UTC (rev 16503) @@ -135,14 +135,20 @@ GaimValue **values, va_list vargs); /** - * Starts the gaim DBUS server. It is responsible for handling DBUS - * requests from other applications. + * Returns whether Gaim's D-BUS subsystem is up and running. If it's + * NOT running then gaim_dbus_dispatch_init() failed for some reason, + * and a message should have been gaim_debug_error()'ed. * - * @return TRUE if successful, FALSE otherwise. + * This function should be called by any DBUS plugin before trying + * to use the DBUS API. See plugins/dbus-example.c for usage. + * + * @return If the D-BUS subsystem started with no problems then this + * will return NULL and everything will be hunky dory. If + * there was an error initializing the D-BUS subsystem then + * this will return an error message explaining why. */ -gboolean gaim_dbus_init(void); +const char *gaim_dbus_get_init_error(void); - /** * Returns the dbus subsystem handle. * @@ -151,7 +157,18 @@ void *gaim_dbus_get_handle(void); /** + * Starts Gaim's D-BUS server. It is responsible for handling DBUS + * requests from other applications. + */ +void gaim_dbus_init(void); +/** + * Uninitializes Gaim's D-BUS server. + */ +void gaim_dbus_uninit(void); + +/** + Macro #DBUS_EXPORT expands to nothing. It is used to indicate to the dbus-analize-functions.py script that the given function should be available to other applications through DBUS. If This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <the...@us...> - 2006-07-17 06:21:55
|
Revision: 16505 Author: thekingant Date: 2006-07-16 23:21:53 -0700 (Sun, 16 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16505&view=rev Log Message: ----------- Change the music messaging plugin to not try to load if our D-BUS stuff is not initialized. Also extracted the gaim_notify_error() message code to a #define in src/dbus-server.c And print a debug warning if something tries to register a callback for a signal using a handle that we don't have any registered signals for Modified Paths: -------------- trunk/plugins/dbus-example.c trunk/plugins/musicmessaging/musicmessaging.c trunk/src/dbus-server.h trunk/src/signals.c Modified: trunk/plugins/dbus-example.c =================================================================== --- trunk/plugins/dbus-example.c 2006-07-17 05:50:49 UTC (rev 16504) +++ trunk/plugins/dbus-example.c 2006-07-17 06:21:53 UTC (rev 16505) @@ -109,17 +109,8 @@ static gboolean plugin_load(GaimPlugin *plugin) { - const char *dbus_init_error; + GAIM_DBUS_RETURN_FALSE_IF_DISABLED(plugin); - dbus_init_error = gaim_dbus_get_init_error(); - if (dbus_init_error != NULL) - { - gaim_notify_error(NULL, _("Unable to Load Plugin"), - _("Gaim's D-BUS server is not running for the reason listed below"), - _(dbus_init_error)); - return FALSE; - } - /* First, we have to register our four exported functions with the main gaim dbus loop. Without this statement, the gaim dbus code wouldn't know about our functions. */ Modified: trunk/plugins/musicmessaging/musicmessaging.c =================================================================== --- trunk/plugins/musicmessaging/musicmessaging.c 2006-07-17 05:50:49 UTC (rev 16504) +++ trunk/plugins/musicmessaging/musicmessaging.c 2006-07-17 06:21:53 UTC (rev 16505) @@ -259,6 +259,8 @@ plugin_load(GaimPlugin *plugin) { void *conv_list_handle; + GAIM_DBUS_RETURN_FALSE_IF_DISABLED(plugin); + /* First, we have to register our four exported functions with the main gaim dbus loop. Without this statement, the gaim dbus code wouldn't know about our functions. */ Modified: trunk/src/dbus-server.h =================================================================== --- trunk/src/dbus-server.h 2006-07-17 05:50:49 UTC (rev 16504) +++ trunk/src/dbus-server.h 2006-07-17 06:21:53 UTC (rev 16505) @@ -74,6 +74,17 @@ #define GAIM_DBUS_DEFINE_INHERITING_TYPE(type, parent) \ GaimDBusType GAIM_DBUS_TYPE_##type = { GAIM_DBUS_TYPE(parent) }; +#define GAIM_DBUS_RETURN_FALSE_IF_DISABLED(plugin) \ + if (gaim_dbus_get_init_error() != NULL) \ + { \ + gchar *title; \ + title = g_strdup_printf("Unable to Load %s Plugin", plugin->info->name); \ + gaim_notify_error(NULL, title, \ + _("Gaim's D-BUS server is not running for the reason listed below"), \ + _(gaim_dbus_get_init_error())); \ + g_free(title); \ + return FALSE; \ + } /** Initializes gaim dbus pointer registration engine. @@ -139,8 +150,9 @@ * NOT running then gaim_dbus_dispatch_init() failed for some reason, * and a message should have been gaim_debug_error()'ed. * - * This function should be called by any DBUS plugin before trying - * to use the DBUS API. See plugins/dbus-example.c for usage. + * Gaim plugins that use D-BUS should use the + * GAIM_DBUS_RETURN_FALSE_IF_DISABLED macro to short-circuit + * initialization if Gaim's D-BUS subsystem is not running. * * @return If the D-BUS subsystem started with no problems then this * will return NULL and everything will be hunky dory. If Modified: trunk/src/signals.c =================================================================== --- trunk/src/signals.c 2006-07-17 05:50:49 UTC (rev 16504) +++ trunk/src/signals.c 2006-07-17 06:21:53 UTC (rev 16505) @@ -267,7 +267,13 @@ instance_data = (GaimInstanceData *)g_hash_table_lookup(instance_table, instance); - g_return_val_if_fail(instance_data != NULL, 0); + if (instance_data == NULL) + { + gaim_debug_warning("signals", "Something tried to register a callback " + "for the '%s' signal, but we do not have any signals " + "registered with the given handle\n", signal); + g_return_val_if_reached(0); + } /* Get the signal data */ signal_data = This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <the...@us...> - 2006-07-18 06:33:40
|
Revision: 16515 Author: thekingant Date: 2006-07-17 23:33:36 -0700 (Mon, 17 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16515&view=rev Log Message: ----------- Fix a tiny and rare memleak when unloading a plugin that was designed for an older version of Gaim. Modified Paths: -------------- trunk/plugins/dbus-example.c trunk/src/plugin.c trunk/src/protocols/msn/user.c Modified: trunk/plugins/dbus-example.c =================================================================== --- trunk/plugins/dbus-example.c 2006-07-17 23:57:12 UTC (rev 16514) +++ trunk/plugins/dbus-example.c 2006-07-18 06:33:36 UTC (rev 16515) @@ -152,7 +152,7 @@ GAIM_PRIORITY_DEFAULT, /**< priority */ "dbus-example", /**< id */ - N_("DBus"), /**< name */ + N_("DBus Example"), /**< name */ VERSION, /**< version */ /** summary */ N_("DBus Plugin Example"), Modified: trunk/src/plugin.c =================================================================== --- trunk/src/plugin.c 2006-07-17 23:57:12 UTC (rev 16514) +++ trunk/src/plugin.c 2006-07-18 06:33:36 UTC (rev 16515) @@ -772,12 +772,16 @@ * mismatch, but it's a lot better than trying to free something * we shouldn't, and crashing while trying to load an old plugin */ if(plugin->info == NULL || plugin->info->magic != GAIM_PLUGIN_MAGIC || - plugin->info->major_version != GAIM_MAJOR_VERSION) { + plugin->info->major_version != GAIM_MAJOR_VERSION) + { if(plugin->handle) g_module_close(plugin->handle); + g_free(plugin->path); + g_free(plugin->error); + GAIM_DBUS_UNREGISTER_POINTER(plugin); - + g_free(plugin); return; } Modified: trunk/src/protocols/msn/user.c =================================================================== --- trunk/src/protocols/msn/user.c 2006-07-17 23:57:12 UTC (rev 16514) +++ trunk/src/protocols/msn/user.c 2006-07-18 06:33:36 UTC (rev 16515) @@ -55,6 +55,12 @@ { g_return_if_fail(user != NULL); + /* + * TODO: If any GaimBuddy->proto_data pointers point to this + * MsnUser then set them to NULL. Or possibly even better, + * don't set GaimBuddy->proto_data in the first place. + */ + if (user->clientcaps != NULL) g_hash_table_destroy(user->clientcaps); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <aar...@us...> - 2006-07-19 20:15:05
|
Revision: 16521 Author: aaronsheldon Date: 2006-07-19 13:14:58 -0700 (Wed, 19 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16521&view=rev Log Message: ----------- Merges soc-2006-chat-speed into trunk. (r16371:r16435) Joining large chat rooms, like IRC rooms, is much quicker. Additional improvment should be seen when using >=GTK+-2.6. Modified Paths: -------------- trunk/src/conversation.c trunk/src/conversation.h trunk/src/gtkconv.c trunk/src/gtkconv.h Modified: trunk/src/conversation.c =================================================================== --- trunk/src/conversation.c 2006-07-19 07:12:59 UTC (rev 16520) +++ trunk/src/conversation.c 2006-07-19 20:14:58 UTC (rev 16521) @@ -38,7 +38,6 @@ static GList *chats = NULL; static GaimConversationUiOps *default_ops = NULL; - void gaim_conversations_set_ui_ops(GaimConversationUiOps *ops) { @@ -1441,6 +1440,45 @@ g_list_free(flags2); } +int +gaim_conv_chat_cb_compare(GaimConvChatBuddy *a, GaimConvChatBuddy *b) +{ + GaimConvChatBuddyFlags f1 = 0, f2 = 0; + char *user1 = NULL, *user2 = NULL; + gint ret = 0; + + + if (a) { + f1 = a->flags; + if (a->alias_key) + user1 = a->alias_key; + else if (a->name) + user1 = a->name; + } + + if (b) { + f2 = b->flags; + if (b->alias_key) + user2 = b->alias_key; + else if (b->name) + user2 = b->name; + } + + if (user1 == NULL || user2 == NULL) { + if (!(user1 == NULL && user2 == NULL)) + ret = (user1 == NULL) ? -1: 1; + } else if (f1 != f2) { + /* sort more important users first */ + ret = (f1 > f2) ? -1 : 1; + } else if (a->buddy != b->buddy) { + ret = a->buddy ? -1 : 1; + } else { + ret = strcasecmp(user1, user2); + } + + return ret; +} + void gaim_conv_chat_add_users(GaimConvChat *chat, GList *users, GList *extra_msgs, GList *flags, gboolean new_arrivals) @@ -1451,7 +1489,7 @@ GaimConnection *gc; GaimPluginProtocolInfo *prpl_info; GList *ul, *fl; - GList *aliases = NULL; + GList *cbuddies = NULL; g_return_if_fail(chat != NULL); g_return_if_fail(users != NULL); @@ -1470,9 +1508,12 @@ const char *user = (const char *)ul->data; const char *alias = user; gboolean quiet; + GaimConvChatBuddy *cbuddy; GaimConvChatBuddyFlags flags = GPOINTER_TO_INT(fl->data); const char *extra_msg = (extra_msgs ? extra_msgs->data : NULL); + cbuddy = gaim_conv_chat_cb_new(user, NULL, GPOINTER_TO_INT(fl->data)); + if (!strcmp(chat->nick, gaim_normalize(conv->account, user))) { const char *alias2 = gaim_account_get_alias(conv->account); if (alias2 != NULL) @@ -1493,12 +1534,16 @@ "chat-buddy-joining", conv, user, flags)) | gaim_conv_chat_is_user_ignored(chat, user); - cb = gaim_conv_chat_cb_new(user, flags); + cb = gaim_conv_chat_cb_new(user, NULL, flags); + /* This seems dumb. Why should we set users thousands of times? */ gaim_conv_chat_set_users(chat, g_list_prepend(gaim_conv_chat_get_users(chat), cb)); - /* We reverse this later to keep it in the same order as users. */ - aliases = g_list_prepend(aliases, (char *)alias); + cbuddy->alias = strdup(alias); /* Should I be doing a strdup? */ + cbuddy->alias_key = g_utf8_collate_key(alias, strlen(alias)); + cbuddy->buddy = (gaim_find_buddy(conv->account, cbuddy->name) != NULL); + cbuddies = g_list_prepend(cbuddies, cbuddy); + if (!quiet && new_arrivals) { char *escaped = g_markup_escape_text(alias, -1); char *tmp; @@ -1525,14 +1570,11 @@ extra_msgs = extra_msgs->next; } - /* This needs to be in the same order as users, but it's faster - * to prepend, so we do that above. */ - aliases = g_list_reverse(aliases); - + cbuddies = g_list_sort(cbuddies, (GCompareFunc)gaim_conv_chat_cb_compare); + if (ops != NULL && ops->chat_add_users != NULL) - ops->chat_add_users(conv, users, flags, aliases, new_arrivals); + ops->chat_add_users(conv, cbuddies, new_arrivals); - g_list_free(aliases); } void @@ -1562,7 +1604,7 @@ g_return_if_fail(prpl_info != NULL); flags = gaim_conv_chat_user_get_flags(chat, old_user); - cb = gaim_conv_chat_cb_new(new_user, flags); + cb = gaim_conv_chat_cb_new(new_user, NULL, flags); gaim_conv_chat_set_users(chat, g_list_prepend(gaim_conv_chat_get_users(chat), cb)); @@ -1873,9 +1915,8 @@ return chat->left; } - GaimConvChatBuddy * -gaim_conv_chat_cb_new(const char *name, GaimConvChatBuddyFlags flags) +gaim_conv_chat_cb_new(const char *name, const char *alias, GaimConvChatBuddyFlags flags) { GaimConvChatBuddy *cb; @@ -1884,6 +1925,10 @@ cb = g_new0(GaimConvChatBuddy, 1); cb->name = g_strdup(name); cb->flags = flags; + if (alias) + cb->alias = g_strdup(alias); + else + cb->alias = NULL; GAIM_DBUS_REGISTER_POINTER(cb, GaimConvChatBuddy); return cb; Modified: trunk/src/conversation.h =================================================================== --- trunk/src/conversation.h 2006-07-19 07:12:59 UTC (rev 16520) +++ trunk/src/conversation.h 2006-07-19 20:14:58 UTC (rev 16521) @@ -158,8 +158,8 @@ const char *message, GaimMessageFlags flags, time_t mtime); - void (*chat_add_users)(GaimConversation *conv, GList *users, - GList *flags, GList *aliases, gboolean new_arrivals); + void (*chat_add_users)(GaimConversation *conv, GList *cbuddies, gboolean new_arrivals); + void (*chat_rename_user)(GaimConversation *conv, const char *old_name, const char *new_name, const char *new_alias); void (*chat_remove_users)(GaimConversation *conv, GList *users); @@ -214,6 +214,9 @@ struct _GaimConvChatBuddy { char *name; /**< The name */ + char *alias; /**< The alias */ + char *alias_key; /**< The alias key */ + gboolean buddy; /**< ChatBuddy is on the blist */ GaimConvChatBuddyFlags flags; /**< Flags (ops, voice etc.) */ }; @@ -1133,11 +1136,12 @@ * Creates a new chat buddy * * @param name The name. + * @param alias The alias. * @param flags The flags. * * @return The new chat buddy */ -GaimConvChatBuddy *gaim_conv_chat_cb_new(const char *name, +GaimConvChatBuddy *gaim_conv_chat_cb_new(const char *name, const char *alias, GaimConvChatBuddyFlags flags); /** Modified: trunk/src/gtkconv.c =================================================================== --- trunk/src/gtkconv.c 2006-07-19 07:12:59 UTC (rev 16520) +++ trunk/src/gtkconv.c 2006-07-19 20:14:58 UTC (rev 16521) @@ -154,8 +154,7 @@ static void got_typing_keypress(GaimGtkConversation *gtkconv, gboolean first); static void gray_stuff_out(GaimGtkConversation *gtkconv); static GList *generate_invite_user_names(GaimConnection *gc); -static void add_chat_buddy_common(GaimConversation *conv, const char *name, - GaimConvChatBuddyFlags flags, const char *alias, const char *old_name); +static void add_chat_buddy_common(GaimConversation *conv, GaimConvChatBuddy *cb, const char *old_name); static gboolean tab_complete(GaimConversation *conv); static void gaim_gtkconv_updated(GaimConversation *conv, GaimConvUpdateType type); static void gtkconv_set_unseen(GaimGtkConversation *gtkconv, GaimUnseenState state); @@ -1394,6 +1393,7 @@ { GaimConversation *conv = gtkconv->active_conv; GaimGtkChatPane *gtkchat; + GaimConvChatBuddy *cbuddy; GaimConvChat *chat; GaimConvChatBuddyFlags flags; GtkTreeIter iter; @@ -1424,7 +1424,9 @@ else gaim_conv_chat_ignore(chat, name); - add_chat_buddy_common(conv, name, flags, alias, NULL); + cbuddy = gaim_conv_chat_cb_new(name, alias, flags); + + add_chat_buddy_common(conv, cbuddy, NULL); g_free(name); g_free(alias); } @@ -3288,7 +3290,7 @@ } static void -add_chat_buddy_common(GaimConversation *conv, const char *name, GaimConvChatBuddyFlags flags, const char *alias, const char *old_name) +add_chat_buddy_common(GaimConversation *conv, GaimConvChatBuddy *cb, const char *old_name) { GaimGtkConversation *gtkconv; GaimGtkChatPane *gtkchat; @@ -3300,6 +3302,12 @@ GtkTreeIter iter; gboolean is_me = FALSE; gboolean is_buddy; + gchar *alias_key, *name, *alias; + int flags; + + alias = cb->alias; + name = cb->name; + flags = GPOINTER_TO_INT(cb->flags); chat = GAIM_CONV_CHAT(conv); gtkconv = GAIM_GTK_CONVERSATION(conv); @@ -3318,32 +3326,74 @@ is_buddy = (gaim_find_buddy(conv->account, name) != NULL); - gtk_list_store_append(ls, &iter); + alias_key = g_utf8_collate_key(alias, strlen(alias)); if (is_me) { GdkColor send_color; gdk_color_parse(SEND_COLOR, &send_color); - + +#if GTK_CHECK_VERSION(2,6,0) + gtk_list_store_insert_with_values + (ls, + &iter, +/* + * The GTK docs are mute about the effects of the "row" value for performance. + * X-Chat hardcodes their value to 0 (prepend) and -1 (append), so we will too. + * It *might* be faster to search the gtk_list_store and set row accurately, + * but no one in #gtk+ seems to know anything about it either. + * Inserting in the "wrong" location has no visible ill effects. - F.P. + */ + -1, /* "row" */ + CHAT_USERS_ICON_COLUMN, pixbuf, + CHAT_USERS_ALIAS_COLUMN, alias, + CHAT_USERS_ALIAS_KEY_COLUMN, alias_key, + CHAT_USERS_NAME_COLUMN, name, + CHAT_USERS_FLAGS_COLUMN, flags, + CHAT_USERS_COLOR_COLUMN, &send_color, + CHAT_USERS_BUDDY_COLUMN, is_buddy, + -1); + } + else { + gtk_list_store_insert_with_values + (ls, + &iter, + -1, /* "row" */ + CHAT_USERS_ICON_COLUMN, pixbuf, + CHAT_USERS_ALIAS_COLUMN, alias, + CHAT_USERS_ALIAS_KEY_COLUMN, alias_key, + CHAT_USERS_NAME_COLUMN, name, + CHAT_USERS_FLAGS_COLUMN, flags, + CHAT_USERS_COLOR_COLUMN, get_nick_color(gtkconv, name), + CHAT_USERS_BUDDY_COLUMN, is_buddy, + -1); + +#else + gtk_list_store_append(ls, &iter); gtk_list_store_set(ls, &iter, CHAT_USERS_ICON_COLUMN, pixbuf, CHAT_USERS_ALIAS_COLUMN, alias, + CHAT_USERS_ALIAS_KEY_COLUMN, alias_key, CHAT_USERS_NAME_COLUMN, name, CHAT_USERS_FLAGS_COLUMN, flags, CHAT_USERS_COLOR_COLUMN, &send_color, CHAT_USERS_BUDDY_COLUMN, is_buddy, -1); } - else - { + + else { + + gtk_list_store_append(ls, &iter); gtk_list_store_set(ls, &iter, CHAT_USERS_ICON_COLUMN, pixbuf, CHAT_USERS_ALIAS_COLUMN, alias, + CHAT_USERS_ALIAS_KEY_COLUMN, alias_key, CHAT_USERS_NAME_COLUMN, name, CHAT_USERS_FLAGS_COLUMN, flags, CHAT_USERS_COLOR_COLUMN, get_nick_color(gtkconv, name), CHAT_USERS_BUDDY_COLUMN, is_buddy, -1); +#endif } if (pixbuf) @@ -3601,12 +3651,12 @@ gint ret = 0; gtk_tree_model_get(model, a, - CHAT_USERS_ALIAS_COLUMN, &user1, + CHAT_USERS_ALIAS_KEY_COLUMN, &user1, CHAT_USERS_FLAGS_COLUMN, &f1, CHAT_USERS_BUDDY_COLUMN, &buddy1, -1); gtk_tree_model_get(model, b, - CHAT_USERS_ALIAS_COLUMN, &user2, + CHAT_USERS_ALIAS_KEY_COLUMN, &user2, CHAT_USERS_FLAGS_COLUMN, &f2, CHAT_USERS_BUDDY_COLUMN, &buddy2, -1); @@ -3620,7 +3670,7 @@ } else if (buddy1 != buddy2) { ret = buddy1 ? -1 : 1; } else { - ret = gaim_utf8_strcasecmp(user1, user2); + ret = strcasecmp(user1, user2); } g_free(user1); @@ -3657,17 +3707,21 @@ if (!strcmp(normalized_name, gaim_normalize(conv->account, name))) { const char *alias = name; + char *alias_key = g_utf8_collate_key(alias, strlen(alias)); GaimBuddy *buddy2; if (strcmp(chat->nick, gaim_normalize(conv->account, name))) { /* This user is not me, so look into updating the alias. */ - if ((buddy2 = gaim_find_buddy(conv->account, name)) != NULL) + if ((buddy2 = gaim_find_buddy(conv->account, name)) != NULL) { alias = gaim_buddy_get_contact_alias(buddy2); + alias_key = g_utf8_collate_key(alias, strlen(alias)); + } gtk_list_store_set(GTK_LIST_STORE(model), &iter, - CHAT_USERS_ALIAS_COLUMN, alias, - -1); + CHAT_USERS_ALIAS_COLUMN, alias, + CHAT_USERS_ALIAS_KEY_COLUMN, alias_key, + -1); } g_free(name); break; @@ -3908,11 +3962,10 @@ gtk_widget_show(sw); ls = gtk_list_store_new(CHAT_USERS_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING, - G_TYPE_STRING, G_TYPE_INT, GDK_TYPE_COLOR, G_TYPE_BOOLEAN); - gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(ls), CHAT_USERS_ALIAS_COLUMN, + G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, + GDK_TYPE_COLOR, G_TYPE_BOOLEAN); + gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(ls), CHAT_USERS_ALIAS_KEY_COLUMN, sort_chat_users, NULL, NULL); - gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(ls), CHAT_USERS_ALIAS_COLUMN, - GTK_SORT_ASCENDING); list = gtk_tree_view_new_with_model(GTK_TREE_MODEL(ls)); @@ -4970,16 +5023,15 @@ account, name, message, conv, flags); g_free(displaying); } - static void -gaim_gtkconv_chat_add_users(GaimConversation *conv, GList *users, GList *flags, GList *aliases, gboolean new_arrivals) +gaim_gtkconv_chat_add_users(GaimConversation *conv, GList *cbuddies, gboolean new_arrivals) { GaimConvChat *chat; GaimGtkConversation *gtkconv; GaimGtkChatPane *gtkchat; + GtkListStore *ls; GList *l; - GList *ll; - GList *lll; + char tmp[BUF_LONG]; int num_users; @@ -4996,15 +5048,22 @@ gtk_label_set_text(GTK_LABEL(gtkchat->count), tmp); - l = users; - ll = flags; - lll = aliases; - while (l != NULL && ll != NULL && lll != NULL) { - add_chat_buddy_common(conv, (const char *)l->data, GPOINTER_TO_INT(ll->data), (const char *)lll->data, NULL); + ls = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list))); + + gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(ls), GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID, + GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID); + + l = cbuddies; + while (l != NULL) { + add_chat_buddy_common(conv, (GaimConvChatBuddy *)l->data, NULL); l = l->next; - ll = ll->next; - lll = lll->next; } + + /* Currently GTK+ maintains our sorted list after it's in the tree. + * This may change if it turns out we can manage it faster ourselves. + */ + gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(ls), CHAT_USERS_ALIAS_KEY_COLUMN, + GTK_SORT_ASCENDING); } static void @@ -5015,6 +5074,7 @@ GaimGtkConversation *gtkconv; GaimGtkChatPane *gtkchat; GaimConvChatBuddyFlags flags; + GaimConvChatBuddy *cbuddy; GtkTreeIter iter; GtkTreeModel *model; int f = 1; @@ -5049,7 +5109,9 @@ g_return_if_fail(new_alias != NULL); - add_chat_buddy_common(conv, new_name, flags, new_alias, old_name); + cbuddy = gaim_conv_chat_cb_new(new_name, new_alias, flags); + + add_chat_buddy_common(conv, cbuddy, old_name); } static void @@ -5110,6 +5172,7 @@ { GaimConvChat *chat; GaimConvChatBuddyFlags flags; + GaimConvChatBuddy *cbuddy; GaimGtkConversation *gtkconv; GaimGtkChatPane *gtkchat; GtkTreeIter iter; @@ -5153,7 +5216,9 @@ flags = gaim_conv_chat_user_get_flags(chat, user); - add_chat_buddy_common(conv, user, flags, alias, NULL); + cbuddy = gaim_conv_chat_cb_new(user, alias, flags); + + add_chat_buddy_common(conv, cbuddy, NULL); g_free(alias); } Modified: trunk/src/gtkconv.h =================================================================== --- trunk/src/gtkconv.h 2006-07-19 07:12:59 UTC (rev 16520) +++ trunk/src/gtkconv.h 2006-07-19 20:14:58 UTC (rev 16521) @@ -44,6 +44,7 @@ enum { CHAT_USERS_ICON_COLUMN, CHAT_USERS_ALIAS_COLUMN, + CHAT_USERS_ALIAS_KEY_COLUMN, CHAT_USERS_NAME_COLUMN, CHAT_USERS_FLAGS_COLUMN, CHAT_USERS_COLOR_COLUMN, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <the...@us...> - 2006-07-20 08:12:01
|
Revision: 16525 Author: thekingant Date: 2006-07-20 01:11:54 -0700 (Thu, 20 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16525&view=rev Log Message: ----------- A bunch of little things * Use GAIM_CONNECTION_IS_VALID(gc) in a lot of places where we were doing g_list_find(gaim_connections_get_all(), gc) * Get rid of a lot of places where we were doing g_list_find(gaim_connections_get_all(), gc). The handle used by the request API ensures that the ok and cancel callback functions won't be called if the gc is destroyed. However, GAIM_CONNECTION_IS_VALID(gc) is still very important for callback functions where we can't cancel the request. For example, gaim_proxy_connect() callback functions. * "Added" a function to Yahoo! that should help us notice when our buddies change their buddy icon/display picture * Some comments in a few places * Changed GAIM_CONNECTION_IS_VALID(gc) to only look through the list of "all" connections and not the list of "connecting" connections. Some time ago we changed how this was done so that the list of "all" connections now includes the "connection" connections. Modified Paths: -------------- trunk/src/buddyicon.h trunk/src/connection.h trunk/src/gtkblist.c trunk/src/protocols/jabber/jabber.c trunk/src/protocols/jabber/presence.c trunk/src/protocols/jabber/roster.c trunk/src/protocols/msn/dialog.c trunk/src/protocols/msn/userlist.c trunk/src/protocols/oscar/family_icbm.c trunk/src/protocols/oscar/oscar.c trunk/src/protocols/oscar/peer.c trunk/src/protocols/oscar/peer_proxy.c trunk/src/protocols/silc/silc.c trunk/src/protocols/yahoo/yahoo.c trunk/src/protocols/yahoo/yahoo_picture.c trunk/src/protocols/yahoo/yahoo_picture.h trunk/src/proxy.c trunk/src/util.h Modified: trunk/src/buddyicon.h =================================================================== --- trunk/src/buddyicon.h 2006-07-20 07:31:37 UTC (rev 16524) +++ trunk/src/buddyicon.h 2006-07-20 08:11:54 UTC (rev 16525) @@ -42,6 +42,10 @@ int ref_count; /**< The buddy icon reference count. */ }; +#ifdef __cplusplus +extern "C" { +#endif + /**************************************************************************/ /** @name Buddy Icon API */ /**************************************************************************/ @@ -281,4 +285,8 @@ /*@}*/ +#ifdef __cplusplus +} +#endif + #endif /* _GAIM_BUDDYICON_H_ */ Modified: trunk/src/connection.h =================================================================== --- trunk/src/connection.h 2006-07-20 07:31:37 UTC (rev 16524) +++ trunk/src/connection.h 2006-07-20 08:11:54 UTC (rev 16525) @@ -271,7 +271,7 @@ * * @return @c TRUE if gc is valid. */ -#define GAIM_CONNECTION_IS_VALID(gc) (g_list_find(gaim_connections_get_all(), (gc)) || g_list_find(gaim_connections_get_connecting(), (gc))) +#define GAIM_CONNECTION_IS_VALID(gc) (g_list_find(gaim_connections_get_all(), (gc))) /*@}*/ Modified: trunk/src/gtkblist.c =================================================================== --- trunk/src/gtkblist.c 2006-07-20 07:31:37 UTC (rev 16524) +++ trunk/src/gtkblist.c 2006-07-20 08:11:54 UTC (rev 16525) @@ -3435,6 +3435,13 @@ PangoLogAttr *log_attrs; gchar *word; + if (strcasecmp(key, "Global Thermonuclear War") == 0) + { + gaim_notify_info(NULL, "WOPR", + "Wouldn't you prefer a nice game of chess?", NULL); + return FALSE; + } + gtk_tree_model_get(model, iter, column, &withmarkup, -1); tmp = g_utf8_normalize(key, -1, G_NORMALIZE_DEFAULT); Modified: trunk/src/protocols/jabber/jabber.c =================================================================== --- trunk/src/protocols/jabber/jabber.c 2006-07-20 07:31:37 UTC (rev 16524) +++ trunk/src/protocols/jabber/jabber.c 2006-07-20 08:11:54 UTC (rev 16525) @@ -344,7 +344,8 @@ int len; static char buf[4096]; - if(!g_list_find(gaim_connections_get_all(), gc)) { + /* TODO: It should be possible to make this check unnecessary */ + if(!GAIM_CONNECTION_IS_VALID(gc)) { gaim_ssl_close(gsc); return; } Modified: trunk/src/protocols/jabber/presence.c =================================================================== --- trunk/src/protocols/jabber/presence.c 2006-07-20 07:31:37 UTC (rev 16524) +++ trunk/src/protocols/jabber/presence.c 2006-07-20 08:11:54 UTC (rev 16525) @@ -182,32 +182,30 @@ static void authorize_add_cb(struct _jabber_add_permit *jap) { - if(g_list_find(gaim_connections_get_all(), jap->gc)) { - GaimBuddy *buddy = NULL; + GaimBuddy *buddy = NULL; - jabber_presence_subscription_set(jap->gc->proto_data, jap->who, - "subscribed"); + jabber_presence_subscription_set(jap->gc->proto_data, jap->who, + "subscribed"); - buddy = gaim_find_buddy(jap->gc->account, jap->who); + buddy = gaim_find_buddy(jap->gc->account, jap->who); - if (buddy) { - JabberBuddy *jb = NULL; + if (buddy) { + JabberBuddy *jb = NULL; - jb = jabber_buddy_find(jap->js, jap->who, TRUE); + jb = jabber_buddy_find(jap->js, jap->who, TRUE); - if ((jb->subscription & JABBER_SUB_TO) == 0) { - gaim_account_request_add(jap->gc->account, + if ((jb->subscription & JABBER_SUB_TO) == 0) { + gaim_account_request_add(jap->gc->account, jap->who, NULL, - NULL, NULL); - } else { - gaim_account_notify_added(jap->gc->account, - jap->who, NULL, - NULL, NULL); - } + NULL, NULL); } else { - gaim_account_request_add(jap->gc->account, jap->who, - NULL, NULL, NULL); + gaim_account_notify_added(jap->gc->account, + jap->who, NULL, + NULL, NULL); } + } else { + gaim_account_request_add(jap->gc->account, jap->who, + NULL, NULL, NULL); } g_free(jap->who); @@ -216,10 +214,8 @@ static void deny_add_cb(struct _jabber_add_permit *jap) { - if(g_list_find(gaim_connections_get_all(), jap->gc)) { - jabber_presence_subscription_set(jap->gc->proto_data, jap->who, - "unsubscribed"); - } + jabber_presence_subscription_set(jap->gc->proto_data, jap->who, + "unsubscribed"); g_free(jap->who); g_free(jap); Modified: trunk/src/protocols/jabber/roster.c =================================================================== --- trunk/src/protocols/jabber/roster.c 2006-07-20 07:31:37 UTC (rev 16524) +++ trunk/src/protocols/jabber/roster.c 2006-07-20 08:11:54 UTC (rev 16525) @@ -104,7 +104,6 @@ gaim_blist_add_buddy(b, NULL, g, NULL); gaim_blist_alias_buddy(b, alias); - /* If we just learned about ourself, then fake our status, * because we won't be receiving a normal presence message * about ourself. */ @@ -117,8 +116,6 @@ jabber_presence_fake_to_self(js, status); } - - g_free(g2->data); g2 = g_slist_delete_link(g2, g2); } Modified: trunk/src/protocols/msn/dialog.c =================================================================== --- trunk/src/protocols/msn/dialog.c 2006-07-20 07:31:37 UTC (rev 16524) +++ trunk/src/protocols/msn/dialog.c 2006-07-20 08:11:54 UTC (rev 16525) @@ -57,19 +57,17 @@ static void msn_add_cb(MsnAddRemData *data) { + MsnSession *session; + MsnUserList *userlist; + msn_complete_sync_issue(data); - if (g_list_find(gaim_connections_get_all(), data->gc) != NULL) - { - MsnSession *session = data->gc->proto_data; - MsnUserList *userlist = session->userlist; + session = data->gc->proto_data; + userlist = session->userlist; - msn_userlist_add_buddy(userlist, data->who, MSN_LIST_FL, data->group); - } + msn_userlist_add_buddy(userlist, data->who, MSN_LIST_FL, data->group); - if (data->group != NULL) - g_free(data->group); - + g_free(data->group); g_free(data->who); g_free(data); } @@ -77,19 +75,17 @@ static void msn_rem_cb(MsnAddRemData *data) { + MsnSession *session; + MsnUserList *userlist; + msn_complete_sync_issue(data); - if (g_list_find(gaim_connections_get_all(), data->gc) != NULL) - { - MsnSession *session = data->gc->proto_data; - MsnUserList *userlist = session->userlist; + session = data->gc->proto_data; + userlist = session->userlist; - msn_userlist_rem_buddy(userlist, data->who, MSN_LIST_FL, data->group); - } + msn_userlist_rem_buddy(userlist, data->who, MSN_LIST_FL, data->group); - if (data->group != NULL) - g_free(data->group); - + g_free(data->group); g_free(data->who); g_free(data); } Modified: trunk/src/protocols/msn/userlist.c =================================================================== --- trunk/src/protocols/msn/userlist.c 2006-07-20 07:31:37 UTC (rev 16524) +++ trunk/src/protocols/msn/userlist.c 2006-07-20 08:11:54 UTC (rev 16525) @@ -40,23 +40,20 @@ static void msn_accept_add_cb(MsnPermitAdd *pa) { - if (g_list_find(gaim_connections_get_all(), pa->gc) != NULL) - { - MsnSession *session = pa->gc->proto_data; - MsnUserList *userlist = session->userlist; - GaimBuddy *buddy; + MsnSession *session = pa->gc->proto_data; + MsnUserList *userlist = session->userlist; + GaimBuddy *buddy; - msn_userlist_add_buddy(userlist, pa->who, MSN_LIST_AL, NULL); + msn_userlist_add_buddy(userlist, pa->who, MSN_LIST_AL, NULL); - buddy = gaim_find_buddy(pa->gc->account, pa->who); + buddy = gaim_find_buddy(pa->gc->account, pa->who); - if (buddy != NULL) - gaim_account_notify_added(pa->gc->account, pa->who, - NULL, pa->friendly, NULL); - else - gaim_account_request_add(pa->gc->account, pa->who, - NULL, pa->friendly, NULL); - } + if (buddy != NULL) + gaim_account_notify_added(pa->gc->account, pa->who, + NULL, pa->friendly, NULL); + else + gaim_account_request_add(pa->gc->account, pa->who, + NULL, pa->friendly, NULL); g_free(pa->who); g_free(pa->friendly); @@ -66,13 +63,10 @@ static void msn_cancel_add_cb(MsnPermitAdd *pa) { - if (g_list_find(gaim_connections_get_all(), pa->gc) != NULL) - { - MsnSession *session = pa->gc->proto_data; - MsnUserList *userlist = session->userlist; + MsnSession *session = pa->gc->proto_data; + MsnUserList *userlist = session->userlist; - msn_userlist_add_buddy(userlist, pa->who, MSN_LIST_BL, NULL); - } + msn_userlist_add_buddy(userlist, pa->who, MSN_LIST_BL, NULL); g_free(pa->who); g_free(pa->friendly); Modified: trunk/src/protocols/oscar/family_icbm.c =================================================================== --- trunk/src/protocols/oscar/family_icbm.c 2006-07-20 07:31:37 UTC (rev 16524) +++ trunk/src/protocols/oscar/family_icbm.c 2006-07-20 08:11:54 UTC (rev 16525) @@ -1718,9 +1718,9 @@ return ret; } -static void incomingim_ch2_buddylist(OscarData *od, FlapConnection *conn, aim_module_t *mod, FlapFrame *frame, aim_modsnac_t *snac, aim_userinfo_t *userinfo, IcbmArgsCh2 *args, ByteStream *servdata) +static void +incomingim_ch2_buddylist(OscarData *od, FlapConnection *conn, aim_module_t *mod, FlapFrame *frame, aim_modsnac_t *snac, aim_userinfo_t *userinfo, IcbmArgsCh2 *args, ByteStream *servdata) { - /* * This goes like this... * @@ -1740,7 +1740,8 @@ * ... * ... */ - while (servdata && byte_stream_empty(servdata)) { + while (byte_stream_empty(servdata)) + { guint16 gnlen, numb; int i; char *gn; @@ -1767,51 +1768,49 @@ return; } -static void incomingim_ch2_buddyicon_free(OscarData *od, IcbmArgsCh2 *args) +static void +incomingim_ch2_buddyicon_free(OscarData *od, IcbmArgsCh2 *args) { - free(args->info.icon.icon); return; } -static void incomingim_ch2_buddyicon(OscarData *od, FlapConnection *conn, aim_module_t *mod, FlapFrame *frame, aim_modsnac_t *snac, aim_userinfo_t *userinfo, IcbmArgsCh2 *args, ByteStream *servdata) +static void +incomingim_ch2_buddyicon(OscarData *od, FlapConnection *conn, aim_module_t *mod, FlapFrame *frame, aim_modsnac_t *snac, aim_userinfo_t *userinfo, IcbmArgsCh2 *args, ByteStream *servdata) { + args->info.icon.checksum = byte_stream_get32(servdata); + args->info.icon.length = byte_stream_get32(servdata); + args->info.icon.timestamp = byte_stream_get32(servdata); + args->info.icon.icon = byte_stream_getraw(servdata, args->info.icon.length); - if (servdata) { - args->info.icon.checksum = byte_stream_get32(servdata); - args->info.icon.length = byte_stream_get32(servdata); - args->info.icon.timestamp = byte_stream_get32(servdata); - args->info.icon.icon = byte_stream_getraw(servdata, args->info.icon.length); - } - args->destructor = (void *)incomingim_ch2_buddyicon_free; return; } -static void incomingim_ch2_chat_free(OscarData *od, IcbmArgsCh2 *args) +static void +incomingim_ch2_chat_free(OscarData *od, IcbmArgsCh2 *args) { - /* XXX - aim_chat_roominfo_free() */ free(args->info.chat.roominfo.name); return; } -static void incomingim_ch2_chat(OscarData *od, FlapConnection *conn, aim_module_t *mod, FlapFrame *frame, aim_modsnac_t *snac, aim_userinfo_t *userinfo, IcbmArgsCh2 *args, ByteStream *servdata) +static void +incomingim_ch2_chat(OscarData *od, FlapConnection *conn, aim_module_t *mod, FlapFrame *frame, aim_modsnac_t *snac, aim_userinfo_t *userinfo, IcbmArgsCh2 *args, ByteStream *servdata) { - /* * Chat room info. */ - if (servdata) - aim_chat_readroominfo(servdata, &args->info.chat.roominfo); + aim_chat_readroominfo(servdata, &args->info.chat.roominfo); args->destructor = (void *)incomingim_ch2_chat_free; } -static void incomingim_ch2_icqserverrelay_free(OscarData *od, IcbmArgsCh2 *args) +static void +incomingim_ch2_icqserverrelay_free(OscarData *od, IcbmArgsCh2 *args) { free((char *)args->info.rtfmsg.rtfmsg); } @@ -1824,12 +1823,13 @@ * Note that this is all little-endian. Cringe. * */ -static void incomingim_ch2_icqserverrelay(OscarData *od, FlapConnection *conn, aim_module_t *mod, FlapFrame *frame, aim_modsnac_t *snac, aim_userinfo_t *userinfo, IcbmArgsCh2 *args, ByteStream *servdata) +static void +incomingim_ch2_icqserverrelay(OscarData *od, FlapConnection *conn, aim_module_t *mod, FlapFrame *frame, aim_modsnac_t *snac, aim_userinfo_t *userinfo, IcbmArgsCh2 *args, ByteStream *servdata) { guint16 hdrlen, anslen, msglen; - if (servdata == NULL) - /* Odd... Oh well. */ + if (byte_stream_empty(servdata) < 24) + /* Someone sent us a short server relay ICBM. Weird. (Maybe?) */ return; hdrlen = byte_stream_getle16(servdata); @@ -1855,48 +1855,47 @@ args->destructor = (void *)incomingim_ch2_icqserverrelay_free; } -static void incomingim_ch2_sendfile_free(OscarData *od, IcbmArgsCh2 *args) +static void +incomingim_ch2_sendfile_free(OscarData *od, IcbmArgsCh2 *args) { free(args->info.sendfile.filename); } -static void incomingim_ch2_sendfile(OscarData *od, FlapConnection *conn, aim_module_t *mod, FlapFrame *frame, aim_modsnac_t *snac, aim_userinfo_t *userinfo, IcbmArgsCh2 *args, ByteStream *servdata) +/* Someone is sending us a file */ +static void +incomingim_ch2_sendfile(OscarData *od, FlapConnection *conn, aim_module_t *mod, FlapFrame *frame, aim_modsnac_t *snac, aim_userinfo_t *userinfo, IcbmArgsCh2 *args, ByteStream *servdata) { + int flen; args->destructor = (void *)incomingim_ch2_sendfile_free; /* Maybe there is a better way to tell what kind of sendfile * this is? Maybe TLV t(000a)? */ - if (servdata) { /* Someone is sending us a file */ - int flen; - /* subtype is one of AIM_OFT_SUBTYPE_* */ - args->info.sendfile.subtype = byte_stream_get16(servdata); - args->info.sendfile.totfiles = byte_stream_get16(servdata); - args->info.sendfile.totsize = byte_stream_get32(servdata); + /* subtype is one of AIM_OFT_SUBTYPE_* */ + args->info.sendfile.subtype = byte_stream_get16(servdata); + args->info.sendfile.totfiles = byte_stream_get16(servdata); + args->info.sendfile.totsize = byte_stream_get32(servdata); - /* - * I hope to God I'm right when I guess that there is a - * 32 char max filename length for single files. I think - * OFT tends to do that. Gotta love inconsistency. I saw - * a 26 byte filename? - */ - /* AAA - create an byte_stream_getnullstr function (don't anymore)(maybe) */ - /* Use an inelegant way of getting the null-terminated filename, - * since there's no easy bstream routine. */ - for (flen = 0; byte_stream_get8(servdata); flen++); - byte_stream_advance(servdata, -flen -1); - args->info.sendfile.filename = byte_stream_getstr(servdata, flen); + /* + * I hope to God I'm right when I guess that there is a + * 32 char max filename length for single files. I think + * OFT tends to do that. Gotta love inconsistency. I saw + * a 26 byte filename? + */ + /* AAA - create an byte_stream_getnullstr function (don't anymore)(maybe) */ + /* Use an inelegant way of getting the null-terminated filename, + * since there's no easy bstream routine. */ + for (flen = 0; byte_stream_get8(servdata); flen++); + byte_stream_advance(servdata, -flen -1); + args->info.sendfile.filename = byte_stream_getstr(servdata, flen); - /* There is sometimes more after the null-terminated filename, - * but I'm unsure of its format. */ - /* I don't believe him. */ - /* There is sometimes a null byte inside a unicode filename, - * but as far as I can tell the filename is the last - * piece of data that will be in this message. --Jonathan */ - } - - return; + /* There is sometimes more after the null-terminated filename, + * but I'm unsure of its format. */ + /* I don't believe him. */ + /* There is sometimes a null byte inside a unicode filename, + * but as far as I can tell the filename is the last + * piece of data that will be in this message. --Jonathan */ } typedef void (*ch2_args_destructor_t)(OscarData *od, IcbmArgsCh2 *args); @@ -2071,24 +2070,24 @@ byte_stream_init(&sdbs, servdatatlv->value, servdatatlv->length); sdbsptr = &sdbs; + + /* + * The rest of the handling depends on what type it is. + * + * Not all of them have special handling (yet). + */ + if (args.type & OSCAR_CAPABILITY_BUDDYICON) + incomingim_ch2_buddyicon(od, conn, mod, frame, snac, userinfo, &args, sdbsptr); + else if (args.type & OSCAR_CAPABILITY_SENDBUDDYLIST) + incomingim_ch2_buddylist(od, conn, mod, frame, snac, userinfo, &args, sdbsptr); + else if (args.type & OSCAR_CAPABILITY_CHAT) + incomingim_ch2_chat(od, conn, mod, frame, snac, userinfo, &args, sdbsptr); + else if (args.type & OSCAR_CAPABILITY_ICQSERVERRELAY) + incomingim_ch2_icqserverrelay(od, conn, mod, frame, snac, userinfo, &args, sdbsptr); + else if (args.type & OSCAR_CAPABILITY_SENDFILE) + incomingim_ch2_sendfile(od, conn, mod, frame, snac, userinfo, &args, sdbsptr); } - /* - * The rest of the handling depends on what type it is. - * - * Not all of them have special handling (yet). - */ - if (args.type & OSCAR_CAPABILITY_BUDDYICON) - incomingim_ch2_buddyicon(od, conn, mod, frame, snac, userinfo, &args, sdbsptr); - else if (args.type & OSCAR_CAPABILITY_SENDBUDDYLIST) - incomingim_ch2_buddylist(od, conn, mod, frame, snac, userinfo, &args, sdbsptr); - else if (args.type & OSCAR_CAPABILITY_CHAT) - incomingim_ch2_chat(od, conn, mod, frame, snac, userinfo, &args, sdbsptr); - else if (args.type & OSCAR_CAPABILITY_ICQSERVERRELAY) - incomingim_ch2_icqserverrelay(od, conn, mod, frame, snac, userinfo, &args, sdbsptr); - else if (args.type & OSCAR_CAPABILITY_SENDFILE) - incomingim_ch2_sendfile(od, conn, mod, frame, snac, userinfo, &args, sdbsptr); - if ((userfunc = aim_callhandler(od, snac->family, snac->subtype))) ret = userfunc(od, conn, frame, channel, userinfo, &args); Modified: trunk/src/protocols/oscar/oscar.c =================================================================== --- trunk/src/protocols/oscar/oscar.c 2006-07-20 07:31:37 UTC (rev 16524) +++ trunk/src/protocols/oscar/oscar.c 2006-07-20 08:11:54 UTC (rev 16525) @@ -954,7 +954,7 @@ new_conn_data = data; gc = new_conn_data->gc; - if (!g_list_find(gaim_connections_get_all(), gc)) + if (!GAIM_CONNECTION_IS_VALID(gc)) { if (source >= 0) close(source); @@ -2182,12 +2182,10 @@ gaim_auth_dontrequest(struct name_data *data) { GaimConnection *gc = data->gc; + GaimBuddy *b = gaim_find_buddy(gaim_connection_get_account(gc), data->name); - if (g_list_find(gaim_connections_get_all(), gc)) { - /* Remove from local list */ - GaimBuddy *b = gaim_find_buddy(gaim_connection_get_account(gc), data->name); - gaim_blist_remove_buddy(b); - } + /* Remove from local list */ + gaim_blist_remove_buddy(b); oscar_free_name_data(data); } @@ -2240,11 +2238,9 @@ gaim_auth_grant(struct name_data *data) { GaimConnection *gc = data->gc; + OscarData *od = gc->proto_data; - if (g_list_find(gaim_connections_get_all(), gc)) { - OscarData *od = gc->proto_data; - aim_ssi_sendauthreply(od, data->name, 0x01, NULL); - } + aim_ssi_sendauthreply(od, data->name, 0x01, NULL); oscar_free_name_data(data); } @@ -2254,11 +2250,9 @@ gaim_auth_dontgrant(struct name_data *data, char *msg) { GaimConnection *gc = data->gc; + OscarData *od = gc->proto_data; - if (g_list_find(gaim_connections_get_all(), gc)) { - OscarData *od = gc->proto_data; - aim_ssi_sendauthreply(od, data->name, 0x00, msg ? msg : _("No reason given.")); - } + aim_ssi_sendauthreply(od, data->name, 0x00, msg ? msg : _("No reason given.")); } static void @@ -2277,9 +2271,7 @@ { GaimConnection *gc = data->gc; - if (g_list_find(gaim_connections_get_all(), gc)) { - gaim_blist_request_add_buddy(gaim_connection_get_account(gc), data->name, NULL, data->nick); - } + gaim_blist_request_add_buddy(gaim_connection_get_account(gc), data->name, NULL, data->nick); oscar_free_name_data(data); } @@ -2780,7 +2772,11 @@ } break; default: { - gaim_debug_error("oscar", "Received unknown typing notification message from %s. Type1 is 0x%04x and type2 is 0x%04hx.\n", sn, type1, type2); + /* + * It looks like iChat sometimes sends typing notification + * with type1=0x0001 and type2=0x000f. Not sure why. + */ + gaim_debug_info("oscar", "Received unknown typing notification message from %s. Type1 is 0x%04x and type2 is 0x%04hx.\n", sn, type1, type2); } break; } Modified: trunk/src/protocols/oscar/peer.c =================================================================== --- trunk/src/protocols/oscar/peer.c 2006-07-20 07:31:37 UTC (rev 16524) +++ trunk/src/protocols/oscar/peer.c 2006-07-20 08:11:54 UTC (rev 16525) @@ -481,7 +481,7 @@ conn = new_conn_data->conn; g_free(new_conn_data); - if (!g_list_find(gaim_connections_get_all(), gc)) + if (!GAIM_CONNECTION_IS_VALID(gc)) { if (source >= 0) close(source); @@ -573,7 +573,7 @@ conn = new_conn_data->conn; g_free(new_conn_data); - if (!g_list_find(gaim_connections_get_all(), gc)) + if (!GAIM_CONNECTION_IS_VALID(gc)) { if (listenerfd != -1) close(listenerfd); Modified: trunk/src/protocols/oscar/peer_proxy.c =================================================================== --- trunk/src/protocols/oscar/peer_proxy.c 2006-07-20 07:31:37 UTC (rev 16524) +++ trunk/src/protocols/oscar/peer_proxy.c 2006-07-20 08:11:54 UTC (rev 16525) @@ -337,7 +337,7 @@ conn = new_conn_data->conn; g_free(new_conn_data); - if (!g_list_find(gaim_connections_get_all(), gc)) + if (!GAIM_CONNECTION_IS_VALID(gc)) { if (source >= 0) close(source); Modified: trunk/src/protocols/silc/silc.c =================================================================== --- trunk/src/protocols/silc/silc.c 2006-07-20 07:31:37 UTC (rev 16524) +++ trunk/src/protocols/silc/silc.c 2006-07-20 08:11:54 UTC (rev 16525) @@ -152,28 +152,24 @@ const char *dfile; g_return_if_fail(gc != NULL); - sg = gc->proto_data; + if (!GAIM_CONNECTION_IS_VALID(gc)) { + close(source); + return; + } + if (source < 0) { gaim_connection_error(gc, _("Connection failed")); return; } + sg = gc->proto_data; if (sg == NULL) return; client = sg->client; account = sg->account; - if (!g_list_find(gaim_connections_get_all(), gc)) { - close(source); - g_source_remove(sg->scheduler); - silc_client_stop(sg->client); - silc_client_free(sg->client); - silc_free(sg); - return; - } - /* Get session detachment data, if available */ memset(¶ms, 0, sizeof(params)); dfile = silcgaim_session_file(gaim_account_get_username(sg->account)); Modified: trunk/src/protocols/yahoo/yahoo.c =================================================================== --- trunk/src/protocols/yahoo/yahoo.c 2006-07-20 07:31:37 UTC (rev 16524) +++ trunk/src/protocols/yahoo/yahoo.c 2006-07-20 08:11:54 UTC (rev 16525) @@ -810,6 +810,7 @@ if (!msg || !g_utf8_validate(msg, -1, NULL)) return; + /* TODO: Does this really need to be escaped? It seems like it doesn't. */ escmsg = g_markup_escape_text(msg, -1); prim = g_strdup_printf(_("Yahoo! system message for %s:"), @@ -2132,6 +2133,9 @@ case YAHOO_SERVICE_PICTURE_UPLOAD: yahoo_process_picture_upload(gc, pkt); break; + case YAHOO_SERVICE_AVATAR_UPDATE: + yahoo_process_avatar_update(gc, pkt); + break; case YAHOO_SERVICE_AUDIBLE: yahoo_process_audible(gc, pkt); break; @@ -2234,7 +2238,7 @@ struct yahoo_data *yd; struct yahoo_packet *pkt; - if (!g_list_find(gaim_connections_get_all(), gc)) { + if (!GAIM_CONNECTION_IS_VALID(gc)) { close(source); return; } @@ -2261,7 +2265,7 @@ struct yahoo_data *yd; struct yahoo_packet *pkt; - if (!g_list_find(gaim_connections_get_all(), gc)) { + if (!GAIM_CONNECTION_IS_VALID(gc)) { close(source); return; } Modified: trunk/src/protocols/yahoo/yahoo_picture.c =================================================================== --- trunk/src/protocols/yahoo/yahoo_picture.c 2006-07-20 07:31:37 UTC (rev 16524) +++ trunk/src/protocols/yahoo/yahoo_picture.c 2006-07-20 08:11:54 UTC (rev 16525) @@ -225,6 +225,50 @@ } } +void yahoo_process_avatar_update(GaimConnection *gc, struct yahoo_packet *pkt) +{ + GSList *l = pkt->hash; + char *who = NULL; + int avatar = 0; + + while (l) { + struct yahoo_pair *pair = l->data; + + switch (pair->key) { + case 4: + who = pair->value; + break; + case 5: + /* us */ + break; + case 206: + /* + * 0 - No icon or avatar + * 1 - Using an avatar + * 2 - Using an icon + */ + avatar = strtol(pair->value, NULL, 10); + break; + } + l = l->next; + } + + if (who) { + if (avatar == 2) + yahoo_send_picture_request(gc, who); + else if ((avatar == 0) || (avatar == 1)) { + GaimBuddy *b = gaim_find_buddy(gc->account, who); + YahooFriend *f; + gaim_buddy_icons_set_for_user(gc->account, who, NULL, 0); + if (b) + gaim_blist_node_remove_setting((GaimBlistNode *)b, YAHOO_ICON_CHECKSUM_KEY); + if ((f = yahoo_friend_find(gc, who))) + yahoo_friend_set_buddy_icon_need_request(f, TRUE); + gaim_debug_misc("yahoo", "Setting user %s's icon to NULL.\n", who); + } + } +} + void yahoo_send_picture_info(GaimConnection *gc, const char *who) { struct yahoo_data *yd = gc->proto_data; Modified: trunk/src/protocols/yahoo/yahoo_picture.h =================================================================== --- trunk/src/protocols/yahoo/yahoo_picture.h 2006-07-20 07:31:37 UTC (rev 16524) +++ trunk/src/protocols/yahoo/yahoo_picture.h 2006-07-20 08:11:54 UTC (rev 16525) @@ -35,6 +35,8 @@ void yahoo_process_picture_checksum(GaimConnection *gc, struct yahoo_packet *pkt); void yahoo_process_picture_upload(GaimConnection *gc, struct yahoo_packet *pkt); +void yahoo_process_avatar_update(GaimConnection *gc, struct yahoo_packet *pkt); + void yahoo_set_buddy_icon(GaimConnection *gc, const char *iconfile); void yahoo_buddy_icon_upload(GaimConnection *gc, struct yahoo_buddy_icon_upload_data *d); void yahoo_buddy_icon_upload_data_free(struct yahoo_buddy_icon_upload_data *d); Modified: trunk/src/proxy.c =================================================================== --- trunk/src/proxy.c 2006-07-20 07:31:37 UTC (rev 16524) +++ trunk/src/proxy.c 2006-07-20 08:11:54 UTC (rev 16525) @@ -86,9 +86,9 @@ { g_return_if_fail(info != NULL); - if (info->host != NULL) g_free(info->host); - if (info->username != NULL) g_free(info->username); - if (info->password != NULL) g_free(info->password); + g_free(info->host); + g_free(info->username); + g_free(info->password); g_free(info); } @@ -106,8 +106,7 @@ { g_return_if_fail(info != NULL); - if (info->host != NULL) - g_free(info->host); + g_free(info->host); info->host = (host == NULL ? NULL : g_strdup(host)); } @@ -125,8 +124,7 @@ { g_return_if_fail(info != NULL); - if (info->username != NULL) - g_free(info->username); + g_free(info->username); info->username = (username == NULL ? NULL : g_strdup(username)); } @@ -136,8 +134,7 @@ { g_return_if_fail(info != NULL); - if (info->password != NULL) - g_free(info->password); + g_free(info->password); info->password = (password == NULL ? NULL : g_strdup(password)); } @@ -303,7 +300,7 @@ trap_gdb_bug() { const char *message = - "Gaim's DNS child got a SIGTRAP signal. \n" + "Gaim's DNS child got a SIGTRAP signal.\n" "This can be caused by trying to run gaim inside gdb.\n" "There is a known gdb bug which prevents this. Supposedly gaim\n" "should have detected you were using gdb and used an ugly hack,\n" @@ -2319,6 +2316,12 @@ return gpi; } +/* + * TODO: It would be really good if this returned some sort of handle + * that we could use to cancel the connection. As it is now, + * each callback has to check to make sure gc is still valid. + * And that is ugly. + */ int gaim_proxy_connect(GaimAccount *account, const char *host, int port, GaimInputFunction func, gpointer data) Modified: trunk/src/util.h =================================================================== --- trunk/src/util.h 2006-07-20 07:31:37 UTC (rev 16524) +++ trunk/src/util.h 2006-07-20 08:11:54 UTC (rev 16525) @@ -343,11 +343,12 @@ * in a GData hash table. The names of the attributes are lower-cased * in the hash table, and the name of the tag is case insensitive. * - * @param needle the name of the tag - * @param haystack the null-delimited string to search in - * @param start a pointer to the start of the tag if found - * @param end a pointer to the end of the tag if found - * @param attributes the attributes, if the tag was found + * @param needle The name of the tag + * @param haystack The null-delimited string to search in + * @param start A pointer to the start of the tag if found + * @param end A pointer to the end of the tag if found + * @param attributes The attributes, if the tag was found. This should + * be freed with g_datalist_clear(). * @return TRUE if the tag was found */ gboolean gaim_markup_find_tag(const char *needle, const char *haystack, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <aar...@us...> - 2006-07-20 12:53:57
|
Revision: 16527 Author: aaronsheldon Date: 2006-07-20 05:53:46 -0700 (Thu, 20 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16527&view=rev Log Message: ----------- Sadrul sent me this patch to look over and then commit. It fixes a PRPL leak in Yahoo's chat and fixes a few other memory leaks that were mostly my fault. Modified Paths: -------------- trunk/src/conversation.c trunk/src/gtkconv.c trunk/src/protocols/yahoo/yahoochat.c Modified: trunk/src/conversation.c =================================================================== --- trunk/src/conversation.c 2006-07-20 08:12:17 UTC (rev 16526) +++ trunk/src/conversation.c 2006-07-20 12:53:46 UTC (rev 16527) @@ -1485,7 +1485,7 @@ { GaimConversation *conv; GaimConversationUiOps *ops; - GaimConvChatBuddy *cb; + GaimConvChatBuddy *cbuddy; GaimConnection *gc; GaimPluginProtocolInfo *prpl_info; GList *ul, *fl; @@ -1508,12 +1508,9 @@ const char *user = (const char *)ul->data; const char *alias = user; gboolean quiet; - GaimConvChatBuddy *cbuddy; - GaimConvChatBuddyFlags flags = GPOINTER_TO_INT(fl->data); + GaimConvChatBuddyFlags flag = GPOINTER_TO_INT(fl->data); const char *extra_msg = (extra_msgs ? extra_msgs->data : NULL); - cbuddy = gaim_conv_chat_cb_new(user, NULL, GPOINTER_TO_INT(fl->data)); - if (!strcmp(chat->nick, gaim_normalize(conv->account, user))) { const char *alias2 = gaim_account_get_alias(conv->account); if (alias2 != NULL) @@ -1531,17 +1528,14 @@ } quiet = GPOINTER_TO_INT(gaim_signal_emit_return_1(gaim_conversations_get_handle(), - "chat-buddy-joining", conv, user, flags)) | + "chat-buddy-joining", conv, user, flag)) | gaim_conv_chat_is_user_ignored(chat, user); - cb = gaim_conv_chat_cb_new(user, NULL, flags); + cbuddy = gaim_conv_chat_cb_new(user, alias, flag); /* This seems dumb. Why should we set users thousands of times? */ gaim_conv_chat_set_users(chat, - g_list_prepend(gaim_conv_chat_get_users(chat), cb)); + g_list_prepend(gaim_conv_chat_get_users(chat), cbuddy)); - cbuddy->alias = strdup(alias); /* Should I be doing a strdup? */ - cbuddy->alias_key = g_utf8_collate_key(alias, strlen(alias)); - cbuddy->buddy = (gaim_find_buddy(conv->account, cbuddy->name) != NULL); cbuddies = g_list_prepend(cbuddies, cbuddy); if (!quiet && new_arrivals) { @@ -1563,7 +1557,7 @@ } gaim_signal_emit(gaim_conversations_get_handle(), - "chat-buddy-joined", conv, user, flags, new_arrivals); + "chat-buddy-joined", conv, user, flag, new_arrivals); ul = ul->next; fl = fl->next; if (extra_msgs != NULL) @@ -1575,6 +1569,7 @@ if (ops != NULL && ops->chat_add_users != NULL) ops->chat_add_users(conv, cbuddies, new_arrivals); + g_list_free(cbuddies); } void Modified: trunk/src/gtkconv.c =================================================================== --- trunk/src/gtkconv.c 2006-07-20 08:12:17 UTC (rev 16526) +++ trunk/src/gtkconv.c 2006-07-20 12:53:46 UTC (rev 16527) @@ -3398,6 +3398,7 @@ if (pixbuf) g_object_unref(pixbuf); + g_free(alias_key); } static void @@ -3707,7 +3708,7 @@ if (!strcmp(normalized_name, gaim_normalize(conv->account, name))) { const char *alias = name; - char *alias_key = g_utf8_collate_key(alias, strlen(alias)); + char *alias_key = NULL; GaimBuddy *buddy2; if (strcmp(chat->nick, gaim_normalize(conv->account, name))) { @@ -3715,13 +3716,15 @@ if ((buddy2 = gaim_find_buddy(conv->account, name)) != NULL) { alias = gaim_buddy_get_contact_alias(buddy2); - alias_key = g_utf8_collate_key(alias, strlen(alias)); } + alias_key = g_utf8_collate_key(alias, strlen(alias)); + gtk_list_store_set(GTK_LIST_STORE(model), &iter, CHAT_USERS_ALIAS_COLUMN, alias, CHAT_USERS_ALIAS_KEY_COLUMN, alias_key, -1); + g_free(alias_key); } g_free(name); break; Modified: trunk/src/protocols/yahoo/yahoochat.c =================================================================== --- trunk/src/protocols/yahoo/yahoochat.c 2006-07-20 08:12:17 UTC (rev 16526) +++ trunk/src/protocols/yahoo/yahoochat.c 2006-07-20 12:53:46 UTC (rev 16527) @@ -460,6 +460,7 @@ yd->chat_name = g_strdup(room); gaim_conv_chat_add_users(GAIM_CONV_CHAT(c), members, NULL, flags, FALSE); } + g_list_free(flags); } else if (c) { yahoo_chat_add_users(GAIM_CONV_CHAT(c), members); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-07-20 21:43:25
|
Revision: 16534 Author: sadrul Date: 2006-07-20 14:43:15 -0700 (Thu, 20 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16534&view=rev Log Message: ----------- Some more memleaks. Modified Paths: -------------- trunk/src/gtknotify.c trunk/src/notify.c Modified: trunk/src/gtknotify.c =================================================================== --- trunk/src/gtknotify.c 2006-07-20 19:51:34 UTC (rev 16533) +++ trunk/src/gtknotify.c 2006-07-20 21:43:15 UTC (rev 16534) @@ -53,6 +53,7 @@ GtkWidget *treeview; GtkWidget *window; gpointer user_data; + GaimNotifySearchResults *results; } GaimNotifySearchResultsData; @@ -684,6 +685,7 @@ data = g_malloc(sizeof(GaimNotifySearchResultsData)); data->user_data = user_data; + data->results = results; /* Create the window */ window = gtk_window_new(GTK_WINDOW_TOPLEVEL); @@ -812,6 +814,7 @@ g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(searchresults_callback_wrapper_cb), bd); + g_signal_connect_swapped(G_OBJECT(button), "destroy", G_CALLBACK(g_free), bd); } } @@ -864,6 +867,7 @@ GaimNotifySearchResultsData *data = (GaimNotifySearchResultsData *)ui_handle; gtk_widget_destroy(data->window); + gaim_notify_searchresults_free(data->results); g_free(data); } Modified: trunk/src/notify.c =================================================================== --- trunk/src/notify.c 2006-07-20 19:51:34 UTC (rev 16533) +++ trunk/src/notify.c 2006-07-20 21:43:15 UTC (rev 16534) @@ -200,6 +200,7 @@ for (l = results->buttons; l; l = g_list_delete_link(l, l)) { GaimNotifySearchButton *button = l->data; + g_free(button->label); g_free(button); } results->buttons = NULL; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <the...@us...> - 2006-07-23 18:57:12
|
Revision: 16548 Author: thekingant Date: 2006-07-23 11:57:08 -0700 (Sun, 23 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16548&view=rev Log Message: ----------- Minor cleanup Modified Paths: -------------- trunk/src/conversation.c trunk/src/protocols/jabber/jabber.c trunk/src/protocols/jabber/message.c trunk/src/protocols/simple/simple.c Modified: trunk/src/conversation.c =================================================================== --- trunk/src/conversation.c 2006-07-23 12:19:10 UTC (rev 16547) +++ trunk/src/conversation.c 2006-07-23 18:57:08 UTC (rev 16548) @@ -1440,7 +1440,7 @@ g_list_free(flags2); } -int +static int gaim_conv_chat_cb_compare(GaimConvChatBuddy *a, GaimConvChatBuddy *b) { GaimConvChatBuddyFlags f1 = 0, f2 = 0; Modified: trunk/src/protocols/jabber/jabber.c =================================================================== --- trunk/src/protocols/jabber/jabber.c 2006-07-23 12:19:10 UTC (rev 16547) +++ trunk/src/protocols/jabber/jabber.c 2006-07-23 18:57:08 UTC (rev 16548) @@ -370,7 +370,7 @@ int len; static char buf[4096]; - if(!g_list_find(gaim_connections_get_all(), gc)) + if(!GAIM_CONNECTION_IS_VALID(gc)) return; if((len = read(js->fd, buf, sizeof(buf) - 1)) > 0) { @@ -486,7 +486,7 @@ JabberStream *js; gc = data; - if (!g_list_find(gaim_connections_get_all(), gc)) + if (!GAIM_CONNECTION_IS_VALID(gc)) { /* This connection has been closed */ g_free(resp); @@ -500,7 +500,7 @@ g_free(resp); } else { jabber_login_connect(js, js->user->domain, - gaim_account_get_int(js->gc->account, "port", 0)); + gaim_account_get_int(js->gc->account, "port", 5222)); } } Modified: trunk/src/protocols/jabber/message.c =================================================================== --- trunk/src/protocols/jabber/message.c 2006-07-23 12:19:10 UTC (rev 16547) +++ trunk/src/protocols/jabber/message.c 2006-07-23 18:57:08 UTC (rev 16548) @@ -245,9 +245,6 @@ const char *type; xmlnode *child; - if(strcmp(packet->name, "message")) - return; - jm = g_new0(JabberMessage, 1); jm->js = js; jm->sent = time(NULL); Modified: trunk/src/protocols/simple/simple.c =================================================================== --- trunk/src/protocols/simple/simple.c 2006-07-23 12:19:10 UTC (rev 16547) +++ trunk/src/protocols/simple/simple.c 2006-07-23 18:57:08 UTC (rev 16548) @@ -1535,7 +1535,7 @@ int port; gc = data; - if (!g_list_find(gaim_connections_get_all(), gc)) + if (!GAIM_CONNECTION_IS_VALID(gc)) { /* This connection has been closed */ g_free(resp); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <the...@us...> - 2006-07-24 04:27:53
|
Revision: 16556 Author: thekingant Date: 2006-07-23 21:27:42 -0700 (Sun, 23 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16556&view=rev Log Message: ----------- Fix a minor case of accessing something that had been free'd in oscar, and some other minor cleanup. FYI "0" is a valid file descriptor, but it will pretty much always be STDOUT, STDERR or STDIN. But I like to check for -1 anyway, because I'm weird. Modified Paths: -------------- trunk/src/protocols/oscar/flap_connection.c trunk/src/protocols/oscar/odc.c trunk/src/protocols/oscar/oscar.h trunk/src/sslconn.c Modified: trunk/src/protocols/oscar/flap_connection.c =================================================================== --- trunk/src/protocols/oscar/flap_connection.c 2006-07-24 01:03:07 UTC (rev 16555) +++ trunk/src/protocols/oscar/flap_connection.c 2006-07-24 04:27:42 UTC (rev 16556) @@ -205,7 +205,6 @@ flap_connection_destroy_rates(conn->rates); od->oscar_connections = g_list_remove(od->oscar_connections, conn); - g_free(conn); account = gaim_connection_get_account(od->gc); @@ -227,12 +226,18 @@ else if (conn->disconnect_reason == OSCAR_DISCONNECT_COULD_NOT_CONNECT) tmp = _("Could not establish a connection with the server."); else + /* + * We shouldn't print a message for some disconnect_reasons. + * Like OSCAR_DISCONNECT_LOCAL_CLOSED. + */ tmp = NULL; if (tmp != NULL) gaim_connection_error(od->gc, tmp); } + g_free(conn); + return FALSE; } Modified: trunk/src/protocols/oscar/odc.c =================================================================== --- trunk/src/protocols/oscar/odc.c 2006-07-24 01:03:07 UTC (rev 16555) +++ trunk/src/protocols/oscar/odc.c 2006-07-24 04:27:42 UTC (rev 16556) @@ -37,25 +37,15 @@ const gchar *tmp; if (conn->disconnect_reason == OSCAR_DISCONNECT_REMOTE_CLOSED) - { tmp = _("The remote user has closed the connection."); - } else if (conn->disconnect_reason == OSCAR_DISCONNECT_REMOTE_REFUSED) - { tmp = _("The remote user has declined your request."); - } else if (conn->disconnect_reason == OSCAR_DISCONNECT_LOST_CONNECTION) - { tmp = _("Lost connection with the remote user for an unknown reason."); - } else if (conn->disconnect_reason == OSCAR_DISCONNECT_INVALID_DATA) - { tmp = _("Received invalid data on connection with remote user."); - } else if (conn->disconnect_reason == OSCAR_DISCONNECT_COULD_NOT_CONNECT) - { tmp = _("Could not establish a connection with the remote user."); - } else /* * We shouldn't print a message for some disconnect_reasons. Modified: trunk/src/protocols/oscar/oscar.h =================================================================== --- trunk/src/protocols/oscar/oscar.h 2006-07-24 01:03:07 UTC (rev 16555) +++ trunk/src/protocols/oscar/oscar.h 2006-07-24 04:27:42 UTC (rev 16556) @@ -287,14 +287,14 @@ typedef enum { - OSCAR_DISCONNECT_DONE, - OSCAR_DISCONNECT_LOCAL_CLOSED, + OSCAR_DISCONNECT_DONE, /* not considered an error */ + OSCAR_DISCONNECT_LOCAL_CLOSED, /* peer connections only, not considered an error */ OSCAR_DISCONNECT_REMOTE_CLOSED, - OSCAR_DISCONNECT_REMOTE_REFUSED, + OSCAR_DISCONNECT_REMOTE_REFUSED, /* peer connections only */ OSCAR_DISCONNECT_LOST_CONNECTION, OSCAR_DISCONNECT_INVALID_DATA, OSCAR_DISCONNECT_COULD_NOT_CONNECT, - OSCAR_DISCONNECT_RETRYING + OSCAR_DISCONNECT_RETRYING /* peer connections only */ } OscarDisconnectReason; typedef enum Modified: trunk/src/sslconn.c =================================================================== --- trunk/src/sslconn.c 2006-07-24 01:03:07 UTC (rev 16555) +++ trunk/src/sslconn.c 2006-07-24 04:27:42 UTC (rev 16556) @@ -137,7 +137,7 @@ GaimSslConnection *gsc; GaimSslOps *ops; - g_return_val_if_fail(fd > 0, NULL); + g_return_val_if_fail(fd != -1, NULL); g_return_val_if_fail(func != NULL, NULL); g_return_val_if_fail(gaim_ssl_is_supported(), NULL); @@ -178,12 +178,10 @@ if (ops != NULL && ops->close != NULL) (ops->close)(gsc); - if (gsc->fd) + if (gsc->fd != -1) close(gsc->fd); - if (gsc->host != NULL) - g_free(gsc->host); - + g_free(gsc->host); g_free(gsc); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rl...@us...> - 2006-07-25 01:25:10
|
Revision: 16566 Author: rlaager Date: 2006-07-24 18:25:04 -0700 (Mon, 24 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16566&view=rev Log Message: ----------- Having value.h include config.h is bad. It caused plenty of warnings building my plugins, for example. Modified Paths: -------------- trunk/src/gtkconv.c trunk/src/log.c trunk/src/value.h Modified: trunk/src/gtkconv.c =================================================================== --- trunk/src/gtkconv.c 2006-07-24 23:57:11 UTC (rev 16565) +++ trunk/src/gtkconv.c 2006-07-25 01:25:04 UTC (rev 16566) @@ -6585,7 +6585,13 @@ gaim_value_new(GAIM_TYPE_POINTER), 2, gaim_value_new(GAIM_TYPE_SUBTYPE, GAIM_SUBTYPE_LOG), - gaim_value_new(GAIM_TYPE_TIME_T)); +#if SIZEOF_TIME_T == 4 + gaim_value_new(GAIM_TYPE_INT)); +#elif SIZE_OF_TIME_T == 8 + gaim_value_new(GAIM_TYPE_INT64)); +#else +# error Unknown size of time_t +#endif gaim_signal_register(handle, "displaying-im-msg", gaim_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_POINTER, Modified: trunk/src/log.c =================================================================== --- trunk/src/log.c 2006-07-24 23:57:11 UTC (rev 16565) +++ trunk/src/log.c 2006-07-25 01:25:04 UTC (rev 16566) @@ -604,7 +604,13 @@ gaim_value_new(GAIM_TYPE_POINTER), 2, gaim_value_new(GAIM_TYPE_SUBTYPE, GAIM_SUBTYPE_LOG), - gaim_value_new(GAIM_TYPE_TIME_T)); +#if SIZEOF_TIME_T == 4 + gaim_value_new(GAIM_TYPE_INT)); +#elif SIZE_OF_TIME_T == 8 + gaim_value_new(GAIM_TYPE_INT64)); +#else +# error Unknown size of time_t +#endif gaim_prefs_connect_callback(NULL, "/core/logging/format", logger_pref_cb, NULL); Modified: trunk/src/value.h =================================================================== --- trunk/src/value.h 2006-07-24 23:57:11 UTC (rev 16565) +++ trunk/src/value.h 2006-07-25 01:25:04 UTC (rev 16566) @@ -26,7 +26,6 @@ #define _GAIM_VALUE_H_ #include <glib.h> -#include "config.h" /** * Specific value types. @@ -54,16 +53,7 @@ } GaimType; -/* time_t is normally either an int or a uint; this is a little ugly - * and probably deserves revisiting. */ -#if SIZEOF_TIME_T == 8 -# define GAIM_TYPE_TIME_T GAIM_TYPE_INT64 -#else -# define GAIM_TYPE_TIME_T GAIM_TYPE_INT -#endif /* sizeof(time_t) == 8 */ - - /** * Gaim-specific subtype values. */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sea...@us...> - 2006-07-25 17:30:12
|
Revision: 16572 Author: seanegan Date: 2006-07-25 10:30:03 -0700 (Tue, 25 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16572&view=rev Log Message: ----------- Now that we've killed convo and blist toolbars, the chatlist toolbar seems out-of-place to me Modified Paths: -------------- trunk/src/gtkconv.c trunk/src/gtkconv.h trunk/src/log.c Modified: trunk/src/gtkconv.c =================================================================== --- trunk/src/gtkconv.c 2006-07-25 17:00:51 UTC (rev 16571) +++ trunk/src/gtkconv.c 2006-07-25 17:30:03 UTC (rev 16572) @@ -3869,10 +3869,9 @@ GtkWidget *vbox, *hbox, *frame; GtkWidget *imhtml_sw; GtkPolicyType imhtml_sw_hscroll; - GtkWidget *lbox, *bbox; + GtkWidget *lbox; GtkWidget *label; GtkWidget *list; - GtkWidget *button; GtkWidget *sw; GtkListStore *ls; GtkCellRenderer *rend; @@ -4020,48 +4019,6 @@ gtk_container_add(GTK_CONTAINER(sw), list); - /* Setup the user list toolbar. */ - bbox = gtk_hbox_new(TRUE, GAIM_HIG_BOX_SPACE); - gtk_box_pack_start(GTK_BOX(lbox), bbox, FALSE, FALSE, 0); - gtk_widget_show(bbox); - - /* IM */ - button = gaim_pixbuf_button_from_stock(NULL, GAIM_STOCK_IM, - GAIM_BUTTON_VERTICAL); - gtkchat->userlist_im = button; - gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); - gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); - gtk_tooltips_set_tip(gtkconv->tooltips, button, _("IM the user"), NULL); - g_signal_connect(G_OBJECT(button), "clicked", - G_CALLBACK(chat_im_button_cb), gtkconv); - - gtk_widget_show(button); - - /* Ignore */ - button = gaim_pixbuf_button_from_stock(NULL, GAIM_STOCK_IGNORE, - GAIM_BUTTON_VERTICAL); - gtkchat->userlist_ignore = button; - gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); - gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); - gtk_tooltips_set_tip(gtkconv->tooltips, button, - _("Ignore the user"), NULL); - g_signal_connect(G_OBJECT(button), "clicked", - G_CALLBACK(ignore_cb), gtkconv); - gtk_widget_show(button); - - /* Info */ - button = gaim_pixbuf_button_from_stock(NULL, GAIM_STOCK_INFO, - GAIM_BUTTON_VERTICAL); - gtkchat->userlist_info = button; - gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); - gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); - gtk_tooltips_set_tip(gtkconv->tooltips, button, - _("Get the user's information"), NULL); - g_signal_connect(G_OBJECT(button), "clicked", - G_CALLBACK(info_cb), gtkconv); - - gtk_widget_show(button); - /* Setup the bottom half of the conversation window */ vbox = gtk_vbox_new(FALSE, GAIM_HIG_BOX_SPACE); gtk_paned_pack2(GTK_PANED(vpaned), vbox, FALSE, TRUE); @@ -5586,13 +5543,7 @@ (gaim_blist_find_chat(account, gaim_conversation_get_name(conv)) != NULL)); } - /* Deal with chat userlist buttons */ - if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_CHAT) - { - gtk_widget_set_sensitive(gtkconv->u.chat->userlist_im, TRUE); - gtk_widget_set_sensitive(gtkconv->u.chat->userlist_ignore, TRUE); - gtk_widget_set_sensitive(gtkconv->u.chat->userlist_info, (prpl_info->get_info != NULL)); - } + } else { /* Account is offline */ /* Or it's a chat that we've left. */ @@ -5608,14 +5559,6 @@ gtk_widget_set_sensitive(win->menu.remove, FALSE); gtk_widget_set_sensitive(win->menu.insert_link, TRUE); gtk_widget_set_sensitive(win->menu.insert_image, FALSE); - - /* Deal with chat userlist buttons */ - if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_CHAT) - { - gtk_widget_set_sensitive(gtkconv->u.chat->userlist_im, FALSE); - gtk_widget_set_sensitive(gtkconv->u.chat->userlist_ignore, FALSE); - gtk_widget_set_sensitive(gtkconv->u.chat->userlist_info, FALSE); - } } /* @@ -6575,13 +6518,7 @@ "GaimGtkWindow *")); gaim_signal_register(handle, "conversation-timestamp", -#if SIZEOF_TIME_T == 4 gaim_marshal_POINTER__POINTER_INT, -#elif SIZEOF_TIME_T == 8 - gaim_marshal_POINTER__POINTER_INT64, -#else -# error Unknown size of time_t -#endif gaim_value_new(GAIM_TYPE_POINTER), 2, gaim_value_new(GAIM_TYPE_SUBTYPE, GAIM_SUBTYPE_LOG), Modified: trunk/src/gtkconv.h =================================================================== --- trunk/src/gtkconv.h 2006-07-25 17:00:51 UTC (rev 16571) +++ trunk/src/gtkconv.h 2006-07-25 17:30:03 UTC (rev 16572) @@ -103,9 +103,6 @@ GtkWidget *count; GtkWidget *list; GtkWidget *topic_text; - GtkWidget *userlist_im; - GtkWidget *userlist_ignore; - GtkWidget *userlist_info; }; /** Modified: trunk/src/log.c =================================================================== --- trunk/src/log.c 2006-07-25 17:00:51 UTC (rev 16571) +++ trunk/src/log.c 2006-07-25 17:30:03 UTC (rev 16572) @@ -594,13 +594,7 @@ gaim_log_logger_add(old_logger); gaim_signal_register(handle, "log-timestamp", -#if SIZEOF_TIME_T == 4 gaim_marshal_POINTER__POINTER_INT, -#elif SIZEOF_TIME_T == 8 - gaim_marshal_POINTER__POINTER_INT64, -#else -# error Unknown size of time_t -#endif gaim_value_new(GAIM_TYPE_POINTER), 2, gaim_value_new(GAIM_TYPE_SUBTYPE, GAIM_SUBTYPE_LOG), This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sea...@us...> - 2006-07-25 17:34:34
|
Revision: 16573 Author: seanegan Date: 2006-07-25 10:34:29 -0700 (Tue, 25 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16573&view=rev Log Message: ----------- Didn't mean to revert that. Modified Paths: -------------- trunk/src/gtkconv.c trunk/src/log.c Modified: trunk/src/gtkconv.c =================================================================== --- trunk/src/gtkconv.c 2006-07-25 17:30:03 UTC (rev 16572) +++ trunk/src/gtkconv.c 2006-07-25 17:34:29 UTC (rev 16573) @@ -6518,7 +6518,13 @@ "GaimGtkWindow *")); gaim_signal_register(handle, "conversation-timestamp", +#if SIZEOF_TIME_T == 4 gaim_marshal_POINTER__POINTER_INT, +#elif SIZEOF_TIME_T == 8 + gaim_marshal_POINTER__POINTER_INT64, +#else +#error Unkown size of time_t +#endif gaim_value_new(GAIM_TYPE_POINTER), 2, gaim_value_new(GAIM_TYPE_SUBTYPE, GAIM_SUBTYPE_LOG), Modified: trunk/src/log.c =================================================================== --- trunk/src/log.c 2006-07-25 17:30:03 UTC (rev 16572) +++ trunk/src/log.c 2006-07-25 17:34:29 UTC (rev 16573) @@ -594,7 +594,13 @@ gaim_log_logger_add(old_logger); gaim_signal_register(handle, "log-timestamp", +#if SIZEOF_TIME_T == 4 gaim_marshal_POINTER__POINTER_INT, +#elif SIZEOF_TIME_T == 8 + gaim_marshal_POINTER__POINTER_INT64, +#else +#error Unknown size of time_t +#endif gaim_value_new(GAIM_TYPE_POINTER), 2, gaim_value_new(GAIM_TYPE_SUBTYPE, GAIM_SUBTYPE_LOG), This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <the...@us...> - 2006-08-05 08:27:51
|
Revision: 16638 Author: thekingant Date: 2006-08-05 01:27:39 -0700 (Sat, 05 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16638&view=rev Log Message: ----------- A bunch of small changes. Mostly remove "if not null" checks before calling g_free, g_list_free, g_slist_free and g_strdup. Also use g_list_foreach() to call g_free to free strings in an array. And some whitespace changes here and there. Modified Paths: -------------- trunk/plugins/codeinline.c trunk/plugins/contact_priority.c trunk/plugins/dbus-example.c trunk/plugins/history.c trunk/plugins/log_reader.c trunk/plugins/timestamp.c trunk/src/account.c trunk/src/accountopt.c trunk/src/blist.c trunk/src/buddyicon.c trunk/src/cipher.c trunk/src/cmds.c trunk/src/connection.c trunk/src/conversation.c trunk/src/core.c trunk/src/dbus-define-api.h trunk/src/dbus-server.h trunk/src/dbus-useful.c trunk/src/dbus-useful.h trunk/src/ft.c trunk/src/gaim-client-example.c trunk/src/gaim-client.c trunk/src/gtkaccount.c trunk/src/gtkblist.c trunk/src/gtkconv.c trunk/src/gtkdebug.c trunk/src/gtkft.c trunk/src/gtkimhtml.c trunk/src/gtkimhtmltoolbar.c trunk/src/gtklog.c trunk/src/gtkpluginpref.c trunk/src/gtkpounce.c trunk/src/gtkprefs.c trunk/src/gtkprivacy.c trunk/src/gtkrequest.c trunk/src/gtkroomlist.c trunk/src/gtksound.c trunk/src/gtkstatusbox.c trunk/src/gtkthemes.c trunk/src/gtkutils.c trunk/src/imgstore.c trunk/src/log.c trunk/src/notify.c trunk/src/plugin.c trunk/src/pluginpref.c trunk/src/pounce.c trunk/src/prefs.c trunk/src/protocols/oscar/oscar.c trunk/src/protocols/qq/qq.c trunk/src/proxy.c trunk/src/prpl.c trunk/src/request.c trunk/src/roomlist.c trunk/src/server.c trunk/src/signals.c trunk/src/socket.c trunk/src/status.c trunk/src/util.c trunk/src/value.c trunk/src/whiteboard.c trunk/src/xmlnode.c Property Changed: ---------------- trunk/plugins/codeinline.c Modified: trunk/plugins/codeinline.c =================================================================== --- trunk/plugins/codeinline.c 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/plugins/codeinline.c 2006-08-05 08:27:39 UTC (rev 16638) @@ -48,12 +48,12 @@ static gboolean plugin_load(GaimPlugin *plugin) -{ +{ void *handle = gaim_conversations_get_handle(); plugin_handle = plugin; - gaim_signal_connect(handle, "writing-im-msg", plugin, + gaim_signal_connect(handle, "writing-im-msg", plugin, GAIM_CALLBACK(outgoing_msg_cb), NULL); - + return TRUE; } Property changes on: trunk/plugins/codeinline.c ___________________________________________________________________ Name: svn:executable - * Modified: trunk/plugins/contact_priority.c =================================================================== --- trunk/plugins/contact_priority.c 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/plugins/contact_priority.c 2006-08-05 08:27:39 UTC (rev 16638) @@ -99,12 +99,12 @@ hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); - + label = gtk_label_new_with_mnemonic(_(statuses[i].description)); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_size_group_add_widget(sg, label); gtk_misc_set_alignment(GTK_MISC(label), 0, 0); - + adj = gtk_adjustment_new(gaim_prefs_get_int(pref), -500, 500, 1, 1, 1); spin = gtk_spin_button_new((GtkAdjustment *)adj, 1, 0); g_signal_connect(G_OBJECT(spin), "value-changed", G_CALLBACK(pref_update), pref); Modified: trunk/plugins/dbus-example.c =================================================================== --- trunk/plugins/dbus-example.c 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/plugins/dbus-example.c 2006-08-05 08:27:39 UTC (rev 16638) @@ -51,7 +51,7 @@ #include "dbus-bindings.h" typedef struct { - char *text; + char *text; } GaimText; /* This makes the structure GaimText visible to the gaim-dbus type @@ -59,7 +59,7 @@ on, we will be able to register pointers to structures of this type. You to dbus-define types you want to be directly accessible by external applications. */ -GAIM_DBUS_DEFINE_TYPE(GaimText) +GAIM_DBUS_DEFINE_TYPE(GaimText) /* Here we make four functions accessible to other applications by DBus. These functions can access types defined in gaim proper @@ -78,30 +78,30 @@ static GaimText hello; /* Here come the definitions of the four exported functions. */ -GaimText* dbus_example_get_hello_object(void) +GaimText* dbus_example_get_hello_object(void) { - return &hello; + return &hello; } -void dbus_example_set_text(GaimText *obj, const char *text) +void dbus_example_set_text(GaimText *obj, const char *text) { - if (obj != NULL) { - g_free(obj->text); - obj->text = g_strdup(text); - } + if (obj != NULL) { + g_free(obj->text); + obj->text = g_strdup(text); + } } -const char *dbus_example_get_text(GaimText *obj) +const char *dbus_example_get_text(GaimText *obj) { - if (obj != NULL) - return obj->text; - else - return NULL; + if (obj != NULL) + return obj->text; + else + return NULL; } -const char *dbus_example_get_buddy_name(GaimBuddy *buddy) +const char *dbus_example_get_buddy_name(GaimBuddy *buddy) { - return gaim_buddy_get_name(buddy); + return gaim_buddy_get_name(buddy); } /* And now standard plugin stuff */ @@ -111,33 +111,33 @@ { GAIM_DBUS_RETURN_FALSE_IF_DISABLED(plugin); - /* First, we have to register our four exported functions with the - main gaim dbus loop. Without this statement, the gaim dbus - code wouldn't know about our functions. */ - GAIM_DBUS_REGISTER_BINDINGS(plugin); + /* First, we have to register our four exported functions with the + main gaim dbus loop. Without this statement, the gaim dbus + code wouldn't know about our functions. */ + GAIM_DBUS_REGISTER_BINDINGS(plugin); - /* Then, we register the hello object of type GaimText. Note that - pointer registrations / unregistrations are completely dynamic; - they don't have to be made when the plugin is loaded / - unloaded. Without this statement the dbus gaim code wouldn't - know about the hello object. */ - GAIM_DBUS_REGISTER_POINTER(&hello, GaimText); + /* Then, we register the hello object of type GaimText. Note that + pointer registrations / unregistrations are completely dynamic; + they don't have to be made when the plugin is loaded / + unloaded. Without this statement the dbus gaim code wouldn't + know about the hello object. */ + GAIM_DBUS_REGISTER_POINTER(&hello, GaimText); - hello.text = g_strdup("Hello."); - - return TRUE; + hello.text = g_strdup("Hello."); + + return TRUE; } static gboolean plugin_unload(GaimPlugin *plugin) { - g_free(hello.text); + g_free(hello.text); - /* It is necessary to unregister all pointers registered by the module. */ - GAIM_DBUS_UNREGISTER_POINTER(&hello); + /* It is necessary to unregister all pointers registered by the module. */ + GAIM_DBUS_UNREGISTER_POINTER(&hello); - return TRUE; + return TRUE; } static GaimPluginInfo info = Modified: trunk/plugins/history.c =================================================================== --- trunk/plugins/history.c 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/plugins/history.c 2006-08-05 08:27:39 UTC (rev 16638) @@ -90,7 +90,7 @@ if (logs == NULL) logs = gaim_log_get_logs(GAIM_LOG_IM, name, account); else - logs = g_list_sort(logs, gaim_log_compare); + logs = g_list_sort(logs, gaim_log_compare); } else if (convtype == GAIM_CONV_TYPE_CHAT) { Modified: trunk/plugins/log_reader.c =================================================================== --- trunk/plugins/log_reader.c 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/plugins/log_reader.c 2006-08-05 08:27:39 UTC (rev 16638) @@ -300,7 +300,7 @@ if (!data->path || stat(data->path, &st)) st.st_size = 0; - + return st.st_size; } @@ -399,7 +399,7 @@ g_return_val_if_fail(log != NULL, g_strdup("")); data = log->logger_data; - + /* TODO: Do something here. */ return g_strdup(""); } Modified: trunk/plugins/timestamp.c =================================================================== --- trunk/plugins/timestamp.c 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/plugins/timestamp.c 2006-08-05 08:27:39 UTC (rev 16638) @@ -120,7 +120,7 @@ gaim_conversation_set_data(conv, "timestamp-initialized", GINT_TO_POINTER(TRUE)); gaim_conversation_set_data(conv, "timestamp-enabled", GINT_TO_POINTER(TRUE)); gaim_conversation_set_data(conv, "timestamp-conv-active", GINT_TO_POINTER(TRUE)); - gtk_text_buffer_create_tag (buffer, "TIMESTAMP", "foreground", "#888888", "justification", GTK_JUSTIFY_CENTER, + gtk_text_buffer_create_tag (buffer, "TIMESTAMP", "foreground", "#888888", "justification", GTK_JUSTIFY_CENTER, "weight", PANGO_WEIGHT_BOLD, NULL); do_timestamp(conv); } Modified: trunk/src/account.c =================================================================== --- trunk/src/account.c 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/src/account.c 2006-08-05 08:27:39 UTC (rev 16638) @@ -792,8 +792,7 @@ { GaimAccountSetting *setting = (GaimAccountSetting *)data; - if (setting->ui != NULL) - g_free(setting->ui); + g_free(setting->ui); if (setting->type == GAIM_PREF_STRING) g_free(setting->value.string); @@ -1178,7 +1177,7 @@ g_return_if_fail(account != NULL); g_free(account->username); - account->username = (username == NULL ? NULL : g_strdup(username)); + account->username = g_strdup(username); schedule_accounts_save(); } @@ -1189,8 +1188,7 @@ g_return_if_fail(account != NULL); g_free(account->password); - account->password = NULL; - account->password = (password == NULL ? NULL : g_strdup(password)); + account->password = g_strdup(password); schedule_accounts_save(); } @@ -1212,7 +1210,7 @@ { char *old = account->alias; - account->alias = (alias == NULL ? NULL : g_strdup(alias)); + account->alias = g_strdup(alias); gaim_signal_emit(gaim_accounts_get_handle(), "account-alias-changed", account, old); g_free(old); @@ -1227,7 +1225,7 @@ g_return_if_fail(account != NULL); g_free(account->user_info); - account->user_info = (user_info == NULL ? NULL : g_strdup(user_info)); + account->user_info = g_strdup(user_info); schedule_accounts_save(); } @@ -1263,7 +1261,7 @@ } g_free(account->buddy_icon); - account->buddy_icon = (icon == NULL ? NULL : g_strdup(icon)); + account->buddy_icon = g_strdup(icon); if (gaim_account_is_connected(account)) { char *filename = gaim_buddy_icons_get_full_path(icon); @@ -1362,11 +1360,7 @@ /* Old with the old... */ if (account->status_types != NULL) { - GList *l; - - for (l = account->status_types; l != NULL; l = l->next) - gaim_status_type_destroy((GaimStatusType *)l->data); - + g_list_foreach(account->status_types, (GFunc)gaim_status_type_destroy, NULL); g_list_free(account->status_types); } Modified: trunk/src/accountopt.c =================================================================== --- trunk/src/accountopt.c 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/src/accountopt.c 2006-08-05 08:27:39 UTC (rev 16638) @@ -87,8 +87,7 @@ if (option == NULL) return NULL; - if (default_value != NULL) - option->default_value.string = g_strdup(default_value); + option->default_value.string = g_strdup(default_value); return option; } @@ -159,10 +158,8 @@ g_return_if_fail(option != NULL); g_return_if_fail(option->type == GAIM_PREF_STRING); - if (option->default_value.string != NULL) - g_free(option->default_value.string); - - option->default_value.string = (value == NULL ? NULL : g_strdup(value)); + g_free(option->default_value.string); + option->default_value.string = g_strdup(value); } void @@ -310,8 +307,7 @@ split->text = g_strdup(text); split->field_sep = sep; - split->default_value = (default_value == NULL - ? NULL : g_strdup(default_value)); + split->default_value = g_strdup(default_value); return split; } @@ -321,12 +317,8 @@ { g_return_if_fail(split != NULL); - if (split->text != NULL) - g_free(split->text); - - if (split->default_value != NULL) - g_free(split->default_value); - + g_free(split->text); + g_free(split->default_value); g_free(split); } Modified: trunk/src/blist.c =================================================================== --- trunk/src/blist.c 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/src/blist.c 2006-08-05 08:27:39 UTC (rev 16638) @@ -627,21 +627,21 @@ if (!gaim_account_is_connected(buddy->account)) continue; - if (new_priority == NULL) - new_priority = buddy; - else - { - int cmp; + if (new_priority == NULL) + new_priority = buddy; + else + { + int cmp; cmp = gaim_presence_compare(gaim_buddy_get_presence(new_priority), gaim_buddy_get_presence(buddy)); - if (cmp > 0 || (cmp == 0 && + if (cmp > 0 || (cmp == 0 && gaim_prefs_get_bool("/core/contact/last_match"))) - { - new_priority = buddy; - } - } + { + new_priority = buddy; + } + } } contact->priority = new_priority; @@ -1055,7 +1055,7 @@ /* Make a list of what the groups each buddy is in */ for(cur = buddies; cur; cur = cur->next) { GaimBlistNode *node = (GaimBlistNode *)cur->data; - groups = g_list_append(groups, node->parent->parent); + groups = g_list_prepend(groups, node->parent->parent); } gaim_account_remove_buddies(account, buddies, groups); @@ -2037,7 +2037,7 @@ const char *gaim_chat_get_name(GaimChat *chat) { struct proto_chat_entry *pce; - GList *parts, *tmp; + GList *parts; char *ret; g_return_val_if_fail(chat != NULL, NULL); @@ -2048,8 +2048,7 @@ parts = GAIM_PLUGIN_PROTOCOL_INFO(chat->account->gc->prpl)->chat_info(chat->account->gc); pce = parts->data; ret = g_hash_table_lookup(chat->components, pce->identifier); - for (tmp = parts; tmp; tmp = tmp->next) - g_free(tmp->data); + g_list_foreach(parts, (GFunc)g_free, NULL); g_list_free(parts); return ret; Modified: trunk/src/buddyicon.c =================================================================== --- trunk/src/buddyicon.c 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/src/buddyicon.c 2006-08-05 08:27:39 UTC (rev 16638) @@ -312,7 +312,6 @@ g_return_if_fail(username != NULL); g_free(icon->username); - icon->username = g_strdup(username); } @@ -480,7 +479,6 @@ g_return_if_fail(dir != NULL); g_free(cache_dir); - cache_dir = g_strdup(dir); } Modified: trunk/src/cipher.c =================================================================== --- trunk/src/cipher.c 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/src/cipher.c 2006-08-05 08:27:39 UTC (rev 16638) @@ -10,7 +10,7 @@ * * Original md4 taken from linux kernel * MD4 Message Digest Algorithm (RFC1320). - * + * * Implementation derived from Andrew Tridgell and Steve French's * CIFS MD4 implementation, and the cryptoapi implementation * originally based on the public domain implementation written @@ -26,16 +26,16 @@ * * des.c - DES and Triple-DES encryption/decryption Algorithm * Copyright (C) 1998 Free Software Foundation, Inc. - * + * * Please see below for more legal information! - * + * * According to the definition of DES in FIPS PUB 46-2 from December 1993. * For a description of triple encryption, see: * Bruce Schneier: Applied Cryptography. Second Edition. * John Wiley & Sons, 1996. ISBN 0-471-12845-7. Pages 358 ff. - * + * * This file is part of GnuPG. - * + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or Modified: trunk/src/cmds.c =================================================================== --- trunk/src/cmds.c 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/src/cmds.c 2006-08-05 08:27:39 UTC (rev 16638) @@ -71,9 +71,9 @@ c->args = g_strdup(args); c->priority = p; c->flags = f; - c->prpl_id = prpl_id ? g_strdup(prpl_id) : NULL; + c->prpl_id = g_strdup(prpl_id); c->func = func; - c->help = helpstr ? g_strdup(helpstr) : NULL; + c->help = g_strdup(helpstr); c->data = data; cmds = g_list_insert_sorted(cmds, c, (GCompareFunc)cmds_compare_func); @@ -85,11 +85,8 @@ { g_free(c->cmd); g_free(c->args); - if (c->prpl_id) - g_free(c->prpl_id); - if (c->help) - g_free(c->help); - + g_free(c->prpl_id); + g_free(c->help); g_free(c); } @@ -109,6 +106,10 @@ } } +/** + * This sets args to a NULL-terminated array of strings. It should + * be freed using g_strfreev(). + */ static gboolean gaim_cmd_parse_args(GaimCmd *cmd, const gchar *s, const gchar *m, gchar ***args) { int i; @@ -142,7 +143,7 @@ (*args)[i] = gaim_markup_slice(m, g_utf8_pointer_to_offset(s, cur), g_utf8_pointer_to_offset(s, end)); cur = end +1; } - break; + break; case 's': (*args)[i] = g_strdup(cur); cur = cur + strlen(cur); @@ -160,15 +161,6 @@ return TRUE; } -static void gaim_cmd_free_args(gchar **args) -{ - int i; - - for (i = 0; args[i]; i++) - g_free(args[i]); - g_free(args); -} - static void gaim_cmd_strip_current_char(gunichar c, char *s, guint len) { int bytes; @@ -260,7 +252,7 @@ /* this checks the allow bad args flag for us */ if (!gaim_cmd_parse_args(c, rest, mrest, &args)) { - gaim_cmd_free_args(args); + g_strfreev(args); args = NULL; continue; } @@ -268,10 +260,9 @@ tried_cmd = TRUE; ret = c->func(conv, cmd, args, &err, c->data); if (ret == GAIM_CMD_RET_CONTINUE) { - if (err) - g_free(err); + g_free(err); err = NULL; - gaim_cmd_free_args(args); + g_strfreev(args); args = NULL; continue; } else { @@ -280,8 +271,7 @@ } - if (args) - gaim_cmd_free_args(args); + g_strfreev(args); g_free(cmd); g_free(mrest); Modified: trunk/src/connection.c =================================================================== --- trunk/src/connection.c 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/src/connection.c 2006-08-05 08:27:39 UTC (rev 16638) @@ -337,10 +337,8 @@ { g_return_if_fail(gc != NULL); - if (gc->display_name != NULL) - g_free(gc->display_name); - - gc->display_name = (name == NULL ? NULL : g_strdup(name)); + g_free(gc->display_name); + gc->display_name = g_strdup(name); } GaimConnectionState Modified: trunk/src/conversation.c =================================================================== --- trunk/src/conversation.c 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/src/conversation.c 2006-08-05 08:27:39 UTC (rev 16638) @@ -335,7 +335,6 @@ GaimConversationUiOps *ops; GaimConnection *gc; const char *name; - GList *node; g_return_if_fail(conv != NULL); @@ -433,34 +432,22 @@ } else if (conv->type == GAIM_CONV_TYPE_CHAT) { - for (node = conv->u.chat->in_room; node != NULL; node = node->next) { - if (node->data != NULL) - gaim_conv_chat_cb_destroy((GaimConvChatBuddy *)node->data); - node->data = NULL; - } - - for (node = conv->u.chat->ignored; node != NULL; node = node->next) { - if (node->data != NULL) - g_free(node->data); - node->data = NULL; - } - + g_list_foreach(conv->u.chat->in_room, (GFunc)gaim_conv_chat_cb_destroy, NULL); g_list_free(conv->u.chat->in_room); + + g_list_foreach(conv->u.chat->ignored, (GFunc)g_free, NULL); g_list_free(conv->u.chat->ignored); conv->u.chat->in_room = NULL; conv->u.chat->ignored = NULL; - if (conv->u.chat->who != NULL) - g_free(conv->u.chat->who); + g_free(conv->u.chat->who); conv->u.chat->who = NULL; - if (conv->u.chat->topic != NULL) - g_free(conv->u.chat->topic); + g_free(conv->u.chat->topic); conv->u.chat->topic = NULL; - if(conv->u.chat->nick) - g_free(conv->u.chat->nick); + g_free(conv->u.chat->nick); GAIM_DBUS_UNREGISTER_POINTER(conv->u.chat); g_free(conv->u.chat); @@ -587,9 +574,7 @@ g_return_if_fail(conv != NULL); g_return_if_fail(title != NULL); - if (conv->title != NULL) - g_free(conv->title); - + g_free(conv->title); conv->title = g_strdup(title); gaim_conversation_update(conv, GAIM_CONV_UPDATE_TITLE); @@ -651,11 +636,9 @@ { g_return_if_fail(conv != NULL); - if (conv->name != NULL) - g_free(conv->name); + g_free(conv->name); + conv->name = g_strdup(name); - conv->name = (name == NULL ? NULL : g_strdup(name)); - gaim_conversation_autoset_title(conv); } @@ -1326,11 +1309,11 @@ { g_return_if_fail(chat != NULL); - if (chat->who != NULL) g_free(chat->who); - if (chat->topic != NULL) g_free(chat->topic); + g_free(chat->who); + g_free(chat->topic); - chat->who = (who == NULL ? NULL : g_strdup(who)); - chat->topic = (topic == NULL ? NULL : g_strdup(topic)); + chat->who = g_strdup(who); + chat->topic = g_strdup(topic); gaim_conversation_update(gaim_conv_chat_get_conversation(chat), GAIM_CONV_UPDATE_TOPIC); @@ -1447,7 +1430,6 @@ char *user1 = NULL, *user2 = NULL; gint ret = 0; - if (a) { f1 = a->flags; if (a->alias_key) @@ -1455,7 +1437,7 @@ else if (a->name) user1 = a->name; } - + if (b) { f2 = b->flags; if (b->alias_key) @@ -1470,7 +1452,7 @@ } else if (f1 != f2) { /* sort more important users first */ ret = (f1 > f2) ? -1 : 1; - } else if (a->buddy != b->buddy) { + } else if (a->buddy != b->buddy) { ret = a->buddy ? -1 : 1; } else { ret = strcasecmp(user1, user2); @@ -1565,7 +1547,7 @@ } cbuddies = g_list_sort(cbuddies, (GCompareFunc)gaim_conv_chat_cb_compare); - + if (ops != NULL && ops->chat_add_users != NULL) ops->chat_add_users(conv, cbuddies, new_arrivals); @@ -1728,7 +1710,7 @@ } /* NOTE: Don't remove them from ignored in case they re-enter. */ - + if (!quiet) { const char *alias = user; char *escaped; @@ -1866,8 +1848,7 @@ void gaim_conv_chat_set_nick(GaimConvChat *chat, const char *nick) { g_return_if_fail(chat != NULL); - if(chat->nick) - g_free(chat->nick); + g_free(chat->nick); chat->nick = g_strdup(gaim_normalize(chat->conv->account, nick)); } @@ -1920,10 +1901,7 @@ cb = g_new0(GaimConvChatBuddy, 1); cb->name = g_strdup(name); cb->flags = flags; - if (alias) - cb->alias = g_strdup(alias); - else - cb->alias = NULL; + cb->alias = g_strdup(alias); GAIM_DBUS_REGISTER_POINTER(cb, GaimConvChatBuddy); return cb; @@ -1950,15 +1928,12 @@ void gaim_conv_chat_cb_destroy(GaimConvChatBuddy *cb) { - g_return_if_fail(cb != NULL); + if (cb == NULL) + return; g_free(cb->alias); g_free(cb->alias_key); g_free(cb->name); - cb->name = NULL; - cb->alias = NULL; - cb->alias_key = NULL; - cb->flags = 0; GAIM_DBUS_UNREGISTER_POINTER(cb); g_free(cb); Modified: trunk/src/core.c =================================================================== --- trunk/src/core.c 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/src/core.c 2006-08-05 08:27:39 UTC (rev 16638) @@ -196,11 +196,7 @@ gaim_dbus_uninit(); #endif - if (core->ui != NULL) { - g_free(core->ui); - core->ui = NULL; - } - + g_free(core->ui); g_free(core); _core = NULL; Modified: trunk/src/dbus-define-api.h =================================================================== --- trunk/src/dbus-define-api.h 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/src/dbus-define-api.h 2006-08-05 08:27:39 UTC (rev 16638) @@ -7,10 +7,10 @@ /* blist.h */ gboolean GAIM_BLIST_NODE_IS_CHAT(GaimBlistNode *node); -gboolean GAIM_BLIST_NODE_IS_BUDDY(GaimBlistNode *node); +gboolean GAIM_BLIST_NODE_IS_BUDDY(GaimBlistNode *node); gboolean GAIM_BLIST_NODE_IS_CONTACT(GaimBlistNode *node); gboolean GAIM_BLIST_NODE_IS_GROUP(GaimBlistNode *node); -gboolean GAIM_BUDDY_IS_ONLINE(GaimBuddy *buddy); +gboolean GAIM_BUDDY_IS_ONLINE(GaimBuddy *buddy); gboolean GAIM_BLIST_NODE_HAS_FLAG(GaimBlistNode *node, int flags); gboolean GAIM_BLIST_NODE_SHOULD_SAVE(GaimBlistNode *node); Modified: trunk/src/dbus-server.h =================================================================== --- trunk/src/dbus-server.h 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/src/dbus-server.h 2006-08-05 08:27:39 UTC (rev 16638) @@ -32,7 +32,7 @@ G_BEGIN_DECLS -/** +/** Types of pointers are identified by the ADDRESS of a GaimDbusType object. This way, plugins can easily access types defined in gaim proper as well as introduce their own types that will not conflict @@ -41,7 +41,7 @@ The structure GaimDbusType has only one element (GaimDBusType::parent), a contains a pointer to the parent type, or @c NULL if the type has no parent. Parent means the same as the base class in object oriented - programming. + programming. */ typedef struct _GaimDBusType GaimDBusType; @@ -98,7 +98,7 @@ In order for an object to participate in the scheme, it must register itself and its type with the engine. This registration allocates an integer id which can be resolved to the pointer and - back. + back. Handles are not persistent. They are reissued every time gaim is started. This is not good; external applications that use gaim @@ -108,14 +108,14 @@ Pointer registration is only a temporary solution. When GaimBuddy and similar structures have been converted into gobjects, this registration will be done automatically by objects themselves. - + By the way, this kind of object-handle translation should be so common that there must be a library (maybe even glib) that implements it. I feel a bit like reinventing the wheel here. */ void gaim_dbus_init_ids(void); -/** +/** Registers a typed pointer. @param node The pointer to register. @@ -123,7 +123,7 @@ */ void gaim_dbus_register_pointer(gpointer node, GaimDBusType *type); -/** +/** Unregisters a pointer previously registered with gaim_dbus_register_pointer. @@ -142,7 +142,7 @@ the types of the parameters. @param vargs A va_list containing the actual parameters. */ -void gaim_dbus_signal_emit_gaim(const char *name, int num_values, +void gaim_dbus_signal_emit_gaim(const char *name, int num_values, GaimValue **values, va_list vargs); /** @@ -191,7 +191,7 @@ #define DBUS_EXPORT -/* +/* Here we include the list of #GAIM_DBUS_DECLARE_TYPE statements for all structs defined in gaim. This file has been generated by the #dbus-analize-types.py script. Modified: trunk/src/dbus-useful.c =================================================================== --- trunk/src/dbus-useful.c 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/src/dbus-useful.c 2006-08-05 08:27:39 UTC (rev 16638) @@ -7,47 +7,47 @@ GaimAccount * -gaim_accounts_find_ext(const char *name, const char *protocol_id, +gaim_accounts_find_ext(const char *name, const char *protocol_id, gboolean (*account_test)(const GaimAccount *account)) { - GaimAccount *result = NULL; - GList *l; - char *who; - - if (name) - who = g_strdup(gaim_normalize(NULL, name)); - else - who = NULL; - - for (l = gaim_accounts_get_all(); l != NULL; l = l->next) { - GaimAccount *account = (GaimAccount *)l->data; - - if (who && strcmp(gaim_normalize(NULL, gaim_account_get_username(account)), who)) - continue; + GaimAccount *result = NULL; + GList *l; + char *who; - if (protocol_id && strcmp(account->protocol_id, protocol_id)) - continue; + if (name) + who = g_strdup(gaim_normalize(NULL, name)); + else + who = NULL; - if (account_test && !account_test(account)) - continue; + for (l = gaim_accounts_get_all(); l != NULL; l = l->next) { + GaimAccount *account = (GaimAccount *)l->data; - result = account; - break; - } + if (who && strcmp(gaim_normalize(NULL, gaim_account_get_username(account)), who)) + continue; - g_free(who); + if (protocol_id && strcmp(account->protocol_id, protocol_id)) + continue; - return result; + if (account_test && !account_test(account)) + continue; + + result = account; + break; + } + + g_free(who); + + return result; } -GaimAccount *gaim_accounts_find_any(const char *name, const char *protocol) +GaimAccount *gaim_accounts_find_any(const char *name, const char *protocol) { - return gaim_accounts_find_ext(name, protocol, NULL); + return gaim_accounts_find_ext(name, protocol, NULL); } -GaimAccount *gaim_accounts_find_connected(const char *name, const char *protocol) +GaimAccount *gaim_accounts_find_connected(const char *name, const char *protocol) { - return gaim_accounts_find_ext(name, protocol, gaim_account_is_connected); + return gaim_accounts_find_ext(name, protocol, gaim_account_is_connected); } Modified: trunk/src/dbus-useful.h =================================================================== --- trunk/src/dbus-useful.h 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/src/dbus-useful.h 2006-08-05 08:27:39 UTC (rev 16638) @@ -1,6 +1,6 @@ #include "conversation.h" -GaimAccount *gaim_accounts_find_ext(const char *name, const char *protocol_id, +GaimAccount *gaim_accounts_find_ext(const char *name, const char *protocol_id, gboolean (*account_test)(const GaimAccount *account)); GaimAccount *gaim_accounts_find_any(const char *name, const char *protocol); Modified: trunk/src/ft.c =================================================================== --- trunk/src/ft.c 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/src/ft.c 2006-08-05 08:27:39 UTC (rev 16638) @@ -648,11 +648,7 @@ g_return_if_fail(xfer != NULL); g_free(xfer->message); - - if (message != NULL) - xfer->message = g_strdup(message); - else - xfer->message = NULL; + xfer->message = g_strdup(message); } void @@ -660,10 +656,8 @@ { g_return_if_fail(xfer != NULL); - if (xfer->filename != NULL) - g_free(xfer->filename); - - xfer->filename = (filename == NULL ? NULL : g_strdup(filename)); + g_free(xfer->filename); + xfer->filename = g_strdup(filename); } void @@ -671,10 +665,8 @@ { g_return_if_fail(xfer != NULL); - if (xfer->local_filename != NULL) - g_free(xfer->local_filename); - - xfer->local_filename = (filename == NULL ? NULL : g_strdup(filename)); + g_free(xfer->local_filename); + xfer->local_filename = g_strdup(filename); } void Modified: trunk/src/gaim-client-example.c =================================================================== --- trunk/src/gaim-client-example.c 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/src/gaim-client-example.c 2006-08-05 08:27:39 UTC (rev 16638) @@ -5,7 +5,7 @@ #include "gaim-client.h" -/* +/* This example demonstrates how to use libgaim-client to communicate with gaim. The names and signatures of functions provided by libgaim-client are the same as those in gaim. However, all @@ -21,19 +21,19 @@ int main (int argc, char **argv) { - GList *alist, *node; + GList *alist, *node; - gaim_init(); - - alist = gaim_accounts_get_all(); - for (node = alist; node; node = node->next) { - GaimAccount *account = (GaimAccount*) node->data; - char *name = gaim_account_get_username(account); - g_print("Name: %s\n", name); - g_free(name); - } + gaim_init(); - g_list_free(alist); + alist = gaim_accounts_get_all(); + for (node = alist; node != NULL; node = node->next) + { + GaimAccount *account = (GaimAccount*) node->data; + char *name = gaim_account_get_username(account); + g_print("Name: %s\n", name); + g_free(name); + } + g_list_free(alist); - return 0; + return 0; } Modified: trunk/src/gaim-client.c =================================================================== --- trunk/src/gaim-client.c 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/src/gaim-client.c 2006-08-05 08:27:39 UTC (rev 16638) @@ -10,69 +10,72 @@ static DBusGConnection *bus; static DBusGProxy *gaim_proxy; -static GList *garray_int_to_glist(GArray *array) { - GList *list = NULL; - int i; +static GList *garray_int_to_glist(GArray *array) +{ + GList *list = NULL; + int i; - for(i = 0; i < array->len; i++) - list = g_list_append(list, GINT_TO_POINTER(g_array_index(array,gint,i))); + for (i = 0; i < array->len; i++) + list = g_list_append(list, GINT_TO_POINTER(g_array_index(array,gint,i))); - g_array_free(array, TRUE); - return list; + g_array_free(array, TRUE); + return list; } -static GSList *garray_int_to_gslist(GArray *array) { - GSList *list = NULL; - int i; +static GSList *garray_int_to_gslist(GArray *array) +{ + GSList *list = NULL; + int i; - for(i = 0; i < array->len; i++) - list = g_slist_append(list, GINT_TO_POINTER(g_array_index(array,gint,i))); + for (i = 0; i < array->len; i++) + list = g_slist_append(list, GINT_TO_POINTER(g_array_index(array,gint,i))); - g_array_free(array, TRUE); - return list; + g_array_free(array, TRUE); + return list; } #include "gaim-client-bindings.c" -static void lose (const char *fmt, ...) G_GNUC_NORETURN G_GNUC_PRINTF (1, 2); -static void lose_gerror (const char *prefix, GError *error) G_GNUC_NORETURN; +static void lose(const char *fmt, ...) G_GNUC_NORETURN G_GNUC_PRINTF (1, 2); +static void lose_gerror(const char *prefix, GError *error) G_GNUC_NORETURN; static void -lose (const char *str, ...) +lose(const char *str, ...) { - va_list args; + va_list args; - va_start (args, str); + va_start(args, str); - vfprintf (stderr, str, args); - fputc ('\n', stderr); + vfprintf(stderr, str, args); + fputc('\n', stderr); - va_end (args); + va_end(args); - exit (1); + exit(1); } static void -lose_gerror (const char *prefix, GError *error) +lose_gerror(const char *prefix, GError *error) { - lose ("%s: %s", prefix, error->message); + lose("%s: %s", prefix, error->message); } -void gaim_init(void) { - GError *error = NULL; +void gaim_init(void) +{ + GError *error = NULL; - g_type_init (); + g_type_init (); - bus = dbus_g_bus_get (DBUS_BUS_SESSION, &error); - if (!bus) - lose_gerror ("Couldn't connect to session bus", error); + bus = dbus_g_bus_get (DBUS_BUS_SESSION, &error); + if (!bus) + lose_gerror ("Couldn't connect to session bus", error); - gaim_proxy = dbus_g_proxy_new_for_name (bus, - DBUS_SERVICE_GAIM, - DBUS_PATH_GAIM, - DBUS_INTERFACE_GAIM); + gaim_proxy = dbus_g_proxy_new_for_name (bus, + DBUS_SERVICE_GAIM, + DBUS_PATH_GAIM, + DBUS_INTERFACE_GAIM); - if (!gaim_proxy) - lose_gerror ("Couldn't connect to the Gaim Service", error); + if (!gaim_proxy) + lose_gerror ("Couldn't connect to the Gaim Service", error); } Modified: trunk/src/gtkaccount.c =================================================================== --- trunk/src/gtkaccount.c 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/src/gtkaccount.c 2006-08-05 08:27:39 UTC (rev 16638) @@ -204,7 +204,7 @@ gaim_gtk_buddy_icon_get_scale_size(pixbuf, &dialog->prpl_info->icon_spec, &width, &height); scale = gdk_pixbuf_scale_simple(pixbuf, width, height, GDK_INTERP_BILINEAR); - + g_object_unref(G_OBJECT(pixbuf)); pixbuf = scale; } @@ -231,9 +231,7 @@ { dialog->prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(dialog->plugin); - if (dialog->protocol_id != NULL) - g_free(dialog->protocol_id); - + g_free(dialog->protocol_id); dialog->protocol_id = g_strdup(dialog->plugin->info->id); } @@ -317,8 +315,7 @@ #endif /* FILECHOOSER */ - if (dialog->icon_path) - g_free(dialog->icon_path); + g_free(dialog->icon_path); dialog->icon_path = convert_buddy_icon(dialog->plugin, filename); set_dialog_icon(dialog); gtk_widget_show(dialog->icon_entry); @@ -482,8 +479,7 @@ static void icon_reset_cb(GtkWidget *button, AccountPrefsDialog *dialog) { - if (dialog->icon_path) - g_free(dialog->icon_path); + g_free(dialog->icon_path); dialog->icon_path = NULL; gtk_widget_hide(dialog->icon_entry); @@ -512,8 +508,7 @@ } if ((rtmp = strchr(tmp, '\r')) || (rtmp = strchr(tmp, '\n'))) *rtmp = '\0'; - if (dialog->icon_path) - g_free(dialog->icon_path); + g_free(dialog->icon_path); dialog->icon_path = convert_buddy_icon(dialog->plugin, tmp); set_dialog_icon(dialog); gtk_widget_show(dialog->icon_entry); @@ -1423,15 +1418,10 @@ gtk_widget_destroy(dialog->window); - if (dialog->user_split_entries != NULL) - g_list_free(dialog->user_split_entries); + g_list_free(dialog->user_split_entries); + g_list_free(dialog->protocol_opt_entries); + g_free(dialog->protocol_id); - if (dialog->protocol_opt_entries != NULL) - g_list_free(dialog->protocol_opt_entries); - - if (dialog->protocol_id != NULL) - g_free(dialog->protocol_id); - if (dialog->icon_path != NULL) { const char *icon = gaim_account_get_buddy_icon(dialog->account); @@ -2572,10 +2562,7 @@ free_add_user_data(GaimGtkAccountAddUserData *data) { g_free(data->username); - - if (data->alias != NULL) - g_free(data->alias); - + g_free(data->alias); g_free(data); } @@ -2645,7 +2632,7 @@ data = g_new0(GaimGtkAccountAddUserData, 1); data->account = account; data->username = g_strdup(remote_user); - data->alias = (alias != NULL ? g_strdup(alias) : NULL); + data->alias = g_strdup(alias); buffer = make_info(account, gc, remote_user, id, alias, msg); Modified: trunk/src/gtkblist.c =================================================================== --- trunk/src/gtkblist.c 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/src/gtkblist.c 2006-08-05 08:27:39 UTC (rev 16638) @@ -553,9 +553,7 @@ ((GtkBoxChild *)GTK_BOX(data->entries_box)->children->data)->widget); } - if (data->entries != NULL) - g_list_free(data->entries); - + g_list_free(data->entries); data->entries = NULL; if (GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info != NULL) @@ -1519,8 +1517,7 @@ if (aims == NULL && icqs == NULL && yahoos == NULL && msns == NULL && jabbers == NULL) { - if (alias != NULL) - g_free(alias); + g_free(alias); return FALSE; } @@ -1531,8 +1528,7 @@ add_buddies_from_vcard("prpl-msn", group, msns, alias); add_buddies_from_vcard("prpl-jabber", group, jabbers, alias); - if (alias != NULL) - g_free(alias); + g_free(alias); return TRUE; } @@ -1594,7 +1590,6 @@ GValue val; GString *str; const char *protocol; - char *mime_str; ref = g_object_get_data(G_OBJECT(dc), "gtk-tree-view-source-row"); sourcerow = gtk_tree_row_reference_get_path(ref); @@ -1654,15 +1649,13 @@ str = g_string_append(str, "\r\n"); - mime_str = g_string_free(str, FALSE); - gtk_selection_data_set(data, gdk_atom_intern("application/x-im-contact", FALSE), 8, /* bits */ - (const guchar *)mime_str, - strlen(mime_str) + 1); + (const guchar *)str->str, + strlen(str->str) + 1); - g_free(mime_str); + g_string_free(str, TRUE); gtk_tree_path_free(sourcerow); } } @@ -1878,9 +1871,9 @@ } } - if (username != NULL) g_free(username); - if (protocol != NULL) g_free(protocol); - if (alias != NULL) g_free(alias); + g_free(username); + g_free(protocol); + g_free(alias); if (path != NULL) gtk_tree_path_free(path); @@ -2966,7 +2959,7 @@ statustext = g_strdup(_("Offline")); else if (!statustext) text = g_strdup(esc); - + if (gaim_presence_is_idle(presence)) { if (gaim_prefs_get_bool("/gaim/gtk/blist/show_idle_time")) { time_t idle_secs = gaim_presence_get_idle_time(presence); @@ -3017,7 +3010,7 @@ } /* It is selected. */ - if ((selected && !text) || (selected && idletime)) + if ((selected && !text) || (selected && idletime)) text = g_strdup_printf("%s\n" "<span size='smaller'>%s%s%s</span>", esc, @@ -3072,7 +3065,7 @@ if (gtk_blist_obscured || !GTK_WIDGET_VISIBLE(gtkblist->window)) return TRUE; - + for(gnode = list->root; gnode; gnode = gnode->next) { if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) continue; @@ -3084,7 +3077,7 @@ if (buddy && gaim_presence_is_idle(gaim_buddy_get_presence(buddy))) - gaim_gtk_blist_update_contact(list, (GaimBlistNode*)buddy); + gaim_gtk_blist_update_contact(list, (GaimBlistNode*)buddy); } } } @@ -4246,7 +4239,7 @@ contact = (GaimContact*)cnode; buddy = gaim_contact_get_priority_buddy(contact); - + if (buddy_is_displayable(buddy)) { GtkTreeIter iter; @@ -4294,10 +4287,10 @@ g_return_if_fail(GAIM_BLIST_NODE_IS_BUDDY(node)); if (node->parent == NULL) - return; + return; buddy = (GaimBuddy*)node; - + /* First things first, update the contact */ gaim_gtk_blist_update_contact(list, node); @@ -4800,8 +4793,7 @@ ((GtkBoxChild *)GTK_BOX(data->entries_box)->children->data)->widget); } - if (data->entries != NULL) - g_list_free(data->entries); + g_list_free(data->entries); data->entries = NULL; @@ -5833,7 +5825,7 @@ submenu = gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu); gtk_widget_show(submenu); - + gtk_menu_set_accel_group(GTK_MENU(submenu), accel_group); path = g_strdup_printf("%s/Tools/%s", gtkblist->ift->path, plugin->info->name); gtk_menu_set_accel_path(GTK_MENU(submenu), path); Modified: trunk/src/gtkconv.c =================================================================== --- trunk/src/gtkconv.c 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/src/gtkconv.c 2006-08-05 08:27:39 UTC (rev 16638) @@ -193,15 +193,9 @@ static gint close_conv_cb(GtkWidget *w, GaimGtkConversation *gtkconv) { - GList *list = g_list_copy(gtkconv->convs), *l; + GList *list = g_list_copy(gtkconv->convs); - l = list; - while (l) { - GaimConversation *conv = l->data; - gaim_conversation_destroy(conv); - l = l->next; - } - + g_list_foreach(list, (GFunc)gaim_conversation_destroy, NULL); g_list_free(list); return TRUE; @@ -489,8 +483,7 @@ case GAIM_CMD_STATUS_FAILED: gaim_conversation_write(conv, "", error ? error : _("Your command failed for an unknown reason."), GAIM_MESSAGE_NO_LOG, time(NULL)); - if(error) - g_free(error); + g_free(error); return TRUE; case GAIM_CMD_STATUS_WRONG_TYPE: if(gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) @@ -771,8 +764,8 @@ } } - if (username != NULL) g_free(username); - if (protocol != NULL) g_free(protocol); + g_free(username); + g_free(protocol); gtk_drag_finish(dc, TRUE, (dc->action == GDK_ACTION_MOVE), t); } @@ -1426,7 +1419,7 @@ gaim_conv_chat_ignore(chat, name); cbuddy = gaim_conv_chat_cb_new(name, alias, flags); - + add_chat_buddy_common(conv, cbuddy, NULL); g_free(name); g_free(alias); @@ -1525,7 +1518,7 @@ who = g_object_get_data(G_OBJECT(w), "user_data"); mark = get_mark_for_user(gtkconv, who); - + if (mark != NULL) gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(gtkconv->imhtml), mark, 0.1, FALSE, 0, 0); else @@ -3214,8 +3207,7 @@ GaimBlistNode *gnode,*cnode,*bnode; static GList *tmp = NULL; - if (tmp) - g_list_free(tmp); + g_list_free(tmp); tmp = g_list_append(NULL, ""); @@ -4261,8 +4253,8 @@ } } - if (username != NULL) g_free(username); - if (protocol != NULL) g_free(protocol); + g_free(username); + g_free(protocol); gtk_drag_finish(dc, TRUE, (dc->action == GDK_ACTION_MOVE), t); } @@ -4868,8 +4860,7 @@ } } - if(alias_escaped) - g_free(alias_escaped); + g_free(alias_escaped); /* Are we in a chat where we can tell which users are buddies? */ if (!(prpl_info->options & OPT_PROTO_UNIQUE_CHATNAME) && @@ -5070,7 +5061,7 @@ g_return_if_fail(new_alias != NULL); cbuddy = gaim_conv_chat_cb_new(new_name, new_alias, flags); - + add_chat_buddy_common(conv, cbuddy, old_name); } @@ -5177,7 +5168,7 @@ flags = gaim_conv_chat_user_get_flags(chat, user); cbuddy = gaim_conv_chat_cb_new(user, alias, flags); - + add_chat_buddy_common(conv, cbuddy, NULL); g_free(alias); } Modified: trunk/src/gtkdebug.c =================================================================== --- trunk/src/gtkdebug.c 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/src/gtkdebug.c 2006-08-05 08:27:39 UTC (rev 16638) @@ -58,9 +58,9 @@ gboolean invert; gboolean highlight; - + guint timer; - + regex_t regex; #else GtkWidget *find; @@ -351,8 +351,8 @@ for(m = 0; m < n_matches; m++) { GtkTextIter ms, me; - - if(matches[m].rm_eo == -1) + + if(matches[m].rm_eo == -1) break; i += offset; @@ -524,7 +524,7 @@ */ if(win->paused) return; - + gtk_tree_model_get(model, iter, 0, &text, -1); if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(win->filter))) { @@ -840,8 +840,7 @@ g_free(new_msg); } - if (new_domain != NULL) - g_free(new_domain); + g_free(new_domain); } #ifdef _WIN32 Modified: trunk/src/gtkft.c =================================================================== --- trunk/src/gtkft.c 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/src/gtkft.c 2006-08-05 08:27:39 UTC (rev 16638) @@ -1097,8 +1097,7 @@ data = GAIM_GTKXFER(xfer); if (data) { - if (data->name) - g_free(data->name); + g_free(data->name); g_free(data); xfer->ui_data = NULL; } Modified: trunk/src/gtkimhtml.c =================================================================== --- trunk/src/gtkimhtml.c 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/src/gtkimhtml.c 2006-08-05 08:27:39 UTC (rev 16638) @@ -1248,10 +1248,8 @@ g_list_free(imhtml->scalables); g_slist_free(imhtml->im_images); - if (imhtml->protocol_name) - g_free(imhtml->protocol_name); - if (imhtml->search_string) - g_free(imhtml->search_string); + g_free(imhtml->protocol_name); + g_free(imhtml->search_string); G_OBJECT_CLASS(parent_class)->finalize (object); } @@ -2737,8 +2735,7 @@ gtk_text_buffer_insert(imhtml->text_buffer, iter, ws, wpos); ws[0] = '\0'; wpos = 0; /* NEW_BIT(NEW_TEXT_BIT); */ - if (bg) - g_free(bg); + g_free(bg); bg = bgcolor; gtk_imhtml_toggle_background(imhtml, bg); } @@ -2752,8 +2749,7 @@ ws[0] = '\0'; wpos = 0; gtk_imhtml_toggle_link(imhtml, href); } - if (href) - g_free(href); + g_free(href); } break; case 46: /* IMG (opt) */ @@ -3037,14 +3033,10 @@ while (fonts) { GtkIMHtmlFontDetail *font = fonts->data; fonts = g_slist_remove (fonts, font); - if (font->face) - g_free (font->face); - if (font->fore) - g_free (font->fore); - if (font->back) - g_free (font->back); - if (font->sml) - g_free (font->sml); + g_free (font->face); + g_free (font->fore); + g_free (font->back); + g_free (font->sml); g_free (font); } @@ -3082,9 +3074,8 @@ void gtk_imhtml_set_protocol_name(GtkIMHtml *imhtml, const gchar *protocol_name) { - if (imhtml->protocol_name) - g_free(imhtml->protocol_name); - imhtml->protocol_name = protocol_name ? g_strdup(protocol_name) : NULL; + g_free(imhtml->protocol_name); + imhtml->protocol_name = g_strdup(protocol_name); } void @@ -3174,7 +3165,7 @@ im_image->width = gdk_pixbuf_get_width(img); im_image->height = gdk_pixbuf_get_height(img); im_image->mark = NULL; - im_image->filename = filename ? g_strdup(filename) : NULL; + im_image->filename = g_strdup(filename); im_image->id = id; im_image->filesel = NULL; @@ -3441,8 +3432,7 @@ GtkIMHtmlImage *image = (GtkIMHtmlImage *)scale; g_object_unref(image->pixbuf); - if (image->filename) - g_free(image->filename); + g_free(image->filename); if (image->filesel) gtk_widget_destroy(image->filesel); g_free(scale); @@ -3559,8 +3549,7 @@ gtk_text_buffer_get_end_iter(imhtml->text_buffer, &end); gtk_text_buffer_remove_tag_by_name(imhtml->text_buffer, "search", &start, &end); - if (imhtml->search_string) - g_free(imhtml->search_string); + g_free(imhtml->search_string); imhtml->search_string = NULL; } @@ -3825,7 +3814,7 @@ strncmp(tag->name, "LINK ", 5) == 0 && imhtml->edit.link) { gtk_imhtml_toggle_link(imhtml, NULL); } - } + } } g_slist_free(tags); } @@ -3944,37 +3933,25 @@ char * gtk_imhtml_get_current_fontface(GtkIMHtml *imhtml) { - if (imhtml->edit.fontface) - return g_strdup(imhtml->edit.fontface); - else - return NULL; + return g_strdup(imhtml->edit.fontface); } char * gtk_imhtml_get_current_forecolor(GtkIMHtml *imhtml) { - if (imhtml->edit.forecolor) - return g_strdup(imhtml->edit.forecolor); - else - return NULL; + return g_strdup(imhtml->edit.forecolor); } char * gtk_imhtml_get_current_backcolor(GtkIMHtml *imhtml) { - if (imhtml->edit.backcolor) - return g_strdup(imhtml->edit.backcolor); - else - return NULL; + return g_strdup(imhtml->edit.backcolor); } char * gtk_imhtml_get_current_background(GtkIMHtml *imhtml) { - if (imhtml->edit.background) - return g_strdup(imhtml->edit.background); - else - return NULL; + return g_strdup(imhtml->edit.background); } gint @@ -4029,15 +4006,15 @@ return; imhtml->edit.bold = imhtml->edit.italic = imhtml->edit.underline = imhtml->edit.strike = FALSE; - if (imhtml->edit.forecolor) - g_free(imhtml->edit.forecolor); + g_free(imhtml->edit.forecolor); imhtml->edit.forecolor = NULL; - if (imhtml->edit.backcolor) - g_free(imhtml->edit.backcolor); + + g_free(imhtml->edit.backcolor); imhtml->edit.backcolor = NULL; - if (imhtml->edit.fontface) - g_free(imhtml->edit.fontface); + + g_free(imhtml->edit.fontface); imhtml->edit.fontface = NULL; + imhtml->edit.fontsize = 0; imhtml->edit.link = NULL; Modified: trunk/src/gtkimhtmltoolbar.c =================================================================== --- trunk/src/gtkimhtmltoolbar.c 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/src/gtkimhtmltoolbar.c 2006-08-05 08:27:39 UTC (rev 16638) @@ -878,8 +878,7 @@ toolbar); } - if (toolbar->sml) - free(toolbar->sml); + free(toolbar->sml); gtk_object_sink(GTK_OBJECT(toolbar->tooltips)); G_OBJECT_CLASS(parent_class)->finalize (object); @@ -1132,8 +1131,6 @@ void gtk_imhtmltoolbar_associate_smileys(GtkIMHtmlToolbar *toolbar, const char *proto_id) { - if (toolbar->sml) - g_free(toolbar->sml); - + g_free(toolbar->sml); toolbar->sml = g_strdup(proto_id); } Modified: trunk/src/gtklog.c =================================================================== --- trunk/src/gtklog.c 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/src/gtklog.c 2006-08-05 08:27:39 UTC (rev 16638) @@ -111,8 +111,7 @@ const char *search_term = gtk_entry_get_text(GTK_ENTRY(lv->entry)); GList *logs; - if (lv->search != NULL) - g_free(lv->search); + g_free(lv->search); gtk_tree_store_clear(lv->treestore); if (!(*search_term)) { @@ -154,9 +153,7 @@ lv = g_hash_table_lookup(log_viewers, ht); g_hash_table_remove(log_viewers, ht); - if (ht->screenname != NULL) - g_free(ht->screenname); - + g_free(ht->screenname); g_free(ht); } else syslog_viewer = NULL; @@ -164,10 +161,9 @@ g_list_foreach(lv->logs, (GFunc)gaim_log_free, NULL); g_list_free(lv->logs); - if (lv->search != NULL) - g_free(lv->search); - + g_free(lv->search); g_free(lv); + gtk_widget_destroy(w); return TRUE; Modified: trunk/src/gtkpluginpref.c =================================================================== --- trunk/src/gtkpluginpref.c 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/src/gtkpluginpref.c 2006-08-05 08:27:39 UTC (rev 16638) @@ -57,9 +57,6 @@ g_return_if_fail(pref); text = gtk_imhtml_get_markup(imhtml); - - if (!text) - text = ""; gaim_prefs_set_string(pref, text); g_free(text); } Modified: trunk/src/gtkpounce.c =================================================================== --- trunk/src/gtkpounce.c 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/src/gtkpounce.c 2006-08-05 08:27:39 UTC (rev 16638) @@ -432,8 +432,8 @@ } } - if (username != NULL) g_free(username); - if (protocol != NULL) g_free(protocol); + g_free(username); + g_free(protocol); gtk_drag_finish(dc, TRUE, (dc->action == GDK_ACTION_MOVE), t); } @@ -1195,7 +1195,7 @@ /* Create the scrolled window */ sw = gtk_scrolled_window_new(0, 0); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), - GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_IN); Modified: trunk/src/gtkprefs.c =================================================================== --- trunk/src/gtkprefs.c 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/src/gtkprefs.c 2006-08-05 08:27:39 UTC (rev 16638) @@ -1474,7 +1474,7 @@ static gchar* prefs_sound_volume_format(GtkScale *scale, gdouble val) { if(val < 15) { - return g_strdup_printf(_("Quietest")); + return g_strdup_printf(_("Quietest")); } else if(val < 30) { return g_strdup_printf(_("Quieter")); } else if(val < 45) { Modified: trunk/src/gtkprivacy.c =================================================================== --- trunk/src/gtkprivacy.c 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/src/gtkprivacy.c 2006-08-05 08:27:39 UTC (rev 16638) @@ -7,7 +7,7 @@ * Gaim is the legal property of its developers, whose names are too numerous * to list here. Please refer to the COPYRIGHT file distributed with this * source distribution. - * + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -521,9 +521,7 @@ static void destroy_request_data(GaimGtkPrivacyRequestData *data) { - if (data->name != NULL) - g_free(data->name); - + g_free(data->name); g_free(data); } Modified: trunk/src/gtkrequest.c =================================================================== --- trunk/src/gtkrequest.c 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/src/gtkrequest.c 2006-08-05 08:27:39 UTC (rev 16638) @@ -364,7 +364,7 @@ /* Entry field. */ data->u.input.multiline = multiline; - data->u.input.hint = (hint == NULL ? NULL : g_strdup(hint)); + data->u.input.hint = g_strdup(hint); if ((data->u.input.hint != NULL) && (!strcmp(data->u.input.hint, "html"))) { GtkWidget *frame; @@ -1586,7 +1586,7 @@ { GaimGtkRequestData *data; GtkWidget *dirsel; - + data = g_new0(GaimGtkRequestData, 1); data->type = GAIM_REQUEST_FOLDER; data->user_data = user_data; @@ -1633,8 +1633,7 @@ { GaimGtkRequestData *data = (GaimGtkRequestData *)ui_handle; - if (data->cbs != NULL) - g_free(data->cbs); + g_free(data->cbs); gtk_widget_destroy(data->dialog); Modified: trunk/src/gtkroomlist.c =================================================================== --- trunk/src/gtkroomlist.c 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/src/gtkroomlist.c 2006-08-05 08:27:39 UTC (rev 16638) @@ -593,7 +593,7 @@ selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree)); g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(selection_changed_cb), grl); - + g_object_unref(model); grl->model = model; Modified: trunk/src/gtksound.c =================================================================== --- trunk/src/gtksound.c 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/src/gtksound.c 2006-08-05 08:27:39 UTC (rev 16638) @@ -342,7 +342,7 @@ static gboolean bus_call (GstBus *bus, GstMessage *msg, - gpointer data) + gpointer data) { GstElement *play = data; GError *err; @@ -443,17 +443,17 @@ uri = g_strdup_printf("file://%s", filename); play = gst_element_factory_make("playbin", "play"); - + g_object_set(G_OBJECT(play), "uri", uri, - "volume", volume, + "volume", volume, "audio-sink", sink, NULL); gst_bus_add_watch(gst_pipeline_get_bus(GST_PIPELINE(play)), bus_call, play); gst_element_set_state(play, GST_STATE_PLAYING); - + g_free(uri); - + #else /* USE_GSTREAMER */ gdk_beep(); return; @@ -499,7 +499,7 @@ if (gaim_prefs_get_bool(enable_pref)) { char *filename = g_strdup(gaim_prefs_get_string(file_pref)); if(!filename || !strlen(filename)) { - if(filename) g_free(filename); + g_free(filename); filename = g_build_filename(DATADIR, "sounds", "gaim", sounds[event].def, NULL); } Modified: trunk/src/gtkstatusbox.c =================================================================== --- trunk/src/gtkstatusbox.c 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/src/gtkstatusbox.c 2006-08-05 08:27:39 UTC (rev 16638) @@ -751,7 +751,7 @@ status_menu_refresh_iter(status_box); return TRUE; } - + gtk_gaim_status_box_pulse_typing(status_box); g_source_remove(status_box->typing); status_box->typing = g_timeout_add(TYPING_TIMEOUT, (GSourceFunc)remove_typing_cb, status_box); Modified: trunk/src/gtkthemes.c =================================================================== --- trunk/src/gtkthemes.c 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/src/gtkthemes.c 2006-08-05 08:27:39 UTC (rev 16638) @@ -119,23 +119,19 @@ theme->list = child; list = child; } else if (!g_ascii_strncasecmp(i, "Name=", strlen("Name="))) { - if(theme->name) - g_free(theme->name); + g_free(theme->name); theme->name = g_strdup(i+ strlen("Name=")); theme->name[strlen(theme->name)-1] = 0; } else if (!g_ascii_strncasecmp(i, "Description=", strlen("Description="))) { - if(theme->desc) - g_free(theme->desc); + g_free(theme->desc); theme->desc = g_strdup(i + strlen("Description=")); theme->desc[strlen(theme->desc)-1] = 0; } else if (!g_ascii_strncasecmp(i, "Icon=", strlen("Icon="))) { - if(theme->icon) - g_free(theme->icon); + g_free(theme->icon); theme->icon = g_build_filename(dirname, i + strlen("Icon="), NULL); theme->icon[strlen(theme->icon)-1] = 0; } else if (!g_ascii_strncasecmp(i, "Author=", strlen("Author="))) { - if(theme->author) - g_free(theme->author); + g_free(theme->author); theme->author = g_strdup(i + strlen("Author=")); theme->author[strlen(theme->author)-1] = 0; } else if (load && list) { Modified: trunk/src/gtkutils.c =================================================================== --- trunk/src/gtkutils.c 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/src/gtkutils.c 2006-08-05 08:27:39 UTC (rev 16638) @@ -1053,9 +1053,9 @@ { valid = FALSE; - if (username != NULL) g_free(username); - if (protocol != NULL) g_free(protocol); - if (alias != NULL) g_free(alias); + g_free(username); + g_free(protocol); + g_free(alias); } g_free(str); Modified: trunk/src/imgstore.c =================================================================== --- trunk/src/imgstore.c 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/src/imgstore.c 2006-08-05 08:27:39 UTC (rev 16638) @@ -82,10 +82,8 @@ img = priv->img; if (img) { - if (img->data) - g_free(img->data); - if (img->filename) - g_free(img->filename); + g_free(img->data); + g_free(img->filename); g_free(img); } Modified: trunk/src/log.c =================================================================== --- trunk/src/log.c 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/src/log.c 2006-08-05 08:27:39 UTC (rev 16638) @@ -110,7 +110,7 @@ log->tm->tm_zone = tmp; else /* Just shove the UTF-8 bytes in and hope... */ - log->tm->tm_zone = (char *)g_strdup(log->tm->tm_zone); + log->tm->tm_zone = g_strdup(log->tm->tm_zone); } #endif } @@ -853,7 +853,7 @@ for (account_iter = gaim_accounts_get_all() ; account_iter != NULL ; account_iter = account_iter->next) { GaimPlugin *prpl; GaimPluginProtocolInfo *prpl_info; - + prpl = gaim_find_prpl(gaim_account_get_protocol_id((GaimAccount *)account_iter->data)); if (!prpl) continue; @@ -1281,8 +1281,7 @@ if (data) { if(data->file) fclose(data->file); - if(data->path) - g_free(data->path); + g_free(data->path); g_slice_free(GaimLogCommonLoggerData, data); } Modified: trunk/src/notify.c =================================================================== --- trunk/src/notify.c 2006-08-05 05:44:34 UTC (rev 16637) +++ trunk/src/notify.c 2006-08-05 08:27:39 UTC (rev 16638) @@ -60,9 +60,9 @@ if (info->ui_handle != NULL) { handles = g_list_append(handles, info); - + return info->ui_handle; - + } else { if (info->cb != NULL) info->cb(info->cb_user_data); @@ -111,7 +111,7 @@ g_free(info); return NULL; - } + } } else { if (cb != NULL) cb(user_data); @@ -197,1... [truncated message content] |
From: <the...@us...> - 2006-08-05 08:50:12
|
Revision: 16641 Author: thekingant Date: 2006-08-05 01:50:09 -0700 (Sat, 05 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16641&view=rev Log Message: ----------- Remove the old src/gaim-socket.h and src/socket.c from Subversion Removed Paths: ------------- trunk/src/gaim-socket.h trunk/src/socket.c Deleted: trunk/src/gaim-socket.h =================================================================== --- trunk/src/gaim-socket.h 2006-08-05 08:45:20 UTC (rev 16640) +++ trunk/src/gaim-socket.h 2006-08-05 08:50:09 UTC (rev 16641) @@ -1,45 +0,0 @@ -/* - * gaim-remote - * - * Gaim is the legal property of its developers, whose names are too numerous - * to list here. Please refer to the COPYRIGHT file distributed with this - * source distribution. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - */ -#ifndef _GAIM_GAIM_SOCKET_H_ -#define _GAIM_GAIM_SOCKET_H_ - -struct gaim_cui_packet { - guchar type; - guchar subtype; - guint32 length; - char *data; -}; - - -void cui_send_packet (int fd, struct gaim_cui_packet *p); -gint gaim_connect_to_session(gint session); -gboolean gaim_session_exists(int sess); - -struct gaim_cui_packet *cui_packet_new(guchar type, guchar subtype); -void cui_packet_free(struct gaim_cui_packet *p); -void cui_packet_append_string(struct gaim_cui_packet *p, char *str); -void cui_packet_append_char(struct gaim_cui_packet *p, char c); -void cui_packet_append_raw(struct gaim_cui_packet *p, char *str, int len); - - -#endif /* _GAIM_GAIM_SOCKET_H_ */ Deleted: trunk/src/socket.c =================================================================== --- trunk/src/socket.c 2006-08-05 08:45:20 UTC (rev 16640) +++ trunk/src/socket.c 2006-08-05 08:50:09 UTC (rev 16641) @@ -1,168 +0,0 @@ -/* - * gaim-remote - * - * Gaim is the legal property of its developers, whose names are too numerous - * to list here. Please refer to the COPYRIGHT file distributed with this - * source distribution. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - */ - -/* Somewhat inspired by XMMS*/ - -/* This provides code for connecting to a Gaim socket and communicating with - * it. It will eventually be made a library once the core and ui are split. */ - -#include <sys/types.h> -#include <sys/socket.h> -#include <sys/un.h> -#include <unistd.h> -#include "gaim-socket.h" - -void cui_send_packet (int fd, struct gaim_cui_packet *p) { - int len = sizeof(p->type) + sizeof(p->subtype) + sizeof(p->length) + p->length; - char *pack = g_malloc(len); - char *a = pack; - memcpy (a, &(p->type), sizeof(p->type)); - a = a + sizeof(p->type); - memcpy (a, &(p->subtype), sizeof(p->subtype)); - a = a + sizeof(p->subtype); - memcpy (a, &(p->length), sizeof(p->length)); - a = a + sizeof(p->length); - memcpy (a, p->data, p->length); - write(fd, pack, len); - g_free(pack); -} - - -void cui_packet_append_string(struct gaim_cui_packet *p, char *str) { - int len = p->length + strlen(str); - char *k = g_malloc(len); - memcpy(k, p->data, p->length); - memcpy(k + p->length, str, strlen(str)); - if (p->data) - g_free(p->data); - p->data = k; - p->length = len; -} - -void cui_packet_append_char(struct gaim_cui_packet *p, char c) { - int len = p->length + sizeof(char); - char *k = g_malloc(len); - memcpy(k, p->data, p->length); - k[p->length] = c; - if (p->data) - g_free(p->data); - p->data = k; - p->length = len; -} - -void cui_packet_append_raw(struct gaim_cui_packet *p, char *str, int len) { - int lent = p->length + len; - char *k = g_malloc(lent); - memcpy(k, p->data, p->length); - memcpy(k + p->length, str, len); - if (p->data) - g_free(p->data); - p->data = k; - p->length = lent; -} - -struct gaim_cui_packet *cui_packet_new(guchar type, guchar subtype) { - struct gaim_cui_packet *p = g_new0(struct gaim_cui_packet, 1); - p->type = type; - p->subtype = subtype; - p->length = 0; - p->data = NULL; - return p; -} - -void cui_packet_free(struct gaim_cui_packet *p) { - if (p->data) - g_free(p->data); - g_free(p); -} - -struct gaim_cui_packet *cui_read_packet(int fd) { - struct gaim_cui_packet *p = g_new0(struct gaim_cui_packet, 1); - char *data = NULL; - - if (!(read(fd, &p->type, sizeof(p->type)))) { - g_free(p); - return NULL; - } - - - if (!(read(fd, &p->subtype, sizeof(p->subtype)))) { - g_free(p); - return NULL; - } - - - if (!(read(fd, &p->length, sizeof(p->length)))) { - g_free(p); - return NULL; - } - - if (p->length) { - data = g_malloc(p->length); - if (!(read(fd, data, p->length))) { - g_free(p); - return NULL; - } - } - p->data = data; - return p; -} - -/* copied directly from xmms_connect_to_session */ -gint gaim_connect_to_session(gint session) -{ - gint fd; - uid_t stored_uid, euid; - struct sockaddr_un saddr; - - if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) != -1) - { - saddr.sun_family = AF_UNIX; - stored_uid = getuid(); - euid = geteuid(); - setuid(euid); - sprintf(saddr.sun_path, "%s/gaim_%s.%d", g_get_tmp_dir(), g_get_user_name(), session); - setreuid(stored_uid, euid); - if (connect(fd, (struct sockaddr *) &saddr, sizeof (saddr)) != -1) - return fd; - } - close(fd); - return -1; -} - -gboolean gaim_session_exists(int sess) -{ - struct gaim_cui_packet *pack = NULL; - - int fd = gaim_connect_to_session(sess); - if (fd > 0) { - pack = cui_packet_new(CUI_TYPE_META, CUI_META_PING); - cui_send_packet(fd, pack); - cui_packet_free(pack); - close(fd); - } else { - return FALSE; - } - return TRUE; -} - This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <the...@us...> - 2006-08-05 09:11:54
|
Revision: 16642 Author: thekingant Date: 2006-08-05 02:11:46 -0700 (Sat, 05 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16642&view=rev Log Message: ----------- Formatting/whitespace Modified Paths: -------------- trunk/src/mime.c trunk/src/mime.h Modified: trunk/src/mime.c =================================================================== --- trunk/src/mime.c 2006-08-05 08:50:09 UTC (rev 16641) +++ trunk/src/mime.c 2006-08-05 09:11:46 UTC (rev 16642) @@ -1,27 +1,26 @@ - /* - Gaim + * Gaim + * + * Gaim is the legal property of its developers, whose names are too + * numerous to list here. Please refer to the COPYRIGHT file distributed + * with this source distribution + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + * USA. + */ - Gaim is the legal property of its developers, whose names are too - numerous to list here. Please refer to the COPYRIGHT file distributed - with this source distribution - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or (at - your option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - USA. -*/ - #include <stdio.h> #include <string.h> @@ -31,493 +30,533 @@ #include <glib/gstring.h> /* this should become "util.h" if we ever get this into gaim proper */ -#include <debug.h> -#include <util.h> - +#include "debug.h" #include "mime.h" +#include "util.h" - -/** @struct mime_fields - - Utility structure used in both MIME document and parts, which maps - field names to their values, and keeps an easily accessible list of - keys -*/ +/** + * @struct mime_fields + * + * Utility structure used in both MIME document and parts, which maps + * field names to their values, and keeps an easily accessible list of + * keys. + */ struct mime_fields { - GHashTable *map; - GList *keys; + GHashTable *map; + GList *keys; }; - struct _GaimMimeDocument { - struct mime_fields fields; - GList *parts; + struct mime_fields fields; + GList *parts; }; - struct _GaimMimePart { - struct mime_fields fields; - struct _GaimMimeDocument *doc; - GString *data; + struct mime_fields fields; + struct _GaimMimeDocument *doc; + GString *data; }; +static void +fields_set(struct mime_fields *mf, const char *key, const char *val) +{ + char *k, *v; -static void fields_set(struct mime_fields *mf, - const char *key, const char *val) { - char *k, *v; + g_return_if_fail(mf != NULL); + g_return_if_fail(mf->map != NULL); - g_return_if_fail(mf != NULL); - g_return_if_fail(mf->map != NULL); + k = g_ascii_strdown(key, -1); + v = g_strdup(val); - k = g_ascii_strdown(key, -1); - v = g_strdup(val); + /* append to the keys list only if it's not already there */ + if(! g_hash_table_lookup(mf->map, k)) { + mf->keys = g_list_append(mf->keys, k); + } - /* append to the keys list only if it's not already there */ - if(! g_hash_table_lookup(mf->map, k)) { - mf->keys = g_list_append(mf->keys, k); - } - - /* important to use insert. If the key is already in the table, then - it's already in the keys list. Insert will free the new instance - of the key rather than the old instance. */ - g_hash_table_insert(mf->map, k, v); + /* important to use insert. If the key is already in the table, then + it's already in the keys list. Insert will free the new instance + of the key rather than the old instance. */ + g_hash_table_insert(mf->map, k, v); } -static const char *fields_get(struct mime_fields *mf, - const char *key) { - char *kdown; - const char *ret; +static const char * +fields_get(struct mime_fields *mf, const char *key) +{ + char *kdown; + const char *ret; - g_return_val_if_fail(mf != NULL, NULL); - g_return_val_if_fail(mf->map != NULL, NULL); + g_return_val_if_fail(mf != NULL, NULL); + g_return_val_if_fail(mf->map != NULL, NULL); - kdown = g_ascii_strdown(key, -1); - ret = g_hash_table_lookup(mf->map, kdown); - g_free(kdown); + kdown = g_ascii_strdown(key, -1); + ret = g_hash_table_lookup(mf->map, kdown); + g_free(kdown); - return ret; + return ret; } -static void fields_init(struct mime_fields *mf) { - g_return_if_fail(mf != NULL); +static void +fields_init(struct mime_fields *mf) +{ + g_return_if_fail(mf != NULL); - mf->map = g_hash_table_new_full(g_str_hash, g_str_equal, - g_free, g_free); + mf->map = g_hash_table_new_full(g_str_hash, g_str_equal, + g_free, g_free); } -static void fields_loadline(struct mime_fields *mf, - const char *line, gsize len) { +static void +fields_loadline(struct mime_fields *mf, const char *line, gsize len) +{ + /* split the line into key: value */ + char *key, *val; + char **tokens; - /* split the line into key: value */ - char *key, *val; - char **tokens; + /* feh, need it to be NUL terminated */ + key = g_strndup(line, len); - /* feh, need it to be NUL terminated */ - key = g_strndup(line, len); + /* split */ + val = strchr(key, ':'); + if(! val) { + g_free(key); + return; + } + *val++ = '\0'; - /* split */ - val = strchr(key, ':'); - if(! val) { - g_free(key); - return; - } - *val++ = '\0'; + /* normalize whitespace (sorta) and trim on key and value */ + tokens = g_strsplit(key, "\t\r\n", 0); + key = g_strjoinv("", tokens); + key = g_strstrip(key); + g_strfreev(tokens); - /* normalize whitespace (sorta) and trim on key and value */ - tokens = g_strsplit(key, "\t\r\n", 0); - key = g_strjoinv("", tokens); - key = g_strstrip(key); - g_strfreev(tokens); + tokens = g_strsplit(val, "\t\r\n", 0); + val = g_strjoinv("", tokens); + val = g_strstrip(val); + g_strfreev(tokens); - tokens = g_strsplit(val, "\t\r\n", 0); - val = g_strjoinv("", tokens); - val = g_strstrip(val); - g_strfreev(tokens); - - fields_set(mf, key, val); + fields_set(mf, key, val); - g_free(key); - g_free(val); + g_free(key); + g_free(val); } -static void fields_load(struct mime_fields *mf, - char **buf, gsize *len) { - char *tail; +static void +fields_load(struct mime_fields *mf, char **buf, gsize *len) +{ + char *tail; - while( (tail = g_strstr_len(*buf, *len, "\r\n")) ) { - char *line; - gsize ln; + while ((tail = g_strstr_len(*buf, *len, "\r\n"))) + { + char *line; + gsize ln; - /* determine the current line */ - line = *buf; - ln = tail - line; + /* determine the current line */ + line = *buf; + ln = tail - line; - /* advance our search space past the CRLF */ - *buf = tail + 2; - *len -= (ln + 2); + /* advance our search space past the CRLF */ + *buf = tail + 2; + *len -= (ln + 2); - /* empty line, end of headers */ - if(! ln) return; + /* empty line, end of headers */ + if(! ln) return; - /* look out for line continuations */ - if(line[ln-1] == ';') { - tail = g_strstr_len(*buf, *len, "\r\n"); - if(tail) { - gsize cln; + /* look out for line continuations */ + if(line[ln-1] == ';') { + tail = g_strstr_len(*buf, *len, "\r\n"); + if(tail) { + gsize cln; - cln = tail - *buf; - ln = tail - line; + cln = tail - *buf; + ln = tail - line; - /* advance our search space past the CRLF (again) */ - *buf = tail + 2; - *len -= (cln + 2); - } - } + /* advance our search space past the CRLF (again) */ + *buf = tail + 2; + *len -= (cln + 2); + } + } - /* process our super-cool line */ - fields_loadline(mf, line, ln); - } + /* process our super-cool line */ + fields_loadline(mf, line, ln); + } } -static void field_write(const char *key, const char *val, GString *str) { - g_string_append_printf(str, "%s: %s\r\n", key, val); +static void +field_write(const char *key, const char *val, GString *str) +{ + g_string_append_printf(str, "%s: %s\r\n", key, val); } -static void fields_write(struct mime_fields *mf, GString *str) { - g_return_if_fail(mf != NULL); +static void +fields_write(struct mime_fields *mf, GString *str) +{ + g_return_if_fail(mf != NULL); - g_hash_table_foreach(mf->map, (GHFunc) field_write, str); - g_string_append(str, "\r\n"); + g_hash_table_foreach(mf->map, (GHFunc) field_write, str); + g_string_append(str, "\r\n"); } -static void fields_destroy(struct mime_fields *mf) { - g_return_if_fail(mf != NULL); +static void +fields_destroy(struct mime_fields *mf) +{ + g_return_if_fail(mf != NULL); - g_hash_table_destroy(mf->map); - g_list_free(mf->keys); + g_hash_table_destroy(mf->map); + g_list_free(mf->keys); - mf->map = NULL; - mf->keys = NULL; + mf->map = NULL; + mf->keys = NULL; } -static GaimMimePart *part_new(GaimMimeDocument *doc) { - GaimMimePart *part; - - part = g_new0(GaimMimePart, 1); - fields_init(&part->fields); - part->doc = doc; - part->data = g_string_new(NULL); +static GaimMimePart * +part_new(GaimMimeDocument *doc) +{ + GaimMimePart *part; - doc->parts = g_list_prepend(doc->parts, part); + part = g_new0(GaimMimePart, 1); + fields_init(&part->fields); + part->doc = doc; + part->data = g_string_new(NULL); - return part; + doc->parts = g_list_prepend(doc->parts, part); + + return part; } -static void part_load(GaimMimePart *part, - const char *buf, gsize len) { +static void +part_load(GaimMimePart *part, const char *buf, gsize len) +{ - char *b = (char *) buf; - gsize n = len; + char *b = (char *) buf; + gsize n = len; - fields_load(&part->fields, &b, &n); + fields_load(&part->fields, &b, &n); - /* the remainder will have a blank line, if there's anything at all, - so check if there's anything then trim off the trailing four - bytes, \r\n\r\n */ - if(n > 4) n -= 4; - g_string_append_len(part->data, b, n); + /* the remainder will have a blank line, if there's anything at all, + so check if there's anything then trim off the trailing four + bytes, \r\n\r\n */ + if(n > 4) n -= 4; + g_string_append_len(part->data, b, n); } -static void part_write(GaimMimePart *part, GString *str) { - fields_write(&part->fields, str); - g_string_append_printf(str, "%s\r\n\r\n", part->data->str); +static void +part_write(GaimMimePart *part, GString *str) +{ + fields_write(&part->fields, str); + g_string_append_printf(str, "%s\r\n\r\n", part->data->str); } -static void part_free(GaimMimePart *part) { +static void +part_free(GaimMimePart *part) +{ - fields_destroy(&part->fields); + fields_destroy(&part->fields); - g_string_free(part->data, TRUE); - part->data = NULL; + g_string_free(part->data, TRUE); + part->data = NULL; - g_free(part); + g_free(part); } -GaimMimePart *gaim_mime_part_new(GaimMimeDocument *doc) { - g_return_val_if_fail(doc != NULL, NULL); - return part_new(doc); +GaimMimePart * +gaim_mime_part_new(GaimMimeDocument *doc) +{ + g_return_val_if_fail(doc != NULL, NULL); + return part_new(doc); } -const GList *gaim_mime_part_get_fields(GaimMimePart *part) { - g_return_val_if_fail(part != NULL, NULL); - return part->fields.keys; +const GList * +gaim_mime_part_get_fields(GaimMimePart *part) +{ + g_return_val_if_fail(part != NULL, NULL); + return part->fields.keys; } -const char *gaim_mime_part_get_field(GaimMimePart *part, - const char *field) { - - g_return_val_if_fail(part != NULL, NULL); - return fields_get(&part->fields, field); +const char * +gaim_mime_part_get_field(GaimMimePart *part, const char *field) +{ + g_return_val_if_fail(part != NULL, NULL); + return fields_get(&part->fields, field); } -char *gaim_mime_part_get_field_decoded(GaimMimePart *part, - const char *field) { +char * +gaim_mime_part_get_field_decoded(GaimMimePart *part, const char *field) +{ + const char *f; - const char *f; + g_return_val_if_fail(part != NULL, NULL); - g_return_val_if_fail(part != NULL, NULL); - - f = fields_get(&part->fields, field); - return gaim_mime_decode_field(f); + f = fields_get(&part->fields, field); + return gaim_mime_decode_field(f); } -void gaim_mime_part_set_field(GaimMimePart *part, - const char *field, - const char *value) { - g_return_if_fail(part != NULL); - fields_set(&part->fields, field, value); +void +gaim_mime_part_set_field(GaimMimePart *part, const char *field, const char *value) +{ + g_return_if_fail(part != NULL); + fields_set(&part->fields, field, value); } -const char *gaim_mime_part_get_data(GaimMimePart *part) { - g_return_val_if_fail(part != NULL, NULL); - g_return_val_if_fail(part->data != NULL, NULL); +const char * +gaim_mime_part_get_data(GaimMimePart *part) +{ + g_return_val_if_fail(part != NULL, NULL); + g_return_val_if_fail(part->data != NULL, NULL); - return part->data->str; + return part->data->str; } -void gaim_mime_part_get_data_decoded(GaimMimePart *part, - guchar **data, gsize *len) { - const char *enc; +void +gaim_mime_part_get_data_decoded(GaimMimePart *part, guchar **data, gsize *len) +{ + const char *enc; - g_return_if_fail(part != NULL); - g_return_if_fail(data != NULL); - g_return_if_fail(len != NULL); + g_return_if_fail(part != NULL); + g_return_if_fail(data != NULL); + g_return_if_fail(len != NULL); - g_return_if_fail(part->data != NULL); + g_return_if_fail(part->data != NULL); - enc = gaim_mime_part_get_field(part, "content-transfer-encoding"); + enc = gaim_mime_part_get_field(part, "content-transfer-encoding"); - if(! enc) { - *data = (guchar *)g_strdup(part->data->str); - *len = part->data->len; + if(! enc) { + *data = (guchar *)g_strdup(part->data->str); + *len = part->data->len; - } else if(! g_ascii_strcasecmp(enc, "7bit")) { - *data = (guchar *)g_strdup(part->data->str); - *len = part->data->len; + } else if(! g_ascii_strcasecmp(enc, "7bit")) { + *data = (guchar *)g_strdup(part->data->str); + *len = part->data->len; - } else if(! g_ascii_strcasecmp(enc, "8bit")) { - *data = (guchar *)g_strdup(part->data->str); - *len = part->data->len; + } else if(! g_ascii_strcasecmp(enc, "8bit")) { + *data = (guchar *)g_strdup(part->data->str); + *len = part->data->len; - } else if(! g_ascii_strcasecmp(enc, "base16")) { - *data = gaim_base16_decode(part->data->str, len); + } else if(! g_ascii_strcasecmp(enc, "base16")) { + *data = gaim_base16_decode(part->data->str, len); - } else if(! g_ascii_strcasecmp(enc, "base64")) { + } else if(! g_ascii_strcasecmp(enc, "base64")) { *data = gaim_base64_decode(part->data->str, len); - } else if(! g_ascii_strcasecmp(enc, "quoted-printable")) { - *data = gaim_quotedp_decode(part->data->str, len); + } else if(! g_ascii_strcasecmp(enc, "quoted-printable")) { + *data = gaim_quotedp_decode(part->data->str, len); - } else { - gaim_debug_warning("mime", "gaim_mime_part_get_data_decoded:" - " unknown encoding '%s'\n", enc); - *data = NULL; - *len = 0; - } + } else { + gaim_debug_warning("mime", "gaim_mime_part_get_data_decoded:" + " unknown encoding '%s'\n", enc); + *data = NULL; + *len = 0; + } } -gsize gaim_mime_part_get_length(GaimMimePart *part) { - g_return_val_if_fail(part != NULL, 0); - g_return_val_if_fail(part->data != NULL, 0); +gsize +gaim_mime_part_get_length(GaimMimePart *part) +{ + g_return_val_if_fail(part != NULL, 0); + g_return_val_if_fail(part->data != NULL, 0); - return part->data->len; + return part->data->len; } -void gaim_mime_part_set_data(GaimMimePart *part, const char *data) { - g_return_if_fail(part != NULL); - g_string_free(part->data, TRUE); - part->data = g_string_new(data); +void +gaim_mime_part_set_data(GaimMimePart *part, const char *data) +{ + g_return_if_fail(part != NULL); + g_string_free(part->data, TRUE); + part->data = g_string_new(data); } -GaimMimeDocument *gaim_mime_document_new() { - GaimMimeDocument *doc; +GaimMimeDocument * +gaim_mime_document_new() +{ + GaimMimeDocument *doc; - doc = g_new0(GaimMimeDocument, 1); - fields_init(&doc->fields); + doc = g_new0(GaimMimeDocument, 1); + fields_init(&doc->fields); - return doc; + return doc; } -static void doc_parts_load(GaimMimeDocument *doc, - const char *boundary, - const char *buf, gsize len) { +static void +doc_parts_load(GaimMimeDocument *doc, const char *boundary, const char *buf, gsize len) +{ + char *b = (char *) buf; + gsize n = len; - char *b = (char *) buf; - gsize n = len; + const char *bnd; + gsize bl; - const char *bnd; - gsize bl; + bnd = g_strdup_printf("--%s", boundary); + bl = strlen(bnd); - bnd = g_strdup_printf("--%s", boundary); - bl = strlen(bnd); + for(b = g_strstr_len(b, n, bnd); b; ) { + char *tail; - for(b = g_strstr_len(b, n, bnd); b; ) { - char *tail; + /* skip the boundary */ + b += bl; + n -= bl; - /* skip the boundary */ - b += bl; - n -= bl; + /* skip the trailing \r\n or -- as well */ + if(n >= 2) { + b += 2; + n -= 2; + } - /* skip the trailing \r\n or -- as well */ - if(n >= 2) { - b += 2; - n -= 2; - } + /* find the next boundary */ + tail = g_strstr_len(b, n, bnd); - /* find the next boundary */ - tail = g_strstr_len(b, n, bnd); + if(tail) { + gsize sl; - if(tail) { - gsize sl; + sl = tail - b; + if(sl) { + GaimMimePart *part = part_new(doc); + part_load(part, b, sl); + } + } - sl = tail - b; - if(sl) { - GaimMimePart *part = part_new(doc); - part_load(part, b, sl); - } - } - - b = tail; - } + b = tail; + } } -GaimMimeDocument *gaim_mime_document_parsen(const char *buf, gsize len) { +GaimMimeDocument * +gaim_mime_document_parsen(const char *buf, gsize len) +{ + GaimMimeDocument *doc; - GaimMimeDocument *doc; + char *b = (char *) buf; + gsize n = len; - char *b = (char *) buf; - gsize n = len; + g_return_val_if_fail(buf != NULL, NULL); - g_return_val_if_fail(buf != NULL, NULL); + doc = gaim_mime_document_new(); - doc = gaim_mime_document_new(); + if (!len) + return doc; - if(! len) return doc; + fields_load(&doc->fields, &b, &n); - fields_load(&doc->fields, &b, &n); + { + const char *ct = fields_get(&doc->fields, "content-type"); + if(ct && gaim_str_has_prefix(ct, "multipart")) { + char *bd = strrchr(ct, '='); + if(bd++) { + doc_parts_load(doc, bd, b, n); + } + } + } - { - const char *ct = fields_get(&doc->fields, "content-type"); - if(ct && gaim_str_has_prefix(ct, "multipart")) { - char *bd = strrchr(ct, '='); - if(bd++) { - doc_parts_load(doc, bd, b, n); - } - } - } - - return doc; + return doc; } -GaimMimeDocument *gaim_mime_document_parse(const char *buf) { - g_return_val_if_fail(buf != NULL, NULL); - return gaim_mime_document_parsen(buf, strlen(buf)); +GaimMimeDocument * +gaim_mime_document_parse(const char *buf) +{ + g_return_val_if_fail(buf != NULL, NULL); + return gaim_mime_document_parsen(buf, strlen(buf)); } -void gaim_mime_document_write(GaimMimeDocument *doc, GString *str) { - const char *bd = NULL; +void +gaim_mime_document_write(GaimMimeDocument *doc, GString *str) +{ + const char *bd = NULL; - g_return_if_fail(doc != NULL); - g_return_if_fail(str != NULL); + g_return_if_fail(doc != NULL); + g_return_if_fail(str != NULL); - { - const char *ct = fields_get(&doc->fields, "content-type"); - if(ct && gaim_str_has_prefix(ct, "multipart")) { - char *b = strrchr(ct, '='); - if(b++) bd = b; - } - } + { + const char *ct = fields_get(&doc->fields, "content-type"); + if(ct && gaim_str_has_prefix(ct, "multipart")) { + char *b = strrchr(ct, '='); + if(b++) bd = b; + } + } - fields_write(&doc->fields, str); + fields_write(&doc->fields, str); - if(bd) { - GList *l; + if(bd) { + GList *l; - for(l = doc->parts; l; l = l->next) { - g_string_append_printf(str, "--%s\r\n", bd); + for(l = doc->parts; l; l = l->next) { + g_string_append_printf(str, "--%s\r\n", bd); - part_write(l->data, str); + part_write(l->data, str); - if(! l->next) { - g_string_append_printf(str, "--%s--\r\n", bd); - } - } - } + if(! l->next) { + g_string_append_printf(str, "--%s--\r\n", bd); + } + } + } } -const GList *gaim_mime_document_get_fields(GaimMimeDocument *doc) { - g_return_val_if_fail(doc != NULL, NULL); - return doc->fields.keys; +const GList * +gaim_mime_document_get_fields(GaimMimeDocument *doc) +{ + g_return_val_if_fail(doc != NULL, NULL); + return doc->fields.keys; } -const char *gaim_mime_document_get_field(GaimMimeDocument *doc, - const char *field) { - g_return_val_if_fail(doc != NULL, NULL); - return fields_get(&doc->fields, field); +const char * +gaim_mime_document_get_field(GaimMimeDocument *doc, const char *field) +{ + g_return_val_if_fail(doc != NULL, NULL); + return fields_get(&doc->fields, field); } -void gaim_mime_document_set_field(GaimMimeDocument *doc, - const char *field, - const char *value) { - g_return_if_fail(doc != NULL); - fields_set(&doc->fields, field, value); +void +gaim_mime_document_set_field(GaimMimeDocument *doc, const char *field, const char *value) +{ + g_return_if_fail(doc != NULL); + fields_set(&doc->fields, field, value); } -const GList *gaim_mime_document_get_parts(GaimMimeDocument *doc) { - g_return_val_if_fail(doc != NULL, NULL); - return doc->parts; +const GList * +gaim_mime_document_get_parts(GaimMimeDocument *doc) +{ + g_return_val_if_fail(doc != NULL, NULL); + return doc->parts; } -void gaim_mime_document_free(GaimMimeDocument *doc) { - if(! doc) return; +void +gaim_mime_document_free(GaimMimeDocument *doc) +{ + if (!doc) + return; - fields_destroy(&doc->fields); + fields_destroy(&doc->fields); - while(doc->parts) { - part_free(doc->parts->data); - doc->parts = g_list_delete_link(doc->parts, doc->parts); - } + while(doc->parts) { + part_free(doc->parts->data); + doc->parts = g_list_delete_link(doc->parts, doc->parts); + } - g_free(doc); + g_free(doc); } - Modified: trunk/src/mime.h =================================================================== --- trunk/src/mime.h 2006-08-05 08:50:09 UTC (rev 16641) +++ trunk/src/mime.h 2006-08-05 09:11:46 UTC (rev 16642) @@ -1,200 +1,211 @@ - /* - Gaim + * Gaim + * + * Gaim is the legal property of its developers, whose names are too + * numerous to list here. Please refer to the COPYRIGHT file distributed + * with this source distribution + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + * USA. + */ - Gaim is the legal property of its developers, whose names are too - numerous to list here. Please refer to the COPYRIGHT file distributed - with this source distribution - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or (at - your option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - USA. -*/ - #ifndef _GAIM_MIME_H #define _GAIM_MIME_H - #include <glib.h> #include <glib/glist.h> +/** + * @file mime.h + * @ingroup core + * + * Rudimentary parsing of multi-part MIME messages into more + * accessible structures. + */ /** - @file mime.h - @ingroup core - - Rudimentary parsing of multi-part MIME messages into more - accessible structures. -*/ - - -/** @typedef GaimMimeDocument - A MIME document + * @typedef GaimMimeDocument A MIME document. */ typedef struct _GaimMimeDocument GaimMimeDocument; - -/** @typedef GaimMimePart - A part of a multipart MIME document +/** + * @typedef GaimMimePart A part of a multipart MIME document. */ typedef struct _GaimMimePart GaimMimePart; - -/** Allocate an empty MIME document */ +/** + * Allocate an empty MIME document. + */ GaimMimeDocument *gaim_mime_document_new(void); - -/** Frees memory used in a MIME document and all of its parts and fields - @param doc the MIME document to free +/** + * Frees memory used in a MIME document and all of its parts and fields + * + * @param doc The MIME document to free. */ void gaim_mime_document_free(GaimMimeDocument *doc); - -/** Parse a MIME document from a NUL-terminated string - @param buf the NULL-terminated string containing the MIME-encoded data - @returns MIME document +/** + * Parse a MIME document from a NUL-terminated string. + * + * @param buf The NULL-terminated string containing the MIME-encoded data. + * + * @returns A MIME document. */ GaimMimeDocument *gaim_mime_document_parse(const char *buf); - -/** Parse a MIME document from a string - @param buf the string containing the MIME-encoded data - @param len length of buf - @returns MIME document +/** + * Parse a MIME document from a string + * + * @param buf The string containing the MIME-encoded data. + * @param len Length of buf. + * + * @returns A MIME document. */ GaimMimeDocument *gaim_mime_document_parsen(const char *buf, gsize len); - -/** Write (append) a MIME document onto a GString */ +/** + * Write (append) a MIME document onto a GString. + */ void gaim_mime_document_write(GaimMimeDocument *doc, GString *str); - -/** The list of fields in the header of a document - - @param doc the MIME document - @returns list of strings indicating the fields (but not the values of - the fields) in the header of doc -*/ +/** + * The list of fields in the header of a document + * + * @param doc The MIME document. + * + * @returns A list of strings indicating the fields (but not the values of + * the fields) in the header of doc. + */ const GList *gaim_mime_document_get_fields(GaimMimeDocument *doc); - -/** Get the value of a specific field in the header of a document - - @param doc the MIME document - @param field case-insensitive field name - @returns value associated with the indicated header field, or - NULL if the field doesn't exist -*/ +/** + * Get the value of a specific field in the header of a document. + * + * @param doc The MIME document. + * @param field Case-insensitive field name. + * + * @returns Value associated with the indicated header field, or + * NULL if the field doesn't exist. + */ const char *gaim_mime_document_get_field(GaimMimeDocument *doc, const char *field); - -/** Set or replace the value of a specific field in the header of a - document - - @param doc the MIME document - @param field case-insensitive field name - @param value value to associate with the indicated header field, - of NULL to remove the field -*/ +/** + * Set or replace the value of a specific field in the header of a + * document. + * + * @param doc The MIME document. + * @param field Case-insensitive field name. + * @param value Value to associate with the indicated header field, + * of NULL to remove the field. + */ void gaim_mime_document_set_field(GaimMimeDocument *doc, const char *field, const char *value); - -/** The list of parts in a multipart document - - @param doc the MIME document - @returns list of GaimMimePart contained within doc -*/ +/** + * The list of parts in a multipart document. + * + * @param doc The MIME document. + * + * @returns List of GaimMimePart contained within doc. + */ const GList *gaim_mime_document_get_parts(GaimMimeDocument *doc); - -/** Create and insert a new part into a MIME document - - @param doc the new part's parent MIME document +/** + * Create and insert a new part into a MIME document. + * + * @param doc The new part's parent MIME document. */ GaimMimePart *gaim_mime_part_new(GaimMimeDocument *doc); -/** The list of fields in the header of a document part - - @param part the MIME document part - @returns list of strings indicating the fields (but not the values - of the fields) in the header of part -*/ +/** + * The list of fields in the header of a document part. + * + * @param part The MIME document part. + * + * @returns List of strings indicating the fields (but not the values + * of the fields) in the header of part. + */ const GList *gaim_mime_part_get_fields(GaimMimePart *part); -/** Get the value of a specific field in the header of a document part - - @param part the MIME document part - @param field case-insensitive name of the header field - @returns value of the specified header field, or NULL if the - field doesn't exist -*/ +/** + * Get the value of a specific field in the header of a document part. + * + * @param part The MIME document part. + * @param field Case-insensitive name of the header field. + * + * @returns Value of the specified header field, or NULL if the + * field doesn't exist. + */ const char *gaim_mime_part_get_field(GaimMimePart *part, const char *field); - -/** Get the decoded value of a specific field in the header of a - document part */ +/** + * Get the decoded value of a specific field in the header of a + * document part. + */ char *gaim_mime_part_get_field_decoded(GaimMimePart *part, const char *field); - -/** Set or replace the value of a specific field in the header of a - document - @param part the part of the MIME document - @param field case-insensitive field name - @param value value to associate with the indicated header field, - of NULL to remove the field -*/ +/** + * Set or replace the value of a specific field in the header of a + * document. + * + * @param part The part of the MIME document. + * @param field Case-insensitive field name + * @param value Value to associate with the indicated header field, + * of NULL to remove the field. + */ void gaim_mime_part_set_field(GaimMimePart *part, const char *field, const char *value); - -/** Get the (possibly encoded) data portion of a MIME document part - @param part the MIME document part - @returns NULL-terminated data found in the document part +/** + * Get the (possibly encoded) data portion of a MIME document part. + * + * @param part The MIME document part. + * + * @returns NULL-terminated data found in the document part */ const char *gaim_mime_part_get_data(GaimMimePart *part); - -/** Get the data portion of a MIME document part, after attempting to - decode it according to the content-transfer-encoding field. If the - specified encoding method is not supported, this function will - return NULL. - - @param part the MIME documemt part - @param data Buffer for the data - @param len The length of the buffer -*/ +/** + * Get the data portion of a MIME document part, after attempting to + * decode it according to the content-transfer-encoding field. If the + * specified encoding method is not supported, this function will + * return NULL. + * + * @param part The MIME documemt part. + * @param data Buffer for the data. + * @param len The length of the buffer. + */ void gaim_mime_part_get_data_decoded(GaimMimePart *part, guchar **data, gsize *len); - -/** Get the length of the data portion of a MIME document part - - @param part the MIME document part - @returns length of the data in the document part -*/ +/** + * Get the length of the data portion of a MIME document part. + * + * @param part The MIME document part. + * @returns Length of the data in the document part. + */ gsize gaim_mime_part_get_length(GaimMimePart *part); - void gaim_mime_part_set_data(GaimMimePart *part, const char *data); - #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <the...@us...> - 2006-08-05 09:17:13
|
Revision: 16643 Author: thekingant Date: 2006-08-05 02:17:09 -0700 (Sat, 05 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16643&view=rev Log Message: ----------- Return g_string_free(str, FALSE) directly instead of assigning str->str to a temporary directory and returning that. Modified Paths: -------------- trunk/src/gtkimhtml.c trunk/src/util.c Modified: trunk/src/gtkimhtml.c =================================================================== --- trunk/src/gtkimhtml.c 2006-08-05 09:11:46 UTC (rev 16642) +++ trunk/src/gtkimhtml.c 2006-08-05 09:17:09 UTC (rev 16643) @@ -220,7 +220,6 @@ int length; GString *clipboard; gchar *tmp; - gchar *ret; if (html == NULL) return NULL; @@ -238,14 +237,8 @@ g_string_append(clipboard, "<!--StartFragment-->\r\n"); g_string_append(clipboard, html); g_string_append(clipboard, "\r\n<!--EndFragment-->"); - ret = clipboard->str; - g_string_free(clipboard, FALSE); -#if 0 /* Debugging for Windows clipboard */ - gaim_debug_info("imhtml clipboard", "from gaim: %s\n", ret); -#endif - - return ret; + return g_string_free(clipboard, FALSE); } static void clipboard_copy_html_win32(GtkIMHtml *imhtml) { @@ -2229,11 +2222,9 @@ e++; } } - g_free(val); - val = ret->str; - g_string_free(ret, FALSE); - return val; + + return g_string_free(ret, FALSE); } static const char *accepted_protocols[] = { Modified: trunk/src/util.c =================================================================== --- trunk/src/util.c 2006-08-05 09:11:46 UTC (rev 16642) +++ trunk/src/util.c 2006-08-05 09:17:09 UTC (rev 16643) @@ -2026,41 +2026,41 @@ char * gaim_unescape_html(const char *html) { - char *unescaped = NULL; + const char *c; + GString *ret; - if (html != NULL) { - const char *c = html; - GString *ret = g_string_new(""); - while (*c) { - if (!strncmp(c, "&", 5)) { - ret = g_string_append_c(ret, '&'); - c += 5; - } else if (!strncmp(c, "<", 4)) { - ret = g_string_append_c(ret, '<'); - c += 4; - } else if (!strncmp(c, ">", 4)) { - ret = g_string_append_c(ret, '>'); - c += 4; - } else if (!strncmp(c, """, 6)) { - ret = g_string_append_c(ret, '"'); - c += 6; - } else if (!strncmp(c, "'", 6)) { - ret = g_string_append_c(ret, '\''); - c += 6; - } else if (!strncmp(c, "<br>", 4)) { - ret = g_string_append_c(ret, '\n'); - c += 4; - } else { - ret = g_string_append_c(ret, *c); - c++; - } + if (html == NULL) + return NULL; + + c = html; + ret = g_string_new(""); + while (*c) { + if (!strncmp(c, "&", 5)) { + ret = g_string_append_c(ret, '&'); + c += 5; + } else if (!strncmp(c, "<", 4)) { + ret = g_string_append_c(ret, '<'); + c += 4; + } else if (!strncmp(c, ">", 4)) { + ret = g_string_append_c(ret, '>'); + c += 4; + } else if (!strncmp(c, """, 6)) { + ret = g_string_append_c(ret, '"'); + c += 6; + } else if (!strncmp(c, "'", 6)) { + ret = g_string_append_c(ret, '\''); + c += 6; + } else if (!strncmp(c, "<br>", 4)) { + ret = g_string_append_c(ret, '\n'); + c += 4; + } else { + ret = g_string_append_c(ret, *c); + c++; } - - unescaped = ret->str; - g_string_free(ret, FALSE); } - return unescaped; + return g_string_free(ret, FALSE); + } char * This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-08-10 18:18:23
|
Revision: 16687 Author: sadrul Date: 2006-08-10 11:18:17 -0700 (Thu, 10 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16687&view=rev Log Message: ----------- I think this is better. Modified Paths: -------------- trunk/src/request.c trunk/src/request.h Modified: trunk/src/request.c =================================================================== --- trunk/src/request.c 2006-08-10 15:44:43 UTC (rev 16686) +++ trunk/src/request.c 2006-08-10 18:18:17 UTC (rev 16687) @@ -865,9 +865,9 @@ } void -gaim_request_field_list_set_selected(GaimRequestField *field, GList *items) +gaim_request_field_list_set_selected(GaimRequestField *field, const GList *items) { - GList *l; + const GList *l; g_return_if_fail(field != NULL); g_return_if_fail(items != NULL); @@ -876,7 +876,7 @@ gaim_request_field_list_clear_selected(field); if (!gaim_request_field_list_get_multi_select(field) && - g_list_length(items) > 1) + g_list_length((GList*)items) > 1) { gaim_debug_warning("request", "More than one item added to non-multi-select " @@ -885,10 +885,10 @@ return; } - field->u.list.selected = items; - - for (l = field->u.list.selected; l != NULL; l = l->next) + for (l = items; l != NULL; l = l->next) { + field->u.list.selected = g_list_append(field->u.list.selected, + g_strdup(l->data)); g_hash_table_insert(field->u.list.selected_table, g_strdup((char *)l->data), NULL); } Modified: trunk/src/request.h =================================================================== --- trunk/src/request.h 2006-08-10 15:44:43 UTC (rev 16686) +++ trunk/src/request.h 2006-08-10 18:18:17 UTC (rev 16687) @@ -909,7 +909,7 @@ * @param items The list of selected items. */ void gaim_request_field_list_set_selected(GaimRequestField *field, - GList *items); + const GList *items); /** * Returns whether or not a particular item is selected in a list field. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <the...@us...> - 2006-08-12 10:12:49
|
Revision: 16712 Author: thekingant Date: 2006-08-12 03:12:43 -0700 (Sat, 12 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16712&view=rev Log Message: ----------- Pretty large commit here. Basically I got sick of having to verify that gc is still valid on all the callback functions for gaim_proxy_connect(). The fix for this for gaim_proxy_connect() to return something that allows the connection attempt to be canceled. It's not quite there yet, but this is a good first step. I changed gaim_proxy_connect() to return a reference to a new GaimProxyConnectInfo (this used to be called PHB). Eventually this can be passed to a function that'll cancel the connection attempt. I also decided to add an error_cb instead of using connect_cb and passing a file descriptor of -1. And proxy.c will also pass an error message to callers which should explain the reason that the connection attempt failed. Oh, and proxy.c now never calls gaim_connection_error() Modified Paths: -------------- trunk/src/ft.c trunk/src/protocols/irc/irc.c trunk/src/protocols/jabber/jabber.c trunk/src/protocols/jabber/si.c trunk/src/protocols/msn/directconn.c trunk/src/protocols/msn/httpconn.c trunk/src/protocols/msn/servconn.c trunk/src/protocols/oscar/oscar.c trunk/src/protocols/oscar/peer.c trunk/src/protocols/oscar/peer.h trunk/src/protocols/oscar/peer_proxy.c trunk/src/protocols/qq/qq_proxy.c trunk/src/protocols/sametime/sametime.c trunk/src/protocols/silc/silc.c trunk/src/protocols/simple/simple.c trunk/src/protocols/yahoo/yahoo.c trunk/src/protocols/yahoo/yahoo_filexfer.c trunk/src/protocols/yahoo/yahoo_picture.c trunk/src/protocols/yahoo/yahoochat.c trunk/src/protocols/yahoo/ycht.c trunk/src/proxy.c trunk/src/proxy.h trunk/src/sslconn.c trunk/src/upnp.c trunk/src/util.c Modified: trunk/src/ft.c =================================================================== --- trunk/src/ft.c 2006-08-12 10:06:15 UTC (rev 16711) +++ trunk/src/ft.c 2006-08-12 10:12:43 UTC (rev 16712) @@ -911,13 +911,13 @@ } static void -connect_cb(gpointer data, gint source, GaimInputCondition condition) +connect_cb(gpointer data, gint source) { GaimXfer *xfer = (GaimXfer *)data; xfer->fd = source; - begin_transfer(xfer, condition); + begin_transfer(xfer, GAIM_INPUT_READ); } void @@ -946,7 +946,7 @@ /* Establish a file descriptor. */ gaim_proxy_connect(xfer->account, xfer->remote_ip, - xfer->remote_port, connect_cb, xfer); + xfer->remote_port, connect_cb, NULL, xfer); return; } Modified: trunk/src/protocols/irc/irc.c =================================================================== --- trunk/src/protocols/irc/irc.c 2006-08-12 10:06:15 UTC (rev 16711) +++ trunk/src/protocols/irc/irc.c 2006-08-12 10:12:43 UTC (rev 16712) @@ -46,7 +46,7 @@ /* static GList *irc_chat_info(GaimConnection *gc); */ static void irc_login(GaimAccount *account); static void irc_login_cb_ssl(gpointer data, GaimSslConnection *gsc, GaimInputCondition cond); -static void irc_login_cb(gpointer data, gint source, GaimInputCondition cond); +static void irc_login_cb(gpointer data, gint source); static void irc_ssl_connect_failure(GaimSslConnection *gsc, GaimSslErrorType error, gpointer data); static void irc_close(GaimConnection *gc); static int irc_im_send(GaimConnection *gc, const char *who, const char *what, GaimMessageFlags flags); @@ -283,7 +283,7 @@ struct irc_conn *irc; char **userparts; const char *username = gaim_account_get_username(account); - int err; + GaimProxyConnectInfo *connect_info; gc = gaim_account_get_connection(account); gc->flags |= GAIM_CONNECTION_NO_NEWLINES; @@ -325,11 +325,11 @@ if (!irc->gsc) { - err = gaim_proxy_connect(account, irc->server, + connect_info = gaim_proxy_connect(account, irc->server, gaim_account_get_int(account, "port", IRC_DEFAULT_PORT), - irc_login_cb, gc); + irc_login_cb, NULL, gc); - if (err || !gaim_account_get_connection(account)) { + if (!connect_info || !gaim_account_get_connection(account)) { gaim_connection_error(gc, _("Couldn't create socket")); return; } @@ -394,7 +394,7 @@ } } -static void irc_login_cb(gpointer data, gint source, GaimInputCondition cond) +static void irc_login_cb(gpointer data, gint source) { GaimConnection *gc = data; struct irc_conn *irc = gc->proto_data; Modified: trunk/src/protocols/jabber/jabber.c =================================================================== --- trunk/src/protocols/jabber/jabber.c 2006-08-12 10:06:15 UTC (rev 16711) +++ trunk/src/protocols/jabber/jabber.c 2006-08-12 10:12:43 UTC (rev 16712) @@ -421,7 +421,7 @@ static void -jabber_login_callback(gpointer data, gint source, GaimInputCondition cond) +jabber_login_callback(gpointer data, gint source) { GaimConnection *gc = data; JabberStream *js = gc->proto_data; @@ -474,12 +474,12 @@ static void jabber_login_connect(JabberStream *js, const char *server, int port) { - int rc; + GaimProxyConnectInfo *connect_info; - rc = gaim_proxy_connect(js->gc->account, server, - port, jabber_login_callback, js->gc); + connect_info = gaim_proxy_connect(js->gc->account, server, + port, jabber_login_callback, NULL, js->gc); - if (rc != 0) + if (connect_info == NULL) gaim_connection_error(js->gc, _("Unable to create socket")); } @@ -862,7 +862,7 @@ const char *connect_server = gaim_account_get_string(account, "connect_server", ""); const char *server; - int rc; + GaimProxyConnectInfo *connect_info; js = gc->proto_data = g_new0(JabberStream, 1); js->gc = gc; @@ -912,11 +912,11 @@ } if(!js->gsc) { - rc = gaim_proxy_connect(account, server, + connect_info = gaim_proxy_connect(account, server, gaim_account_get_int(account, "port", 5222), - jabber_login_callback, gc); + jabber_login_callback, NULL, gc); - if (rc != 0) + if (connect_info == NULL) gaim_connection_error(gc, _("Unable to create socket")); } } Modified: trunk/src/protocols/jabber/si.c =================================================================== --- trunk/src/protocols/jabber/si.c 2006-08-12 10:06:15 UTC (rev 16711) +++ trunk/src/protocols/jabber/si.c 2006-08-12 10:12:43 UTC (rev 16712) @@ -88,7 +88,7 @@ static void jabber_si_bytestreams_attempt_connect(GaimXfer *xfer); -static void jabber_si_bytestreams_connect_cb(gpointer data, gint source, GaimInputCondition cond) +static void jabber_si_bytestreams_connect_cb(gpointer data, gint source) { GaimXfer *xfer = data; JabberSIXfer *jsx = xfer->data; @@ -167,7 +167,7 @@ for(i=0; i<20; i++, p+=2) snprintf(p, 3, "%02x", hashval[i]); - gaim_proxy_connect_socks5(jsx->gpi, dstaddr, 0, jabber_si_bytestreams_connect_cb, xfer); + gaim_proxy_connect_socks5(jsx->gpi, dstaddr, 0, jabber_si_bytestreams_connect_cb, NULL, xfer); g_free(dstaddr); } Modified: trunk/src/protocols/msn/directconn.c =================================================================== --- trunk/src/protocols/msn/directconn.c 2006-08-12 10:06:15 UTC (rev 16711) +++ trunk/src/protocols/msn/directconn.c 2006-08-12 10:12:43 UTC (rev 16712) @@ -368,12 +368,12 @@ } static void -connect_cb(gpointer data, gint source, GaimInputCondition cond) +connect_cb(gpointer data, gint source) { MsnDirectConn* directconn; int fd; - gaim_debug_misc("msn", "directconn: connect_cb: %d, %d.\n", source, cond); + gaim_debug_misc("msn", "directconn: connect_cb: %d\n", source); directconn = data; @@ -423,7 +423,7 @@ msn_directconn_connect(MsnDirectConn *directconn, const char *host, int port) { MsnSession *session; - int r; + GaimProxyConnectInfo *connect_info; g_return_val_if_fail(directconn != NULL, FALSE); g_return_val_if_fail(host != NULL, TRUE); @@ -438,10 +438,10 @@ } #endif - r = gaim_proxy_connect(session->account, host, port, connect_cb, - directconn); + connect_info = gaim_proxy_connect(session->account, host, port, + connect_cb, NULL, directconn); - if (r == 0) + if (connect_info != NULL) { return TRUE; } Modified: trunk/src/protocols/msn/httpconn.c =================================================================== --- trunk/src/protocols/msn/httpconn.c 2006-08-12 10:06:15 UTC (rev 16711) +++ trunk/src/protocols/msn/httpconn.c 2006-08-12 10:12:43 UTC (rev 16712) @@ -693,7 +693,7 @@ } static void -connect_cb(gpointer data, gint source, GaimInputCondition cond) +connect_cb(gpointer data, gint source) { MsnHttpConn *httpconn = data; @@ -729,7 +729,7 @@ gboolean msn_httpconn_connect(MsnHttpConn *httpconn, const char *host, int port) { - int r; + GaimProxyConnectInfo *connect_info; g_return_val_if_fail(httpconn != NULL, FALSE); g_return_val_if_fail(host != NULL, FALSE); @@ -738,10 +738,10 @@ if (httpconn->connected) msn_httpconn_disconnect(httpconn); - r = gaim_proxy_connect(httpconn->session->account, - "gateway.messenger.hotmail.com", 80, connect_cb, httpconn); + connect_info = gaim_proxy_connect(httpconn->session->account, + "gateway.messenger.hotmail.com", 80, connect_cb, NULL, httpconn); - if (r == 0) + if (connect_info != NULL) { httpconn->waiting_response = TRUE; httpconn->connected = TRUE; Modified: trunk/src/protocols/msn/servconn.c =================================================================== --- trunk/src/protocols/msn/servconn.c 2006-08-12 10:06:15 UTC (rev 16711) +++ trunk/src/protocols/msn/servconn.c 2006-08-12 10:12:43 UTC (rev 16712) @@ -166,7 +166,7 @@ **************************************************************************/ static void -connect_cb(gpointer data, gint source, GaimInputCondition cond) +connect_cb(gpointer data, gint source) { MsnServConn *servconn = data; @@ -199,7 +199,7 @@ msn_servconn_connect(MsnServConn *servconn, const char *host, int port) { MsnSession *session; - int r; + GaimProxyConnectInfo *connect_info; g_return_val_if_fail(servconn != NULL, FALSE); g_return_val_if_fail(host != NULL, FALSE); @@ -232,10 +232,10 @@ return TRUE; } - r = gaim_proxy_connect(session->account, host, port, connect_cb, - servconn); + connect_info = gaim_proxy_connect(session->account, host, port, + connect_cb, NULL, servconn); - if (r == 0) + if (connect_info != NULL) { servconn->processing = TRUE; return TRUE; Modified: trunk/src/protocols/oscar/oscar.c =================================================================== --- trunk/src/protocols/oscar/oscar.c 2006-08-12 10:06:15 UTC (rev 16711) +++ trunk/src/protocols/oscar/oscar.c 2006-08-12 10:12:43 UTC (rev 16712) @@ -943,7 +943,7 @@ * on the type of host, we do a few different things here. */ static void -connection_established_cb(gpointer data, gint source, GaimInputCondition cond) +connection_established_cb(gpointer data, gint source) { NewFlapConnectionData *new_conn_data; GaimConnection *gc; @@ -1250,7 +1250,7 @@ if (gaim_proxy_connect(account, gaim_account_get_string(account, "server", OSCAR_DEFAULT_LOGIN_SERVER), gaim_account_get_int(account, "port", OSCAR_DEFAULT_LOGIN_PORT), - connection_established_cb, new_conn_data) < 0) + connection_established_cb, NULL, new_conn_data) == NULL) { gaim_connection_error(gc, _("Couldn't connect to host")); return; @@ -1294,7 +1294,8 @@ GaimConnection *gc = od->gc; GaimAccount *account = gc->account; char *host; int port; - int i, rc; + int i; + GaimProxyConnectInfo *connect_info; NewFlapConnectionData *new_conn_data; va_list ap; struct aim_authresp_info *info; @@ -1366,9 +1367,10 @@ new_conn_data->cookielen = info->cookielen; new_conn_data->cookie = g_memdup(info->cookie, info->cookielen); new_conn_data->data = NULL; - rc = gaim_proxy_connect(gc->account, host, port, connection_established_cb, new_conn_data); + connect_info = gaim_proxy_connect(gc->account, host, port, + connection_established_cb, NULL, new_conn_data); g_free(host); - if (rc < 0) { + if (connect_info == NULL) { gaim_connection_error(gc, _("Could Not Connect")); od->killme = TRUE; return 0; @@ -1479,7 +1481,9 @@ g_free(pos); } -static void straight_to_hell(gpointer data, gint source, GaimInputCondition cond) { +static void +straight_to_hell(gpointer data, gint source) +{ struct pieceofcrap *pos = data; gchar *buf; @@ -1569,7 +1573,8 @@ pos->len = len; pos->modname = g_strdup(modname); - if (gaim_proxy_connect(pos->gc->account, "gaim.sourceforge.net", 80, straight_to_hell, pos) != 0) + if (gaim_proxy_connect(pos->gc->account, "gaim.sourceforge.net", 80, + straight_to_hell, NULL, pos) == NULL) { char buf[256]; if (pos->modname) @@ -1660,7 +1665,7 @@ new_conn_data->data = NULL; } - if (gaim_proxy_connect(account, host, port, connection_established_cb, new_conn_data) != 0) + if (gaim_proxy_connect(account, host, port, connection_established_cb, NULL, new_conn_data) == NULL) { flap_connection_schedule_destroy(new_conn_data->conn, OSCAR_DISCONNECT_COULD_NOT_CONNECT); Modified: trunk/src/protocols/oscar/peer.c =================================================================== --- trunk/src/protocols/oscar/peer.c 2006-08-12 10:06:15 UTC (rev 16711) +++ trunk/src/protocols/oscar/peer.c 2006-08-12 10:12:43 UTC (rev 16712) @@ -470,7 +470,7 @@ * either connected or failed to connect. */ static void -peer_connection_established_cb(gpointer data, gint source, GaimInputCondition cond) +peer_connection_established_cb(gpointer data, gint source) { NewPeerConnectionData *new_conn_data; GaimConnection *gc; @@ -668,7 +668,7 @@ } if (gaim_proxy_connect(account, conn->verifiedip, conn->port, - peer_connection_established_cb, new_conn_data) == 0) + peer_connection_established_cb, NULL, new_conn_data) != NULL) { /* Connecting... */ return; @@ -699,7 +699,7 @@ } if (gaim_proxy_connect(account, conn->clientip, conn->port, - peer_connection_established_cb, new_conn_data) == 0) + peer_connection_established_cb, NULL, new_conn_data) != NULL) { /* Connecting... */ return; @@ -760,7 +760,7 @@ if (gaim_proxy_connect(account, (conn->proxyip != NULL) ? conn->proxyip : PEER_PROXY_SERVER, PEER_PROXY_PORT, - peer_proxy_connection_established_cb, new_conn_data) == 0) + peer_proxy_connection_established_cb, NULL, new_conn_data) != NULL) { /* Connecting... */ return; Modified: trunk/src/protocols/oscar/peer.h =================================================================== --- trunk/src/protocols/oscar/peer.h 2006-08-12 10:06:15 UTC (rev 16711) +++ trunk/src/protocols/oscar/peer.h 2006-08-12 10:12:43 UTC (rev 16712) @@ -254,7 +254,7 @@ /* * For peer proxying */ -void peer_proxy_connection_established_cb(gpointer data, gint source, GaimInputCondition cond); +void peer_proxy_connection_established_cb(gpointer data, gint source); #if 0 int peer_oft_sendheader(OscarData *od, guint16 type, PeerConnection *peer_connection); Modified: trunk/src/protocols/oscar/peer_proxy.c =================================================================== --- trunk/src/protocols/oscar/peer_proxy.c 2006-08-12 10:06:15 UTC (rev 16711) +++ trunk/src/protocols/oscar/peer_proxy.c 2006-08-12 10:12:43 UTC (rev 16712) @@ -326,7 +326,7 @@ * either connected or failed to connect. */ void -peer_proxy_connection_established_cb(gpointer data, gint source, GaimInputCondition cond) +peer_proxy_connection_established_cb(gpointer data, gint source) { NewPeerConnectionData *new_conn_data; GaimConnection *gc; Modified: trunk/src/protocols/qq/qq_proxy.c =================================================================== --- trunk/src/protocols/qq/qq_proxy.c 2006-08-12 10:06:15 UTC (rev 16711) +++ trunk/src/protocols/qq/qq_proxy.c 2006-08-12 10:12:43 UTC (rev 16712) @@ -119,7 +119,7 @@ /* the callback function after socket is built * we setup the qq protocol related configuration here */ -static void _qq_got_login(gpointer data, gint source, GaimInputCondition cond) +static void _qq_got_login(gpointer data, gint source) { qq_data *qd; GaimConnection *gc; @@ -309,7 +309,7 @@ * and qq_udp_proxy.c to add UDP proxy support (thanks henry) * return the socket handle, -1 means fail */ static gint _proxy_connect_full (GaimAccount *account, const gchar *host, guint16 port, - GaimInputFunction func, gpointer data, gboolean use_tcp) + GaimProxyConnectFunction func, gpointer data, gboolean use_tcp) { GaimConnection *gc; qq_data *qd; @@ -319,8 +319,12 @@ qd->server_ip = g_strdup(host); qd->server_port = port; - return use_tcp ? gaim_proxy_connect(account, host, port, func, data) : /* TCP mode */ - _qq_udp_proxy_connect(account, host, port, func, data); /* UDP mode */ + if (use_tcp) + /* TCP mode */ + return (gaim_proxy_connect(account, host, port, func, NULL, data) == NULL); + else + /* UDP mode */ + return _qq_udp_proxy_connect(account, host, port, func, data); } /* establish a generic QQ connection Modified: trunk/src/protocols/sametime/sametime.c =================================================================== --- trunk/src/protocols/sametime/sametime.c 2006-08-12 10:06:15 UTC (rev 16711) +++ trunk/src/protocols/sametime/sametime.c 2006-08-12 10:12:43 UTC (rev 16712) @@ -310,7 +310,7 @@ /* connection functions */ -static void connect_cb(gpointer data, gint source, GaimInputCondition cond); +static void connect_cb(gpointer data, gint source); /* ----- session ------ */ @@ -1409,7 +1409,7 @@ port = gaim_account_get_int(account, MW_KEY_PORT, MW_PLUGIN_DEFAULT_PORT); if(gaim_account_get_bool(account, MW_KEY_FORCE, FALSE) || - gaim_proxy_connect(account, host, port, connect_cb, pd)) { + (gaim_proxy_connect(account, host, port, connect_cb, NULL, pd) == NULL)) { mwSession_forceLogin(session); } @@ -1669,8 +1669,7 @@ /** Callback passed to gaim_proxy_connect when an account is logged in, and if the session logging in receives a redirect message */ -static void connect_cb(gpointer data, gint source, - GaimInputCondition cond) { +static void connect_cb(gpointer data, gint source) { struct mwGaimPluginData *pd = data; GaimConnection *gc = pd->gc; @@ -3684,7 +3683,7 @@ gaim_connection_update_progress(gc, _("Connecting"), 1, MW_CONNECT_STEPS); - if(gaim_proxy_connect(account, host, port, connect_cb, pd)) { + if(gaim_proxy_connect(account, host, port, connect_cb, NULL, pd) == NULL) { gaim_connection_error(gc, _("Unable to connect to host")); } } Modified: trunk/src/protocols/silc/silc.c =================================================================== --- trunk/src/protocols/silc/silc.c 2006-08-12 10:06:15 UTC (rev 16711) +++ trunk/src/protocols/silc/silc.c 2006-08-12 10:12:43 UTC (rev 16712) @@ -141,7 +141,7 @@ } static void -silcgaim_login_connected(gpointer data, gint source, GaimInputCondition cond) +silcgaim_login_connected(gpointer data, gint source) { GaimConnection *gc = data; SilcGaim sg; @@ -367,7 +367,8 @@ gaim_account_get_string(account, "server", "silc.silcnet.org"), gaim_account_get_int(account, "port", 706), - silcgaim_login_connected, gc)) { + silcgaim_login_connected, NULL, gc) == NULL) + { gaim_connection_error(gc, _("Unable to create connection")); return; } Modified: trunk/src/protocols/simple/simple.c =================================================================== --- trunk/src/protocols/simple/simple.c 2006-08-12 10:06:15 UTC (rev 16711) +++ trunk/src/protocols/simple/simple.c 2006-08-12 10:12:43 UTC (rev 16712) @@ -421,7 +421,7 @@ static void simple_input_cb(gpointer data, gint source, GaimInputCondition cond); -static void send_later_cb(gpointer data, gint source, GaimInputCondition cond) { +static void send_later_cb(gpointer data, gint source) { GaimConnection *gc = data; struct simple_account_data *sip = gc->proto_data; struct sip_connection *conn; @@ -448,11 +448,12 @@ static void sendlater(GaimConnection *gc, const char *buf) { struct simple_account_data *sip = gc->proto_data; - int error = 0; + GaimProxyConnectInfo *connect_info; + if(!sip->connecting) { gaim_debug_info("simple", "connecting to %s port %d\n", sip->realhostname ? sip->realhostname : "{NULL}", sip->realport); - error = gaim_proxy_connect(sip->account, sip->realhostname, sip->realport, send_later_cb, gc); - if(error) { + connect_info = gaim_proxy_connect(sip->account, sip->realhostname, sip->realport, send_later_cb, NULL, gc); + if(connect_info == NULL) { gaim_connection_error(gc, _("Couldn't create socket")); } sip->connecting = TRUE; @@ -1452,7 +1453,7 @@ conn->inputhandler = gaim_input_add(newfd, GAIM_INPUT_READ, simple_input_cb, gc); } -static void login_cb(gpointer data, gint source, GaimInputCondition cond) { +static void login_cb(gpointer data, gint source) { GaimConnection *gc = data; struct simple_account_data *sip = gc->proto_data; struct sip_connection *conn; @@ -1536,7 +1537,7 @@ static void simple_tcp_connect_listen_cb(int listenfd, gpointer data) { struct simple_account_data *sip = (struct simple_account_data*) data; - int error = 0; + GaimProxyConnectInfo *connect_info; sip->listenfd = listenfd; if(sip->listenfd == -1) { @@ -1551,9 +1552,9 @@ gaim_debug_info("simple", "connecting to %s port %d\n", sip->realhostname, sip->realport); /* open tcp connection to the server */ - error = gaim_proxy_connect(sip->account, sip->realhostname, - sip->realport, login_cb, sip->gc); - if(error) { + connect_info = gaim_proxy_connect(sip->account, sip->realhostname, + sip->realport, login_cb, NULL, sip->gc); + if(connect_info == NULL) { gaim_connection_error(sip->gc, _("Couldn't create socket")); } } Modified: trunk/src/protocols/yahoo/yahoo.c =================================================================== --- trunk/src/protocols/yahoo/yahoo.c 2006-08-12 10:06:15 UTC (rev 16711) +++ trunk/src/protocols/yahoo/yahoo.c 2006-08-12 10:12:43 UTC (rev 16712) @@ -2239,7 +2239,7 @@ } } -static void yahoo_got_connected(gpointer data, gint source, GaimInputCondition cond) +static void yahoo_got_connected(gpointer data, gint source) { GaimConnection *gc = data; struct yahoo_data *yd; @@ -2266,7 +2266,7 @@ gc->inpa = gaim_input_add(yd->fd, GAIM_INPUT_READ, yahoo_pending, gc); } -static void yahoo_got_web_connected(gpointer data, gint source, GaimInputCondition cond) +static void yahoo_got_web_connected(gpointer data, gint source) { GaimConnection *gc = data; struct yahoo_data *yd; @@ -2348,7 +2348,7 @@ /* Now we have our cookies to login with. I'll go get the milk. */ if (gaim_proxy_connect(account, "wcs2.msg.dcn.yahoo.com", gaim_account_get_int(account, "port", YAHOO_PAGER_PORT), - yahoo_got_web_connected, gc) != 0) { + yahoo_got_web_connected, NULL, gc) == NULL) { gaim_connection_error(gc, _("Connection problem")); return; } @@ -2390,7 +2390,7 @@ gc->inpa = gaim_input_add(source, GAIM_INPUT_READ, yahoo_web_pending, gc); } -static void yahoo_got_cookies(gpointer data, gint source, GaimInputCondition cond) +static void yahoo_got_cookies(gpointer data, gint source) { GaimConnection *gc = data; @@ -2516,7 +2516,7 @@ "Host: login.yahoo.com\r\n\r\n"); g_hash_table_destroy(hash); yd->auth = g_string_free(url, FALSE); - if (gaim_proxy_connect(account, "login.yahoo.com", 80, yahoo_got_cookies, gc) != 0) { + if (gaim_proxy_connect(account, "login.yahoo.com", 80, yahoo_got_cookies, NULL, gc) == NULL) { gaim_connection_error(gc, _("Connection problem")); return; } @@ -2618,7 +2618,7 @@ if (gaim_proxy_connect(account, gaim_account_get_string(account, "serverjp", YAHOOJP_PAGER_HOST), gaim_account_get_int(account, "port", YAHOO_PAGER_PORT), - yahoo_got_connected, gc) != 0) + yahoo_got_connected, NULL, gc) == NULL) { gaim_connection_error(gc, _("Connection problem")); return; @@ -2628,7 +2628,7 @@ if (gaim_proxy_connect(account, gaim_account_get_string(account, "server", YAHOO_PAGER_HOST), gaim_account_get_int(account, "port", YAHOO_PAGER_PORT), - yahoo_got_connected, gc) != 0) + yahoo_got_connected, NULL, gc) == NULL) { gaim_connection_error(gc, _("Connection problem")); return; Modified: trunk/src/protocols/yahoo/yahoo_filexfer.c =================================================================== --- trunk/src/protocols/yahoo/yahoo_filexfer.c 2006-08-12 10:06:15 UTC (rev 16711) +++ trunk/src/protocols/yahoo/yahoo_filexfer.c 2006-08-12 10:12:43 UTC (rev 16712) @@ -92,7 +92,7 @@ } -static void yahoo_receivefile_connected(gpointer data, gint source, GaimInputCondition condition) +static void yahoo_receivefile_connected(gpointer data, gint source) { GaimXfer *xfer; struct yahoo_xfer_data *xd; @@ -162,7 +162,7 @@ gaim_xfer_start(xfer, source, NULL, 0); } -static void yahoo_sendfile_connected(gpointer data, gint source, GaimInputCondition condition) +static void yahoo_sendfile_connected(gpointer data, gint source) { GaimXfer *xfer; struct yahoo_xfer_data *xd; @@ -263,7 +263,7 @@ if (yd->jp) { if (gaim_proxy_connect(account, gaim_account_get_string(account, "xferjp_host", YAHOOJP_XFER_HOST), gaim_account_get_int(account, "xfer_port", YAHOO_XFER_PORT), - yahoo_sendfile_connected, xfer) == -1) + yahoo_sendfile_connected, NULL, xfer) == NULL) { gaim_notify_error(gc, NULL, _("File Transfer Failed"), _("Unable to establish file descriptor.")); @@ -272,7 +272,7 @@ } else { if (gaim_proxy_connect(account, gaim_account_get_string(account, "xfer_host", YAHOO_XFER_HOST), gaim_account_get_int(account, "xfer_port", YAHOO_XFER_PORT), - yahoo_sendfile_connected, xfer) == -1) + yahoo_sendfile_connected, NULL, xfer) == NULL) { gaim_notify_error(gc, NULL, _("File Transfer Failed"), _("Unable to establish file descriptor.")); @@ -280,8 +280,12 @@ } } } else { - xfer->fd = gaim_proxy_connect(account, xfer_data->host, xfer_data->port, - yahoo_receivefile_connected, xfer); + /* TODO: Using xfer->fd like this is probably a bad thing... */ + if (gaim_proxy_connect(account, xfer_data->host, xfer_data->port, + yahoo_receivefile_connected, NULL, xfer) == NULL) + xfer->fd = -1; + else + xfer->fd = 0; if (xfer->fd == -1) { gaim_notify_error(gc, NULL, _("File Transfer Failed"), _("Unable to establish file descriptor.")); Modified: trunk/src/protocols/yahoo/yahoo_picture.c =================================================================== --- trunk/src/protocols/yahoo/yahoo_picture.c 2006-08-12 10:06:15 UTC (rev 16711) +++ trunk/src/protocols/yahoo/yahoo_picture.c 2006-08-12 10:12:43 UTC (rev 16712) @@ -406,7 +406,7 @@ } } -static void yahoo_buddy_icon_upload_connected(gpointer data, gint source, GaimInputCondition condition) +static void yahoo_buddy_icon_upload_connected(gpointer data, gint source) { struct yahoo_buddy_icon_upload_data *d = data; struct yahoo_packet *pkt; @@ -484,7 +484,7 @@ if (yd->jp) { if (gaim_proxy_connect(account, gaim_account_get_string(account, "xferjp_host", YAHOOJP_XFER_HOST), gaim_account_get_int(account, "xfer_port", YAHOO_XFER_PORT), - yahoo_buddy_icon_upload_connected, d) == -1) + yahoo_buddy_icon_upload_connected, NULL, d) == NULL) { gaim_debug_error("yahoo", "Uploading our buddy icon failed to connect.\n"); yahoo_buddy_icon_upload_data_free(d); @@ -492,7 +492,7 @@ } else { if (gaim_proxy_connect(account, gaim_account_get_string(account, "xfer_host", YAHOO_XFER_HOST), gaim_account_get_int(account, "xfer_port", YAHOO_XFER_PORT), - yahoo_buddy_icon_upload_connected, d) == -1) + yahoo_buddy_icon_upload_connected, NULL, d) == NULL) { gaim_debug_error("yahoo", "Uploading our buddy icon failed to connect.\n"); yahoo_buddy_icon_upload_data_free(d); Modified: trunk/src/protocols/yahoo/yahoochat.c =================================================================== --- trunk/src/protocols/yahoo/yahoochat.c 2006-08-12 10:06:15 UTC (rev 16711) +++ trunk/src/protocols/yahoo/yahoochat.c 2006-08-12 10:12:43 UTC (rev 16712) @@ -1373,7 +1373,7 @@ } -static void yahoo_roomlist_got_connected(gpointer data, gint source, GaimInputCondition cond) +static void yahoo_roomlist_got_connected(gpointer data, gint source) { struct yahoo_roomlist *yrl = data; GaimRoomlist *list = yrl->list; @@ -1449,8 +1449,8 @@ gaim_roomlist_set_fields(rl, fields); - if (gaim_proxy_connect(gaim_connection_get_account(gc), - yrl->host, 80, yahoo_roomlist_got_connected, yrl) != 0) + if (gaim_proxy_connect(gaim_connection_get_account(gc), yrl->host, 80, + yahoo_roomlist_got_connected, NULL, yrl) == NULL) { gaim_notify_error(gc, NULL, _("Connection problem"), _("Unable to fetch room list.")); yahoo_roomlist_cleanup(rl, yrl); @@ -1518,8 +1518,8 @@ yrl->ucat = gaim_roomlist_room_new(GAIM_ROOMLIST_ROOMTYPE_CATEGORY, _("User Rooms"), yrl->cat); gaim_roomlist_room_add(list, yrl->ucat); - if (gaim_proxy_connect(list->account, - yrl->host, 80, yahoo_roomlist_got_connected, yrl) != 0) + if (gaim_proxy_connect(list->account, yrl->host, 80, + yahoo_roomlist_got_connected, NULL, yrl) == NULL) { gaim_notify_error(gaim_account_get_connection(list->account), NULL, _("Connection problem"), _("Unable to fetch room list.")); Modified: trunk/src/protocols/yahoo/ycht.c =================================================================== --- trunk/src/protocols/yahoo/ycht.c 2006-08-12 10:06:15 UTC (rev 16711) +++ trunk/src/protocols/yahoo/ycht.c 2006-08-12 10:12:43 UTC (rev 16712) @@ -528,7 +528,7 @@ } } -static void ycht_got_connected(gpointer data, gint source, GaimInputCondition cond) +static void ycht_got_connected(gpointer data, gint source) { YchtConn *ycht = data; GaimConnection *gc = ycht->gc; @@ -571,7 +571,7 @@ if (gaim_proxy_connect(account, gaim_account_get_string(account, "ycht-server", YAHOO_YCHT_HOST), gaim_account_get_int(account, "ycht-port", YAHOO_YCHT_PORT), - ycht_got_connected, ycht) != 0) + ycht_got_connected, NULL, ycht) == NULL) { ycht_connection_error(ycht, _("Connection problem")); return; Modified: trunk/src/proxy.c =================================================================== --- trunk/src/proxy.c 2006-08-12 10:06:15 UTC (rev 16711) +++ trunk/src/proxy.c 2006-08-12 10:12:43 UTC (rev 16712) @@ -38,16 +38,15 @@ #include "proxy.h" #include "util.h" -static GaimProxyInfo *global_proxy_info = NULL; - +/* Does anyone know what PHB stands for? */ struct PHB { - GaimInputFunction func; + GaimProxyConnectFunction connect_cb; + GaimProxyErrorFunction error_cb; gpointer data; char *host; int port; - gint inpa; + guint inpa; GaimProxyInfo *gpi; - GaimAccount *account; GSList *hosts; guchar *write_buffer; gsize write_buf_len; @@ -58,8 +57,6 @@ gsize read_len; }; -static void try_connect(struct PHB *); - static const char *socks5errors[] = { "succeeded\n", "general SOCKS server failure\n", @@ -72,6 +69,11 @@ "Address type not supported\n" }; +static GaimProxyInfo *global_proxy_info = NULL; +static GSList *phbs = NULL; + +static void try_connect(struct PHB *); + /************************************************************************** * Proxy structure API **************************************************************************/ @@ -255,6 +257,63 @@ * Proxy API **************************************************************************/ +static void +gaim_proxy_phb_destroy(struct PHB *phb) +{ + phbs = g_slist_remove(phbs, phb); + + if (phb->inpa > 0) + gaim_input_remove(phb->inpa); + + while (phb->hosts != NULL) + { + /* Discard the length... */ + phb->hosts = g_slist_remove(phb->hosts, phb->hosts->data); + /* Free the address... */ + g_free(phb->hosts->data); + phb->hosts = g_slist_remove(phb->hosts, phb->hosts->data); + } + + g_free(phb->host); + g_free(phb->write_buffer); + g_free(phb->read_buffer); + g_free(phb); +} + +static void +gaim_proxy_phb_connected(struct PHB *phb, int fd) +{ + phb->connect_cb(phb->data, fd); + gaim_proxy_phb_destroy(phb); +} + +/** + * @param error An error message explaining why the connection + * failed. This will be passed to the callback function + * specified in the call to gaim_proxy_connect(). + */ +static void +gaim_proxy_phb_error(struct PHB *phb, const gchar *error_message) +{ + if (phb->error_cb == NULL) + { + /* + * TODO + * While we're transitioning to the new gaim_proxy_connect() + * code, not all callers supply an error_cb. If this is the + * case then they're expecting connect_cb to be called with + * an fd of -1 in the case of an error. Once all callers have + * been changed this whole if statement should be removed. + */ + phb->connect_cb(phb->data, -1); + gaim_proxy_phb_destroy(phb); + return; + } + + phb->error_cb(phb->data, error_message); + gaim_proxy_phb_destroy(phb); +} + #if defined(__unix__) || defined(__APPLE__) /* @@ -264,9 +323,9 @@ typedef struct { char *host; int port; - dns_callback_t callback; + GaimProxyDnsConnectFunction callback; gpointer data; - gint inpa; + guint inpa; int fd_in, fd_out; pid_t dns_pid; } pending_dns_request_t; @@ -285,7 +344,7 @@ typedef struct { dns_params_t params; - dns_callback_t callback; + GaimProxyDnsConnectFunction callback; gpointer data; } queued_dns_request_t; @@ -694,7 +753,7 @@ */ int -gaim_gethostbyname_async(const char *hostname, int port, dns_callback_t callback, gpointer data) +gaim_gethostbyname_async(const char *hostname, int port, GaimProxyDnsConnectFunction callback, gpointer data) { pending_dns_request_t *req = NULL; dns_params_t dns_params; @@ -767,7 +826,7 @@ typedef struct _dns_tdata { char *hostname; int port; - dns_callback_t callback; + GaimProxyDnsConnectFunction callback; gpointer data; GSList *hosts; char *errmsg; @@ -843,7 +902,7 @@ int gaim_gethostbyname_async(const char *hostname, int port, - dns_callback_t callback, gpointer data) + GaimProxyDnsConnectFunction callback, gpointer data) { dns_tdata *td; struct sockaddr_in sin; @@ -882,7 +941,7 @@ gpointer data; size_t addrlen; struct sockaddr *addr; - dns_callback_t callback; + GaimProxyDnsConnectFunction callback; } pending_dns_request_t; static gboolean host_resolved(gpointer data) @@ -898,7 +957,7 @@ int gaim_gethostbyname_async(const char *hostname, int port, - dns_callback_t callback, gpointer data) + GaimProxyDnsConnectFunction callback, gpointer data) { struct sockaddr_in sin; pending_dns_request_t *req; @@ -955,9 +1014,11 @@ if (ret == 0 && error == EINPROGRESS) return; /* we'll be called again later */ if (ret < 0 || error != 0) { - if(ret!=0) error = errno; + if (ret!=0) + error = errno; close(source); gaim_input_remove(phb->inpa); + phb->inpa = 0; gaim_debug_error("proxy", "getsockopt SO_ERROR check: %s\n", strerror(error)); @@ -967,30 +1028,17 @@ } gaim_input_remove(phb->inpa); + phb->inpa = 0; - if (phb->account == NULL || - gaim_account_get_connection(phb->account) != NULL) { - - phb->func(phb->data, source, GAIM_INPUT_READ); - } - - g_free(phb->host); - g_free(phb); + gaim_proxy_phb_connected(phb, source); } static gboolean clean_connect(gpointer data) { struct PHB *phb = data; - if (phb->account == NULL || - gaim_account_get_connection(phb->account) != NULL) { + gaim_proxy_phb_connected(phb, phb->port); - phb->func(phb->data, phb->port, GAIM_INPUT_READ); - } - - g_free(phb->host); - g_free(phb); - return FALSE; } @@ -1037,8 +1085,9 @@ close(fd); return -1; } + /* TODO: Why is the following line so strange? */ phb->port = fd; /* bleh */ - gaim_timeout_add(50, clean_connect, phb); /* we do this because we never + gaim_timeout_add(10, clean_connect, phb); /* we do this because we never want to call our callback before we return. */ } @@ -1059,6 +1108,7 @@ return; else if(ret < 0) { gaim_input_remove(phb->inpa); + phb->inpa = 0; close(source); g_free(phb->write_buffer); phb->write_buffer = NULL; @@ -1080,18 +1130,6 @@ #define HTTP_GOODSTRING "HTTP/1.0 200" #define HTTP_GOODSTRING2 "HTTP/1.1 200" -static void -http_complete(struct PHB *phb, gint source) -{ - gaim_debug_info("http proxy", "proxy connection established\n"); - if(!phb->account || phb->account->gc) { - phb->func(phb->data, source, GAIM_INPUT_READ); - } - g_free(phb->host); - g_free(phb); -} - - /* read the response to the CONNECT request, if we are requesting a non-port-80 tunnel */ static void http_canread(gpointer data, gint source, GaimInputCondition cond) @@ -1101,6 +1139,7 @@ struct PHB *phb = data; guchar *p; gsize max_read; + gchar *msg; if(phb->read_buffer == NULL) { phb->read_buf_len = 8192; @@ -1116,12 +1155,7 @@ return; else if(len <= 0) { close(source); - source = -1; - g_free(phb->read_buffer); - phb->read_buffer = NULL; - gaim_input_remove(phb->inpa); - phb->inpa = 0; - http_complete(phb, source); + gaim_proxy_phb_error(phb, _("Lost connection with server for an unknown reason.")); return; } else { phb->read_len += len; @@ -1137,7 +1171,8 @@ return; error = strncmp((const char *)phb->read_buffer, "HTTP/", 5) != 0; - if(!error) { + if (!error) + { int major; p = phb->read_buffer + 5; major = strtol((const char *)p, (char **)&p, 10); @@ -1157,7 +1192,8 @@ /* Read the contents */ p = (guchar *)g_strrstr((const gchar *)phb->read_buffer, "Content-Length: "); - if(p != NULL) { + if (p != NULL) + { gchar *tmp; int len = 0; char tmpc; @@ -1180,25 +1216,22 @@ } } - if(error) { - gaim_debug_error("proxy", - "Unable to parse proxy's response: %s\n", + if (error) + { + close(source); + msg = g_strdup_printf("Unable to parse response from HTTP proxy: %s\n", phb->read_buffer); - close(source); - source = -1; - g_free(phb->read_buffer); - phb->read_buffer = NULL; - gaim_input_remove(phb->inpa); - phb->inpa = 0; - http_complete(phb, source); + gaim_proxy_phb_error(phb, msg); + g_free(msg); return; - } else if(status != 200) { + } + else if (status != 200) + { gaim_debug_error("proxy", "Proxy server replied with:\n%s\n", phb->read_buffer); - /* XXX: why in the hell are we calling gaim_connection_error() here? */ if(status == 407 /* Proxy Auth */) { gchar *ntlm; if((ntlm = g_strrstr((const gchar *)phb->read_buffer, "Proxy-Authenticate: NTLM "))) { /* Check for Type-2 */ @@ -1208,19 +1241,13 @@ gchar *username; gchar *request; gchar *response; - if(!(username = strchr(domain, '\\'))) { - char *msg = g_strdup_printf(_("Proxy connection error %d"), status); + username = strchr(domain, '\\'); + if (username == NULL) + { close(source); - source = -1; - if(phb->account) - gaim_connection_error(phb->account->gc, msg); - else - gaim_debug_error("http proxy", "%s\n", msg); + msg = g_strdup_printf(_("HTTP proxy connection error %d"), status); + gaim_proxy_phb_error(phb, msg); g_free(msg); - gaim_input_remove(phb->inpa); - g_free(phb->read_buffer); - g_free(phb->host); - g_free(phb); return; } *username = '\0'; @@ -1264,19 +1291,13 @@ gchar *domain = (gchar*) gaim_proxy_info_get_username(phb->gpi); gchar *username; int request_len; - if(!(username = strchr(domain, '\\'))) { - char *msg = g_strdup_printf(_("Proxy connection error %d"), status); + username = strchr(domain, '\\'); + if (username == NULL) + { close(source); - source = -1; - if(phb->account) - gaim_connection_error(phb->account->gc, msg); - else - gaim_debug_error("http proxy", "%s\n", msg); + msg = g_strdup_printf(_("HTTP proxy connection error %d"), status); + gaim_proxy_phb_error(phb, msg); g_free(msg); - gaim_input_remove(phb->inpa); - g_free(phb->read_buffer); - g_free(phb->host); - g_free(phb); return; } *username = '\0'; @@ -1313,49 +1334,29 @@ proxy_do_write(phb, source, cond); return; } else { - char *msg = g_strdup_printf(_("Proxy connection error %d"), status); close(source); - source = -1; - if(phb->account) - gaim_connection_error(phb->account->gc, msg); - else - gaim_debug_error("http proxy", "%s\n", msg); + msg = g_strdup_printf(_("HTTP proxy connection error %d"), status); + gaim_proxy_phb_error(phb, msg); g_free(msg); - gaim_input_remove(phb->inpa); - g_free(phb->read_buffer); - g_free(phb->host); - g_free(phb); return; } } if(status == 403 /* Forbidden */ ) { - gchar *msg = g_strdup_printf(_("Access denied: proxy server forbids port %d tunnelling."), phb->port); - if(phb->account) - gaim_connection_error(phb->account->gc, msg); - else - gaim_debug_error("http proxy", "%s\n", msg); + msg = g_strdup_printf(_("Access denied: HTTP proxy server forbids port %d tunnelling."), phb->port); + gaim_proxy_phb_error(phb, msg); g_free(msg); - gaim_input_remove(phb->inpa); - g_free(phb->read_buffer); - g_free(phb->host); - g_free(phb); } else { - char *msg = g_strdup_printf(_("Proxy connection error %d"), status); - if(phb->account) - gaim_connection_error(phb->account->gc, msg); - else - gaim_debug_error("http proxy", "%s\n", msg); + msg = g_strdup_printf(_("HTTP proxy connection error %d"), status); + gaim_proxy_phb_error(phb, msg); g_free(msg); - gaim_input_remove(phb->inpa); - g_free(phb->read_buffer); - g_free(phb->host); - g_free(phb); } } else { gaim_input_remove(phb->inpa); + phb->inpa = 0; g_free(phb->read_buffer); phb->read_buffer = NULL; - http_complete(phb, source); + gaim_debug_info("proxy", "HTTP proxy connection established\n"); + gaim_proxy_phb_connected(phb, source); return; } } @@ -1374,7 +1375,10 @@ gaim_debug_info("http proxy", "Connected.\n"); if (phb->inpa > 0) + { gaim_input_remove(phb->inpa); + phb->inpa = 0; + } len = sizeof(error); @@ -1456,7 +1460,8 @@ phb->inpa = gaim_input_add(fd, GAIM_INPUT_WRITE, http_canwrite, phb); } else { - http_complete(phb, fd); + gaim_debug_info("proxy", "HTTP proxy connection established\n"); + gaim_proxy_phb_connected(phb, fd); } } else { close(fd); @@ -1507,21 +1512,13 @@ return; else if (len + phb->read_len >= 4) { if (phb->read_buffer[1] == 90) { - if (phb->account == NULL || - gaim_account_get_connection(phb->account) != NULL) { - - phb->func(phb->data, source, GAIM_INPUT_READ); - } - - gaim_input_remove(phb->inpa); - g_free(phb->read_buffer); - g_free(phb->host); - g_free(phb); + gaim_proxy_phb_connected(phb, source); return; } } gaim_input_remove(phb->inpa); + phb->inpa = 0; g_free(phb->read_buffer); phb->read_buffer = NULL; @@ -1542,7 +1539,10 @@ gaim_debug_info("socks4 proxy", "Connected.\n"); if (phb->inpa > 0) + { gaim_input_remove(phb->inpa); + phb->inpa = 0; + } len = sizeof(error); @@ -1662,6 +1662,7 @@ gaim_debug_warning("socks5 proxy", "or not...\n"); close(source); gaim_input_remove(phb->inpa); + phb->inpa = 0; g_free(phb->read_buffer); phb->read_buffer = NULL; try_connect(phb); @@ -1679,6 +1680,7 @@ gaim_debug_error("socks5 proxy", "Bad data.\n"); close(source); gaim_input_remove(phb->inpa); + phb->inpa = 0; g_free(phb->read_buffer); phb->read_buffer = NULL; try_connect(phb); @@ -1715,20 +1717,11 @@ /* Skip past BND.PORT */ buf += 2; - if (phb->account == NULL || - gaim_account_get_connection(phb->account) != NULL) { - - phb->func(phb->data, source, GAIM_INPUT_READ); - } - - gaim_input_remove(phb->inpa); - g_free(phb->read_buffer); - g_free(phb->host); - g_free(phb); + gaim_proxy_phb_connected(phb, source); } static void -s5_sendconnect(gpointer data, gint source) +s5_sendconnect(gpointer data, int source) { struct PHB *phb = data; int hlen = strlen(phb->host); @@ -1749,7 +1742,6 @@ phb->inpa = gaim_input_add(source, GAIM_INPUT_WRITE, proxy_do_write, phb); proxy_do_write(phb, source, GAIM_INPUT_WRITE); - } static void @@ -1773,6 +1765,7 @@ else if(len <= 0) { close(source); gaim_input_remove(phb->inpa); + phb->inpa = 0; g_free(phb->read_buffer); phb->read_buffer = NULL; try_connect(phb); @@ -1784,6 +1777,7 @@ return; gaim_input_remove(phb->inpa); + phb->inpa = 0; if ((phb->read_buffer[0] != 0x01) || (phb->read_buffer[1] != 0x00)) { close(source); @@ -1865,6 +1859,7 @@ else if(len <= 0) { close(source); gaim_input_remove(phb->inpa); + phb->inpa = 0; g_free(phb->read_buffer); phb->read_buffer = NULL; try_connect(phb); @@ -1880,6 +1875,7 @@ if (*cmdbuf != 0x01) { close(source); gaim_input_remove(phb->inpa); + phb->inpa = 0; g_free(phb->read_buffer); phb->read_buffer = NULL; try_connect(phb); @@ -1901,6 +1897,7 @@ /* Did auth work? */ if (buf[0] == 0x00) { gaim_input_remove(phb->inpa); + phb->inpa = 0; g_free(phb->read_buffer); phb->read_buffer = NULL; /* Success */ @@ -1913,6 +1910,7 @@ "failed. Disconnecting..."); close(source); gaim_input_remove(phb->inpa); + phb->inpa = 0; g_free(phb->read_buffer); phb->read_buffer = NULL; try_connect(phb); @@ -1957,6 +1955,7 @@ "Disconnecting..."); close(source); gaim_input_remove(phb->inpa); + phb->inpa = 0; g_free(phb->read_buffer); phb->read_buffer = NULL; try_connect(phb); @@ -1992,6 +1991,7 @@ else if(len <= 0) { close(source); gaim_input_remove(phb->inpa); + phb->inpa = 0; g_free(phb->read_buffer); phb->read_buffer = NULL; try_connect(phb); @@ -2003,6 +2003,7 @@ return; gaim_input_remove(phb->inpa); + phb->inpa = 0; if ((phb->read_buffer[0] != 0x05) || (phb->read_buffer[1] == 0xff)) { close(source); @@ -2094,7 +2095,10 @@ gaim_debug_info("socks5 proxy", "Connected.\n"); if (phb->inpa > 0) + { gaim_input_remove(phb->inpa); + phb->inpa = 0; + } len = sizeof(error); if (getsockopt(source, SOL_SOCKET, SO_ERROR, &error, &len) < 0) { @@ -2225,14 +2229,7 @@ } if (ret < 0) { - if (phb->account == NULL || - gaim_account_get_connection(phb->account) != NULL) { - - phb->func(phb->data, -1, GAIM_INPUT_READ); - } - - g_free(phb->host); - g_free(phb); + gaim_proxy_phb_error(phb, _("TODO")); } } @@ -2313,31 +2310,26 @@ return gpi; } -/* - * TODO: It would be really good if this returned some sort of handle - * that we could use to cancel the connection. As it is now, - * each callback has to check to make sure gc is still valid. - * And that is ugly. - */ -int +GaimProxyConnectInfo * gaim_proxy_connect(GaimAccount *account, const char *host, int port, - GaimInputFunction func, gpointer data) + GaimProxyConnectFunction connect_cb, + GaimProxyErrorFunction error_cb, gpointer data) { const char *connecthost = host; int connectport = port; struct PHB *phb; - g_return_val_if_fail(host != NULL, -1); - g_return_val_if_fail(port != 0 && port != -1, -1); - g_return_val_if_fail(func != NULL, -1); + g_return_val_if_fail(host != NULL, NULL); + g_return_val_if_fail(port > 0, NULL); + g_return_val_if_fail(connect_cb != NULL, NULL); + /* g_return_val_if_fail(error_cb != NULL, NULL); *//* TODO: Soon! */ phb = g_new0(struct PHB, 1); - - phb->func = func; + phb->connect_cb = connect_cb; + phb->error_cb = error_cb; phb->data = data; phb->host = g_strdup(host); phb->port = port; - phb->account = account; phb->gpi = gaim_proxy_get_setup(account); if ((gaim_proxy_info_get_type(phb->gpi) != GAIM_PROXY_NONE) && @@ -2345,9 +2337,8 @@ gaim_proxy_info_get_port(phb->gpi) <= 0)) { gaim_notify_error(NULL, NULL, _("Invalid proxy settings"), _("Either the host name or port number specified for your given proxy type is invalid.")); - g_free(phb->host); - g_free(phb); - return -1; + gaim_proxy_phb_destroy(phb); + return NULL; } switch (gaim_proxy_info_get_type(phb->gpi)) @@ -2364,30 +2355,55 @@ break; default: - g_free(phb->host); - g_free(phb); - return -1; + gaim_proxy_phb_destroy(phb); + return NULL; } - return gaim_gethostbyname_async(connecthost, connectport, - connection_host_resolved, phb); + if (gaim_gethostbyname_async(connecthost, + connectport, connection_host_resolved, phb) != 0) + { + gaim_proxy_phb_destroy(phb); + return NULL; + } + + phbs = g_slist_prepend(phbs, phb); + + return phb; } -int +/* + * Combine some of this code with gaim_proxy_connect() + */ +GaimProxyConnectInfo * gaim_proxy_connect_socks5(GaimProxyInfo *gpi, const char *host, int port, - GaimInputFunction func, gpointer data) + GaimProxyConnectFunction connect_cb, + GaimProxyErrorFunction error_cb, gpointer data) { struct PHB *phb; + g_return_val_if_fail(host != NULL, NULL); + g_return_val_if_fail(port > 0, NULL); + g_return_val_if_fail(connect_cb != NULL, NULL); + /* g_return_val_if_fail(error_cb != NULL, NULL); *//* TODO: Soon! */ + phb = g_new0(struct PHB, 1); - phb->gpi = gpi; - phb->func = func; + phb->connect_cb = connect_cb; + phb->error_cb = error_cb; phb->data = data; phb->host = g_strdup(host); phb->port = port; + phb->gpi = gpi; - return gaim_gethostbyname_async(gaim_proxy_info_get_host(gpi), - gaim_proxy_info_get_port(gpi), connection_host_resolved, phb); + if (gaim_gethostbyname_async(gaim_proxy_info_get_host(gpi), + gaim_proxy_info_get_port(gpi), connection_host_resolved, phb) != 0) + { + gaim_proxy_phb_destroy(phb); + return NULL; + } + + phbs = g_slist_prepend(phbs, phb); + + return phb; } @@ -2425,6 +2441,14 @@ gaim_proxy_info_set_password(info, value); } +void * +gaim_proxy_get_handle() +{ + static int handle; + + return &handle; +} + void gaim_proxy_init(void) { @@ -2459,10 +2483,9 @@ #endif } -void * -gaim_proxy_get_handle() +void +gaim_proxy_uninit(void) { - static int handle; - - return &handle; + while (phbs != NULL) + gaim_proxy_phb_destroy(phbs->data); } Modified: trunk/src/proxy.h =================================================================== --- trunk/src/proxy.h 2006-08-12 10:06:15 UTC (rev 16711) +++ trunk/src/proxy.h 2006-08-12 10:12:43 UTC (rev 16712) @@ -56,7 +56,18 @@ } GaimProxyInfo; +typedef struct PBH GaimProxyConnectInfo; +typedef void (*GaimProxyConnectFunction)(gpointer data, gint source); +typedef void (*GaimProxyErrorFunction)(gpointer dat, const gchar *error_message); + +/** + * The "hosts" parameter is a linked list containing pairs of + * one size_t addrlen and one struct sockaddr *addr. + */ +typedef void (*GaimProxyDnsConnectFunction)(GSList *hosts, gpointer data, const char *error_message); + + #include "account.h" #ifdef __cplusplus @@ -69,13 +80,6 @@ /*@{*/ /** - * Get the handle for the proxy system. - * - * @return the handle to the proxy system - */ -void *gaim_proxy_get_handle(void); - -/** * Creates a proxy information structure. * * @return The proxy information structure. @@ -196,11 +200,23 @@ /*@{*/ /** + * Returns the proxy subsystem handle. + * + * @return The proxy subsystem handle. + */ +void *gaim_proxy_get_handle(void); + +/** * Initializes the proxy subsystem. */ void gaim_proxy_init(void); /** + * Uninitializes the proxy subsystem. + */ +void gaim_proxy_uninit(void); + +/** * Returns configuration of a proxy. * * @param account The account for which the configuration is needed. @@ -210,35 +226,50 @@ GaimProxyInfo *gaim_proxy_get_setup(GaimAccount *account); /** - * Makes a connection to the specified host and port. + * Makes a connection to the specified host and port. Note that this + * function name can be misleading--although it is called "proxy + * connect," it is used for establishing any outgoing TCP connection, + * whether through a proxy or not. * - * @param account The account making the connection. - * @param host The destination host. - * @param port The destination port. - * @param func The input handler function. - * @param data User-defined data. + * @param account The account making the connection. + * @param host The destination host. + * @param port The destination port. + * @param connect_cb The function to call when the connection is + * established. + * @param error_cb The function to call if there is an error while + * establishing the connection. + * @param data User-defined data. * - * @return Zero indicates the connection is pending. Any other value indicates failure. + * @return NULL if there was an error, or a reference to a data + * structure that can be used to cancel the pending + * connection, if needed. */ -int gaim_proxy_connect(GaimAccount *account, const char *host, int port, - GaimInputFunction func, gpointer data); +GaimProxyConnectInfo *gaim_proxy_connect(GaimAccount *account, + const char *host, int port, + GaimProxyConnectFunction connect_cb, + GaimProxyErrorFunction error_cb, gpointer data); /** * Makes a connection through a SOCKS5 proxy. * - * @param gpi The GaimProxyInfo specifying the proxy settings - * @param host The destination host. - * @param port The destination port. - * @param func The input handler function. - * @param data User-defined data. + * @param gpi The GaimProxyInfo specifying the proxy settings + * @param host The destination host. + * @param port The destination port. + * @param connect_cb The function to call when the connection is + * established. + * @param error_cb The function to call if there is an error while + * establishing the connection. + * @param data User-defined data. * - * @return Zero indicates the connection is pending. Any other value indicates failure. + * @return NULL if there was an error, or a reference to a data + * structure that can be used to cancel the pending + * connection, if needed. */ -int gaim_proxy_connect_socks5(GaimProxyInfo *gpi, const char *host, int port, - GaimInputFunction func, gpointer data); +GaimProxyConnectInfo *gaim_proxy_connect_socks5(GaimProxyInfo *gpi, + const char *host, int port, + GaimProxyConnectFunction connect_cb, + GaimProxyErrorFunction error_cb, gpointer data); -typedef void (*dns_callback_t)(GSList *hosts, gpointer data, - const char *error_message); /** * Do an async dns query * @@ -249,7 +280,7 @@ * * @return Zero indicates the connection is pending. Any other value indicates failure. */ -int gaim_gethostbyname_async(const char *hostname, int port, dns_callback_t callback, gpointer data); +int gaim_gethostbyname_async(const char *hostname, int port, GaimProxyDnsConnectFunction callback, gpointer data); /*@}*/ Modified: trunk/src/sslconn.c =================================================================== --- trunk/src/sslconn.c 2006-08-12 10:06:15 UTC (rev 16711) +++ trunk/src/sslconn.c 2006-08-12 10:12:43 UTC (rev 16712) @@ -69,7 +69,7 @@ { GaimSslConnection *gsc; GaimSslOps *ops; - int i; + GaimProxyConnectInfo *connect_info; g_return_val_if_fail(host != NULL, NULL); g_return_val_if_fail(port != 0 && port != -1, NULL); @@ -95,9 +95,9 @@ gsc->connect_cb = func; gsc->error_cb = error_func; - i = gaim_proxy_connect(account, host, port, ops->connect_cb, gsc); + connect_info = gaim_proxy_connect(account, host, port, ops->connect_cb, NULL, gsc); - if (i < 0) + if (connect_info == NULL) { g_free(gsc->host); g_free(gsc); Modified: trunk/src/upnp.c =================================================================== --- trunk/src/upnp.c 2006-08-12 10:06:15 UTC (rev 16711) +++ trunk/src/upnp.c 2006-08-12 10:12:43 UTC (rev 16712) @@ -780,15 +780,15 @@ } static void -looked_up_internal_ip_cb(gpointer data, gint sock, GaimInputCondition cond) +looked_up_internal_ip_cb(gpointer data, gint source) { - if (sock) { + if (source) { strncpy(control_info.internalip, - gaim_network_get_local_system_ip(sock), + gaim_network_get_local_system_ip(source), sizeof(control_info.internalip)); gaim_debug_info("upnp", "Local IP: %s\n", control_info.internalip); - close(sock); + close(source); } else gaim_debug_info("upnp", "Unable to look up local IP\n"); @@ -811,8 +811,8 @@ } if(gaim_proxy_connect(NULL, addressOfControl, port, - looked_up_internal_ip_cb, NULL) != 0) { - + looked_up_internal_ip_cb, NULL, NULL) == NULL) + { gaim_debug_error("upnp", "Get Local IP Connect Failed: Address: %s @@@ Port %d\n", addressOfControl, port); } Modified: trunk/src/util.c =================================================================== --- trunk/src/util.c 2006-08-12 10:06:15 UTC (rev 16711) +++ trunk/src/util.c 2006-08-12 10:12:43 UTC (rev 16712) @@ -3367,7 +3367,7 @@ } static void -url_fetch_connect_cb(gpointer url_data, gint source, GaimInputCondition cond) +url_fetch_connect_cb(gpointer url_data, gint source) { GaimFetchUrlData *gfud; @@ -3448,7 +3448,8 @@ &gfud->website.page, &gfud->website.user, &gfud->website.passwd); if (gaim_proxy_connect(NULL, gfud->website.address, - gfud->website.port, url_fetch_connect_cb, gfud) != 0) { + gfud->website.port, url_fetch_connect_cb, NULL, gfud) == NULL) + { destroy_fetch_url_data(gfud); cb(user_data, g_strdup(_("g003: Error opening connection.\n")), 0); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <the...@us...> - 2006-08-12 10:20:24
|
Revision: 16713 Author: thekingant Date: 2006-08-12 03:20:19 -0700 (Sat, 12 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16713&view=rev Log Message: ----------- Rename struct PHB to struct _GaimProxyConnectInfo Modified Paths: -------------- trunk/src/proxy.c trunk/src/proxy.h Modified: trunk/src/proxy.c =================================================================== --- trunk/src/proxy.c 2006-08-12 10:12:43 UTC (rev 16712) +++ trunk/src/proxy.c 2006-08-12 10:20:19 UTC (rev 16713) @@ -39,7 +39,7 @@ #include "util.h" /* Does anyone know what PHB stands for? */ -struct PHB { +struct _GaimProxyConnectInfo { GaimProxyConnectFunction connect_cb; GaimProxyErrorFunction error_cb; gpointer data; @@ -72,7 +72,7 @@ static GaimProxyInfo *global_proxy_info = NULL; static GSList *phbs = NULL; -static void try_connect(struct PHB *); +static void try_connect(struct _GaimProxyConnectInfo *); /************************************************************************** * Proxy structure API @@ -258,7 +258,7 @@ **************************************************************************/ static void -gaim_proxy_phb_destroy(struct PHB *phb) +gaim_proxy_phb_destroy(struct _GaimProxyConnectInfo *phb) { phbs = g_slist_remove(phbs, phb); @@ -281,7 +281,7 @@ } static void -gaim_proxy_phb_connected(struct PHB *phb, int fd) +gaim_proxy_phb_connected(struct _GaimProxyConnectInfo *phb, int fd) { phb->connect_cb(phb->data, fd); gaim_proxy_phb_destroy(phb); @@ -293,7 +293,7 @@ * specified in the call to gaim_proxy_connect(). */ static void -gaim_proxy_phb_error(struct PHB *phb, const gchar *error_message) +gaim_proxy_phb_error(struct _GaimProxyConnectInfo *phb, const gchar *error_message) { if (phb->error_cb == NULL) { @@ -991,7 +991,7 @@ static void no_one_calls(gpointer data, gint source, GaimInputCondition cond) { - struct PHB *phb = data; + struct _GaimProxyConnectInfo *phb = data; socklen_t len; int error=0, ret; @@ -1035,7 +1035,7 @@ static gboolean clean_connect(gpointer data) { - struct PHB *phb = data; + struct _GaimProxyConnectInfo *phb = data; gaim_proxy_phb_connected(phb, phb->port); @@ -1044,7 +1044,7 @@ static int -proxy_connect_none(struct PHB *phb, struct sockaddr *addr, socklen_t addrlen) +proxy_connect_none(struct _GaimProxyConnectInfo *phb, struct sockaddr *addr, socklen_t addrlen) { int fd = -1; @@ -1098,7 +1098,7 @@ static void proxy_do_write(gpointer data, gint source, GaimInputCondition cond) { - struct PHB *phb = data; + struct _GaimProxyConnectInfo *phb = data; const guchar *request = phb->write_buffer + phb->written_len; gsize request_len = phb->write_buf_len - phb->written_len; @@ -1136,7 +1136,7 @@ { int len, headers_len, status = 0; gboolean error; - struct PHB *phb = data; + struct _GaimProxyConnectInfo *phb = data; guchar *p; gsize max_read; gchar *msg; @@ -1368,7 +1368,7 @@ { char request[8192]; int request_len = 0; - struct PHB *phb = data; + struct _GaimProxyConnectInfo *phb = data; socklen_t len; int error = ETIMEDOUT; @@ -1431,7 +1431,7 @@ } static int -proxy_connect_http(struct PHB *phb, struct sockaddr *addr, socklen_t addrlen) +proxy_connect_http(struct _GaimProxyConnectInfo *phb, struct sockaddr *addr, socklen_t addrlen) { int fd = -1; @@ -1490,7 +1490,7 @@ static void s4_canread(gpointer data, gint source, GaimInputCondition cond) { - struct PHB *phb = data; + struct _GaimProxyConnectInfo *phb = data; guchar *buf; int len, max_read; @@ -1532,7 +1532,7 @@ { unsigned char packet[9]; struct hostent *hp; - struct PHB *phb = data; + struct _GaimProxyConnectInfo *phb = data; socklen_t len; int error = ETIMEDOUT; @@ -1589,7 +1589,7 @@ } static int -proxy_connect_socks4(struct PHB *phb, struct sockaddr *addr, socklen_t addrlen) +proxy_connect_socks4(struct _GaimProxyConnectInfo *phb, struct sockaddr *addr, socklen_t addrlen) { int fd = -1; @@ -1641,7 +1641,7 @@ s5_canread_again(gpointer data, gint source, GaimInputCondition cond) { guchar *dest, *buf; - struct PHB *phb = data; + struct _GaimProxyConnectInfo *phb = data; int len; if (phb->read_buffer == NULL) { @@ -1723,7 +1723,7 @@ static void s5_sendconnect(gpointer data, int source) { - struct PHB *phb = data; + struct _GaimProxyConnectInfo *phb = data; int hlen = strlen(phb->host); phb->write_buf_len = 5 + hlen + 2; phb->write_buffer = g_malloc(phb->write_buf_len); @@ -1747,7 +1747,7 @@ static void s5_readauth(gpointer data, gint source, GaimInputCondition cond) { - struct PHB *phb = data; + struct _GaimProxyConnectInfo *phb = data; int len; if (phb->read_buffer == NULL) { @@ -1840,7 +1840,7 @@ s5_readchap(gpointer data, gint source, GaimInputCondition cond) { guchar *cmdbuf, *buf; - struct PHB *phb = data; + struct _GaimProxyConnectInfo *phb = data; int len, navas, currentav; gaim_debug(GAIM_DEBUG_INFO, "socks5 proxy", "Got CHAP response.\n"); @@ -1973,7 +1973,7 @@ static void s5_canread(gpointer data, gint source, GaimInputCondition cond) { - struct PHB *phb = data; + struct _GaimProxyConnectInfo *phb = data; int len; if (phb->read_buffer == NULL) { @@ -2088,7 +2088,7 @@ { unsigned char buf[5]; int i; - struct PHB *phb = data; + struct _GaimProxyConnectInfo *phb = data; socklen_t len; int error = ETIMEDOUT; @@ -2135,7 +2135,7 @@ } static int -proxy_connect_socks5(struct PHB *phb, struct sockaddr *addr, socklen_t addrlen) +proxy_connect_socks5(struct _GaimProxyConnectInfo *phb, struct sockaddr *addr, socklen_t addrlen) { int fd = -1; @@ -2185,7 +2185,7 @@ return fd; } -static void try_connect(struct PHB *phb) +static void try_connect(struct _GaimProxyConnectInfo *phb) { size_t addrlen; struct sockaddr *addr; @@ -2237,7 +2237,7 @@ connection_host_resolved(GSList *hosts, gpointer data, const char *error_message) { - struct PHB *phb = (struct PHB*)data; + struct _GaimProxyConnectInfo *phb = (struct _GaimProxyConnectInfo*)data; phb->hosts = hosts; @@ -2317,14 +2317,14 @@ { const char *connecthost = host; int connectport = port; - struct PHB *phb; + struct _GaimProxyConnectInfo *phb; g_return_val_if_fail(host != NULL, NULL); g_return_val_if_fail(port > 0, NULL); g_return_val_if_fail(connect_cb != NULL, NULL); /* g_return_val_if_fail(error_cb != NULL, NULL); *//* TODO: Soon! */ - phb = g_new0(struct PHB, 1); + phb = g_new0(struct _GaimProxyConnectInfo, 1); phb->connect_cb = connect_cb; phb->error_cb = error_cb; phb->data = data; @@ -2379,14 +2379,14 @@ GaimProxyConnectFunction connect_cb, GaimProxyErrorFunction error_cb, gpointer data) { - struct PHB *phb; + struct _GaimProxyConnectInfo *phb; g_return_val_if_fail(host != NULL, NULL); g_return_val_if_fail(port > 0, NULL); g_return_val_if_fail(connect_cb != NULL, NULL); /* g_return_val_if_fail(error_cb != NULL, NULL); *//* TODO: Soon! */ - phb = g_new0(struct PHB, 1); + phb = g_new0(struct _GaimProxyConnectInfo, 1); phb->connect_cb = connect_cb; phb->error_cb = error_cb; phb->data = data; Modified: trunk/src/proxy.h =================================================================== --- trunk/src/proxy.h 2006-08-12 10:12:43 UTC (rev 16712) +++ trunk/src/proxy.h 2006-08-12 10:20:19 UTC (rev 16713) @@ -56,7 +56,7 @@ } GaimProxyInfo; -typedef struct PBH GaimProxyConnectInfo; +typedef struct _GaimProxyConnectInfo GaimProxyConnectInfo; typedef void (*GaimProxyConnectFunction)(gpointer data, gint source); typedef void (*GaimProxyErrorFunction)(gpointer dat, const gchar *error_message); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <the...@us...> - 2006-08-12 20:40:13
|
Revision: 16725 Author: thekingant Date: 2006-08-12 13:40:07 -0700 (Sat, 12 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16725&view=rev Log Message: ----------- Rename "phb" to "connect_info" everywhere Modified Paths: -------------- trunk/plugins/ChangeLog.API trunk/src/proxy.c Modified: trunk/plugins/ChangeLog.API =================================================================== --- trunk/plugins/ChangeLog.API 2006-08-12 20:01:35 UTC (rev 16724) +++ trunk/plugins/ChangeLog.API 2006-08-12 20:40:07 UTC (rev 16725) @@ -114,6 +114,9 @@ * All network activity has been updated to use non-blocking sockets. This means that plugins must be updated to expect such a socket from gaim_proxy_connect() and gaim_network_listen*(). + * gaim_proxy_connect(): changed to return NULL on error and a void * + handle on success, and changed parameters. It is now possible to + cancel connection attempts. * gaim_gtk_create_imhtml(): Added sw_ret() parameter * gaim_account_get_log(): Added create parameter * GAIM_CMD_P_VERYHIGH is now GAIM_CMD_P_VERY_HIGH Modified: trunk/src/proxy.c =================================================================== --- trunk/src/proxy.c 2006-08-12 20:01:35 UTC (rev 16724) +++ trunk/src/proxy.c 2006-08-12 20:40:07 UTC (rev 16725) @@ -69,7 +69,7 @@ }; static GaimProxyInfo *global_proxy_info = NULL; -static GSList *phbs = NULL; +static GSList *connect_infos = NULL; static void try_connect(struct _GaimProxyConnectInfo *); @@ -257,33 +257,33 @@ **************************************************************************/ static void -gaim_proxy_phb_destroy(struct _GaimProxyConnectInfo *phb) +gaim_proxy_connect_info_destroy(struct _GaimProxyConnectInfo *connect_info) { - phbs = g_slist_remove(phbs, phb); + connect_infos = g_slist_remove(connect_infos, connect_info); - if (phb->inpa > 0) - gaim_input_remove(phb->inpa); + if (connect_info->inpa > 0) + gaim_input_remove(connect_info->inpa); - while (phb->hosts != NULL) + while (connect_info->hosts != NULL) { /* Discard the length... */ - phb->hosts = g_slist_remove(phb->hosts, phb->hosts->data); + connect_info->hosts = g_slist_remove(connect_info->hosts, connect_info->hosts->data); /* Free the address... */ - g_free(phb->hosts->data); - phb->hosts = g_slist_remove(phb->hosts, phb->hosts->data); + g_free(connect_info->hosts->data); + connect_info->hosts = g_slist_remove(connect_info->hosts, connect_info->hosts->data); } - g_free(phb->host); - g_free(phb->write_buffer); - g_free(phb->read_buffer); - g_free(phb); + g_free(connect_info->host); + g_free(connect_info->write_buffer); + g_free(connect_info->read_buffer); + g_free(connect_info); } static void -gaim_proxy_phb_connected(struct _GaimProxyConnectInfo *phb, int fd) +gaim_proxy_connect_info_connected(struct _GaimProxyConnectInfo *connect_info, int fd) { - phb->connect_cb(phb->data, fd); - gaim_proxy_phb_destroy(phb); + connect_info->connect_cb(connect_info->data, fd); + gaim_proxy_connect_info_destroy(connect_info); } /** @@ -292,9 +292,9 @@ * specified in the call to gaim_proxy_connect(). */ static void -gaim_proxy_phb_error(struct _GaimProxyConnectInfo *phb, const gchar *error_message) +gaim_proxy_connect_info_error(struct _GaimProxyConnectInfo *connect_info, const gchar *error_message) { - if (phb->error_cb == NULL) + if (connect_info->error_cb == NULL) { /* * TODO @@ -304,13 +304,13 @@ * an fd of -1 in the case of an error. Once all callers have * been changed this whole if statement should be removed. */ - phb->connect_cb(phb->data, -1); - gaim_proxy_phb_destroy(phb); + connect_info->connect_cb(connect_info->data, -1); + gaim_proxy_connect_info_destroy(connect_info); return; } - phb->error_cb(phb->data, error_message); - gaim_proxy_phb_destroy(phb); + connect_info->error_cb(connect_info->data, error_message); + gaim_proxy_connect_info_destroy(connect_info); } #if defined(__unix__) || defined(__APPLE__) @@ -990,7 +990,7 @@ static void no_one_calls(gpointer data, gint source, GaimInputCondition cond) { - struct _GaimProxyConnectInfo *phb = data; + struct _GaimProxyConnectInfo *connect_info = data; socklen_t len; int error=0, ret; @@ -1016,39 +1016,39 @@ if (ret!=0) error = errno; close(source); - gaim_input_remove(phb->inpa); - phb->inpa = 0; + gaim_input_remove(connect_info->inpa); + connect_info->inpa = 0; gaim_debug_error("proxy", "getsockopt SO_ERROR check: %s\n", strerror(error)); - try_connect(phb); + try_connect(connect_info); return; } - gaim_input_remove(phb->inpa); - phb->inpa = 0; + gaim_input_remove(connect_info->inpa); + connect_info->inpa = 0; - gaim_proxy_phb_connected(phb, source); + gaim_proxy_connect_info_connected(connect_info, source); } static gboolean clean_connect(gpointer data) { - struct _GaimProxyConnectInfo *phb = data; + struct _GaimProxyConnectInfo *connect_info = data; - gaim_proxy_phb_connected(phb, phb->port); + gaim_proxy_connect_info_connected(connect_info, connect_info->port); return FALSE; } static int -proxy_connect_none(struct _GaimProxyConnectInfo *phb, struct sockaddr *addr, socklen_t addrlen) +proxy_connect_none(struct _GaimProxyConnectInfo *connect_info, struct sockaddr *addr, socklen_t addrlen) { int fd = -1; gaim_debug_info("proxy", - "Connecting to %s:%d with no proxy\n", phb->host, phb->port); + "Connecting to %s:%d with no proxy\n", connect_info->host, connect_info->port); if ((fd = socket(addr->sa_family, SOCK_STREAM, 0)) < 0) { gaim_debug_error("proxy", @@ -1065,7 +1065,7 @@ /* This just confuses people. */ /* gaim_debug_warning("proxy", "Connect would have blocked.\n"); */ - phb->inpa = gaim_input_add(fd, GAIM_INPUT_WRITE, no_one_calls, phb); + connect_info->inpa = gaim_input_add(fd, GAIM_INPUT_WRITE, no_one_calls, connect_info); } else { gaim_debug_error("proxy", @@ -1085,8 +1085,8 @@ return -1; } /* TODO: Why is the following line so strange? */ - phb->port = fd; /* bleh */ - gaim_timeout_add(10, clean_connect, phb); /* we do this because we never + connect_info->port = fd; /* bleh */ + gaim_timeout_add(10, clean_connect, connect_info); /* we do this because we never want to call our callback before we return. */ } @@ -1097,33 +1097,33 @@ static void proxy_do_write(gpointer data, gint source, GaimInputCondition cond) { - struct _GaimProxyConnectInfo *phb = data; - const guchar *request = phb->write_buffer + phb->written_len; - gsize request_len = phb->write_buf_len - phb->written_len; + struct _GaimProxyConnectInfo *connect_info = data; + const guchar *request = connect_info->write_buffer + connect_info->written_len; + gsize request_len = connect_info->write_buf_len - connect_info->written_len; int ret = write(source, request, request_len); if(ret < 0 && errno == EAGAIN) return; else if(ret < 0) { - gaim_input_remove(phb->inpa); - phb->inpa = 0; + gaim_input_remove(connect_info->inpa); + connect_info->inpa = 0; close(source); - g_free(phb->write_buffer); - phb->write_buffer = NULL; - try_connect(phb); + g_free(connect_info->write_buffer); + connect_info->write_buffer = NULL; + try_connect(connect_info); return; } else if (ret < request_len) { - phb->written_len += ret; + connect_info->written_len += ret; return; } - gaim_input_remove(phb->inpa); - g_free(phb->write_buffer); - phb->write_buffer = NULL; + gaim_input_remove(connect_info->inpa); + g_free(connect_info->write_buffer); + connect_info->write_buffer = NULL; /* register the response handler for the response */ - phb->inpa = gaim_input_add(source, GAIM_INPUT_READ, phb->read_cb, phb); + connect_info->inpa = gaim_input_add(source, GAIM_INPUT_READ, connect_info->read_cb, connect_info); } #define HTTP_GOODSTRING "HTTP/1.0 200" @@ -1135,45 +1135,45 @@ { int len, headers_len, status = 0; gboolean error; - struct _GaimProxyConnectInfo *phb = data; + struct _GaimProxyConnectInfo *connect_info = data; guchar *p; gsize max_read; gchar *msg; - if(phb->read_buffer == NULL) { - phb->read_buf_len = 8192; - phb->read_buffer = g_malloc(phb->read_buf_len); - phb->read_len = 0; + if(connect_info->read_buffer == NULL) { + connect_info->read_buf_len = 8192; + connect_info->read_buffer = g_malloc(connect_info->read_buf_len); + connect_info->read_len = 0; } - p = phb->read_buffer + phb->read_len; - max_read = phb->read_buf_len - phb->read_len - 1; + p = connect_info->read_buffer + connect_info->read_len; + max_read = connect_info->read_buf_len - connect_info->read_len - 1; len = read(source, p, max_read); if(len < 0 && errno == EAGAIN) return; else if(len <= 0) { close(source); - gaim_proxy_phb_error(phb, _("Lost connection with server for an unknown reason.")); + gaim_proxy_connect_info_error(connect_info, _("Lost connection with server for an unknown reason.")); return; } else { - phb->read_len += len; + connect_info->read_len += len; } p[len] = '\0'; - if((p = (guchar *)g_strstr_len((const gchar *)phb->read_buffer, phb->read_len, "\r\n\r\n"))) { + if((p = (guchar *)g_strstr_len((const gchar *)connect_info->read_buffer, connect_info->read_len, "\r\n\r\n"))) { *p = '\0'; - headers_len = (p - phb->read_buffer) + 4; + headers_len = (p - connect_info->read_buffer) + 4; } else if(len == max_read) headers_len = len; else return; - error = strncmp((const char *)phb->read_buffer, "HTTP/", 5) != 0; + error = strncmp((const char *)connect_info->read_buffer, "HTTP/", 5) != 0; if (!error) { int major; - p = phb->read_buffer + 5; + p = connect_info->read_buffer + 5; major = strtol((const char *)p, (char **)&p, 10); error = (major == 0) || (*p != '.'); if(!error) { @@ -1190,7 +1190,7 @@ } /* Read the contents */ - p = (guchar *)g_strrstr((const gchar *)phb->read_buffer, "Content-Length: "); + p = (guchar *)g_strrstr((const gchar *)connect_info->read_buffer, "Content-Length: "); if (p != NULL) { gchar *tmp; @@ -1205,7 +1205,7 @@ *tmp = '\r'; /* Compensate for what has already been read */ - len -= phb->read_len - headers_len; + len -= connect_info->read_len - headers_len; /* I'm assuming that we're doing this to prevent the server from complaining / breaking since we don't read the whole page */ while(len--) { @@ -1219,8 +1219,8 @@ { close(source); msg = g_strdup_printf("Unable to parse response from HTTP proxy: %s\n", - phb->read_buffer); - gaim_proxy_phb_error(phb, msg); + connect_info->read_buffer); + gaim_proxy_connect_info_error(connect_info, msg); g_free(msg); return; } @@ -1228,15 +1228,15 @@ { gaim_debug_error("proxy", "Proxy server replied with:\n%s\n", - phb->read_buffer); + connect_info->read_buffer); if(status == 407 /* Proxy Auth */) { gchar *ntlm; - if((ntlm = g_strrstr((const gchar *)phb->read_buffer, "Proxy-Authenticate: NTLM "))) { /* Check for Type-2 */ + if((ntlm = g_strrstr((const gchar *)connect_info->read_buffer, "Proxy-Authenticate: NTLM "))) { /* Check for Type-2 */ gchar *tmp = ntlm; guint8 *nonce; - gchar *domain = (gchar*)gaim_proxy_info_get_username(phb->gpi); + gchar *domain = (gchar*)gaim_proxy_info_get_username(connect_info->gpi); gchar *username; gchar *request; gchar *response; @@ -1245,7 +1245,7 @@ { close(source); msg = g_strdup_printf(_("HTTP proxy connection error %d"), status); - gaim_proxy_phb_error(phb, msg); + gaim_proxy_connect_info_error(connect_info, msg); g_free(msg); return; } @@ -1256,8 +1256,8 @@ *tmp = '\0'; nonce = gaim_ntlm_parse_type2(ntlm, NULL); response = gaim_ntlm_gen_type3(username, - (gchar*) gaim_proxy_info_get_password(phb->gpi), - (gchar*) gaim_proxy_info_get_host(phb->gpi), + (gchar*) gaim_proxy_info_get_password(connect_info->gpi), + (gchar*) gaim_proxy_info_get_host(connect_info->gpi), domain, nonce, NULL); username--; *username = '\\'; @@ -1266,28 +1266,28 @@ "Host: %s:%d\r\n" "Proxy-Authorization: NTLM %s\r\n" "Proxy-Connection: Keep-Alive\r\n\r\n", - phb->host, phb->port, phb->host, - phb->port, response); + connect_info->host, connect_info->port, connect_info->host, + connect_info->port, response); g_free(response); - gaim_input_remove(phb->inpa); - g_free(phb->read_buffer); - phb->read_buffer = NULL; + gaim_input_remove(connect_info->inpa); + g_free(connect_info->read_buffer); + connect_info->read_buffer = NULL; - phb->write_buffer = (guchar *)request; - phb->write_buf_len = strlen(request); - phb->written_len = 0; + connect_info->write_buffer = (guchar *)request; + connect_info->write_buf_len = strlen(request); + connect_info->written_len = 0; - phb->read_cb = http_canread; + connect_info->read_cb = http_canread; - phb->inpa = gaim_input_add(source, - GAIM_INPUT_WRITE, proxy_do_write, phb); + connect_info->inpa = gaim_input_add(source, + GAIM_INPUT_WRITE, proxy_do_write, connect_info); - proxy_do_write(phb, source, cond); + proxy_do_write(connect_info, source, cond); return; - } else if((ntlm = g_strrstr((const char *)phb->read_buffer, "Proxy-Authenticate: NTLM"))) { /* Empty message */ + } else if((ntlm = g_strrstr((const char *)connect_info->read_buffer, "Proxy-Authenticate: NTLM"))) { /* Empty message */ gchar request[2048]; - gchar *domain = (gchar*) gaim_proxy_info_get_username(phb->gpi); + gchar *domain = (gchar*) gaim_proxy_info_get_username(connect_info->gpi); gchar *username; int request_len; username = strchr(domain, '\\'); @@ -1295,7 +1295,7 @@ { close(source); msg = g_strdup_printf(_("HTTP proxy connection error %d"), status); - gaim_proxy_phb_error(phb, msg); + gaim_proxy_connect_info_error(connect_info, msg); g_free(msg); return; } @@ -1304,8 +1304,8 @@ request_len = g_snprintf(request, sizeof(request), "CONNECT %s:%d HTTP/1.1\r\n" "Host: %s:%d\r\n", - phb->host, phb->port, - phb->host, phb->port); + connect_info->host, connect_info->port, + connect_info->host, connect_info->port); g_return_if_fail(request_len < sizeof(request)); request_len += g_snprintf(request + request_len, @@ -1313,49 +1313,49 @@ "Proxy-Authorization: NTLM %s\r\n" "Proxy-Connection: Keep-Alive\r\n\r\n", gaim_ntlm_gen_type1( - (gchar*) gaim_proxy_info_get_host(phb->gpi), + (gchar*) gaim_proxy_info_get_host(connect_info->gpi), domain)); *username = '\\'; - gaim_input_remove(phb->inpa); - g_free(phb->read_buffer); - phb->read_buffer = NULL; + gaim_input_remove(connect_info->inpa); + g_free(connect_info->read_buffer); + connect_info->read_buffer = NULL; - phb->write_buffer = g_memdup(request, request_len); - phb->write_buf_len = request_len; - phb->written_len = 0; + connect_info->write_buffer = g_memdup(request, request_len); + connect_info->write_buf_len = request_len; + connect_info->written_len = 0; - phb->read_cb = http_canread; + connect_info->read_cb = http_canread; - phb->inpa = gaim_input_add(source, - GAIM_INPUT_WRITE, proxy_do_write, phb); + connect_info->inpa = gaim_input_add(source, + GAIM_INPUT_WRITE, proxy_do_write, connect_info); - proxy_do_write(phb, source, cond); + proxy_do_write(connect_info, source, cond); return; } else { close(source); msg = g_strdup_printf(_("HTTP proxy connection error %d"), status); - gaim_proxy_phb_error(phb, msg); + gaim_proxy_connect_info_error(connect_info, msg); g_free(msg); return; } } if(status == 403 /* Forbidden */ ) { - msg = g_strdup_printf(_("Access denied: HTTP proxy server forbids port %d tunnelling."), phb->port); - gaim_proxy_phb_error(phb, msg); + msg = g_strdup_printf(_("Access denied: HTTP proxy server forbids port %d tunnelling."), connect_info->port); + gaim_proxy_connect_info_error(connect_info, msg); g_free(msg); } else { msg = g_strdup_printf(_("HTTP proxy connection error %d"), status); - gaim_proxy_phb_error(phb, msg); + gaim_proxy_connect_info_error(connect_info, msg); g_free(msg); } } else { - gaim_input_remove(phb->inpa); - phb->inpa = 0; - g_free(phb->read_buffer); - phb->read_buffer = NULL; + gaim_input_remove(connect_info->inpa); + connect_info->inpa = 0; + g_free(connect_info->read_buffer); + connect_info->read_buffer = NULL; gaim_debug_info("proxy", "HTTP proxy connection established\n"); - gaim_proxy_phb_connected(phb, source); + gaim_proxy_connect_info_connected(connect_info, source); return; } } @@ -1367,16 +1367,16 @@ { char request[8192]; int request_len = 0; - struct _GaimProxyConnectInfo *phb = data; + struct _GaimProxyConnectInfo *connect_info = data; socklen_t len; int error = ETIMEDOUT; gaim_debug_info("http proxy", "Connected.\n"); - if (phb->inpa > 0) + if (connect_info->inpa > 0) { - gaim_input_remove(phb->inpa); - phb->inpa = 0; + gaim_input_remove(connect_info->inpa); + connect_info->inpa = 0; } len = sizeof(error); @@ -1384,22 +1384,22 @@ if (getsockopt(source, SOL_SOCKET, SO_ERROR, &error, &len) < 0) { close(source); - try_connect(phb); + try_connect(connect_info); return; } gaim_debug_info("proxy", "using CONNECT tunnelling for %s:%d\n", - phb->host, phb->port); + connect_info->host, connect_info->port); request_len = g_snprintf(request, sizeof(request), "CONNECT %s:%d HTTP/1.1\r\nHost: %s:%d\r\n", - phb->host, phb->port, phb->host, phb->port); + connect_info->host, connect_info->port, connect_info->host, connect_info->port); - if (gaim_proxy_info_get_username(phb->gpi) != NULL) { + if (gaim_proxy_info_get_username(connect_info->gpi) != NULL) { char *t1, *t2; t1 = g_strdup_printf("%s:%s", - gaim_proxy_info_get_username(phb->gpi), - gaim_proxy_info_get_password(phb->gpi) ? - gaim_proxy_info_get_password(phb->gpi) : ""); + gaim_proxy_info_get_username(connect_info->gpi), + gaim_proxy_info_get_password(connect_info->gpi) ? + gaim_proxy_info_get_password(connect_info->gpi) : ""); t2 = gaim_base64_encode((const guchar *)t1, strlen(t1)); g_free(t1); g_return_if_fail(request_len < sizeof(request)); @@ -1410,35 +1410,35 @@ "Proxy-Authorization: NTLM %s\r\n" "Proxy-Connection: Keep-Alive\r\n", t2, gaim_ntlm_gen_type1( - (gchar*)gaim_proxy_info_get_host(phb->gpi),"")); + (gchar*)gaim_proxy_info_get_host(connect_info->gpi),"")); g_free(t2); } g_return_if_fail(request_len < sizeof(request)); strcpy(request + request_len, "\r\n"); request_len += 2; - phb->write_buffer = g_memdup(request, request_len); - phb->write_buf_len = request_len; - phb->written_len = 0; + connect_info->write_buffer = g_memdup(request, request_len); + connect_info->write_buf_len = request_len; + connect_info->written_len = 0; - phb->read_cb = http_canread; + connect_info->read_cb = http_canread; - phb->inpa = gaim_input_add(source, GAIM_INPUT_WRITE, proxy_do_write, - phb); + connect_info->inpa = gaim_input_add(source, GAIM_INPUT_WRITE, proxy_do_write, + connect_info); - proxy_do_write(phb, source, cond); + proxy_do_write(connect_info, source, cond); } static int -proxy_connect_http(struct _GaimProxyConnectInfo *phb, struct sockaddr *addr, socklen_t addrlen) +proxy_connect_http(struct _GaimProxyConnectInfo *connect_info, struct sockaddr *addr, socklen_t addrlen) { int fd = -1; gaim_debug_info("http proxy", "Connecting to %s:%d via %s:%d using HTTP\n", - (phb->host ? phb->host : "(null)"), phb->port, - (gaim_proxy_info_get_host(phb->gpi) ? gaim_proxy_info_get_host(phb->gpi) : "(null)"), - gaim_proxy_info_get_port(phb->gpi)); + (connect_info->host ? connect_info->host : "(null)"), connect_info->port, + (gaim_proxy_info_get_host(connect_info->gpi) ? gaim_proxy_info_get_host(connect_info->gpi) : "(null)"), + gaim_proxy_info_get_port(connect_info->gpi)); if ((fd = socket(addr->sa_family, SOCK_STREAM, 0)) < 0) { return -1; @@ -1454,13 +1454,13 @@ gaim_debug_warning("http proxy", "Connect would have blocked.\n"); - if (phb->port != 80) { + if (connect_info->port != 80) { /* we need to do CONNECT first */ - phb->inpa = gaim_input_add(fd, GAIM_INPUT_WRITE, - http_canwrite, phb); + connect_info->inpa = gaim_input_add(fd, GAIM_INPUT_WRITE, + http_canwrite, connect_info); } else { gaim_debug_info("proxy", "HTTP proxy connection established\n"); - gaim_proxy_phb_connected(phb, fd); + gaim_proxy_connect_info_connected(connect_info, fd); } } else { close(fd); @@ -1479,7 +1479,7 @@ close(fd); return -1; } - http_canwrite(phb, fd, GAIM_INPUT_WRITE); + http_canwrite(connect_info, fd, GAIM_INPUT_WRITE); } return fd; @@ -1489,41 +1489,41 @@ static void s4_canread(gpointer data, gint source, GaimInputCondition cond) { - struct _GaimProxyConnectInfo *phb = data; + struct _GaimProxyConnectInfo *connect_info = data; guchar *buf; int len, max_read; /* This is really not going to block under normal circumstances, but to * be correct, we deal with the unlikely scenario */ - if (phb->read_buffer == NULL) { - phb->read_buf_len = 12; - phb->read_buffer = g_malloc(phb->read_buf_len); - phb->read_len = 0; + if (connect_info->read_buffer == NULL) { + connect_info->read_buf_len = 12; + connect_info->read_buffer = g_malloc(connect_info->read_buf_len); + connect_info->read_len = 0; } - buf = phb->read_buffer + phb->read_len; - max_read = phb->read_buf_len - phb->read_len; + buf = connect_info->read_buffer + connect_info->read_len; + max_read = connect_info->read_buf_len - connect_info->read_len; len = read(source, buf, max_read); - if ((len < 0 && errno == EAGAIN) || (len > 0 && len + phb->read_len < 4)) + if ((len < 0 && errno == EAGAIN) || (len > 0 && len + connect_info->read_len < 4)) return; - else if (len + phb->read_len >= 4) { - if (phb->read_buffer[1] == 90) { - gaim_proxy_phb_connected(phb, source); + else if (len + connect_info->read_len >= 4) { + if (connect_info->read_buffer[1] == 90) { + gaim_proxy_connect_info_connected(connect_info, source); return; } } - gaim_input_remove(phb->inpa); - phb->inpa = 0; - g_free(phb->read_buffer); - phb->read_buffer = NULL; + gaim_input_remove(connect_info->inpa); + connect_info->inpa = 0; + g_free(connect_info->read_buffer); + connect_info->read_buffer = NULL; close(source); - try_connect(phb); + try_connect(connect_info); } static void @@ -1531,16 +1531,16 @@ { unsigned char packet[9]; struct hostent *hp; - struct _GaimProxyConnectInfo *phb = data; + struct _GaimProxyConnectInfo *connect_info = data; socklen_t len; int error = ETIMEDOUT; gaim_debug_info("socks4 proxy", "Connected.\n"); - if (phb->inpa > 0) + if (connect_info->inpa > 0) { - gaim_input_remove(phb->inpa); - phb->inpa = 0; + gaim_input_remove(connect_info->inpa); + connect_info->inpa = 0; } len = sizeof(error); @@ -1548,7 +1548,7 @@ if (getsockopt(source, SOL_SOCKET, SO_ERROR, &error, &len) < 0) { close(source); - try_connect(phb); + try_connect(connect_info); return; } @@ -1560,43 +1560,43 @@ * with an option, or some detection mechanism - in the * meantime, stick with plain old SOCKS4. */ - if (!(hp = gethostbyname(phb->host))) { + if (!(hp = gethostbyname(connect_info->host))) { close(source); - try_connect(phb); + try_connect(connect_info); return; } packet[0] = 4; packet[1] = 1; - packet[2] = phb->port >> 8; - packet[3] = phb->port & 0xff; + packet[2] = connect_info->port >> 8; + packet[3] = connect_info->port & 0xff; packet[4] = (unsigned char)(hp->h_addr_list[0])[0]; packet[5] = (unsigned char)(hp->h_addr_list[0])[1]; packet[6] = (unsigned char)(hp->h_addr_list[0])[2]; packet[7] = (unsigned char)(hp->h_addr_list[0])[3]; packet[8] = 0; - phb->write_buffer = g_memdup(packet, sizeof(packet)); - phb->write_buf_len = sizeof(packet); - phb->written_len = 0; - phb->read_cb = s4_canread; + connect_info->write_buffer = g_memdup(packet, sizeof(packet)); + connect_info->write_buf_len = sizeof(packet); + connect_info->written_len = 0; + connect_info->read_cb = s4_canread; - phb->inpa = gaim_input_add(source, GAIM_INPUT_WRITE, proxy_do_write, phb); + connect_info->inpa = gaim_input_add(source, GAIM_INPUT_WRITE, proxy_do_write, connect_info); - proxy_do_write(phb, source, cond); + proxy_do_write(connect_info, source, cond); } static int -proxy_connect_socks4(struct _GaimProxyConnectInfo *phb, struct sockaddr *addr, socklen_t addrlen) +proxy_connect_socks4(struct _GaimProxyConnectInfo *connect_info, struct sockaddr *addr, socklen_t addrlen) { int fd = -1; gaim_debug_info("socks4 proxy", "Connecting to %s:%d via %s:%d using SOCKS4\n", - phb->host, phb->port, - gaim_proxy_info_get_host(phb->gpi), - gaim_proxy_info_get_port(phb->gpi)); + connect_info->host, connect_info->port, + gaim_proxy_info_get_host(connect_info->gpi), + gaim_proxy_info_get_port(connect_info->gpi)); if ((fd = socket(addr->sa_family, SOCK_STREAM, 0)) < 0) return -1; @@ -1610,7 +1610,7 @@ if ((errno == EINPROGRESS) || (errno == EINTR)) { gaim_debug_warning("socks4 proxy", "Connect would have blocked.\n"); - phb->inpa = gaim_input_add(fd, GAIM_INPUT_WRITE, s4_canwrite, phb); + connect_info->inpa = gaim_input_add(fd, GAIM_INPUT_WRITE, s4_canwrite, connect_info); } else { close(fd); @@ -1630,7 +1630,7 @@ return -1; } - s4_canwrite(phb, fd, GAIM_INPUT_WRITE); + s4_canwrite(connect_info, fd, GAIM_INPUT_WRITE); } return fd; @@ -1640,36 +1640,36 @@ s5_canread_again(gpointer data, gint source, GaimInputCondition cond) { guchar *dest, *buf; - struct _GaimProxyConnectInfo *phb = data; + struct _GaimProxyConnectInfo *connect_info = data; int len; - if (phb->read_buffer == NULL) { - phb->read_buf_len = 512; - phb->read_buffer = g_malloc(phb->read_buf_len); - phb->read_len = 0; + if (connect_info->read_buffer == NULL) { + connect_info->read_buf_len = 512; + connect_info->read_buffer = g_malloc(connect_info->read_buf_len); + connect_info->read_len = 0; } - dest = phb->read_buffer + phb->read_len; - buf = phb->read_buffer; + dest = connect_info->read_buffer + connect_info->read_len; + buf = connect_info->read_buffer; gaim_debug_info("socks5 proxy", "Able to read again.\n"); - len = read(source, dest, (phb->read_buf_len - phb->read_len)); + len = read(source, dest, (connect_info->read_buf_len - connect_info->read_len)); if(len < 0 && errno == EAGAIN) return; else if(len <= 0) { gaim_debug_warning("socks5 proxy", "or not...\n"); close(source); - gaim_input_remove(phb->inpa); - phb->inpa = 0; - g_free(phb->read_buffer); - phb->read_buffer = NULL; - try_connect(phb); + gaim_input_remove(connect_info->inpa); + connect_info->inpa = 0; + g_free(connect_info->read_buffer); + connect_info->read_buffer = NULL; + try_connect(connect_info); return; } - phb->read_len += len; + connect_info->read_len += len; - if(phb->read_len < 4) + if(connect_info->read_len < 4) return; if ((buf[0] != 0x05) || (buf[1] != 0x00)) { @@ -1678,118 +1678,118 @@ else gaim_debug_error("socks5 proxy", "Bad data.\n"); close(source); - gaim_input_remove(phb->inpa); - phb->inpa = 0; - g_free(phb->read_buffer); - phb->read_buffer = NULL; - try_connect(phb); + gaim_input_remove(connect_info->inpa); + connect_info->inpa = 0; + g_free(connect_info->read_buffer); + connect_info->read_buffer = NULL; + try_connect(connect_info); return; } /* Skip past BND.ADDR */ switch(buf[3]) { case 0x01: /* the address is a version-4 IP address, with a length of 4 octets */ - if(phb->read_len < 4 + 4) + if(connect_info->read_len < 4 + 4) return; buf += 4 + 4; break; case 0x03: /* the address field contains a fully-qualified domain name. The first octet of the address field contains the number of octets of name that follow, there is no terminating NUL octet. */ - if(phb->read_len < 4 + 1) + if(connect_info->read_len < 4 + 1) return; buf += 4 + 1; - if(phb->read_len < 4 + 1 + buf[0]) + if(connect_info->read_len < 4 + 1 + buf[0]) return; buf += buf[0]; break; case 0x04: /* the address is a version-6 IP address, with a length of 16 octets */ - if(phb->read_len < 4 + 16) + if(connect_info->read_len < 4 + 16) return; buf += 4 + 16; break; } - if(phb->read_len < (buf - phb->read_buffer) + 2) + if(connect_info->read_len < (buf - connect_info->read_buffer) + 2) return; /* Skip past BND.PORT */ buf += 2; - gaim_proxy_phb_connected(phb, source); + gaim_proxy_connect_info_connected(connect_info, source); } static void s5_sendconnect(gpointer data, int source) { - struct _GaimProxyConnectInfo *phb = data; - int hlen = strlen(phb->host); - phb->write_buf_len = 5 + hlen + 2; - phb->write_buffer = g_malloc(phb->write_buf_len); - phb->written_len = 0; + struct _GaimProxyConnectInfo *connect_info = data; + int hlen = strlen(connect_info->host); + connect_info->write_buf_len = 5 + hlen + 2; + connect_info->write_buffer = g_malloc(connect_info->write_buf_len); + connect_info->written_len = 0; - phb->write_buffer[0] = 0x05; - phb->write_buffer[1] = 0x01; /* CONNECT */ - phb->write_buffer[2] = 0x00; /* reserved */ - phb->write_buffer[3] = 0x03; /* address type -- host name */ - phb->write_buffer[4] = hlen; - memcpy(phb->write_buffer + 5, phb->host, hlen); - phb->write_buffer[5 + hlen] = phb->port >> 8; - phb->write_buffer[5 + hlen + 1] = phb->port & 0xff; + connect_info->write_buffer[0] = 0x05; + connect_info->write_buffer[1] = 0x01; /* CONNECT */ + connect_info->write_buffer[2] = 0x00; /* reserved */ + connect_info->write_buffer[3] = 0x03; /* address type -- host name */ + connect_info->write_buffer[4] = hlen; + memcpy(connect_info->write_buffer + 5, connect_info->host, hlen); + connect_info->write_buffer[5 + hlen] = connect_info->port >> 8; + connect_info->write_buffer[5 + hlen + 1] = connect_info->port & 0xff; - phb->read_cb = s5_canread_again; + connect_info->read_cb = s5_canread_again; - phb->inpa = gaim_input_add(source, GAIM_INPUT_WRITE, proxy_do_write, phb); - proxy_do_write(phb, source, GAIM_INPUT_WRITE); + connect_info->inpa = gaim_input_add(source, GAIM_INPUT_WRITE, proxy_do_write, connect_info); + proxy_do_write(connect_info, source, GAIM_INPUT_WRITE); } static void s5_readauth(gpointer data, gint source, GaimInputCondition cond) { - struct _GaimProxyConnectInfo *phb = data; + struct _GaimProxyConnectInfo *connect_info = data; int len; - if (phb->read_buffer == NULL) { - phb->read_buf_len = 2; - phb->read_buffer = g_malloc(phb->read_buf_len); - phb->read_len = 0; + if (connect_info->read_buffer == NULL) { + connect_info->read_buf_len = 2; + connect_info->read_buffer = g_malloc(connect_info->read_buf_len); + connect_info->read_len = 0; } gaim_debug_info("socks5 proxy", "Got auth response.\n"); - len = read(source, phb->read_buffer + phb->read_len, - phb->read_buf_len - phb->read_len); + len = read(source, connect_info->read_buffer + connect_info->read_len, + connect_info->read_buf_len - connect_info->read_len); if(len < 0 && errno == EAGAIN) return; else if(len <= 0) { close(source); - gaim_input_remove(phb->inpa); - phb->inpa = 0; - g_free(phb->read_buffer); - phb->read_buffer = NULL; - try_connect(phb); + gaim_input_remove(connect_info->inpa); + connect_info->inpa = 0; + g_free(connect_info->read_buffer); + connect_info->read_buffer = NULL; + try_connect(connect_info); return; } - phb->read_len += len; + connect_info->read_len += len; - if (phb->read_len < 2) + if (connect_info->read_len < 2) return; - gaim_input_remove(phb->inpa); - phb->inpa = 0; + gaim_input_remove(connect_info->inpa); + connect_info->inpa = 0; - if ((phb->read_buffer[0] != 0x01) || (phb->read_buffer[1] != 0x00)) { + if ((connect_info->read_buffer[0] != 0x01) || (connect_info->read_buffer[1] != 0x00)) { close(source); - g_free(phb->read_buffer); - phb->read_buffer = NULL; - try_connect(phb); + g_free(connect_info->read_buffer); + connect_info->read_buffer = NULL; + try_connect(connect_info); return; } - g_free(phb->read_buffer); - phb->read_buffer = NULL; + g_free(connect_info->read_buffer); + connect_info->read_buffer = NULL; - s5_sendconnect(phb, source); + s5_sendconnect(connect_info, source); } static void hmacmd5_chap(const unsigned char * challenge, int challen, const char * passwd, unsigned char * response) @@ -1839,45 +1839,45 @@ s5_readchap(gpointer data, gint source, GaimInputCondition cond) { guchar *cmdbuf, *buf; - struct _GaimProxyConnectInfo *phb = data; + struct _GaimProxyConnectInfo *connect_info = data; int len, navas, currentav; gaim_debug(GAIM_DEBUG_INFO, "socks5 proxy", "Got CHAP response.\n"); - if (phb->read_buffer == NULL) { - phb->read_buf_len = 20; - phb->read_buffer = g_malloc(phb->read_buf_len); - phb->read_len = 0; + if (connect_info->read_buffer == NULL) { + connect_info->read_buf_len = 20; + connect_info->read_buffer = g_malloc(connect_info->read_buf_len); + connect_info->read_len = 0; } - len = read(source, phb->read_buffer + phb->read_len, - phb->read_buf_len - phb->read_len); + len = read(source, connect_info->read_buffer + connect_info->read_len, + connect_info->read_buf_len - connect_info->read_len); if(len < 0 && errno == EAGAIN) return; else if(len <= 0) { close(source); - gaim_input_remove(phb->inpa); - phb->inpa = 0; - g_free(phb->read_buffer); - phb->read_buffer = NULL; - try_connect(phb); + gaim_input_remove(connect_info->inpa); + connect_info->inpa = 0; + g_free(connect_info->read_buffer); + connect_info->read_buffer = NULL; + try_connect(connect_info); return; } - phb->read_len += len; + connect_info->read_len += len; - if (phb->read_len < 2) + if (connect_info->read_len < 2) return; - cmdbuf = phb->read_buffer; + cmdbuf = connect_info->read_buffer; if (*cmdbuf != 0x01) { close(source); - gaim_input_remove(phb->inpa); - phb->inpa = 0; - g_free(phb->read_buffer); - phb->read_buffer = NULL; - try_connect(phb); + gaim_input_remove(connect_info->inpa); + connect_info->inpa = 0; + g_free(connect_info->read_buffer); + connect_info->read_buffer = NULL; + try_connect(connect_info); return; } cmdbuf++; @@ -1886,21 +1886,21 @@ cmdbuf++; for (currentav = 0; currentav < navas; currentav++) { - if (phb->read_len - (cmdbuf - phb->read_buffer) < 2) + if (connect_info->read_len - (cmdbuf - connect_info->read_buffer) < 2) return; - if (phb->read_len - (cmdbuf - phb->read_buffer) < cmdbuf[1]) + if (connect_info->read_len - (cmdbuf - connect_info->read_buffer) < cmdbuf[1]) return; buf = cmdbuf + 2; switch (cmdbuf[0]) { case 0x00: /* Did auth work? */ if (buf[0] == 0x00) { - gaim_input_remove(phb->inpa); - phb->inpa = 0; - g_free(phb->read_buffer); - phb->read_buffer = NULL; + gaim_input_remove(connect_info->inpa); + connect_info->inpa = 0; + g_free(connect_info->read_buffer); + connect_info->read_buffer = NULL; /* Success */ - s5_sendconnect(phb, source); + s5_sendconnect(connect_info, source); return; } else { /* Failure */ @@ -1908,39 +1908,39 @@ "socks5 CHAP authentication " "failed. Disconnecting..."); close(source); - gaim_input_remove(phb->inpa); - phb->inpa = 0; - g_free(phb->read_buffer); - phb->read_buffer = NULL; - try_connect(phb); + gaim_input_remove(connect_info->inpa); + connect_info->inpa = 0; + g_free(connect_info->read_buffer); + connect_info->read_buffer = NULL; + try_connect(connect_info); return; } break; case 0x03: /* Server wants our credentials */ - phb->write_buf_len = 16 + 4; - phb->write_buffer = g_malloc(phb->write_buf_len); - phb->written_len = 0; + connect_info->write_buf_len = 16 + 4; + connect_info->write_buffer = g_malloc(connect_info->write_buf_len); + connect_info->written_len = 0; hmacmd5_chap(buf, cmdbuf[1], - gaim_proxy_info_get_password(phb->gpi), - phb->write_buffer + 4); - phb->write_buffer[0] = 0x01; - phb->write_buffer[1] = 0x01; - phb->write_buffer[2] = 0x04; - phb->write_buffer[3] = 0x10; + gaim_proxy_info_get_password(connect_info->gpi), + connect_info->write_buffer + 4); + connect_info->write_buffer[0] = 0x01; + connect_info->write_buffer[1] = 0x01; + connect_info->write_buffer[2] = 0x04; + connect_info->write_buffer[3] = 0x10; - gaim_input_remove(phb->inpa); - g_free(phb->read_buffer); - phb->read_buffer = NULL; + gaim_input_remove(connect_info->inpa); + g_free(connect_info->read_buffer); + connect_info->read_buffer = NULL; - phb->read_cb = s5_readchap; + connect_info->read_cb = s5_readchap; - phb->inpa = gaim_input_add(source, - GAIM_INPUT_WRITE, proxy_do_write, phb); + connect_info->inpa = gaim_input_add(source, + GAIM_INPUT_WRITE, proxy_do_write, connect_info); - proxy_do_write(phb, source, GAIM_INPUT_WRITE); + proxy_do_write(connect_info, source, GAIM_INPUT_WRITE); break; case 0x11: /* Server wants to select an algorithm */ @@ -1953,11 +1953,11 @@ "of the socks5 CHAP specification. " "Disconnecting..."); close(source); - gaim_input_remove(phb->inpa); - phb->inpa = 0; - g_free(phb->read_buffer); - phb->read_buffer = NULL; - try_connect(phb); + gaim_input_remove(connect_info->inpa); + connect_info->inpa = 0; + g_free(connect_info->read_buffer); + connect_info->read_buffer = NULL; + try_connect(connect_info); return; } break; @@ -1972,113 +1972,113 @@ static void s5_canread(gpointer data, gint source, GaimInputCondition cond) { - struct _GaimProxyConnectInfo *phb = data; + struct _GaimProxyConnectInfo *connect_info = data; int len; - if (phb->read_buffer == NULL) { - phb->read_buf_len = 2; - phb->read_buffer = g_malloc(phb->read_buf_len); - phb->read_len = 0; + if (connect_info->read_buffer == NULL) { + connect_info->read_buf_len = 2; + connect_info->read_buffer = g_malloc(connect_info->read_buf_len); + connect_info->read_len = 0; } gaim_debug_info("socks5 proxy", "Able to read.\n"); - len = read(source, phb->read_buffer + phb->read_len, - phb->read_buf_len - phb->read_len); + len = read(source, connect_info->read_buffer + connect_info->read_len, + connect_info->read_buf_len - connect_info->read_len); if(len < 0 && errno == EAGAIN) return; else if(len <= 0) { close(source); - gaim_input_remove(phb->inpa); - phb->inpa = 0; - g_free(phb->read_buffer); - phb->read_buffer = NULL; - try_connect(phb); + gaim_input_remove(connect_info->inpa); + connect_info->inpa = 0; + g_free(connect_info->read_buffer); + connect_info->read_buffer = NULL; + try_connect(connect_info); return; } - phb->read_len += len; + connect_info->read_len += len; - if (phb->read_len < 2) + if (connect_info->read_len < 2) return; - gaim_input_remove(phb->inpa); - phb->inpa = 0; + gaim_input_remove(connect_info->inpa); + connect_info->inpa = 0; - if ((phb->read_buffer[0] != 0x05) || (phb->read_buffer[1] == 0xff)) { + if ((connect_info->read_buffer[0] != 0x05) || (connect_info->read_buffer[1] == 0xff)) { close(source); - g_free(phb->read_buffer); - phb->read_buffer = NULL; - try_connect(phb); + g_free(connect_info->read_buffer); + connect_info->read_buffer = NULL; + try_connect(connect_info); return; } - if (phb->read_buffer[1] == 0x02) { + if (connect_info->read_buffer[1] == 0x02) { gsize i, j; const char *u, *p; - u = gaim_proxy_info_get_username(phb->gpi); - p = gaim_proxy_info_get_password(phb->gpi); + u = gaim_proxy_info_get_username(connect_info->gpi); + p = gaim_proxy_info_get_password(connect_info->gpi); i = (u == NULL) ? 0 : strlen(u); j = (p == NULL) ? 0 : strlen(p); - phb->write_buf_len = 1 + 1 + i + 1 + j; - phb->write_buffer = g_malloc(phb->write_buf_len); - phb->written_len = 0; + connect_info->write_buf_len = 1 + 1 + i + 1 + j; + connect_info->write_buffer = g_malloc(connect_info->write_buf_len); + connect_info->written_len = 0; - phb->write_buffer[0] = 0x01; /* version 1 */ - phb->write_buffer[1] = i; + connect_info->write_buffer[0] = 0x01; /* version 1 */ + connect_info->write_buffer[1] = i; if (u != NULL) - memcpy(phb->write_buffer + 2, u, i); - phb->write_buffer[2 + i] = j; + memcpy(connect_info->write_buffer + 2, u, i); + connect_info->write_buffer[2 + i] = j; if (p != NULL) - memcpy(phb->write_buffer + 2 + i + 1, p, j); + memcpy(connect_info->write_buffer + 2 + i + 1, p, j); - g_free(phb->read_buffer); - phb->read_buffer = NULL; + g_free(connect_info->read_buffer); + connect_info->read_buffer = NULL; - phb->read_cb = s5_readauth; + connect_info->read_cb = s5_readauth; - phb->inpa = gaim_input_add(source, GAIM_INPUT_WRITE, - proxy_do_write, phb); + connect_info->inpa = gaim_input_add(source, GAIM_INPUT_WRITE, + proxy_do_write, connect_info); - proxy_do_write(phb, source, GAIM_INPUT_WRITE); + proxy_do_write(connect_info, source, GAIM_INPUT_WRITE); return; - } else if (phb->read_buffer[1] == 0x03) { + } else if (connect_info->read_buffer[1] == 0x03) { gsize userlen; - userlen = strlen(gaim_proxy_info_get_username(phb->gpi)); + userlen = strlen(gaim_proxy_info_get_username(connect_info->gpi)); - phb->write_buf_len = 7 + userlen; - phb->write_buffer = g_malloc(phb->write_buf_len); - phb->written_len = 0; + connect_info->write_buf_len = 7 + userlen; + connect_info->write_buffer = g_malloc(connect_info->write_buf_len); + connect_info->written_len = 0; - phb->write_buffer[0] = 0x01; - phb->write_buffer[1] = 0x02; - phb->write_buffer[2] = 0x11; - phb->write_buffer[3] = 0x01; - phb->write_buffer[4] = 0x85; - phb->write_buffer[5] = 0x02; - phb->write_buffer[6] = userlen; - memcpy(phb->write_buffer + 7, - gaim_proxy_info_get_username(phb->gpi), userlen); + connect_info->write_buffer[0] = 0x01; + connect_info->write_buffer[1] = 0x02; + connect_info->write_buffer[2] = 0x11; + connect_info->write_buffer[3] = 0x01; + connect_info->write_buffer[4] = 0x85; + connect_info->write_buffer[5] = 0x02; + connect_info->write_buffer[6] = userlen; + memcpy(connect_info->write_buffer + 7, + gaim_proxy_info_get_username(connect_info->gpi), userlen); - g_free(phb->read_buffer); - phb->read_buffer = NULL; + g_free(connect_info->read_buffer); + connect_info->read_buffer = NULL; - phb->read_cb = s5_readchap; + connect_info->read_cb = s5_readchap; - phb->inpa = gaim_input_add(source, GAIM_INPUT_WRITE, - proxy_do_write, phb); + connect_info->inpa = gaim_input_add(source, GAIM_INPUT_WRITE, + proxy_do_write, connect_info); - proxy_do_write(phb, source, GAIM_INPUT_WRITE); + proxy_do_write(connect_info, source, GAIM_INPUT_WRITE); return; } else { - g_free(phb->read_buffer); - phb->read_buffer = NULL; + g_free(connect_info->read_buffer); + connect_info->read_buffer = NULL; - s5_sendconnect(phb, source); + s5_sendconnect(connect_info, source); } } @@ -2087,30 +2087,30 @@ { unsigned char buf[5]; int i; - struct _GaimProxyConnectInfo *phb = data; + struct _GaimProxyConnectInfo *connect_info = data; socklen_t len; int error = ETIMEDOUT; gaim_debug_info("socks5 proxy", "Connected.\n"); - if (phb->inpa > 0) + if (connect_info->inpa > 0) { - gaim_input_remove(phb->inpa); - phb->inpa = 0; + gaim_input_remove(connect_info->inpa); + connect_info->inpa = 0; } len = sizeof(error); if (getsockopt(source, SOL_SOCKET, SO_ERROR, &error, &len) < 0) { close(source); - try_connect(phb); + try_connect(connect_info); return; } i = 0; buf[0] = 0x05; /* SOCKS version 5 */ - if (gaim_proxy_info_get_username(phb->gpi) != NULL) { + if (gaim_proxy_info_get_username(connect_info->gpi) != NULL) { buf[1] = 0x03; /* three methods */ buf[2] = 0x00; /* no authentication */ buf[3] = 0x03; /* CHAP authentication */ @@ -2123,26 +2123,26 @@ i = 3; } - phb->write_buf_len = i; - phb->write_buffer = g_malloc(phb->write_buf_len); - memcpy(phb->write_buffer, buf, i); + connect_info->write_buf_len = i; + connect_info->write_buffer = g_malloc(connect_info->write_buf_len); + memcpy(connect_info->write_buffer, buf, i); - phb->read_cb = s5_canread; + connect_info->read_cb = s5_canread; - phb->inpa = gaim_input_add(source, GAIM_INPUT_WRITE, proxy_do_write, phb); - proxy_do_write(phb, source, GAIM_INPUT_WRITE); + connect_info->inpa = gaim_input_add(source, GAIM_INPUT_WRITE, proxy_do_write, connect_info); + proxy_do_write(connect_info, source, GAIM_INPUT_WRITE); } static int -proxy_connect_socks5(struct _GaimProxyConnectInfo *phb, struct sockaddr *addr, socklen_t addrlen) +proxy_connect_socks5(struct _GaimProxyConnectInfo *connect_info, struct sockaddr *addr, socklen_t addrlen) { int fd = -1; gaim_debug_info("socks5 proxy", "Connecting to %s:%d via %s:%d using SOCKS5\n", - phb->host, phb->port, - gaim_proxy_info_get_host(phb->gpi), - gaim_proxy_info_get_port(phb->gpi)); + connect_info->host, connect_info->port, + gaim_proxy_info_get_host(connect_info->gpi), + gaim_proxy_info_get_port(connect_info->gpi)); if ((fd = socket(addr->sa_family, SOCK_STREAM, 0)) < 0) return -1; @@ -2157,7 +2157,7 @@ gaim_debug_warning("socks5 proxy", "Connect would have blocked.\n"); - phb->inpa = gaim_input_add(fd, GAIM_INPUT_WRITE, s5_canwrite, phb); + connect_info->inpa = gaim_input_add(fd, GAIM_INPUT_WRITE, s5_canwrite, connect_info); } else { close(fd); @@ -2178,43 +2178,43 @@ return -1; } - s5_canwrite(phb, fd, GAIM_INPUT_WRITE); + s5_canwrite(connect_info, fd, GAIM_INPUT_WRITE); } return fd; } -static void try_connect(struct _GaimProxyConnectInfo *phb) +static void try_connect(struct _GaimProxyConnectInfo *connect_info) { size_t addrlen; struct sockaddr *addr; int ret = -1; - while (phb->hosts) { - addrlen = GPOINTER_TO_INT(phb->hosts->data); - phb->hosts = g_slist_remove(phb->hosts, phb->hosts->data); - addr = phb->hosts->data; - phb->hosts = g_slist_remove(phb->hosts, phb->hosts->data); + while (connect_info->hosts) { + addrlen = GPOINTER_TO_INT(connect_info->hosts->data); + connect_info->hosts = g_slist_remove(connect_info->hosts, connect_info->hosts->data); + addr = connect_info->hosts->data; + connect_info->hosts = g_slist_remove(connect_info->hosts, connect_info->hosts->data); - switch (gaim_proxy_info_get_type(phb->gpi)) { + switch (gaim_proxy_info_get_type(connect_info->gpi)) { case GAIM_PROXY_NONE: - ret = proxy_connect_none(phb, addr, addrlen); + ret = proxy_connect_none(connect_info, addr, addrlen); break; case GAIM_PROXY_HTTP: - ret = proxy_connect_http(phb, addr, addrlen); + ret = proxy_connect_http(connect_info, addr, addrlen); break; case GAIM_PROXY_SOCKS4: - ret = proxy_connect_socks4(phb, addr, addrlen); + ret = proxy_connect_socks4(connect_info, addr, addrlen); break; case GAIM_PROXY_SOCKS5: - ret = proxy_connect_socks5(phb, addr, addrlen); + ret = proxy_connect_socks5(connect_info, addr, addrlen); break; case GAIM_PROXY_USE_ENVVAR: - ret = proxy_connect_http(phb, addr, addrlen); + ret = proxy_connect_http(connect_info, addr, addrlen); break; default: @@ -2228,7 +2228,7 @@ } if (ret < 0) { - gaim_proxy_phb_error(phb, _("TODO")); + gaim_proxy_connect_info_error(connect_info, _("TODO")); } } @@ -2236,11 +2236,11 @@ connection_host_resolved(GSList *hosts, gpointer data, const char *error_message) { - struct _GaimProxyConnectInfo *phb = (struct _GaimProxyConnectInfo*)data; + struct _GaimProxyConnectInfo *connect_info = (struct _GaimProxyConnectInfo*)data; - phb->hosts = hosts; + connect_info->hosts = hosts; - try_connect(phb); + try_connect(connect_info); } GaimProxyInfo * @@ -2316,31 +2316,31 @@ { const char *connecthost = host; int connectport = port; - struct _GaimProxyConnectInfo *phb; + struct _GaimProxyConnectInfo *connect_info; g_return_val_if_fail(host != NULL, NULL); g_return_val_if_fail(port > 0, NULL); g_return_val_if_fail(connect_cb != NULL, NULL); /* g_return_val_if_fail(error_cb != NULL, NULL); *//* TODO: Soon! */ - phb = g_new0(struct _GaimProxyConnectInfo, 1); - phb->connect_cb = connect_cb; - phb->error_cb = error_cb; - phb->data = data; - phb->host = g_strdup(host); - phb->port = port; - phb->gpi = gaim_proxy_get_setup(account); + connect_info = g_new0(struct _GaimProxyConnectInfo, 1); + connect_info->connect_cb = connect_cb; + connect_info->error_cb = error_cb; + connect_info->data = data; + connect_info->host = g_strdup(host); + connect_info->port = port; + connect_info->gpi = gaim_proxy_get_setup(account); - if ((gaim_proxy_info_get_type(phb->gpi) != GAIM_PROXY_NONE) && - (gaim_proxy_info_get_host(phb->gpi) == NULL || - gaim_proxy_info_get_port(phb->gpi) <= 0)) { + if ((gaim_proxy_info_get_type(connect_info->gpi) != GAIM_PROXY_NONE) && + (gaim_proxy_info_get_host(connect_info->gpi) == NULL || + gaim_proxy_info_get_port(connect_info->gpi) <= 0)) { gaim_notify_error(NULL, NULL, _("Invalid proxy settings"), _("Either the host name or port number specified for your given proxy type is invalid.")); - gaim_proxy_phb_destroy(phb); + gaim_proxy_connect_info_destroy(connect_info); return NULL; } - switch (gaim_proxy_info_get_type(phb->gpi)) + switch (gaim_proxy_info_get_type(connect_info->gpi)) { case GAIM_PROXY_NONE: break; @@ -2349,25 +2349,25 @@ case GAIM_PROXY_SOCKS4: case GAIM_PROXY_SOCKS5: case GAIM_PROXY_USE_ENVVAR: - connecthost = gaim_proxy_info_get_host(phb->gpi); - connectport = gaim_proxy_info_get_port(phb->gpi); + connecthost = gaim_proxy_info_get_host(connect_info->gpi); + connectport = gaim_proxy_info_get_port(connect_info->gpi); break; default: - gaim_proxy_phb_destroy(phb); + gaim_proxy_connect_info_destroy(connect_info); return NULL; } if (gaim_gethostbyname_async(connecthost, - connectport, connection_host_resolved, phb) != 0) + connectport, connection_host_resolved, connect_info) != 0) { - gaim_proxy_phb_destroy(phb); + gaim_proxy_connect_info_destroy(connect_info); return NULL; } - phbs = g_slist_prepend(phbs, phb); + connect_infos = g_slist_prepend(connect_infos, connect_info); - return phb; + return connect_info; } /* @@ -2378,31 +2378,31 @@ GaimProxyConnectFunction connect_cb, GaimProxyErrorFunction error_cb, gpointer data) { - struct _GaimProxyConnectInfo *phb; + struct _GaimProxyConnectInfo *connect_info; g_return_val_if_fail(host != NULL, NULL); g_return_val_if_fail(port > 0, NULL); g_return_val_if_fail(connect_cb != NULL, NULL); /* g_return_val_if_fail(error_cb != NULL, NULL); *//* TODO: Soon! */ - phb = g_new0(struct _GaimProxyConnectInfo, 1); - phb->connect_cb = connect_cb; - phb->error_cb = error_cb; - phb->data = data; - phb->host = g_strdup(host); - phb->port = port; - phb->gpi = gpi; + connect_info = g_new0(struct _GaimProxyConnectInfo, 1); + connect_info->connect_cb = connect_cb; + connect_info->error_cb = error_cb; + connect_info->data = data; + connect_info->host = g_strdup(host); + connect_info->port = port; + connect_info->gpi = gpi; if (gaim_gethostbyname_async(gaim_proxy_info_get_host(gpi), - gaim_proxy_info_get_port(gpi), connection_host_resolved, phb) != 0) + gaim_proxy_info_get_port(gpi), connection_host_resolved, connect_info) != 0) { - gaim_proxy_phb_destroy(phb); + gaim_proxy_connect_info_destroy(connect_info); return NULL; } - phbs = g_slist_prepend(phbs, phb); + connect_infos = g_slist_prepend(connect_infos, connect_info); - return phb; + return connect_info; } @@ -2485,6 +2485,6 @@ void gaim_proxy_uninit(void) { - while (phbs != NULL) - gaim_proxy_phb_destroy(phbs->data); + while (connect_infos != NULL) + gaim_proxy_connect_info_destroy(connect_infos->data); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <the...@us...> - 2006-08-13 08:38:06
|
Revision: 16734 Author: thekingant Date: 2006-08-13 01:38:02 -0700 (Sun, 13 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16734&view=rev Log Message: ----------- gaim_proxy_connect()ion attemps can now be canceled. So there is no longer a need to do that GAIM_CONNECTION_IS_VALID() crap at the top of gaim_proxy_connect() callback functions. All of the callers of gaim_proxy_connect() still need to be updated, though. Modified Paths: -------------- trunk/src/proxy.c trunk/src/proxy.h Modified: trunk/src/proxy.c =================================================================== --- trunk/src/proxy.c 2006-08-13 06:09:48 UTC (rev 16733) +++ trunk/src/proxy.c 2006-08-13 08:38:02 UTC (rev 16734) @@ -44,6 +44,7 @@ gpointer data; char *host; int port; + int fd; guint inpa; GaimProxyInfo *gpi; @@ -53,6 +54,10 @@ */ GSList *hosts; + /* + * All of the following variables are used when establishing a + * connection through a proxy. + */ guchar *write_buffer; gsize write_buf_len; gsize written_len; @@ -75,9 +80,15 @@ }; static GaimProxyInfo *global_proxy_info = NULL; + +/* + * TODO: Once all callers of gaim_proxy_connect() are keeping track + * of the return value from that function this linked list + * will no longer be needed. + */ static GSList *connect_infos = NULL; -static void try_connect(GaimProxyConnectInfo *); +static void try_connect(GaimProxyConnectInfo *connect_info); /************************************************************************** * Proxy structure API @@ -262,14 +273,41 @@ * Proxy API **************************************************************************/ +/* + * This is used when the connection attempt to one particular IP + * address fails. We close the socket, remove the watcher and get + * rid of input and output buffers. Normally try_connect() will + * be called immediately after this. + */ static void +gaim_proxy_connect_info_disconnect(GaimProxyConnectInfo *connect_info) +{ + if (connect_info->inpa > 0) + { + gaim_input_remove(connect_info->inpa); + connect_info->inpa = 0; + } + + if (connect_info->fd >= 0) + { + close(connect_info->fd); + connect_info->fd = -1; + } + + g_free(connect_info->write_buffer); + connect_info->write_buffer = NULL; + + g_free(connect_info->read_buffer); + connect_info->read_buffer = NULL; +} + +static void gaim_proxy_connect_info_destroy(GaimProxyConnectInfo *connect_info) { + gaim_proxy_connect_info_disconnect(connect_info); + connect_infos = g_slist_remove(connect_infos, connect_info); - if (connect_info->inpa > 0) - gaim_input_remove(connect_info->inpa); - while (connect_info->hosts != NULL) { /* Discard the length... */ @@ -280,15 +318,21 @@ } g_free(connect_info->host); - g_free(connect_info->write_buffer); - g_free(connect_info->read_buffer); g_free(connect_info); } static void -gaim_proxy_connect_info_connected(GaimProxyConnectInfo *connect_info, int fd) +gaim_proxy_connect_info_connected(GaimProxyConnectInfo *connect_info) { - connect_info->connect_cb(connect_info->data, fd); + connect_info->connect_cb(connect_info->data, connect_info->fd); + + /* + * We've passed the file descriptor to the protocol, so it's no longer + * our responsibility, and we should be careful not to free it when + * we destroy the connect_info. + */ + connect_info->fd = -1; + gaim_proxy_connect_info_destroy(connect_info); } @@ -1019,19 +1063,17 @@ * be overly optimistic sometimes. select is just a hint that you might be * able to do something.) */ - ret = getsockopt(source, SOL_SOCKET, SO_ERROR, &error, &len); + ret = getsockopt(connect_info->fd, SOL_SOCKET, SO_ERROR, &error, &len); if (ret == 0 && error == EINPROGRESS) return; /* we'll be called again later */ if (ret < 0 || error != 0) { if (ret!=0) error = errno; - close(source); - gaim_input_remove(connect_info->inpa); - connect_info->inpa = 0; gaim_debug_error("proxy", "getsockopt SO_ERROR check: %s\n", strerror(error)); + gaim_proxy_connect_info_disconnect(connect_info); try_connect(connect_info); return; } @@ -1039,71 +1081,77 @@ gaim_input_remove(connect_info->inpa); connect_info->inpa = 0; - gaim_proxy_connect_info_connected(connect_info, source); + gaim_proxy_connect_info_connected(connect_info); } -static gboolean clean_connect(gpointer data) +static gboolean +clean_connect(gpointer data) { - GaimProxyConnectInfo *connect_info = data; + GaimProxyConnectInfo *connect_info; - gaim_proxy_connect_info_connected(connect_info, connect_info->port); + connect_info = data; + gaim_proxy_connect_info_connected(connect_info); return FALSE; } - static int proxy_connect_none(GaimProxyConnectInfo *connect_info, struct sockaddr *addr, socklen_t addrlen) { - int fd = -1; + gaim_debug_info("proxy", "Connecting to %s:%d with no proxy\n", + connect_info->host, connect_info->port); - gaim_debug_info("proxy", - "Connecting to %s:%d with no proxy\n", connect_info->host, connect_info->port); - - if ((fd = socket(addr->sa_family, SOCK_STREAM, 0)) < 0) { + connect_info->fd = socket(addr->sa_family, SOCK_STREAM, 0); + if (connect_info->fd < 0) + { gaim_debug_error("proxy", "Unable to create socket: %s\n", strerror(errno)); return -1; } - fcntl(fd, F_SETFL, O_NONBLOCK); + fcntl(connect_info->fd, F_SETFL, O_NONBLOCK); #ifndef _WIN32 - fcntl(fd, F_SETFD, FD_CLOEXEC); + fcntl(connect_info->fd, F_SETFD, FD_CLOEXEC); #endif - if (connect(fd, (struct sockaddr *)addr, addrlen) != 0) + if (connect(connect_info->fd, (struct sockaddr *)addr, addrlen) != 0) { if ((errno == EINPROGRESS) || (errno == EINTR)) { - /* This just confuses people. */ - /* gaim_debug_warning("proxy", - "Connect would have blocked.\n"); */ - connect_info->inpa = gaim_input_add(fd, GAIM_INPUT_WRITE, no_one_calls, connect_info); + gaim_debug_info("proxy", "Connection in progress\n"); + connect_info->inpa = gaim_input_add(connect_info->fd, GAIM_INPUT_WRITE, no_one_calls, connect_info); } else { gaim_debug_error("proxy", "Connect failed: %s\n", strerror(errno)); - close(fd); + close(connect_info->fd); + connect_info->fd = -1; return -1; } } - else { + else + { + /* + * The connection happened IMMEDIATELY... strange, but whatever. + */ socklen_t len; int error = ETIMEDOUT; - gaim_debug_misc("proxy", "Connect didn't block.\n"); + gaim_debug_info("proxy", "Connected immediately.\n"); len = sizeof(error); - if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len) != 0) + if (getsockopt(connect_info->fd, SOL_SOCKET, SO_ERROR, &error, &len) != 0) { gaim_debug_error("proxy", "getsockopt failed.\n"); - close(fd); + close(connect_info->fd); + connect_info->fd = -1; return -1; } - /* TODO: Why is the following line so strange? */ - connect_info->port = fd; /* bleh */ - gaim_timeout_add(10, clean_connect, connect_info); /* we do this because we never - want to call our callback - before we return. */ + + /* + * We want to call the "connected" callback eventually, but we + * don't want to call it before we return, just in case. + */ + gaim_timeout_add(10, clean_connect, connect_info); } - return fd; + return connect_info->fd; } static void @@ -1113,16 +1161,12 @@ const guchar *request = connect_info->write_buffer + connect_info->written_len; gsize request_len = connect_info->write_buf_len - connect_info->written_len; - int ret = write(source, request, request_len); + int ret = write(connect_info->fd, request, request_len); if(ret < 0 && errno == EAGAIN) return; else if(ret < 0) { - gaim_input_remove(connect_info->inpa); - connect_info->inpa = 0; - close(source); - g_free(connect_info->write_buffer); - connect_info->write_buffer = NULL; + gaim_proxy_connect_info_disconnect(connect_info); try_connect(connect_info); return; } else if (ret < request_len) { @@ -1135,7 +1179,7 @@ connect_info->write_buffer = NULL; /* register the response handler for the response */ - connect_info->inpa = gaim_input_add(source, GAIM_INPUT_READ, connect_info->read_cb, connect_info); + connect_info->inpa = gaim_input_add(connect_info->fd, GAIM_INPUT_READ, connect_info->read_cb, connect_info); } #define HTTP_GOODSTRING "HTTP/1.0 200" @@ -1161,11 +1205,10 @@ p = connect_info->read_buffer + connect_info->read_len; max_read = connect_info->read_buf_len - connect_info->read_len - 1; - len = read(source, p, max_read); + len = read(connect_info->fd, p, max_read); if(len < 0 && errno == EAGAIN) return; else if(len <= 0) { - close(source); gaim_proxy_connect_info_error(connect_info, _("Lost connection with server for an unknown reason.")); return; } else { @@ -1222,14 +1265,13 @@ complaining / breaking since we don't read the whole page */ while(len--) { /* TODO: deal with EAGAIN (and other errors) better */ - if (read(source, &tmpc, 1) < 0 && errno != EAGAIN) + if (read(connect_info->fd, &tmpc, 1) < 0 && errno != EAGAIN) break; } } if (error) { - close(source); msg = g_strdup_printf("Unable to parse response from HTTP proxy: %s\n", connect_info->read_buffer); gaim_proxy_connect_info_error(connect_info, msg); @@ -1255,7 +1297,6 @@ username = strchr(domain, '\\'); if (username == NULL) { - close(source); msg = g_strdup_printf(_("HTTP proxy connection error %d"), status); gaim_proxy_connect_info_error(connect_info, msg); g_free(msg); @@ -1292,10 +1333,10 @@ connect_info->read_cb = http_canread; - connect_info->inpa = gaim_input_add(source, + connect_info->inpa = gaim_input_add(connect_info->fd, GAIM_INPUT_WRITE, proxy_do_write, connect_info); - proxy_do_write(connect_info, source, cond); + proxy_do_write(connect_info, connect_info->fd, cond); return; } else if((ntlm = g_strrstr((const char *)connect_info->read_buffer, "Proxy-Authenticate: NTLM"))) { /* Empty message */ gchar request[2048]; @@ -1305,7 +1346,6 @@ username = strchr(domain, '\\'); if (username == NULL) { - close(source); msg = g_strdup_printf(_("HTTP proxy connection error %d"), status); gaim_proxy_connect_info_error(connect_info, msg); g_free(msg); @@ -1339,13 +1379,12 @@ connect_info->read_cb = http_canread; - connect_info->inpa = gaim_input_add(source, + connect_info->inpa = gaim_input_add(connect_info->fd, GAIM_INPUT_WRITE, proxy_do_write, connect_info); - proxy_do_write(connect_info, source, cond); + proxy_do_write(connect_info, connect_info->fd, cond); return; } else { - close(source); msg = g_strdup_printf(_("HTTP proxy connection error %d"), status); gaim_proxy_connect_info_error(connect_info, msg); g_free(msg); @@ -1367,7 +1406,7 @@ g_free(connect_info->read_buffer); connect_info->read_buffer = NULL; gaim_debug_info("proxy", "HTTP proxy connection established\n"); - gaim_proxy_connect_info_connected(connect_info, source); + gaim_proxy_connect_info_connected(connect_info); return; } } @@ -1393,9 +1432,8 @@ len = sizeof(error); - if (getsockopt(source, SOL_SOCKET, SO_ERROR, &error, &len) < 0) { - close(source); - + if (getsockopt(connect_info->fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) { + gaim_proxy_connect_info_disconnect(connect_info); try_connect(connect_info); return; } @@ -1435,48 +1473,46 @@ connect_info->read_cb = http_canread; - connect_info->inpa = gaim_input_add(source, GAIM_INPUT_WRITE, proxy_do_write, + connect_info->inpa = gaim_input_add(connect_info->fd, GAIM_INPUT_WRITE, proxy_do_write, connect_info); - proxy_do_write(connect_info, source, cond); + proxy_do_write(connect_info, connect_info->fd, cond); } static int proxy_connect_http(GaimProxyConnectInfo *connect_info, struct sockaddr *addr, socklen_t addrlen) { - int fd = -1; - gaim_debug_info("http proxy", "Connecting to %s:%d via %s:%d using HTTP\n", (connect_info->host ? connect_info->host : "(null)"), connect_info->port, (gaim_proxy_info_get_host(connect_info->gpi) ? gaim_proxy_info_get_host(connect_info->gpi) : "(null)"), gaim_proxy_info_get_port(connect_info->gpi)); - if ((fd = socket(addr->sa_family, SOCK_STREAM, 0)) < 0) { + connect_info->fd = socket(addr->sa_family, SOCK_STREAM, 0); + if (connect_info->fd < 0) return -1; - } - fcntl(fd, F_SETFL, O_NONBLOCK); + fcntl(connect_info->fd, F_SETFL, O_NONBLOCK); #ifndef _WIN32 - fcntl(fd, F_SETFD, FD_CLOEXEC); + fcntl(connect_info->fd, F_SETFD, FD_CLOEXEC); #endif - if (connect(fd, addr, addrlen) != 0) + if (connect(connect_info->fd, addr, addrlen) != 0) { if ((errno == EINPROGRESS) || (errno == EINTR)) { - gaim_debug_warning("http proxy", - "Connect would have blocked.\n"); + gaim_debug_info("http proxy", "Connection in progress\n"); if (connect_info->port != 80) { /* we need to do CONNECT first */ - connect_info->inpa = gaim_input_add(fd, GAIM_INPUT_WRITE, + connect_info->inpa = gaim_input_add(connect_info->fd, GAIM_INPUT_WRITE, http_canwrite, connect_info); } else { gaim_debug_info("proxy", "HTTP proxy connection established\n"); - gaim_proxy_connect_info_connected(connect_info, fd); + gaim_proxy_connect_info_connected(connect_info); } } else { - close(fd); + close(connect_info->fd); + connect_info->fd = -1; return -1; } } @@ -1484,19 +1520,19 @@ socklen_t len; int error = ETIMEDOUT; - gaim_debug_misc("http proxy", - "Connect didn't block.\n"); + gaim_debug_info("http proxy", "Connected immediately.\n"); len = sizeof(error); - if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len) != 0) + if (getsockopt(connect_info->fd, SOL_SOCKET, SO_ERROR, &error, &len) != 0) { - close(fd); + close(connect_info->fd); + connect_info->fd = -1; return -1; } - http_canwrite(connect_info, fd, GAIM_INPUT_WRITE); + http_canwrite(connect_info, connect_info->fd, GAIM_INPUT_WRITE); } - return fd; + return connect_info->fd; } @@ -1519,24 +1555,18 @@ buf = connect_info->read_buffer + connect_info->read_len; max_read = connect_info->read_buf_len - connect_info->read_len; - len = read(source, buf, max_read); + len = read(connect_info->fd, buf, max_read); if ((len < 0 && errno == EAGAIN) || (len > 0 && len + connect_info->read_len < 4)) return; else if (len + connect_info->read_len >= 4) { if (connect_info->read_buffer[1] == 90) { - gaim_proxy_connect_info_connected(connect_info, source); + gaim_proxy_connect_info_connected(connect_info); return; } } - gaim_input_remove(connect_info->inpa); - connect_info->inpa = 0; - g_free(connect_info->read_buffer); - connect_info->read_buffer = NULL; - - close(source); - + gaim_proxy_connect_info_disconnect(connect_info); try_connect(connect_info); } @@ -1559,9 +1589,8 @@ len = sizeof(error); - if (getsockopt(source, SOL_SOCKET, SO_ERROR, &error, &len) < 0) { - close(source); - + if (getsockopt(connect_info->fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) { + gaim_proxy_connect_info_disconnect(connect_info); try_connect(connect_info); return; } @@ -1574,9 +1603,10 @@ * with an option, or some detection mechanism - in the * meantime, stick with plain old SOCKS4. */ - if (!(hp = gethostbyname(connect_info->host))) { - close(source); - + /* TODO: This needs to be non-blocking! */ + hp = gethostbyname(connect_info->host); + if (hp == NULL) { + gaim_proxy_connect_info_disconnect(connect_info); try_connect(connect_info); return; } @@ -1596,60 +1626,59 @@ connect_info->written_len = 0; connect_info->read_cb = s4_canread; - connect_info->inpa = gaim_input_add(source, GAIM_INPUT_WRITE, proxy_do_write, connect_info); + connect_info->inpa = gaim_input_add(connect_info->fd, GAIM_INPUT_WRITE, proxy_do_write, connect_info); - proxy_do_write(connect_info, source, cond); + proxy_do_write(connect_info, connect_info->fd, cond); } static int proxy_connect_socks4(GaimProxyConnectInfo *connect_info, struct sockaddr *addr, socklen_t addrlen) { - int fd = -1; - gaim_debug_info("socks4 proxy", "Connecting to %s:%d via %s:%d using SOCKS4\n", connect_info->host, connect_info->port, gaim_proxy_info_get_host(connect_info->gpi), gaim_proxy_info_get_port(connect_info->gpi)); - if ((fd = socket(addr->sa_family, SOCK_STREAM, 0)) < 0) + connect_info->fd = socket(addr->sa_family, SOCK_STREAM, 0); + if (connect_info->fd < 0) return -1; - fcntl(fd, F_SETFL, O_NONBLOCK); + fcntl(connect_info->fd, F_SETFL, O_NONBLOCK); #ifndef _WIN32 - fcntl(fd, F_SETFD, FD_CLOEXEC); + fcntl(connect_info->fd, F_SETFD, FD_CLOEXEC); #endif - if (connect(fd, addr, addrlen) != 0) + if (connect(connect_info->fd, addr, addrlen) != 0) { if ((errno == EINPROGRESS) || (errno == EINTR)) { - gaim_debug_warning("socks4 proxy", - "Connect would have blocked.\n"); - connect_info->inpa = gaim_input_add(fd, GAIM_INPUT_WRITE, s4_canwrite, connect_info); + gaim_debug_info("socks4 proxy", "Connection in progress.\n"); + connect_info->inpa = gaim_input_add(connect_info->fd, GAIM_INPUT_WRITE, s4_canwrite, connect_info); } else { - close(fd); + close(connect_info->fd); + connect_info->fd = -1; return -1; } } else { socklen_t len; int error = ETIMEDOUT; - gaim_debug_misc("socks4 proxy", - "Connect didn't block.\n"); + gaim_debug_info("socks4 proxy", "Connected immediately.\n"); len = sizeof(error); - if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len) != 0) + if (getsockopt(connect_info->fd, SOL_SOCKET, SO_ERROR, &error, &len) != 0) { - close(fd); + close(connect_info->fd); + connect_info->fd = -1; return -1; } - s4_canwrite(connect_info, fd, GAIM_INPUT_WRITE); + s4_canwrite(connect_info, connect_info->fd, GAIM_INPUT_WRITE); } - return fd; + return connect_info->fd; } static void @@ -1670,16 +1699,12 @@ gaim_debug_info("socks5 proxy", "Able to read again.\n"); - len = read(source, dest, (connect_info->read_buf_len - connect_info->read_len)); + len = read(connect_info->fd, dest, (connect_info->read_buf_len - connect_info->read_len)); if(len < 0 && errno == EAGAIN) return; else if(len <= 0) { gaim_debug_warning("socks5 proxy", "or not...\n"); - close(source); - gaim_input_remove(connect_info->inpa); - connect_info->inpa = 0; - g_free(connect_info->read_buffer); - connect_info->read_buffer = NULL; + gaim_proxy_connect_info_disconnect(connect_info); try_connect(connect_info); return; } @@ -1693,11 +1718,7 @@ gaim_debug_error("socks5 proxy", socks5errors[buf[1]]); else gaim_debug_error("socks5 proxy", "Bad data.\n"); - close(source); - gaim_input_remove(connect_info->inpa); - connect_info->inpa = 0; - g_free(connect_info->read_buffer); - connect_info->read_buffer = NULL; + gaim_proxy_connect_info_disconnect(connect_info); try_connect(connect_info); return; } @@ -1732,7 +1753,7 @@ /* Skip past BND.PORT */ buf += 2; - gaim_proxy_connect_info_connected(connect_info, source); + gaim_proxy_connect_info_connected(connect_info); } static void @@ -1755,8 +1776,8 @@ connect_info->read_cb = s5_canread_again; - connect_info->inpa = gaim_input_add(source, GAIM_INPUT_WRITE, proxy_do_write, connect_info); - proxy_do_write(connect_info, source, GAIM_INPUT_WRITE); + connect_info->inpa = gaim_input_add(connect_info->fd, GAIM_INPUT_WRITE, proxy_do_write, connect_info); + proxy_do_write(connect_info, connect_info->fd, GAIM_INPUT_WRITE); } static void @@ -1773,16 +1794,12 @@ gaim_debug_info("socks5 proxy", "Got auth response.\n"); - len = read(source, connect_info->read_buffer + connect_info->read_len, + len = read(connect_info->fd, connect_info->read_buffer + connect_info->read_len, connect_info->read_buf_len - connect_info->read_len); if(len < 0 && errno == EAGAIN) return; else if(len <= 0) { - close(source); - gaim_input_remove(connect_info->inpa); - connect_info->inpa = 0; - g_free(connect_info->read_buffer); - connect_info->read_buffer = NULL; + gaim_proxy_connect_info_disconnect(connect_info); try_connect(connect_info); return; } @@ -1795,9 +1812,7 @@ connect_info->inpa = 0; if ((connect_info->read_buffer[0] != 0x01) || (connect_info->read_buffer[1] != 0x00)) { - close(source); - g_free(connect_info->read_buffer); - connect_info->read_buffer = NULL; + gaim_proxy_connect_info_disconnect(connect_info); try_connect(connect_info); return; } @@ -1805,7 +1820,7 @@ g_free(connect_info->read_buffer); connect_info->read_buffer = NULL; - s5_sendconnect(connect_info, source); + s5_sendconnect(connect_info, connect_info->fd); } static void @@ -1867,17 +1882,13 @@ connect_info->read_len = 0; } - len = read(source, connect_info->read_buffer + connect_info->read_len, + len = read(connect_info->fd, connect_info->read_buffer + connect_info->read_len, connect_info->read_buf_len - connect_info->read_len); if(len < 0 && errno == EAGAIN) return; else if(len <= 0) { - close(source); - gaim_input_remove(connect_info->inpa); - connect_info->inpa = 0; - g_free(connect_info->read_buffer); - connect_info->read_buffer = NULL; + gaim_proxy_connect_info_disconnect(connect_info); try_connect(connect_info); return; } @@ -1889,11 +1900,7 @@ cmdbuf = connect_info->read_buffer; if (*cmdbuf != 0x01) { - close(source); - gaim_input_remove(connect_info->inpa); - connect_info->inpa = 0; - g_free(connect_info->read_buffer); - connect_info->read_buffer = NULL; + gaim_proxy_connect_info_disconnect(connect_info); try_connect(connect_info); return; } @@ -1917,18 +1924,14 @@ g_free(connect_info->read_buffer); connect_info->read_buffer = NULL; /* Success */ - s5_sendconnect(connect_info, source); + s5_sendconnect(connect_info, connect_info->fd); return; } else { /* Failure */ gaim_debug_warning("proxy", "socks5 CHAP authentication " "failed. Disconnecting..."); - close(source); - gaim_input_remove(connect_info->inpa); - connect_info->inpa = 0; - g_free(connect_info->read_buffer); - connect_info->read_buffer = NULL; + gaim_proxy_connect_info_disconnect(connect_info); try_connect(connect_info); return; } @@ -1954,10 +1957,10 @@ connect_info->read_cb = s5_readchap; - connect_info->inpa = gaim_input_add(source, + connect_info->inpa = gaim_input_add(connect_info->fd, GAIM_INPUT_WRITE, proxy_do_write, connect_info); - proxy_do_write(connect_info, source, GAIM_INPUT_WRITE); + proxy_do_write(connect_info, connect_info->fd, GAIM_INPUT_WRITE); break; case 0x11: /* Server wants to select an algorithm */ @@ -1969,11 +1972,7 @@ "as supporting. This is a violation " "of the socks5 CHAP specification. " "Disconnecting..."); - close(source); - gaim_input_remove(connect_info->inpa); - connect_info->inpa = 0; - g_free(connect_info->read_buffer); - connect_info->read_buffer = NULL; + gaim_proxy_connect_info_disconnect(connect_info); try_connect(connect_info); return; } @@ -2000,16 +1999,12 @@ gaim_debug_info("socks5 proxy", "Able to read.\n"); - len = read(source, connect_info->read_buffer + connect_info->read_len, + len = read(connect_info->fd, connect_info->read_buffer + connect_info->read_len, connect_info->read_buf_len - connect_info->read_len); if(len < 0 && errno == EAGAIN) return; else if(len <= 0) { - close(source); - gaim_input_remove(connect_info->inpa); - connect_info->inpa = 0; - g_free(connect_info->read_buffer); - connect_info->read_buffer = NULL; + gaim_proxy_connect_info_disconnect(connect_info); try_connect(connect_info); return; } @@ -2022,9 +2017,7 @@ connect_info->inpa = 0; if ((connect_info->read_buffer[0] != 0x05) || (connect_info->read_buffer[1] == 0xff)) { - close(source); - g_free(connect_info->read_buffer); - connect_info->read_buffer = NULL; + gaim_proxy_connect_info_disconnect(connect_info); try_connect(connect_info); return; } @@ -2056,10 +2049,10 @@ connect_info->read_cb = s5_readauth; - connect_info->inpa = gaim_input_add(source, GAIM_INPUT_WRITE, + connect_info->inpa = gaim_input_add(connect_info->fd, GAIM_INPUT_WRITE, proxy_do_write, connect_info); - proxy_do_write(connect_info, source, GAIM_INPUT_WRITE); + proxy_do_write(connect_info, connect_info->fd, GAIM_INPUT_WRITE); return; } else if (connect_info->read_buffer[1] == 0x03) { @@ -2085,17 +2078,17 @@ connect_info->read_cb = s5_readchap; - connect_info->inpa = gaim_input_add(source, GAIM_INPUT_WRITE, + connect_info->inpa = gaim_input_add(connect_info->fd, GAIM_INPUT_WRITE, proxy_do_write, connect_info); - proxy_do_write(connect_info, source, GAIM_INPUT_WRITE); + proxy_do_write(connect_info, connect_info->fd, GAIM_INPUT_WRITE); return; } else { g_free(connect_info->read_buffer); connect_info->read_buffer = NULL; - s5_sendconnect(connect_info, source); + s5_sendconnect(connect_info, connect_info->fd); } } @@ -2117,9 +2110,8 @@ } len = sizeof(error); - if (getsockopt(source, SOL_SOCKET, SO_ERROR, &error, &len) < 0) { - close(source); - + if (getsockopt(connect_info->fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) { + gaim_proxy_connect_info_disconnect(connect_info); try_connect(connect_info); return; } @@ -2146,39 +2138,37 @@ connect_info->read_cb = s5_canread; - connect_info->inpa = gaim_input_add(source, GAIM_INPUT_WRITE, proxy_do_write, connect_info); - proxy_do_write(connect_info, source, GAIM_INPUT_WRITE); + connect_info->inpa = gaim_input_add(connect_info->fd, GAIM_INPUT_WRITE, proxy_do_write, connect_info); + proxy_do_write(connect_info, connect_info->fd, GAIM_INPUT_WRITE); } static int proxy_connect_socks5(GaimProxyConnectInfo *connect_info, struct sockaddr *addr, socklen_t addrlen) { - int fd = -1; - gaim_debug_info("socks5 proxy", "Connecting to %s:%d via %s:%d using SOCKS5\n", connect_info->host, connect_info->port, gaim_proxy_info_get_host(connect_info->gpi), gaim_proxy_info_get_port(connect_info->gpi)); - if ((fd = socket(addr->sa_family, SOCK_STREAM, 0)) < 0) + connect_info->fd = socket(addr->sa_family, SOCK_STREAM, 0); + if (connect_info->fd < 0) return -1; - fcntl(fd, F_SETFL, O_NONBLOCK); + fcntl(connect_info->fd, F_SETFL, O_NONBLOCK); #ifndef _WIN32 - fcntl(fd, F_SETFD, FD_CLOEXEC); + fcntl(connect_info->fd, F_SETFD, FD_CLOEXEC); #endif - if (connect(fd, addr, addrlen) != 0) + if (connect(connect_info->fd, addr, addrlen) != 0) { if ((errno == EINPROGRESS) || (errno == EINTR)) { - gaim_debug_warning("socks5 proxy", - "Connect would have blocked.\n"); - - connect_info->inpa = gaim_input_add(fd, GAIM_INPUT_WRITE, s5_canwrite, connect_info); + gaim_debug_info("socks5 proxy", "Connection in progress\n"); + connect_info->inpa = gaim_input_add(connect_info->fd, GAIM_INPUT_WRITE, s5_canwrite, connect_info); } else { - close(fd); + close(connect_info->fd); + connect_info->fd = -1; return -1; } } @@ -2186,22 +2176,28 @@ socklen_t len; int error = ETIMEDOUT; - gaim_debug_misc("socks5 proxy", "Connect didn't block.\n"); + gaim_debug_info("socks5 proxy", "Connected immediately.\n"); len = sizeof(error); - if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len) != 0) + if (getsockopt(connect_info->fd, SOL_SOCKET, SO_ERROR, &error, &len) != 0) { - close(fd); + close(connect_info->fd); + connect_info->fd = -1; return -1; } - s5_canwrite(connect_info, fd, GAIM_INPUT_WRITE); + s5_canwrite(connect_info, connect_info->fd, GAIM_INPUT_WRITE); } - return fd; + return connect_info->fd; } +/** + * This function iterates through a list of IP addresses and attempts + * to connect to each one. This is called after the hostname is + * resolved, and if a connection attempt fails. + */ static void try_connect(GaimProxyConnectInfo *connect_info) { size_t addrlen; @@ -2356,6 +2352,7 @@ /* g_return_val_if_fail(error_cb != NULL, NULL); *//* TODO: Soon! */ connect_info = g_new0(GaimProxyConnectInfo, 1); + connect_info->fd = -1; connect_info->connect_cb = connect_cb; connect_info->error_cb = error_cb; connect_info->data = data; @@ -2418,6 +2415,7 @@ /* g_return_val_if_fail(error_cb != NULL, NULL); *//* TODO: Soon! */ connect_info = g_new0(GaimProxyConnectInfo, 1); + connect_info->fd = -1; connect_info->connect_cb = connect_cb; connect_info->error_cb = error_cb; connect_info->data = data; @@ -2437,6 +2435,11 @@ return connect_info; } +void +gaim_proxy_connect_cancel(GaimProxyConnectInfo *connect_info) +{ + gaim_proxy_connect_info_destroy(connect_info); +} static void proxy_pref_cb(const char *name, GaimPrefType type, Modified: trunk/src/proxy.h =================================================================== --- trunk/src/proxy.h 2006-08-13 06:09:48 UTC (rev 16733) +++ trunk/src/proxy.h 2006-08-13 08:38:02 UTC (rev 16734) @@ -271,6 +271,17 @@ GaimProxyErrorFunction error_cb, gpointer data); /** + * Cancel an in-progress connection attempt. This should be called + * by the PRPL if the user disables an account while it is still + * performing the initial sign on. Or when establishing a file + * transfer, if we attempt to connect to a remote user but they + * are behind a firewall then the PRPL can cancel the connection + * attempt early rather than just letting the OS's TCP/IP stack + * time-out the connection. + */ +void gaim_proxy_connect_cancel(GaimProxyConnectInfo *connect_info); + +/** * Do an async dns query * * @param hostname The hostname to resolve This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <the...@us...> - 2006-08-14 04:43:49
|
Revision: 16742 Author: thekingant Date: 2006-08-13 21:43:38 -0700 (Sun, 13 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16742&view=rev Log Message: ----------- Removing the "error_cb" parameter for gaim_proxy_connect(), changing it back to how it was. As I started making changes to oscar to support canceling connection attempts, I realized that having a separate callback for errors would result in more code duplication than was needed. Originally I thought the separate callback would make things cleaner. Anyway, sorry for the noise. Modified Paths: -------------- trunk/plugins/ChangeLog.API trunk/src/ft.c trunk/src/protocols/irc/irc.c trunk/src/protocols/jabber/jabber.c trunk/src/protocols/jabber/si.c trunk/src/protocols/msn/directconn.c trunk/src/protocols/msn/httpconn.c trunk/src/protocols/msn/servconn.c trunk/src/protocols/oscar/oscar.c trunk/src/protocols/oscar/peer.c trunk/src/protocols/qq/qq_proxy.c trunk/src/protocols/sametime/sametime.c trunk/src/protocols/silc/silc.c trunk/src/protocols/simple/simple.c trunk/src/protocols/yahoo/yahoo.c trunk/src/protocols/yahoo/yahoo_filexfer.c trunk/src/protocols/yahoo/yahoo_picture.c trunk/src/protocols/yahoo/yahoochat.c trunk/src/protocols/yahoo/ycht.c trunk/src/proxy.c trunk/src/proxy.h trunk/src/sslconn.c trunk/src/upnp.c trunk/src/util.c Modified: trunk/plugins/ChangeLog.API =================================================================== --- trunk/plugins/ChangeLog.API 2006-08-14 02:16:58 UTC (rev 16741) +++ trunk/plugins/ChangeLog.API 2006-08-14 04:43:38 UTC (rev 16742) @@ -114,9 +114,9 @@ * All network activity has been updated to use non-blocking sockets. This means that plugins must be updated to expect such a socket from gaim_proxy_connect() and gaim_network_listen*(). - * gaim_proxy_connect(): changed to return NULL on error and a void * - handle on success, and changed parameters. It is now possible to - cancel connection attempts. + * gaim_proxy_connect(): changed to return NULL on error and a pointer + to a GaimProxyConnectInfo object which can be used to cancel + connection attempts using gaim_proxy_connect_cancel(). * gaim_gtk_create_imhtml(): Added sw_ret() parameter * gaim_account_get_log(): Added create parameter * GAIM_CMD_P_VERYHIGH is now GAIM_CMD_P_VERY_HIGH Modified: trunk/src/ft.c =================================================================== --- trunk/src/ft.c 2006-08-14 02:16:58 UTC (rev 16741) +++ trunk/src/ft.c 2006-08-14 04:43:38 UTC (rev 16742) @@ -946,7 +946,7 @@ /* Establish a file descriptor. */ gaim_proxy_connect(xfer->account, xfer->remote_ip, - xfer->remote_port, connect_cb, NULL, xfer); + xfer->remote_port, connect_cb, xfer); return; } Modified: trunk/src/protocols/irc/irc.c =================================================================== --- trunk/src/protocols/irc/irc.c 2006-08-14 02:16:58 UTC (rev 16741) +++ trunk/src/protocols/irc/irc.c 2006-08-14 04:43:38 UTC (rev 16742) @@ -327,7 +327,7 @@ connect_info = gaim_proxy_connect(account, irc->server, gaim_account_get_int(account, "port", IRC_DEFAULT_PORT), - irc_login_cb, NULL, gc); + irc_login_cb, gc); if (!connect_info || !gaim_account_get_connection(account)) { gaim_connection_error(gc, _("Couldn't create socket")); Modified: trunk/src/protocols/jabber/jabber.c =================================================================== --- trunk/src/protocols/jabber/jabber.c 2006-08-14 02:16:58 UTC (rev 16741) +++ trunk/src/protocols/jabber/jabber.c 2006-08-14 04:43:38 UTC (rev 16742) @@ -477,7 +477,7 @@ GaimProxyConnectInfo *connect_info; connect_info = gaim_proxy_connect(js->gc->account, server, - port, jabber_login_callback, NULL, js->gc); + port, jabber_login_callback, js->gc); if (connect_info == NULL) gaim_connection_error(js->gc, _("Unable to create socket")); @@ -914,7 +914,7 @@ if(!js->gsc) { connect_info = gaim_proxy_connect(account, server, gaim_account_get_int(account, "port", 5222), - jabber_login_callback, NULL, gc); + jabber_login_callback, gc); if (connect_info == NULL) gaim_connection_error(gc, _("Unable to create socket")); Modified: trunk/src/protocols/jabber/si.c =================================================================== --- trunk/src/protocols/jabber/si.c 2006-08-14 02:16:58 UTC (rev 16741) +++ trunk/src/protocols/jabber/si.c 2006-08-14 04:43:38 UTC (rev 16742) @@ -167,7 +167,7 @@ for(i=0; i<20; i++, p+=2) snprintf(p, 3, "%02x", hashval[i]); - gaim_proxy_connect_socks5(jsx->gpi, dstaddr, 0, jabber_si_bytestreams_connect_cb, NULL, xfer); + gaim_proxy_connect_socks5(jsx->gpi, dstaddr, 0, jabber_si_bytestreams_connect_cb, xfer); g_free(dstaddr); } Modified: trunk/src/protocols/msn/directconn.c =================================================================== --- trunk/src/protocols/msn/directconn.c 2006-08-14 02:16:58 UTC (rev 16741) +++ trunk/src/protocols/msn/directconn.c 2006-08-14 04:43:38 UTC (rev 16742) @@ -439,7 +439,7 @@ #endif connect_info = gaim_proxy_connect(session->account, host, port, - connect_cb, NULL, directconn); + connect_cb, directconn); if (connect_info != NULL) { Modified: trunk/src/protocols/msn/httpconn.c =================================================================== --- trunk/src/protocols/msn/httpconn.c 2006-08-14 02:16:58 UTC (rev 16741) +++ trunk/src/protocols/msn/httpconn.c 2006-08-14 04:43:38 UTC (rev 16742) @@ -739,7 +739,7 @@ msn_httpconn_disconnect(httpconn); connect_info = gaim_proxy_connect(httpconn->session->account, - "gateway.messenger.hotmail.com", 80, connect_cb, NULL, httpconn); + "gateway.messenger.hotmail.com", 80, connect_cb, httpconn); if (connect_info != NULL) { Modified: trunk/src/protocols/msn/servconn.c =================================================================== --- trunk/src/protocols/msn/servconn.c 2006-08-14 02:16:58 UTC (rev 16741) +++ trunk/src/protocols/msn/servconn.c 2006-08-14 04:43:38 UTC (rev 16742) @@ -233,7 +233,7 @@ } connect_info = gaim_proxy_connect(session->account, host, port, - connect_cb, NULL, servconn); + connect_cb, servconn); if (connect_info != NULL) { Modified: trunk/src/protocols/oscar/oscar.c =================================================================== --- trunk/src/protocols/oscar/oscar.c 2006-08-14 02:16:58 UTC (rev 16741) +++ trunk/src/protocols/oscar/oscar.c 2006-08-14 04:43:38 UTC (rev 16742) @@ -1250,7 +1250,7 @@ if (gaim_proxy_connect(account, gaim_account_get_string(account, "server", OSCAR_DEFAULT_LOGIN_SERVER), gaim_account_get_int(account, "port", OSCAR_DEFAULT_LOGIN_PORT), - connection_established_cb, NULL, new_conn_data) == NULL) + connection_established_cb, new_conn_data) == NULL) { gaim_connection_error(gc, _("Couldn't connect to host")); return; @@ -1368,7 +1368,7 @@ new_conn_data->cookie = g_memdup(info->cookie, info->cookielen); new_conn_data->data = NULL; connect_info = gaim_proxy_connect(gc->account, host, port, - connection_established_cb, NULL, new_conn_data); + connection_established_cb, new_conn_data); g_free(host); if (connect_info == NULL) { gaim_connection_error(gc, _("Could Not Connect")); @@ -1574,7 +1574,7 @@ pos->modname = g_strdup(modname); if (gaim_proxy_connect(pos->gc->account, "gaim.sourceforge.net", 80, - straight_to_hell, NULL, pos) == NULL) + straight_to_hell, pos) == NULL) { char buf[256]; if (pos->modname) @@ -1665,7 +1665,7 @@ new_conn_data->data = NULL; } - if (gaim_proxy_connect(account, host, port, connection_established_cb, NULL, new_conn_data) == NULL) + if (gaim_proxy_connect(account, host, port, connection_established_cb, new_conn_data) == NULL) { flap_connection_schedule_destroy(new_conn_data->conn, OSCAR_DISCONNECT_COULD_NOT_CONNECT); Modified: trunk/src/protocols/oscar/peer.c =================================================================== --- trunk/src/protocols/oscar/peer.c 2006-08-14 02:16:58 UTC (rev 16741) +++ trunk/src/protocols/oscar/peer.c 2006-08-14 04:43:38 UTC (rev 16742) @@ -706,7 +706,7 @@ conn->connect_info = gaim_proxy_connect(account, conn->verifiedip, conn->port, - peer_connection_established_cb, NULL, conn); + peer_connection_established_cb, conn); if (conn->connect_info != NULL) { /* Connecting... */ @@ -741,7 +741,7 @@ conn->connect_info = gaim_proxy_connect(account, conn->clientip, conn->port, - peer_connection_established_cb, NULL, conn); + peer_connection_established_cb, conn); if (conn->connect_info != NULL) { /* Connecting... */ @@ -813,7 +813,7 @@ conn->connect_info = gaim_proxy_connect(account, (conn->proxyip != NULL) ? conn->proxyip : PEER_PROXY_SERVER, PEER_PROXY_PORT, - peer_proxy_connection_established_cb, NULL, conn); + peer_proxy_connection_established_cb, conn); if (conn->connect_info != NULL) { /* Connecting... */ Modified: trunk/src/protocols/qq/qq_proxy.c =================================================================== --- trunk/src/protocols/qq/qq_proxy.c 2006-08-14 02:16:58 UTC (rev 16741) +++ trunk/src/protocols/qq/qq_proxy.c 2006-08-14 04:43:38 UTC (rev 16742) @@ -321,7 +321,7 @@ if (use_tcp) /* TCP mode */ - return (gaim_proxy_connect(account, host, port, func, NULL, data) == NULL); + return (gaim_proxy_connect(account, host, port, func, data) == NULL); else /* UDP mode */ return _qq_udp_proxy_connect(account, host, port, func, data); Modified: trunk/src/protocols/sametime/sametime.c =================================================================== --- trunk/src/protocols/sametime/sametime.c 2006-08-14 02:16:58 UTC (rev 16741) +++ trunk/src/protocols/sametime/sametime.c 2006-08-14 04:43:38 UTC (rev 16742) @@ -4,17 +4,17 @@ Adds Lotus Sametime support to Gaim using the Meanwhile library Copyright (C) 2004 Christopher (siege) O'Brien <si...@pr...> - + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, @@ -1409,7 +1409,7 @@ port = gaim_account_get_int(account, MW_KEY_PORT, MW_PLUGIN_DEFAULT_PORT); if(gaim_account_get_bool(account, MW_KEY_FORCE, FALSE) || - (gaim_proxy_connect(account, host, port, connect_cb, NULL, pd) == NULL)) { + (gaim_proxy_connect(account, host, port, connect_cb, pd) == NULL)) { mwSession_forceLogin(session); } @@ -3683,7 +3683,7 @@ gaim_connection_update_progress(gc, _("Connecting"), 1, MW_CONNECT_STEPS); - if(gaim_proxy_connect(account, host, port, connect_cb, NULL, pd) == NULL) { + if(gaim_proxy_connect(account, host, port, connect_cb, pd) == NULL) { gaim_connection_error(gc, _("Unable to connect to host")); } } Modified: trunk/src/protocols/silc/silc.c =================================================================== --- trunk/src/protocols/silc/silc.c 2006-08-14 02:16:58 UTC (rev 16741) +++ trunk/src/protocols/silc/silc.c 2006-08-14 04:43:38 UTC (rev 16742) @@ -367,7 +367,7 @@ gaim_account_get_string(account, "server", "silc.silcnet.org"), gaim_account_get_int(account, "port", 706), - silcgaim_login_connected, NULL, gc) == NULL) + silcgaim_login_connected, gc) == NULL) { gaim_connection_error(gc, _("Unable to create connection")); return; Modified: trunk/src/protocols/simple/simple.c =================================================================== --- trunk/src/protocols/simple/simple.c 2006-08-14 02:16:58 UTC (rev 16741) +++ trunk/src/protocols/simple/simple.c 2006-08-14 04:43:38 UTC (rev 16742) @@ -452,7 +452,7 @@ if(!sip->connecting) { gaim_debug_info("simple", "connecting to %s port %d\n", sip->realhostname ? sip->realhostname : "{NULL}", sip->realport); - connect_info = gaim_proxy_connect(sip->account, sip->realhostname, sip->realport, send_later_cb, NULL, gc); + connect_info = gaim_proxy_connect(sip->account, sip->realhostname, sip->realport, send_later_cb, gc); if(connect_info == NULL) { gaim_connection_error(gc, _("Couldn't create socket")); } @@ -1553,7 +1553,7 @@ sip->realhostname, sip->realport); /* open tcp connection to the server */ connect_info = gaim_proxy_connect(sip->account, sip->realhostname, - sip->realport, login_cb, NULL, sip->gc); + sip->realport, login_cb, sip->gc); if(connect_info == NULL) { gaim_connection_error(sip->gc, _("Couldn't create socket")); } Modified: trunk/src/protocols/yahoo/yahoo.c =================================================================== --- trunk/src/protocols/yahoo/yahoo.c 2006-08-14 02:16:58 UTC (rev 16741) +++ trunk/src/protocols/yahoo/yahoo.c 2006-08-14 04:43:38 UTC (rev 16742) @@ -2348,7 +2348,7 @@ /* Now we have our cookies to login with. I'll go get the milk. */ if (gaim_proxy_connect(account, "wcs2.msg.dcn.yahoo.com", gaim_account_get_int(account, "port", YAHOO_PAGER_PORT), - yahoo_got_web_connected, NULL, gc) == NULL) { + yahoo_got_web_connected, gc) == NULL) { gaim_connection_error(gc, _("Connection problem")); return; } @@ -2516,7 +2516,7 @@ "Host: login.yahoo.com\r\n\r\n"); g_hash_table_destroy(hash); yd->auth = g_string_free(url, FALSE); - if (gaim_proxy_connect(account, "login.yahoo.com", 80, yahoo_got_cookies, NULL, gc) == NULL) { + if (gaim_proxy_connect(account, "login.yahoo.com", 80, yahoo_got_cookies, gc) == NULL) { gaim_connection_error(gc, _("Connection problem")); return; } @@ -2618,7 +2618,7 @@ if (gaim_proxy_connect(account, gaim_account_get_string(account, "serverjp", YAHOOJP_PAGER_HOST), gaim_account_get_int(account, "port", YAHOO_PAGER_PORT), - yahoo_got_connected, NULL, gc) == NULL) + yahoo_got_connected, gc) == NULL) { gaim_connection_error(gc, _("Connection problem")); return; @@ -2628,7 +2628,7 @@ if (gaim_proxy_connect(account, gaim_account_get_string(account, "server", YAHOO_PAGER_HOST), gaim_account_get_int(account, "port", YAHOO_PAGER_PORT), - yahoo_got_connected, NULL, gc) == NULL) + yahoo_got_connected, gc) == NULL) { gaim_connection_error(gc, _("Connection problem")); return; Modified: trunk/src/protocols/yahoo/yahoo_filexfer.c =================================================================== --- trunk/src/protocols/yahoo/yahoo_filexfer.c 2006-08-14 02:16:58 UTC (rev 16741) +++ trunk/src/protocols/yahoo/yahoo_filexfer.c 2006-08-14 04:43:38 UTC (rev 16742) @@ -263,7 +263,7 @@ if (yd->jp) { if (gaim_proxy_connect(account, gaim_account_get_string(account, "xferjp_host", YAHOOJP_XFER_HOST), gaim_account_get_int(account, "xfer_port", YAHOO_XFER_PORT), - yahoo_sendfile_connected, NULL, xfer) == NULL) + yahoo_sendfile_connected, xfer) == NULL) { gaim_notify_error(gc, NULL, _("File Transfer Failed"), _("Unable to establish file descriptor.")); @@ -272,7 +272,7 @@ } else { if (gaim_proxy_connect(account, gaim_account_get_string(account, "xfer_host", YAHOO_XFER_HOST), gaim_account_get_int(account, "xfer_port", YAHOO_XFER_PORT), - yahoo_sendfile_connected, NULL, xfer) == NULL) + yahoo_sendfile_connected, xfer) == NULL) { gaim_notify_error(gc, NULL, _("File Transfer Failed"), _("Unable to establish file descriptor.")); @@ -282,7 +282,7 @@ } else { /* TODO: Using xfer->fd like this is probably a bad thing... */ if (gaim_proxy_connect(account, xfer_data->host, xfer_data->port, - yahoo_receivefile_connected, NULL, xfer) == NULL) + yahoo_receivefile_connected, xfer) == NULL) xfer->fd = -1; else xfer->fd = 0; Modified: trunk/src/protocols/yahoo/yahoo_picture.c =================================================================== --- trunk/src/protocols/yahoo/yahoo_picture.c 2006-08-14 02:16:58 UTC (rev 16741) +++ trunk/src/protocols/yahoo/yahoo_picture.c 2006-08-14 04:43:38 UTC (rev 16742) @@ -484,7 +484,7 @@ if (yd->jp) { if (gaim_proxy_connect(account, gaim_account_get_string(account, "xferjp_host", YAHOOJP_XFER_HOST), gaim_account_get_int(account, "xfer_port", YAHOO_XFER_PORT), - yahoo_buddy_icon_upload_connected, NULL, d) == NULL) + yahoo_buddy_icon_upload_connected, d) == NULL) { gaim_debug_error("yahoo", "Uploading our buddy icon failed to connect.\n"); yahoo_buddy_icon_upload_data_free(d); @@ -492,7 +492,7 @@ } else { if (gaim_proxy_connect(account, gaim_account_get_string(account, "xfer_host", YAHOO_XFER_HOST), gaim_account_get_int(account, "xfer_port", YAHOO_XFER_PORT), - yahoo_buddy_icon_upload_connected, NULL, d) == NULL) + yahoo_buddy_icon_upload_connected, d) == NULL) { gaim_debug_error("yahoo", "Uploading our buddy icon failed to connect.\n"); yahoo_buddy_icon_upload_data_free(d); Modified: trunk/src/protocols/yahoo/yahoochat.c =================================================================== --- trunk/src/protocols/yahoo/yahoochat.c 2006-08-14 02:16:58 UTC (rev 16741) +++ trunk/src/protocols/yahoo/yahoochat.c 2006-08-14 04:43:38 UTC (rev 16742) @@ -1450,7 +1450,7 @@ gaim_roomlist_set_fields(rl, fields); if (gaim_proxy_connect(gaim_connection_get_account(gc), yrl->host, 80, - yahoo_roomlist_got_connected, NULL, yrl) == NULL) + yahoo_roomlist_got_connected, yrl) == NULL) { gaim_notify_error(gc, NULL, _("Connection problem"), _("Unable to fetch room list.")); yahoo_roomlist_cleanup(rl, yrl); @@ -1519,7 +1519,7 @@ gaim_roomlist_room_add(list, yrl->ucat); if (gaim_proxy_connect(list->account, yrl->host, 80, - yahoo_roomlist_got_connected, NULL, yrl) == NULL) + yahoo_roomlist_got_connected, yrl) == NULL) { gaim_notify_error(gaim_account_get_connection(list->account), NULL, _("Connection problem"), _("Unable to fetch room list.")); Modified: trunk/src/protocols/yahoo/ycht.c =================================================================== --- trunk/src/protocols/yahoo/ycht.c 2006-08-14 02:16:58 UTC (rev 16741) +++ trunk/src/protocols/yahoo/ycht.c 2006-08-14 04:43:38 UTC (rev 16742) @@ -571,7 +571,7 @@ if (gaim_proxy_connect(account, gaim_account_get_string(account, "ycht-server", YAHOO_YCHT_HOST), gaim_account_get_int(account, "ycht-port", YAHOO_YCHT_PORT), - ycht_got_connected, NULL, ycht) == NULL) + ycht_got_connected, ycht) == NULL) { ycht_connection_error(ycht, _("Connection problem")); return; Modified: trunk/src/proxy.c =================================================================== --- trunk/src/proxy.c 2006-08-14 02:16:58 UTC (rev 16741) +++ trunk/src/proxy.c 2006-08-14 04:43:38 UTC (rev 16742) @@ -40,7 +40,6 @@ struct _GaimProxyConnectInfo { GaimProxyConnectFunction connect_cb; - GaimProxyErrorFunction error_cb; gpointer data; char *host; int port; @@ -324,7 +323,7 @@ static void gaim_proxy_connect_info_connected(GaimProxyConnectInfo *connect_info) { - connect_info->connect_cb(connect_info->data, connect_info->fd); + connect_info->connect_cb(connect_info->data, connect_info->fd, NULL); /* * We've passed the file descriptor to the protocol, so it's no longer @@ -348,22 +347,7 @@ static void gaim_proxy_connect_info_error(GaimProxyConnectInfo *connect_info, const gchar *error_message) { - if (connect_info->error_cb == NULL) - { - /* - * TODO - * While we're transitioning to the new gaim_proxy_connect() - * code, not all callers supply an error_cb. If this is the - * case then they're expecting connect_cb to be called with - * an fd of -1 in the case of an error. Once all callers have - * been changed this whole if statement should be removed. - */ - connect_info->connect_cb(connect_info->data, -1); - gaim_proxy_connect_info_destroy(connect_info); - return; - } - - connect_info->error_cb(connect_info->data, error_message); + connect_info->connect_cb(connect_info->data, -1, error_message); gaim_proxy_connect_info_destroy(connect_info); } @@ -2339,8 +2323,7 @@ GaimProxyConnectInfo * gaim_proxy_connect(GaimAccount *account, const char *host, int port, - GaimProxyConnectFunction connect_cb, - GaimProxyErrorFunction error_cb, gpointer data) + GaimProxyConnectFunction connect_cb, gpointer data) { const char *connecthost = host; int connectport = port; @@ -2349,12 +2332,10 @@ g_return_val_if_fail(host != NULL, NULL); g_return_val_if_fail(port > 0, NULL); g_return_val_if_fail(connect_cb != NULL, NULL); - /* g_return_val_if_fail(error_cb != NULL, NULL); *//* TODO: Soon! */ connect_info = g_new0(GaimProxyConnectInfo, 1); connect_info->fd = -1; connect_info->connect_cb = connect_cb; - connect_info->error_cb = error_cb; connect_info->data = data; connect_info->host = g_strdup(host); connect_info->port = port; @@ -2404,20 +2385,17 @@ */ GaimProxyConnectInfo * gaim_proxy_connect_socks5(GaimProxyInfo *gpi, const char *host, int port, - GaimProxyConnectFunction connect_cb, - GaimProxyErrorFunction error_cb, gpointer data) + GaimProxyConnectFunction connect_cb, gpointer data) { GaimProxyConnectInfo *connect_info; g_return_val_if_fail(host != NULL, NULL); g_return_val_if_fail(port > 0, NULL); g_return_val_if_fail(connect_cb != NULL, NULL); - /* g_return_val_if_fail(error_cb != NULL, NULL); *//* TODO: Soon! */ connect_info = g_new0(GaimProxyConnectInfo, 1); connect_info->fd = -1; connect_info->connect_cb = connect_cb; - connect_info->error_cb = error_cb; connect_info->data = data; connect_info->host = g_strdup(host); connect_info->port = port; Modified: trunk/src/proxy.h =================================================================== --- trunk/src/proxy.h 2006-08-14 02:16:58 UTC (rev 16741) +++ trunk/src/proxy.h 2006-08-14 04:43:38 UTC (rev 16742) @@ -58,8 +58,7 @@ typedef struct _GaimProxyConnectInfo GaimProxyConnectInfo; -typedef void (*GaimProxyConnectFunction)(gpointer data, gint source); -typedef void (*GaimProxyErrorFunction)(gpointer dat, const gchar *error_message); +typedef void (*GaimProxyConnectFunction)(gpointer data, gint source, const gchar *error_message); /** * The "hosts" parameter is a linked list containing pairs of @@ -235,9 +234,9 @@ * @param host The destination host. * @param port The destination port. * @param connect_cb The function to call when the connection is - * established. - * @param error_cb The function to call if there is an error while - * establishing the connection. + * established. If the connection failed then + * fd will be -1 and error message will be set + * to something descriptive (hopefully). * @param data User-defined data. * * @return NULL if there was an error, or a reference to a data @@ -246,8 +245,7 @@ */ GaimProxyConnectInfo *gaim_proxy_connect(GaimAccount *account, const char *host, int port, - GaimProxyConnectFunction connect_cb, - GaimProxyErrorFunction error_cb, gpointer data); + GaimProxyConnectFunction connect_cb, gpointer data); /** * Makes a connection through a SOCKS5 proxy. @@ -256,9 +254,9 @@ * @param host The destination host. * @param port The destination port. * @param connect_cb The function to call when the connection is - * established. - * @param error_cb The function to call if there is an error while - * establishing the connection. + * established. If the connection failed then + * fd will be -1 and error message will be set + * to something descriptive (hopefully). * @param data User-defined data. * * @return NULL if there was an error, or a reference to a data @@ -267,8 +265,7 @@ */ GaimProxyConnectInfo *gaim_proxy_connect_socks5(GaimProxyInfo *gpi, const char *host, int port, - GaimProxyConnectFunction connect_cb, - GaimProxyErrorFunction error_cb, gpointer data); + GaimProxyConnectFunction connect_cb, gpointer data); /** * Cancel an in-progress connection attempt. This should be called Modified: trunk/src/sslconn.c =================================================================== --- trunk/src/sslconn.c 2006-08-14 02:16:58 UTC (rev 16741) +++ trunk/src/sslconn.c 2006-08-14 04:43:38 UTC (rev 16742) @@ -95,7 +95,7 @@ gsc->connect_cb = func; gsc->error_cb = error_func; - connect_info = gaim_proxy_connect(account, host, port, ops->connect_cb, NULL, gsc); + connect_info = gaim_proxy_connect(account, host, port, ops->connect_cb, gsc); if (connect_info == NULL) { Modified: trunk/src/upnp.c =================================================================== --- trunk/src/upnp.c 2006-08-14 02:16:58 UTC (rev 16741) +++ trunk/src/upnp.c 2006-08-14 04:43:38 UTC (rev 16742) @@ -811,7 +811,7 @@ } if(gaim_proxy_connect(NULL, addressOfControl, port, - looked_up_internal_ip_cb, NULL, NULL) == NULL) + looked_up_internal_ip_cb, NULL) == NULL) { gaim_debug_error("upnp", "Get Local IP Connect Failed: Address: %s @@@ Port %d\n", addressOfControl, port); Modified: trunk/src/util.c =================================================================== --- trunk/src/util.c 2006-08-14 02:16:58 UTC (rev 16741) +++ trunk/src/util.c 2006-08-14 04:43:38 UTC (rev 16742) @@ -3448,7 +3448,7 @@ &gfud->website.page, &gfud->website.user, &gfud->website.passwd); if (gaim_proxy_connect(NULL, gfud->website.address, - gfud->website.port, url_fetch_connect_cb, NULL, gfud) == NULL) + gfud->website.port, url_fetch_connect_cb, gfud) == NULL) { destroy_fetch_url_data(gfud); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <the...@us...> - 2006-08-14 08:32:54
|
Revision: 16755 Author: thekingant Date: 2006-08-14 01:32:52 -0700 (Mon, 14 Aug 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16755&view=rev Log Message: ----------- Whoops, few more warning fixes Modified Paths: -------------- trunk/src/connection.h trunk/src/ft.c trunk/src/upnp.c trunk/src/util.c Modified: trunk/src/connection.h =================================================================== --- trunk/src/connection.h 2006-08-14 08:27:53 UTC (rev 16754) +++ trunk/src/connection.h 2006-08-14 08:32:52 UTC (rev 16755) @@ -271,6 +271,10 @@ * * @return @c TRUE if gc is valid. */ +/* + * TODO: Eventually this bad boy will be removed, because it is + * a gross fix for a crashy problem. + */ #define GAIM_CONNECTION_IS_VALID(gc) (g_list_find(gaim_connections_get_all(), (gc))) /*@}*/ Modified: trunk/src/ft.c =================================================================== --- trunk/src/ft.c 2006-08-14 08:27:53 UTC (rev 16754) +++ trunk/src/ft.c 2006-08-14 08:32:52 UTC (rev 16755) @@ -911,7 +911,7 @@ } static void -connect_cb(gpointer data, gint source) +connect_cb(gpointer data, gint source, const gchar *error_message) { GaimXfer *xfer = (GaimXfer *)data; Modified: trunk/src/upnp.c =================================================================== --- trunk/src/upnp.c 2006-08-14 08:27:53 UTC (rev 16754) +++ trunk/src/upnp.c 2006-08-14 08:32:52 UTC (rev 16755) @@ -780,7 +780,7 @@ } static void -looked_up_internal_ip_cb(gpointer data, gint source) +looked_up_internal_ip_cb(gpointer data, gint source, const gchar *error_message) { if (source) { strncpy(control_info.internalip, Modified: trunk/src/util.c =================================================================== --- trunk/src/util.c 2006-08-14 08:27:53 UTC (rev 16754) +++ trunk/src/util.c 2006-08-14 08:32:52 UTC (rev 16755) @@ -3367,7 +3367,7 @@ } static void -url_fetch_connect_cb(gpointer url_data, gint source) +url_fetch_connect_cb(gpointer url_data, gint source, const gchar *error_message) { GaimFetchUrlData *gfud; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |