# HG changeset patch # User Mike Ruprecht # Date 1229158138 0 # Node ID 93cc8982d4e5a188e946041e3fe2f89d0cdb1b0e # Parent 1ce297c8923b0a239f44b48c24317b28cae8ad9e# Parent cb4337d6c803852615a91539357c7055f5bbfc07 explicit merge of '094ca19cc431d185c7b94947bfcd7cfc2d2f4a0b' and 'a92ecd05b30230b85149a7c4edbcb269bc1c4841' diff -r cb4337d6c803 -r 93cc8982d4e5 .mtn-ignore --- a/.mtn-ignore Sat Dec 13 08:46:42 2008 +0000 +++ b/.mtn-ignore Sat Dec 13 08:48:58 2008 +0000 @@ -39,6 +39,7 @@ pidgin/pidgin$ pidgin/pixmaps/emotes/default/24/theme pidgin/pixmaps/emotes/none/theme +pidgin/pixmaps/emotes/small/16/theme pidgin/plugins/musicmessaging/music-messaging-bindings.c pidgin/plugins/perl/common/Makefile.PL$ pidgin/plugins/perl/common/Makefile.old diff -r cb4337d6c803 -r 93cc8982d4e5 COPYRIGHT --- a/COPYRIGHT Sat Dec 13 08:46:42 2008 +0000 +++ b/COPYRIGHT Sat Dec 13 08:48:58 2008 +0000 @@ -145,6 +145,7 @@ Evgueni V. Gavrilov Ignacy Gawedzki Georgi Georgiev +Brian Geppert Thomas Gibson-Robinson Ike Gingerich Gustavo Giráldez @@ -219,6 +220,7 @@ Tuomas Kuosmanen Tero Kuusela Richard Laager +Jacky Lam Scott Lamb Dennis Lambe Jr. Joe LaPenna @@ -306,7 +308,7 @@ Ted Percival Eduardo Pérez Matt Perry -Diego Petten +Diego Petten Nathan Peterson Sebastián E. Peyrott Celso Pinto @@ -322,7 +324,7 @@ Jory A. Pratt Brent Priddy Justin Pryzby -Florian Quze +Florian Quèze Ignacio Casal Quinteiro Federicco Mena Quintero Yosef Radchenko @@ -463,6 +465,7 @@ Dan Willemsen Justin Williams (Jaywalker) Jason Willis +Alex Willmer Matt Wilson Dan Winship Scott Wolchok @@ -475,6 +478,7 @@ Jared Yanovich Timmy Yee Nickolai Zeldovich +Tom Zickel Marco Ziech Piotr Zielinski Jeroen Zwartepoorte diff -r cb4337d6c803 -r 93cc8982d4e5 ChangeLog --- a/ChangeLog Sat Dec 13 08:46:42 2008 +0000 +++ b/ChangeLog Sat Dec 13 08:48:58 2008 +0000 @@ -7,6 +7,14 @@ "Microsoft Internet Authority" certificates. People that use --with-system-ssl-certs and GnuTLS need to include these in the system certs directory. + * Corrected maximum message lengths for Yahoo! + * Fix some problems with Gadu-Gadu buddy icons (Adam Strzelecki) + * Enable auto-reply on Zephyr, to emulate 'zaway' (Toby Schaffer) + * The Buddy State Notification plugin no longer prints duplicate + notifications when the same buddy is in multiple groups (Florian Quèze) + * The Buddy State Notification plugin no longer turns JID's, MSN Passport + ID's, etc. into links (Florian Quèze) + * Fix a crash in SIMPLE when a malformed message is received. Pidgin: * On GTK+ 2.14 and higher, we're using the gtk-tooltip-delay setting @@ -17,6 +25,8 @@ To completely disable tooltips (e.g. if you had an old tooltip_delay of zero), add this to ~/.purple/gtkrc-2.0: gtk-enable-tooltips = 0 + * Moved the release notification dialog to a mini-dialog in the + buddylist. (Thanks to Casey Ho) Finch: * Allow binding meta+arrow keys for actions. diff -r cb4337d6c803 -r 93cc8982d4e5 Makefile.am --- a/Makefile.am Sat Dec 13 08:46:42 2008 +0000 +++ b/Makefile.am Sat Dec 13 08:48:58 2008 +0000 @@ -34,6 +34,7 @@ (cd po ; intltool-update -m 2>&1 | grep -v '^mismatched quotes.*\.py$$' | sed "s|current directory|po directory|" | grep . ; if [ $$? = 0 ] ; then exit 1 ; else exit 0 ; fi) LC_ALL=C sort -c -t/ -u po/POTFILES.in LC_ALL=C sort -c -t/ -u po/POTFILES.skip + iconv -f utf8 -t utf8 COPYRIGHT | cmp COPYRIGHT - version-check: commit-check # We don't want to release development versions. diff -r cb4337d6c803 -r 93cc8982d4e5 configure.ac --- a/configure.ac Sat Dec 13 08:46:42 2008 +0000 +++ b/configure.ac Sat Dec 13 08:48:58 2008 +0000 @@ -1063,23 +1063,23 @@ extern_init= load_proto= for i in $STATIC_PRPLS ; do - dnl Ugly special case for "libsilcpurple.a": + dnl Ugly special case for "libsilcpurple.la": dnl ... and Ugly special case for multi-protocol oscar if test \( "x$i" = "xoscar" -o "x$i" = "xaim" -o "x$i" = "xicq" \) -a "x$static_oscar" != "xyes"; then - STATIC_LINK_LIBS="$STATIC_LINK_LIBS \$(top_builddir)/libpurple/protocols/oscar/liboscar.a" + STATIC_LINK_LIBS="$STATIC_LINK_LIBS \$(top_builddir)/libpurple/protocols/oscar/liboscar.la" extern_init="$extern_init extern gboolean purple_init_aim_plugin();" extern_init="$extern_init extern gboolean purple_init_icq_plugin();" load_proto="$load_proto purple_init_aim_plugin();" load_proto="$load_proto purple_init_icq_plugin();" else if test "x$i" = "xsilc"; then - STATIC_LINK_LIBS="$STATIC_LINK_LIBS \$(top_builddir)/libpurple/protocols/$i/lib${i}purple.a" + STATIC_LINK_LIBS="$STATIC_LINK_LIBS \$(top_builddir)/libpurple/protocols/$i/lib${i}purple.la" elif test "x$i" = "xsilc10"; then - STATIC_LINK_LIBS="$STATIC_LINK_LIBS \$(top_builddir)/libpurple/protocols/$i/libsilcpurple.a" + STATIC_LINK_LIBS="$STATIC_LINK_LIBS \$(top_builddir)/libpurple/protocols/$i/libsilcpurple.la" elif test "x$i" = "xmsnp9"; then - STATIC_LINK_LIBS="$STATIC_LINK_LIBS \$(top_builddir)/libpurple/protocols/$i/libmsn.a" + STATIC_LINK_LIBS="$STATIC_LINK_LIBS \$(top_builddir)/libpurple/protocols/$i/libmsn.la" else - STATIC_LINK_LIBS="$STATIC_LINK_LIBS \$(top_builddir)/libpurple/protocols/$i/lib$i.a" + STATIC_LINK_LIBS="$STATIC_LINK_LIBS \$(top_builddir)/libpurple/protocols/$i/lib$i.la" fi extern_init="$extern_init extern gboolean purple_init_${i}_plugin();" load_proto="$load_proto purple_init_${i}_plugin();" @@ -2437,6 +2437,7 @@ pidgin/pixmaps/Makefile pidgin/pixmaps/emotes/default/24/Makefile pidgin/pixmaps/emotes/none/Makefile + pidgin/pixmaps/emotes/small/16/Makefile pidgin/plugins/Makefile pidgin/plugins/cap/Makefile pidgin/plugins/gestures/Makefile diff -r cb4337d6c803 -r 93cc8982d4e5 doc/TCL-HOWTO.dox --- a/doc/TCL-HOWTO.dox Sat Dec 13 08:46:42 2008 +0000 +++ b/doc/TCL-HOWTO.dox Sat Dec 13 08:48:58 2008 +0000 @@ -4,11 +4,11 @@ NOTA BENE: This documentation is badly out of date for 2.x. -The Gaim Tcl interface provides a Tcl API for many useful gaim -functions. Like the perl API, the Tcl API does not provide -access to every corner of gaim exposed by the @e C interface. It does, -however, provide a very powerful interface to many of Gaim's functions -through a simple to learn and extend scripting language. +The libpurple Tcl interface provides a Tcl API for many useful libpurple +functions. Like the perl API, the Tcl API does not provide access to +every corner of libpurple exposed by the @e C interface. It does, +however, provide a very powerful interface to many of libpurple's +functions through a simple to learn and extend scripting language. If you are not familiar with Tcl, you will probably find it somewhat different from what you are used to. Despite being somewhat unique @@ -19,7 +19,7 @@ @section start Getting Started -The only requirement placed on a Gaim Tcl script by Gaim is the +The only requirement placed on a purple Tcl script by libpurple is the existence of a procedure called @c plugin_init. This procedure has some limitations placed upon it; it will be parsed and evaluated before the rest of the Tcl script, so it cannot reference any other variables @@ -42,56 +42,57 @@ @endcode The rest of the script will generally be registration to recieve -notification of various Gaim signals (more about this below) and -definitions of procedures to be executed when those signals occur. +notification of various purple (or Pidgin, or finch, or ...) signals +(more about this below) and definitions of procedures to be executed +when those signals occur. @section details Interpreter Details -Gaim initializes and drives the Tcl event loop (similar to Tk), +libpurple initializes and drives the Tcl event loop (similar to Tk), meaning that commands like @c fileevent and @c after are available and do not require @c vwait etc. The @c vwait actually seems to be somewhat broken due to a bug somewhere in the Tcl/Glib event loop glue, and it should not be used for now. -The gaim-specific functions are provided in a statically-linked -package called @c gaim; this means that if you spawn a child -interpreter and wish to use the gaim-specific functions, you will need -to execute load {} gaim in that interpreter. +The purple-specific functions are provided in a statically-linked +package called @c purple; this means that if you spawn a child +interpreter and wish to use the purple-specific functions, you will need +to execute load {} purple in that interpreter. -@section internals Gaim Internal Procedures and Variables +@section internals purple Internal Procedures and Variables -All of the information provided for your use by Gaim will be in the @c -::gaim namespace. This means that in order to access it you will either -have to import the gaim namespace (e.g. via the command namespace -import gaim::*) or reference it explicitly. The following +All of the information provided for your use by purple will be in the @c +::purple namespace. This means that in order to access it you will either +have to import the purple namespace (e.g. via the command namespace +import purple::*) or reference it explicitly. The following descriptions will reference it explicitly for clarity. @li Variables @code -gaim::version +purple::version @endcode - This contains the version of the gaim process which loaded the + This contains the version of the libpurple library which loaded the script. @li Commands @code -gaim::account alias account -gaim::account connect account -gaim::account connection account -gaim::account disconnect account -gaim::account find username protocol -gaim::account handle -gaim::account isconnected account -gaim::account list ?option? -gaim::account protocol account -gaim::account username account +purple::account alias account +purple::account connect account +purple::account connection account +purple::account disconnect account +purple::account find username protocol +purple::account handle +purple::account isconnected account +purple::account list ?option? +purple::account protocol account +purple::account username account @endcode - The @c gaim::account command consists of a set of subcommands - pertaining to gaim accounts. + The @c purple::account command consists of a set of subcommands + pertaining to purple accounts. @c alias returns the alias for the account @c account. If there is no alias for the given account, it returns the empty string. @@ -101,24 +102,24 @@ the @c gc for the account. @c connection returns the @c gc of the given account if it is connected, - or 0 if it is not. This @c gc is the gc used by gaim::connection and + or 0 if it is not. This @c gc is the gc used by purple::connection and other functions. @c disconnect disconnects the given @c account if it is connected, or does nothing if it is. @c find finds an account by its @c username and @c protocol (as returned by - gaim::account username and gaim::account protocol) and + purple::account username and purple::account protocol) and returns the account if found, or 0 otherwise. @c handle returns the instance handle required to connect to account - signals. (See gaim::signal connect). + signals. (See purple::signal connect). The @c isconnected query returns true if the given account is connected and false otherwise. The @c list subcommand returns a list of all of the accounts known to - Gaim. The elements of this lists are accounts appropriate for the + libpurple. The elements of this lists are accounts appropriate for the @c account argument of the other subcommands. The @c -all option (default) returns all accounts, while the @c -online option returns only those accounts which are online. @@ -130,13 +131,13 @@ @c account. @code -gaim::buddy alias buddy -gaim::buddy handle -gaim::buddy info ( buddy | account username ) -gaim::buddy list +purple::buddy alias buddy +purple::buddy handle +purple::buddy info ( buddy | account username ) +purple::buddy list @endcode - @c gaim::buddy is a set of commands for retrieving information about + @c purple::buddy is a set of commands for retrieving information about buddies and manipulating the buddy list. For the purposes of Tcl, a "buddy" is currently a list of several elements, the first of which being the type. The currently recognized types are "group", @@ -157,73 +158,73 @@ exists, or the empty string if it does not. @c handle returns the blist handle for the purposes of connecting - signals to buddy list events. (See gaim::signal connect). + signals to buddy list events. (See purple::signal connect). - @c info causes gaim to display the info dialog for the given buddy. - Since it is possible to request user info for a buddy not in your - buddy list, you may also specify a buddy by his or her username and - the account through which you wish to retrieve info. + @c info causes the purple-using UI to display the info dialog for the + given buddy. Since it is possible to request user info for a buddy + not in your buddy list, you may also specify a buddy by his or her + username and the account through which you wish to retrieve info. @c list returns a list of @c group structures, filled out with buddies and chats as described above. @code -gaim::connection account gc -gaim::connection displayname gc -gaim::connection handle -gaim::connection list +purple::connection account gc +purple::connection displayname gc +purple::connection handle +purple::connection list @endcode - @c gaim::connection is a collection of subcommands pertaining to + @c purple::connection is a collection of subcommands pertaining to account connections. - @c account returns the Gaim account associated with @c gc. This - account is the same account used by @c gaim::account and other + @c account returns the purple account associated with @c gc. This + account is the same account used by @c purple::account and other commands. @c displayname returns the display name (duh) of @c gc as reported by - gaim_connection_get_display_name(gc). + purple_connection_get_display_name(gc). - @c handle returns the gaim connections instance handle. (See - gaim::signal connect). + @c handle returns the purple connections instance handle. (See + purple::signal connect). @c list returns a list of all known connections. The elements of this list are appropriate as @c gc arguments to the other - @c gaim::connection subcommands or other commands requiring a gc. + @c purple::connection subcommands or other commands requiring a gc. @code -gaim::conv_send account who text +purple::conv_send account who text @endcode - @c gaim::conv is simply a convenience wrapper for @c gaim::send_im and - gaim::conversation write. It sends the IM, determines the from - and to arguments for gaim::conversation write, and prints the text + @c purple::conv is simply a convenience wrapper for @c purple::send_im and + purple::conversation write. It sends the IM, determines the from + and to arguments for purple::conversation write, and prints the text sent to the conversation as one would expect. For the curious, you - may view the source for it by typing info body gaim::conv_send at - a Gaim Commander prompt. + may view the source for it by typing info body purple::conv_send at + a Purple Commander prompt. - Note that an error in either @c gaim::send_im or gaim::conversation + Note that an error in either @c purple::send_im or purple::conversation write will not be caught by this procedure, and will be propagated to the caller. @code -gaim::conversation find ?-account account? name -gaim::conversation handle -gaim::conversation list -gaim::conversation new ?-chat? ?-im? account name -gaim::conversation write conversation style from to text +purple::conversation find ?-account account? name +purple::conversation handle +purple::conversation list +purple::conversation new ?-chat? ?-im? account name +purple::conversation write conversation style from to text @endcode - @c gaim::conversation provides an API for dealing with conversations. - Given that Gaim is an instant messenger program, you'll probably - spend a lot of time here. + @c purple::conversation provides an API for dealing with + conversations. Given that libpurple clients are instant messenger + programs, you'll probably spend a lot of time here. The command @c find attempts to find an existing conversation with username @c name. If the @c -account option is given, it refines its search to include only conversations on that account. @c handle returns the conversations instance handle for the purposes - of signal connection. (See gaim::signal connect). + of signal connection. (See purple::signal connect). @c list returns a list of all currently open conversations. @@ -235,56 +236,56 @@ @c write is used to write to the specified conversation. The @c style argument specifies how the text should be printed -- as text coming - from the gaim user (style @c send), being sent to the gaim user + from the purple user (style @c send), being sent to the purple user (style @c recv), or as a system message (such as "so-and-so has signed off", style @c system). From is the name to whom the text should be attributed -- you probably want to check for aliases here, lest you confuse the user. @c text is the text to print. @code -gaim::core handle -gaim::core quit +purple::core handle +purple::core quit @endcode - This command exposes functionality provided by the gaim core API. + This command exposes functionality provided by the purple core API. - gaim::core handle returns a handle to the gaim core for signal - connection. (See gaim::signal connect). + purple::core handle returns a handle to the purple core for signal + connection. (See purple::signal connect). - @c quit exits gaim cleanly, and should be used in preference to the - tcl @c exit command. (Note that @c exit has not been removed, - however.) + @c quit exits the libpurple client cleanly, and should be used in + preference to the tcl @c exit command. (Note that @c exit has not + been removed, however.) @code -gaim::debug level category message +purple::debug level category message @endcode - Equivalent to the C gaim_debug function, this command outputs - debugging information to the gaim debug window (or stdout if gaim is - invoked with -d|--debug). The valid levels are, in increasing level - of severity, @c -misc, @c -info, @c -warning, and, or @c -error. @c - category is a short (a few characters ... for instance, "tcl" or "tcl - plugin") "topic" type name for this message, and @c message is the text - of the message. In the style of Tcl @e puts (and differing from - @e gaim_debug), no trailing \\n is required. (However, embedded newlines - may be generated with \\n). + Equivalent to the C purple_debug function, this command outputs + debugging information to the libpurple UI's debug window (or, + typically, stdout if that UI is invoked with -d|--debug). The valid + levels are, in increasing level of severity, @c -misc, @c -info, @c + -warning, and, or @c -error. @c category is a short (a few characters + ... for instance, "tcl" or "tcl plugin") "topic" type name for this + message, and @c message is the text of the message. In the style of + Tcl @e puts (and differing from @e purple_debug), no trailing \\n is + required. (However, embedded newlines may be generated with \\n). @code -gaim::notify ?type? title primary secondary +purple::notify ?type? title primary secondary @endcode - Also a direct equivalent to a C function, gaim_notify, this command - causes gaim to present the provided notification information to the - user via some appropriate UI method. The @c type argument, if - present, must be one of @c -error, @c -warning, or @c -info. The following - three arguments' absolute meanings may vary with the Gaim UI being - used (presently only a Gtk2 UI is available), but @c title should - generally be the title of the window, and @c primary and @c secondary - text within that window; in the Gtk2 UI, @c primary is slightly - larger than @c secondary and displayed in a @b boldface font. + Also a direct equivalent to a C function, purple_notify, this command + causes libpurple to present the provided notification information to + the user via some appropriate UI method. The @c type argument, if + present, must be one of @c -error, @c -warning, or @c -info. The + following three arguments' absolute meanings may vary with the purple + UI being used, but @c title should generally be the title of the + window, and @c primary and @c secondary text within that window; in + the Pidgin UI, @c primary is slightly larger than @c secondary and + displayed in a @b boldface font. @code -gaim::send_im gc who text +purple::send_im gc who text @endcode This sends an IM in the fashion of serv_send_im. @c gc is the GC of @@ -293,31 +294,31 @@ and @c text is the text of the message. @code -gaim::signal connect instance signal args proc -gaim::signal disconnect instance signal +purple::signal connect instance signal args proc +purple::signal disconnect instance signal @endcode - @c gaim::signal is a set of subcommands for dealing with gaim signals - (known as "events" prior to gaim 0.68). + @c purple::signal is a set of subcommands for dealing with purple + signals. The @c connect subcommand registers the procedure @c proc as a handler for the signal @c signal on the instance @c instance. @c instance should be an instance handle as returned by one of the @c handle - commands from the various parts of gaim. @c args and @ proc are as in - the Tcl @e proc command; note that the number of arguments in @c args - must match the number of arguments emitted by the signal exactly, + commands from the various parts of libpurple. @c args and @ proc are + as in the Tcl @e proc command; note that the number of arguments in @c + args must match the number of arguments emitted by the signal exactly, although you need not use them all. The procedure @c proc may be either a simple command or a procedure in curly brackets. Note that only one procedure may be associated with each signal; an attempt to - connect a second procedure to the same signal will remove the - existing binding and replace it with the new procedure. - gaim::signal connect returns 0 on success and 1 on failure. + connect a second procedure to the same signal will remove the existing + binding and replace it with the new procedure. purple::signal + connect returns 0 on success and 1 on failure. @c disconnect removes any existing signal handler for the named signal and instance. @code -gaim::unload +purple::unload @endcode This unloads the current plugin. Note that preferences will not be @@ -338,9 +339,9 @@ might look like this: @code -gaim::signal connect [gaim::conversation handle] receiving-im-msg { +purple::signal connect [purple::conversation handle] receiving-im-msg { if {[ string match "*shizzle*" $event::buffer ]} { - gaim::notify -info "tcl plugin" "Fo' shizzle" \ + purple::notify -info "tcl plugin" "Fo' shizzle" \ "$event::sender is down with the shizzle" } } @@ -348,7 +349,7 @@ Note that for some signals (notably @c receiving-im-msg, @c sending-im-msg, and their chat counterparts), changes to the event arguments will -change the message itself from Gaim's vantage. For those signals +change the message itself from libpurple's vantage. For those signals whose return value is meaningful, returning a value from the Tcl event will return that value as it would in C. diff -r cb4337d6c803 -r 93cc8982d4e5 doc/funniest_home_convos.txt --- a/doc/funniest_home_convos.txt Sat Dec 13 08:46:42 2008 +0000 +++ b/doc/funniest_home_convos.txt Sat Dec 13 08:48:58 2008 +0000 @@ -556,3 +556,12 @@ (16:58:10) elb: I just spent literally a couple of HOURS trying to debug a problem where I was using g_list_delete_link with a list item which wasn't in the list + +-- + +22:35 hi I know this might sound like a stupid question and I am NOT + trolling.. +22:36 but when I go to some channels like anime ones people lol at me + for using pidgen +22:36 why do they think this is a bad client? does it have history? + diff -r cb4337d6c803 -r 93cc8982d4e5 finch/gntdebug.c --- a/finch/gntdebug.c Sat Dec 13 08:46:42 2008 +0000 +++ b/finch/gntdebug.c Sat Dec 13 08:48:58 2008 +0000 @@ -234,7 +234,7 @@ } fprintf(fp, "Finch Debug Log : %s\n", purple_date_format_full(NULL)); - fprintf(fp, tv->string->str); + fprintf(fp, "%s", tv->string->str); fclose(fp); gnt_widget_destroy(GNT_WIDGET(fs)); } diff -r cb4337d6c803 -r 93cc8982d4e5 finch/libgnt/gntentry.c --- a/finch/libgnt/gntentry.c Sat Dec 13 08:46:42 2008 +0000 +++ b/finch/libgnt/gntentry.c Sat Dec 13 08:48:58 2008 +0000 @@ -903,6 +903,7 @@ GNT_KEY_CTRL_K, NULL); gnt_bindable_class_register_action(bindable, "delete-prev-word", del_prev_word, GNT_KEY_CTRL_W, NULL); + gnt_bindable_register_binding(bindable, "delete-prev-word", "\033", s, NULL); gnt_bindable_class_register_action(bindable, "cursor-prev-word", move_back_word, "\033" "b", NULL); gnt_bindable_class_register_action(bindable, "cursor-prev", move_back, diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/blist.c --- a/libpurple/blist.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/blist.c Sat Dec 13 08:48:58 2008 +0000 @@ -2214,6 +2214,7 @@ struct proto_chat_entry *pce; PurpleBlistNode *node, *group; GList *parts; + char *normname; g_return_val_if_fail(purplebuddylist != NULL, NULL); g_return_val_if_fail((name != NULL) && (*name != '\0'), NULL); @@ -2227,6 +2228,7 @@ if (prpl_info->find_blist_chat != NULL) return prpl_info->find_blist_chat(account, name); + normname = g_strdup(purple_normalize(account, name)); for (group = purplebuddylist->root; group != NULL; group = group->next) { for (node = group->child; node != NULL; node = node->next) { if (PURPLE_BLIST_NODE_IS_CHAT(node)) { @@ -2246,14 +2248,15 @@ g_list_free(parts); if (chat->account == account && chat_name != NULL && - name != NULL && !strcmp(chat_name, name)) { - + normname != NULL && !strcmp(purple_normalize(account, chat_name), normname)) { + g_free(normname); return chat; } } } } + g_free(normname); return NULL; } diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/dbus-analyze-functions.py --- a/libpurple/dbus-analyze-functions.py Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/dbus-analyze-functions.py Sat Dec 13 08:48:58 2008 +0000 @@ -372,13 +372,13 @@ def inputsimple(self, type, name, us): if us: + self.cdecls.append("\tdbus_uint32_t %s;" % name) + self.cparams.append(("UINT32", name)) + self.addintype("u", name) + else: self.cdecls.append("\tdbus_int32_t %s;" % name) self.cparams.append(("INT32", name)) self.addintype("i", name) - else: - self.cdecls.append("\tdbus_uint32_t %s;" % name) - self.cparams.append(("UINT32", name)) - self.addintype("u", name) def inputstring(self, type, name, us): if us: diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/dnsquery.c --- a/libpurple/dnsquery.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/dnsquery.c Sat Dec 13 08:48:58 2008 +0000 @@ -345,6 +345,12 @@ { g_return_if_fail(resolver != NULL); + /* Keep this before the kill() call below. */ + if (resolver->inpa != 0) { + purple_input_remove(resolver->inpa); + resolver->inpa = 0; + } + /* * We might as well attempt to kill our child process. It really * doesn't matter if this fails, because children will expire on @@ -353,9 +359,6 @@ if (resolver->dns_pid > 0) kill(resolver->dns_pid, SIGKILL); - if (resolver->inpa != 0) - purple_input_remove(resolver->inpa); - close(resolver->fd_in); close(resolver->fd_out); diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/media.c --- a/libpurple/media.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/media.c Sat Dec 13 08:48:58 2008 +0000 @@ -451,6 +451,25 @@ return NULL; } +static GList * +purple_media_get_streams(PurpleMedia *media, const gchar *session, + const gchar *participant) +{ + GList *streams = media->priv->streams; + GList *ret = NULL; + + for (; streams; streams = g_list_next(streams)) { + PurpleMediaStream *stream = streams->data; + if ((session == NULL || + !strcmp(stream->session->id, session)) && + (participant == NULL || + !strcmp(stream->participant, participant))) + ret = g_list_append(ret, stream); + } + + return ret; +} + static void purple_media_add_session(PurpleMedia *media, PurpleMediaSession *session) { @@ -1378,4 +1397,46 @@ } } +void purple_media_set_input_volume(PurpleMedia *media, + const gchar *session_id, double level) +{ + GList *sessions; + + if (session_id == NULL) + sessions = g_hash_table_get_values(media->priv->sessions); + else + sessions = g_list_append(NULL, + purple_media_get_session(media, session_id)); + + for (; sessions; sessions = g_list_delete_link(sessions, sessions)) { + PurpleMediaSession *session = sessions->data; + + if (session->type & PURPLE_MEDIA_SEND_AUDIO) { + GstElement *volume = gst_bin_get_by_name( + GST_BIN(session->src), + "purpleaudioinputvolume"); + g_object_set(volume, "volume", level, NULL); + } + } +} + +void purple_media_set_output_volume(PurpleMedia *media, + const gchar *session_id, const gchar *participant, + double level) +{ + GList *streams = purple_media_get_streams(media, + session_id, participant); + + for (; streams; streams = g_list_delete_link(streams, streams)) { + PurpleMediaStream *stream = streams->data; + + if (stream->session->type & PURPLE_MEDIA_RECV_AUDIO) { + GstElement *volume = gst_bin_get_by_name( + GST_BIN(stream->session->sink), + "purpleaudiooutputvolume"); + g_object_set(volume, "volume", level, NULL); + } + } +} + #endif /* USE_VV */ diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/media.h --- a/libpurple/media.h Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/media.h Sat Dec 13 08:48:58 2008 +0000 @@ -479,6 +479,26 @@ */ void purple_media_mute(PurpleMedia *media, gboolean active); +/** + * Sets the input volume of all the selected sessions. + * + * @param media The media object the sessions are in. + * @param session_id The session to select (if any). + * @param level The level to set the volume to. + */ +void purple_media_set_input_volume(PurpleMedia *media, const gchar *session_id, double level); + +/** + * Sets the output volume of all the selected streams. + * + * @param media The media object the streams are in. + * @param session_id The session to limit the streams to (if any). + * @param participant The participant to limit the streams to (if any). + * @param level The level to set the volume to. + */ +void purple_media_set_output_volume(PurpleMedia *media, const gchar *session_id, + const gchar *participant, double level); + #ifdef __cplusplus } #endif diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/notify.h --- a/libpurple/notify.h Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/notify.h Sat Dec 13 08:48:58 2008 +0000 @@ -236,7 +236,8 @@ * Adds a stock button that will be displayed in the search results dialog. * * @param results The search results object. - * @param type Type of the button. (TODO: Only one button of a given type can be displayed.) + * @param type Type of the button. (TODO: Only one button of a given type + * can be displayed.) * @param cb Function that will be called on the click event. */ void purple_notify_searchresults_button_add(PurpleNotifySearchResults *results, @@ -245,8 +246,9 @@ /** - * Adds a plain labelled button that will be displayed in the search results dialog. - * + * Adds a plain labelled button that will be displayed in the search results + * dialog. + * * @param results The search results object * @param label The label to display * @param cb Function that will be called on the click event @@ -267,7 +269,7 @@ * Returns a newly created search result column object. * * @param title Title of the column. NOTE: Title will get g_strdup()ed. - * + * * @return The new search column object. */ PurpleNotifySearchColumn *purple_notify_searchresults_column_new(const char *title); @@ -470,53 +472,58 @@ * The text is essentially a stripped-down format of HTML, the same that * IMs may send. * - * @param gc The PurpleConnection handle associated with the information. - * @param who The username associated with the information. - * @param user_info The PurpleNotifyUserInfo which contains the information - * @param cb The callback to call when the user closes - * the notification. - * @param user_data The data to pass to the callback. + * @param gc The PurpleConnection handle associated with the information. + * @param who The username associated with the information. + * @param user_info The PurpleNotifyUserInfo which contains the information + * @param cb The callback to call when the user closes the notification. + * @param user_data The data to pass to the callback. * - * @return A UI-specific handle. + * @return A UI-specific handle. */ void *purple_notify_userinfo(PurpleConnection *gc, const char *who, PurpleNotifyUserInfo *user_info, PurpleNotifyCloseCallback cb, gpointer user_data); /** - * Create a new PurpleNotifyUserInfo which is suitable for passing to purple_notify_userinfo() + * Create a new PurpleNotifyUserInfo which is suitable for passing to + * purple_notify_userinfo() * - * @return A new PurpleNotifyUserInfo, which the caller must destroy when done + * @return A new PurpleNotifyUserInfo, which the caller must destroy when done */ PurpleNotifyUserInfo *purple_notify_user_info_new(void); /** * Destroy a PurpleNotifyUserInfo * - * @param user_info The PurpleNotifyUserInfo + * @param user_info The PurpleNotifyUserInfo */ void purple_notify_user_info_destroy(PurpleNotifyUserInfo *user_info); /** - * Retrieve the array of PurpleNotifyUserInfoEntry objects from a PurpleNotifyUserInfo - * - * This GList may be manipulated directly with normal GList functions such as g_list_insert(). Only - * PurpleNotifyUserInfoEntry are allowed in the list. If a PurpleNotifyUserInfoEntry item is added to the list, - * it should not be g_free()'d by the caller; PurpleNotifyUserInfo will g_free it when destroyed. + * Retrieve the array of PurpleNotifyUserInfoEntry objects from a + * PurpleNotifyUserInfo * - * To remove a PurpleNotifyUserInfoEntry, use purple_notify_user_info_remove_entry(). Do not use the GList directly. + * This GList may be manipulated directly with normal GList functions such + * as g_list_insert(). Only PurpleNotifyUserInfoEntry are allowed in the + * list. If a PurpleNotifyUserInfoEntry item is added to the list, it + * should not be g_free()'d by the caller; PurpleNotifyUserInfo will g_free + * it when destroyed. * - * @param user_info The PurpleNotifyUserInfo + * To remove a PurpleNotifyUserInfoEntry, use + * purple_notify_user_info_remove_entry(). Do not use the GList directly. * - * @constreturn A GList of PurpleNotifyUserInfoEntry objects + * @param user_info The PurpleNotifyUserInfo + * + * @constreturn A GList of PurpleNotifyUserInfoEntry objects */ GList *purple_notify_user_info_get_entries(PurpleNotifyUserInfo *user_info); /** - * Create a textual representation of a PurpleNotifyUserInfo, separating entries with newline + * Create a textual representation of a PurpleNotifyUserInfo, separating + * entries with newline * - * @param user_info The PurpleNotifyUserInfo - * @param newline The separation character + * @param user_info The PurpleNotifyUserInfo + * @param newline The separation character */ char *purple_notify_user_info_get_text_with_newline(PurpleNotifyUserInfo *user_info, const char *newline); @@ -524,46 +531,58 @@ * Add a label/value pair to a PurpleNotifyUserInfo object. * PurpleNotifyUserInfo keeps track of the order in which pairs are added. * - * @param user_info The PurpleNotifyUserInfo - * @param label A label, which for example might be displayed by a UI with a colon after it ("Status:"). Do not include a colon. - * If NULL, value will be displayed without a label. - * @param value The value, which might be displayed by a UI after the label. - * If NULL, label will still be displayed; the UI should then treat label as independent - * and not include a colon if it would otherwise. + * @param user_info The PurpleNotifyUserInfo + * @param label A label, which for example might be displayed by a + * UI with a colon after it ("Status:"). Do not include + * a colon. If NULL, value will be displayed without a + * label. + * @param value The value, which might be displayed by a UI after + * the label. If NULL, label will still be displayed; + * the UI should then treat label as independent and not + * include a colon if it would otherwise. */ void purple_notify_user_info_add_pair(PurpleNotifyUserInfo *user_info, const char *label, const char *value); /** * Prepend a label/value pair to a PurpleNotifyUserInfo object * - * @param user_info The PurpleNotifyUserInfo - * @param label A label, which for example might be displayed by a UI with a colon after it ("Status:"). Do not include a colon. - * If NULL, value will be displayed without a label. - * @param value The value, which might be displayed by a UI after the label. - * If NULL, label will still be displayed; the UI should then treat label as independent - * and not include a colon if it would otherwise. + * @param user_info The PurpleNotifyUserInfo + * @param label A label, which for example might be displayed by a + * UI with a colon after it ("Status:"). Do not include + * a colon. If NULL, value will be displayed without a + * label. + * @param value The value, which might be displayed by a UI after + * the label. If NULL, label will still be displayed; + * the UI should then treat label as independent and not + * include a colon if it would otherwise. */ void purple_notify_user_info_prepend_pair(PurpleNotifyUserInfo *user_info, const char *label, const char *value); /** - * Remove a PurpleNotifyUserInfoEntry from a PurpleNotifyUserInfo object without freeing the entry. + * Remove a PurpleNotifyUserInfoEntry from a PurpleNotifyUserInfo object + * without freeing the entry. * - * @param user_info The PurpleNotifyUserInfo - * @param user_info_entry The PurpleNotifyUserInfoEntry + * @param user_info The PurpleNotifyUserInfo + * @param user_info_entry The PurpleNotifyUserInfoEntry */ void purple_notify_user_info_remove_entry(PurpleNotifyUserInfo *user_info, PurpleNotifyUserInfoEntry *user_info_entry); + /** * Create a new PurpleNotifyUserInfoEntry * - * If added to a PurpleNotifyUserInfo object, this should not be free()'d, as PurpleNotifyUserInfo will do so - * when destroyed. purple_notify_user_info_add_pair() and purple_notify_user_info_prepend_pair() are convenience - * methods for creating entries and adding them to a PurpleNotifyUserInfo. + * If added to a PurpleNotifyUserInfo object, this should not be free()'d, + * as PurpleNotifyUserInfo will do so when destroyed. + * purple_notify_user_info_add_pair() and + * purple_notify_user_info_prepend_pair() are convenience methods for + * creating entries and adding them to a PurpleNotifyUserInfo. * - * @param label A label, which for example might be displayed by a UI with a colon after it ("Status:"). Do not include a colon. - * If NULL, value will be displayed without a label. - * @param value The value, which might be displayed by a UI after the label. - * If NULL, label will still be displayed; the UI should then treat label as independent - * and not include a colon if it would otherwise. + * @param label A label, which for example might be displayed by a UI + * with a colon after it ("Status:"). Do not include a + * colon. If NULL, value will be displayed without a label. + * @param value The value, which might be displayed by a UI after the + * label. If NULL, label will still be displayed; the UI + * should then treat label as independent and not include a + * colon if it would otherwise. * * @result A new PurpleNotifyUserInfoEntry */ @@ -572,71 +591,74 @@ /** * Add a section break. A UI might display this as a horizontal line. * - * @param user_info The PurpleNotifyUserInfo + * @param user_info The PurpleNotifyUserInfo */ void purple_notify_user_info_add_section_break(PurpleNotifyUserInfo *user_info); /** * Prepend a section break. A UI might display this as a horizontal line. * - * @param user_info The PurpleNotifyUserInfo + * @param user_info The PurpleNotifyUserInfo * @since 2.5.0 */ void purple_notify_user_info_prepend_section_break(PurpleNotifyUserInfo *user_info); - + /** - * Add a section header. A UI might display this in a different font from other text. + * Add a section header. A UI might display this in a different font + * from other text. * - * @param user_info The PurpleNotifyUserInfo - * @param label The name of the section + * @param user_info The PurpleNotifyUserInfo + * @param label The name of the section */ void purple_notify_user_info_add_section_header(PurpleNotifyUserInfo *user_info, const char *label); - + /** - * Prepend a section header. A UI might display this in a different font from other text. + * Prepend a section header. A UI might display this in a different font + * from other text. * - * @param user_info The PurpleNotifyUserInfo - * @param label The name of the section + * @param user_info The PurpleNotifyUserInfo + * @param label The name of the section * @since 2.5.0 */ void purple_notify_user_info_prepend_section_header(PurpleNotifyUserInfo *user_info, const char *label); - + /** - * Remove the last item which was added to a PurpleNotifyUserInfo. This could be used to remove a section header which is not needed. + * Remove the last item which was added to a PurpleNotifyUserInfo. This + * could be used to remove a section header which is not needed. */ void purple_notify_user_info_remove_last_item(PurpleNotifyUserInfo *user_info); /** * Get the label for a PurpleNotifyUserInfoEntry * - * @param user_info_entry The PurpleNotifyUserInfoEntry + * @param user_info_entry The PurpleNotifyUserInfoEntry * - * @result The label + * @return The label */ const gchar *purple_notify_user_info_entry_get_label(PurpleNotifyUserInfoEntry *user_info_entry); /** * Set the label for a PurpleNotifyUserInfoEntry * - * @param user_info_entry The PurpleNotifyUserInfoEntry - * @param label The label + * @param user_info_entry The PurpleNotifyUserInfoEntry + * @param label The label */ void purple_notify_user_info_entry_set_label(PurpleNotifyUserInfoEntry *user_info_entry, const char *label); /** * Get the value for a PurpleNotifyUserInfoEntry * - * @param user_info_entry The PurpleNotifyUserInfoEntry + * @param user_info_entry The PurpleNotifyUserInfoEntry * - * @result The value + * @result The value */ const gchar *purple_notify_user_info_entry_get_value(PurpleNotifyUserInfoEntry *user_info_entry); /** * Set the value for a PurpleNotifyUserInfoEntry * - * @param user_info_entry The PurpleNotifyUserInfoEntry - * @param value The value + * @param user_info_entry The PurpleNotifyUserInfoEntry + * @param value The value */ void purple_notify_user_info_entry_set_value(PurpleNotifyUserInfoEntry *user_info_entry, const char *value); @@ -644,17 +666,17 @@ /** * Get the type of a PurpleNotifyUserInfoEntry * - * @param user_info_entry The PurpleNotifyUserInfoEntry + * @param user_info_entry The PurpleNotifyUserInfoEntry * - * @result The PurpleNotifyUserInfoEntryType + * @return The PurpleNotifyUserInfoEntryType */ PurpleNotifyUserInfoEntryType purple_notify_user_info_entry_get_type(PurpleNotifyUserInfoEntry *user_info_entry); /** * Set the type of a PurpleNotifyUserInfoEntry * - * @param user_info_entry The PurpleNotifyUserInfoEntry - * @param type The PurpleNotifyUserInfoEntryType + * @param user_info_entry The PurpleNotifyUserInfoEntry + * @param type The PurpleNotifyUserInfoEntryType */ void purple_notify_user_info_entry_set_type(PurpleNotifyUserInfoEntry *user_info_entry, PurpleNotifyUserInfoEntryType type); diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/plugins/log_reader.c --- a/libpurple/plugins/log_reader.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/plugins/log_reader.c Sat Dec 13 08:48:58 2008 +0000 @@ -1971,7 +1971,7 @@ c = contents; line = contents; - while (*c) { + while (c && *c) { gboolean is_in_message = FALSE; if (purple_str_has_prefix(line, QIP_LOG_IN_MESSAGE_ESC) || diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/plugins/perl/common/Notify.xs --- a/libpurple/plugins/perl/common/Notify.xs Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/plugins/perl/common/Notify.xs Sat Dec 13 08:48:58 2008 +0000 @@ -6,7 +6,7 @@ BOOT: { HV *type_stash = gv_stashpv("Purple::Notify::Type", 1); - HV *msg_type_stash = gv_stashpv("Purple::Notify:Msg", 1); + HV *msg_type_stash = gv_stashpv("Purple::Notify::Msg", 1); HV *user_info_stash = gv_stashpv("Purple::NotifyUserInfo::Type", 1); static const constiv *civ, type_const_iv[] = { diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/plugins/statenotify.c --- a/libpurple/plugins/statenotify.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/plugins/statenotify.c Sat Dec 13 08:48:58 2008 +0000 @@ -32,13 +32,17 @@ return; g_return_if_fail(conv->type == PURPLE_CONV_TYPE_IM); + /* Prevent duplicate notifications for buddies in multiple groups */ + if (buddy != purple_find_buddy(buddy->account, buddy->name)) + return; + who = purple_buddy_get_alias(buddy); escaped = g_markup_escape_text(who, -1); g_snprintf(buf, sizeof(buf), message, escaped); g_free(escaped); - purple_conv_im_write(conv->u.im, NULL, buf, PURPLE_MESSAGE_SYSTEM | PURPLE_MESSAGE_ACTIVE_ONLY, time(NULL)); + purple_conv_im_write(conv->u.im, NULL, buf, PURPLE_MESSAGE_SYSTEM | PURPLE_MESSAGE_ACTIVE_ONLY | PURPLE_MESSAGE_NO_LINKIFY, time(NULL)); } static void diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/plugins/tcl/tcl_cmd.c --- a/libpurple/plugins/tcl/tcl_cmd.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/plugins/tcl/tcl_cmd.c Sat Dec 13 08:48:58 2008 +0000 @@ -159,7 +159,7 @@ errorstr = g_strdup_printf("error evaluating callback: %s\n", Tcl_GetString(Tcl_GetObjResult(handler->interp))); - purple_debug(PURPLE_DEBUG_ERROR, "tcl", errorstr); + purple_debug(PURPLE_DEBUG_ERROR, "tcl", "%s", errorstr); *errors = errorstr; retval = PURPLE_CMD_RET_FAILED; } else { @@ -170,7 +170,7 @@ errorstr = g_strdup_printf("Error retreiving procedure result: %s\n", Tcl_GetString(Tcl_GetObjResult(handler->interp))); - purple_debug(PURPLE_DEBUG_ERROR, "tcl", errorstr); + purple_debug(PURPLE_DEBUG_ERROR, "tcl", "%s", errorstr); *errors = errorstr; retval = PURPLE_CMD_RET_FAILED; } diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/bonjour/Makefile.am --- a/libpurple/protocols/bonjour/Makefile.am Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/bonjour/Makefile.am Sat Dec 13 08:48:58 2008 +0000 @@ -30,10 +30,10 @@ if STATIC_BONJOUR st = -DPURPLE_STATIC_PRPL -noinst_LIBRARIES = libbonjour.a -libbonjour_a_SOURCES = $(BONJOURSOURCES) -libbonjour_a_CFLAGS = $(AM_CFLAGS) -libbonjour_a_LIBADD = $(AVAHI_LIBS) +noinst_LTLIBRARIES = libbonjour.la +libbonjour_la_SOURCES = $(BONJOURSOURCES) +libbonjour_la_CFLAGS = $(AM_CFLAGS) +libbonjour_la_LIBADD = $(AVAHI_LIBS) else @@ -44,7 +44,6 @@ endif - AM_CPPFLAGS = \ -I$(top_srcdir)/libpurple \ -I$(top_builddir)/libpurple \ @@ -59,4 +58,3 @@ # AM_CPPFLAGS += $(AVAHI_CFLAGS) #else #endif - diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/gg/Makefile.am --- a/libpurple/protocols/gg/Makefile.am Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/gg/Makefile.am Sat Dec 13 08:48:58 2008 +0000 @@ -52,19 +52,15 @@ if STATIC_GG st = -DPURPLE_STATIC_PRPL $(GADU_CFLAGS) -noinst_LIBRARIES = libgg.a -pkg_LTLIBRARIES = - -libgg_a_SOURCES = $(GGSOURCES) -libgg_a_CFLAGS = $(AM_CFLAGS) -libgg_a_LIBADD = $(GADU_LIBS) +noinst_LTLIBRARIES = libgg.la +libgg_la_SOURCES = $(GGSOURCES) +libgg_la_CFLAGS = $(AM_CFLAGS) +libgg_la_LIBADD = $(GADU_LIBS) else st = $(GADU_CFLAGS) pkg_LTLIBRARIES = libgg.la -noinst_LIBRARIES = - libgg_la_SOURCES = $(GGSOURCES) libgg_la_LIBADD = $(GLIB_LIBS) $(GADU_LIBS) diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/gg/gg.c --- a/libpurple/protocols/gg/gg.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/gg/gg.c Sat Dec 13 08:48:58 2008 +0000 @@ -61,7 +61,6 @@ * * @return Zero if proxy setup is valid, otherwise -1. */ -/* static int ggp_setup_proxy(PurpleAccount *account) {{{ */ static int ggp_setup_proxy(PurpleAccount *account) { PurpleProxyInfo *gpi; @@ -88,11 +87,7 @@ return 0; } -/* }}} */ -/* - */ -/* static void ggp_async_token_handler(gpointer _gc, gint fd, PurpleInputCondition cond) {{{ */ static void ggp_async_token_handler(gpointer _gc, gint fd, PurpleInputCondition cond) { PurpleConnection *gc = _gc; @@ -157,11 +152,7 @@ token->cb = NULL; cb(gc); } -/* }}} */ -/* - */ -/* static void ggp_token_request(PurpleConnection *gc, GGPTokenCallback cb) {{{ */ static void ggp_token_request(PurpleConnection *gc, GGPTokenCallback cb) { PurpleAccount *account; @@ -199,7 +190,6 @@ * * @param Current action handler. */ -/* static void ggp_action_buddylist_get(PurplePluginAction *action) {{{ */ static void ggp_action_buddylist_get(PurplePluginAction *action) { PurpleConnection *gc = (PurpleConnection *)action->context; @@ -209,14 +199,12 @@ gg_userlist_request(info->session, GG_USERLIST_GET, NULL); } -/* }}} */ /** * Upload the buddylist to the server. * * @param action Current action handler. */ -/* static void ggp_action_buddylist_put(PurplePluginAction *action) {{{ */ static void ggp_action_buddylist_put(PurplePluginAction *action) { PurpleConnection *gc = (PurpleConnection *)action->context; @@ -232,14 +220,12 @@ gg_userlist_request(info->session, GG_USERLIST_PUT, buddylist); g_free(buddylist); } -/* }}} */ /** * Delete buddylist from the server. * * @param action Current action handler. */ -/* static void ggp_action_buddylist_delete(PurplePluginAction *action) {{{ */ static void ggp_action_buddylist_delete(PurplePluginAction *action) { PurpleConnection *gc = (PurpleConnection *)action->context; @@ -249,11 +235,7 @@ gg_userlist_request(info->session, GG_USERLIST_PUT, NULL); } -/* }}} */ -/* - */ -/* static void ggp_callback_buddylist_save_ok(PurpleConnection *gc, const char *file) {{{ */ static void ggp_callback_buddylist_save_ok(PurpleConnection *gc, const char *filename) { PurpleAccount *account = purple_connection_get_account(gc); @@ -284,11 +266,7 @@ g_free(buddylist); } -/* }}} */ -/* - */ -/* static void ggp_callback_buddylist_load_ok(PurpleConnection *gc, gchar *file) {{{ */ static void ggp_callback_buddylist_load_ok(PurpleConnection *gc, gchar *file) { PurpleAccount *account = purple_connection_get_account(gc); @@ -334,11 +312,7 @@ purple_connection_get_account(gc), NULL, NULL, gc); } -/* }}} */ -/* - */ -/* static void ggp_action_buddylist_load(PurplePluginAction *action) {{{ */ static void ggp_action_buddylist_load(PurplePluginAction *action) { PurpleConnection *gc = (PurpleConnection *)action->context; @@ -349,11 +323,7 @@ purple_connection_get_account(gc), NULL, NULL, gc); } -/* }}} */ -/* - */ -/* static void ggp_callback_register_account_ok(PurpleConnection *gc, PurpleRequestFields *fields) {{{ */ static void ggp_callback_register_account_ok(PurpleConnection *gc, PurpleRequestFields *fields) { @@ -435,11 +405,7 @@ g_free(token->id); g_free(token); } -/* }}} */ -/* - */ -/* static void ggp_callback_register_account_cancel(PurpleConnection *gc, PurpleRequestFields *fields) {{{ */ static void ggp_callback_register_account_cancel(PurpleConnection *gc, PurpleRequestFields *fields) { @@ -453,11 +419,7 @@ g_free(token); } -/* }}} */ -/* - */ -/* static void ggp_register_user_dialog(PurpleConnection *gc) {{{ */ static void ggp_register_user_dialog(PurpleConnection *gc) { PurpleAccount *account; @@ -510,13 +472,9 @@ purple_connection_get_account(gc), NULL, NULL, gc); } -/* }}} */ /* ----- PUBLIC DIRECTORY SEARCH ---------------------------------------- */ -/* - */ -/* static void ggp_callback_show_next(PurpleConnection *gc, GList *row, gpointer user_data) {{{ */ static void ggp_callback_show_next(PurpleConnection *gc, GList *row, gpointer user_data) { GGPInfo *info = gc->proto_data; @@ -533,21 +491,13 @@ ggp_search_add(info->searches, seq, form); purple_debug_info("gg", "ggp_callback_show_next(): Added seq %u", seq); } -/* }}} */ -/* - */ -/* static void ggp_callback_add_buddy(PurpleConnection *gc, GList *row, gpointer user_data) {{{ */ static void ggp_callback_add_buddy(PurpleConnection *gc, GList *row, gpointer user_data) { purple_blist_request_add_buddy(purple_connection_get_account(gc), g_list_nth_data(row, 0), NULL, NULL); } -/* }}} */ -/* - */ -/* static void ggp_callback_im(PurpleConnection *gc, GList *row, gpointer user_data) {{{ */ static void ggp_callback_im(PurpleConnection *gc, GList *row, gpointer user_data) { PurpleAccount *account; @@ -560,11 +510,7 @@ conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, name); purple_conversation_present(conv); } -/* }}} */ -/* - */ -/* static void ggp_callback_find_buddies(PurpleConnection *gc, PurpleRequestFields *fields) {{{ */ static void ggp_callback_find_buddies(PurpleConnection *gc, PurpleRequestFields *fields) { GGPInfo *info = gc->proto_data; @@ -611,11 +557,7 @@ ggp_search_add(info->searches, seq, form); purple_debug_info("gg", "ggp_callback_find_buddies(): Added seq %u", seq); } -/* }}} */ -/* - */ -/* static void ggp_find_buddies(PurplePluginAction *action) {{{ */ static void ggp_find_buddies(PurplePluginAction *action) { PurpleConnection *gc = (PurpleConnection *)action->context; @@ -672,13 +614,9 @@ purple_connection_get_account(gc), NULL, NULL, gc); } -/* }}} */ /* ----- CHANGE PASSWORD ------------------------------------------------ */ -/* - */ -/* static void ggp_callback_change_passwd_ok(PurpleConnection *gc, PurpleRequestFields *fields) {{{ */ static void ggp_callback_change_passwd_ok(PurpleConnection *gc, PurpleRequestFields *fields) { PurpleAccount *account; @@ -750,11 +688,7 @@ g_free(info->token->data); g_free(info->token); } -/* }}} */ -/* - */ -/* static void ggp_change_passwd_dialog(PurpleConnection *gc) {{{ */ static void ggp_change_passwd_dialog(PurpleConnection *gc) { PurpleRequestFields *fields; @@ -811,24 +745,16 @@ g_free(msg); } -/* }}} */ -/* - */ -/* static void ggp_change_passwd(PurplePluginAction *action) {{{ */ static void ggp_change_passwd(PurplePluginAction *action) { PurpleConnection *gc = (PurpleConnection *)action->context; ggp_token_request(gc, ggp_change_passwd_dialog); } -/* }}} */ /* ----- CONFERENCES ---------------------------------------------------- */ -/* - */ -/* static void ggp_callback_add_to_chat_ok(PurpleConnection *gc, PurpleRequestFields *fields) {{{ */ static void ggp_callback_add_to_chat_ok(PurpleConnection *gc, PurpleRequestFields *fields) { GGPInfo *info = gc->proto_data; @@ -842,11 +768,7 @@ ggp_confer_participants_add_uin(gc, sel->data, info->tmp_buddy); info->tmp_buddy = 0; } -/* }}} */ -/* - */ -/* static void ggp_bmenu_add_to_chat(PurpleBlistNode *node, gpointer ignored) {{{ */ static void ggp_bmenu_add_to_chat(PurpleBlistNode *node, gpointer ignored) { PurpleBuddy *buddy; @@ -892,13 +814,9 @@ gc); g_free(msg); } -/* }}} */ /* ----- BLOCK BUDDIES -------------------------------------------------- */ -/* - */ -/* static void ggp_bmenu_block(PurpleBlistNode *node, gpointer ignored) {{{ */ static void ggp_bmenu_block(PurpleBlistNode *node, gpointer ignored) { PurpleConnection *gc; @@ -924,7 +842,6 @@ purple_debug_info("gg", "send: uin=%d; mode=BLOCKED\n", uin); } } -/* }}} */ /* ---------------------------------------------------------------------- */ /* ----- INTERNAL CALLBACKS --------------------------------------------- */ @@ -943,7 +860,6 @@ * @param status ID of the status. * @param descr Description. */ -/* static void ggp_generic_status_handler(PurpleConnection *gc, uin_t uin, int status, const char *descr) {{{ */ static void ggp_generic_status_handler(PurpleConnection *gc, uin_t uin, int status, const char *descr) { @@ -983,11 +899,7 @@ g_free(from); g_free(msg); } -/* }}} */ -/* - */ -/* static void ggp_sr_close_cb(gpointer user_data) {{{ */ static void ggp_sr_close_cb(gpointer user_data) { GGPSearchForm *form = user_data; @@ -997,7 +909,6 @@ purple_debug_info("gg", "ggp_sr_close_cb(): Removed seq %u", form->seq); ggp_search_form_destroy(form); } -/* }}} */ /** * Translate a status' ID to a more user-friendly name. @@ -1006,7 +917,6 @@ * * @return The user-friendly name of the status. */ -/* static const char *ggp_status_by_id(unsigned int id) {{{ */ static const char *ggp_status_by_id(unsigned int id) { const char *st; @@ -1029,11 +939,7 @@ return st; } -/* }}} */ -/* - */ -/* static void ggp_pubdir_handle_info(PurpleConnection *gc, gg_pubdir50_t req, GGPSearchForm *form) {{{ */ static void ggp_pubdir_handle_info(PurpleConnection *gc, gg_pubdir50_t req, GGPSearchForm *form) { @@ -1092,11 +998,7 @@ g_free(who); purple_notify_user_info_destroy(user_info); } -/* }}} */ -/* - */ -/* static void ggp_pubdir_handle_full(PurpleConnection *gc, gg_pubdir50_t req, GGPSearchForm *form) {{{ */ static void ggp_pubdir_handle_full(PurpleConnection *gc, gg_pubdir50_t req, GGPSearchForm *form) { @@ -1196,11 +1098,7 @@ purple_notify_searchresults_new_rows(gc, results, form->window); } } -/* }}} */ -/* - */ -/* static void ggp_pubdir_reply_handler(PurpleConnection *gc, gg_pubdir50_t req) {{{ */ static void ggp_pubdir_reply_handler(PurpleConnection *gc, gg_pubdir50_t req) { GGPInfo *info = gc->proto_data; @@ -1239,15 +1137,56 @@ break; } } -/* }}} */ + +static void ggp_recv_image_handler(PurpleConnection *gc, const struct gg_event *ev) +{ + gint imgid = 0; + GGPInfo *info = gc->proto_data; + GList *entry = g_list_first(info->pending_richtext_messages); + gchar *handlerid = g_strdup_printf("IMGID_HANDLER-%i", ev->event.image_reply.crc32); + + imgid = purple_imgstore_add_with_id( + g_memdup(ev->event.image_reply.image, ev->event.image_reply.size), + ev->event.image_reply.size, + ev->event.image_reply.filename); + + purple_debug_info("gg", "ggp_recv_image_handler: got image with crc32: %u\n", ev->event.image_reply.crc32); + + while(entry) { + if (strstr((gchar *)entry->data, handlerid) != NULL) { + gchar **split = g_strsplit((gchar *)entry->data, handlerid, 3); + gchar *text = g_strdup_printf("%s%i%s", split[0], imgid, split[1]); + purple_debug_info("gg", "ggp_recv_image_handler: found message matching crc32: %s\n", (gchar *)entry->data); + g_strfreev(split); + info->pending_richtext_messages = g_list_remove(info->pending_richtext_messages, entry->data); + /* We don't have any more images to download */ + if (strstr(text, "event.msg.sender); + serv_got_im(gc, buf, text, PURPLE_MESSAGE_IMAGES, ev->event.msg.time); + g_free(buf); + purple_debug_info("gg", "ggp_recv_image_handler: richtext message: %s\n", text); + g_free(text); + break; + } + info->pending_richtext_messages = g_list_append(info->pending_richtext_messages, text); + break; + } + entry = g_list_next(entry); + } + g_free(handlerid); + + return; +} + /** * Dispatch a message received from a buddy. * * @param gc PurpleConnection. * @param ev Gadu-Gadu event structure. + * + * Image receiving, some code borrowed from Kadu http://www.kadu.net */ -/* static void ggp_recv_message_handler(PurpleConnection *gc, const struct gg_event *ev) {{{ */ static void ggp_recv_message_handler(PurpleConnection *gc, const struct gg_event *ev) { GGPInfo *info = gc->proto_data; @@ -1264,7 +1203,109 @@ msg = g_markup_escape_text(tmp, -1); g_free(tmp); - purple_debug_info("gg", "msg form (%s): %s (class = %d; rcpt_count = %d)\n", + /* We got richtext message */ + if (ev->event.msg.formats_length) + { + gboolean got_image = FALSE, bold = FALSE, italic = FALSE, under = FALSE; + char *cformats = (char *)ev->event.msg.formats; + char *cformats_end = cformats + ev->event.msg.formats_length; + gint increased_len = 0; + struct gg_msg_richtext_format *actformat; + struct gg_msg_richtext_image *actimage; + GString *message = g_string_new(msg); + gchar *handlerid; + + purple_debug_info("gg", "ggp_recv_message_handler: richtext msg from (%s): %s %i formats\n", from, msg, ev->event.msg.formats_length); + + while (cformats < cformats_end) + { + gint byteoffset; + actformat = (struct gg_msg_richtext_format *)cformats; + cformats += sizeof(struct gg_msg_richtext_format); + byteoffset = g_utf8_offset_to_pointer(message->str, actformat->position + increased_len) - message->str; + + if(actformat->position == 0 && actformat->font == 0) { + purple_debug_warning("gg", "ggp_recv_message_handler: bogus formatting (inc: %i)\n", increased_len); + continue; + } + purple_debug_info("gg", "ggp_recv_message_handler: format at pos: %i, image:%i, bold:%i, italic: %i, under:%i (inc: %i)\n", + actformat->position, + (actformat->font & GG_FONT_IMAGE) != 0, + (actformat->font & GG_FONT_BOLD) != 0, + (actformat->font & GG_FONT_ITALIC) != 0, + (actformat->font & GG_FONT_UNDERLINE) != 0, + increased_len); + + if (actformat->font & GG_FONT_IMAGE) { + got_image = TRUE; + actimage = (struct gg_msg_richtext_image*)(cformats); + cformats += sizeof(struct gg_msg_richtext_image); + purple_debug_info("gg", "ggp_recv_message_handler: image received, size: %d, crc32: %i\n", actimage->size, actimage->crc32); + + /* Checking for errors, image size shouldn't be + * larger than 255.000 bytes */ + if (actimage->size > 255000) { + purple_debug_warning("gg", "ggp_recv_message_handler: received image large than 255 kb\n"); + continue; + } + + gg_image_request(info->session, ev->event.msg.sender, + actimage->size, actimage->crc32); + + handlerid = g_strdup_printf("", actimage->crc32); + g_string_insert(message, byteoffset, handlerid); + increased_len += strlen(handlerid); + g_free(handlerid); + continue; + } + + if (actformat->font & GG_FONT_BOLD) { + if (bold == FALSE) { + g_string_insert(message, byteoffset, ""); + increased_len += 3; + bold = TRUE; + } + } else if (bold) { + g_string_insert(message, byteoffset, ""); + increased_len += 4; + bold = FALSE; + } + + if (actformat->font & GG_FONT_ITALIC) { + if (italic == FALSE) { + g_string_insert(message, byteoffset, ""); + increased_len += 3; + italic = TRUE; + } + } else if (italic) { + g_string_insert(message, byteoffset, ""); + increased_len += 4; + italic = FALSE; + } + + if (actformat->font & GG_FONT_UNDERLINE) { + if (under == FALSE) { + g_string_insert(message, byteoffset, ""); + increased_len += 3; + under = TRUE; + } + } else if (under) { + g_string_insert(message, byteoffset, ""); + increased_len += 4; + under = FALSE; + } + } + + msg = message->str; + g_string_free(message, FALSE); + + if (got_image) { + info->pending_richtext_messages = g_list_append(info->pending_richtext_messages, msg); + return; + } + } + + purple_debug_info("gg", "ggp_recv_message_handler: msg from (%s): %s (class = %d; rcpt_count = %d)\n", from, msg, ev->event.msg.msgclass, ev->event.msg.recipients_count); @@ -1301,11 +1342,32 @@ g_free(msg); g_free(from); } -/* }}} */ + +static void ggp_send_image_handler(PurpleConnection *gc, const struct gg_event *ev) +{ + GGPInfo *info = gc->proto_data; + PurpleStoredImage *image; + gint imgid = GPOINTER_TO_INT(g_hash_table_lookup(info->pending_images, &ev->event.image_request.crc32)); + + purple_debug_info("gg", "ggp_send_image_handler: image request received, crc32: %u\n", ev->event.image_request.crc32); -/* - */ -/* static void ggp_callback_recv(gpointer _gc, gint fd, PurpleInputCondition cond) {{{ */ + if(imgid) + { + if((image = purple_imgstore_find_by_id(imgid))) { + gint image_size = purple_imgstore_get_size(image); + gconstpointer image_bin = purple_imgstore_get_data(image); + const char *image_filename = purple_imgstore_get_filename(image); + + purple_debug_info("gg", "ggp_send_image_handler: sending image imgid: %i, crc: %u\n", imgid, ev->event.image_request.crc32); + gg_image_reply(info->session, (unsigned long int)ev->event.image_request.sender, image_filename, image_bin, image_size); + purple_imgstore_unref(image); + } else { + purple_debug_error("gg", "ggp_send_image_handler: image imgid: %i, crc: %u in hash but not found in imgstore!\n", imgid, ev->event.image_request.crc32); + } + g_hash_table_remove(info->pending_images, &ev->event.image_request.crc32); + } +} + static void ggp_callback_recv(gpointer _gc, gint fd, PurpleInputCondition cond) { PurpleConnection *gc = _gc; @@ -1330,11 +1392,18 @@ ggp_recv_message_handler(gc, ev); break; case GG_EVENT_ACK: + /* Changing %u to %i fixes compiler warning */ purple_debug_info("gg", - "message sent to: %u, delivery status=%d, seq=%d\n", + "ggp_callback_recv: message sent to: %i, delivery status=%d, seq=%d\n", ev->event.ack.recipient, ev->event.ack.status, ev->event.ack.seq); break; + case GG_EVENT_IMAGE_REPLY: + ggp_recv_image_handler(gc, ev); + break; + case GG_EVENT_IMAGE_REQUEST: + ggp_send_image_handler(gc, ev); + break; case GG_EVENT_NOTIFY: case GG_EVENT_NOTIFY_DESCR: { @@ -1426,11 +1495,7 @@ gg_free_event(ev); } -/* }}} */ -/* - */ -/* static void ggp_async_login_handler(gpointer _gc, gint fd, PurpleInputCondition cond) {{{ */ static void ggp_async_login_handler(gpointer _gc, gint fd, PurpleInputCondition cond) { PurpleConnection *gc = _gc; @@ -1519,20 +1584,16 @@ gg_free_event(ev); } -/* }}} */ /* ---------------------------------------------------------------------- */ /* ----- PurplePluginProtocolInfo ----------------------------------------- */ /* ---------------------------------------------------------------------- */ -/* static const char *ggp_list_icon(PurpleAccount *account, PurpleBuddy *buddy) {{{ */ static const char *ggp_list_icon(PurpleAccount *account, PurpleBuddy *buddy) { return "gadu-gadu"; } -/* }}} */ -/* static char *ggp_status_text(PurpleBuddy *b) {{{ */ static char *ggp_status_text(PurpleBuddy *b) { PurpleStatus *status; @@ -1558,20 +1619,21 @@ return text; } } -/* }}} */ -/* static void ggp_tooltip_text(PurpleBuddy *b, PurpleNotifyUserInfo *user_info, gboolean full) {{{ */ static void ggp_tooltip_text(PurpleBuddy *b, PurpleNotifyUserInfo *user_info, gboolean full) { PurpleStatus *status; char *text, *tmp; - const char *msg, *name; + const char *msg, *name, *alias; g_return_if_fail(b != NULL); status = purple_presence_get_active_status(purple_buddy_get_presence(b)); msg = purple_status_get_attr_string(status, "message"); name = purple_status_get_name(status); + alias = purple_buddy_get_alias(b); + + purple_notify_user_info_add_pair (user_info, _("Alias"), alias); if (msg != NULL) { text = g_markup_escape_text(msg, -1); @@ -1588,9 +1650,7 @@ purple_notify_user_info_add_pair(user_info, _("Status"), name); } } -/* }}} */ -/* static GList *ggp_status_types(PurpleAccount *account) {{{ */ static GList *ggp_status_types(PurpleAccount *account) { PurpleStatusType *type; @@ -1634,9 +1694,7 @@ return types; } -/* }}} */ -/* static GList *ggp_blist_node_menu(PurpleBlistNode *node) {{{ */ static GList *ggp_blist_node_menu(PurpleBlistNode *node) { PurpleMenuAction *act; @@ -1666,9 +1724,7 @@ return m; } -/* }}} */ -/* static GList *ggp_chat_info(PurpleConnection *gc) {{{ */ static GList *ggp_chat_info(PurpleConnection *gc) { GList *m = NULL; @@ -1682,9 +1738,7 @@ return m; } -/* }}} */ -/* static void ggp_login(PurpleAccount *account) {{{ */ static void ggp_login(PurpleAccount *account) { PurpleConnection *gc; @@ -1706,11 +1760,14 @@ info->chats_count = 0; info->token = NULL; info->searches = ggp_search_new(); + info->pending_richtext_messages = NULL; + info->pending_images = g_hash_table_new(g_int_hash, g_int_equal); gc->proto_data = info; glp->uin = ggp_get_uin(account); glp->password = (char *)purple_account_get_password(account); + glp->image_size = 255; presence = purple_account_get_presence(account); status = purple_presence_get_active_status(presence); @@ -1730,9 +1787,7 @@ gc->inpa = purple_input_add(info->session->fd, PURPLE_INPUT_READ, ggp_async_login_handler, gc); } -/* }}} */ -/* static void ggp_close(PurpleConnection *gc) {{{ */ static void ggp_close(PurpleConnection *gc) { @@ -1760,6 +1815,8 @@ purple_notify_close_with_handle(gc); ggp_search_destroy(info->searches); + g_list_free(info->pending_richtext_messages); + g_hash_table_destroy(info->pending_images); g_free(info); gc->proto_data = NULL; } @@ -1771,25 +1828,108 @@ purple_debug_info("gg", "Connection closed.\n"); } -/* }}} */ -/* static int ggp_send_im(PurpleConnection *gc, const char *who, const char *msg, PurpleMessageFlags flags) {{{ */ static int ggp_send_im(PurpleConnection *gc, const char *who, const char *msg, PurpleMessageFlags flags) { GGPInfo *info = gc->proto_data; char *tmp, *plain; - int ret = 0; + int ret = 1; + unsigned char format[1024]; + unsigned int format_length = sizeof(struct gg_msg_richtext); + gint pos = 0; + GData *attribs; + const char *start, *end = NULL, *last; - if (strlen(msg) == 0) { + if (msg == NULL || *msg == '\0') { return 0; } - purple_debug_info("gg", "ggp_send_im: msg = %s\n", msg); - plain = purple_unescape_html(msg); + last = msg; + + /* Check if the message is richtext */ + /* TODO: Check formatting, too */ + if(purple_markup_find_tag("img", last, &start, &end, &attribs)) { + + GString *string_buffer = g_string_new(NULL); + struct gg_msg_richtext fmt; + + do { + PurpleStoredImage *image; + const char *id; + + /* Add text before the image */ + if(start - last) { + pos = pos + g_utf8_strlen(last, start - last); + g_string_append_len(string_buffer, last, start - last); + } + + if((id = g_datalist_get_data(&attribs, "id")) && (image = purple_imgstore_find_by_id(atoi(id)))) { + struct gg_msg_richtext_format actformat; + struct gg_msg_richtext_image actimage; + gint image_size = purple_imgstore_get_size(image); + gconstpointer image_bin = purple_imgstore_get_data(image); + const char *image_filename = purple_imgstore_get_filename(image); + uint32_t crc32 = gg_crc32(0, image_bin, image_size); + + g_hash_table_insert(info->pending_images, &crc32, GINT_TO_POINTER(atoi(id))); + purple_imgstore_ref(image); + purple_debug_info("gg", "ggp_send_im_richtext: got crc: %i for imgid: %i\n", crc32, atoi(id)); + + actformat.font = GG_FONT_IMAGE; + actformat.position = pos; + + actimage.unknown1 = 0x0109; + actimage.size = gg_fix32(image_size); + actimage.crc32 = gg_fix32(crc32); + + if (actimage.size > 255000) { + purple_debug_warning("gg", "ggp_send_im_richtext: image over 255kb!\n"); + continue; + } + + purple_debug_info("gg", "ggp_send_im_richtext: adding images to richtext, size: %i, crc32: %u, name: %s\n", actimage.size, actimage.crc32, image_filename); + + memcpy(format + format_length, &actformat, sizeof(actformat)); + format_length += sizeof(actformat); + memcpy(format + format_length, &actimage, sizeof(actimage)); + format_length += sizeof(actimage); + } else { + purple_debug_error("gg", "ggp_send_im_richtext: image not found in the image store!"); + } + + last = end + 1; + g_datalist_clear(&attribs); + + } while(purple_markup_find_tag("img", last, &start, &end, &attribs)); + + /* Add text after the images */ + if(last && *last) { + pos = pos + g_utf8_strlen(last, -1); + g_string_append(string_buffer, last); + } + + fmt.flag = 2; + fmt.length = format_length - sizeof(fmt); + memcpy(format, &fmt, sizeof(fmt)); + + purple_debug_info("gg", "ggp_send_im: richtext msg = %s\n", string_buffer->str); + plain = purple_unescape_html(string_buffer->str); + g_string_free(string_buffer, TRUE); + } else { + purple_debug_info("gg", "ggp_send_im: msg = %s\n", msg); + plain = purple_unescape_html(msg); + } + tmp = charset_convert(plain, "UTF-8", "CP1250"); - if (NULL == tmp || strlen(tmp) == 0) { + if (tmp && (format_length - sizeof(struct gg_msg_richtext))) { + if(gg_send_message_richtext(info->session, GG_CLASS_CHAT, ggp_str_to_uin(who), (unsigned char *)tmp, format, format_length) < 0) { + ret = -1; + } else { + ret = 1; + } + } else if (NULL == tmp || *tmp == 0) { ret = 0; } else if (strlen(tmp) > GG_MSG_MAXSIZE) { ret = -E2BIG; @@ -1805,9 +1945,7 @@ return ret; } -/* }}} */ -/* static void ggp_get_info(PurpleConnection *gc, const char *name) { {{{ */ static void ggp_get_info(PurpleConnection *gc, const char *name) { GGPInfo *info = gc->proto_data; @@ -1825,9 +1963,7 @@ ggp_search_add(info->searches, seq, form); purple_debug_info("gg", "ggp_get_info(): Added seq %u", seq); } -/* }}} */ -/* static void ggp_set_status(PurpleAccount *account, PurpleStatus *status) {{{ */ static int ggp_to_gg_status(PurpleStatus *status, char **msg) { const char *status_id = purple_status_get_id(status); @@ -1872,9 +2008,7 @@ return new_status; } } -/* }}} */ -/* static void ggp_set_status(PurpleAccount *account, PurpleStatus *status) {{{ */ static void ggp_set_status(PurpleAccount *account, PurpleStatus *status) { PurpleConnection *gc; @@ -1900,9 +2034,7 @@ ggp_status_fake_to_self(account); } -/* }}} */ -/* static void ggp_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group) {{{ */ static void ggp_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group) { PurpleAccount *account; @@ -1915,9 +2047,7 @@ ggp_status_fake_to_self(account); } } -/* }}} */ -/* static void ggp_remove_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group) {{{ */ static void ggp_remove_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group) { @@ -1925,9 +2055,7 @@ gg_remove_notify(info->session, ggp_str_to_uin(buddy->name)); } -/* }}} */ -/* static void ggp_join_chat(PurpleConnection *gc, GHashTable *data) {{{ */ static void ggp_join_chat(PurpleConnection *gc, GHashTable *data) { GGPInfo *info = gc->proto_data; @@ -1960,15 +2088,11 @@ purple_account_get_username(account), NULL, PURPLE_CBFLAGS_NONE, TRUE); } -/* }}} */ -/* static char *ggp_get_chat_name(GHashTable *data) { {{{ */ static char *ggp_get_chat_name(GHashTable *data) { return g_strdup(g_hash_table_lookup(data, "name")); } -/* }}} */ -/* static int ggp_chat_send(PurpleConnection *gc, int id, const char *message, PurpleMessageFlags flags) {{{ */ static int ggp_chat_send(PurpleConnection *gc, int id, const char *message, PurpleMessageFlags flags) { PurpleConversation *conv; @@ -2020,9 +2144,7 @@ return 0; } -/* }}} */ -/* static void ggp_keepalive(PurpleConnection *gc) {{{ */ static void ggp_keepalive(PurpleConnection *gc) { GGPInfo *info = gc->proto_data; @@ -2037,9 +2159,7 @@ _("Not connected to the server.")); } } -/* }}} */ -/* static void ggp_register_user(PurpleAccount *account) {{{ */ static void ggp_register_user(PurpleAccount *account) { PurpleConnection *gc = purple_account_get_connection(account); @@ -2049,9 +2169,7 @@ ggp_token_request(gc, ggp_register_user_dialog); } -/* }}} */ -/* static GList *ggp_actions(PurplePlugin *plugin, gpointer context) {{{ */ static GList *ggp_actions(PurplePlugin *plugin, gpointer context) { GList *m = NULL; @@ -2091,19 +2209,15 @@ return m; } -/* }}} */ -/* static gboolean ggp_offline_message(const PurpleBuddy *buddy) {{{ */ static gboolean ggp_offline_message(const PurpleBuddy *buddy) { return TRUE; } -/* }}} */ -/* prpl_info setup {{{ */ static PurplePluginProtocolInfo prpl_info = { - OPT_PROTO_REGISTER_NOSCREENNAME, + OPT_PROTO_REGISTER_NOSCREENNAME | OPT_PROTO_IM_IMAGE, NULL, /* user_splits */ NULL, /* protocol_options */ {"png", 32, 32, 96, 96, 0, PURPLE_ICON_SCALE_DISPLAY}, /* icon_spec */ @@ -2173,36 +2287,34 @@ NULL, /* initiate_media */ NULL /* can_do_media */ }; -/* }}} */ -/* PurplePluginInfo setup {{{ */ static PurplePluginInfo info = { - PURPLE_PLUGIN_MAGIC, /* magic */ - PURPLE_MAJOR_VERSION, /* major_version */ - PURPLE_MINOR_VERSION, /* minor_version */ - PURPLE_PLUGIN_PROTOCOL, /* plugin type */ - NULL, /* ui_requirement */ - 0, /* flags */ - NULL, /* dependencies */ + PURPLE_PLUGIN_MAGIC, /* magic */ + PURPLE_MAJOR_VERSION, /* major_version */ + PURPLE_MINOR_VERSION, /* minor_version */ + PURPLE_PLUGIN_PROTOCOL, /* plugin type */ + NULL, /* ui_requirement */ + 0, /* flags */ + NULL, /* dependencies */ PURPLE_PRIORITY_DEFAULT, /* priority */ - "prpl-gg", /* id */ - "Gadu-Gadu", /* name */ - DISPLAY_VERSION, /* version */ + "prpl-gg", /* id */ + "Gadu-Gadu", /* name */ + DISPLAY_VERSION, /* version */ N_("Gadu-Gadu Protocol Plugin"), /* summary */ N_("Polish popular IM"), /* description */ - "boler@sourceforge.net", /* author */ - PURPLE_WEBSITE, /* homepage */ + "boler@sourceforge.net", /* author */ + PURPLE_WEBSITE, /* homepage */ - NULL, /* load */ - NULL, /* unload */ - NULL, /* destroy */ + NULL, /* load */ + NULL, /* unload */ + NULL, /* destroy */ - NULL, /* ui_info */ - &prpl_info, /* extra_info */ - NULL, /* prefs_info */ - ggp_actions, /* actions */ + NULL, /* ui_info */ + &prpl_info, /* extra_info */ + NULL, /* prefs_info */ + ggp_actions, /* actions */ /* padding */ NULL, @@ -2210,9 +2322,7 @@ NULL, NULL }; -/* }}} */ -/* static void purple_gg_debug_handler(int level, const char * format, va_list args) {{{ */ static void purple_gg_debug_handler(int level, const char * format, va_list args) { PurpleDebugLevel purple_level; char *msg = g_strdup_vprintf(format, args); @@ -2232,14 +2342,10 @@ break; } - purple_debug(purple_level, "gg", msg); + purple_debug(purple_level, "gg", "%s", msg); g_free(msg); } -/* }}} */ -/* - */ -/* static void init_plugin(PurplePlugin *plugin) {{{ */ static void init_plugin(PurplePlugin *plugin) { PurpleAccountOption *option; @@ -2253,7 +2359,6 @@ gg_debug_handler = purple_gg_debug_handler; } -/* }}} */ PURPLE_INIT_PLUGIN(gg, init_plugin, info); diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/gg/gg.h --- a/libpurple/protocols/gg/gg.h Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/gg/gg.h Sat Dec 13 08:48:58 2008 +0000 @@ -65,9 +65,10 @@ uin_t tmp_buddy; int chats_count; + GList *pending_richtext_messages; + GHashTable *pending_images; } GGPInfo; - #endif /* _PURPLE_GG_H */ /* vim: set ts=8 sts=0 sw=8 noet: */ diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/irc/Makefile.am --- a/libpurple/protocols/irc/Makefile.am Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/irc/Makefile.am Sat Dec 13 08:48:58 2008 +0000 @@ -1,8 +1,15 @@ -EXTRA_DIST = Makefile.mingw +EXTRA_DIST = \ + Makefile.mingw pkgdir = $(libdir)/purple-$(PURPLE_MAJOR_VERSION) -IRCSOURCES = irc.c parse.c cmds.c msgs.c irc.h dcc_send.c +IRCSOURCES = \ + cmds.c \ + dcc_send.c \ + irc.c \ + irc.h \ + msgs.c \ + parse.c AM_CFLAGS = $(st) @@ -11,18 +18,14 @@ if STATIC_IRC st = -DPURPLE_STATIC_PRPL -noinst_LIBRARIES = libirc.a -pkg_LTLIBRARIES = - -libirc_a_SOURCES = $(IRCSOURCES) -libirc_a_CFLAGS = $(AM_CFLAGS) +noinst_LTLIBRARIES = libirc.la +libirc_la_SOURCES = $(IRCSOURCES) +libirc_la_CFLAGS = $(AM_CFLAGS) else st = -pkg_LTLIBRARIES = libirc.la -noinst_LIBRARIES = - +pkg_LTLIBRARIES = libirc.la libirc_la_SOURCES = $(IRCSOURCES) libirc_la_LIBADD = $(GLIB_LIBS) diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/irc/cmds.c --- a/libpurple/protocols/irc/cmds.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/irc/cmds.c Sat Dec 13 08:48:58 2008 +0000 @@ -71,7 +71,7 @@ int irc_cmd_ctcp(struct irc_conn *irc, const char *cmd, const char *target, const char **args) { /* we have defined args as args[0] is target and args[1] is ctcp command */ - char *buf; + char *buf; GString *string; /* check if we have args */ @@ -141,11 +141,11 @@ action[strlen(action) - 1] = '\0'; if (purple_conversation_get_type(convo) == PURPLE_CONV_TYPE_CHAT) serv_got_chat_in(gc, purple_conv_chat_get_id(PURPLE_CONV_CHAT(convo)), - purple_connection_get_display_name(gc), - 0, action, time(NULL)); + purple_connection_get_display_name(gc), + 0, action, time(NULL)); else purple_conv_im_write(PURPLE_CONV_IM(convo), purple_connection_get_display_name(gc), - action, 0, time(NULL)); + action, 0, time(NULL)); g_free(action); } @@ -156,7 +156,6 @@ { char *buf; - if (!args || !args[0]) return 0; diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/irc/dcc_send.c --- a/libpurple/protocols/irc/dcc_send.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/irc/dcc_send.c Sat Dec 13 08:48:58 2008 +0000 @@ -302,7 +302,7 @@ if (sock < 0) { purple_notify_error(gc, NULL, _("File Transfer Failed"), - _("Could not open a listening port.")); + _("Could not open a listening port.")); purple_xfer_cancel_local(xfer); return; } @@ -313,14 +313,14 @@ purple_debug_misc("irc", "port is %hu\n", port); /* Monitor the listening socket */ xfer->watcher = purple_input_add(sock, PURPLE_INPUT_READ, - irc_dccsend_send_connected, xfer); + irc_dccsend_send_connected, xfer); /* Send the intended recipient the DCC request */ arg[0] = xfer->who; inet_aton(purple_network_get_my_ip(irc->fd), &addr); arg[1] = tmp = g_strdup_printf("\001DCC SEND \"%s\" %u %hu %" G_GSIZE_FORMAT "\001", - xfer->filename, ntohl(addr.s_addr), - port, xfer->size); + xfer->filename, ntohl(addr.s_addr), + port, xfer->size); irc_cmd_privmsg(gc->proto_data, "msg", NULL, arg); g_free(tmp); @@ -343,7 +343,7 @@ if (xd->listen_data == NULL) { purple_xfer_unref(xfer); purple_notify_error(gc, NULL, _("File Transfer Failed"), - _("Could not open a listening port.")); + _("Could not open a listening port.")); purple_xfer_cancel_local(xfer); } diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/irc/msgs.c --- a/libpurple/protocols/irc/msgs.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/irc/msgs.c Sat Dec 13 08:48:58 2008 +0000 @@ -123,10 +123,10 @@ void irc_msg_default(struct irc_conn *irc, const char *name, const char *from, char **args) { char *clean; - /* This, too, should be escaped somehow (smarter) */ - clean = purple_utf8_salvage(args[0]); + /* This, too, should be escaped somehow (smarter) */ + clean = purple_utf8_salvage(args[0]); purple_debug(PURPLE_DEBUG_INFO, "irc", "Unrecognized message: %s\n", clean); - g_free(clean); + g_free(clean); } void irc_msg_features(struct irc_conn *irc, const char *name, const char *from, char **args) @@ -814,8 +814,8 @@ purple_conversation_set_data(convo, IRC_NAMES_FLAG, GINT_TO_POINTER(FALSE)); /* Until purple_conversation_present does something that - * one would expect in Pidgin, this call produces buggy - * behavior both for the /join and auto-join cases. */ + * one would expect in Pidgin, this call produces buggy + * behavior both for the /join and auto-join cases. */ /* purple_conversation_present(convo); */ return; } @@ -1043,7 +1043,7 @@ return; /* Undernet likes to :-quote the channel name, for no good reason - * that I can see. This catches that. */ + * that I can see. This catches that. */ channel = (args[0][0] == ':') ? &args[0][1] : args[0]; convo = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, channel, irc->account); @@ -1056,8 +1056,8 @@ if (!purple_utf8_strcasecmp(nick, purple_connection_get_display_name(gc))) { char *escaped = g_markup_escape_text(args[1], -1); msg = g_strdup_printf(_("You have parted the channel%s%s"), - (args[1] && *args[1]) ? ": " : "", - (escaped && *escaped) ? escaped : ""); + (args[1] && *args[1]) ? ": " : "", + (escaped && *escaped) ? escaped : ""); g_free(escaped); purple_conv_chat_write(PURPLE_CONV_CHAT(convo), channel, msg, PURPLE_MESSAGE_SYSTEM, time(NULL)); g_free(msg); @@ -1168,7 +1168,7 @@ serv_got_chat_in(gc, purple_conv_chat_get_id(PURPLE_CONV_CHAT(convo)), nick, 0, msg, time(NULL)); else purple_debug_error("irc", "Got a %s on %s, which does not exist\n", - notice ? "NOTICE" : "PRIVMSG", to); + notice ? "NOTICE" : "PRIVMSG", to); } g_free(msg); g_free(nick); diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/irc/parse.c --- a/libpurple/protocols/irc/parse.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/irc/parse.c Sat Dec 13 08:48:58 2008 +0000 @@ -494,7 +494,7 @@ } } result[j] = '\0'; - return result; + return result; } const char *irc_nick_skip_mode(struct irc_conn *irc, const char *nick) @@ -732,9 +732,9 @@ static void irc_parse_error_cb(struct irc_conn *irc, char *input) { char *clean; - /* This really should be escaped somehow that you can tell what - * the junk was -- but as it is, it can crash glib. */ - clean = purple_utf8_salvage(input); + /* This really should be escaped somehow that you can tell what + * the junk was -- but as it is, it can crash glib. */ + clean = purple_utf8_salvage(input); purple_debug(PURPLE_DEBUG_WARNING, "irc", "Unrecognized string: %s\n", clean); - g_free(clean); + g_free(clean); } diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/jabber/Makefile.am --- a/libpurple/protocols/jabber/Makefile.am Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/jabber/Makefile.am Sat Dec 13 08:48:58 2008 +0000 @@ -1,7 +1,7 @@ EXTRA_DIST = \ - Makefile.mingw \ - win32/posix.uname.c \ - win32/utsname.h + Makefile.mingw \ + win32/posix.uname.c \ + win32/utsname.h pkgdir = $(libdir)/purple-$(PURPLE_MAJOR_VERSION) @@ -73,20 +73,16 @@ if STATIC_JABBER st = -DPURPLE_STATIC_PRPL -noinst_LIBRARIES = libjabber.a -pkg_LTLIBRARIES = - -libjabber_a_SOURCES = $(JABBERSOURCES) libxmpp.c -libjabber_a_CFLAGS = $(AM_CFLAGS) +noinst_LTLIBRARIES = libjabber.la +libjabber_la_SOURCES = $(JABBERSOURCES) libxmpp.c +libjabber_la_CFLAGS = $(AM_CFLAGS) else st = -pkg_LTLIBRARIES = libjabber.la libxmpp.la -noinst_LIBRARIES = - -libjabber_la_SOURCES = $(JABBERSOURCES) -libjabber_la_LIBADD = $(GLIB_LIBS) $(SASL_LIBS) $(LIBXML_LIBS) +pkg_LTLIBRARIES = libjabber.la libxmpp.la +libjabber_la_SOURCES = $(JABBERSOURCES) +libjabber_la_LIBADD = $(GLIB_LIBS) $(SASL_LIBS) $(LIBXML_LIBS) libxmpp_la_SOURCES = libxmpp.c libxmpp_la_LIBADD = libjabber.la diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/jabber/jabber.c --- a/libpurple/protocols/jabber/jabber.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/jabber/jabber.c Sat Dec 13 08:48:58 2008 +0000 @@ -1746,7 +1746,7 @@ types = g_list_append(types, type); type = purple_status_type_new_with_attrs(PURPLE_STATUS_TUNE, - "tune", NULL, TRUE, TRUE, TRUE, + "tune", NULL, FALSE, TRUE, TRUE, PURPLE_TUNE_ARTIST, _("Tune Artist"), purple_value_new(PURPLE_TYPE_STRING), PURPLE_TUNE_TITLE, _("Tune Title"), purple_value_new(PURPLE_TYPE_STRING), PURPLE_TUNE_ALBUM, _("Tune Album"), purple_value_new(PURPLE_TYPE_STRING), @@ -2431,6 +2431,15 @@ purple_debug_error("jabber", "Could not find buddy\n"); return FALSE; } + + if (!jabber_buddy_has_capability(jb, JINGLE_TRANSPORT_ICEUDP) && + !jabber_buddy_has_capability(jb, + JINGLE_TRANSPORT_RAWUDP)) { + purple_debug_error("jingle-rtp", "Buddy doesn't support " + "the same transport types\n"); + return FALSE; + } + /* XMPP will only support two-way media, AFAIK... */ if (type == (PURPLE_MEDIA_AUDIO | PURPLE_MEDIA_VIDEO)) { purple_debug_info("jabber", diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/jabber/jingle/rtp.c --- a/libpurple/protocols/jabber/jingle/rtp.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/jabber/jingle/rtp.c Sat Dec 13 08:48:58 2008 +0000 @@ -666,6 +666,7 @@ JabberBuddy *jb; JabberBuddyResource *jbr; PurpleMedia *media; + const gchar *transport_type; gchar *jid = NULL, *me = NULL, *sid = NULL; @@ -680,6 +681,16 @@ purple_debug_error("jingle-rtp", "Could not find buddy's resource\n"); } + if (jabber_resource_has_capability(jbr, JINGLE_TRANSPORT_ICEUDP)) { + transport_type = JINGLE_TRANSPORT_ICEUDP; + } else if (jabber_resource_has_capability(jbr, JINGLE_TRANSPORT_RAWUDP)) { + transport_type = JINGLE_TRANSPORT_RAWUDP; + } else { + purple_debug_error("jingle-rtp", "Resource doesn't support " + "the same transport types\n"); + return NULL; + } + if ((strchr(who, '/') == NULL) && jbr && (jbr->name != NULL)) { jid = g_strdup_printf("%s/%s", who, jbr->name); } else { @@ -695,7 +706,7 @@ if (type & PURPLE_MEDIA_AUDIO) { - transport = jingle_transport_create(JINGLE_TRANSPORT_ICEUDP); + transport = jingle_transport_create(transport_type); content = jingle_content_create(JINGLE_APP_RTP, "initiator", "session", "audio-session", "both", transport); jingle_session_add_content(session, content); @@ -703,7 +714,7 @@ jingle_rtp_init_media(content); } if (type & PURPLE_MEDIA_VIDEO) { - transport = jingle_transport_create(JINGLE_TRANSPORT_ICEUDP); + transport = jingle_transport_create(transport_type); content = jingle_content_create(JINGLE_APP_RTP, "initiator", "session", "video-session", "both", transport); jingle_session_add_content(session, content); diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/jabber/message.c --- a/libpurple/protocols/jabber/message.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/jabber/message.c Sat Dec 13 08:48:58 2008 +0000 @@ -612,7 +612,7 @@ if (jid) { chat = jabber_chat_find(js, jid->node, jid->domain); - conv = chat->conv; + if (chat) conv = chat->conv; } jabber_id_free(jid); @@ -644,7 +644,7 @@ /* note: if there were no smileys in the incoming message, or if receiving custom smileys is turned off, smiley_refs will be NULL */ - for (; smiley_refs ; smiley_refs = g_list_delete_link(smiley_refs, smiley_refs)) { + for (; conv && smiley_refs ; smiley_refs = g_list_delete_link(smiley_refs, smiley_refs)) { JabberSmileyRef *ref = (JabberSmileyRef *) smiley_refs->data; const gchar *cid = ref->cid; const gchar *alt = ref->alt; diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/jabber/parser.c --- a/libpurple/protocols/jabber/parser.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/jabber/parser.c Sat Dec 13 08:48:58 2008 +0000 @@ -114,7 +114,8 @@ xmlnode *packet = js->current; js->current = NULL; jabber_process_packet(js, &packet); - xmlnode_free(packet); + if (packet != NULL) + xmlnode_free(packet); } } @@ -137,11 +138,19 @@ { JabberStream *js = user_data; + if (error->level == XML_ERR_WARNING && error->message != NULL + && strcmp(error->message, "xmlns: URI vcard-temp is not absolute\n") == 0) + /* + * This message happens when parsing vcards, and is normal, so don't + * bother logging it because people scare easily. + */ + return; + purple_debug_error("jabber", "XML parser error for JabberStream %p: " - "Domain %i, code %i, level %i: %s\n", + "Domain %i, code %i, level %i: %s", js, error->domain, error->code, error->level, - (error->message ? error->message : "(null)")); + (error->message ? error->message : "(null)\n")); } static xmlSAXHandler jabber_parser_libxml = { diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/jabber/presence.c --- a/libpurple/protocols/jabber/presence.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/jabber/presence.c Sat Dec 13 08:48:58 2008 +0000 @@ -463,7 +463,7 @@ if (buddy) { jb = jabber_buddy_find(js, from, TRUE); - if ((jb->subscription & JABBER_SUB_TO)) + if ((jb->subscription & (JABBER_SUB_TO | JABBER_SUB_PENDING))) onlist = TRUE; } diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/jabber/si.c --- a/libpurple/protocols/jabber/si.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/jabber/si.c Sat Dec 13 08:48:58 2008 +0000 @@ -798,7 +798,7 @@ if (!(sh->jid && sh->host && sh->port > 0)) continue; - purple_debug_info("jabber", "jabber_si_xfer_bytestreams_listen_cb() will be looking at jsx %p: jsx->streamhosts %p and sh->jid %p", + purple_debug_info("jabber", "jabber_si_xfer_bytestreams_listen_cb() will be looking at jsx %p: jsx->streamhosts %p and sh->jid %p\n", jsx, jsx->streamhosts, sh->jid); if(g_list_find_custom(jsx->streamhosts, sh->jid, jabber_si_compare_jid) != NULL) continue; diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/msn/Makefile.am --- a/libpurple/protocols/msn/Makefile.am Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/msn/Makefile.am Sat Dec 13 08:48:58 2008 +0000 @@ -1,7 +1,7 @@ EXTRA_DIST = \ - directconn.c \ - directconn.h \ - Makefile.mingw + directconn.c \ + directconn.h \ + Makefile.mingw pkgdir = $(libdir)/purple-$(PURPLE_MAJOR_VERSION) @@ -74,9 +74,9 @@ if STATIC_MSN st = -DPURPLE_STATIC_PRPL -noinst_LIBRARIES = libmsn.a -libmsn_a_SOURCES = $(MSNSOURCES) -libmsn_a_CFLAGS = $(AM_CFLAGS) +noinst_LTLIBRARIES = libmsn.la +libmsn_la_SOURCES = $(MSNSOURCES) +libmsn_la_CFLAGS = $(AM_CFLAGS) else diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/msn/httpconn.c --- a/libpurple/protocols/msn/httpconn.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/msn/httpconn.c Sat Dec 13 08:48:58 2008 +0000 @@ -64,7 +64,6 @@ const char *body_start; char *tmp; size_t body_len = 0; - gboolean wasted = FALSE; g_return_val_if_fail(httpconn != NULL, FALSE); g_return_val_if_fail(buf != NULL, FALSE); @@ -120,7 +119,7 @@ /* Need to wait for the full HTTP header to arrive */ return FALSE; - s += 4; /* Skip \r\n */ + s += 4; /* Skip \r\n\r\n */ header = g_strndup(buf, s - buf); body_start = s; body_len = size - (body_start - buf); @@ -158,11 +157,12 @@ } } - body = g_malloc0(body_len + 1); + body = g_malloc(body_len + 1); memcpy(body, body_start, body_len); + body[body_len] = '\0'; #ifdef MSN_DEBUG_HTTP - purple_debug_misc("msn", "Incoming HTTP buffer (header): {%s\r\n}\n", + purple_debug_misc("msn", "Incoming HTTP buffer (header): {%s}\n", header); #endif @@ -184,6 +184,7 @@ purple_debug_error("msn", "Malformed X-MSN-Messenger field.\n{%s}\n", buf); + g_free(header); g_free(body); return FALSE; } @@ -217,15 +218,10 @@ g_free(tmp); - if ((session_action != NULL) && (strcmp(session_action, "close") == 0)) - wasted = TRUE; - - g_free(session_action); - t = strchr(full_session_id, '.'); session_id = g_strndup(full_session_id, t - full_session_id); - if (!wasted) + if (session_action == NULL || strcmp(session_action, "close") != 0) { g_free(httpconn->full_session_id); httpconn->full_session_id = full_session_id; @@ -254,6 +250,8 @@ g_free(session_id); g_free(gw_ip); } + + g_free(session_action); } g_free(header); @@ -271,27 +269,26 @@ { MsnHttpConn *httpconn; MsnServConn *servconn; - MsnSession *session; char buf[MSN_BUF_LEN]; - char *cur, *end, *old_rx_buf; gssize len; - int cur_len; char *result_msg = NULL; size_t result_len = 0; gboolean error = FALSE; httpconn = data; - servconn = NULL; - session = httpconn->session; + servconn = httpconn->servconn; + + if (servconn->type == MSN_SERVCONN_NS) + servconn->session->account->gc->last_received = time(NULL); len = read(httpconn->fd, buf, sizeof(buf) - 1); - if (len < 0 && errno == EAGAIN) return; - else if (len <= 0) - { - purple_debug_error("msn", "HTTP: Read error\n"); - msn_servconn_got_error(httpconn->servconn, MSN_SERVCONN_ERROR_READ); + if (len <= 0) { + purple_debug_error("msn", "HTTP: servconn %03d read error, " + "len: %" G_GSSIZE_FORMAT ", errno: %d, error: %s\n", + servconn->num, len, error, g_strerror(errno)); + msn_servconn_got_error(servconn, MSN_SERVCONN_ERROR_READ); return; } @@ -307,19 +304,15 @@ { /* Either we must wait for more input, or something went wrong */ if (error) - msn_servconn_got_error(httpconn->servconn, MSN_SERVCONN_ERROR_READ); + msn_servconn_got_error(servconn, MSN_SERVCONN_ERROR_READ); return; } - httpconn->servconn->processing = FALSE; - - servconn = httpconn->servconn; - if (error) { purple_debug_error("msn", "HTTP: Special error\n"); - msn_servconn_got_error(httpconn->servconn, MSN_SERVCONN_ERROR_READ); + msn_servconn_got_error(servconn, MSN_SERVCONN_ERROR_READ); return; } @@ -342,64 +335,7 @@ servconn->rx_buf = result_msg; servconn->rx_len = result_len; - end = old_rx_buf = servconn->rx_buf; - - servconn->processing = TRUE; - - do - { - cur = end; - - if (servconn->payload_len) - { - if (servconn->payload_len > servconn->rx_len) - /* The payload is still not complete. */ - break; - - cur_len = servconn->payload_len; - end += cur_len; - } - else - { - end = strstr(cur, "\r\n"); - - if (end == NULL) - /* The command is still not complete. */ - break; - - *end = '\0'; - end += 2; - cur_len = end - cur; - } - - servconn->rx_len -= cur_len; - - if (servconn->payload_len) - { - msn_cmdproc_process_payload(servconn->cmdproc, cur, cur_len); - servconn->payload_len = 0; - } - else - { - msn_cmdproc_process_cmd_text(servconn->cmdproc, cur); - servconn->payload_len = servconn->cmdproc->last_cmd->payload_len; - } - } while (servconn->connected && servconn->rx_len > 0); - - if (servconn->connected) - { - if (servconn->rx_len > 0) - servconn->rx_buf = g_memdup(cur, servconn->rx_len); - else - servconn->rx_buf = NULL; - } - - servconn->processing = FALSE; - - if (servconn->wasted) - msn_servconn_destroy(servconn); - - g_free(old_rx_buf); + msn_servconn_process_data(servconn); } static void @@ -723,7 +659,7 @@ httpconn->inpa = purple_input_add(httpconn->fd, PURPLE_INPUT_READ, read_cb, data); - httpconn->timer = purple_timeout_add(2000, msn_httpconn_poll, httpconn); + httpconn->timer = purple_timeout_add_seconds(2, msn_httpconn_poll, httpconn); msn_httpconn_process_queue(httpconn); } diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/msn/msg.c --- a/libpurple/protocols/msn/msg.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/msn/msg.c Sat Dec 13 08:48:58 2008 +0000 @@ -192,8 +192,9 @@ if (body_len > 0) { msg->body_len = len - (tmp - body); - msg->body = g_malloc0(msg->body_len + 1); + msg->body = g_malloc(msg->body_len + 1); memcpy(msg->body, tmp, msg->body_len); + msg->body[msg->body_len] = '\0'; tmp += body_len; } } @@ -209,8 +210,9 @@ char **elems, **cur, **tokens; g_return_if_fail(payload != NULL); - tmp_base = tmp = g_malloc0(payload_len + 1); + tmp_base = tmp = g_malloc(payload_len + 1); memcpy(tmp_base, payload, payload_len); + tmp_base[payload_len] = '\0'; /* Parse the attributes. */ end = strstr(tmp, body_dem); @@ -308,8 +310,9 @@ if (body_len > 0) { msg->body_len = body_len; g_free(msg->body); - msg->body = g_malloc0(msg->body_len + 1); + msg->body = g_malloc(msg->body_len + 1); memcpy(msg->body, tmp, msg->body_len); + msg->body[msg->body_len] = '\0'; tmp += body_len; } @@ -325,8 +328,9 @@ if (payload_len - (tmp - tmp_base) > 0) { msg->body_len = payload_len - (tmp - tmp_base); g_free(msg->body); - msg->body = g_malloc0(msg->body_len + 1); + msg->body = g_malloc(msg->body_len + 1); memcpy(msg->body, tmp, msg->body_len); + msg->body[msg->body_len] = '\0'; } } @@ -523,8 +527,9 @@ if (data != NULL && len > 0) { - msg->body = g_malloc0(len + 1); + msg->body = g_malloc(len + 1); memcpy(msg->body, data, len); + msg->body[len] = '\0'; msg->body_len = len; } else diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/msn/msn.c --- a/libpurple/protocols/msn/msn.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/msn/msn.c Sat Dec 13 08:48:58 2008 +0000 @@ -121,9 +121,6 @@ session = gc->proto_data; swboard = msn_session_get_swboard(session, username, MSN_SB_FLAG_IM); - if (swboard == NULL) - return FALSE; - msn_switchboard_send_msg(swboard, msg, TRUE); msn_message_destroy(msg); @@ -550,21 +547,17 @@ msn_new_xfer(PurpleConnection *gc, const char *who) { MsnSession *session; - MsnSlpLink *slplink; PurpleXfer *xfer; session = gc->proto_data; xfer = purple_xfer_new(gc->account, PURPLE_XFER_SEND, who); - if (xfer) - { - slplink = msn_session_get_slplink(session, who); - - xfer->data = slplink; - - purple_xfer_set_init_fnc(xfer, t_msn_xfer_init); - } + g_return_val_if_fail(xfer != NULL, NULL); + + xfer->data = msn_session_get_slplink(session, who); + + purple_xfer_set_init_fnc(xfer, t_msn_xfer_init); return xfer; } @@ -843,7 +836,7 @@ types = g_list_append(types, status); status = purple_status_type_new_with_attrs(PURPLE_STATUS_TUNE, - "tune", NULL, TRUE, TRUE, TRUE, + "tune", NULL, FALSE, TRUE, TRUE, PURPLE_TUNE_ARTIST, _("Artist"), purple_value_new(PURPLE_TYPE_STRING), PURPLE_TUNE_ALBUM, _("Album"), purple_value_new(PURPLE_TYPE_STRING), PURPLE_TUNE_TITLE, _("Title"), purple_value_new(PURPLE_TYPE_STRING), @@ -1203,6 +1196,9 @@ purple_debug_info("msn", "prepare to send online Message\n"); if (g_ascii_strcasecmp(who, username)) { + if (flags & PURPLE_MESSAGE_AUTO_RESP) { + msn_message_set_flag(msg, 'U'); + } if (msn_user_is_yahoo(account, who)) { /*we send the online and offline Message to Yahoo User via UBM*/ purple_debug_info("msn", "send to Yahoo User\n"); @@ -2557,22 +2553,19 @@ PURPLE_PLUGIN_MAGIC, PURPLE_MAJOR_VERSION, PURPLE_MINOR_VERSION, - PURPLE_PLUGIN_PROTOCOL, /**< type */ + PURPLE_PLUGIN_PROTOCOL, /**< type */ NULL, /**< ui_requirement */ 0, /**< flags */ NULL, /**< dependencies */ - PURPLE_PRIORITY_DEFAULT, /**< priority */ + PURPLE_PRIORITY_DEFAULT, /**< priority */ "prpl-msn", /**< id */ "MSN", /**< name */ DISPLAY_VERSION, /**< version */ - /** summary */ - N_("Windows Live Messenger Protocol Plugin"), - /** description */ - N_("Windows Live Messenger Protocol Plugin"), - "Christian Hammond , " - "MaYuan ", /**< author */ - PURPLE_WEBSITE, /**< homepage */ + N_("Windows Live Messenger Protocol Plugin"), /**< summary */ + N_("Windows Live Messenger Protocol Plugin"), /**< description */ + NULL, /**< author */ + PURPLE_WEBSITE, /**< homepage */ msn_load, /**< load */ msn_unload, /**< unload */ diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/msn/notification.c --- a/libpurple/protocols/msn/notification.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/msn/notification.c Sat Dec 13 08:48:58 2008 +0000 @@ -491,7 +491,7 @@ * command and we are processing it */ if (cmd->payload == NULL) { cmdproc->last_cmd->payload_cb = msg_cmd_post; - cmd->payload_len = atoi(cmd->params[4]); + cmd->payload_len = atoi(cmd->params[3]); } else { g_return_if_fail(cmd->payload_cb != NULL); diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/msn/servconn.c --- a/libpurple/protocols/msn/servconn.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/msn/servconn.c Sat Dec 13 08:48:58 2008 +0000 @@ -69,8 +69,7 @@ return; } - if (servconn->connected) - msn_servconn_disconnect(servconn); + msn_servconn_disconnect(servconn); if (servconn->destroy_cb) servconn->destroy_cb(servconn); @@ -174,15 +173,6 @@ servconn = data; servconn->connect_data = NULL; - servconn->processing = FALSE; - - if (servconn->wasted) - { - if (source >= 0) - close(source); - msn_servconn_destroy(servconn); - return; - } servconn->fd = source; @@ -239,15 +229,7 @@ servconn->connect_data = purple_proxy_connect(NULL, session->account, host, port, connect_cb, servconn); - if (servconn->connect_data != NULL) - { - servconn->processing = TRUE; - return TRUE; - } - else - { - return FALSE; - } + return (servconn->connect_data != NULL); } void @@ -383,24 +365,19 @@ read_cb(gpointer data, gint source, PurpleInputCondition cond) { MsnServConn *servconn; - MsnSession *session; char buf[MSN_BUF_LEN]; - char *cur, *end, *old_rx_buf; gssize len; - int cur_len; servconn = data; - session = servconn->session; - len = read(servconn->fd, buf, sizeof(buf) - 1); if (servconn->type == MSN_SERVCONN_NS) servconn->session->account->gc->last_received = time(NULL); - if (len < 0 && errno == EAGAIN) { + len = read(servconn->fd, buf, sizeof(buf) - 1); + if (len < 0 && errno == EAGAIN) return; - - } else if (len <= 0) { - purple_debug_error("msn", "servconn %03d read error," + if (len <= 0) { + purple_debug_error("msn", "servconn %03d read error, " "len: %" G_GSSIZE_FORMAT ", errno: %d, error: %s\n", servconn->num, len, errno, g_strerror(errno)); msn_servconn_got_error(servconn, MSN_SERVCONN_ERROR_READ); @@ -414,6 +391,14 @@ memcpy(servconn->rx_buf + servconn->rx_len, buf, len + 1); servconn->rx_len += len; + msn_servconn_process_data(servconn); +} + +void msn_servconn_process_data(MsnServConn *servconn) +{ + char *cur, *end, *old_rx_buf; + int cur_len; + end = old_rx_buf = servconn->rx_buf; servconn->processing = TRUE; diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/msn/servconn.h --- a/libpurple/protocols/msn/servconn.h Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/msn/servconn.h Sat Dec 13 08:48:58 2008 +0000 @@ -170,4 +170,12 @@ */ void msn_servconn_got_error(MsnServConn *servconn, MsnServConnError error); +/** + * Process the data in servconn->rx_buf. This is called after reading + * data from the socket. + * + * @param servconn The servconn. + */ +void msn_servconn_process_data(MsnServConn *servconn); + #endif /* _MSN_SERVCONN_H_ */ diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/msn/session.c --- a/libpurple/protocols/msn/session.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/msn/session.c Sat Dec 13 08:48:58 2008 +0000 @@ -118,12 +118,7 @@ g_return_val_if_reached(FALSE); } - if (msn_notification_connect(session->notification, host, port)) - { - return TRUE; - } - - return FALSE; + return msn_notification_connect(session->notification, host, port); } void @@ -460,8 +455,10 @@ gc = purple_account_get_connection(account); img = purple_buddy_icons_find_account_icon(session->account); + /* TODO: Do we really want to call this if img is NULL? */ msn_user_set_buddy_icon(session->user, img); - purple_imgstore_unref(img); + if (img != NULL) + purple_imgstore_unref(img); session->logged_in = TRUE; diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/msn/slp.c --- a/libpurple/protocols/msn/slp.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/msn/slp.c Sat Dec 13 08:48:58 2008 +0000 @@ -33,7 +33,7 @@ #include "smiley.h" /* ms to delay between sending buddy icon requests to the server. */ -#define BUDDY_ICON_DELAY 20000 +#define BUDDY_ICON_DELAY 20 /*debug SLP*/ #define MSN_DEBUG_UD @@ -97,7 +97,7 @@ content); g_free(content); - msn_slplink_unleash(slpcall->slplink); + msn_slplink_send_queued_slpmsgs(slpcall->slplink); } void @@ -115,7 +115,7 @@ { if (slpcall->started) { - msn_slp_call_close(slpcall); + msn_slpcall_close(slpcall); } else { @@ -126,9 +126,9 @@ content); g_free(content); - msn_slplink_unleash(slpcall->slplink); + msn_slplink_send_queued_slpmsgs(slpcall->slplink); - msn_slp_call_destroy(slpcall); + msn_slpcall_destroy(slpcall); } } } @@ -219,7 +219,7 @@ msn_slplink_queue_slpmsg(slplink, slpmsg); - msn_slp_call_session_init(slpcall); + msn_slpcall_session_init(slpcall); } static void @@ -385,6 +385,7 @@ send_bye(MsnSlpCall *slpcall, const char *type) { MsnSlpLink *slplink; + PurpleAccount *account; MsnSlpMessage *slpmsg; char *header; @@ -392,8 +393,10 @@ g_return_if_fail(slplink != NULL); + account = slplink->session->account; + header = g_strdup_printf("BYE MSNMSGR:%s MSNSLP/1.0", - slplink->local_user); + purple_account_get_username(account)); slpmsg = msn_slpmsg_sip_new(slpcall, 0, header, "A0D624A6-6C0C-4283-A9E0-BC97B4B46D32", @@ -585,10 +588,10 @@ } else { - msn_slp_call_session_init(slpcall); + msn_slpcall_session_init(slpcall); } #else - msn_slp_call_session_init(slpcall); + msn_slpcall_session_init(slpcall); #endif } else if (!strcmp(type, "application/x-msnmsgr-transreqbody")) @@ -643,7 +646,7 @@ char *content; char *content_type; - slpcall = msn_slp_call_new(slplink); + slpcall = msn_slpcall_new(slplink); /* From: */ #if 0 @@ -708,7 +711,7 @@ slpcall->wasted = TRUE; - /* msn_slp_call_destroy(slpcall); */ + /* msn_slpcall_destroy(slpcall); */ return slpcall; } @@ -732,7 +735,7 @@ if (slpcall != NULL) slpcall->wasted = TRUE; - /* msn_slp_call_destroy(slpcall); */ + /* msn_slpcall_destroy(slpcall); */ } else slpcall = NULL; @@ -755,17 +758,20 @@ if (slplink->swboard == NULL) { - /* We will need this in order to change its flags. */ - slplink->swboard = (MsnSwitchBoard *)cmdproc->data; - /* If swboard is NULL, something has probably gone wrong earlier on - * I didn't want to do this, but MSN 7 is somehow causing us to crash - * here, I couldn't reproduce it to debug more, and people are - * reporting bugs. Hopefully this doesn't cause more crashes. Stu. + /* + * We will need swboard in order to change its flags. If its + * NULL, something has probably gone wrong earlier on. I + * didn't want to do this, but MSN 7 is somehow causing us + * to crash here, I couldn't reproduce it to debug more, + * and people are reporting bugs. Hopefully this doesn't + * cause more crashes. Stu. */ - if (slplink->swboard != NULL) + if (cmdproc->data == NULL) + g_warning("msn_p2p_msg cmdproc->data was NULL\n"); + else { + slplink->swboard = (MsnSwitchBoard *)cmdproc->data; slplink->swboard->slplinks = g_list_prepend(slplink->swboard->slplinks, slplink); - else - purple_debug_error("msn", "msn_p2p_msg, swboard is NULL, ouch!\n"); + } } msn_slplink_process_msg(slplink, msg); @@ -841,7 +847,18 @@ sha1 = msn_object_get_sha1(obj); slplink = msn_session_get_slplink(session, who); - slplink->swboard = swboard; + if (slplink->swboard != swboard) { + if (slplink->swboard != NULL) + /* + * Apparently we're using a different switchboard now or + * something? I don't know if this is normal, but it + * definitely happens. So make sure the old switchboard + * doesn't still have a reference to us. + */ + slplink->swboard->slplinks = g_list_remove(slplink->swboard->slplinks, slplink); + slplink->swboard = swboard; + slplink->swboard->slplinks = g_list_prepend(slplink->swboard->slplinks, slplink); + } /* If the conversation doesn't exist then this is a custom smiley * used in the first message in a MSN conversation: we need to create @@ -1054,8 +1071,8 @@ purple_timeout_remove(userlist->buddy_icon_request_timer); } - /* Wait BUDDY_ICON_DELAY ms before freeing our window slot and requesting the next icon. */ - userlist->buddy_icon_request_timer = purple_timeout_add(BUDDY_ICON_DELAY, + /* Wait BUDDY_ICON_DELAY s before freeing our window slot and requesting the next icon. */ + userlist->buddy_icon_request_timer = purple_timeout_add_seconds(BUDDY_ICON_DELAY, msn_release_buddy_icon_request_timeout, userlist); } diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/msn/slpcall.c --- a/libpurple/protocols/msn/slpcall.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/msn/slpcall.c Sat Dec 13 08:48:58 2008 +0000 @@ -33,8 +33,30 @@ * Main **************************************************************************/ +static gboolean +msn_slpcall_timeout(gpointer data) +{ + MsnSlpCall *slpcall; + + slpcall = data; + +#ifdef MSN_DEBUG_SLPCALL + purple_debug_info("msn", "slpcall_timeout: slpcall(%p)\n", slpcall); +#endif + + if (!slpcall->pending && !slpcall->progress) + { + msn_slpcall_destroy(slpcall); + return FALSE; + } + + slpcall->progress = FALSE; + + return TRUE; +} + MsnSlpCall * -msn_slp_call_new(MsnSlpLink *slplink) +msn_slpcall_new(MsnSlpLink *slplink) { MsnSlpCall *slpcall; @@ -50,16 +72,15 @@ msn_slplink_add_slpcall(slplink, slpcall); - slpcall->timer = purple_timeout_add(MSN_SLPCALL_TIMEOUT, msn_slp_call_timeout, slpcall); + slpcall->timer = purple_timeout_add_seconds(MSN_SLPCALL_TIMEOUT, msn_slpcall_timeout, slpcall); return slpcall; } void -msn_slp_call_destroy(MsnSlpCall *slpcall) +msn_slpcall_destroy(MsnSlpCall *slpcall) { GList *e; - MsnSession *session; #ifdef MSN_DEBUG_SLPCALL purple_debug_info("msn", "slpcall_destroy: slpcall(%p)\n", slpcall); @@ -86,18 +107,16 @@ } } - session = slpcall->slplink->session; - - msn_slplink_remove_slpcall(slpcall->slplink, slpcall); - if (slpcall->end_cb != NULL) - slpcall->end_cb(slpcall, session); + slpcall->end_cb(slpcall, slpcall->slplink->session); if (slpcall->xfer != NULL) { slpcall->xfer->data = NULL; purple_xfer_unref(slpcall->xfer); } + msn_slplink_remove_slpcall(slpcall->slplink, slpcall); + g_free(slpcall->id); g_free(slpcall->branch); g_free(slpcall->data_info); @@ -106,7 +125,7 @@ } void -msn_slp_call_init(MsnSlpCall *slpcall, MsnSlpCallType type) +msn_slpcall_init(MsnSlpCall *slpcall, MsnSlpCallType type) { slpcall->session_id = rand() % 0xFFFFFF00 + 4; slpcall->id = rand_guid(); @@ -114,7 +133,7 @@ } void -msn_slp_call_session_init(MsnSlpCall *slpcall) +msn_slpcall_session_init(MsnSlpCall *slpcall) { if (slpcall->session_init_cb) slpcall->session_init_cb(slpcall); @@ -123,7 +142,7 @@ } void -msn_slp_call_invite(MsnSlpCall *slpcall, const char *euf_guid, +msn_slpcall_invite(MsnSlpCall *slpcall, const char *euf_guid, int app_id, const char *context) { MsnSlpLink *slplink; @@ -166,36 +185,14 @@ } void -msn_slp_call_close(MsnSlpCall *slpcall) +msn_slpcall_close(MsnSlpCall *slpcall) { g_return_if_fail(slpcall != NULL); g_return_if_fail(slpcall->slplink != NULL); send_bye(slpcall, "application/x-msnmsgr-sessionclosebody"); - msn_slplink_unleash(slpcall->slplink); - msn_slp_call_destroy(slpcall); -} - -gboolean -msn_slp_call_timeout(gpointer data) -{ - MsnSlpCall *slpcall; - - slpcall = data; - -#ifdef MSN_DEBUG_SLPCALL - purple_debug_info("msn", "slpcall_timeout: slpcall(%p)\n", slpcall); -#endif - - if (!slpcall->pending && !slpcall->progress) - { - msn_slp_call_destroy(slpcall); - return FALSE; - } - - slpcall->progress = FALSE; - - return TRUE; + msn_slplink_send_queued_slpmsgs(slpcall->slplink); + msn_slpcall_destroy(slpcall); } MsnSlpCall * @@ -237,7 +234,7 @@ slpcall = slplink->directconn->initial_call; if (slpcall != NULL) - msn_slp_call_session_init(slpcall); + msn_slpcall_session_init(slpcall); } #endif diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/msn/slpcall.h --- a/libpurple/protocols/msn/slpcall.h Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/msn/slpcall.h Sat Dec 13 08:48:58 2008 +0000 @@ -32,7 +32,7 @@ #include "slplink.h" /* The official client seems to timeout slp calls after 5 minutes */ -#define MSN_SLPCALL_TIMEOUT 300000 +#define MSN_SLPCALL_TIMEOUT 300 typedef enum { @@ -43,7 +43,7 @@ struct _MsnSlpCall { - /* MsnSession *session; */ + /* Our parent slplink */ MsnSlpLink *slplink; MsnSlpCallType type; @@ -76,16 +76,15 @@ MsnSlpCb cb; void (*end_cb)(MsnSlpCall *slpcall, MsnSession *session); - int timer; + guint timer; }; -MsnSlpCall *msn_slp_call_new(MsnSlpLink *slplink); -void msn_slp_call_init(MsnSlpCall *slpcall, MsnSlpCallType type); -void msn_slp_call_session_init(MsnSlpCall *slpcall); -void msn_slp_call_destroy(MsnSlpCall *slpcall); -void msn_slp_call_invite(MsnSlpCall *slpcall, const char *euf_guid, +MsnSlpCall *msn_slpcall_new(MsnSlpLink *slplink); +void msn_slpcall_init(MsnSlpCall *slpcall, MsnSlpCallType type); +void msn_slpcall_session_init(MsnSlpCall *slpcall); +void msn_slpcall_destroy(MsnSlpCall *slpcall); +void msn_slpcall_invite(MsnSlpCall *slpcall, const char *euf_guid, int app_id, const char *context); -void msn_slp_call_close(MsnSlpCall *slpcall); -gboolean msn_slp_call_timeout(gpointer data); +void msn_slpcall_close(MsnSlpCall *slpcall); #endif /* _MSN_SLPCALL_H_ */ diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/msn/slplink.c --- a/libpurple/protocols/msn/slplink.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/msn/slplink.c Sat Dec 13 08:48:58 2008 +0000 @@ -27,8 +27,6 @@ #include "switchboard.h" #include "slp.h" -void msn_slplink_send_msgpart(MsnSlpLink *slplink, MsnSlpMessage *slpmsg); - #ifdef MSN_DEBUG_SLP_FILES static int m_sc = 0; static int m_rc = 0; @@ -74,7 +72,6 @@ slplink->session = session; slplink->slp_seq_id = rand() % 0xFFFFFF00 + 4; - slplink->local_user = g_strdup(msn_user_get_passport(session->user)); slplink->remote_user = g_strdup(username); slplink->slp_msg_queue = g_queue_new(); @@ -107,14 +104,13 @@ #endif while (slplink->slp_calls != NULL) - msn_slp_call_destroy(slplink->slp_calls->data); + msn_slpcall_destroy(slplink->slp_calls->data); g_queue_free(slplink->slp_msg_queue); session->slplinks = g_list_remove(session->slplinks, slplink); - g_free(slplink->local_user); g_free(slplink->remote_user); g_free(slplink); @@ -168,19 +164,11 @@ { slplink->slp_calls = g_list_remove(slplink->slp_calls, slpcall); - /* The slplink has no slpcalls in it. If no one is using it, we might - * destroy the switchboard, but we should be careful not to use the slplink - * again. */ - if (slplink->slp_calls == NULL) - { - if (slplink->swboard != NULL) - { - if (msn_switchboard_release(slplink->swboard, MSN_SB_FLAG_FT)) - /* I'm not sure this is the best thing to do, but it's better - * than nothing. */ - slpcall->slplink = NULL; - } - } + /* The slplink has no slpcalls in it, release it from MSN_SB_FLAG_FT. + * If nothing else is using it then this might cause swboard to be + * destroyed. */ + if (slplink->slp_calls == NULL && slplink->swboard != NULL) + msn_switchboard_release(slplink->swboard, MSN_SB_FLAG_FT); } MsnSlpCall * @@ -220,7 +208,7 @@ return NULL; } -void +static void msn_slplink_send_msg(MsnSlpLink *slplink, MsnMessage *msg) { #if 0 @@ -236,8 +224,7 @@ slplink->swboard = msn_session_get_swboard(slplink->session, slplink->remote_user, MSN_SB_FLAG_FT); - if (slplink->swboard == NULL) - return; + g_return_if_fail(slplink->swboard != NULL); /* If swboard is destroyed we will be too */ slplink->swboard->slplinks = g_list_prepend(slplink->swboard->slplinks, slplink); @@ -247,54 +234,7 @@ } } -/* We have received the message ack */ static void -msg_ack(MsnMessage *msg, void *data) -{ - MsnSlpMessage *slpmsg; - long long real_size; - - slpmsg = data; - - real_size = (slpmsg->flags == 0x2) ? 0 : slpmsg->size; - - slpmsg->offset += msg->msnslp_header.length; - - if (slpmsg->offset < real_size) - { - msn_slplink_send_msgpart(slpmsg->slplink, slpmsg); - } - else - { - /* The whole message has been sent */ - if (slpmsg->flags == 0x20 || slpmsg->flags == 0x1000030) - { - if (slpmsg->slpcall != NULL) - { - if (slpmsg->slpcall->cb) - slpmsg->slpcall->cb(slpmsg->slpcall, - NULL, 0); - } - } - } - - slpmsg->msgs = g_list_remove(slpmsg->msgs, msg); -} - -/* We have received the message nak. */ -static void -msg_nak(MsnMessage *msg, void *data) -{ - MsnSlpMessage *slpmsg; - - slpmsg = data; - - msn_slplink_send_msgpart(slpmsg->slplink, slpmsg); - - slpmsg->msgs = g_list_remove(slpmsg->msgs, msg); -} - -void msn_slplink_send_msgpart(MsnSlpLink *slplink, MsnSlpMessage *slpmsg) { MsnMessage *msg; @@ -356,7 +296,54 @@ /* slpmsg->offset += len; */ } -void +/* We have received the message ack */ +static void +msg_ack(MsnMessage *msg, void *data) +{ + MsnSlpMessage *slpmsg; + long long real_size; + + slpmsg = data; + + real_size = (slpmsg->flags == 0x2) ? 0 : slpmsg->size; + + slpmsg->offset += msg->msnslp_header.length; + + if (slpmsg->offset < real_size) + { + msn_slplink_send_msgpart(slpmsg->slplink, slpmsg); + } + else + { + /* The whole message has been sent */ + if (slpmsg->flags == 0x20 || slpmsg->flags == 0x1000030) + { + if (slpmsg->slpcall != NULL) + { + if (slpmsg->slpcall->cb) + slpmsg->slpcall->cb(slpmsg->slpcall, + NULL, 0); + } + } + } + + slpmsg->msgs = g_list_remove(slpmsg->msgs, msg); +} + +/* We have received the message nak. */ +static void +msg_nak(MsnMessage *msg, void *data) +{ + MsnSlpMessage *slpmsg; + + slpmsg = data; + + msn_slplink_send_msgpart(slpmsg->slplink, slpmsg); + + slpmsg->msgs = g_list_remove(slpmsg->msgs, msg); +} + +static void msn_slplink_release_slpmsg(MsnSlpLink *slplink, MsnSlpMessage *slpmsg) { MsnMessage *msg; @@ -413,7 +400,7 @@ { slpmsg->id = slplink->slp_seq_id++; - g_queue_push_head(slplink->slp_msg_queue, slpmsg); + g_queue_push_tail(slplink->slp_msg_queue, slpmsg); } void @@ -425,19 +412,18 @@ } void -msn_slplink_unleash(MsnSlpLink *slplink) +msn_slplink_send_queued_slpmsgs(MsnSlpLink *slplink) { MsnSlpMessage *slpmsg; - /* Send the queued msgs in the order they came. */ - - while ((slpmsg = g_queue_pop_tail(slplink->slp_msg_queue)) != NULL) + /* Send the queued msgs in the order they were created */ + while ((slpmsg = g_queue_pop_head(slplink->slp_msg_queue)) != NULL) { msn_slplink_release_slpmsg(slplink, slpmsg); } } -void +static void msn_slplink_send_ack(MsnSlpLink *slplink, MsnMessage *msg) { MsnSlpMessage *slpmsg; @@ -481,6 +467,22 @@ msn_slplink_send_slpmsg(slpcall->slplink, slpmsg); } +static MsnSlpMessage * +msn_slplink_message_find(MsnSlpLink *slplink, long session_id, long id) +{ + GList *e; + + for (e = slplink->slp_msgs; e != NULL; e = e->next) + { + MsnSlpMessage *slpmsg = e->data; + + if ((slpmsg->session_id == session_id) && (slpmsg->id == id)) + return slpmsg; + } + + return NULL; +} + void msn_slplink_process_msg(MsnSlpLink *slplink, MsnMessage *msg) { @@ -632,32 +634,16 @@ /* Release all the messages and send the ACK */ msn_slplink_send_ack(slplink, msg); - msn_slplink_unleash(slplink); + msn_slplink_send_queued_slpmsgs(slplink); } msn_slpmsg_destroy(slpmsg); if (slpcall != NULL && slpcall->wasted) - msn_slp_call_destroy(slpcall); + msn_slpcall_destroy(slpcall); } } -MsnSlpMessage * -msn_slplink_message_find(MsnSlpLink *slplink, long session_id, long id) -{ - GList *e; - - for (e = slplink->slp_msgs; e != NULL; e = e->next) - { - MsnSlpMessage *slpmsg = e->data; - - if ((slpmsg->session_id == session_id) && (slpmsg->id == id)) - return slpmsg; - } - - return NULL; -} - typedef struct { guint32 length; @@ -743,8 +729,8 @@ g_return_if_fail(slplink != NULL); g_return_if_fail(fp != NULL); - slpcall = msn_slp_call_new(slplink); - msn_slp_call_init(slpcall, MSN_SLPCALL_DC); + slpcall = msn_slpcall_new(slplink); + msn_slpcall_init(slpcall, MSN_SLPCALL_DC); slpcall->session_init_cb = send_file_cb; slpcall->end_cb = msn_xfer_end_cb; @@ -761,7 +747,7 @@ context = gen_context(fn, fp); - msn_slp_call_invite(slpcall, MSN_FT_GUID, 2, context); + msn_slpcall_invite(slpcall, MSN_FT_GUID, 2, context); g_free(context); } @@ -784,14 +770,14 @@ msnobj_base64 = purple_base64_encode((const guchar *)msnobj_data, strlen(msnobj_data)); g_free(msnobj_data); - slpcall = msn_slp_call_new(slplink); - msn_slp_call_init(slpcall, MSN_SLPCALL_ANY); + slpcall = msn_slpcall_new(slplink); + msn_slpcall_init(slpcall, MSN_SLPCALL_ANY); slpcall->data_info = g_strdup(info); slpcall->cb = cb; slpcall->end_cb = end_cb; - msn_slp_call_invite(slpcall, MSN_OBJ_GUID, 1, msnobj_base64); + msn_slpcall_invite(slpcall, MSN_OBJ_GUID, 1, msnobj_base64); g_free(msnobj_base64); } diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/msn/slplink.h --- a/libpurple/protocols/msn/slplink.h Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/msn/slplink.h Sat Dec 13 08:48:58 2008 +0000 @@ -45,7 +45,6 @@ MsnSession *session; MsnSwitchBoard *swboard; - char *local_user; char *remote_user; int slp_seq_id; @@ -78,19 +77,11 @@ MsnSlpCall *msn_slplink_find_slp_call(MsnSlpLink *slplink, const char *id); MsnSlpCall *msn_slplink_find_slp_call_with_session_id(MsnSlpLink *slplink, long id); -void msn_slplink_send_msg(MsnSlpLink *slplink, MsnMessage *msg); -void msn_slplink_release_slpmsg(MsnSlpLink *slplink, - MsnSlpMessage *slpmsg); void msn_slplink_queue_slpmsg(MsnSlpLink *slplink, MsnSlpMessage *slpmsg); void msn_slplink_send_slpmsg(MsnSlpLink *slplink, MsnSlpMessage *slpmsg); -void msn_slplink_unleash(MsnSlpLink *slplink); -void msn_slplink_send_ack(MsnSlpLink *slplink, MsnMessage *msg); +void msn_slplink_send_queued_slpmsgs(MsnSlpLink *slplink); void msn_slplink_process_msg(MsnSlpLink *slplink, MsnMessage *msg); -MsnSlpMessage *msn_slplink_message_find(MsnSlpLink *slplink, long session_id, long id); -void msn_slplink_append_slp_msg(MsnSlpLink *slplink, MsnSlpMessage *slpmsg); -void msn_slplink_remove_slp_msg(MsnSlpLink *slplink, - MsnSlpMessage *slpmsg); void msn_slplink_request_ft(MsnSlpLink *slplink, PurpleXfer *xfer); void msn_slplink_request_object(MsnSlpLink *slplink, diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/msn/slpmsg.c --- a/libpurple/protocols/msn/slpmsg.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/msn/slpmsg.c Sat Dec 13 08:48:58 2008 +0000 @@ -169,6 +169,7 @@ const char *content_type, const char *content) { MsnSlpLink *slplink; + PurpleAccount *account; MsnSlpMessage *slpmsg; char *body; gsize body_len; @@ -178,6 +179,7 @@ g_return_val_if_fail(header != NULL, NULL); slplink = slpcall->slplink; + account = slplink->session->account; /* Let's remember that "content" should end with a 0x00 */ @@ -196,7 +198,7 @@ "\r\n", header, slplink->remote_user, - slplink->local_user, + purple_account_get_username(account), branch, cseq, slpcall->id, diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/msn/soap.c --- a/libpurple/protocols/msn/soap.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/msn/soap.c Sat Dec 13 08:48:58 2008 +0000 @@ -134,7 +134,7 @@ } if (session->soap_cleanup_handle == 0) - session->soap_cleanup_handle = purple_timeout_add(SOAP_TIMEOUT * 1000, + session->soap_cleanup_handle = purple_timeout_add_seconds(SOAP_TIMEOUT, msn_soap_cleanup_for_session, session); if (conn == NULL) { diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/msn/switchboard.c --- a/libpurple/protocols/msn/switchboard.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/msn/switchboard.c Sat Dec 13 08:48:58 2008 +0000 @@ -577,6 +577,7 @@ MsnTransaction *trans; char *payload; gsize payload_len; + char flag; g_return_if_fail(swboard != NULL); g_return_if_fail(msg != NULL); @@ -590,32 +591,35 @@ msn_message_show_readable(msg, "SB SEND", FALSE); #endif + flag = msn_message_get_flag(msg); trans = msn_transaction_new(cmdproc, "MSG", "%c %" G_GSIZE_FORMAT, - msn_message_get_flag(msg), payload_len); + flag, payload_len); /* Data for callbacks */ msn_transaction_set_data(trans, msg); - if (msg->type == MSN_MSG_TEXT) - { - msg->ack_ref = TRUE; - msn_message_ref(msg); - swboard->ack_list = g_list_append(swboard->ack_list, msg); - msn_transaction_set_timeout_cb(trans, msg_timeout); - } - else if (msg->type == MSN_MSG_SLP) - { - msg->ack_ref = TRUE; - msn_message_ref(msg); - swboard->ack_list = g_list_append(swboard->ack_list, msg); - msn_transaction_set_timeout_cb(trans, msg_timeout); + if (flag != 'U') { + if (msg->type == MSN_MSG_TEXT) + { + msg->ack_ref = TRUE; + msn_message_ref(msg); + swboard->ack_list = g_list_append(swboard->ack_list, msg); + msn_transaction_set_timeout_cb(trans, msg_timeout); + } + else if (msg->type == MSN_MSG_SLP) + { + msg->ack_ref = TRUE; + msn_message_ref(msg); + swboard->ack_list = g_list_append(swboard->ack_list, msg); + msn_transaction_set_timeout_cb(trans, msg_timeout); #if 0 - if (msg->ack_cb != NULL) - { - msn_transaction_add_cb(trans, "ACK", msg_ack); - msn_transaction_add_cb(trans, "NAK", msg_nak); + if (msg->ack_cb != NULL) + { + msn_transaction_add_cb(trans, "ACK", msg_ack); + msn_transaction_add_cb(trans, "NAK", msg_nak); + } +#endif } -#endif } trans->payload = payload; @@ -806,7 +810,7 @@ ubm_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { purple_debug_misc("msn", "get UBM...\n"); - cmd->payload_len = atoi(cmd->params[4]); + cmd->payload_len = atoi(cmd->params[3]); cmdproc->last_cmd->payload_cb = msg_cmd_post; } @@ -1315,10 +1319,10 @@ } } -gboolean +void msn_switchboard_release(MsnSwitchBoard *swboard, MsnSBFlag flag) { - g_return_val_if_fail(swboard != NULL, FALSE); + g_return_if_fail(swboard != NULL); swboard->flag &= ~flag; @@ -1328,12 +1332,8 @@ swboard->conv = NULL; if (swboard->flag == 0) - { + /* Nothing else is using this switchboard, so close it */ msn_switchboard_close(swboard); - return TRUE; - } - - return FALSE; } /************************************************************************** diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/msn/switchboard.h --- a/libpurple/protocols/msn/switchboard.h Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/msn/switchboard.h Sat Dec 13 08:48:58 2008 +0000 @@ -68,9 +68,9 @@ */ struct _MsnSwitchBoard { - MsnSession *session; - MsnServConn *servconn; - MsnCmdProc *cmdproc; + MsnSession *session; /**< Our parent session. */ + MsnServConn *servconn; /**< The physical connection for this switchboard. */ + MsnCmdProc *cmdproc; /**< Convenience variable for servconn->cmdproc. */ char *im_user; MsnSBFlag flag; @@ -224,10 +224,8 @@ * * @param swboard The switchboard to release. * @param flag The flag that states the function. - * - * @return @c TRUE if the switchboard was closed, @c FALSE otherwise. */ -gboolean msn_switchboard_release(MsnSwitchBoard *swboard, MsnSBFlag flag); +void msn_switchboard_release(MsnSwitchBoard *swboard, MsnSBFlag flag); /** * Returns whether or not we currently can send a message through this diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/msn/transaction.c --- a/libpurple/protocols/msn/transaction.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/msn/transaction.c Sat Dec 13 08:48:58 2008 +0000 @@ -211,7 +211,7 @@ purple_timeout_remove(trans->timer); } trans->timeout_cb = cb; - trans->timer = purple_timeout_add(60000, transaction_timeout, trans); + trans->timer = purple_timeout_add_seconds(60, transaction_timeout, trans); } void diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/msnp9/Makefile.am --- a/libpurple/protocols/msnp9/Makefile.am Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/msnp9/Makefile.am Sat Dec 13 08:48:58 2008 +0000 @@ -1,5 +1,5 @@ EXTRA_DIST = \ - Makefile.mingw + Makefile.mingw pkgdir = $(libdir)/purple-$(PURPLE_MAJOR_VERSION) @@ -70,9 +70,9 @@ if STATIC_MSN st = -DPURPLE_STATIC_PRPL -noinst_LIBRARIES = libmsn.a -libmsn_a_SOURCES = $(MSNP9SOURCES) -libmsn_a_CFLAGS = $(AM_CFLAGS) +noinst_LTLIBRARIES = libmsn.la +libmsn_la_SOURCES = $(MSNP9SOURCES) +libmsn_la_CFLAGS = $(AM_CFLAGS) else diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/myspace/Makefile.am --- a/libpurple/protocols/myspace/Makefile.am Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/myspace/Makefile.am Sat Dec 13 08:48:58 2008 +0000 @@ -1,4 +1,5 @@ -EXTRA_DIST = Makefile.mingw +EXTRA_DIST = \ + Makefile.mingw pkgdir = $(libdir)/purple-$(PURPLE_MAJOR_VERSION) @@ -23,9 +24,9 @@ if STATIC_MYSPACE st = -DPURPLE_STATIC_PRPL -noinst_LIBRARIES = libmyspace.a -libmyspace_a_SOURCES = $(MSIMSOURCES) -libmyspace_a_CFLAGS = $(AM_CFLAGS) +noinst_LTLIBRARIES = libmyspace.la +libmyspace_la_SOURCES = $(MSIMSOURCES) +libmyspace_la_CFLAGS = $(AM_CFLAGS) else diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/myspace/myspace.c --- a/libpurple/protocols/myspace/myspace.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/myspace/myspace.c Sat Dec 13 08:48:58 2008 +0000 @@ -139,7 +139,7 @@ prim, /* PurpleStatusPrimitive */ \ NULL, /* id - use default */ \ NULL, /* name - use default */ \ - TRUE, /* savable */ \ + TRUE, /* saveable */ \ TRUE, /* user_settable */ \ FALSE, /* not independent */ \ \ @@ -163,7 +163,7 @@ PURPLE_STATUS_TUNE, /* primitive */ "tune", /* ID */ NULL, /* name - use default */ - TRUE, /* savable */ + FALSE, /* saveable */ TRUE, /* should be user_settable some day */ TRUE, /* independent */ @@ -680,20 +680,34 @@ msim_incoming_im(MsimSession *session, MsimMessage *msg) { gchar *username, *msg_msim_markup, *msg_purple_markup; + gchar *userid; time_t time_received; + PurpleConversation *conv; g_return_val_if_fail(MSIM_SESSION_VALID(session), FALSE); g_return_val_if_fail(msg != NULL, FALSE); username = msim_msg_get_string(msg, "_username"); + /* I know this isn't really a string... but we need it to be one for + * purple_find_conversation_with_account(). */ + userid = msim_msg_get_string(msg, "f"); g_return_val_if_fail(username != NULL, FALSE); + purple_debug_info("msim_incoming_im", "UserID is %s", userid); + if (msim_is_userid(username)) { purple_debug_info("msim", "Ignoring message from spambot (%s) on account %s\n", username, purple_account_get_username(session->account)); g_free(username); return FALSE; } + + /* See if a conversation with their UID already exists...*/ + conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, userid, session->account); + if (conv) { + /* Since the conversation exists... We need to normalize it */ + purple_conversation_set_name(conv, username); + } msg_msim_markup = msim_msg_get_string(msg, "msg"); g_return_val_if_fail(msg_msim_markup != NULL, FALSE); @@ -703,6 +717,7 @@ time_received = msim_msg_get_integer(msg, "date"); if (!time_received) { + purple_debug_info("msim_incoming_im", "date in message not set.\n"); time_received = time(NULL); } diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/myspace/myspace.h --- a/libpurple/protocols/myspace/myspace.h Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/myspace/myspace.h Sat Dec 13 08:48:58 2008 +0000 @@ -48,6 +48,7 @@ #include "request.h" /* For dialogs used in setting the username */ #include "xmlnode.h" #include "core.h" +#include "conversation.h" /* For late normalization */ /* MySpaceIM includes */ #include "persist.h" diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/novell/Makefile.am --- a/libpurple/protocols/novell/Makefile.am Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/novell/Makefile.am Sat Dec 13 08:48:58 2008 +0000 @@ -1,5 +1,5 @@ EXTRA_DIST = \ - Makefile.mingw + Makefile.mingw pkgdir = $(libdir)/purple-$(PURPLE_MAJOR_VERSION) @@ -33,18 +33,14 @@ if STATIC_NOVELL st = -DPURPLE_STATIC_PRPL -noinst_LIBRARIES = libnovell.a -pkg_LTLIBRARIES = - -libnovell_a_SOURCES = $(NOVELLSOURCES) -libnovell_a_CFLAGS = $(AM_CFLAGS) +noinst_LTLIBRARIES = libnovell.la +libnovell_la_SOURCES = $(NOVELLSOURCES) +libnovell_la_CFLAGS = $(AM_CFLAGS) else st = -pkg_LTLIBRARIES = libnovell.la -noinst_LIBRARIES = - +pkg_LTLIBRARIES = libnovell.la libnovell_la_SOURCES = $(NOVELLSOURCES) libnovell_la_LIBADD = $(GLIB_LIBS) diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/null/Makefile.am --- a/libpurple/protocols/null/Makefile.am Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/null/Makefile.am Sat Dec 13 08:48:58 2008 +0000 @@ -1,4 +1,6 @@ -EXTRA_DIST = README Makefile.mingw +EXTRA_DIST = \ + Makefile.mingw \ + README pkgdir = $(libdir)/purple-$(PURPLE_MAJOR_VERSION) @@ -10,7 +12,7 @@ # nullprpl isn't built by default. when it is built, it's dynamically linked. st = -pkg_LTLIBRARIES = libnull.la +pkg_LTLIBRARIES = libnull.la libnull_la_SOURCES = $(NULLSOURCES) libnull_la_LIBADD = $(GLIB_LIBS) diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/oscar/Makefile.am --- a/libpurple/protocols/oscar/Makefile.am Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/oscar/Makefile.am Sat Dec 13 08:48:58 2008 +0000 @@ -1,7 +1,7 @@ EXTRA_DIST = \ - COPYING \ - AUTHORS \ - Makefile.mingw + COPYING \ + AUTHORS \ + Makefile.mingw pkgdir = $(libdir)/purple-$(PURPLE_MAJOR_VERSION) @@ -52,10 +52,9 @@ if STATIC_OSCAR st = -DPURPLE_STATIC_PRPL -noinst_LIBRARIES = liboscar.a - -liboscar_a_SOURCES = $(OSCARSOURCES) libaim.c libicq.c -liboscar_a_CFLAGS = $(AM_CFLAGS) +noinst_LTLIBRARIES = liboscar.la +liboscar_la_SOURCES = $(OSCARSOURCES) libaim.c libicq.c +liboscar_la_CFLAGS = $(AM_CFLAGS) else @@ -64,11 +63,11 @@ liboscar_la_SOURCES = $(OSCARSOURCES) liboscar_la_LIBADD = $(GLIB_LIBS) -libaim_la_SOURCES = libaim.c -libaim_la_LIBADD = liboscar.la +libaim_la_SOURCES = libaim.c +libaim_la_LIBADD = liboscar.la -libicq_la_SOURCES = libicq.c -libicq_la_LIBADD = liboscar.la +libicq_la_SOURCES = libicq.c +libicq_la_LIBADD = liboscar.la endif diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/oscar/family_auth.c --- a/libpurple/protocols/oscar/family_auth.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/oscar/family_auth.c Sat Dec 13 08:48:58 2008 +0000 @@ -32,7 +32,7 @@ #include -#define USE_XOR_FOR_ICQ +/* #define USE_XOR_FOR_ICQ */ #ifdef USE_XOR_FOR_ICQ /** diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/oscar/flap_connection.c --- a/libpurple/protocols/oscar/flap_connection.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/oscar/flap_connection.c Sat Dec 13 08:48:58 2008 +0000 @@ -228,7 +228,13 @@ rateclass->last.tv_usec = now.tv_usec; } } else { - purple_debug_warning("oscar", "No rate class found for family %hu subtype %hu\n", family, subtype); + /* + * It's normal for SNACs 0x0001/0x0006 and 0x0001/0x0017 to be + * sent before we receive rate info from the server, so don't + * bother warning about them. + */ + if (family != 0x0001 || (subtype != 0x0006 && subtype != 0x0017)) + purple_debug_warning("oscar", "No rate class found for family 0x%04hx subtype 0x%04hx\n", family, subtype); } if (enqueue) diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/oscar/oscar.c --- a/libpurple/protocols/oscar/oscar.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/oscar/oscar.c Sat Dec 13 08:48:58 2008 +0000 @@ -1142,15 +1142,7 @@ conn->watcher_incoming = purple_input_add(conn->fd, PURPLE_INPUT_READ, flap_connection_recv_cb, conn); if (conn->cookie == NULL) - { - if (!aim_snvalid_icq(purple_account_get_username(account))) - /* - * We don't send this when authenticating an ICQ account - * because for some reason ICQ is still using the - * assy/insecure authentication procedure. - */ - flap_connection_send_version(od, conn); - } + flap_connection_send_version(od, conn); else { flap_connection_send_version_with_cookie(od, conn, @@ -1684,7 +1676,7 @@ for (x = 0; x < 16; x++) g_string_append_printf(msg, "%02hhx ", (unsigned char)m[x]); g_string_append(msg, "\n"); - purple_debug_misc("oscar", msg->str); + purple_debug_misc("oscar", "%s", msg->str); g_string_free(msg, TRUE); purple_input_remove(pos->inpa); @@ -4807,7 +4799,7 @@ gchar *buf; buf = g_strdup_printf(_("Could not add the buddy %s because the username is invalid. Usernames must be a valid email address, or start with a letter and contain only letters, numbers and spaces, or contain only numbers."), buddy->name); if (!purple_conv_present_error(buddy->name, account, buf)) - purple_notify_error(gc, NULL, _("Unable To Add"), buf); + purple_notify_error(gc, NULL, _("Unable to Add"), buf); g_free(buf); /* Remove from local list */ @@ -4926,7 +4918,7 @@ purple_debug_error("oscar", "ssi: SNAC error %hu\n", reason); if (reason == 0x0005) { - purple_notify_error(gc, NULL, _("Unable To Retrieve Buddy List"), + purple_notify_error(gc, NULL, _("Unable to Retrieve Buddy List"), _("The AIM servers were temporarily unable to send your buddy list. Your buddy list is not lost, and will probably become available in a few minutes.")); if (od->getblisttimer > 0) purple_timeout_remove(od->getblisttimer); @@ -4955,7 +4947,7 @@ for (i=0; istr); + purple_debug_misc("oscar", "%s", msg->str); g_string_free(msg, TRUE); if (numtypes >= 0) @@ -5277,7 +5269,7 @@ gchar *buf; buf = g_strdup_printf(_("Could not add the buddy %s because you have too many buddies in your buddy list. Please remove one and try again."), (retval->name ? retval->name : _("(no name)"))); if ((retval->name != NULL) && !purple_conv_present_error(retval->name, purple_connection_get_account(gc), buf)) - purple_notify_error(gc, NULL, _("Unable To Add"), buf); + purple_notify_error(gc, NULL, _("Unable to Add"), buf); g_free(buf); } @@ -5292,7 +5284,7 @@ buf = g_strdup_printf(_("Could not add the buddy %s for an unknown reason."), (retval->name ? retval->name : _("(no name)"))); if ((retval->name != NULL) && !purple_conv_present_error(retval->name, purple_connection_get_account(gc), buf)) - purple_notify_error(gc, NULL, _("Unable To Add"), buf); + purple_notify_error(gc, NULL, _("Unable to Add"), buf); g_free(buf); } break; } diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/qq/Makefile.am --- a/libpurple/protocols/qq/Makefile.am Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/qq/Makefile.am Sat Dec 13 08:48:58 2008 +0000 @@ -1,5 +1,5 @@ EXTRA_DIST = \ - Makefile.mingw + Makefile.mingw pkgdir = $(libdir)/purple-$(PURPLE_MAJOR_VERSION) @@ -56,9 +56,9 @@ if STATIC_QQ st = -DPURPLE_STATIC_PRPL -noinst_LIBRARIES = libqq.a -libqq_a_SOURCES = $(QQSOURCES) -libqq_a_CFLAGS = $(AM_CFLAGS) +noinst_LTLIBRARIES = libqq.la +libqq_la_SOURCES = $(QQSOURCES) +libqq_la_CFLAGS = $(AM_CFLAGS) else diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/qq/buddy_info.c --- a/libpurple/protocols/qq/buddy_info.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/qq/buddy_info.c Sat Dec 13 08:48:58 2008 +0000 @@ -418,8 +418,8 @@ utf8_title = g_strdup(_("Modify Address")); utf8_prim = g_strdup_printf("%s for %s", _("Modify Address"), segments[0]); case QQ_FIELD_EXT: - utf8_title = g_strdup(_("Modify Extend Information")); - utf8_prim = g_strdup_printf("%s for %s", _("Modify Extend Information"), segments[0]); + utf8_title = g_strdup(_("Modify Extended Information")); + utf8_prim = g_strdup_printf("%s for %s", _("Modify Extended Information"), segments[0]); break; case QQ_FIELD_BASE: default: @@ -457,7 +457,7 @@ data[data_len] = '\0'; if (qd->uid != atoi((gchar *) data)) { /* return should be my uid */ purple_debug_info("QQ", "Failed Updating info\n"); - qq_got_attention(gc, _("Failed changing buddy information.")); + qq_got_attention(gc, _("Could not change buddy information.")); } } @@ -483,51 +483,27 @@ void qq_change_icon_cb(PurpleConnection *gc, const char *filepath) { - gchar **segments; - const gchar *filename; - gint index; + gchar *basename; + size_t index; gint face; - gchar *error; g_return_if_fail(filepath != NULL); purple_debug_info("QQ", "Change my icon to %s\n", filepath); - segments = g_strsplit_set(filepath, G_DIR_SEPARATOR_S, 0); -#if 0 - for (index = 0; segments[index] != NULL; index++) { - purple_debug_info("QQ", "Split to %s\n", segments[index]); - } -#endif - - index = g_strv_length(segments) - 1; - if (index < 0) { - g_strfreev(segments); - return; - } - - filename = segments[index]; - index = strcspn (filename, "0123456789"); - if (index < 0 || index >= strlen(filename)) { - error = g_strdup_printf(_("Can not get face number in file name (%s)"), filename); - purple_notify_error(gc, _("QQ Buddy"), _("Failed change icon"), error); - g_free(error); - return; - } - face = strtol(filename+index, NULL, 10); + basename = g_path_get_basename(filepath); + index = strcspn(basename, "0123456789"); + face = strtol(basename + index, NULL, 10); + g_free(basename); purple_debug_info("QQ", "Set face to %d\n", face); request_set_buddy_icon(gc, face); - - g_strfreev(segments); } void qq_set_custom_icon(PurpleConnection *gc, PurpleStoredImage *img) { PurpleAccount *account = purple_connection_get_account(gc); const gchar *icon_path = purple_account_get_buddy_icon_path(account); - gchar **segments; - gint index; g_return_if_fail(icon_path != NULL); @@ -536,12 +512,6 @@ * purple_imgstore_get_filename is always new file * QQ buddy may set custom icon if level is over 16 */ purple_debug_info("QQ", "Change my icon to %s\n", icon_path); - segments = g_strsplit_set(icon_path, G_DIR_SEPARATOR_S, 0); - for (index = 0; segments[index] != NULL; index++) { - purple_debug_info("QQ", "Split to %s\n", segments[index]); - } - - g_strfreev(segments); } gchar *qq_get_icon_name(gint face) diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/qq/group_join.c --- a/libpurple/protocols/qq/group_join.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/qq/group_join.c Sat Dec 13 08:48:58 2008 +0000 @@ -219,11 +219,11 @@ rmd = qq_room_data_find(gc, id); if (rmd != NULL) { - msg = g_strdup_printf(_("Successed join to Qun %s (%d)"), rmd->title_utf8, rmd->ext_id); + msg = g_strdup_printf(_("Successfully joined Qun %s (%d)"), rmd->title_utf8, rmd->ext_id); qq_got_attention(gc, msg); g_free(msg); } else { - qq_got_attention(gc, _("Successed join to Qun")); + qq_got_attention(gc, _("Successfully joined Qun")); } } diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/qq/group_opt.c --- a/libpurple/protocols/qq/group_opt.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/qq/group_opt.c Sat Dec 13 08:48:58 2008 +0000 @@ -204,7 +204,7 @@ purple_debug_info("QQ", "Succeed in modify members for room %d\n", rmd->ext_id); - qq_room_got_chat_in(gc, id, 0, _("Successed changing Qun member"), now); + qq_room_got_chat_in(gc, id, 0, _("Successfully changed Qun member"), now); } void qq_room_change_info(PurpleConnection *gc, qq_room_data *rmd) @@ -248,7 +248,7 @@ purple_debug_info("QQ", "Succeed modify room info of %d\n", id); - qq_room_got_chat_in(gc, id, 0, _("Successed changing Qun information"), now); + qq_room_got_chat_in(gc, id, 0, _("Successfully changed Qun information"), now); } /* we create a very simple room first, and then let the user to modify */ @@ -347,7 +347,7 @@ purple_request_action(gc, _("QQ Qun Operation"), _("You have successfully created a Qun"), - _("Would you like to set up the detail information now?"), + _("Would you like to set detailed information now?"), 1, purple_connection_get_account(gc), NULL, NULL, add_req, 2, @@ -520,7 +520,7 @@ rmd->my_role = QQ_ROOM_ROLE_YES; } - msg = g_strdup_printf(_("Joinning Qun %d is approved by Admin %d for %s"), + msg = g_strdup_printf(_("Joining Qun %d is approved by admin %d for %s"), ext_id, admin_uid, reason); now = time(NULL); qq_room_got_chat_in(gc, id, 0, msg, now); diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/qq/qq.c --- a/libpurple/protocols/qq/qq.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/qq/qq.c Sat Dec 13 08:48:58 2008 +0000 @@ -56,9 +56,6 @@ #include "utils.h" #include "version.h" -#define OPENQ_AUTHOR "Puzzlebird" -#define OPENQ_WEBSITE "http://openq.sourceforge.net" - #ifndef OPENQ_VERSION #define OPENQ_VERSION DISPLAY_VERSION #endif @@ -770,7 +767,7 @@ g_string_append(info, ""); title = g_strdup_printf(_("About OpenQ r%s"), OPENQ_VERSION); - purple_notify_formatted(gc, NULL, title, NULL, info->str, NULL, NULL); + purple_notify_formatted(gc, title, title, NULL, info->str, NULL, NULL); g_free(title); g_string_free(info, TRUE); @@ -866,7 +863,7 @@ act = purple_plugin_action_new(_("Modify Information"), action_modify_info_base); m = g_list_append(m, act); - act = purple_plugin_action_new(_("Modify Extend Information"), action_modify_info_ext); + act = purple_plugin_action_new(_("Modify Extended Information"), action_modify_info_ext); m = g_list_append(m, act); act = purple_plugin_action_new(_("Modify Address"), action_modify_info_addr); @@ -1115,11 +1112,11 @@ "QQ", /**< name */ DISPLAY_VERSION, /**< version */ /** summary */ - N_("QQ Protocol Plugin"), + N_("QQ Protocol Plugin"), /** description */ - N_("QQ Protocol Plugin"), - OPENQ_AUTHOR, /**< author */ - OPENQ_WEBSITE, /**< homepage */ + N_("QQ Protocol Plugin"), + NULL, /**< author */ + PURPLE_WEBSITE, /**< homepage */ NULL, /**< load */ NULL, /**< unload */ @@ -1151,8 +1148,7 @@ server_list = server_list_build('A'); - purple_prefs_add_string_list("/plugins/prpl/qq/serverlist", server_list); - server_list = purple_prefs_get_string_list("/plugins/prpl/qq/serverlist"); + purple_prefs_remove("/plugins/prpl/qq/serverlist"); server_kv_list = NULL; kvp = g_new0(PurpleKeyValuePair, 1); @@ -1205,10 +1201,10 @@ option = purple_account_option_bool_new(_("Show server news"), "show_news", TRUE); prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); - option = purple_account_option_int_new(_("Keep alive interval(s)"), "keep_alive_interval", 60); + option = purple_account_option_int_new(_("Keep alive interval (seconds)"), "keep_alive_interval", 60); prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); - option = purple_account_option_int_new(_("Update interval(s)"), "update_interval", 300); + option = purple_account_option_int_new(_("Update interval (seconds)"), "update_interval", 300); prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); purple_prefs_add_none("/plugins/prpl/qq"); diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/qq/qq_base.c --- a/libpurple/protocols/qq/qq_base.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/qq/qq_base.c Sat Dec 13 08:48:58 2008 +0000 @@ -71,7 +71,7 @@ if (len < 139) { purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR, - _("Can not decrypt get server reply")); + _("Can not decrypt server reply")); return QQ_LOGIN_REPLY_ERR; } @@ -404,18 +404,18 @@ return process_login_redirect(gc, data, data_len); case 0x0A: /* extend redirect used in QQ2006 */ - error = g_strdup( _("Not support Redirect_EX now") ); + error = g_strdup( _("Redirect_EX is not currently supported") ); reason = PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED; break; case 0x05: /* invalid password */ if (!purple_account_get_remember_password(gc->account)) { purple_account_set_password(gc->account, NULL); } - error = g_strdup( _("Error password")); + error = g_strdup( _("Incorrect password.")); reason = PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED; break; case 0x06: /* need activation */ - error = g_strdup( _("Need active")); + error = g_strdup( _("Activation required")); reason = PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED; break; @@ -789,7 +789,7 @@ qd->send_seq++; qq_send_cmd_encrypted(gc, QQ_CMD_TOKEN_EX, qd->send_seq, buf, bytes, TRUE); - purple_connection_update_progress(gc, _("Checking code of captcha ..."), 3, QQ_CONNECT_STEPS); + purple_connection_update_progress(gc, _("Checking code of captcha ..."), 3, QQ_CONNECT_STEPS); } typedef struct { @@ -873,7 +873,7 @@ purple_request_fields(account, _("QQ Captcha Verifing"), _("QQ Captcha Verifing"), - _("Please fill code according to image"), + _("Enter the text from the image"), fields, _("OK"), G_CALLBACK(captcha_input_ok_cb), _("Cancel"), G_CALLBACK(captcha_input_cancel_cb), @@ -1094,16 +1094,16 @@ if (!purple_account_get_remember_password(gc->account)) { purple_account_set_password(gc->account, NULL); } - error = g_strdup(_("Error password")); + error = g_strdup(_("Incorrect password.")); reason = PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED; break; case 0x33: /* need activation */ case 0x51: /* need activation */ - error = g_strdup(_("Need active")); + error = g_strdup(_("Activation required")); reason = PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED; break; case 0xBF: /* uid is not exist */ - error = g_strdup(_("invalid user name")); + error = g_strdup(_("Invalid username.")); reason = PURPLE_CONNECTION_ERROR_INVALID_USERNAME; break; default: diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/qq/qq_network.c --- a/libpurple/protocols/qq/qq_network.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/qq/qq_network.c Sat Dec 13 08:48:58 2008 +0000 @@ -204,7 +204,7 @@ if ( set_new_server(qd) != TRUE) { purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, - _("Failed to connect all servers")); + _("Unable to connect.")); return FALSE; } qd->connect_retry = QQ_CONNECT_MAX; @@ -461,9 +461,6 @@ conn->tcp_rxqueue = NULL; } - if (pkt == NULL) { - continue; - } /* packet_process may call disconnect and destory data like conn * do not call packet_process before jump, * break if packet_process return FALSE */ diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/qq/qq_process.c --- a/libpurple/protocols/qq/qq_process.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/qq/qq_process.c Sat Dec 13 08:48:58 2008 +0000 @@ -960,7 +960,7 @@ return ret_8; } - purple_connection_update_progress(gc, _("Logined"), QQ_CONNECT_STEPS - 1, QQ_CONNECT_STEPS); + purple_connection_update_progress(gc, _("Logging in"), QQ_CONNECT_STEPS - 1, QQ_CONNECT_STEPS); purple_debug_info("QQ", "Login repliess OK; everything is fine\n"); purple_connection_set_state(gc, PURPLE_CONNECTED); qd->is_login = TRUE; /* must be defined after sev_finish_login */ diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/qq/utils.c --- a/libpurple/protocols/qq/utils.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/qq/utils.c Sat Dec 13 08:48:58 2008 +0000 @@ -325,7 +325,7 @@ va_end(args); if (bytes <= 0) { - purple_debug(level, category, arg_s); + purple_debug(level, category, "%s", arg_s); return; } diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/sametime/Makefile.am --- a/libpurple/protocols/sametime/Makefile.am Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/sametime/Makefile.am Sat Dec 13 08:48:58 2008 +0000 @@ -1,21 +1,22 @@ - -EXTRA_DIST = Makefile.mingw - +EXTRA_DIST = \ + Makefile.mingw pkgdir = $(libdir)/purple-$(PURPLE_MAJOR_VERSION) - noinst_HEADERS = sametime.h SAMETIMESOURCES = sametime.c +AM_CFLAGS = \ + $(st) \ + -DG_LOG_DOMAIN=\"sametime\" if STATIC_SAMETIME st = -DPURPLE_STATIC_PRPL -noinst_LIBRARIES = libsametime.a -libsametime_a_SOURCES = $(SAMETIMESOURCES) -libsametime_a_CFLAGS = $(AM_CFLAGS) +noinst_LTLIBRARIES = libsametime.la +libsametime_la_SOURCES = $(SAMETIMESOURCES) +libsametime_la_CFLAGS = $(AM_CFLAGS) else @@ -23,22 +24,16 @@ pkg_LTLIBRARIES = libsametime.la libsametime_la_SOURCES = $(SAMETIMESOURCES) - endif - libsametime_la_LDFLAGS = -module -avoid-version libsametime_la_LIBADD = $(GLIB_LIBS) $(MEANWHILE_LIBS) - -AM_CFLAGS = \ - $(GLIB_CFLAGS) $(MEANWHILE_CFLAGS) $(FARSIGHT_CFLAGS) \ - $(DEBUG_CFLAGS) \ +AM_CPPFLAGS = \ -I$(top_srcdir)/libpurple \ - -I$(top_builddir)/libpurple - + -I$(top_builddir)/libpurple \ + $(DEBUG_CFLAGS) \ + $(GLIB_CFLAGS) \ + $(MEANWHILE_CFLAGS) \ + $(FARSIGHT_CFLAGS) -AM_CPPFLAGS = \ - -DG_LOG_DOMAIN=\"sametime\" \ - $(st) - diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/sametime/sametime.c --- a/libpurple/protocols/sametime/sametime.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/sametime/sametime.c Sat Dec 13 08:48:58 2008 +0000 @@ -1445,7 +1445,7 @@ MW_PLUGIN_DEFAULT_HOST); if(purple_account_get_bool(account, MW_KEY_FORCE, FALSE) || - (! strcmp(current_host, host)) || + !host || (! strcmp(current_host, host)) || (purple_proxy_connect(NULL, account, host, port, connect_cb, pd) == NULL)) { /* if we're configured to force logins, or if we're being diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/silc/Makefile.am --- a/libpurple/protocols/silc/Makefile.am Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/silc/Makefile.am Sat Dec 13 08:48:58 2008 +0000 @@ -1,8 +1,21 @@ -EXTRA_DIST = README TODO Makefile.mingw +EXTRA_DIST = \ + Makefile.mingw \ + README \ + TODO pkgdir = $(libdir)/purple-$(PURPLE_MAJOR_VERSION) -SILCSOURCES = silc.c silcpurple.h buddy.c chat.c ft.c ops.c pk.c util.c wb.c wb.h +SILCSOURCES = \ + buddy.c \ + chat.c \ + ft.c \ + ops.c \ + pk.c \ + silc.c \ + silcpurple.h \ + util.c \ + wb.c \ + wb.h AM_CFLAGS = $(st) @@ -11,19 +24,15 @@ if STATIC_SILC st = -DPURPLE_STATIC_PRPL $(SILC_CFLAGS) -noinst_LIBRARIES = libsilcpurple.a -pkg_LTLIBRARIES = - -libsilcpurple_a_SOURCES = $(SILCSOURCES) -libsilcpurple_a_CFLAGS = $(AM_CFLAGS) -libsilcpurple_a_LIBADD = $(SILC_LIBS) +noinst_LTLIBRARIES = libsilcpurple.la +libsilcpurple_la_SOURCES = $(SILCSOURCES) +libsilcpurple_la_CFLAGS = $(AM_CFLAGS) +libsilcpurple_la_LIBADD = $(SILC_LIBS) else st = $(SILC_CFLAGS) -pkg_LTLIBRARIES = libsilcpurple.la -noinst_LIBRARIES = - +pkg_LTLIBRARIES = libsilcpurple.la libsilcpurple_la_SOURCES = $(SILCSOURCES) libsilcpurple_la_LIBADD = $(GLIB_LIBS) $(SILC_LIBS) $(FARSIGHT_LIBS) @@ -32,9 +41,9 @@ AM_CPPFLAGS = \ -I$(top_srcdir)/libpurple \ -I$(top_builddir)/libpurple \ + $(DEBUG_CFLAGS) \ $(GLIB_CFLAGS) \ + $(SILC_CFLAGS) \ $(FARSIGHT_CFLAGS) \ - $(DEBUG_CFLAGS) \ $(GSTREAMER_CFLAGS) \ $(LIBXML_CFLAGS) - diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/silc10/Makefile.am --- a/libpurple/protocols/silc10/Makefile.am Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/silc10/Makefile.am Sat Dec 13 08:48:58 2008 +0000 @@ -1,4 +1,7 @@ -EXTRA_DIST = README TODO Makefile.mingw +EXTRA_DIST = \ + Makefile.mingw \ + README \ + TODO pkgdir = $(libdir)/purple-$(PURPLE_MAJOR_VERSION) @@ -11,19 +14,15 @@ if STATIC_SILC st = -DPURPLE_STATIC_PRPL $(SILC_CFLAGS) -noinst_LIBRARIES = libsilcpurple.a -pkg_LTLIBRARIES = - -libsilcpurple_a_SOURCES = $(SILCSOURCES) -libsilcpurple_a_CFLAGS = $(AM_CFLAGS) -libsilcpurple_a_LIBADD = $(SILC_LIBS) +noinst_LTLIBRARIES = libsilcpurple.la +libsilcpurple_la_SOURCES = $(SILCSOURCES) +libsilcpurple_la_CFLAGS = $(AM_CFLAGS) +libsilcpurple_la_LIBADD = $(SILC_LIBS) else st = $(SILC_CFLAGS) -pkg_LTLIBRARIES = libsilcpurple.la -noinst_LIBRARIES = - +pkg_LTLIBRARIES = libsilcpurple.la libsilcpurple_la_SOURCES = $(SILCSOURCES) libsilcpurple_la_LIBADD = $(GLIB_LIBS) $(SILC_LIBS) @@ -32,5 +31,6 @@ AM_CPPFLAGS = \ -I$(top_srcdir)/libpurple \ -I$(top_builddir)/libpurple \ + $(DEBUG_CFLAGS) \ $(GLIB_CFLAGS) \ - $(DEBUG_CFLAGS) + $(SILC_CFLAGS) diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/simple/Makefile.am --- a/libpurple/protocols/simple/Makefile.am Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/simple/Makefile.am Sat Dec 13 08:48:58 2008 +0000 @@ -1,5 +1,5 @@ EXTRA_DIST = \ - Makefile.mingw + Makefile.mingw pkgdir = $(libdir)/purple-$(PURPLE_MAJOR_VERSION) @@ -9,21 +9,21 @@ sipmsg.c \ sipmsg.h -AM_CFLAGS = $(st) +AM_CFLAGS = $(st) libsimple_la_LDFLAGS = -module -avoid-version if STATIC_MSN st = -DPURPLE_STATIC_PRPL -noinst_LIBRARIES = libsimple.a -libsimple_a_SOURCES = $(SIMPLESOURCES) -libsimple_a_CFLAGS = $(AM_CFLAGS) +noinst_LTLIBRARIES = libsimple.la +libsimple_la_SOURCES = $(SIMPLESOURCES) +libsimple_la_CFLAGS = $(AM_CFLAGS) else st = -pkg_LTLIBRARIES = libsimple.la +pkg_LTLIBRARIES = libsimple.la libsimple_la_SOURCES = $(SIMPLESOURCES) libsimple_la_LIBADD = $(GLIB_LIBS) diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/simple/simple.c --- a/libpurple/protocols/simple/simple.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/simple/simple.c Sat Dec 13 08:48:58 2008 +0000 @@ -1228,11 +1228,14 @@ if (purple_str_has_prefix(ssparts[i], "terminated")) { purple_debug_info("simple", "Subscription expired!"); - g_free(b->dialog->ourtag); - g_free(b->dialog->theirtag); - g_free(b->dialog->callid); - g_free(b->dialog); - b->dialog = NULL; + if (b->dialog) + { + g_free(b->dialog->ourtag); + g_free(b->dialog->theirtag); + g_free(b->dialog->callid); + g_free(b->dialog); + b->dialog = NULL; + } purple_prpl_got_user_status(sip->account, from, "offline", NULL); break; @@ -1627,6 +1630,13 @@ cur[0] = '\0'; purple_debug_info("simple", "\n\nreceived - %s\n######\n%s\n#######\n\n", ctime(&currtime), conn->inbuf); msg = sipmsg_parse_header(conn->inbuf); + + if(!msg) { + /* Should we re-use this error message (from lower in the function)? */ + purple_debug_misc("simple", "received a incomplete sip msg: %s\n", conn->inbuf); + return; + } + cur[0] = '\r'; cur += 2; restlen = conn->inbufused - (cur - conn->inbuf); diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/toc/Makefile.am --- a/libpurple/protocols/toc/Makefile.am Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/toc/Makefile.am Sat Dec 13 08:48:58 2008 +0000 @@ -1,6 +1,6 @@ EXTRA_DIST = \ - PROTOCOL \ - Makefile.mingw + PROTOCOL \ + Makefile.mingw pkgdir = $(libdir)/purple-$(PURPLE_MAJOR_VERSION) @@ -13,9 +13,9 @@ if STATIC_TOC st = -DPURPLE_STATIC_PRPL -noinst_LIBRARIES = libtoc.a -libtoc_a_SOURCES = $(TOCSOURCES) -libtoc_a_CFLAGS = $(AM_CFLAGS) +noinst_LTLIBRARIES = libtoc.la +libtoc_la_SOURCES = $(TOCSOURCES) +libtoc_la_CFLAGS = $(AM_CFLAGS) else diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/yahoo/Makefile.am --- a/libpurple/protocols/yahoo/Makefile.am Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/yahoo/Makefile.am Sat Dec 13 08:48:58 2008 +0000 @@ -1,5 +1,5 @@ EXTRA_DIST = \ - Makefile.mingw + Makefile.mingw pkgdir = $(libdir)/purple-$(PURPLE_MAJOR_VERSION) @@ -36,9 +36,9 @@ if STATIC_YAHOO st = -DPURPLE_STATIC_PRPL -noinst_LIBRARIES = libyahoo.a -libyahoo_a_SOURCES = $(YAHOOSOURCES) -libyahoo_a_CFLAGS = $(AM_CFLAGS) +noinst_LTLIBRARIES = libyahoo.la +libyahoo_la_SOURCES = $(YAHOOSOURCES) +libyahoo_la_CFLAGS = $(AM_CFLAGS) else diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/yahoo/yahoo.c --- a/libpurple/protocols/yahoo/yahoo.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/yahoo/yahoo.c Sat Dec 13 08:48:58 2008 +0000 @@ -3619,8 +3619,26 @@ PurpleWhiteboard *wb; int ret = 1; YahooFriend *f = NULL; + gsize lenb = 0; + glong lenc = 0; msg2 = yahoo_string_encode(gc, msg, &utf8); + + if(msg2) { + lenb = strlen(msg2); + lenc = g_utf8_strlen(msg2, -1); + + if(lenb > YAHOO_MAX_MESSAGE_LENGTH_BYTES || lenc > YAHOO_MAX_MESSAGE_LENGTH_CHARS) { + purple_debug_info("yahoo", "Message too big. Length is %" G_GSIZE_FORMAT + " bytes, %ld characters. Max is %d bytes, %d chars." + " Message is '%s'.\n", lenb, lenc, YAHOO_MAX_MESSAGE_LENGTH_BYTES, + YAHOO_MAX_MESSAGE_LENGTH_CHARS, msg2); + yahoo_packet_free(pkt); + g_free(msg); + g_free(msg2); + return -E2BIG; + } + } yahoo_packet_hash(pkt, "ss", 1, purple_connection_get_display_name(gc), 5, who); if ((f = yahoo_friend_find(gc, who)) && f->protocol) diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/yahoo/yahoo.h --- a/libpurple/protocols/yahoo/yahoo.h Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/yahoo/yahoo.h Sat Dec 13 08:48:58 2008 +0000 @@ -182,6 +182,21 @@ #define YAHOO_MAX_STATUS_MESSAGE_LENGTH (255) +/* + * Current Maximum Length for Instant Messages + * + * This was found by experiment. + * + * The YMSG protocol allows a message of up to 948 bytes, but the official client + * limits to 800 characters. According to experiments I conducted, it seems that + * the discrepancy is to allow some leeway for messages with mixed single- and + * multi-byte characters, as I was able to send messages of 840 and 932 bytes + * by using some multibyte characters (some random Chinese or Japanese characters, + * to be precise). - rekkanoryo + */ +#define YAHOO_MAX_MESSAGE_LENGTH_BYTES 948 +#define YAHOO_MAX_MESSAGE_LENGTH_CHARS 800 + /* sometimes i wish prpls could #include things from other prpls. then i could just * use the routines from libfaim and not have to admit to knowing how they work. */ #define yahoo_put16(buf, data) ( \ diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/yahoo/yahoo_filexfer.c --- a/libpurple/protocols/yahoo/yahoo_filexfer.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/yahoo/yahoo_filexfer.c Sat Dec 13 08:48:58 2008 +0000 @@ -262,7 +262,7 @@ content_length = YAHOO_PACKET_HDRLEN + yahoo_packet_length(pkt); - pkt_buf_len = yahoo_packet_build(pkt, 8, FALSE, yd->jp, &pkt_buf); + pkt_buf_len = yahoo_packet_build(pkt, 4, FALSE, yd->jp, &pkt_buf); yahoo_packet_free(pkt); host = purple_account_get_string(account, "xfer_host", YAHOO_XFER_HOST); diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/zephyr/Makefile.am --- a/libpurple/protocols/zephyr/Makefile.am Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/zephyr/Makefile.am Sat Dec 13 08:48:58 2008 +0000 @@ -62,7 +62,6 @@ zephyr_err.c \ zephyr_err.h \ zephyr_internal.h \ - \ zephyr.c ZEPHYRSOURCESEXT = zephyr.c @@ -78,10 +77,10 @@ if STATIC_ZEPHYR st = -DPURPLE_STATIC_PRPL -Dlint -noinst_LIBRARIES = libzephyr.a -libzephyr_a_SOURCES = $(ZEPHYRSOURCES) -libzephyr_a_CFLAGS = $(AM_CFLAGS) -libzephyr_a_LIBADD = $(ZEPHYRLIBS) +noinst_LTLIBRARIES = libzephyr.la +libzephyr_la_SOURCES = $(ZEPHYRSOURCES) +libzephyr_la_CFLAGS = $(AM_CFLAGS) +libzephyr_la_LIBADD = $(ZEPHYRLIBS) else @@ -90,7 +89,7 @@ if EXTERNAL_LIBZEPHYR libzephyr_la_SOURCES = $(ZEPHYRSOURCESEXT) -libzephyr_la_LIBADD = $(GLIB_LIBS) $(ZEPHYRLIBSEXT) +libzephyr_la_LIBADD = $(GLIB_LIBS) $(ZEPHYRLIBSEXT) else libzephyr_la_SOURCES = $(ZEPHYRSOURCES) libzephyr_la_LIBADD = $(GLIB_LIBS) $(ZEPHYRLIBS) diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/protocols/zephyr/zephyr.c --- a/libpurple/protocols/zephyr/zephyr.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/protocols/zephyr/zephyr.c Sat Dec 13 08:48:58 2008 +0000 @@ -1571,7 +1571,7 @@ #ifdef WIN32 username = purple_account_get_username(account); #endif - gc->flags |= PURPLE_CONNECTION_HTML | PURPLE_CONNECTION_NO_BGCOLOR | PURPLE_CONNECTION_NO_URLDESC; + gc->flags |= PURPLE_CONNECTION_AUTO_RESP | PURPLE_CONNECTION_HTML | PURPLE_CONNECTION_NO_BGCOLOR | PURPLE_CONNECTION_NO_URLDESC; gc->proto_data = zephyr=g_new0(zephyr_account,1); zephyr->account = account; diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/proxy.c --- a/libpurple/proxy.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/proxy.c Sat Dec 13 08:48:58 2008 +0000 @@ -944,12 +944,15 @@ } else if((header = g_strrstr((const char *)connect_data->read_buffer, "Proxy-Authenticate: Basic"))) { gchar *t1, *t2; + const char *username, *password; + + username = purple_proxy_info_get_username(connect_data->gpi); + password = purple_proxy_info_get_password(connect_data->gpi); t1 = g_strdup_printf("%s:%s", - purple_proxy_info_get_username(connect_data->gpi), - purple_proxy_info_get_password(connect_data->gpi) ? - purple_proxy_info_get_password(connect_data->gpi) : ""); - t2 = purple_base64_encode((const guchar *)t1, strlen(t1)); + username ? username : "", + password ? password : ""); + t2 = purple_base64_encode((guchar *)t1, strlen(t1)); g_free(t1); request = g_strdup_printf( @@ -1342,7 +1345,7 @@ if ((buf[0] != 0x05) || (buf[1] != 0x00)) { if ((buf[0] == 0x05) && (buf[1] < 0x09)) { - purple_debug_error("socks5 proxy", socks5errors[buf[1]]); + purple_debug_error("socks5 proxy", "%s", socks5errors[buf[1]]); purple_proxy_connect_data_disconnect(connect_data, socks5errors[buf[1]]); } else { diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/server.c --- a/libpurple/server.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/server.c Sat Dec 13 08:48:58 2008 +0000 @@ -259,7 +259,8 @@ purple_blist_server_alias_buddy(b, alias); conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, b->name, account); - if(conv != NULL && alias != NULL && strcmp(alias, who)) + if(conv != NULL && alias != NULL && + who != NULL && strcmp(alias, who)) { char *escaped = g_markup_escape_text(who, -1); char *escaped2 = g_markup_escape_text(alias, -1); diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/util.c --- a/libpurple/util.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/util.c Sat Dec 13 08:48:58 2008 +0000 @@ -984,6 +984,8 @@ gchar *tmp; gchar *ret; + g_return_val_if_fail(opt != NULL, NULL); + if (!css_str) return NULL; @@ -2390,6 +2392,7 @@ gunichar c; char *tag; + g_return_val_if_fail(str != NULL, NULL); g_return_val_if_fail(x <= y, NULL); if (x == y) @@ -3440,6 +3443,9 @@ char *cmd; GHashTable *params = NULL; int len; + + g_return_if_fail(uri != NULL); + if (!(tmp = strchr(uri, ':')) || tmp == uri) { purple_debug_error("util", "Malformed protocol handler message - missing protocol.\n"); return; @@ -4145,6 +4151,8 @@ const char *c, *domain; static char *rfc822_specials = "()<>@,;:\\\"[]"; + g_return_val_if_fail(address != NULL, FALSE); + /* first we validate the name portion (name@domain) (rfc822)*/ for (c = address; *c; c++) { if (*c == '\"' && (c == address || *(c - 1) == '.' || *(c - 1) == '\"')) { @@ -4193,6 +4201,9 @@ { int c, o1, o2, o3, o4; char end; + + g_return_val_if_fail(ip != NULL, FALSE); + c = sscanf(ip, "%d.%d.%d.%d%c", &o1, &o2, &o3, &o4, &end); if (c != 4 || o1 < 0 || o1 > 255 || o2 < 0 || o2 > 255 || o3 < 0 || o3 > 255 || o4 < 0 || o4 > 255) return FALSE; diff -r cb4337d6c803 -r 93cc8982d4e5 libpurple/xmlnode.c --- a/libpurple/xmlnode.c Sat Dec 13 08:46:42 2008 +0000 +++ b/libpurple/xmlnode.c Sat Dec 13 08:48:58 2008 +0000 @@ -249,6 +249,7 @@ xmlnode *x; g_return_val_if_fail(node != NULL, NULL); + g_return_val_if_fail(attr != NULL, NULL); for(x = node->child; x; x = x->next) { if(x->type == XMLNODE_TYPE_ATTRIB && !strcmp(attr, x->name)) { @@ -265,6 +266,7 @@ xmlnode *x; g_return_val_if_fail(node != NULL, NULL); + g_return_val_if_fail(attr != NULL, NULL); for(x = node->child; x; x = x->next) { if(x->type == XMLNODE_TYPE_ATTRIB && diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/gtkaccount.c --- a/pidgin/gtkaccount.c Sat Dec 13 08:46:42 2008 +0000 +++ b/pidgin/gtkaccount.c Sat Dec 13 08:48:58 2008 +0000 @@ -472,7 +472,7 @@ G_CALLBACK(screenname_changed_cb), dialog); /* Do the user split thang */ - if (dialog->plugin == NULL) /* Yeah right. */ + if (dialog->prpl_info == NULL) user_splits = NULL; else user_splits = dialog->prpl_info->user_splits; @@ -2149,9 +2149,9 @@ "Welcome to %s!\n\n" "You have no IM accounts configured. To start connecting with %s " - "press the Add button below and configure your first " + "press the Add... button below and configure your first " "account. If you want %s to connect to multiple IM accounts, " - "press Add again to configure them all.\n\n" + "press Add... again to configure them all.\n\n" "You can come back to this window to add, edit, or remove " "accounts from Accounts->Manage Accounts in the Buddy " @@ -2285,7 +2285,7 @@ gtk_widget_show(sw); /* Add button */ - pidgin_dialog_add_button(GTK_DIALOG(win), GTK_STOCK_ADD, G_CALLBACK(add_account_cb), dialog); + pidgin_dialog_add_button(GTK_DIALOG(win), PIDGIN_STOCK_ADD, G_CALLBACK(add_account_cb), dialog); /* Modify button */ button = pidgin_dialog_add_button(GTK_DIALOG(win), PIDGIN_STOCK_MODIFY, G_CALLBACK(modify_account_cb), dialog); diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/gtkblist.c --- a/pidgin/gtkblist.c Sat Dec 13 08:46:42 2008 +0000 +++ b/pidgin/gtkblist.c Sat Dec 13 08:48:58 2008 +0000 @@ -3036,6 +3036,22 @@ pidgin_tooltip_destroy(); } +static void +pidgin_blist_align_tooltip(struct tooltip_data *td, GtkWidget *widget) +{ + GtkTextDirection dir = gtk_widget_get_direction(widget); + + if (dir == GTK_TEXT_DIR_RTL) + { + char* layout_name = purple_markup_strip_html(pango_layout_get_text(td->name_layout)); + PangoDirection dir = pango_find_base_dir(layout_name, -1); + if (dir == PANGO_DIRECTION_RTL || dir == PANGO_DIRECTION_NEUTRAL) + pango_layout_set_alignment(td->name_layout, PANGO_ALIGN_RIGHT); + g_free(layout_name); + pango_layout_set_alignment(td->layout, PANGO_ALIGN_RIGHT); + } +} + static gboolean pidgin_blist_create_tooltip_for_node(GtkWidget *widget, gpointer data, int *w, int *h) { @@ -3055,11 +3071,13 @@ if (PURPLE_BLIST_NODE_IS_CHAT(node) || PURPLE_BLIST_NODE_IS_BUDDY(node)) { struct tooltip_data *td = create_tip_for_node(node, TRUE); + pidgin_blist_align_tooltip(td, gtkblist->tipwindow); gtkblist->tooltipdata = g_list_append(gtkblist->tooltipdata, td); } else if (PURPLE_BLIST_NODE_IS_GROUP(node)) { PurpleGroup *group = (PurpleGroup*)node; GSList *accounts; struct tooltip_data *td = create_tip_for_node(node, TRUE); + pidgin_blist_align_tooltip(td, gtkblist->tipwindow); gtkblist->tooltipdata = g_list_append(gtkblist->tooltipdata, td); /* Accounts with buddies in group */ @@ -3079,6 +3097,7 @@ { if(PURPLE_BLIST_NODE_IS_BUDDY(child) && buddy_is_displayable((PurpleBuddy*)child)) { struct tooltip_data *td = create_tip_for_node(child, (b == (PurpleBuddy*)child)); + pidgin_blist_align_tooltip(td, gtkblist->tipwindow); if (b == (PurpleBuddy *)child) { gtkblist->tooltipdata = g_list_prepend(gtkblist->tooltipdata, td); } else { @@ -3401,7 +3420,7 @@ } } - if (prpl_info->chat_info != NULL) + if (prpl_info && prpl_info->chat_info != NULL) cur = prpl_info->chat_info(chat->account->gc); else cur = NULL; diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/gtkconv.c --- a/pidgin/gtkconv.c Sat Dec 13 08:46:42 2008 +0000 +++ b/pidgin/gtkconv.c Sat Dec 13 08:48:58 2008 +0000 @@ -973,7 +973,9 @@ } name = purple_conversation_get_name(conv); - fprintf(fp, "\n%s\n", name); + fprintf(fp, "\n\n"); + fprintf(fp, "\n"); + fprintf(fp, "%s\n\n\n", name); fprintf(fp, _("

Conversation with %s

\n"), name); lines = gtk_imhtml_get_markup_lines( diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/gtknotify.c --- a/pidgin/gtknotify.c Sat Dec 13 08:46:42 2008 +0000 +++ b/pidgin/gtknotify.c Sat Dec 13 08:48:58 2008 +0000 @@ -703,7 +703,7 @@ gtk_widget_grab_focus(button); g_signal_connect_swapped(G_OBJECT(button), "clicked", - G_CALLBACK(gtk_widget_destroy), window); + G_CALLBACK(formatted_close_cb), window); g_signal_connect(G_OBJECT(window), "key_press_event", G_CALLBACK(formatted_input_cb), NULL); diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/gtkpounce.c --- a/pidgin/gtkpounce.c Sat Dec 13 08:46:42 2008 +0000 +++ b/pidgin/gtkpounce.c Sat Dec 13 08:48:58 2008 +0000 @@ -1374,7 +1374,7 @@ gtk_box_pack_start(GTK_BOX(vbox), list, TRUE, TRUE, 0); /* Add button */ - button = pidgin_dialog_add_button(GTK_DIALOG(win), GTK_STOCK_ADD, G_CALLBACK(pounces_manager_add_cb), dialog); + button = pidgin_dialog_add_button(GTK_DIALOG(win), PIDGIN_STOCK_ADD, G_CALLBACK(pounces_manager_add_cb), dialog); gtk_widget_set_sensitive(button, (purple_accounts_get_all() != NULL)); purple_signal_connect(purple_connections_get_handle(), "signed-on", diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/gtkprefs.c --- a/pidgin/gtkprefs.c Sat Dec 13 08:46:42 2008 +0000 +++ b/pidgin/gtkprefs.c Sat Dec 13 08:48:58 2008 +0000 @@ -2197,17 +2197,7 @@ val /= 10.0; for (; medias; medias = g_list_next(medias)) { PurpleMedia *media = PURPLE_MEDIA(medias->data); - GList *sessions = purple_media_get_session_names(media); - for (; sessions; sessions = g_list_delete_link(sessions, sessions)) { - const gchar *session = sessions->data; - if (purple_media_get_session_type(media, session) - & PURPLE_MEDIA_SEND_AUDIO) { - GstElement *volume = gst_bin_get_by_name( - GST_BIN(purple_media_get_src(media, session)), - "purpleaudioinputvolume"); - g_object_set(volume, "volume", val, NULL); - } - } + purple_media_set_input_volume(media, NULL, val); } } @@ -2221,17 +2211,7 @@ val /= 10.0; for (; medias; medias = g_list_next(medias)) { PurpleMedia *media = PURPLE_MEDIA(medias->data); - GList *sessions = purple_media_get_session_names(media); - for (; sessions; sessions = g_list_delete_link(sessions, sessions)) { - const gchar *session = sessions->data; - if (purple_media_get_session_type(media, session) - & PURPLE_MEDIA_RECV_AUDIO) { - GstElement *volume = gst_bin_get_by_name( - GST_BIN(purple_media_get_sink(media, session)), - "purpleaudiooutputvolume"); - g_object_set(volume, "volume", val, NULL); - } - } + purple_media_set_output_volume(media, NULL, NULL, val); } } diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/gtksavedstatuses.c --- a/pidgin/gtksavedstatuses.c Sat Dec 13 08:46:42 2008 +0000 +++ b/pidgin/gtksavedstatuses.c Sat Dec 13 08:48:58 2008 +0000 @@ -475,7 +475,8 @@ static void savedstatus_activated_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *column, StatusWindow *dialog) { - status_window_modify_cb(NULL, dialog); + status_window_use_cb(NULL, dialog); + status_window_close_cb(NULL, dialog); } static void @@ -655,7 +656,7 @@ G_CALLBACK(status_window_use_cb), dialog); /* Add button */ - pidgin_dialog_add_button(GTK_DIALOG(win), GTK_STOCK_ADD, + pidgin_dialog_add_button(GTK_DIALOG(win), PIDGIN_STOCK_ADD, G_CALLBACK(status_window_add_cb), dialog); /* Modify button */ diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pidginstock-artwork.c --- a/pidgin/pidginstock-artwork.c Sat Dec 13 08:46:42 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,508 +0,0 @@ -/** - * @file pidginstock.c GTK+ Stock resources - * @ingroup pidgin - */ - -/* pidgin - * - * Pidgin 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA - * - */ -#include "internal.h" -#include "pidgin.h" - -#include "pidginstock.h" - -static struct StockIcon -{ - const char *name; - const char *dir; - const char *filename; - -} const stock_icons[] = -{ - { PIDGIN_STOCK_ACTION, NULL, GTK_STOCK_EXECUTE }, -#if GTK_CHECK_VERSION(2,6,0) - { PIDGIN_STOCK_ALIAS, NULL, GTK_STOCK_EDIT }, -#else - { PIDGIN_STOCK_ALIAS, "buttons", "edit.png" }, -#endif - { PIDGIN_STOCK_CHAT, NULL, GTK_STOCK_JUMP_TO }, - { PIDGIN_STOCK_CLEAR, NULL, GTK_STOCK_CLEAR }, - { PIDGIN_STOCK_CLOSE_TABS, NULL, GTK_STOCK_CLOSE }, - { PIDGIN_STOCK_DEBUG, NULL, GTK_STOCK_PROPERTIES }, - { PIDGIN_STOCK_DOWNLOAD, NULL, GTK_STOCK_GO_DOWN }, -#if GTK_CHECK_VERSION(2,6,0) - { PIDGIN_STOCK_DISCONNECT, NULL, GTK_STOCK_DISCONNECT }, -#else - { PIDGIN_STOCK_DISCONNECT, "icons", "stock_disconnect_16.png" }, -#endif - { PIDGIN_STOCK_FGCOLOR, "buttons", "change-fgcolor-small.png" }, -#if GTK_CHECK_VERSION(2,6,0) - { PIDGIN_STOCK_EDIT, NULL, GTK_STOCK_EDIT }, -#else - { PIDGIN_STOCK_EDIT, "buttons", "edit.png" }, -#endif - { PIDGIN_STOCK_FILE_CANCELED, NULL, GTK_STOCK_CANCEL }, - { PIDGIN_STOCK_FILE_DONE, NULL, GTK_STOCK_APPLY }, - { PIDGIN_STOCK_IGNORE, NULL, GTK_STOCK_DIALOG_ERROR }, - { PIDGIN_STOCK_INVITE, NULL, GTK_STOCK_JUMP_TO }, - { PIDGIN_STOCK_MODIFY, NULL, GTK_STOCK_PREFERENCES }, -#if GTK_CHECK_VERSION(2,6,0) - { PIDGIN_STOCK_PAUSE, NULL, GTK_STOCK_MEDIA_PAUSE }, -#else - { PIDGIN_STOCK_PAUSE, "buttons", "pause.png" }, -#endif - { PIDGIN_STOCK_POUNCE, NULL, GTK_STOCK_REDO }, - { PIDGIN_STOCK_OPEN_MAIL, NULL, GTK_STOCK_JUMP_TO }, - { PIDGIN_STOCK_SIGN_ON, NULL, GTK_STOCK_EXECUTE }, - { PIDGIN_STOCK_SIGN_OFF, NULL, GTK_STOCK_CLOSE }, - { PIDGIN_STOCK_TYPED, "pidgin", "typed.png" }, - { PIDGIN_STOCK_UPLOAD, NULL, GTK_STOCK_GO_UP }, -#if GTK_CHECK_VERSION(2,8,0) - { PIDGIN_STOCK_INFO, NULL, GTK_STOCK_INFO }, -#else - { PIDGIN_STOCK_INFO, "buttons", "info.png" }, -#endif -}; - -static const GtkStockItem stock_items[] = -{ - { PIDGIN_STOCK_ALIAS, N_("_Alias"), 0, 0, NULL }, - { PIDGIN_STOCK_CHAT, N_("_Join"), 0, 0, NULL }, - { PIDGIN_STOCK_CLOSE_TABS, N_("Close _tabs"), 0, 0, NULL }, - { PIDGIN_STOCK_TOOLBAR_MESSAGE_NEW, N_("I_M"), 0, 0, NULL }, - { PIDGIN_STOCK_TOOLBAR_USER_INFO, N_("_Get Info"), 0, 0, NULL }, - { PIDGIN_STOCK_INVITE, N_("_Invite"), 0, 0, NULL }, - { PIDGIN_STOCK_MODIFY, N_("_Modify"), 0, 0, NULL }, - { PIDGIN_STOCK_OPEN_MAIL, N_("_Open Mail"), 0, 0, NULL }, - { PIDGIN_STOCK_PAUSE, N_("_Pause"), 0, 0, NULL }, - { PIDGIN_STOCK_EDIT, N_("_Edit"), 0, 0, NULL } -}; - -static struct SizedStockIcon { - const char *name; - const char *dir; - const char *filename; - gboolean microscopic; - gboolean extra_small; - gboolean small; - gboolean medium; - gboolean large; - gboolean huge; - gboolean rtl; - const char *translucent_name; -} const sized_stock_icons [] = { - - - /* Status icons */ - - { PIDGIN_STOCK_STATUS_AVAILABLE, "status", "pidgin-available.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, PIDGIN_STOCK_STATUS_AVAILABLE_I }, - { PIDGIN_STOCK_STATUS_AWAY, "status", "pidgin-away.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, PIDGIN_STOCK_STATUS_AWAY_I }, - { PIDGIN_STOCK_STATUS_BUSY, "status", "pidgin-busy.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, PIDGIN_STOCK_STATUS_BUSY_I }, - { PIDGIN_STOCK_STATUS_CHAT, "status", "pidgin-chat.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_STATUS_INVISIBLE, "status", "pidgin-invisible.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_STATUS_XA, "status", "pidgin-extended-away.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, PIDGIN_STOCK_STATUS_XA_I }, - { PIDGIN_STOCK_STATUS_LOGIN, "status", "pidgin-log-in.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_STATUS_LOGOUT, "status", "pidgin-log-out.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_STATUS_OFFLINE, "status", "pidgin-offline.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, PIDGIN_STOCK_STATUS_OFFLINE_I }, - { PIDGIN_STOCK_STATUS_PERSON, "status", "pidgin-person.png", TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_STATUS_MESSAGE, "actions", "pidgin-message-new.png", TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - - - /* Chatroom icons */ - - { PIDGIN_STOCK_STATUS_IGNORED, "status", "pidgin-blocked.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_STATUS_FOUNDER, "status", "pidgin-founder.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_STATUS_OPERATOR, "status", "pidgin-operator.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_STATUS_HALFOP, "status", "pidgin-half-operator.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_STATUS_VOICE, "status", "pidgin-voice.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - - - /* Dialog icons */ - - { PIDGIN_STOCK_DIALOG_AUTH, "status", "pidgin-auth.png", FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, NULL }, - { PIDGIN_STOCK_DIALOG_COOL, "status", "pidgin-cool.png", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, NULL }, - { PIDGIN_STOCK_DIALOG_ERROR, "status", "pidgin-error.png", FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, NULL }, - { PIDGIN_STOCK_DIALOG_INFO, "status", "pidgin-info.png", FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, NULL }, - { PIDGIN_STOCK_DIALOG_MAIL, "status", "pidgin-mail.png", FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, NULL }, - { PIDGIN_STOCK_DIALOG_QUESTION, "status", "pidgin-question.png", FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, NULL }, - { PIDGIN_STOCK_DIALOG_WARNING, "status", "pidgin-warning.png", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, NULL }, - - - /* Animations */ - - { PIDGIN_STOCK_ANIMATION_CONNECT0, "animations", "process-working0.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_ANIMATION_CONNECT1, "animations", "process-working1.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_ANIMATION_CONNECT2, "animations", "process-working2.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_ANIMATION_CONNECT3, "animations", "process-working3.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_ANIMATION_CONNECT4, "animations", "process-working4.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_ANIMATION_CONNECT5, "animations", "process-working5.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_ANIMATION_CONNECT6, "animations", "process-working6.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_ANIMATION_CONNECT7, "animations", "process-working7.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_ANIMATION_CONNECT8, "animations", "process-working8.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_ANIMATION_CONNECT9, "animations", "process-working9.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_ANIMATION_CONNECT10, "animations", "process-working10.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_ANIMATION_CONNECT11, "animations", "process-working11.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_ANIMATION_CONNECT12, "animations", "process-working12.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_ANIMATION_CONNECT13, "animations", "process-working13.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_ANIMATION_CONNECT14, "animations", "process-working14.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_ANIMATION_CONNECT15, "animations", "process-working15.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_ANIMATION_CONNECT16, "animations", "process-working16.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_ANIMATION_CONNECT17, "animations", "process-working17.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_ANIMATION_CONNECT18, "animations", "process-working18.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_ANIMATION_CONNECT19, "animations", "process-working19.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_ANIMATION_CONNECT20, "animations", "process-working20.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_ANIMATION_CONNECT21, "animations", "process-working21.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_ANIMATION_CONNECT22, "animations", "process-working22.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_ANIMATION_CONNECT23, "animations", "process-working23.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_ANIMATION_CONNECT24, "animations", "process-working24.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_ANIMATION_CONNECT25, "animations", "process-working25.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_ANIMATION_CONNECT26, "animations", "process-working26.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_ANIMATION_CONNECT27, "animations", "process-working27.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_ANIMATION_CONNECT28, "animations", "process-working28.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_ANIMATION_CONNECT29, "animations", "process-working29.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_ANIMATION_CONNECT30, "animations", "process-working30.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_ANIMATION_TYPING0, "animations", "typing0.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_ANIMATION_TYPING1, "animations", "typing1.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_ANIMATION_TYPING2, "animations", "typing2.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_ANIMATION_TYPING3, "animations", "typing3.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_ANIMATION_TYPING4, "animations", "typing4.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_ANIMATION_TYPING5, "animations", "typing5.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - - - /* Conversation toolbar icons */ - - { PIDGIN_STOCK_TOOLBAR_BGCOLOR, "actions", "pidgin-change-bgcolor.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_TOOLBAR_FGCOLOR, "actions", "pidgin-change-fgcolor.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_TOOLBAR_TEXT_SMALLER, "actions", "pidgin-font-size-down.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_TOOLBAR_TEXT_LARGER, "actions", "pidgin-font-size-up.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_TOOLBAR_SMILEY, "actions", "pidgin-emote-select.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_TOOLBAR_FONT_FACE, "actions", "pidgin-font-face.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_TOOLBAR_INSERT, "actions", "pidgin-insert.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_TOOLBAR_INSERT_IMAGE, "actions", "pidgin-insert-image.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_TOOLBAR_INSERT_LINK, "actions", "pidgin-insert-link.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - - - /* Menu icons */ - - { PIDGIN_STOCK_TOOLBAR_BLOCK, "status", "pidgin-blocked.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_TOOLBAR_MESSAGE_NEW, "actions", "pidgin-message-new.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_TOOLBAR_PENDING, "status", "pidgin-tray-new-im.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_TOOLBAR_PLUGINS, "actions", "pidgin-view-plugins.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_TOOLBAR_UNBLOCK, "actions", "pidgin-unblock.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_TOOLBAR_SELECT_AVATAR, "actions", "pidgin-select-avatar.png", FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_TOOLBAR_SEND_FILE, "actions", "pidgin-send-file.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_TOOLBAR_TRANSFER, "actions", "pidgin-view-transfer.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, - - - /* Tray icons */ - - { PIDGIN_STOCK_TRAY_AVAILABLE, "status", "pidgin-tray-online.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_TRAY_INVISIBLE, "status", "pidgin-tray-invisible.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_TRAY_AWAY, "status", "pidgin-tray-away.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_TRAY_BUSY, "status", "pidgin-tray-busy.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_TRAY_XA, "status", "pidgin-tray-extended-away.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_TRAY_OFFLINE, "status", "pidgin-tray-offline.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_TRAY_CONNECT, "status", "pidgin-tray-connecting.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_TRAY_PENDING, "status", "pidgin-tray-new-im.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL }, - { PIDGIN_STOCK_TRAY_EMAIL, "status", "pidgin-tray-message.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL } - -}; - -static gchar * -find_file(const char *dir, const char *base) -{ - char *filename; - - if (base == NULL) - return NULL; - - if (!strcmp(dir, "pidgin")) - filename = g_build_filename(DATADIR, "pixmaps", "pidgin", base, NULL); - else - { - filename = g_build_filename(DATADIR, "pixmaps", "pidgin", dir, - base, NULL); - } - - return filename; -} - -static void -add_sized_icon(GtkIconSet *iconset, GtkIconSize sizeid, const char *dir, - gboolean rtl, const char *size, const char *file) -{ - char *filename; - GtkIconSource *source; - - filename = g_build_filename(DATADIR, "pixmaps", "pidgin", dir, size, file, NULL); - source = gtk_icon_source_new(); - gtk_icon_source_set_filename(source, filename); - gtk_icon_source_set_direction(source, GTK_TEXT_DIR_LTR); - gtk_icon_source_set_direction_wildcarded(source, !rtl); - gtk_icon_source_set_size(source, sizeid); - gtk_icon_source_set_size_wildcarded(source, FALSE); - gtk_icon_source_set_state_wildcarded(source, TRUE); - gtk_icon_set_add_source(iconset, source); - gtk_icon_source_free(source); - - if (sizeid == gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL)) { - source = gtk_icon_source_new(); - gtk_icon_source_set_filename(source, filename); - gtk_icon_source_set_direction_wildcarded(source, TRUE); - gtk_icon_source_set_size(source, GTK_ICON_SIZE_MENU); - gtk_icon_source_set_size_wildcarded(source, FALSE); - gtk_icon_source_set_state_wildcarded(source, TRUE); - gtk_icon_set_add_source(iconset, source); - gtk_icon_source_free(source); - } - g_free(filename); - - if (rtl) { - filename = g_build_filename(DATADIR, "pixmaps", "pidgin", dir, size, "rtl", file, NULL); - source = gtk_icon_source_new(); - gtk_icon_source_set_filename(source, filename); - gtk_icon_source_set_direction(source, GTK_TEXT_DIR_RTL); - gtk_icon_source_set_size(source, sizeid); - gtk_icon_source_set_size_wildcarded(source, FALSE); - gtk_icon_source_set_state_wildcarded(source, TRUE); - gtk_icon_set_add_source(iconset, source); - g_free(filename); - gtk_icon_source_free(source); - } - - -} - -/* Altered from do_colorshift in gnome-panel */ -static void -do_alphashift (GdkPixbuf *dest, GdkPixbuf *src) -{ - gint i, j; - gint width, height, has_alpha, srcrowstride, destrowstride; - guchar *target_pixels; - guchar *original_pixels; - guchar *pixsrc; - guchar *pixdest; - guchar a; - - has_alpha = gdk_pixbuf_get_has_alpha (src); - if (!has_alpha) - return; - - width = gdk_pixbuf_get_width (src); - height = gdk_pixbuf_get_height (src); - srcrowstride = gdk_pixbuf_get_rowstride (src); - destrowstride = gdk_pixbuf_get_rowstride (dest); - target_pixels = gdk_pixbuf_get_pixels (dest); - original_pixels = gdk_pixbuf_get_pixels (src); - - for (i = 0; i < height; i++) { - pixdest = target_pixels + i*destrowstride; - pixsrc = original_pixels + i*srcrowstride; - for (j = 0; j < width; j++) { - *(pixdest++) = *(pixsrc++); - *(pixdest++) = *(pixsrc++); - *(pixdest++) = *(pixsrc++); - a = *(pixsrc++); - *(pixdest++) = a / 2; - } - } -} - -/* TODO: This is almost certainly not the best way to do this, but it's late, I'm tired, - * we're a few hours from getting this thing out, and copy/paste is EASY. - */ -static void -add_translucent_sized_icon(GtkIconSet *iconset, GtkIconSize sizeid, const char *dir, - gboolean rtl, const char *size, const char *file) -{ - char *filename; - GtkIconSource *source; - GdkPixbuf *pixbuf; - - filename = g_build_filename(DATADIR, "pixmaps", "pidgin", dir, size, file, NULL); - pixbuf = gdk_pixbuf_new_from_file(filename, NULL); - do_alphashift(pixbuf, pixbuf); - - source = gtk_icon_source_new(); - gtk_icon_source_set_pixbuf(source, pixbuf); - gtk_icon_source_set_direction(source, GTK_TEXT_DIR_LTR); - gtk_icon_source_set_direction_wildcarded(source, !rtl); - gtk_icon_source_set_size(source, sizeid); - gtk_icon_source_set_size_wildcarded(source, FALSE); - gtk_icon_source_set_state_wildcarded(source, TRUE); - gtk_icon_set_add_source(iconset, source); - gtk_icon_source_free(source); - - if (sizeid == gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL)) { - source = gtk_icon_source_new(); - gtk_icon_source_set_pixbuf(source, pixbuf); - gtk_icon_source_set_direction_wildcarded(source, TRUE); - gtk_icon_source_set_size(source, GTK_ICON_SIZE_MENU); - gtk_icon_source_set_size_wildcarded(source, FALSE); - gtk_icon_source_set_state_wildcarded(source, TRUE); - gtk_icon_set_add_source(iconset, source); - gtk_icon_source_free(source); - } - g_free(filename); - g_object_unref(pixbuf); - - if (rtl) { - filename = g_build_filename(DATADIR, "pixmaps", "pidgin", dir, size, "rtl", file, NULL); - pixbuf = gdk_pixbuf_new_from_file(filename, NULL); - do_alphashift(pixbuf, pixbuf); - source = gtk_icon_source_new(); - gtk_icon_source_set_pixbuf(source, pixbuf); - gtk_icon_source_set_direction(source, GTK_TEXT_DIR_RTL); - gtk_icon_source_set_size(source, sizeid); - gtk_icon_source_set_size_wildcarded(source, FALSE); - gtk_icon_source_set_state_wildcarded(source, TRUE); - gtk_icon_set_add_source(iconset, source); - g_free(filename); - g_object_unref(pixbuf); - gtk_icon_source_free(source); - } - - -} - - -void -pidgin_stock_init(void) -{ - static gboolean stock_initted = FALSE; - GtkIconFactory *icon_factory; - size_t i; - GtkWidget *win; - GtkIconSize microscopic, extra_small, small, medium, large, huge; - - if (stock_initted) - return; - - stock_initted = TRUE; - - /* Setup the icon factory. */ - icon_factory = gtk_icon_factory_new(); - - gtk_icon_factory_add_default(icon_factory); - - /* Er, yeah, a hack, but it works. :) */ - win = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_widget_realize(win); - - for (i = 0; i < G_N_ELEMENTS(stock_icons); i++) - { - GtkIconSource *source; - GtkIconSet *iconset; - gchar *filename; - - if (stock_icons[i].dir == NULL) - { - /* GTK+ Stock icon */ - iconset = gtk_style_lookup_icon_set(gtk_widget_get_style(win), - stock_icons[i].filename); - } - else - { - filename = find_file(stock_icons[i].dir, stock_icons[i].filename); - - if (filename == NULL) - continue; - - source = gtk_icon_source_new(); - gtk_icon_source_set_filename(source, filename); - gtk_icon_source_set_direction_wildcarded(source, TRUE); - gtk_icon_source_set_size_wildcarded(source, TRUE); - gtk_icon_source_set_state_wildcarded(source, TRUE); - - - iconset = gtk_icon_set_new(); - gtk_icon_set_add_source(iconset, source); - - gtk_icon_source_free(source); - g_free(filename); - } - - gtk_icon_factory_add(icon_factory, stock_icons[i].name, iconset); - - gtk_icon_set_unref(iconset); - } - - /* register custom icon sizes */ - - microscopic = gtk_icon_size_register(PIDGIN_ICON_SIZE_TANGO_MICROSCOPIC, 11, 11); - extra_small = gtk_icon_size_register(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL, 16, 16); - small = gtk_icon_size_register(PIDGIN_ICON_SIZE_TANGO_SMALL, 22, 22); - medium = gtk_icon_size_register(PIDGIN_ICON_SIZE_TANGO_MEDIUM, 32, 32); - large = gtk_icon_size_register(PIDGIN_ICON_SIZE_TANGO_LARGE, 48, 48); - huge = gtk_icon_size_register(PIDGIN_ICON_SIZE_TANGO_HUGE, 64, 64); - - for (i = 0; i < G_N_ELEMENTS(sized_stock_icons); i++) - { - GtkIconSet *iconset; - - iconset = gtk_icon_set_new(); - -#define ADD_SIZED_ICON(name, size) do { \ - if (sized_stock_icons[i].name) \ - add_sized_icon(iconset, name, \ - sized_stock_icons[i].dir, sized_stock_icons[i].rtl, \ - size, sized_stock_icons[i].filename); \ - } while (0) - ADD_SIZED_ICON(microscopic, "11"); - ADD_SIZED_ICON(extra_small, "16"); - ADD_SIZED_ICON(small, "22"); - ADD_SIZED_ICON(medium, "32"); - ADD_SIZED_ICON(large, "48"); - ADD_SIZED_ICON(huge, "64"); -#undef ADD_SIZED_ICON - - gtk_icon_factory_add(icon_factory, sized_stock_icons[i].name, iconset); - gtk_icon_set_unref(iconset); - - if (sized_stock_icons[i].translucent_name) { - iconset = gtk_icon_set_new(); - -#define ADD_TRANS_ICON(name, size) do { \ - if (sized_stock_icons[i].name) \ - add_translucent_sized_icon(iconset, name, \ - sized_stock_icons[i].dir, sized_stock_icons[i].rtl, \ - size, sized_stock_icons[i].filename); \ - } while (0) - ADD_TRANS_ICON(microscopic, "11"); - ADD_TRANS_ICON(extra_small, "16"); - ADD_TRANS_ICON(small, "22"); - ADD_TRANS_ICON(medium, "32"); - ADD_TRANS_ICON(large, "48"); - ADD_TRANS_ICON(huge, "64"); -#undef ADD_TRANS_ICON - - gtk_icon_factory_add(icon_factory, sized_stock_icons[i].translucent_name, iconset); - gtk_icon_set_unref(iconset); - } - } - - gtk_widget_destroy(win); - g_object_unref(G_OBJECT(icon_factory)); - - /* Register the stock items. */ - gtk_stock_add_static(stock_items, G_N_ELEMENTS(stock_items)); -} diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pidginstock.c --- a/pidgin/pidginstock.c Sat Dec 13 08:46:42 2008 +0000 +++ b/pidgin/pidginstock.c Sat Dec 13 08:48:58 2008 +0000 @@ -64,6 +64,7 @@ { PIDGIN_STOCK_IGNORE, NULL, GTK_STOCK_DIALOG_ERROR }, { PIDGIN_STOCK_INVITE, NULL, GTK_STOCK_JUMP_TO }, { PIDGIN_STOCK_MODIFY, NULL, GTK_STOCK_PREFERENCES }, + { PIDGIN_STOCK_ADD, NULL, GTK_STOCK_ADD }, #if GTK_CHECK_VERSION(2,6,0) { PIDGIN_STOCK_PAUSE, NULL, GTK_STOCK_MEDIA_PAUSE }, #else @@ -90,7 +91,8 @@ { PIDGIN_STOCK_TOOLBAR_MESSAGE_NEW, N_("I_M"), 0, 0, NULL }, { PIDGIN_STOCK_TOOLBAR_USER_INFO, N_("_Get Info"), 0, 0, NULL }, { PIDGIN_STOCK_INVITE, N_("_Invite"), 0, 0, NULL }, - { PIDGIN_STOCK_MODIFY, N_("_Modify"), 0, 0, NULL }, + { PIDGIN_STOCK_MODIFY, N_("_Modify..."), 0, 0, NULL }, + { PIDGIN_STOCK_ADD, N_("_Add..."), 0, 0, NULL }, { PIDGIN_STOCK_OPEN_MAIL, N_("_Open Mail"), 0, 0, NULL }, { PIDGIN_STOCK_PAUSE, N_("_Pause"), 0, 0, NULL }, { PIDGIN_STOCK_EDIT, N_("_Edit"), 0, 0, NULL } @@ -210,69 +212,64 @@ { PIDGIN_STOCK_TRAY_EMAIL, "tray", "tray-message.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL } }; +static void +add_sized_icon_common(GtkIconSet *iconset, GtkIconSize sizeid, const char *dir, + gboolean rtl, const char *size, const char *file, + gboolean translucent); + +static gchar * +find_file_common(const char *name) +{ + gchar *filename; +#if GLIB_CHECK_VERSION(2,6,0) + const gchar *userdir; + const gchar * const *sysdirs; + + userdir = g_get_user_data_dir(); + filename = g_build_filename(userdir, name, NULL); + if (g_file_test(filename, G_FILE_TEST_EXISTS)) + return filename; + g_free(filename); + + sysdirs = g_get_system_data_dirs(); + for (; *sysdirs; sysdirs++) { + filename = g_build_filename(*sysdirs, name, NULL); + if (g_file_test(filename, G_FILE_TEST_EXISTS)) + return filename; + g_free(filename); + } +#endif + filename = g_build_filename(DATADIR, name, NULL); + if (g_file_test(filename, G_FILE_TEST_EXISTS)) + return filename; + g_free(filename); + return NULL; +} + static gchar * find_file(const char *dir, const char *base) { char *filename; + char *ret; if (base == NULL) return NULL; if (!strcmp(dir, "pidgin")) - filename = g_build_filename(DATADIR, "pixmaps", "pidgin", base, NULL); + filename = g_build_filename("pixmaps", "pidgin", base, NULL); else - { - filename = g_build_filename(DATADIR, "pixmaps", "pidgin", dir, - base, NULL); - } + filename = g_build_filename("pixmaps", "pidgin", dir, base, NULL); - return filename; + ret = find_file_common(filename); + g_free(filename); + return ret; } static void -add_sized_icon(GtkIconSet *iconset, GtkIconSize sizeid, const char *dir, +add_sized_icon(GtkIconSet *iconset, GtkIconSize sizeid, const char *dir, gboolean rtl, const char *size, const char *file) { - char *filename; - GtkIconSource *source; - - filename = g_build_filename(DATADIR, "pixmaps", "pidgin", dir, size, file, NULL); - source = gtk_icon_source_new(); - gtk_icon_source_set_filename(source, filename); - gtk_icon_source_set_direction(source, GTK_TEXT_DIR_LTR); - gtk_icon_source_set_direction_wildcarded(source, !rtl); - gtk_icon_source_set_size(source, sizeid); - gtk_icon_source_set_size_wildcarded(source, FALSE); - gtk_icon_source_set_state_wildcarded(source, TRUE); - gtk_icon_set_add_source(iconset, source); - gtk_icon_source_free(source); - - if (sizeid == gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL)) { - source = gtk_icon_source_new(); - gtk_icon_source_set_filename(source, filename); - gtk_icon_source_set_direction_wildcarded(source, TRUE); - gtk_icon_source_set_size(source, GTK_ICON_SIZE_MENU); - gtk_icon_source_set_size_wildcarded(source, FALSE); - gtk_icon_source_set_state_wildcarded(source, TRUE); - gtk_icon_set_add_source(iconset, source); - gtk_icon_source_free(source); - } - g_free(filename); - - if (rtl) { - filename = g_build_filename(DATADIR, "pixmaps", "pidgin", dir, size, "rtl", file, NULL); - source = gtk_icon_source_new(); - gtk_icon_source_set_filename(source, filename); - gtk_icon_source_set_direction(source, GTK_TEXT_DIR_RTL); - gtk_icon_source_set_size(source, sizeid); - gtk_icon_source_set_size_wildcarded(source, FALSE); - gtk_icon_source_set_state_wildcarded(source, TRUE); - gtk_icon_set_add_source(iconset, source); - g_free(filename); - gtk_icon_source_free(source); - } - - + add_sized_icon_common(iconset, sizeid, dir, rtl, size, file, FALSE); } /* Altered from do_colorshift in gnome-panel */ @@ -311,64 +308,77 @@ } } -/* TODO: This is almost certainly not the best way to do this, but it's late, I'm tired, - * we're a few hours from getting this thing out, and copy/paste is EASY. - */ static void add_translucent_sized_icon(GtkIconSet *iconset, GtkIconSize sizeid, const char *dir, gboolean rtl, const char *size, const char *file) { - char *filename; - GtkIconSource *source; + add_sized_icon_common(iconset, sizeid, dir, rtl, size, file, TRUE); +} + +static void +add_sized_icon_common(GtkIconSet *iconset, GtkIconSize sizeid, const char *dir, + gboolean rtl, const char *size, const char *file, + gboolean translucent) +{ + char *filename, *subpath; + GtkIconSource *source; GdkPixbuf *pixbuf; - filename = g_build_filename(DATADIR, "pixmaps", "pidgin", dir, size, file, NULL); + subpath = g_build_filename("pixmaps", "pidgin", dir, size, file, NULL); + filename = find_file_common(subpath); + g_free(subpath); + if (!filename) + return; + pixbuf = gdk_pixbuf_new_from_file(filename, NULL); - do_alphashift(pixbuf, pixbuf); + if (translucent) + do_alphashift(pixbuf, pixbuf); source = gtk_icon_source_new(); - gtk_icon_source_set_pixbuf(source, pixbuf); + gtk_icon_source_set_pixbuf(source, pixbuf); gtk_icon_source_set_direction(source, GTK_TEXT_DIR_LTR); - gtk_icon_source_set_direction_wildcarded(source, !rtl); + gtk_icon_source_set_direction_wildcarded(source, !rtl); gtk_icon_source_set_size(source, sizeid); - gtk_icon_source_set_size_wildcarded(source, FALSE); - gtk_icon_source_set_state_wildcarded(source, TRUE); - gtk_icon_set_add_source(iconset, source); + gtk_icon_source_set_size_wildcarded(source, FALSE); + gtk_icon_source_set_state_wildcarded(source, TRUE); + gtk_icon_set_add_source(iconset, source); gtk_icon_source_free(source); if (sizeid == gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL)) { source = gtk_icon_source_new(); - gtk_icon_source_set_pixbuf(source, pixbuf); - gtk_icon_source_set_direction_wildcarded(source, TRUE); - gtk_icon_source_set_size(source, GTK_ICON_SIZE_MENU); - gtk_icon_source_set_size_wildcarded(source, FALSE); - gtk_icon_source_set_state_wildcarded(source, TRUE); - gtk_icon_set_add_source(iconset, source); - gtk_icon_source_free(source); + gtk_icon_source_set_pixbuf(source, pixbuf); + gtk_icon_source_set_direction_wildcarded(source, TRUE); + gtk_icon_source_set_size(source, GTK_ICON_SIZE_MENU); + gtk_icon_source_set_size_wildcarded(source, FALSE); + gtk_icon_source_set_state_wildcarded(source, TRUE); + gtk_icon_set_add_source(iconset, source); + gtk_icon_source_free(source); } - g_free(filename); + g_free(filename); g_object_unref(pixbuf); - if (rtl) { - filename = g_build_filename(DATADIR, "pixmaps", "pidgin", dir, size, "rtl", file, NULL); - pixbuf = gdk_pixbuf_new_from_file(filename, NULL); - do_alphashift(pixbuf, pixbuf); + if (rtl) { + subpath = g_build_filename("pixmaps", "pidgin", dir, size, "rtl", file, NULL); + filename = find_file_common(subpath); + g_free(subpath); + if (!filename) + return; + pixbuf = gdk_pixbuf_new_from_file(filename, NULL); + if (translucent) + do_alphashift(pixbuf, pixbuf); source = gtk_icon_source_new(); - gtk_icon_source_set_pixbuf(source, pixbuf); - gtk_icon_source_set_direction(source, GTK_TEXT_DIR_RTL); - gtk_icon_source_set_size(source, sizeid); - gtk_icon_source_set_size_wildcarded(source, FALSE); - gtk_icon_source_set_state_wildcarded(source, TRUE); - gtk_icon_set_add_source(iconset, source); + gtk_icon_source_set_pixbuf(source, pixbuf); + gtk_icon_source_set_direction(source, GTK_TEXT_DIR_RTL); + gtk_icon_source_set_size(source, sizeid); + gtk_icon_source_set_size_wildcarded(source, FALSE); + gtk_icon_source_set_state_wildcarded(source, TRUE); + gtk_icon_set_add_source(iconset, source); g_free(filename); g_object_unref(pixbuf); gtk_icon_source_free(source); - } - - + } } - void pidgin_stock_init(void) { @@ -417,7 +427,6 @@ gtk_icon_source_set_size_wildcarded(source, TRUE); gtk_icon_source_set_state_wildcarded(source, TRUE); - iconset = gtk_icon_set_new(); gtk_icon_set_add_source(iconset, source); diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pidginstock.h --- a/pidgin/pidginstock.h Sat Dec 13 08:46:42 2008 +0000 +++ b/pidgin/pidginstock.h Sat Dec 13 08:48:58 2008 +0000 @@ -49,6 +49,7 @@ #define PIDGIN_STOCK_INFO "pidgin-info" #define PIDGIN_STOCK_INVITE "pidgin-invite" #define PIDGIN_STOCK_MODIFY "pidgin-modify" +#define PIDGIN_STOCK_ADD "pidgin-add" #define PIDGIN_STOCK_OPEN_MAIL "pidgin-stock-open-mail" #define PIDGIN_STOCK_PAUSE "pidgin-pause" #define PIDGIN_STOCK_POUNCE "pidgin-pounce" diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/Makefile.am --- a/pidgin/pixmaps/Makefile.am Sat Dec 13 08:46:42 2008 +0000 +++ b/pidgin/pixmaps/Makefile.am Sat Dec 13 08:48:58 2008 +0000 @@ -1,12 +1,13 @@ pidginpixmapdir = $(datadir)/pixmaps/pidgin pidginiconsdir = $(datadir) -SUBDIRS = emotes/default/24 emotes/none +SUBDIRS = emotes/default/24 emotes/none emotes/small/16 if INSTALL_PIXMAPS MAKEFILE_MINGW = \ emotes/default/24/Makefile.mingw \ - emotes/none/Makefile.mingw + emotes/none/Makefile.mingw \ + emotes/small/16/Makefile.mingw ANIMATIONS_16 = \ animations/16/connect0.png \ @@ -177,6 +178,7 @@ emotes/default/24/scalable/musical-note.svg \ emotes/default/24/scalable/peace.svg \ emotes/default/24/scalable/phone.svg \ + emotes/default/24/scalable/pidgin-emotes.svg \ emotes/default/24/scalable/pig.svg \ emotes/default/24/scalable/pill.svg \ emotes/default/24/scalable/pizza.svg \ @@ -204,6 +206,9 @@ emotes/default/24/scalable/watermelon.svg \ emotes/default/24/scalable/yin-yang.svg +EMOTES_SMALL_16_SCALABLE = \ + emotes/small/16/scalable/pidgin-emotes.svg + PROTOCOLS_16_SCALABLE = \ protocols/16/scalable/aim.svg \ protocols/16/scalable/bonjour.svg \ diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/default/24/Makefile.am --- a/pidgin/pixmaps/emotes/default/24/Makefile.am Sat Dec 13 08:46:42 2008 +0000 +++ b/pidgin/pixmaps/emotes/default/24/Makefile.am Sat Dec 13 08:48:58 2008 +0000 @@ -1,4 +1,5 @@ -SMILEYS = act-up.png \ +SMILEYS = \ + act-up.png \ airplane.png \ alien.png \ angel.png \ diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/Makefile.am --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pidgin/pixmaps/emotes/small/16/Makefile.am Sat Dec 13 08:48:58 2008 +0000 @@ -0,0 +1,59 @@ +SMILEYS = \ + angel.png \ + angry.png \ + beer.png \ + camera.png \ + cigarette.png \ + coffee.png \ + confused.png \ + console.png \ + cool.png \ + cross.png \ + crying.png \ + devil.png \ + dont-know.png \ + grin.png \ + hug-left.png \ + hug-right.png \ + kiss.png \ + love.png \ + meeting.png \ + musical-note.png \ + nerdy.png \ + neutral.png \ + party.png \ + phone.png \ + plate.png \ + question.png \ + sad.png \ + shame.png \ + shock.png \ + sick.png \ + silent.png \ + sleepy.png \ + smile-big.png \ + smile.png \ + thinking.png \ + tongue.png \ + tv.png \ + uhm-yeah.png \ + wink.png \ + yawn.png + + +pidginsmileypix_in_files = small.theme.in + +if INSTALL_PIXMAPS +pidginsmileypixdir = $(datadir)/pixmaps/pidgin/emotes/small +pidginsmileypix_DATA = \ + $(SMILEYS) \ + theme + +theme: small.theme.in + sed -e 's/^_Name=/Name=/' \ + -e 's/^_Description=/Description=/' \ + -e 's/^_Author=/Author=/' \ + $< > $@ +endif + +EXTRA_DIST = $(SMILEYS) $(pidginsmileypix_in_files) theme diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/Makefile.mingw --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pidgin/pixmaps/emotes/small/16/Makefile.mingw Sat Dec 13 08:48:58 2008 +0000 @@ -0,0 +1,27 @@ +# +# Makefile.mingw +# +# Description: Makefile for win32 (mingw) version of Pidgin pixmaps +# + +PIDGIN_TREE_TOP := ../../../../.. +include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak + +datadir = $(PIDGIN_INSTALL_DIR) +-include ./Makefile.am.mingw + +.PHONY: install clean + +install: ./Makefile.am.mingw theme + if test '$(pidginsmileypix_DATA)'; then \ + mkdir -p $(pidginsmileypixdir); \ + cp $(pidginsmileypix_DATA) $(pidginsmileypixdir); \ + fi; + +clean: + rm -f theme ./Makefile.am.mingw + +./Makefile.am.mingw: ./Makefile.am + sed -e 's/^if\ INSTALL_PIXMAPS/ifeq (\$$(INSTALL_PIXMAPS), 1)/' ./Makefile.am > $@ + include $@ + diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/TODO --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pidgin/pixmaps/emotes/small/16/TODO Sat Dec 13 08:48:58 2008 +0000 @@ -0,0 +1,20 @@ +The following icons where just scaled down from the 24x24 and may need work: + meeting.png + question.png + search.png + sleepy.png + smile-big.png + tv.png + +The following icons came from N3fr0n and probably need to be redone to match +our default icons: + beer.png + camera.png + cigarette.png + coffee.png + console.png + love.png + musical-note.png + party.png + phone.png + plate.png diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/angel.png Binary file pidgin/pixmaps/emotes/small/16/angel.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/angry.png Binary file pidgin/pixmaps/emotes/small/16/angry.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/beer.png Binary file pidgin/pixmaps/emotes/small/16/beer.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/camera.png Binary file pidgin/pixmaps/emotes/small/16/camera.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/cigarette.png Binary file pidgin/pixmaps/emotes/small/16/cigarette.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/coffee.png Binary file pidgin/pixmaps/emotes/small/16/coffee.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/confused.png Binary file pidgin/pixmaps/emotes/small/16/confused.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/console.png Binary file pidgin/pixmaps/emotes/small/16/console.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/cool.png Binary file pidgin/pixmaps/emotes/small/16/cool.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/cross.png Binary file pidgin/pixmaps/emotes/small/16/cross.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/crying.png Binary file pidgin/pixmaps/emotes/small/16/crying.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/devil.png Binary file pidgin/pixmaps/emotes/small/16/devil.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/dont-know.png Binary file pidgin/pixmaps/emotes/small/16/dont-know.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/grin.png Binary file pidgin/pixmaps/emotes/small/16/grin.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/hug-left.png Binary file pidgin/pixmaps/emotes/small/16/hug-left.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/hug-right.png Binary file pidgin/pixmaps/emotes/small/16/hug-right.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/kiss.png Binary file pidgin/pixmaps/emotes/small/16/kiss.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/love.png Binary file pidgin/pixmaps/emotes/small/16/love.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/meeting.png Binary file pidgin/pixmaps/emotes/small/16/meeting.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/musical-note.png Binary file pidgin/pixmaps/emotes/small/16/musical-note.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/nerdy.png Binary file pidgin/pixmaps/emotes/small/16/nerdy.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/neutral.png Binary file pidgin/pixmaps/emotes/small/16/neutral.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/party.png Binary file pidgin/pixmaps/emotes/small/16/party.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/phone.png Binary file pidgin/pixmaps/emotes/small/16/phone.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/plate.png Binary file pidgin/pixmaps/emotes/small/16/plate.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/question.png Binary file pidgin/pixmaps/emotes/small/16/question.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/sad.png Binary file pidgin/pixmaps/emotes/small/16/sad.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/scalable/pidgin-emotes.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pidgin/pixmaps/emotes/small/16/scalable/pidgin-emotes.svg Sat Dec 13 08:48:58 2008 +0000 @@ -0,0 +1,6689 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/search.png Binary file pidgin/pixmaps/emotes/small/16/search.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/shame.png Binary file pidgin/pixmaps/emotes/small/16/shame.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/shock.png Binary file pidgin/pixmaps/emotes/small/16/shock.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/sick.png Binary file pidgin/pixmaps/emotes/small/16/sick.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/silent.png Binary file pidgin/pixmaps/emotes/small/16/silent.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/sleepy.png Binary file pidgin/pixmaps/emotes/small/16/sleepy.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/small.theme.in --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pidgin/pixmaps/emotes/small/16/small.theme.in Sat Dec 13 08:48:58 2008 +0000 @@ -0,0 +1,156 @@ +_Name=Small +_Description=Smaller versions of the default smilies +Icon=wink.png +Author=Hylke Bons + + +# Default smileys +[default] +smile.png :) :-) +smile-big.png :-D :-d :D :d +sad.png :-( :( +wink.png ;-) ;) +tongue.png :P :-P :-p :p +shock.png =-O =-o +kiss.png :-* +crying.png :'( +thinking.png :-/ :-\\ +angel.png O:-) o:-) + + +# Following AIM 6.1 +[AIM] +smile.png :-) :) +wink.png ;-) ;) +sad.png :-( :( +tongue.png :-P :P :-p :p +shock.png =-O +kiss.png :-* +smile-big.png :-D :D +angel.png O:-) +thinking.png :-\\ :-/ +crying.png :'( + + +# Following Windows Live Messenger 8.1 +[MSN] +smile.png :) :-) +smile-big.png :D :d :-D :-d +wink.png ;) ;-) +shock.png :-O :-o :O :o +tongue.png :P :p :-P :-p +angry.png :@ :-@ +confused.png :S :s :-S :-s +sad.png :( :-( +crying.png :'( +neutral.png :| :-| +devil.png (6) +angel.png (A) (a) +love.png (L) (l) +musical-note.png (8) +kiss.png (K) (k) +camera.png (P) (p) +coffee.png (C) (c) +phone.png (T) (t) +hug-left.png ({) +hug-right.png (}) +beer.png (B) (b) +sick.png +o( +plate.png (pl) +dont-know.png :^) +thinking.png *-) +party.png <:o) +yawn.png |-) + +# Hidden MSN emotes +cigarette.png (ci) (CI) +console.png (xx) (XX) + + +# Following QQ 2006 +[QQ] +shock.png /:O /jy /surprised +party.png /8-) /dy /revel +crying.png /:< /ll /cry +sleepy.png /:Z /shui /sleep +smile-big.png /:D /cy /toothy_smile +smile.png /:) /wx /small_smile +sad.png /:( /ng /sad +sick.png /:T /tu /vomit +yawn.png /|-) /kun /sleepy +question.png /? /yiw /question +search.png /find /zhao /search +hug-left.png /hug /yb /hug +musical-note.png /music /yy /music +coffee.png /coffee /kf /coffee +kiss.png /kiss /wen /kiss +love.png /heart /xin /heart +meeting.png /meeting /hy /meeting +phone.png /phone /dh /phone +tv.png /TV /ds /TV +angry.png / /oh /angry + + +# Following ICQ 6.0 +[ICQ] +smile.png :-) :) +neutral.png :-$ +sad.png :-( :( +shock.png =-O +wink.png ;-) ;) +tongue.png :-P :P :-p :p +sleepy.png *TIRED* +crying.png :'( :'-( +sick.png :-! +kiss.png :-{} :-* +devil.png ]:-> +angel.png O:-) +thinking.png :-\\ :-/ +beer.png *DRINK* +smile-big.png :-D :D + + +# Following Yahoo! Messenger 8.1 +[Yahoo] +smile.png :) :-) +question.png :-/ :-\\ +shock.png :-O :O :-o :o +devil.png >:) +angel.png O:-) o:-) 0:-) +sick.png :-& +yawn.png (:| +sad.png :( :-( +angry.png X-( x-( X( x( +crying.png :(( +wink.png ;) ;-) +thinking.png :-? +smile-big.png :D :-D :d :-d +tongue.png :-P :P :-p :p +neutral.png :| :-| +sleepy.png I-) i-) |-) +kiss.png :-* :* +confused.png :-S :-s +hug-left.png >:D< >:d< +party.png <:-P <:-p + +# Hidden Yahoo emotes +coffee.png ~o) ~O) +dont-know.png :-L :-l +shame.png [-X [-x +musical-note.png :-" + +# Only available after activating the Yahoo! Fighter IMVironment + + +# Following MySpaceIM Beta 1.0.697.0 +[MySpaceIM] +smile-big.png :D :-D +devil.png }:) +confused.png :Z +smile.png :) :-) +shock.png :O +neutral.png :| +tongue.png :P :p +wink.png ;-) ;) +sad.png :[ +kiss.png :x diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/smile-big.png Binary file pidgin/pixmaps/emotes/small/16/smile-big.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/smile.png Binary file pidgin/pixmaps/emotes/small/16/smile.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/thinking.png Binary file pidgin/pixmaps/emotes/small/16/thinking.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/tongue.png Binary file pidgin/pixmaps/emotes/small/16/tongue.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/tv.png Binary file pidgin/pixmaps/emotes/small/16/tv.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/uhm-yeah.png Binary file pidgin/pixmaps/emotes/small/16/uhm-yeah.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/wink.png Binary file pidgin/pixmaps/emotes/small/16/wink.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/pixmaps/emotes/small/16/yawn.png Binary file pidgin/pixmaps/emotes/small/16/yawn.png has changed diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/plugins/markerline.c --- a/pidgin/plugins/markerline.c Sat Dec 13 08:46:42 2008 +0000 +++ b/pidgin/plugins/markerline.c Sat Dec 13 08:48:58 2008 +0000 @@ -202,16 +202,14 @@ } static void -conv_created(PurpleConversation *conv, gpointer null) +conv_created(PidginConversation *gtkconv, gpointer null) { - PidginConversation *gtkconv = PIDGIN_CONVERSATION(conv); PidginWindow *win; - if (!gtkconv) + win = pidgin_conv_get_window(gtkconv); + if (!win) return; - win = pidgin_conv_get_window(gtkconv); - detach_from_pidgin_window(win, NULL); attach_to_pidgin_window(win, NULL); } @@ -247,7 +245,7 @@ { attach_to_all_windows(); - purple_signal_connect(purple_conversations_get_handle(), "conversation-created", + purple_signal_connect(pidgin_conversations_get_handle(), "conversation-displayed", plugin, PURPLE_CALLBACK(conv_created), NULL); purple_signal_connect(purple_conversations_get_handle(), "conversation-extended-menu", diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/plugins/relnot.c --- a/pidgin/plugins/relnot.c Sat Dec 13 08:46:42 2008 +0000 +++ b/pidgin/plugins/relnot.c Sat Dec 13 08:48:58 2008 +0000 @@ -34,7 +34,10 @@ #include "connection.h" #include "core.h" #include "debug.h" +#include "gtkblist.h" +#include "gtkutils.h" #include "notify.h" +#include "pidginstock.h" #include "prefs.h" #include "util.h" #include "version.h" @@ -45,12 +48,26 @@ #define MIN_CHECK_INTERVAL 60 * 60 * 24 static void +release_hide() +{ + /* No-op. We may use this method in the future to avoid showing + * the popup twice */ +} + +static void +release_show() +{ + purple_notify_uri(NULL, PURPLE_WEBSITE); +} + +static void version_fetch_cb(PurpleUtilFetchUrlData *url_data, gpointer user_data, const gchar *response, size_t len, const gchar *error_message) { - gchar *cur_ver, *formatted; + gchar *cur_ver; const char *tmp, *changelog; char response_code[4]; + GtkWidget *release_dialog; GString *message; int i = 0; @@ -89,27 +106,21 @@ return; cur_ver = g_strndup(changelog, i); - changelog += i; - - while(*changelog == '\n') changelog++; message = g_string_new(""); - g_string_append_printf(message, _("You are using %s version %s. The " - "current version is %s. You can get it from " - "%s
"), - PIDGIN_NAME, purple_core_get_version(), cur_ver, - PURPLE_WEBSITE, PURPLE_WEBSITE); + g_string_append_printf(message, _("You can upgrade to %s %s today."), + PIDGIN_NAME, cur_ver); - if(*changelog) { - formatted = purple_strdup_withhtml(changelog); - g_string_append_printf(message, _("ChangeLog:
%s"), - formatted); - g_free(formatted); - } + release_dialog = pidgin_make_mini_dialog( + NULL, PIDGIN_STOCK_DIALOG_INFO, + _("New Version Available"), + message->str, + NULL, + _("Later"), PURPLE_CALLBACK(release_hide), + _("Download Now"), PURPLE_CALLBACK(release_show), + NULL); - purple_notify_formatted(NULL, _("New Version Available"), - _("New Version Available"), NULL, message->str, - NULL, NULL); + pidgin_blist_add_alert(release_dialog); g_string_free(message, TRUE); g_free(cur_ver); diff -r cb4337d6c803 -r 93cc8982d4e5 pidgin/plugins/sendbutton.c --- a/pidgin/plugins/sendbutton.c Sat Dec 13 08:46:42 2008 +0000 +++ b/pidgin/plugins/sendbutton.c Sat Dec 13 08:48:58 2008 +0000 @@ -37,9 +37,26 @@ } static void +input_buffer_changed(GtkTextBuffer *text_buffer, GtkWidget *send_button) +{ + if (gtk_text_buffer_get_char_count(text_buffer) != 0) + gtk_widget_set_sensitive(send_button, TRUE); + else + gtk_widget_set_sensitive(send_button, FALSE); +} + +static void create_send_button_pidgin(PidginConversation *gtkconv) { GtkWidget *send_button; + GtkTextBuffer *buf; + guint signal_id; + + send_button = g_object_get_data(G_OBJECT(gtkconv->lower_hbox), + "send_button"); + + if (send_button != NULL) + return; send_button = gtk_button_new_with_mnemonic(_("_Send")); g_signal_connect(G_OBJECT(send_button), "clicked", @@ -48,6 +65,16 @@ FALSE, 0); gtk_widget_show(send_button); + buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(gtkconv->entry)); + if (buf) { + signal_id = g_signal_connect(G_OBJECT(buf), "changed", + G_CALLBACK(input_buffer_changed), + send_button); + g_object_set_data(G_OBJECT(send_button), "buffer-signal", + GINT_TO_POINTER(signal_id)); + input_buffer_changed(buf, send_button); + } + g_object_set_data(G_OBJECT(gtkconv->lower_hbox), "send_button", send_button); } @@ -60,7 +87,18 @@ send_button = g_object_get_data(G_OBJECT(gtkconv->lower_hbox), "send_button"); if (send_button != NULL) { + GtkTextBuffer *buf; + guint signal_id; + + buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(gtkconv->entry)); + signal_id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(send_button), + "buffer-signal")); + if (buf && signal_id) + g_signal_handler_disconnect(G_OBJECT(buf), signal_id); + gtk_widget_destroy(send_button); + g_object_set_data(G_OBJECT(gtkconv->lower_hbox), + "send_button", NULL); } } diff -r cb4337d6c803 -r 93cc8982d4e5 po/POTFILES.in --- a/po/POTFILES.in Sat Dec 13 08:46:42 2008 +0000 +++ b/po/POTFILES.in Sat Dec 13 08:48:58 2008 +0000 @@ -217,11 +217,11 @@ pidgin/gtkwhiteboard.c pidgin/pidgin.h pidgin/pidgincombobox.c -pidgin/pidginstock-artwork.c pidgin/pidginstock.c pidgin/pidgintooltip.c pidgin/pixmaps/emotes/default/24/default.theme.in pidgin/pixmaps/emotes/none/none.theme.in +pidgin/pixmaps/emotes/small/16/small.theme.in pidgin/plugins/cap/cap.c pidgin/plugins/contact_priority.c pidgin/plugins/convcolors.c diff -r cb4337d6c803 -r 93cc8982d4e5 po/hu.po --- a/po/hu.po Sat Dec 13 08:46:42 2008 +0000 +++ b/po/hu.po Sat Dec 13 08:48:58 2008 +0000 @@ -9,8 +9,8 @@ msgstr "" "Project-Id-Version: pidgin 2.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-10-16 00:55-0700\n" -"PO-Revision-Date: 2008-10-02 18:55+0200\n" +"POT-Creation-Date: 2008-11-23 21:15+0100\n" +"PO-Revision-Date: 2008-11-23 21:16+0100\n" "Last-Translator: Gabor Kelemen \n" "Language-Team: Hungarian \n" "MIME-Version: 1.0\n" @@ -73,7 +73,6 @@ msgid "Remember password" msgstr "Emlékezzen a jelszóra" -#, fuzzy msgid "There are no protocol plugins installed." msgstr "Nincsenek protokollbővítmények telepítve." @@ -146,8 +145,7 @@ #, c-format msgid "%s%s%s%s wants to add %s to his or her buddy list%s%s" -msgstr "" -"%s%s%s%s felhasználó szeretné %s partnert felvenni a partnerlistájára%s%s" +msgstr "%s%s%s%s felhasználó szeretné %s partnert felvenni a partnerlistájára%s%s" msgid "Authorize buddy?" msgstr "Engedélyezi a partnert?" @@ -242,9 +240,6 @@ msgid "You must give a name for the group to add." msgstr "Meg kell adnia a felvenni kívánt csoport nevét." -msgid "A group with the name already exists." -msgstr "Ilyen nevű csoport már létezik." - msgid "Add Group" msgstr "Csoport felvétele" @@ -275,15 +270,14 @@ msgid "Add Buddy Pounce" msgstr "Partnerfigyelmeztetés felvétele" -#. if (q_bud && is_online(q_bud->status)) { msgid "Send File" msgstr "Fájl küldése" msgid "Blocked" msgstr "Tiltott" -msgid "View Log" -msgstr "Napló megtekintése" +msgid "Show when offline" +msgstr "Megjelenítés, ha elérhető" #, c-format msgid "Please enter the new name for %s" @@ -302,8 +296,7 @@ msgstr "A kapcsolat eltávolítása a kapcsolat partnereit is eltávolítja" msgid "Removing this group will also remove all the buddies in the group" -msgstr "" -"A csoport eltávolítása a csoportban található partnereket is eltávolítja" +msgstr "A csoport eltávolítása a csoportban található partnereket is eltávolítja" #, c-format msgid "Are you sure you want to remove %s?" @@ -326,6 +319,9 @@ msgid "Toggle Tag" msgstr "Címke átváltása" +msgid "View Log" +msgstr "Napló megtekintése" + #. General msgid "Nickname" msgstr "Becenév" @@ -373,8 +369,7 @@ msgstr "Új azonnali üzenet" msgid "Please enter the username or alias of the person you would like to IM." -msgstr "" -"Adja meg azon személy felhasználónevét vagy álnevét, akinek üzenni szeretne." +msgstr "Adja meg azon személy felhasználónevét vagy álnevét, akinek üzenni szeretne." msgid "Channel" msgstr "Csatorna" @@ -600,13 +595,10 @@ msgstr "Elhagyta ezt a csevegést." msgid "Logging started. Future messages in this conversation will be logged." -msgstr "" -"A naplózás elkezdődött. A társalgás jövőbeli üzenetei naplózva lesznek." - -msgid "" -"Logging stopped. Future messages in this conversation will not be logged." -msgstr "" -"A naplózás befejeződött. A társalgás jövőbeli üzenetei nem lesznek naplózva." +msgstr "A naplózás elkezdődött. A társalgás jövőbeli üzenetei naplózva lesznek." + +msgid "Logging stopped. Future messages in this conversation will not be logged." +msgstr "A naplózás befejeződött. A társalgás jövőbeli üzenetei nem lesznek naplózva." msgid "Send To" msgstr "Küldés ennek" @@ -678,8 +670,7 @@ #, c-format msgid "%s is not a valid color. See '/help msgcolor' for valid colors." -msgstr "" -"%s nem érvényes szín. Az érvényes színekért lásd a „help msgcolor” kimenetét." +msgstr "%s nem érvényes szín. Az érvényes színekért lásd a „help msgcolor” kimenetét." msgid "" "say <message>: Send a message normally as if you weren't using a " @@ -852,8 +843,7 @@ "Az azonnali üzenetek csak akkor lesznek naplózva, ha az „Összes azonnali " "üzenet naplózása” tulajdonság be van állítva." -msgid "" -"Chats will only be logged if the \"Log all chats\" preference is enabled." +msgid "Chats will only be logged if the \"Log all chats\" preference is enabled." msgstr "" "A csevegések csak akkor lesznek naplózva, ha az „Összes csevegés naplózása” " "tulajdonság be van állítva." @@ -959,8 +949,7 @@ msgid "The selected file is not a valid plugin." msgstr "A kiválasztott fájl nem egy érvényes bővítmény." -msgid "" -"Please open the debug window and try again to see the exact error message." +msgid "Please open the debug window and try again to see the exact error message." msgstr "" "Nyissa meg a hibakereső ablakot és próbálkozzon újra a pontos hibaüzenet " "megjelenítéséhez." @@ -1332,7 +1321,7 @@ #. PurpleStatusPrimitive #. id - use default #. name - use default -#. savable +#. saveable #. user_settable #. not independent #. Attributes - each status can have a message. @@ -1393,8 +1382,7 @@ msgstr "Az ablak nem található" msgid "This plugin cannot be loaded because it was not built with X11 support." -msgstr "" -"A bővítmény nem tölthető be, mivel X11 támogatás nélkül került lefordításra." +msgstr "A bővítmény nem tölthető be, mivel X11 támogatás nélkül került lefordításra." msgid "GntClipboard" msgstr "GntClipboard" @@ -1675,8 +1663,7 @@ "ellenőrizhető." #. vrq will be completed by user_auth -msgid "" -"The root certificate this one claims to be issued by is unknown to Pidgin." +msgid "The root certificate this one claims to be issued by is unknown to Pidgin." msgstr "A tanúsítványt kiadó gyökértanúsítványt a Pidgin nem ismeri." #, c-format @@ -2087,8 +2074,7 @@ msgstr "A megadott parancs kezelje-e az „ymsgr” URL címeket" msgid "The logger has no read function" -msgstr "" -"A naplózónak nincsen olvasás funkciója" +msgstr "A naplózónak nincsen olvasás funkciója" msgid "HTML" msgstr "HTML" @@ -2148,8 +2134,7 @@ msgid "ABI version mismatch %d.%d.x (need %d.%d.x)" msgstr "Az ABI verziója nem egyezik: %d.%d.x (szükséges: %d.%d.x)" -msgid "" -"Plugin does not implement all required functions (list_icon, login and close)" +msgid "Plugin does not implement all required functions (list_icon, login and close)" msgstr "" "A bővítmény nem valósítja meg az összes kívánt függvényt (list_icon, login " "és close)" @@ -2158,8 +2143,7 @@ msgid "" "The required plugin %s was not found. Please install this plugin and try " "again." -msgstr "" -"A szükséges %s bővítmény nem található. Kérem telepítse, majd próbálja újra." +msgstr "A szükséges %s bővítmény nem található. Kérem telepítse, majd próbálja újra." msgid "Unable to load the plugin" msgstr "A bővítmény nem tölthető be" @@ -2224,8 +2208,7 @@ "(Teljes elérési utat adjon meg)" msgid "Automatically reject from users not in buddy list" -msgstr "" -"Automatikus visszautasítás a partnerlistán nem szereplő felhasználóktól" +msgstr "Automatikus visszautasítás a partnerlistán nem szereplő felhasználóktól" msgid "" "Notify with a popup when an autoaccepted file transfer is complete\n" @@ -2454,8 +2437,7 @@ msgid "" "You are currently disconnected. Messages will not be received unless you are " "logged in." -msgstr "" -"Jelenleg nincs csatlakozva. Nem fogadhat üzeneteket, amíg nem jelentkezik be." +msgstr "Jelenleg nincs csatlakozva. Nem fogadhat üzeneteket, amíg nem jelentkezik be." msgid "Message could not be sent because the maximum length was exceeded." msgstr "Az üzenet nem küldhető el, mivel a maximális hossz el lett érve." @@ -2829,10 +2811,8 @@ msgid "Unable to listen for incoming IM connections\n" msgstr "Nem lehetséges a bejövő azonnali üzenő kapcsolatokat figyelni\n" -msgid "" -"Unable to establish connection with the local mDNS server. Is it running?" -msgstr "" -"Nem hozható létre kapcsolat a helyi mDNS kiszolgálóval. Egyáltalán fut?" +msgid "Unable to establish connection with the local mDNS server. Is it running?" +msgstr "Nem hozható létre kapcsolat a helyi mDNS kiszolgálóval. Egyáltalán fut?" #. Creating the options for the protocol msgid "First name" @@ -3499,8 +3479,7 @@ msgstr "nickserv: parancs küldése a nickserv kiszolgálónak" msgid "notice <target<: Send a notice to a user or channel." -msgstr "" -"notice <cél<: Értesítés küldése egy felhasználónak vagy csatornának." +msgstr "notice <cél<: Értesítés küldése egy felhasználónak vagy csatornának." msgid "" "op <nick1> [nick2] ...: Grant channel operator status to someone. You " @@ -3584,8 +3563,7 @@ "tudja." msgid "whois [server] <nick>: Get information on a user." -msgstr "" -"whois [kiszolgáló] <becenév>: Információk lekérése egy felhasználóról." +msgstr "whois [kiszolgáló] <becenév>: Információk lekérése egy felhasználóról." msgid "whowas <nick>: Get information on a user that has logged off." msgstr "" @@ -3623,8 +3601,7 @@ msgstr "Titkosítást kér, de a TLS/SSL támogatása nem található." msgid "Server requires plaintext authentication over an unencrypted stream" -msgstr "" -"A kiszolgáló szöveges hitelesítést követel meg egy nem titkosított csatornán" +msgstr "A kiszolgáló szöveges hitelesítést követel meg egy nem titkosított csatornán" #, c-format msgid "" @@ -3957,8 +3934,7 @@ msgstr "Kiszolgálóutasítások: %s" msgid "Fill in one or more fields to search for any matching XMPP users." -msgstr "" -"Töltsön ki legalább egy mezőt a megfelelő XMPP felhasználók kereséséhez." +msgstr "Töltsön ki legalább egy mezőt a megfelelő XMPP felhasználók kereséséhez." msgid "Email Address" msgstr "E-mail cím" @@ -4116,8 +4092,7 @@ msgid "Unregister" msgstr "Regisztráció megszüntetése" -msgid "" -"Please fill out the information below to change your account registration." +msgid "Please fill out the information below to change your account registration." msgstr "Adja meg a következő információkat a regisztrált fiók módosításához." msgid "Please fill out the information below to register your new account." @@ -4491,8 +4466,7 @@ msgid "kick <user> [reason]: Kick a user from the room." msgstr "kick <felhasználó> [ok]: Felhasználó kirúgása a szobából." -msgid "" -"msg <user> <message>: Send a private message to another user." +msgid "msg <user> <message>: Send a private message to another user." msgstr "" "msg <felhasználó> <üzenet>: Magánüzenet küldése másik " "felhasználónak." @@ -4543,7 +4517,6 @@ #. this should probably be part of global smiley theme settings later on, #. shared with MSN -#, fuzzy msgid "Show Custom Smileys" msgstr "Egyéni hangulatjelek megjelenítése" @@ -4915,13 +4888,11 @@ msgid "MSN Error: %s\n" msgstr "MSN hiba: %s\n" -#, fuzzy msgid "Other Contacts" -msgstr "Előnyben részesített kapcsolat" - -#, fuzzy +msgstr "Egyéb partnerek" + msgid "Non-IM Contacts" -msgstr "Kapcsolat eltávolítása" +msgstr "Nem azonnali üzenetváltási partnerek" msgid "Nudge" msgstr "Bökés" @@ -4979,8 +4950,7 @@ msgstr "Nincs tiltott szöveg ehhez a fiókhoz." #, c-format -msgid "" -"MSN servers are currently blocking the following regular expressions:
%s" +msgid "MSN servers are currently blocking the following regular expressions:
%s" msgstr "" "Az MSN kiszolgálók jelenleg a következő reguláris kifejezéseket tiltják:
" "%s" @@ -5021,7 +4991,7 @@ #. primitive #. ID #. name - use default -#. savable +#. saveable #. should be user_settable some day #. independent msgid "Artist" @@ -5234,8 +5204,7 @@ #. *< id #. *< name #. *< version -#. * summary -#. * description +#. *< summary msgid "Windows Live Messenger Protocol Plugin" msgstr "Windows Live Messenger protokollbővítmény" @@ -5272,6 +5241,7 @@ msgid "%s just sent you a Nudge!" msgstr "%s megbökte!" +#. char *adl = g_strndup(payload, len); #, c-format msgid "Unknown error (%d)" msgstr "Ismeretlen hiba (%d)" @@ -5279,9 +5249,8 @@ msgid "Unable to add user" msgstr "Nem vehető fel a felhasználó" -#, fuzzy msgid "The following users are missing from your addressbook" -msgstr "A keresés eredményei a következők" +msgstr "A következő felhasználók hiányoznak a címjegyzékéből" #, c-format msgid "Unable to add user on %s (%s)" @@ -5397,8 +5366,7 @@ msgid "Unable to authenticate: %s" msgstr "Nem sikerült a hitelesítés: %s" -msgid "" -"Your MSN buddy list is temporarily unavailable. Please wait and try again." +msgid "Your MSN buddy list is temporarily unavailable. Please wait and try again." msgstr "" "Az Ön MSN partnerlistája átmenetileg nem érhető el. Kérem várjon és próbálja " "újra később." @@ -5431,8 +5399,7 @@ msgstr "Ebédelni mentem" msgid "Message may have not been sent because a timeout occurred:" -msgstr "" -"Időtúllépés következett be, emiatt az üzenet lehet, hogy nem lett elküldve:" +msgstr "Időtúllépés következett be, emiatt az üzenet lehet, hogy nem lett elküldve:" msgid "Message could not be sent, not allowed while invisible:" msgstr "Az üzenet nem küldhető el, láthatatlan módban nem engedélyezett:" @@ -5454,8 +5421,7 @@ "kiszolgálóval. Ez valószínűleg kiszolgálóhiba, pár perc múlva próbálkozzon " "újra:" -msgid "" -"Message could not be sent because an error with the switchboard occurred:" +msgid "Message could not be sent because an error with the switchboard occurred:" msgstr "Az üzenet nem küldhető el, mivel hiba lépett fel a közvetítés közben:" msgid "Message may have not been sent because an unknown error occurred:" @@ -5469,13 +5435,11 @@ msgid "%s has removed you from his or her buddy list." msgstr "%s eltávolította Önt a partnerlistájáról." -#, fuzzy msgid "Delete Buddy from Address Book?" -msgstr "Hozzáadás a címjegyzékhez" - -#, fuzzy +msgstr "Törli a partnert a címjegyzékből?" + msgid "Do you want to delete this buddy from your address book as well?" -msgstr "Fel kívánja venni ezt a partnert a listájára?" +msgstr "Törölni kívánja a partnert a címjegyzékéből is?" #. only notify the user about problems adding to the friends list #. * maybe we should do something else for other lists, but it probably @@ -5953,8 +5917,7 @@ msgid "" "This evaluation version does not allow more than ten users to log in at one " "time" -msgstr "" -"Ez a próbaverzió nem engedélyezi tíznél több felhasználó egyidejű belépését" +msgstr "Ez a próbaverzió nem engedélyezi tíznél több felhasználó egyidejű belépését" msgid "The user is either offline or you are blocked" msgstr "A felhasználó kilépett, vagy Ön le van tiltva" @@ -5994,8 +5957,7 @@ #, c-format msgid "Unable to send message. Could not create the conference (%s)." -msgstr "" -"Az üzenetet nem lehet elküldeni. Nem sikerült létrehozni a konferenciát (%s)." +msgstr "Az üzenetet nem lehet elküldeni. Nem sikerült létrehozni a konferenciát (%s)." #, c-format msgid "" @@ -6035,8 +5997,7 @@ #, c-format msgid "Unable to change server side privacy settings (%s)." -msgstr "" -"Nem lehet megváltoztatni a kiszolgálóoldali magánszféra-beállításokat (%s)." +msgstr "Nem lehet megváltoztatni a kiszolgálóoldali magánszféra-beállításokat (%s)." #, c-format msgid "Unable to create conference (%s)." @@ -6100,12 +6061,10 @@ msgstr "Szeretne csatlakozni a társalgáshoz?" msgid "You have been logged out because you logged in at another workstation." -msgstr "" -"Ki lett jelentkeztetve, mivel bejelentkezett egy másik munkaállomásról." - -#, c-format -msgid "" -"%s appears to be offline and did not receive the message that you just sent." +msgstr "Ki lett jelentkeztetve, mivel bejelentkezett egy másik munkaállomásról." + +#, c-format +msgid "%s appears to be offline and did not receive the message that you just sent." msgstr "Úgy tűnik, %s kilépett, és nem kapta meg az utoljára küldött üzenetet." msgid "" @@ -6449,6 +6408,7 @@ "tartalmazhatnak." #. Unregistered screen name +#. uid is not exist msgid "Invalid username." msgstr "Érvénytelen felhasználónév." @@ -6556,8 +6516,7 @@ #. Someone has granted you authorization #, c-format msgid "The user %u has granted your request to add them to your buddy list." -msgstr "" -"%u felhasználó elfogadta a kérését, így felveheti őt a partnerlistájára." +msgstr "%u felhasználó elfogadta a kérését, így felveheti őt a partnerlistájára." #, c-format msgid "" @@ -6611,27 +6570,21 @@ #, c-format msgid "You missed %hu message from %s because it was invalid." msgid_plural "You missed %hu messages from %s because they were invalid." -msgstr[0] "" -"Nem kapott meg %hu üzenetet a következőtől: %s, mert az érvénytelen volt." -msgstr[1] "" -"Nem kapott meg %hu üzenetet a következőtől: %s, mert az érvénytelen volt." +msgstr[0] "Nem kapott meg %hu üzenetet a következőtől: %s, mert az érvénytelen volt." +msgstr[1] "Nem kapott meg %hu üzenetet a következőtől: %s, mert az érvénytelen volt." #, c-format msgid "You missed %hu message from %s because it was too large." msgid_plural "You missed %hu messages from %s because they were too large." -msgstr[0] "" -"Nem kapott meg %hu üzenetet a következőtől: %s, mert az túl nagy volt." -msgstr[1] "" -"Nem kapott meg %hu üzenetet a következőtől: %s, mert az túl nagy volt." +msgstr[0] "Nem kapott meg %hu üzenetet a következőtől: %s, mert az túl nagy volt." +msgstr[1] "Nem kapott meg %hu üzenetet a következőtől: %s, mert az túl nagy volt." # #: ../src/protocols/oscar/oscar.c:1605 # #, c-format # msgid "You missed %d message from %s because the rate limit has been exceeded." #, c-format -msgid "" -"You missed %hu message from %s because the rate limit has been exceeded." -msgid_plural "" -"You missed %hu messages from %s because the rate limit has been exceeded." +msgid "You missed %hu message from %s because the rate limit has been exceeded." +msgid_plural "You missed %hu messages from %s because the rate limit has been exceeded." msgstr[0] "" "Nem kapott meg %hu üzenetet a következőtől: %s, mert túllépte a küldés " "gyakoriságának a korlátját." @@ -6640,10 +6593,8 @@ "gyakoriságának a korlátját." #, c-format -msgid "" -"You missed %hu message from %s because his/her warning level is too high." -msgid_plural "" -"You missed %hu messages from %s because his/her warning level is too high." +msgid "You missed %hu message from %s because his/her warning level is too high." +msgid_plural "You missed %hu messages from %s because his/her warning level is too high." msgstr[0] "" "Nem kapott meg %hu üzenetet a következőtől: %s, mert a feladó " "figyelmeztetési szintje túl magas volt." @@ -6653,8 +6604,7 @@ #, c-format msgid "You missed %hu message from %s because your warning level is too high." -msgid_plural "" -"You missed %hu messages from %s because your warning level is too high." +msgid_plural "You missed %hu messages from %s because your warning level is too high." msgstr[0] "" "Nem kapott meg %hu üzenetet a következőtől: %s, mert az Ön figyelmeztetési " "szintje túl magas." @@ -6818,8 +6768,7 @@ msgid "Account Info" msgstr "Fiókinformációk" -msgid "" -"Your IM Image was not sent. You must be Direct Connected to send IM Images." +msgid "Your IM Image was not sent. You must be Direct Connected to send IM Images." msgstr "" "Az Ön IM képe nem lett elküldve. IM képek küldéséhez közvetlen kapcsolatban " "kell lennie." @@ -6843,10 +6792,8 @@ msgid_plural "" "The maximum profile length of %d bytes has been exceeded. It has been " "truncated for you." -msgstr[0] "" -"A profil mérete túllépte a maximális %d bájtot. Ez csonkításra került." -msgstr[1] "" -"A profil mérete túllépte a maximális %d bájtot. Ez csonkításra került." +msgstr[0] "A profil mérete túllépte a maximális %d bájtot. Ez csonkításra került." +msgstr[1] "A profil mérete túllépte a maximális %d bájtot. Ez csonkításra került." msgid "Profile too long." msgstr "A profil túl hosszú." @@ -6879,10 +6826,10 @@ "kezdődniük, és betűket, számokat és szóközöket, vagy csak számokból " "állhatnak." -msgid "Unable To Add" +msgid "Unable to Add" msgstr "Nem sikerült felvenni" -msgid "Unable To Retrieve Buddy List" +msgid "Unable to Retrieve Buddy List" msgstr "Nem lehet lekérni a partnerek listáját" msgid "" @@ -6948,8 +6895,7 @@ msgstr "_Váltás:" msgid "Your IM Image was not sent. You cannot send IM Images in AIM chats." -msgstr "" -"Az Ön IM képe nem lett elküldve. Nem küldhet IM képeket AIM csevegésekbe." +msgstr "Az Ön IM képe nem lett elküldve. Nem küldhet IM képeket AIM csevegésekbe." msgid "iTunes Music Store Link" msgstr "iTunes zenebolt hivatkozás" @@ -7081,8 +7027,7 @@ #, c-format msgid "Asking %s to connect to us at %s:%hu for Direct IM." -msgstr "" -"%s felkérése, hogy kapcsolódjon hozzánk ezen: %s:%hu közvetlen kapcsolattal." +msgstr "%s felkérése, hogy kapcsolódjon hozzánk ezen: %s:%hu közvetlen kapcsolattal." #, c-format msgid "Attempting to connect to %s:%hu." @@ -7105,42 +7050,6 @@ "képekhez. Ezzel láthatóvá válik az IP címe, ami veszélyeztetheti a " "magánszférája biztonságát." -msgid "Primary Information" -msgstr "Elsődleges információk" - -msgid "Personal Introduction" -msgstr "Személyes bemutatkozás" - -msgid "QQ Number" -msgstr "QQ szám" - -msgid "Country/Region" -msgstr "Ország/terület" - -msgid "Province/State" -msgstr "Megye/állam" - -msgid "Horoscope Symbol" -msgstr "Horoszkóp szimbólum" - -msgid "Zodiac Sign" -msgstr "Zodiákus jel" - -msgid "Blood Type" -msgstr "Vércsoport" - -msgid "College" -msgstr "Főiskola" - -msgid "Zipcode" -msgstr "Irányítószám" - -msgid "Cellphone Number" -msgstr "Mobil telefonszám" - -msgid "Phone Number" -msgstr "Telefonszám" - msgid "Aquarius" msgstr "Vízöntő" @@ -7216,186 +7125,228 @@ msgid "Other" msgstr "Egyéb" -#, fuzzy -msgid "Modify information" +msgid "Visible" +msgstr "Látható" + +msgid "Firend Only" +msgstr "Csak barát" + +msgid "Private" +msgstr "Magánjellegű" + +msgid "QQ Number" +msgstr "QQ szám" + +msgid "Country/Region" +msgstr "Ország/terület" + +msgid "Province/State" +msgstr "Megye/állam" + +msgid "Zipcode" +msgstr "Irányítószám" + +msgid "Phone Number" +msgstr "Telefonszám" + +msgid "Authorize adding" +msgstr "Felvétel engedélyezése" + +msgid "Cellphone Number" +msgstr "Mobil telefonszám" + +msgid "Personal Introduction" +msgstr "Személyes bemutatkozás" + +msgid "City/Area" +msgstr "Város/terület" + +msgid "Publish Mobile" +msgstr "Mobil közzététele" + +msgid "Publish Contact" +msgstr "Kapcsolat közzététele" + +msgid "College" +msgstr "Főiskola" + +msgid "Horoscope" +msgstr "Horoszkóp" + +msgid "Zodiac" +msgstr "Zodiákus" + +msgid "Blood" +msgstr "Vércsoport" + +msgid "True" +msgstr "Igaz" + +msgid "False" +msgstr "Hamis" + +msgid "Modify Contact" +msgstr "Partner módosítása" + +msgid "Modify Address" +msgstr "Cím módosítása" + +msgid "Modify Extended Information" +msgstr "Bővített információk módosítása" + +msgid "Modify Information" msgstr "Információk módosítása" -#, fuzzy -msgid "Update information" -msgstr "Információk frissítése" - -#. TODO: We don't really need to notify the user about this, do we? -#. TODO: Does the user really need to be notified about this? -msgid "QQ Buddy" -msgstr "QQ partner" - -msgid "Successed:" -msgstr "Sikeres:" - -msgid "Change buddy information." -msgstr "Partnerinformációk módosítása." - -#, c-format -msgid "" -"Setting custom faces is not currently supported. Please choose an image from " -"%s." -msgstr "" -"Az egyéni arcképek beállítása jelenleg nem támogatott. Válasszon egy képet " -"innen: %s." - -msgid "Invalid QQ Face" -msgstr "Érvénytelen QQ arckép" - -#, c-format -msgid "You rejected %d's request" -msgstr "Visszautasította %d kérését" - -msgid "Reject request" -msgstr "Kérés visszautasítása" - -#. title -#, fuzzy -msgid "Sorry, you are not my style..." +msgid "Update" +msgstr "Frissítés" + +msgid "Could not change buddy information." +msgstr "A partnerinformációk nem módosíthatók." + +#, c-format +msgid "%d needs Q&A" +msgstr "%d Q&A-t igényel" + +msgid "Add buddy Q&A" +msgstr "Partner Q&A hozzáadása" + +msgid "Input answer here" +msgstr "Írja be ide a válaszát" + +msgid "Send" +msgstr "Küldés" + +msgid "Invalid answer." +msgstr "Érvénytelen válasz." + +msgid "Authorization denied message:" +msgstr "Hozzáférés elutasítva üzenet:" + +msgid "Sorry, You are not my style." msgstr "Bocs, nem vagy az esetem…" -msgid "Add buddy with auth request failed" -msgstr "A partner felvétele felhatalmazási kéréssel meghiúsult" - -msgid "Failed:" -msgstr "Sikertelen:" - -msgid "Remove buddy" -msgstr "Partner törlése" - -msgid "Remove from other's buddy list" -msgstr "Eltávolítás mások partnerlistájáról" - -#, fuzzy, c-format +#, c-format msgid "%d needs authentication" msgstr "A(z) %d felhasználó felhatalmazást kér" +msgid "Add buddy authorize" +msgstr "Partnerengedélyezés felvétele" + msgid "Input request here" msgstr "Írja be ide kérését" -#. TODO: Awkward string to fix post string freeze - standardize auth dialogues? -evands msgid "Would you be my friend?" msgstr "Leszünk barátok?" -#. multiline -#. masked -#. hint -msgid "Send" -msgstr "Küldés" - -#, c-format -msgid "Add into %d's buddy list" -msgstr "Hozzáadás %d partnerlistájához" - -msgid "QQ Number Error" -msgstr "QQ számhiba" +msgid "QQ Buddy" +msgstr "QQ partner" + +msgid "Add buddy" +msgstr "Partner hozzáadása" msgid "Invalid QQ Number" msgstr "Érvénytelen QQ szám" +msgid "Failed sending authorize" +msgstr "Az engedély küldése meghiúsult" + +#, c-format +msgid "Failed removing buddy %d" +msgstr "A partner (%d) eltávolítása meghiúsult" + +#, c-format +msgid "Failed removing me from %d's buddy list" +msgstr "Az eltávolításom %d partnerlistájáról meghiúsult" + +msgid "No reason given" +msgstr "Nincs ok megadva" + +#. only need to get value +#, c-format +msgid "You have been added by %s" +msgstr "%s felvette" + +msgid "Would you like to add him?" +msgstr "Szeretné felvenni?" + +#, c-format +msgid "Rejected by %s" +msgstr "%s visszautasította" + +#, c-format +msgid "Message: %s" +msgstr "Üzenet: %s" + msgid "ID: " msgstr "Azonosító: " msgid "Group ID" msgstr "Csoportazonosító" -msgid "Creator" -msgstr "Létrehozó" - -msgid "Group Description" -msgstr "Csoportleírás" - -msgid "Auth" -msgstr "Engedélyezés" - msgid "QQ Qun" msgstr "QQ Qun" msgid "Please enter Qun number" msgstr "Adja meg a Qun számot" -#, fuzzy msgid "You can only search for permanent Qun\n" msgstr "Csak állandó Qun-t kereshet\n" -#, fuzzy, c-format -msgid "%d request to join Qun %d" -msgstr "A(z) %d felhasználó csatlakozni szeretne a(z) %d Qun-hoz" - -#, c-format -msgid "Message: %s" -msgstr "Üzenet: %s" +msgid "Not member" +msgstr "Nem tag" + +msgid "Member" +msgstr "Tag" + +msgid "Requesting" +msgstr "Kérés" + +msgid "Admin" +msgstr "Rendszergazda" + +msgid "Notice" +msgstr "Megjegyzés" + +msgid "Detail" +msgstr "Részletek" + +msgid "Creator" +msgstr "Létrehozó" + +msgid "About me" +msgstr "A névjegyem" + +msgid "Category" +msgstr "Kategória" + +msgid "The Qun does not allow others to join" +msgstr "Ez a Qun nem engedélyezi mások csatlakozását" + +msgid "Join QQ Qun" +msgstr "Csatlakozás QQ Qun-hoz" + +#, c-format +msgid "Successfully joined Qun %s (%d)" +msgstr "Sikeresen csatlakozott a(z) %s Qun-hoz (%d)" + +msgid "Successfully joined Qun" +msgstr "Sikeresen csatlakozott a Qun-hoz" + +#, c-format +msgid "Qun %d denied to join" +msgstr "A Qun (%d) megtagadta a csatlakozást" msgid "QQ Qun Operation" msgstr "QQ Qun művelet" -msgid "Approve" -msgstr "Jóváhagyás" - -#, fuzzy, c-format -msgid "Failed to join Qun %d, operated by admin %d" -msgstr "Partner csatlakoztatása a csevegéshez sikertelen" - -#, fuzzy, c-format -msgid "Successed to join Qun %d, operated by admin %d" -msgstr "Partner csatlakoztatása a csevegéshez sikertelen" - -#, fuzzy, c-format -msgid "[%d] removed from Qun \"%d\"" -msgstr "Ön [%d] kilépett a következő csoportból: „%d”" - -#, fuzzy -msgid "Notice:" -msgstr "Megjegyzés" - -#, fuzzy, c-format -msgid "[%d] added to Qun \"%d\"" -msgstr "Ön [%d] kilépett a következő csoportból: „%d”" - -msgid "I am not a member" -msgstr "Nem vagyok tag" - -msgid "I am a member" -msgstr "Tag vagyok" - -#, fuzzy -msgid "I am requesting" -msgstr "Hibás kérés" - -msgid "I am the admin" -msgstr "Admin vagyok" - -msgid "Unknown status" -msgstr "Ismeretlen állapot" - -#, fuzzy -msgid "The Qun does not allow others to join" -msgstr "Ez a csoport nem engedélyezi mások csatlakozását" - -#, fuzzy -msgid "Remove from Qun" -msgstr "Csoport törlése" - -#, fuzzy -msgid "Join to Qun" -msgstr "Csatlakozás csevegéshez" - -#, c-format -msgid "Qun %d denied to join" -msgstr "" +msgid "Failed:" +msgstr "Sikertelen:" msgid "Join Qun, Unknow Reply" -msgstr "" - -msgid "You entered a group ID outside the acceptable range" -msgstr "Az elfogadható tartományon kívüli csoportazonosítót adott meg" - -msgid "Are you sure you want to leave this Qun?" -msgstr "Biztos, hogy el kívánja hagyni ezt a Qun-t?" +msgstr "Csatlakozás Qun-hoz, ismeretlen válasz" + +msgid "Quit Qun" +msgstr "Kilépés a Qun-ból" msgid "" "Note, if you are the creator, \n" @@ -7404,44 +7355,47 @@ "Ne feledje, ha Ön hozta létre,\n" "akkor ez a művelet törli a Qun-t." -#. we want to see window -msgid "Do you want to approve the request?" -msgstr "Jóvá kívánja hagyni a kérést?" - -#, fuzzy -msgid "Change Qun member" -msgstr "Telefonszám" - -#, fuzzy -msgid "Change Qun information" -msgstr "Csatornainformációk" +msgid "Sorry, you are not our style ..." +msgstr "Bocs, nem vagy az esetünk…" + +msgid "Successfully changed Qun member" +msgstr "Sikeresen módosított egy Qun tagot" + +msgid "Successfully changed Qun information" +msgstr "Sikeresen módosította a Qun információkat" msgid "You have successfully created a Qun" msgstr "Sikeresen létrehozott egy Qun-t" -#, fuzzy -msgid "Would you like to set up the detail information now?" -msgstr "Be kívánja állítani most a Qun részleteit?" +msgid "Would you like to set detailed information now?" +msgstr "Be kívánja állítani most a részletes információkat?" msgid "Setup" msgstr "Beállítás" -#, fuzzy, c-format -msgid "" -"%s\n" -"\n" -"%s" -msgstr "%s (%s)" - -#, fuzzy -msgid "QQ Server News" -msgstr "ICQ közvetítő kiszolgáló" - -msgid "System Message" -msgstr "Rendszerüzenet" - -msgid "Failed to send IM." -msgstr "Az azonnali üzenet küldése meghiúsult." +#, c-format +msgid "%d requested to join Qun %d for %s" +msgstr "A(z) %d felhasználó csatlakozni szeretne a(z) %d Qun-hoz, ok: %s" + +#, c-format +msgid "%d request to join Qun %d" +msgstr "A(z) %d felhasználó csatlakozni szeretne a(z) %d Qun-hoz" + +#, c-format +msgid "Failed to join Qun %d, operated by admin %d" +msgstr "A csatlakozás sikertelen a(z) %d Qun-hoz, amelyet %d admin működtet" + +#, c-format +msgid "Joining Qun %d is approved by admin %d for %s" +msgstr "A csatlakozást a Qun-hoz (%d) jóváhagyta %d admin %s számára" + +#, c-format +msgid "Removed buddy %d." +msgstr "%d partner eltávolítva." + +#, c-format +msgid "New buddy %d joined." +msgstr "Új partner (%d) csatlakozott." #, c-format msgid "Unknown-%d" @@ -7450,9 +7404,6 @@ msgid "Level" msgstr "Szint" -msgid "Member" -msgstr "Tag" - msgid " VIP" msgstr " VIP" @@ -7468,9 +7419,8 @@ msgid " Video" msgstr " Videó" -#, fuzzy msgid " Zone" -msgstr "Nincs" +msgstr " zóna" msgid "Flag" msgstr "Jelző" @@ -7481,77 +7431,104 @@ msgid "Invalid name" msgstr "Érvénytelen név" -#, c-format -msgid "Current Online: %d
\n" -msgstr "Jelenleg elérhető: %d
\n" - -#, c-format -msgid "Last Refresh: %s
\n" -msgstr "Utolsó frissítés: %s
\n" - -#, fuzzy, c-format +msgid "Select icon..." +msgstr "Válasszon ikont…" + +#, c-format +msgid "Login time: %d-%d-%d, %d:%d:%d
\n" +msgstr "Bejelentkezés ideje: %d-%d-%d, %d:%d:%d
\n" + +#, c-format +msgid "Total Online Buddies: %d
\n" +msgstr "Elérhető partnerek összesen: %d
\n" + +#, c-format +msgid "Last Refresh: %d-%d-%d, %d:%d:%d
\n" +msgstr "Utolsó frissítés: %d-%d-%d, %d:%d:%d

\n" + +#, c-format msgid "Server: %s
\n" -msgstr "Kiszolgáló: %s: %d
\n" +msgstr "Kiszolgáló: %s
\n" + +#, c-format +msgid "Client Tag: %s
\n" +msgstr "Klienscímke: %s
\n" #, c-format msgid "Connection Mode: %s
\n" msgstr "Kapcsolat módja: %s
\n" -#, fuzzy, c-format -msgid "My Internet Address: %s
\n" -msgstr "Kapcsolat módja: %s
\n" - -#, fuzzy, c-format +#, c-format +msgid "My Internet IP: %s:%d
\n" +msgstr "IP-címem: %s:%d
\n" + +#, c-format msgid "Sent: %lu
\n" -msgstr "Kiszolgáló: %s: %d
\n" - -#, fuzzy, c-format +msgstr "Elküldve: %lu
\n" + +#, c-format msgid "Resend: %lu
\n" -msgstr "Kiszolgáló: %s: %d
\n" - -#, fuzzy, c-format +msgstr "Újraküldés: %lu
\n" + +#, c-format msgid "Lost: %lu
\n" -msgstr "Utolsó frissítés: %s
\n" - -#, fuzzy, c-format +msgstr "Elveszett: %lu
\n" + +#, c-format msgid "Received: %lu
\n" -msgstr "Kiszolgáló: %s: %d
\n" - -#, fuzzy, c-format +msgstr "Fogadott: %lu
\n" + +#, c-format msgid "Received Duplicate: %lu
\n" -msgstr "Nyilvános IP címem: %s
\n" - -#, c-format -msgid "Login Time: %s
\n" -msgstr "Bejelentkezés ideje: %s
\n" - -#, c-format -msgid "Last Login IP: %s
\n" -msgstr "Utolsó bejelentkezési IP: %s
\n" - -#, c-format -msgid "Last Login Time: %s\n" -msgstr "Utolsó bejelentkezés ideje: %s\n" +msgstr "Másodpéldány érkezett: %lu
\n" + +#, c-format +msgid "Time: %d-%d-%d, %d:%d:%d
\n" +msgstr "Idő: %d-%d-%d, %d:%d:%d
\n" + +#, c-format +msgid "IP: %s
\n" +msgstr "IP: %s
\n" msgid "Login Information" msgstr "Bejelentkezési információk" -msgid "Set My Information" -msgstr "Saját információk beállítása" +msgid "

Original Author:
\n" +msgstr "

Eredeti szerző:
\n" + +msgid "

Code Contributors:
\n" +msgstr "

Közreműködők:
\n" + +msgid "

Lovely Patch Writers:
\n" +msgstr "

Javítások:
\n" + +msgid "

Acknowledgement:
\n" +msgstr "

Köszönetnyilvánítás:
\n" + +msgid "

And, all the boys in the backroom...
\n" +msgstr "

és a háttéremberek...
\n" + +msgid "Feel free to join us! :)" +msgstr "csatlakozzon bátran :)" + +#, c-format +msgid "About OpenQ r%s" +msgstr "Az OpenQ r%s névjegye" + +msgid "Change Icon" +msgstr "Ikon módosítása" msgid "Change Password" msgstr "Jelszó módosítása" -#, fuzzy msgid "Account Information" -msgstr "Az azonosító jellemzői" - -#, fuzzy -msgid "Leave the QQ Qun" -msgstr "Kilépés ebből a QQ Qun-ből" - -msgid "Block this buddy" -msgstr "A partner tiltása" +msgstr "Fiókinformációk" + +msgid "Update all QQ Quns" +msgstr "Minden QQ Qun frissítése" + +msgid "About OpenQ" +msgstr "Az OpenQ névjegye" #. *< type #. *< ui_requirement @@ -7563,60 +7540,103 @@ #. *< version #. * summary #. * description -msgid "QQ Protocol\tPlugin" -msgstr "QQ protokoll\tbővítmény" - -#, fuzzy +msgid "QQ Protocol Plugin" +msgstr "QQ protokollbővítmény" + msgid "Auto" msgstr "Auto" -#, fuzzy +msgid "Select Server" +msgstr "Válassza ki a kiszolgálót" + +msgid "QQ2005" +msgstr "QQ2005" + +msgid "QQ2007" +msgstr "QQ2007" + +msgid "QQ2008" +msgstr "QQ2008" + +#. #endif msgid "Connect by TCP" msgstr "Kapcsolódás TCP segítségével" -#, fuzzy msgid "Show server notice" -msgstr "Kiszolgáló portja" - -#, fuzzy +msgstr "Kiszolgálómegjegyzés megjelenítése" + msgid "Show server news" -msgstr "Kiszolgáló címe" - -msgid "Keep alive interval(s)" -msgstr "Kapcsolat-fenntartási időköz" - -msgid "Update interval(s)" -msgstr "Frissítési időköz" - -#, c-format -msgid "Invalid token reply code, 0x%02X" -msgstr "Érvénytelen jelsorválaszkód, 0x%02X" +msgstr "Kiszolgálóhírek megjelenítése" + +msgid "Keep alive interval (seconds)" +msgstr "Kapcsolat-fenntartási időköz (mp)" + +msgid "Update interval (seconds)" +msgstr "Frissítési időköz (mp)" + +msgid "Can not decrypt server reply" +msgstr "Nem fejthető vissza a kiszolgáló válasza" + +msgid "Can not decrypt get server reply" +msgstr "Nem fejthető vissza a kiszolgálólekérdezés válasza" + +#, c-format +msgid "Failed requesting token, 0x%02X" +msgstr "A jelsor lekérése meghiúsult: 0x%02X" #, c-format msgid "Invalid token len, %d" msgstr "Érvénytelen jelsorhossz: %d" -msgid "Unable login for not support Redirect_EX now" -msgstr "" - -#, fuzzy, c-format -msgid "Error password: %s" -msgstr "Hiba a jelszó módosításakor" - -#, c-format -msgid "Need active: %s" -msgstr "" - -#, fuzzy, c-format -msgid "Unable login for unknow reply code 0x%02X" -msgstr "Érvénytelen jelsorválaszkód, 0x%02X" +#. extend redirect used in QQ2006 +msgid "Redirect_EX is not currently supported" +msgstr "A Redirect_EX jelenleg nem támogatott" + +#. need activation +#. need activation +#. need activation +msgid "Activation required" +msgstr "Aktiválás szükséges" + +#, c-format +msgid "Unknow reply code when login (0x%02X)" +msgstr "Ismeretlen válaszkód bejelentkezéskor (0x%02X)" msgid "Keep alive error" msgstr "Kapcsolat-fenntartási hiba" -#, fuzzy -msgid "Failed to connect all servers" -msgstr "Nem sikerült a kiszolgálóhoz kapcsolódni" +msgid "Requesting captcha ..." +msgstr "Captcha kérése…" + +msgid "Checking code of captcha ..." +msgstr "A captcha kódjának ellenőrzése…" + +msgid "Failed captcha verify" +msgstr "A captcha ellenőrzése meghiúsult" + +msgid "Captcha Image" +msgstr "Captcha kép" + +msgid "Enter code" +msgstr "Adja meg a kódot" + +msgid "QQ Captcha Verifing" +msgstr "QQ captcha ellenőrzés" + +msgid "Enter the text from the image" +msgstr "Adja meg a szöveget a képről" + +#, c-format +msgid "Unknow reply code when checking password (0x%02X)" +msgstr "Ismeretlen válaszkód a jelszó ellenőrzésekor (0x%02X)" + +#, c-format +msgid "" +"Unknow reply code when login (0x%02X):\n" +"%s" +msgstr "" +"Ismeretlen válaszkód bejelentkezéskor (0x%02X):\n" +"%s" #. we didn't successfully connect. tdt->toc_fd is valid here msgid "Unable to connect." @@ -7642,54 +7662,77 @@ msgid "Connection lost" msgstr "A kapcsolat elveszett" -#. Update the login progress status display -#, fuzzy, c-format +msgid "Get server ..." +msgstr "Kiszolgáló lekérdezése…" + msgid "Request token" -msgstr "Kérés elutasítva" +msgstr "Jelsor kérése" msgid "Couldn't resolve host" msgstr "Nem sikerült a kiszolgáló feloldása" -#, fuzzy msgid "Invalid server or port" -msgstr "Érvénytelen hiba" - -#, c-format -msgid "Connecting server %s, retries %d" -msgstr "Kapcsolódási a(z) %s kiszolgálóhoz, újrapróbálkozás: %d" - -#, fuzzy +msgstr "Érvénytelen kiszolgáló vagy port" + +msgid "Connecting server ..." +msgstr "Kapcsolódás kiszolgálóhoz…" + msgid "QQ Error" -msgstr "QQid hiba" - -#, fuzzy +msgstr "QQ hiba" + +msgid "Failed to send IM." +msgstr "Az azonnali üzenet küldése meghiúsult." + +#, c-format +msgid "" +"Server News:\n" +"%s\n" +"%s\n" +"%s" +msgstr "" +"Kiszolgáló hírei:\n" +"%s\n" +"%s\n" +"%s" + +#, c-format +msgid "From %s:" +msgstr "Feladó: %s:" + +#, c-format +msgid "" +"Server notice From %s: \n" +"%s" +msgstr "" +"Kiszolgálómegjegyzés ettől: %s\n" +"%s" + msgid "Unknow SERVER CMD" -msgstr "Ismeretlen ok" - -#, fuzzy, c-format +msgstr "Ismeretlen kiszolgálóparancs" + +#, c-format msgid "" "Error reply of %s(0x%02X)\n" "Room %d, reply 0x%02X" msgstr "" -"Válasz: %s(0x%02X )\n" -"Elküldve: %s(0x%02X )\n" -"Szobaazonosító: %d, válasz: [0x%02X]: \n" -"%s" - -#, fuzzy +"Hiba %s(0x%02X) válaszában\n" +"Szoba: %d, válasz: 0x%02X" + msgid "QQ Qun Command" -msgstr "Parancs" - -#, fuzzy, c-format -msgid "You are not a member of QQ Qun \"%s\"\n" -msgstr "Ön nem tagja a következő csoportnak: „%s”\n" +msgstr "QQ Qun parancs" + +#, c-format +msgid "Not a member of room \"%s\"\n" +msgstr "Ön nem tagja a következő szobának: „%s”\n" msgid "Can not decrypt login reply" msgstr "Nem fejthető vissza a bejelentkezési válasz" -#, fuzzy -msgid "Unknow reply CMD" -msgstr "Ismeretlen ok" +msgid "Unknow LOGIN CMD" +msgstr "Ismeretlen bejelentkezési parancs" + +msgid "Unknow CLIENT CMD" +msgstr "Ismeretlen kliensparancs" #, c-format msgid "%d has declined the file %s" @@ -7702,63 +7745,6 @@ msgid "%d canceled the transfer of %s" msgstr "%d megszakította a(z) %s átvitelét" -#, fuzzy -msgid "Do you approve the requestion?" -msgstr "Jóvá kívánja hagyni a kérést?" - -#, fuzzy -msgid "Do you add the buddy?" -msgstr "Fel kívánja venni ezt a partnert?" - -#. only need to get value -#, c-format -msgid "You have been added by %s" -msgstr "%s felvette" - -msgid "Would you like to add him?" -msgstr "Szeretné felvenni?" - -#, fuzzy, c-format -msgid "%s added you [%s] to buddy list" -msgstr "%s felvette Önt a partnerlistájára." - -#, fuzzy -msgid "QQ Budy" -msgstr "Partner" - -#, c-format -msgid "Requestion rejected by %s" -msgstr "" - -#, c-format -msgid "Requestion approved by %s" -msgstr "" - -#. TODO: this should go through purple_account_request_authorization() -#, c-format -msgid "%s wants to add you [%s] as a friend" -msgstr "%s fel kívánja venni Önt [%s] barátként" - -#, fuzzy, c-format -msgid "%s is not in buddy list" -msgstr "%s nincs a partnerlistáján" - -#, fuzzy -msgid "Would you add?" -msgstr "Szeretné felvenni?" - -#, fuzzy, c-format -msgid "From %s:" -msgstr "Feladó %s:" - -#, c-format -msgid "%s" -msgstr "%s" - -#, fuzzy -msgid "QQ Server Notice" -msgstr "Kiszolgáló portja" - msgid "Connection closed (writing)" msgstr "Kapcsolat lezárva (írás)" @@ -7808,8 +7794,7 @@ msgstr "Szolgáltatások indítása" #, c-format -msgid "" -"A Sametime administrator has issued the following announcement on server %s" +msgid "A Sametime administrator has issued the following announcement on server %s" msgstr "" "Egy Sametime adminisztrátor a következő bejelentést adta ki a(z) %s " "kiszolgálón" @@ -8460,8 +8445,7 @@ msgstr "Titkos csatorna beállítása" #, c-format -msgid "" -"You have to join the %s channel before you are able to join the private group" +msgid "You have to join the %s channel before you are able to join the private group" msgstr "" "Mielőtt csatlakozhatna a magáncsoporthoz, csatlakoznia kell a(z) %s " "csatornához" @@ -8529,8 +8513,7 @@ #, c-format msgid "%s set channel %s modes to: %s" -msgstr "" -"%s átállította a(z) %s csatorna üzemmódjait a következőkre: %s" +msgstr "%s átállította a(z) %s csatorna üzemmódjait a következőkre: %s" #, c-format msgid "%s removed all channel %s modes" @@ -8713,8 +8696,7 @@ #, c-format msgid "Received %s's public key. Would you like to accept this public key?" -msgstr "" -"%s nyilvános kulcsa megérkezett. El kívánja fogadni ezt a nyilvános kulcsot?" +msgstr "%s nyilvános kulcsa megérkezett. El kívánja fogadni ezt a nyilvános kulcsot?" #, c-format msgid "" @@ -8746,8 +8728,7 @@ msgid "Key Exchange failed" msgstr "Kulcscsere sikertelen" -msgid "" -"Resuming detached session failed. Press Reconnect to create new connection." +msgid "Resuming detached session failed. Press Reconnect to create new connection." msgstr "" "A leválasztott folyamat folytatása sikertelen. Kattintson az Újrakapcsolódás " "gombra egy új kapcsolat létrehozásához." @@ -8930,8 +8911,7 @@ msgstr "whois <becenév>: A becenévhez tartozó információk megjelenítése" msgid "msg <nick> <message>: Send a private message to a user" -msgstr "" -"msg <becenév> <message>: Magánüzenet küldése a felhasználónak" +msgstr "msg <becenév> <message>: Magánüzenet küldése a felhasználónak" msgid "query <nick> [<message>]: Send a private message to a user" msgstr "" @@ -9000,12 +8980,10 @@ "csatornáról" msgid "info [server]: View server administrative details" -msgstr "" -"info [kiszolgáló]: A kiszolgáló adminisztrációs részleteinek megjelenítése" +msgstr "info [kiszolgáló]: A kiszolgáló adminisztrációs részleteinek megjelenítése" msgid "ban [<channel> +|-<nick>]: Ban client from channel" -msgstr "" -"ban [<csatorna> +|-<becenév>]: Kliens kitiltása a csatornáról" +msgstr "ban [<csatorna> +|-<becenév>]: Kliens kitiltása a csatornáról" msgid "getkey <nick|server>: Retrieve client's or server's public key" msgstr "" @@ -9182,8 +9160,7 @@ #, c-format msgid "Failure: Remote does not trust/support your public key" -msgstr "" -"Hiba: A távoli fél nem bízik meg vagy nem támogatja az Ön nyilvános kulcsát" +msgstr "Hiba: A távoli fél nem bízik meg vagy nem támogatja az Ön nyilvános kulcsát" #, c-format msgid "Failure: Remote does not support proposed KE group" @@ -9314,8 +9291,7 @@ #, c-format msgid "A message has been dropped, you are exceeding the server speed limit." -msgstr "" -"Egy üzenet el lett dobva, Ön túllépte a kiszolgáló átviteli sebességhatárát." +msgstr "Egy üzenet el lett dobva, Ön túllépte a kiszolgáló átviteli sebességhatárát." #, c-format msgid "Chat in %s is not available." @@ -9477,9 +9453,6 @@ msgid "Yahoo! system message for %s:" msgstr "Yahoo! rendszerüzenet %s számára:" -msgid "Authorization denied message:" -msgstr "Hozzáférés elutasítva üzenet:" - #, c-format msgid "" "%s has (retroactively) denied your request to add them to your list for the " @@ -9777,8 +9750,7 @@ #, c-format msgid "%s declined your conference invitation to room \"%s\" because \"%s\"." -msgstr "" -"%s visszalépett az Ön meghívásától a(z) „%s” konferenciaszobába, mivel: „%s”." +msgstr "%s visszalépett az Ön meghívásától a(z) „%s” konferenciaszobába, mivel: „%s”." msgid "Invitation Rejected" msgstr "Meghívás visszautasítva" @@ -9895,8 +9867,7 @@ "sub <osztály> <példány> <címzett>: Csatlakozás új " "csevegéshez" -msgid "" -"zi <instance>: Send a message to <message,instance,*>" +msgid "zi <instance>: Send a message to <message,instance,*>" msgstr "" "zi <példány>: Üzenet küldése a következőnek: <üzenet,példány," "*>" @@ -10373,9 +10344,9 @@ "Welcome to %s!\n" "\n" "You have no IM accounts configured. To start connecting with %s press the " -"Add button below and configure your first account. If you want %s to " -"connect to multiple IM accounts, press Add again to configure them " -"all.\n" +"Add... button below and configure your first account. If you want %s " +"to connect to multiple IM accounts, press Add... again to configure " +"them all.\n" "\n" "You can come back to this window to add, edit, or remove accounts from " "Accounts->Manage Accounts in the Buddy List window" @@ -10385,7 +10356,7 @@ "Nincsenek beállítva azonnaliüzenő-fiókjai. A %s használatának megkezdéséhez " "kattintson az alábbi Hozzáadás gombra és állítsa be első fiókját. Ha " "azt szeretné hogy a %s több fiókhoz csatlakozzon, kattintson újra a " -"Hozzáadás gombra és állítsa be mindet.\n" +"Hozzáadás… gombra és állítsa be mindet.\n" "\n" "A Partnerlista ablak Fiókok -> Fiókok kezelése menüpontja " "segítségével visszatérhet ehhez az ablakhoz fiókok hozzáadásához, " @@ -10393,8 +10364,7 @@ #, c-format msgid "You have %d contact named %s. Would you like to merge them?" -msgid_plural "" -"You currently have %d contacts named %s. Would you like to merge them?" +msgid_plural "You currently have %d contacts named %s. Would you like to merge them?" msgstr[0] "Jelenleg %d %s nevű partnere van. Össze kívánja vonni ezeket?" msgstr[1] "Jelenleg %d %s nevű partnere van. Össze kívánja vonni ezeket?" @@ -10450,9 +10420,6 @@ msgid "Hide when offline" msgstr "Elrejtés, ha nem érhető el" -msgid "Show when offline" -msgstr "Megjelenítés, ha elérhető" - msgid "_Alias..." msgstr "Ál_név…" @@ -10499,8 +10466,7 @@ msgid "/Tools/Mute Sounds" msgstr "/Eszközök/Hangok némítása" -msgid "" -"You are not currently signed on with an account that can add that buddy." +msgid "You are not currently signed on with an account that can add that buddy." msgstr "" "Jelenleg nincs bejelentkezve olyan hálózatra, amelyen felvehetné ezt a " "partnert." @@ -10728,8 +10694,7 @@ #, c-format msgid "%d account was disabled because you signed on from another location:" -msgid_plural "" -"%d accounts were disabled because you signed on from another location:" +msgid_plural "%d accounts were disabled because you signed on from another location:" msgstr[0] "%d fiók letiltva, mivel bejelentkezett egy másik helyről:" msgstr[1] "%d fiók letiltva, mivel bejelentkezett egy másik helyről:" @@ -10814,8 +10779,8 @@ msgid "Auto_join when account becomes online." msgstr "Automatikus _csatlakozás a fiók elérhetővé válásakor." -msgid "_Hide chat when the window is closed." -msgstr "Cse_vegés elrejtése az ablak bezárásakor." +msgid "_Remain in chat after window is closed." +msgstr "Csevegésben mara_dás az ablak bezárásakor." msgid "Please enter the name of the group to be added." msgstr "Adja meg a felvenni kívánt csoport nevét." @@ -10848,18 +10813,13 @@ msgid "SSL Servers" msgstr "SSL kiszolgálók" -#, fuzzy -msgid "Network disconnected" -msgstr "A távoli fél bontotta a kapcsolatot" - msgid "Unknown command." msgstr "Ismeretlen parancs." msgid "That buddy is not on the same protocol as this chat." msgstr "A partner nem ugyanazt a protokollt használja, mint ez a csevegés." -msgid "" -"You are not currently signed on with an account that can invite that buddy." +msgid "You are not currently signed on with an account that can invite that buddy." msgstr "" "Jelenleg nincs bejelentkezve olyan fiókkal, mellyel meghívhatná ezt a " "partnert." @@ -11193,8 +11153,12 @@ msgid "Fatal Error" msgstr "Végzetes hiba" -msgid "developer" -msgstr "fejlesztő" +# fixme: jobb ötlet? +msgid "bug master" +msgstr "hibaritkító" + +msgid "artist" +msgstr "grafikus" #. feel free to not translate this msgid "Ka-Hing Cheung" @@ -11203,11 +11167,8 @@ msgid "support" msgstr "támogató" -msgid "support/QA" -msgstr "támogató/QA" - -msgid "developer & webmaster" -msgstr "fejlesztő és webmester" +msgid "webmaster" +msgstr "webmester" msgid "Senior Contributor/QA" msgstr "Veterán közreműködő/QA" @@ -11225,8 +11186,11 @@ msgid "hacker and designated driver [lazy bum]" msgstr "hacker és kijelölt vezető" -msgid "XMPP developer" -msgstr "XMPP fejlesztő" +msgid "support/QA" +msgstr "támogató/QA" + +msgid "XMPP" +msgstr "XMPP" msgid "original author" msgstr "eredeti szerző" @@ -11475,8 +11439,7 @@ #, c-format msgid "IRC: #pidgin on irc.freenode.net

" -msgstr "" -"IRC: #pidgin az irc.freenode.net hálózaton

" +msgstr "IRC: #pidgin az irc.freenode.net hálózaton

" msgid "Current Developers" msgstr "Jelenlegi fejlesztők" @@ -11490,9 +11453,6 @@ msgid "Retired Crazy Patch Writers" msgstr "Visszavonult őrült patch szerzők" -msgid "Artists" -msgstr "Grafikusok" - msgid "Current Translators" msgstr "Jelenlegi fordítók" @@ -11589,8 +11549,7 @@ msgstr "_Csoport eltávolítása" #, c-format -msgid "" -"You are about to remove %s from your buddy list. Do you want to continue?" +msgid "You are about to remove %s from your buddy list. Do you want to continue?" msgstr "%s eltávolítására készül a partnerlistájáról. Folytatni akarja?" msgid "Remove Buddy" @@ -11603,8 +11562,7 @@ msgid "" "You are about to remove the chat %s from your buddy list. Do you want to " "continue?" -msgstr "" -"%s csevegés eltávolítására készül a partnerlistájáról. Folytatni akarja?" +msgstr "%s csevegés eltávolítására készül a partnerlistájáról. Folytatni akarja?" msgid "Remove Chat" msgstr "Csevegés eltávolítása" @@ -11736,8 +11694,7 @@ msgstr "Hiperhivatkozás előfényszíne" msgid "Color to draw hyperlinks when mouse is over them." -msgstr "" -"Hiperhivatkozások rajzolásához használt szín, amikor az egér rájuk mutat." +msgstr "Hiperhivatkozások rajzolásához használt szín, amikor az egér rájuk mutat." msgid "Sent Message Name Color" msgstr "Elküldött üzenet névszíne" @@ -11860,8 +11817,7 @@ msgid "" "Please enter the URL and description of the link that you want to insert. " "The description is optional." -msgstr "" -"Adja meg a beszúrandó hivatkozás URL címét és leírását. A leírás opcionális." +msgstr "Adja meg a beszúrandó hivatkozás URL címét és leírását. A leírás opcionális." msgid "Please enter the URL of the link that you want to insert." msgstr "Adja meg a beszúrandó hivatkozás URL címét." @@ -12013,8 +11969,7 @@ msgid "" "Are you sure you want to permanently delete the system log which started at %" "s?" -msgstr "" -"Biztos, hogy törölni akarja a(z) %s időpontban kezdődött rendszernaplót?" +msgstr "Biztos, hogy törölni akarja a(z) %s időpontban kezdődött rendszernaplót?" msgid "Delete Log?" msgstr "Törli a naplót?" @@ -12028,8 +11983,7 @@ #, c-format msgid "Conversation with %s on %s" -msgstr "" -"Társalgás ezzel: %s, ekkor: %s" +msgstr "Társalgás ezzel: %s, ekkor: %s" #. Steal the "HELP" response and use it to trigger browsing to the logs folder msgid "_Browse logs folder" @@ -12109,11 +12063,6 @@ "and post the backtrace from the core file. If you do not know\n" "how to get the backtrace, please read the instructions at\n" "%swiki/GetABacktrace\n" -"\n" -"If you need further assistance, please IM either SeanEgn or \n" -"LSchiere (via AIM). Contact information for Sean and Luke \n" -"on other protocols is at\n" -"%swiki/DeveloperPages\n" msgstr "" "A %s %s összeomlott és megpróbált kiírni egy magfájlt.\n" "Ez a szoftver és nem az Ön hibája miatt történt.\n" @@ -12127,12 +12076,6 @@ "szerezze be a visszakövetést, akkor olvassa el a következő címen található\n" "utasításokat:\n" "%swiki/GetABacktrace\n" -"\n" -"Ha további segítségre van szüksége, akkor küldjön azonnali üzenetet (AIM " -"protokollon, angolul)\n" -"SeanEgn-nak vagy LSchiere-nek. Sean és Luke kapcsolatinformációi más\n" -"protokollokhoz elérhetők a következő oldalon:\n" -"%swiki/DeveloperPages\n" #. Translators may want to transliterate the name. #. It is not to be translated. @@ -12168,8 +12111,7 @@ msgid "Error launching \"%s\": %s" msgstr "Hiba „%s” indításakor: %s" -msgid "" -"The 'Manual' browser command has been chosen, but no command has been set." +msgid "The 'Manual' browser command has been chosen, but no command has been set." msgstr "A „Kézi” böngészőparancsot választotta, de nem adott meg parancsot." msgid "The following plugins will be unloaded." @@ -12604,11 +12546,9 @@ msgid "Sounds when conversation has _focus" msgstr "Hangok lejátszása, ha a társalgás ablaka a_ktív" -#, fuzzy msgid "_Enable sounds:" msgstr "Hangok _engedélyezése:" -#, fuzzy msgid "V_olume:" msgstr "H_angerő:" @@ -12833,13 +12773,11 @@ msgid "Custom Smiley Manager" msgstr "Egyénihangulatjel-kezelő" -#, fuzzy msgid "Click to change your buddyicon for this account." -msgstr "Ezen _partnerikon használata a fiókhoz:" - -#, fuzzy +msgstr "Kattintson a fiók partnerikonjának módosításához." + msgid "Click to change your buddyicon for all accounts." -msgstr "Ezen _partnerikon használata a fiókhoz:" +msgstr "Kattintson az összes fiók partnerikonjának módosításához." msgid "Waiting for network connection" msgstr "Várakozás a hálózati kapcsolatra" @@ -12938,8 +12876,7 @@ #, c-format msgid "The file '%s' is too large for %s. Please try a smaller image.\n" -msgstr "" -"A(z) „%s” fájl túl nagy a következőhöz: %s. Próbálkozzon kisebb képpel.\n" +msgstr "A(z) „%s” fájl túl nagy a következőhöz: %s. Próbálkozzon kisebb képpel.\n" msgid "Icon Error" msgstr "Ikonhiba" @@ -12952,8 +12889,7 @@ msgstr "Nem sikerült megnyitni a(z) „%s” fájlt: %s" #, c-format -msgid "" -"Failed to load image '%s': reason not known, probably a corrupt image file" +msgid "Failed to load image '%s': reason not known, probably a corrupt image file" msgstr "" "A(z) „%s” kép betöltése sikertelen: az ok nem ismert, valószínűleg sérült a " "képfájl" @@ -12976,8 +12912,11 @@ msgid "_Invite" msgstr "Meg_hívás" -msgid "_Modify" -msgstr "_Módosítás" +msgid "_Modify..." +msgstr "_Módosítás…" + +msgid "_Add..." +msgstr "Hozzá_adás…" msgid "_Open Mail" msgstr "_Levél megnyitása" @@ -13000,6 +12939,12 @@ msgid "none" msgstr "nincs" +msgid "Small" +msgstr "Kicsi" + +msgid "Smaller versions of the default smilies" +msgstr "Az alapértelmezett hangulatjelek kisebb változatai" + msgid "Response Probability:" msgstr "Válasz valószínűsége:" @@ -13083,8 +13028,7 @@ #. *< name #. *< version #. *< summary -msgid "" -"Allows for controlling the values associated with different buddy states." +msgid "Allows for controlling the values associated with different buddy states." msgstr "" "Lehetővé teszi a partnerek különböző állapotaihoz rendelt értékek " "beállítását." @@ -13149,8 +13093,7 @@ msgstr "Társalgások száma ablakonként" msgid "Separate IM and Chat windows when placing by number" -msgstr "" -"Azonnali üzenő- és csevegőablakok elkülönítése szám szerinti elhelyezésnél" +msgstr "Azonnali üzenő- és csevegőablakok elkülönítése szám szerinti elhelyezésnél" #. *< type #. *< ui_requirement @@ -13359,8 +13302,7 @@ #. * summary #. * description msgid "Iconifies the buddy list and your conversations when you go away." -msgstr "" -"Ikonállapotba helyezi a partnerlistát és a társalgásokat, amikor távol van." +msgstr "Ikonállapotba helyezi a partnerlistát és a társalgásokat, amikor távol van." msgid "Mail Checker" msgstr "Levélfigyelő" @@ -13369,8 +13311,7 @@ msgstr "Új helyi levél érkezését ellenőrzi." msgid "Adds a small box to the buddy list that shows if you have new mail." -msgstr "" -"Kis dobozt ad a partnerlistához, amely megjelenik új levél érkezésekor." +msgstr "Kis dobozt ad a partnerlistához, amely megjelenik új levél érkezésekor." msgid "Markerline" msgstr "Jelölő vonal" @@ -13470,6 +13411,9 @@ msgid "Set window manager \"_URGENT\" hint" msgstr "„_SÜRGŐS” tipp beállítása az ablakkezelő számára" +msgid "_Flash window" +msgstr "_Ablak villogtatása" + #. Raise window method button msgid "R_aise conversation window" msgstr "_Társalgási ablak előtérbe hozása" @@ -13516,8 +13460,7 @@ #. * summary #. * description msgid "Provides a variety of ways of notifying you of unread messages." -msgstr "" -"Különböző lehetőségeket nyújt az olvasatlan üzenetekre figyelmeztetésre." +msgstr "Különböző lehetőségeket nyújt az olvasatlan üzenetekre figyelmeztetésre." #. *< type #. *< ui_requirement @@ -13934,8 +13877,7 @@ msgid "Options specific to Pidgin for Windows." msgstr "A windowsos Pidginre jellemző beállítások." -msgid "" -"Provides options specific to Pidgin for Windows , such as buddy list docking." +msgid "Provides options specific to Pidgin for Windows , such as buddy list docking." msgstr "" "A windowsos Pidginre jellemző beállításokat biztosít, mint például a " "partnerlista dokkolása." @@ -13979,122 +13921,3 @@ "Ez a bővítmény XMPP kiszolgálókban vagy kliensekben végzett hibakereséshez " "hasznos." -#, fuzzy -#~ msgid "EOF while reading from resolver process" -#~ msgstr "" -#~ "Hiba a feloldó folyamatból olvasás közben:\n" -#~ "%s" - -#, fuzzy -#~ msgid "Your information has been updated" -#~ msgstr "A jelszava meg lett változtatva." - -#, fuzzy -#~ msgid "You have successfully removed a buddy" -#~ msgstr "Sikeresen létrehozott egy Qun-t" - -#, fuzzy -#~ msgid "You have successfully removed yourself from your friend's buddy list" -#~ msgstr "%s eltávolította Önt a partnerlistájáról." - -#, fuzzy -#~ msgid "You have added %d to buddy list" -#~ msgstr "%s felvette Önt [%s] a partnerlistájára" - -#, fuzzy -#~ msgid "Invalid QQid" -#~ msgstr "Érvénytelen authzid" - -#, fuzzy -#~ msgid "Please enter external group ID" -#~ msgstr "Adja meg %s új nevét" - -#, fuzzy -#~ msgid "Reason: %s" -#~ msgstr "Verzió: \t%s\n" - -#, fuzzy -#~ msgid "Your request to join group %d has been rejected by admin %d" -#~ msgstr "" -#~ "A csatlakozási kérelmét a(z) %d csoporthoz %d admin visszautasította" - -#, fuzzy -#~ msgid "Your request to join group %d has been approved by admin %d" -#~ msgstr "" -#~ "A csatlakozási kérelmét a(z) %d csoporthoz %d admin visszautasította" - -#, fuzzy -#~ msgid "You [%d] have left group \"%d\"" -#~ msgstr "Ön [%d] fel lett véve a következő csoportba: „%d”" - -#, fuzzy -#~ msgid "You [%d] have been added to group \"%d\"" -#~ msgstr "%s felvette" - -#, fuzzy -#~ msgid "This group has been added to your buddy list" -#~ msgstr "%s felvette Önt a partnerlistájára." - -#, fuzzy -#~ msgid "You have successfully left the group" -#~ msgstr "Sikeresen létrehozott egy Qun-t" - -#, fuzzy -#~ msgid "Enter your reason:" -#~ msgstr "Írja be alább a jegyzetet…" - -#, fuzzy -#~ msgid "You have successfully modified Qun member" -#~ msgstr "Sikeresen létrehozott egy Qun-t" - -#, fuzzy -#~ msgid "You have successfully modified Qun information" -#~ msgstr "Sikeresen létrehozott egy Qun-t" - -#, fuzzy -#~ msgid " Space" -#~ msgstr "MySpace" - -#, fuzzy -#~ msgid "Real hostname: %s: %d
\n" -#~ msgstr "Utolsó frissítés: %s
\n" - -#, fuzzy -#~ msgid "My Public IP: %s
\n" -#~ msgstr "Utolsó bejelentkezési IP: %s
\n" - -#, fuzzy -#~ msgid "Show Login Information" -#~ msgstr "Bejelentkezési információk" - -#, fuzzy -#~ msgid "resend interval(s)" -#~ msgstr "Frissítési időköz" - -#, fuzzy -#~ msgid "Failed to connect server" -#~ msgstr "Nem sikerült a kiszolgálóhoz kapcsolódni." - -#, fuzzy -#~ msgid "Unable to login. Check debug log." -#~ msgstr "A bővítmény nem tölthető be" - -#, fuzzy -#~ msgid "Unable to login" -#~ msgstr "A bővítmény nem tölthető be" - -#, fuzzy -#~ msgid "Failed room reply" -#~ msgstr "A partner eltávolítása sikertelen" - -#, fuzzy -#~ msgid "User %s rejected your request" -#~ msgstr "Visszautasította %d kérését" - -#, fuzzy -#~ msgid "User %s approved your request" -#~ msgstr "Jóvá kívánja hagyni a kérést?" - -#, fuzzy -#~ msgid "Notice from: %s" -#~ msgstr "Megjegyzés"