# HG changeset patch # User Sadrul Habib Chowdhury # Date 1198013221 0 # Node ID 65e23b7a4398627af3569c900b3965735775be11 # Parent ae08b1e3ef63113a8c5a1d0a772e3365cd1ac264# Parent 7efb9a7de5615a559af441a5d882893da86a3791 propagate from branch 'im.pidgin.pidgin.next.minor' (head 10ff46ff55aee3830dd003ed89866809b5f290ac) to branch 'im.pidgin.pidgin' (head 94224c6b7f9215a59d27023874ccec8a0b803093) diff -r ae08b1e3ef63 -r 65e23b7a4398 Makefile.am --- a/Makefile.am Tue Dec 18 15:15:19 2007 +0000 +++ b/Makefile.am Tue Dec 18 21:27:01 2007 +0000 @@ -30,10 +30,12 @@ distcheck-hook: libpurple/plugins/perl/common/Purple.pm pidgin/plugins/perl/common/Pidgin.pm # cp libpurple/plugins/perl/common/Gaim.pm $(distdir)/libpurple/plugins/perl/common +if ENABLE_GTK appsdir = $(datadir)/applications apps_in_files = pidgin.desktop.in apps_DATA = $(apps_in_files:.desktop.in=.desktop) @INTLTOOL_DESKTOP_RULE@ +endif if ENABLE_GTK GTK_DIR=pidgin diff -r ae08b1e3ef63 -r 65e23b7a4398 libpurple/dnsquery.c --- a/libpurple/dnsquery.c Tue Dec 18 15:15:19 2007 +0000 +++ b/libpurple/dnsquery.c Tue Dec 18 21:27:01 2007 +0000 @@ -547,7 +547,7 @@ { #ifdef HAVE_GETADDRINFO g_snprintf(message, sizeof(message), _("Error resolving %s:\n%s"), - query_data->hostname, gai_strerror(err)); + query_data->hostname, purple_gai_strerror(err)); #else g_snprintf(message, sizeof(message), _("Error resolving %s: %d"), query_data->hostname, err); @@ -695,7 +695,7 @@ } freeaddrinfo(tmp); } else { - query_data->error_message = g_strdup_printf(_("Error resolving %s:\n%s"), query_data->hostname, gai_strerror(rc)); + query_data->error_message = g_strdup_printf(_("Error resolving %s:\n%s"), query_data->hostname, purple_gai_strerror(rc)); } #else if ((hp = gethostbyname(query_data->hostname))) { diff -r ae08b1e3ef63 -r 65e23b7a4398 libpurple/ft.c --- a/libpurple/ft.c Tue Dec 18 15:15:19 2007 +0000 +++ b/libpurple/ft.c Tue Dec 18 21:27:01 2007 +0000 @@ -479,10 +479,11 @@ /* Sending a file */ /* Check the filename. */ #ifdef _WIN32 - if (g_strrstr(filename, "../") || g_strrstr(filename, "..\\")) { + if (g_strrstr(filename, "../") || g_strrstr(filename, "..\\")) #else - if (g_strrstr(filename, "../")) { + if (g_strrstr(filename, "../")) #endif + { char *utf8 = g_filename_to_utf8(filename, -1, NULL, NULL, NULL); msg = g_strdup_printf(_("%s is not a valid filename.\n"), utf8); diff -r ae08b1e3ef63 -r 65e23b7a4398 libpurple/log.c --- a/libpurple/log.c Tue Dec 18 15:15:19 2007 +0000 +++ b/libpurple/log.c Tue Dec 18 21:27:01 2007 +0000 @@ -348,7 +348,6 @@ void(*get_log_sets)(PurpleLogSetCallback cb, GHashTable *sets), gboolean(*remove)(PurpleLog *log), gboolean(*is_deletable)(PurpleLog *log)) -{ #endif PurpleLogLogger *logger; va_list args; diff -r ae08b1e3ef63 -r 65e23b7a4398 libpurple/network.c --- a/libpurple/network.c Tue Dec 18 15:15:19 2007 +0000 +++ b/libpurple/network.c Tue Dec 18 21:27:01 2007 +0000 @@ -289,7 +289,7 @@ errnum = getaddrinfo(NULL /* any IP */, serv, &hints, &res); if (errnum != 0) { #ifndef _WIN32 - purple_debug_warning("network", "getaddrinfo: %s\n", gai_strerror(errnum)); + purple_debug_warning("network", "getaddrinfo: %s\n", purple_gai_strerror(errnum)); if (errnum == EAI_SYSTEM) purple_debug_warning("network", "getaddrinfo: system error: %s\n", g_strerror(errno)); #else diff -r ae08b1e3ef63 -r 65e23b7a4398 libpurple/protocols/jabber/jabber.c --- a/libpurple/protocols/jabber/jabber.c Tue Dec 18 15:15:19 2007 +0000 +++ b/libpurple/protocols/jabber/jabber.c Tue Dec 18 21:27:01 2007 +0000 @@ -388,9 +388,29 @@ g_free(txt); } +static void jabber_pong_cb(JabberStream *js, xmlnode *packet, gpointer timeout) +{ + g_source_remove(GPOINTER_TO_INT(timeout)); +} + +static gboolean jabber_pong_timeout(PurpleConnection *gc) +{ + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Ping timeout")); + return FALSE; +} + void jabber_keepalive(PurpleConnection *gc) { - jabber_send_raw(gc->proto_data, "\t", -1); + JabberIq *iq = jabber_iq_new(gc->proto_data, JABBER_IQ_GET); + guint timeout; + + xmlnode *ping = xmlnode_new_child(iq->node, "ping"); + xmlnode_set_namespace(ping, "urn:xmpp:ping"); + + timeout = purple_timeout_add_seconds(20, (GSourceFunc)(jabber_pong_timeout), gc); + jabber_iq_set_callback(iq, jabber_pong_cb, GINT_TO_POINTER(timeout)); + jabber_iq_send(iq); } static void diff -r ae08b1e3ef63 -r 65e23b7a4398 libpurple/protocols/msn/soap.c --- a/libpurple/protocols/msn/soap.c Tue Dec 18 15:15:19 2007 +0000 +++ b/libpurple/protocols/msn/soap.c Tue Dec 18 21:27:01 2007 +0000 @@ -813,10 +813,8 @@ purple_debug_info("MSN SOAP", "Currently processing another SOAP request\n"); } else { purple_debug_info("MSN SOAP", "No requests left to dispatch\n"); +#endif } -#else - } -#endif } diff -r ae08b1e3ef63 -r 65e23b7a4398 libpurple/request.c --- a/libpurple/request.c Tue Dec 18 15:15:19 2007 +0000 +++ b/libpurple/request.c Tue Dec 18 21:27:01 2007 +0000 @@ -1208,6 +1208,7 @@ g_return_val_if_fail(ok_text != NULL, NULL); g_return_val_if_fail(ok_cb != NULL, NULL); + g_return_val_if_fail(cancel_text != NULL, NULL); ops = purple_request_get_ui_ops(); @@ -1296,6 +1297,7 @@ g_return_val_if_fail(fields != NULL, NULL); g_return_val_if_fail(ok_text != NULL, NULL); g_return_val_if_fail(ok_cb != NULL, NULL); + g_return_val_if_fail(cancel_text != NULL, NULL); ops = purple_request_get_ui_ops(); diff -r ae08b1e3ef63 -r 65e23b7a4398 libpurple/request.h --- a/libpurple/request.h Tue Dec 18 15:15:19 2007 +0000 +++ b/libpurple/request.h Tue Dec 18 21:27:01 2007 +0000 @@ -183,39 +183,53 @@ */ typedef struct { + /** @see purple_request_input(). */ void *(*request_input)(const char *title, const char *primary, - const char *secondary, const char *default_value, - gboolean multiline, gboolean masked, gchar *hint, - const char *ok_text, GCallback ok_cb, - const char *cancel_text, GCallback cancel_cb, - PurpleAccount *account, const char *who, PurpleConversation *conv, - void *user_data); + const char *secondary, const char *default_value, + gboolean multiline, gboolean masked, gchar *hint, + const char *ok_text, GCallback ok_cb, + const char *cancel_text, GCallback cancel_cb, + PurpleAccount *account, const char *who, + PurpleConversation *conv, void *user_data); + + /** @see purple_request_choice_varg(). */ void *(*request_choice)(const char *title, const char *primary, - const char *secondary, int default_value, - const char *ok_text, GCallback ok_cb, - const char *cancel_text, GCallback cancel_cb, - PurpleAccount *account, const char *who, PurpleConversation *conv, - void *user_data, va_list choices); + const char *secondary, int default_value, + const char *ok_text, GCallback ok_cb, + const char *cancel_text, GCallback cancel_cb, + PurpleAccount *account, const char *who, + PurpleConversation *conv, void *user_data, + va_list choices); + + /** @see purple_request_action_varg(). */ void *(*request_action)(const char *title, const char *primary, - const char *secondary, int default_action, - PurpleAccount *account, const char *who, PurpleConversation *conv, - void *user_data, size_t action_count, - va_list actions); + const char *secondary, int default_action, + PurpleAccount *account, const char *who, + PurpleConversation *conv, void *user_data, + size_t action_count, va_list actions); + + /** @see purple_request_fields(). */ void *(*request_fields)(const char *title, const char *primary, - const char *secondary, PurpleRequestFields *fields, - const char *ok_text, GCallback ok_cb, - const char *cancel_text, GCallback cancel_cb, - PurpleAccount *account, const char *who, PurpleConversation *conv, - void *user_data); + const char *secondary, PurpleRequestFields *fields, + const char *ok_text, GCallback ok_cb, + const char *cancel_text, GCallback cancel_cb, + PurpleAccount *account, const char *who, + PurpleConversation *conv, void *user_data); + + /** @see purple_request_file(). */ void *(*request_file)(const char *title, const char *filename, - gboolean savedialog, GCallback ok_cb, GCallback cancel_cb, - PurpleAccount *account, const char *who, PurpleConversation *conv, - void *user_data); + gboolean savedialog, GCallback ok_cb, + GCallback cancel_cb, PurpleAccount *account, + const char *who, PurpleConversation *conv, + void *user_data); + void (*close_request)(PurpleRequestType type, void *ui_handle); + + /** @see purple_request_folder(). */ void *(*request_folder)(const char *title, const char *dirname, - GCallback ok_cb, GCallback cancel_cb, - PurpleAccount *account, const char *who, PurpleConversation *conv, - void *user_data); + GCallback ok_cb, GCallback cancel_cb, + PurpleAccount *account, const char *who, + PurpleConversation *conv, void *user_data); void (*_purple_reserved1)(void); void (*_purple_reserved2)(void); @@ -1159,198 +1173,247 @@ * Prompts the user for text input. * * @param handle The plugin or connection handle. For some - * things this is EXTREMELY important. The - * handle is used to programmatically close - * the request dialog when it is no longer - * needed. For PRPLs this is often a pointer - * to the PurpleConnection instance. For plugins - * this should be a similar, unique memory - * location. This value is important because - * it allows a request to be closed, say, when - * you sign offline. If the request is NOT - * closed it is VERY likely to cause a crash - * whenever the callback handler functions are - * triggered. - * @param title The title of the message. - * @param primary The main point of the message. - * @param secondary The secondary information. + * things this is extremely important. The + * handle is used to programmatically close the request + * dialog when it is no longer needed. For PRPLs this + * is often a pointer to the #PurpleConnection + * instance. For plugins this should be a similar, + * unique memory location. This value is important + * because it allows a request to be closed with + * purple_request_close_with_handle() when, for + * example, you sign offline. If the request is + * not closed it is very + * likely to cause a crash whenever the callback + * handler functions are triggered. + * @param title The title of the message, or @c NULL if it should have + * no title. + * @param primary The main point of the message, or @c NULL if you're + * feeling enigmatic. + * @param secondary Secondary information, or @c NULL if there is none. * @param default_value The default value. - * @param multiline TRUE if the inputted text can span multiple lines. - * @param masked TRUE if the inputted text should be masked in some way. + * @param multiline @c TRUE if the inputted text can span multiple lines. + * @param masked @c TRUE if the inputted text should be masked in some + * way (such as by displaying characters as stars). This + * might be because the input is some kind of password. * @param hint Optionally suggest how the input box should appear. - * Use "html," for example, to allow the user to enter + * Use "html", for example, to allow the user to enter * HTML. - * @param ok_text The text for the @c OK button. - * @param ok_cb The callback for the @c OK button. - * @param cancel_text The text for the @c Cancel button. - * @param cancel_cb The callback for the @c Cancel button. - * @param account The PurpleAccount associated with this request, or NULL if none is - * @param who The username of the buddy assocaited with this request, or NULL if none is - * @param conv The PurpleConversation associated with this request, or NULL if none is + * @param ok_text The text for the @c OK button, which may not be @c NULL. + * @param ok_cb The callback for the @c OK button, which may not be @c + * NULL. + * @param cancel_text The text for the @c Cancel button, which may not be @c + * NULL. + * @param cancel_cb The callback for the @c Cancel button, which may be + * @c NULL. + * @param account The #PurpleAccount associated with this request, or @c + * NULL if none is. + * @param who The username of the buddy associated with this request, + * or @c NULL if none is. + * @param conv The #PurpleConversation associated with this request, or + * @c NULL if none is. * @param user_data The data to pass to the callback. * * @return A UI-specific handle. */ -void *purple_request_input(void *handle, const char *title, - const char *primary, const char *secondary, - const char *default_value, - gboolean multiline, gboolean masked, gchar *hint, - const char *ok_text, GCallback ok_cb, - const char *cancel_text, GCallback cancel_cb, - PurpleAccount *account, const char *who, PurpleConversation *conv, - void *user_data); +void *purple_request_input(void *handle, const char *title, const char *primary, + const char *secondary, const char *default_value, gboolean multiline, + gboolean masked, gchar *hint, + const char *ok_text, GCallback ok_cb, + const char *cancel_text, GCallback cancel_cb, + PurpleAccount *account, const char *who, PurpleConversation *conv, + void *user_data); /** * Prompts the user for multiple-choice input. * - * @param handle The plugin or connection handle. For some - * things this is EXTREMELY important. See - * the comments on purple_request_input. - * @param title The title of the message. - * @param primary The main point of the message. - * @param secondary The secondary information. - * @param default_value The default value. - * @param ok_text The text for the @c OK button. - * @param ok_cb The callback for the @c OK button. - * @param cancel_text The text for the @c Cancel button. - * @param cancel_cb The callback for the @c Cancel button. - * @param account The PurpleAccount associated with this request, or NULL if none is - * @param who The username of the buddy assocaited with this request, or NULL if none is - * @param conv The PurpleConversation associated with this request, or NULL if none is + * @param handle The plugin or connection handle. For some things this + * is extremely important. See the comments on + * purple_request_input(). + * @param title The title of the message, or @c NULL if it should have + * no title. + * @param primary The main point of the message, or @c NULL if you're + * feeling enigmatic. + * @param secondary Secondary information, or @c NULL if there is none. + * @param default_value The default choice; this should be one of the values + * listed in the varargs. + * @param ok_text The text for the @c OK button, which may not be @c NULL. + * @param ok_cb The callback for the @c OK button, which may not be @c + * NULL. + * @param cancel_text The text for the @c Cancel button, which may not be @c + * NULL. + * @param cancel_cb The callback for the @c Cancel button, or @c NULL to + * do nothing. + * @param account The #PurpleAccount associated with this request, or @c + * NULL if none is. + * @param who The username of the buddy associated with this request, + * or @c NULL if none is. + * @param conv The #PurpleConversation associated with this request, or + * @c NULL if none is. * @param user_data The data to pass to the callback. - * @param ... The choices. This argument list should be - * terminated with a NULL parameter. + * @param ... The choices, which should be pairs of char * + * descriptions and int values, terminated with a + * @c NULL parameter. * * @return A UI-specific handle. */ -void *purple_request_choice(void *handle, const char *title, - const char *primary, const char *secondary, - int default_value, - const char *ok_text, GCallback ok_cb, - const char *cancel_text, GCallback cancel_cb, - PurpleAccount *account, const char *who, PurpleConversation *conv, - void *user_data, ...) G_GNUC_NULL_TERMINATED; +void *purple_request_choice(void *handle, const char *title, const char *primary, + const char *secondary, int default_value, + const char *ok_text, GCallback ok_cb, + const char *cancel_text, GCallback cancel_cb, + PurpleAccount *account, const char *who, PurpleConversation *conv, + void *user_data, ...) G_GNUC_NULL_TERMINATED; /** * Prompts the user for multiple-choice input. * - * @param handle The plugin or connection handle. For some - * things this is EXTREMELY important. See - * the comments on purple_request_input. - * @param title The title of the message. - * @param primary The main point of the message. - * @param secondary The secondary information. - * @param default_value The default value. - * @param ok_text The text for the @c OK button. - * @param ok_cb The callback for the @c OK button. - * @param cancel_text The text for the @c Cancel button. - * @param cancel_cb The callback for the @c Cancel button. - * @param account The PurpleAccount associated with this request, or NULL if none is - * @param who The username of the buddy assocaited with this request, or NULL if none is - * @param conv The PurpleConversation associated with this request, or NULL if none is + * @param handle The plugin or connection handle. For some things this + * is extremely important. See the comments on + * purple_request_input(). + * @param title The title of the message, or @c NULL if it should have + * no title. + * @param primary The main point of the message, or @c NULL if you're + * feeling enigmatic. + * @param secondary Secondary information, or @c NULL if there is none. + * @param default_value The default choice; this should be one of the values + * listed in the varargs. + * @param ok_text The text for the @c OK button, which may not be @c NULL. + * @param ok_cb The callback for the @c OK button, which may not be @c + * NULL. + * @param cancel_text The text for the @c Cancel button, which may not be @c + * NULL. + * @param cancel_cb The callback for the @c Cancel button, or @c NULL to do + * nothing. + * @param account The #PurpleAccount associated with this request, or @c + * NULL if none is + * @param who The username of the buddy associated with this request, + * or @c NULL if none is + * @param conv The #PurpleConversation associated with this request, or + * @c NULL if none is * @param user_data The data to pass to the callback. - * @param choices The choices. This argument list should be - * terminated with a @c NULL parameter. + * @param choices The choices, which should be pairs of char * + * descriptions and int values, terminated with a + * @c NULL parameter. * * @return A UI-specific handle. */ void *purple_request_choice_varg(void *handle, const char *title, - const char *primary, const char *secondary, - int default_value, - const char *ok_text, GCallback ok_cb, - const char *cancel_text, GCallback cancel_cb, - PurpleAccount *account, const char *who, PurpleConversation *conv, - void *user_data, va_list choices); + const char *primary, const char *secondary, int default_value, + const char *ok_text, GCallback ok_cb, + const char *cancel_text, GCallback cancel_cb, + PurpleAccount *account, const char *who, PurpleConversation *conv, + void *user_data, va_list choices); /** * Prompts the user for an action. * * This is often represented as a dialog with a button for each action. * - * @param handle The plugin or connection handle. For some - * things this is EXTREMELY important. See - * the comments on purple_request_input. - * @param title The title of the message. - * @param primary The main point of the message. - * @param secondary The secondary information. - * @param default_action The default value. - * @param account The PurpleAccount associated with this request, or NULL if none is - * @param who The username of the buddy assocaited with this request, or NULL if none is - * @param conv The PurpleConversation associated with this request, or NULL if none is + * @param handle The plugin or connection handle. For some things this + * is extremely important. See the comments on + * purple_request_input(). + * @param title The title of the message, or @c NULL if it should have + * no title. + * @param primary The main point of the message, or @c NULL if you're + * feeling enigmatic. + * @param secondary Secondary information, or @c NULL if there is none. + * @param default_action The default action, zero-indexed; if the third action + * supplied should be the default, supply 2. + * @param account The #PurpleAccount associated with this request, or @c + * NULL if none is. + * @param who The username of the buddy associated with this request, + * or @c NULL if none is. + * @param conv The #PurpleConversation associated with this request, or + * @c NULL if none is. * @param user_data The data to pass to the callback. * @param action_count The number of actions. * @param ... A list of actions. These are pairs of * arguments. The first of each pair is the - * string that appears on the button. It should + * char * that appears on the button. It should * have an underscore before the letter you want * to use as the accelerator key for the button. - * The second of each pair is the callback + * The second of each pair is the GCallback * function to use when the button is clicked. * * @return A UI-specific handle. */ -void *purple_request_action(void *handle, const char *title, - const char *primary, const char *secondary, - int default_action, - PurpleAccount *account, const char *who, PurpleConversation *conv, - void *user_data, size_t action_count, ...); +void *purple_request_action(void *handle, const char *title, const char *primary, + const char *secondary, int default_action, PurpleAccount *account, + const char *who, PurpleConversation *conv, void *user_data, + size_t action_count, ...); /** * Prompts the user for an action. * * This is often represented as a dialog with a button for each action. * - * @param handle The plugin or connection handle. For some - * things this is EXTREMELY important. See - * the comments on purple_request_input. - * @param title The title of the message. - * @param primary The main point of the message. - * @param secondary The secondary information. - * @param default_action The default value. - * @param account The PurpleAccount associated with this request, or NULL if none is - * @param who The username of the buddy assocaited with this request, or NULL if none is - * @param conv The PurpleConversation associated with this request, or NULL if none is + * @param handle The plugin or connection handle. For some things this + * is extremely important. See the comments on + * purple_request_input(). + * @param title The title of the message, or @c NULL if it should have + * no title. + * @param primary The main point of the message, or @c NULL if you're + * feeling enigmatic. + * @param secondary Secondary information, or @c NULL if there is none. + * @param default_action The default action, zero-indexed; if the third action + * supplied should be the default, supply 2. + * @param account The #PurpleAccount associated with this request, or @c + * NULL if none is. + * @param who The username of the buddy associated with this request, + * or @c NULL if none is. + * @param conv The #PurpleConversation associated with this request, or + * @c NULL if none is. * @param user_data The data to pass to the callback. * @param action_count The number of actions. - * @param actions A list of actions and callbacks. + * @param actions A list of actions. These are pairs of + * arguments. The first of each pair is the + * char * that appears on the button. It should + * have an underscore before the letter you want + * to use as the accelerator key for the button. + * The second of each pair is the GCallback + * function to use when the button is clicked. * * @return A UI-specific handle. */ void *purple_request_action_varg(void *handle, const char *title, - const char *primary, const char *secondary, - int default_action, - PurpleAccount *account, const char *who, PurpleConversation *conv, - void *user_data, size_t action_count, - va_list actions); + const char *primary, const char *secondary, int default_action, + PurpleAccount *account, const char *who, PurpleConversation *conv, + void *user_data, size_t action_count, va_list actions); /** * Displays groups of fields for the user to fill in. * - * @param handle The plugin or connection handle. For some - * things this is EXTREMELY important. See - * the comments on purple_request_input. - * @param title The title of the message. - * @param primary The main point of the message. - * @param secondary The secondary information. + * @param handle The plugin or connection handle. For some things this + * is extremely important. See the comments on + * purple_request_input(). + * @param title The title of the message, or @c NULL if it should have + * no title. + * @param primary The main point of the message, or @c NULL if you're + * feeling enigmatic. + * @param secondary Secondary information, or @c NULL if there is none. * @param fields The list of fields. - * @param ok_text The text for the @c OK button. - * @param ok_cb The callback for the @c OK button. - * @param cancel_text The text for the @c Cancel button. - * @param cancel_cb The callback for the @c Cancel button. - * @param account The PurpleAccount associated with this request, or NULL if none is - * @param who The username of the buddy associated with this request, or NULL if none is - * @param conv The PurpleConversation associated with this request, or NULL if none is + * @param ok_text The text for the @c OK button, which may not be @c NULL. + * @param ok_cb The callback for the @c OK button, which may not be @c + * NULL. + * @param cancel_text The text for the @c Cancel button, which may not be @c + * NULL. + * @param cancel_cb The callback for the @c Cancel button, which may be + * @c NULL. + * @param account The #PurpleAccount associated with this request, or @c + * NULL if none is + * @param who The username of the buddy associated with this request, + * or @c NULL if none is + * @param conv The #PurpleConversation associated with this request, or + * @c NULL if none is * @param user_data The data to pass to the callback. * * @return A UI-specific handle. */ -void *purple_request_fields(void *handle, const char *title, - const char *primary, const char *secondary, - PurpleRequestFields *fields, - const char *ok_text, GCallback ok_cb, - const char *cancel_text, GCallback cancel_cb, - PurpleAccount *account, const char *who, PurpleConversation *conv, - void *user_data); +void *purple_request_fields(void *handle, const char *title, const char *primary, + const char *secondary, PurpleRequestFields *fields, + const char *ok_text, GCallback ok_cb, + const char *cancel_text, GCallback cancel_cb, + PurpleAccount *account, const char *who, PurpleConversation *conv, + void *user_data); /** * Closes a request. @@ -1363,7 +1426,10 @@ /** * Closes all requests registered with the specified handle. * - * @param handle The handle. + * @param handle The handle, as supplied as the @a handle parameter to one of the + * purple_request_* functions. + * + * @see purple_request_input(). */ void purple_request_close_with_handle(void *handle); @@ -1401,50 +1467,57 @@ * Displays a file selector request dialog. Returns the selected filename to * the callback. Can be used for either opening a file or saving a file. * - * @param handle The plugin or connection handle. For some - * things this is EXTREMELY important. See - * the comments on purple_request_input. - * @param title The title for the dialog (may be @c NULL) + * @param handle The plugin or connection handle. For some things this + * is extremely important. See the comments on + * purple_request_input(). + * @param title The title of the message, or @c NULL if it should have + * no title. * @param filename The default filename (may be @c NULL) * @param savedialog True if this dialog is being used to save a file. * False if it is being used to open a file. * @param ok_cb The callback for the @c OK button. - * @param cancel_cb The callback for the @c Cancel button. - * @param account The PurpleAccount associated with this request, or NULL if none is - * @param who The username of the buddy assocaited with this request, or NULL if none is - * @param conv The PurpleConversation associated with this request, or NULL if none is + * @param cancel_cb The callback for the @c Cancel button, which may be @c NULL. + * @param account The #PurpleAccount associated with this request, or @c + * NULL if none is + * @param who The username of the buddy associated with this request, + * or @c NULL if none is + * @param conv The #PurpleConversation associated with this request, or + * @c NULL if none is * @param user_data The data to pass to the callback. * * @return A UI-specific handle. */ void *purple_request_file(void *handle, const char *title, const char *filename, - gboolean savedialog, - GCallback ok_cb, GCallback cancel_cb, - PurpleAccount *account, const char *who, PurpleConversation *conv, - void *user_data); + gboolean savedialog, GCallback ok_cb, GCallback cancel_cb, + PurpleAccount *account, const char *who, PurpleConversation *conv, + void *user_data); /** * Displays a folder select dialog. Returns the selected filename to * the callback. * - * @param handle The plugin or connection handle. For some - * things this is EXTREMELY important. See - * the comments on purple_request_input. - * @param title The title for the dialog (may be @c NULL) + * @param handle The plugin or connection handle. For some things this + * is extremely important. See the comments on + * purple_request_input(). + * @param title The title of the message, or @c NULL if it should have + * no title. * @param dirname The default directory name (may be @c NULL) * @param ok_cb The callback for the @c OK button. - * @param cancel_cb The callback for the @c Cancel button. - * @param account The PurpleAccount associated with this request, or NULL if none is - * @param who The username of the buddy assocaited with this request, or NULL if none is - * @param conv The PurpleConversation associated with this request, or NULL if none is + * @param cancel_cb The callback for the @c Cancel button, which may be @c NULL. + * @param account The #PurpleAccount associated with this request, or @c + * NULL if none is + * @param who The username of the buddy associated with this request, + * or @c NULL if none is + * @param conv The #PurpleConversation associated with this request, or + * @c NULL if none is * @param user_data The data to pass to the callback. * * @return A UI-specific handle. */ void *purple_request_folder(void *handle, const char *title, const char *dirname, - GCallback ok_cb, GCallback cancel_cb, - PurpleAccount *account, const char *who, PurpleConversation *conv, - void *user_data); + GCallback ok_cb, GCallback cancel_cb, + PurpleAccount *account, const char *who, PurpleConversation *conv, + void *user_data); /*@}*/ diff -r ae08b1e3ef63 -r 65e23b7a4398 libpurple/util.c --- a/libpurple/util.c Tue Dec 18 15:15:19 2007 +0000 +++ b/libpurple/util.c Tue Dec 18 21:27:01 2007 +0000 @@ -4257,6 +4257,53 @@ return g_string_free(workstr, FALSE); } +/* + * This function is copied from g_strerror() but changed to use + * gai_strerror(). + */ +G_CONST_RETURN gchar * +purple_gai_strerror(gint errnum) +{ + static GStaticPrivate msg_private = G_STATIC_PRIVATE_INIT; + char *msg; + int saved_errno = errno; + + const char *msg_locale; + + msg_locale = gai_strerror(errnum); + if (g_get_charset(NULL)) + { + /* This string is already UTF-8--great! */ + errno = saved_errno; + return msg_locale; + } + else + { + gchar *msg_utf8 = g_locale_to_utf8(msg_locale, -1, NULL, NULL, NULL); + if (msg_utf8) + { + /* Stick in the quark table so that we can return a static result */ + GQuark msg_quark = g_quark_from_string(msg_utf8); + g_free(msg_utf8); + + msg_utf8 = (gchar *)g_quark_to_string(msg_quark); + errno = saved_errno; + return msg_utf8; + } + } + + msg = g_static_private_get(&msg_private); + if (!msg) + { + msg = g_new(gchar, 64); + g_static_private_set(&msg_private, msg, g_free); + } + + sprintf(msg, "unknown error (%d)", errnum); + + errno = saved_errno; + return msg; +} char * purple_utf8_ncr_encode(const char *str) diff -r ae08b1e3ef63 -r 65e23b7a4398 libpurple/util.h --- a/libpurple/util.h Tue Dec 18 15:15:19 2007 +0000 +++ b/libpurple/util.h Tue Dec 18 21:27:01 2007 +0000 @@ -1110,6 +1110,17 @@ gchar *purple_utf8_salvage(const char *str); /** + * Return the UTF-8 version of gai_strerror(). It calls gai_strerror() + * then converts the result to UTF-8. This function is analogous to + * g_strerror(). + * + * @param errnum The error code. + * + * @return The UTF-8 error message. + */ +G_CONST_RETURN gchar *purple_gai_strerror(gint errnum); + +/** * Compares two UTF-8 strings case-insensitively. This string is * more expensive than a simple g_utf8_collate() comparison because * it calls g_utf8_casefold() on each string, which allocates new diff -r ae08b1e3ef63 -r 65e23b7a4398 pidgin/gtkconv.c --- a/pidgin/gtkconv.c Tue Dec 18 15:15:19 2007 +0000 +++ b/pidgin/gtkconv.c Tue Dec 18 21:27:01 2007 +0000 @@ -153,6 +153,7 @@ static void conv_set_unseen(PurpleConversation *gtkconv, PidginUnseenState state); static void gtkconv_set_unseen(PidginConversation *gtkconv, PidginUnseenState state); static void update_typing_icon(PidginConversation *gtkconv); +static void update_typing_message(PidginConversation *gtkconv, const char *message); static const char *item_factory_translate_func (const char *path, gpointer func_data); gboolean pidgin_conv_has_focus(PurpleConversation *conv); static void pidgin_conv_custom_smiley_allocated(GdkPixbufLoader *loader, gpointer user_data); @@ -3377,6 +3378,33 @@ } static void +update_typing_message(PidginConversation *gtkconv, const char *message) +{ + GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(gtkconv->imhtml)); + GtkTextMark *stmark, *enmark; + + stmark = gtk_text_buffer_get_mark(buffer, "typing-notification-start"); + enmark = gtk_text_buffer_get_mark(buffer, "typing-notification-end"); + if (stmark && enmark) { + GtkTextIter start, end; + gtk_text_buffer_get_iter_at_mark(buffer, &start, stmark); + gtk_text_buffer_get_iter_at_mark(buffer, &end, enmark); + gtk_text_buffer_delete_mark(buffer, stmark); + gtk_text_buffer_delete_mark(buffer, enmark); + gtk_text_buffer_delete(buffer, &start, &end); + } + + if (message) { + GtkTextIter iter; + gtk_text_buffer_get_end_iter(buffer, &iter); + gtk_text_buffer_create_mark(buffer, "typing-notification-start", &iter, TRUE); + gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, message, -1, "TYPING-NOTIFICATION", NULL); + gtk_text_buffer_get_end_iter(buffer, &iter); + gtk_text_buffer_create_mark(buffer, "typing-notification-end", &iter, TRUE); + } +} + +static void update_typing_icon(PidginConversation *gtkconv) { PidginWindow *gtkwin; @@ -3384,6 +3412,7 @@ PurpleConversation *conv = gtkconv->active_conv; char *stock_id; const char *tooltip; + char *message = NULL; gtkwin = gtkconv->win; @@ -3402,6 +3431,7 @@ g_source_remove(gtkconv->u.im->typing_timer); gtkconv->u.im->typing_timer = 0; } + update_typing_message(gtkconv, NULL); return; } @@ -3411,9 +3441,11 @@ } stock_id = PIDGIN_STOCK_ANIMATION_TYPING1; tooltip = _("User is typing..."); + message = g_strdup_printf(_("\n%s is typing..."), purple_conversation_get_name(conv)); } else { stock_id = PIDGIN_STOCK_ANIMATION_TYPING5; tooltip = _("User has typed something and stopped"); + message = g_strdup_printf(_("\n%s has typed something and stopped"), purple_conversation_get_name(conv)); if (gtkconv->u.im->typing_timer != 0) { g_source_remove(gtkconv->u.im->typing_timer); gtkconv->u.im->typing_timer = 0; @@ -3436,6 +3468,8 @@ } gtk_widget_show(gtkwin->menu.typing_icon); + update_typing_message(gtkconv, message); + g_free(message); } static gboolean @@ -5031,6 +5065,11 @@ g_signal_connect(G_OBJECT(gtkconv->entry), "drag_data_received", G_CALLBACK(conv_dnd_recv), gtkconv); + gtk_text_buffer_create_tag(GTK_IMHTML(gtkconv->imhtml)->text_buffer, "TYPING-NOTIFICATION", + "foreground", "#888888", + "justification", GTK_JUSTIFY_LEFT, /* XXX: RTL'ify */ + "weight", PANGO_WEIGHT_BOLD, NULL); + /* Setup the container for the tab. */ gtkconv->tab_cont = tab_cont = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); g_object_set_data(G_OBJECT(tab_cont), "PidginConversation", gtkconv); diff -r ae08b1e3ef63 -r 65e23b7a4398 pidgin/gtkimhtml.c --- a/pidgin/gtkimhtml.c Tue Dec 18 15:15:19 2007 +0000 +++ b/pidgin/gtkimhtml.c Tue Dec 18 21:27:01 2007 +0000 @@ -1136,14 +1136,13 @@ #ifdef _WIN32 /* If we're on windows, let's see if we can get data from the HTML Format clipboard before we try to paste from the GTK buffer */ - if (!clipboard_paste_html_win32(imhtml)) { + if (!clipboard_paste_html_win32(imhtml)) #endif + { GtkClipboard *clipboard = gtk_widget_get_clipboard(GTK_WIDGET(imhtml), GDK_SELECTION_CLIPBOARD); gtk_clipboard_request_contents(clipboard, gdk_atom_intern("text/html", FALSE), paste_received_cb, imhtml); -#ifdef _WIN32 } -#endif g_signal_stop_emission_by_name(imhtml, "paste-clipboard"); } @@ -3484,6 +3483,9 @@ return; } #endif /* FILECHOOSER */ +#if 0 /* mismatched curly braces */ + } +#endif /* * XXX - We should probably prompt the user to determine if they really diff -r ae08b1e3ef63 -r 65e23b7a4398 pidgin/gtkimhtmltoolbar.c --- a/pidgin/gtkimhtmltoolbar.c Tue Dec 18 15:15:19 2007 +0000 +++ b/pidgin/gtkimhtmltoolbar.c Tue Dec 18 21:27:01 2007 +0000 @@ -467,10 +467,11 @@ GtkTextMark *ins; #if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */ - if (response != GTK_RESPONSE_ACCEPT) { + if (response != GTK_RESPONSE_ACCEPT) #else /* FILECHOOSER */ - if (response != GTK_RESPONSE_OK) { + if (response != GTK_RESPONSE_OK) #endif /* FILECHOOSER */ + { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar->image), FALSE); return; } diff -r ae08b1e3ef63 -r 65e23b7a4398 pidgin/gtkmain.c --- a/pidgin/gtkmain.c Tue Dec 18 15:15:19 2007 +0000 +++ b/pidgin/gtkmain.c Tue Dec 18 21:27:01 2007 +0000 @@ -397,6 +397,7 @@ if (terse) { text = g_strdup_printf(_("%s %s. Try `%s -h' for more information.\n"), PIDGIN_NAME, DISPLAY_VERSION, name); } else { +#ifndef WIN32 text = g_strdup_printf(_("%s %s\n" "Usage: %s [OPTION]...\n\n" " -c, --config=DIR use DIR for config files\n" @@ -406,10 +407,20 @@ " -n, --nologin don't automatically login\n" " -l, --login[=NAME] automatically login (optional argument NAME specifies\n" " account(s) to use, separated by commas)\n" -#ifndef WIN32 " --display=DISPLAY X display to use\n" + " -v, --version display the current version and exit\n"), PIDGIN_NAME, DISPLAY_VERSION, name); +#else + text = g_strdup_printf(_("%s %s\n" + "Usage: %s [OPTION]...\n\n" + " -c, --config=DIR use DIR for config files\n" + " -d, --debug print debugging messages to stdout\n" + " -h, --help display this help and exit\n" + " -m, --multiple do not ensure single instance\n" + " -n, --nologin don't automatically login\n" + " -l, --login[=NAME] automatically login (optional argument NAME specifies\n" + " account(s) to use, separated by commas)\n" + " -v, --version display the current version and exit\n"), PIDGIN_NAME, DISPLAY_VERSION, name); #endif - " -v, --version display the current version and exit\n"), PIDGIN_NAME, DISPLAY_VERSION, name); } purple_print_utf8_to_console(stdout, text); diff -r ae08b1e3ef63 -r 65e23b7a4398 pidgin/gtkrequest.c --- a/pidgin/gtkrequest.c Tue Dec 18 15:15:19 2007 +0000 +++ b/pidgin/gtkrequest.c Tue Dec 18 21:27:01 2007 +0000 @@ -1489,7 +1489,9 @@ } #endif /* FILECHOOSER */ - +#if 0 /* mismatched curly braces */ + } +#endif if ((data->u.file.savedialog == TRUE) && (g_file_test(data->u.file.name, G_FILE_TEST_EXISTS))) { purple_request_action(data, NULL, _("That file already exists"), diff -r ae08b1e3ef63 -r 65e23b7a4398 pidgin/gtkutils.c --- a/pidgin/gtkutils.c Tue Dec 18 15:15:19 2007 +0000 +++ b/pidgin/gtkutils.c Tue Dec 18 21:27:01 2007 +0000 @@ -1448,7 +1448,7 @@ char *str; str = g_strdup_printf(_("The following error has occurred loading %s: %s"), - data->filename, strerror(errno)); + data->filename, g_strerror(errno)); purple_notify_error(NULL, NULL, _("Failed to load image"), str); @@ -2355,6 +2355,9 @@ } #endif /* FILECHOOSER */ +#if 0 /* mismatched curly braces */ + } +#endif if (dialog->callback) dialog->callback(filename, dialog->data); gtk_widget_destroy(dialog->icon_filesel); diff -r ae08b1e3ef63 -r 65e23b7a4398 pidgin/minidialog.c --- a/pidgin/minidialog.c Tue Dec 18 15:15:19 2007 +0000 +++ b/pidgin/minidialog.c Tue Dec 18 21:27:01 2007 +0000 @@ -35,7 +35,40 @@ #include "pidgin/pidgin.h" #include "pidgin/pidginstock.h" -G_DEFINE_TYPE (PidginMiniDialog, pidgin_mini_dialog, GTK_TYPE_VBOX) +static void pidgin_mini_dialog_init (PidginMiniDialog *self); +static void pidgin_mini_dialog_class_init (PidginMiniDialogClass *klass); + +static gpointer pidgin_mini_dialog_parent_class = NULL; + +static void +pidgin_mini_dialog_class_intern_init (gpointer klass) +{ + pidgin_mini_dialog_parent_class = g_type_class_peek_parent (klass); + pidgin_mini_dialog_class_init ((PidginMiniDialogClass*) klass); +} + +GType +pidgin_mini_dialog_get_type (void) +{ + static GType g_define_type_id = 0; + if (G_UNLIKELY (g_define_type_id == 0)) + { + static const GTypeInfo g_define_type_info = { + sizeof (PidginMiniDialogClass), + (GBaseInitFunc) NULL, + (GBaseFinalizeFunc) NULL, + (GClassInitFunc) pidgin_mini_dialog_class_intern_init, + (GClassFinalizeFunc) NULL, + NULL, /* class_data */ + sizeof (PidginMiniDialog), + 0, /* n_preallocs */ + (GInstanceInitFunc) pidgin_mini_dialog_init, + }; + g_define_type_id = g_type_register_static (GTK_TYPE_VBOX, + "PidginMiniDialog", &g_define_type_info, 0); + } + return g_define_type_id; +} enum { diff -r ae08b1e3ef63 -r 65e23b7a4398 pidgin/plugins/crazychat/cc_network.c --- a/pidgin/plugins/crazychat/cc_network.c Tue Dec 18 15:15:19 2007 +0000 +++ b/pidgin/plugins/crazychat/cc_network.c Tue Dec 18 21:27:01 2007 +0000 @@ -529,7 +529,7 @@ while (total < len) { n = send(s, buf + total, bytesleft, 0); if (n == -1) { - Debug("ERROR: %s\n", strerror(errno)); + Debug("ERROR: %s\n", g_strerror(errno)); return -1; } total += n; diff -r ae08b1e3ef63 -r 65e23b7a4398 po/POTFILES.in --- a/po/POTFILES.in Tue Dec 18 15:15:19 2007 +0000 +++ b/po/POTFILES.in Tue Dec 18 21:27:01 2007 +0000 @@ -179,6 +179,7 @@ libpurple/sslconn.c libpurple/status.c libpurple/util.c +libpurple/win32/libc_interface.c pidgin.desktop.in pidgin/eggtrayicon.c pidgin/gtkaccount.c diff -r ae08b1e3ef63 -r 65e23b7a4398 po/de.po --- a/po/de.po Tue Dec 18 15:15:19 2007 +0000 +++ b/po/de.po Tue Dec 18 21:27:01 2007 +0000 @@ -11,8 +11,8 @@ msgstr "" "Project-Id-Version: de\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2007-12-06 15:10+0100\n" -"PO-Revision-Date: 2007-12-06 15:10+0100\n" +"POT-Creation-Date: 2007-12-18 16:51+0100\n" +"PO-Revision-Date: 2007-12-18 16:50+0100\n" "Last-Translator: Jochen Kemnade \n" "Language-Team: Deutsch \n" "MIME-Version: 1.0\n" @@ -3412,12 +3412,12 @@ msgid "Plaintext Authentication" msgstr "Klartext-Authentifizierung" +msgid "Invalid response from server." +msgstr "Ungültige Serverantwort." + msgid "Server does not use any supported authentication method" msgstr "Der Server benutzt keine der unterstützten Authentifizierungsmethoden" -msgid "Invalid response from server." -msgstr "Ungültige Serverantwort." - msgid "" "This server requires plaintext authentication over an unencrypted " "connection. Allow this and continue authentication?" @@ -3830,6 +3830,9 @@ msgid "Write error" msgstr "Schreibfehler" +msgid "Ping timeout" +msgstr "Ping-Zeitüberschreitung" + msgid "Read Error" msgstr "Fehler beim Lesen" @@ -9513,26 +9516,14 @@ msgstr "Musik hören" #, c-format -msgid "%s changed status from %s to %s" -msgstr "%s hat den Status von %s zu %s geändert" - -#, c-format msgid "%s (%s) changed status from %s to %s" msgstr "%s (%s) hat den Status von %s zu %s geändert" #, c-format -msgid "%s is now %s" -msgstr "%s ist jetzt %s" - -#, c-format msgid "%s (%s) is now %s" msgstr "%s (%s) ist jetzt %s" #, c-format -msgid "%s is no longer %s" -msgstr "%s ist nicht mehr %s" - -#, c-format msgid "%s (%s) is no longer %s" msgstr "%s (%s) ist nicht mehr %s" @@ -9638,6 +9629,28 @@ msgid "Unable to connect to %s: %s" msgstr "Verbindung zu %s nicht möglich: %s" +#. 10053 +#, fuzzy, c-format +msgid "Connection interrupted by other software on your computer." +msgstr "" +"Die Verbindung wurde von einer anderen Software auf ihrem Computer " +"unterbrochen." + +#. 10054 +#, fuzzy, c-format +msgid "Remote host closed connection." +msgstr "Der entfernte Host hat die Verbindung beendet." + +#. 10060 +#, c-format +msgid "Connection timed out." +msgstr "Verbindungsabbruch wegen Zeitüberschreitung." + +#. 10061 +#, c-format +msgid "Connection refused." +msgstr "Verbindung abgelehnt." + msgid "Internet Messenger" msgstr "Internet-Sofortnachrichtendienst" @@ -11084,6 +11097,32 @@ msgstr "" "Farbe zum Darstellen von Hyperlinks, wenn sich die Maus darüber befindet." +#, fuzzy +msgid "Sent Message Name Color" +msgstr "Gesendete Nachrichten" + +msgid "Color to draw the name of a message you sent." +msgstr "" + +#, fuzzy +msgid "Received Message Name Color" +msgstr "Empfangene Nachrichten" + +msgid "Color to draw the name of a message you received." +msgstr "" + +msgid "\"Attention\" Name Color" +msgstr "" + +msgid "Color to draw the name of a message you received containing your name." +msgstr "" + +msgid "Action Message Name Color" +msgstr "" + +msgid "Color to draw the name of an action message." +msgstr "" + msgid "_Copy E-Mail Address" msgstr "Kopiere _E-Mail-Adresse" @@ -11694,8 +11733,8 @@ "This is how your outgoing message text will appear when you use protocols " "that support formatting." msgstr "" -"So wird der ausgehende Nachrichtentext aussehen, wenn Sie " -"Protokollebenutzen, die Formatierung unterstützen." +"So wird der ausgehende Nachrichtentext aussehen, wenn Sie Protokolle " +"benutzen, die Formatierung unterstützen." msgid "Cannot start proxy configuration program." msgstr "Kann das Proxy-Konfigurationsprogramm nicht starten." @@ -12773,6 +12812,10 @@ msgid "Hyperlink Color" msgstr "Hyperlink-Farbe" +#, fuzzy +msgid "Highlighted Message Name Color" +msgstr "Hervorgehobene Nachrichten" + msgid "GtkTreeView Horizontal Separation" msgstr "GtkTreeview horizontaler Abstand" @@ -13160,3 +13203,12 @@ msgid "This plugin is useful for debbuging XMPP servers or clients." msgstr "" "Dieses Plugin ist nützlich zur Fehlersuche in XMPP-Servern oder -Clients." + +#~ msgid "%s changed status from %s to %s" +#~ msgstr "%s hat den Status von %s zu %s geändert" + +#~ msgid "%s is now %s" +#~ msgstr "%s ist jetzt %s" + +#~ msgid "%s is no longer %s" +#~ msgstr "%s ist nicht mehr %s"