From: <bo...@us...> - 2006-04-16 10:11:20
|
Revision: 16038 Author: boler Date: 2006-04-16 03:10:55 -0700 (Sun, 16 Apr 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16038&view=rev Log Message: ----------- * Changed signatures of some of the search results notify API functions. * GG PRPL: Support parallel public directory searches. Modified Paths: -------------- trunk/plugins/ChangeLog.API trunk/src/gtknotify.c trunk/src/notify.c trunk/src/notify.h trunk/src/protocols/gg/gg.c trunk/src/protocols/gg/gg.h trunk/src/protocols/gg/search.c trunk/src/protocols/gg/search.h trunk/src/protocols/jabber/buddy.c trunk/src/protocols/oscar/oscar.c trunk/src/protocols/sametime/sametime.c Modified: trunk/plugins/ChangeLog.API =================================================================== --- trunk/plugins/ChangeLog.API 2006-04-15 15:01:30 UTC (rev 16037) +++ trunk/plugins/ChangeLog.API 2006-04-16 10:10:55 UTC (rev 16038) @@ -171,6 +171,8 @@ * gaim_date_full(): See gaim_date_format_full() * gaim_strftime(): See gaim_utf8_strftime() * GAIM_MESSAGE_COLORIZE + * user_data from gaim_notify_searchresults_new_rows and from + notify_searchresults in GaimNotifyUiOps. Added: * gaim_prefs_disconnect_by_handle() @@ -283,6 +285,8 @@ * gaim_gtk_clear_cursor() * GAIM_MESSAGE_ACTIVE_ONLY * gaim_proxy_get_setup() + * GaimNotifySearchResultsCallback: Added user_data. + * gaim_notify_searchresults: Added user_data. Signals - Changed: (See the Doxygen docs for details on all signals.) * Signal propagation now stops after a handler returns a non-NULL value. Modified: trunk/src/gtknotify.c =================================================================== --- trunk/src/gtknotify.c 2006-04-15 15:01:30 UTC (rev 16037) +++ trunk/src/gtknotify.c 2006-04-16 10:10:55 UTC (rev 16038) @@ -52,6 +52,8 @@ GtkListStore *model; GtkWidget *treeview; GtkWidget *window; + gpointer user_data; + } GaimNotifySearchResultsData; typedef struct @@ -157,7 +159,7 @@ } static void -searchresults_close_cb(GaimNotifySearchResultsData *data, GdkEvent *event, void *user_data) +searchresults_close_cb(GaimNotifySearchResultsData *data, GdkEvent *event, gpointer user_data) { gaim_notify_close(GAIM_NOTIFY_SEARCHRESULTS, data); } @@ -188,7 +190,7 @@ } button = bd->button; - button->callback(gaim_account_get_connection(data->account), row); + button->callback(gaim_account_get_connection(data->account), row, data->user_data); } static void * @@ -614,7 +616,7 @@ static void gaim_gtk_notify_searchresults_new_rows(GaimConnection *gc, GaimNotifySearchResults *results, - void *data_, gpointer user_data) + void *data_) { GaimNotifySearchResultsData *data = data_; GtkListStore *model = data->model; @@ -656,7 +658,7 @@ static void * gaim_gtk_notify_searchresults(GaimConnection *gc, const char *title, const char *primary, const char *secondary, - GaimNotifySearchResults *results) + GaimNotifySearchResults *results, gpointer user_data) { GtkWidget *window; GtkWidget *treeview; @@ -679,6 +681,7 @@ g_return_val_if_fail(results != NULL, NULL); data = g_malloc(sizeof(GaimNotifySearchResultsData)); + data->user_data = user_data; /* Create the window */ window = gtk_window_new(GTK_WINDOW_TOPLEVEL); @@ -824,7 +827,7 @@ data->window = window; /* Insert rows. */ - gaim_gtk_notify_searchresults_new_rows(gc, results, data, NULL); + gaim_gtk_notify_searchresults_new_rows(gc, results, data); /* Show the window */ gtk_widget_show(window); Modified: trunk/src/notify.c =================================================================== --- trunk/src/notify.c 2006-04-15 15:01:30 UTC (rev 16037) +++ trunk/src/notify.c 2006-04-16 10:10:55 UTC (rev 16038) @@ -165,7 +165,8 @@ void * gaim_notify_searchresults(GaimConnection *gc, const char *title, const char *primary, const char *secondary, - GaimNotifySearchResults *results, GaimNotifyCloseCallback cb, gpointer user_data) + GaimNotifySearchResults *results, GaimNotifyCloseCallback cb, + gpointer user_data) { GaimNotifyUiOps *ops; @@ -178,7 +179,7 @@ info->type = GAIM_NOTIFY_SEARCHRESULTS; info->handle = gc; info->ui_handle = ops->notify_searchresults(gc, title, primary, - secondary, results); + secondary, results, user_data); info->cb = cb; info->cb_user_data = user_data; @@ -225,14 +226,14 @@ void gaim_notify_searchresults_new_rows(GaimConnection *gc, GaimNotifySearchResults *results, - void *data, gpointer user_data) + void *data) { GaimNotifyUiOps *ops; ops = gaim_notify_get_ui_ops(); if (ops != NULL && ops->notify_searchresults != NULL) { - ops->notify_searchresults_new_rows(gc, results, data, user_data); + ops->notify_searchresults_new_rows(gc, results, data); } } Modified: trunk/src/notify.h =================================================================== --- trunk/src/notify.h 2006-04-15 15:01:30 UTC (rev 16037) +++ trunk/src/notify.h 2006-04-16 10:10:55 UTC (rev 16038) @@ -106,10 +106,12 @@ /** * Callback for a button in a search result. * - * @param c the GaimConnection passed to gaim_notify_searchresults - * @param row the contents of the selected row + * @param c the GaimConnection passed to gaim_notify_searchresults + * @param row the contents of the selected row + * @param user_data User defined data. */ -typedef void (*GaimNotifySearchResultsCallback)(GaimConnection *c, GList *row); +typedef void (*GaimNotifySearchResultsCallback)(GaimConnection *c, GList *row, + gpointer user_data); /** @@ -145,11 +147,11 @@ void *(*notify_searchresults)(GaimConnection *gc, const char *title, const char *primary, const char *secondary, - GaimNotifySearchResults *results); + GaimNotifySearchResults *results, gpointer user_data); void (*notify_searchresults_new_rows)(GaimConnection *gc, GaimNotifySearchResults *results, - void *data, gpointer user_data); + void *data); void *(*notify_userinfo)(GaimConnection *gc, const char *who, const char *text); @@ -184,7 +186,8 @@ * @param results The GaimNotifySearchResults instance. * @param cb The callback to call when the user closes * the notification. - * @param user_data The data to pass to the callback. + * @param user_data The data to pass to the close callback and any other + * callback associated with a button. * * @return A UI-specific handle. */ @@ -201,11 +204,10 @@ * @param gc The GaimConnection structure. * @param results The GaimNotifySearchResults structure. * @param data Data returned by the gaim_notify_searchresults(). - * @param user_data User defined data. */ void gaim_notify_searchresults_new_rows(GaimConnection *gc, GaimNotifySearchResults *results, - void *data, gpointer user_data); + void *data); /** Modified: trunk/src/protocols/gg/gg.c =================================================================== --- trunk/src/protocols/gg/gg.c 2006-04-15 15:01:30 UTC (rev 16037) +++ trunk/src/protocols/gg/gg.c 2006-04-16 10:10:55 UTC (rev 16038) @@ -504,21 +504,27 @@ /* */ -/* static void ggp_callback_show_next(GaimConnection *gc, GList *row) {{{ */ -static void ggp_callback_show_next(GaimConnection *gc, GList *row) +/* static void ggp_callback_show_next(GaimConnection *gc, GList *row, void *user_data) {{{ */ +static void ggp_callback_show_next(GaimConnection *gc, GList *row, void *user_data) { GGPInfo *info = gc->proto_data; + GGPSearchForm *form = user_data; + guint32 seq; - g_free(info->search_form->offset); - info->search_form->offset = g_strdup(info->search_form->last_uin); - ggp_search_start(gc, info->search_form); + g_free(form->offset); + form->offset = g_strdup(form->last_uin); + + ggp_search_remove(info->searches, form->seq); + + seq = ggp_search_start(gc, form); + ggp_search_add(info->searches, seq, form); } /* }}} */ /* */ -/* static void ggp_callback_add_buddy(GaimConnection *gc, GList *row) {{{ */ -static void ggp_callback_add_buddy(GaimConnection *gc, GList *row) +/* static void ggp_callback_add_buddy(GaimConnection *gc, GList *row, void *user_data) {{{ */ +static void ggp_callback_add_buddy(GaimConnection *gc, GList *row, void *user_data) { gaim_blist_request_add_buddy(gaim_connection_get_account(gc), g_list_nth_data(row, 0), NULL, NULL); @@ -532,10 +538,11 @@ { GGPInfo *info = gc->proto_data; GGPSearchForm *form; + guint32 seq; - form = ggp_search_form_new(); - info->search_form = form; + form = ggp_search_form_new(GGP_SEARCH_TYPE_FULL); + form->user_data = info; form->lastname = charset_convert( gaim_request_fields_get_string(fields, "lastname"), "UTF-8", "CP1250"); @@ -569,7 +576,8 @@ form->offset = g_strdup("0"); - ggp_search_start(gc, form); + seq = ggp_search_start(gc, form); + ggp_search_add(info->searches, seq, form); } /* }}} */ @@ -579,19 +587,11 @@ static void ggp_find_buddies(GaimPluginAction *action) { GaimConnection *gc = (GaimConnection *)action->context; - GGPInfo *info = gc->proto_data; GaimRequestFields *fields; GaimRequestFieldGroup *group; GaimRequestField *field; - if (info->search_form != NULL) { - gaim_notify_error(gc, NULL, - _("Unable to initiate a new search"), - _("You have a pending search. Please wait for it to finish.")); - return; - } - fields = gaim_request_fields_new(); group = gaim_request_field_group_new(NULL); gaim_request_fields_add_group(fields, group); @@ -947,29 +947,13 @@ /* */ -/* static void ggp_sr_close_cb(GaimAccount *account) {{{ */ -static void ggp_sr_close_cb(GaimAccount *account) +/* static void ggp_sr_close_cb(GGPSearchForm *form) {{{ */ +static void ggp_sr_close_cb(GGPSearchForm *form) { - GaimConnection *gc = gaim_account_get_connection(account); - GGPInfo *info = gc->proto_data; - GGPSearchForm *f; + GGPInfo *info = form->user_data; - info->searchresults_window = NULL; - - f = info->search_form; - g_free(f->uin); - g_free(f->lastname); - g_free(f->firstname); - g_free(f->nickname); - g_free(f->city); - g_free(f->birthyear); - g_free(f->gender); - g_free(f->active); - g_free(f->offset); - g_free(f->last_uin); - g_free(f); - - info->search_form = NULL; + ggp_search_remove(info->searches, form->seq); + ggp_search_form_destroy(form); } /* }}} */ @@ -978,21 +962,34 @@ /* static void ggp_pubdir_reply_handler(GaimConnection *gc, gg_pubdir50_t req) {{{ */ static void ggp_pubdir_reply_handler(GaimConnection *gc, gg_pubdir50_t req) { - GaimAccount *account = gaim_connection_get_account(gc); GGPInfo *info = gc->proto_data; GaimNotifySearchResults *results; GaimNotifySearchColumn *column; + GGPSearchForm *form; int res_count = 0; int start; int i; + guint32 seq; + seq = gg_pubdir50_seq(req); + form = ggp_search_get(info->searches, seq); + + if (form == NULL) { + /* + * this can happen when user will request more results + * and close the results window before they arrive. + */ + gaim_debug_error("gg", "No search form available for this search!\n"); + return; + } + res_count = gg_pubdir50_count(req); if (res_count < 1) { gaim_debug_info("gg", "GG_EVENT_PUBDIR50_SEARCH_REPLY: Nothing found\n"); gaim_notify_error(gc, NULL, _("No matching users found"), _("There are no users matching your search criteria.")); - ggp_sr_close_cb(account); + ggp_sr_close_cb(form); return; } res_count = (res_count > 20) ? 20 : res_count; @@ -1005,7 +1002,7 @@ gaim_notify_error(gc, NULL, _("Unable to display the search results."), NULL); - ggp_sr_close_cb(account); + ggp_sr_close_cb(form); return; } @@ -1049,9 +1046,8 @@ gaim_notify_searchresults_row_add(results, row); if (i == res_count - 1) { - g_free(info->search_form->last_uin); - info->search_form->last_uin = ggp_search_get_result(req, i, - GG_PUBDIR50_UIN); + g_free(form->last_uin); + form->last_uin = ggp_search_get_result(req, i, GG_PUBDIR50_UIN); } } @@ -1059,12 +1055,12 @@ ggp_callback_show_next); gaim_notify_searchresults_button_add(results, GAIM_NOTIFY_BUTTON_ADD, ggp_callback_add_buddy); - if (info->searchresults_window == NULL) { + if (form->window == NULL) { void *h = gaim_notify_searchresults(gc, _("Gadu-Gadu Public Directory"), _("Search results"), NULL, results, (GaimNotifyCloseCallback)ggp_sr_close_cb, - account); + form); if (h == NULL) { gaim_debug_error("gg", "ggp_pubdir_reply_handler: " @@ -1072,14 +1068,13 @@ gaim_notify_error(gc, NULL, _("Unable to display the search results."), NULL); - ggp_sr_close_cb(account); + ggp_sr_close_cb(form); return; } - info->searchresults_window = h; + form->window = h; } else { - gaim_notify_searchresults_new_rows(gc, results, - info->searchresults_window, NULL); + gaim_notify_searchresults_new_rows(gc, results, form->window); } } /* }}} */ @@ -1560,10 +1555,10 @@ /* Probably this should be moved to *_new() function. */ info->session = NULL; - info->searchresults_window = NULL; info->chats = NULL; info->chats_count = 0; info->token = NULL; + info->searches = ggp_search_new(); gc->proto_data = info; @@ -1606,6 +1601,8 @@ gg_logoff(info->session); gg_free_session(info->session); } + + ggp_search_destroy(info->searches); g_free(info); gc->proto_data = NULL; } @@ -1651,22 +1648,17 @@ { GGPInfo *info = gc->proto_data; GGPSearchForm *form; + guint32 seq; - if (info->search_form != NULL) { - gaim_notify_error(gc, NULL, - _("Unable to initiate a new search"), - _("You have a pending search. Please wait for it to finish.")); - return; - } + form = ggp_search_form_new(GGP_SEARCH_TYPE_INFO); - form = ggp_search_form_new(); - info->search_form = form; - + form->user_data = info; form->uin = g_strdup(name); form->offset = g_strdup("0"); form->last_uin = g_strdup("0"); - ggp_search_start(gc, form); + seq = ggp_search_start(gc, form); + ggp_search_add(info->searches, seq, form); } /* }}} */ Modified: trunk/src/protocols/gg/gg.h =================================================================== --- trunk/src/protocols/gg/gg.h 2006-04-15 15:01:30 UTC (rev 16037) +++ trunk/src/protocols/gg/gg.h 2006-04-16 10:10:55 UTC (rev 16038) @@ -28,6 +28,7 @@ #include "search.h" #include "connection.h" + typedef struct { char *name; @@ -53,10 +54,9 @@ typedef struct { struct gg_session *session; - GGPSearchForm *search_form; GGPToken *token; GList *chats; - void *searchresults_window; + GGPSearches *searches; uin_t tmp_buddy; int chats_count; Modified: trunk/src/protocols/gg/search.c =================================================================== --- trunk/src/protocols/gg/search.c 2006-04-15 15:01:30 UTC (rev 16037) +++ trunk/src/protocols/gg/search.c 2006-04-16 10:10:55 UTC (rev 16038) @@ -26,12 +26,19 @@ #include "gg-utils.h" #include "search.h" + /* GGPSearchForm *ggp_search_form_new() {{{ */ -GGPSearchForm *ggp_search_form_new() +GGPSearchForm *ggp_search_form_new(GGPSearchType st) { GGPSearchForm *form; form = g_new0(GGPSearchForm, 1); + + form->search_type = st; + form->window = NULL; + form->user_data = NULL; + form->seq = 0; + form->uin = NULL; form->lastname = NULL; form->firstname = NULL; @@ -41,25 +48,103 @@ form->gender = NULL; form->active = NULL; form->offset = NULL; - form->last_uin = NULL; return form; } /* }}} */ -/* void ggp_search_start(GaimConnection *gc, GGPSearchForm *form) {{{ */ -void ggp_search_start(GaimConnection *gc, GGPSearchForm *form) +/* void ggp_search_form_destroy(GGPSearchForm *form) {{{ */ +void ggp_search_form_destroy(GGPSearchForm *form) { + g_return_if_fail(form != NULL); + + form->window = NULL; + form->user_data = NULL; + form->seq = 0; + + g_free(form->uin); + g_free(form->lastname); + g_free(form->firstname); + g_free(form->nickname); + g_free(form->city); + g_free(form->birthyear); + g_free(form->gender); + g_free(form->active); + g_free(form->offset); + g_free(form->last_uin); + g_free(form); +} +/* }}} */ + +/* void ggp_search_add(GGPSearches *searches, guint32 seq, GGPSearchForm *form) {{{ */ +void ggp_search_add(GGPSearches *searches, guint32 seq, GGPSearchForm *form) +{ + guint32 *tmp; + + g_return_if_fail(searches != NULL); + g_return_if_fail(form != NULL); + + tmp = g_new0(guint32, 1); + *tmp = seq; + form->seq = seq; + + g_hash_table_insert(searches, tmp, form); +} +/* }}} */ + +/* void ggp_search_remove(GGPSearches *searches, guint32 seq) {{{ */ +void ggp_search_remove(GGPSearches *searches, guint32 seq) +{ + g_return_if_fail(searches != NULL); + + g_hash_table_remove(searches, &seq); +} +/* }}} */ + +/* GGPSearchForm *ggp_search_get(GGPSearches *searches, seq) {{{ */ +GGPSearchForm *ggp_search_get(GGPSearches *searches, guint32 seq) +{ + g_return_val_if_fail(searches != NULL, NULL); + + return g_hash_table_lookup(searches, &seq); +} +/* }}} */ + +/* GGPSearches *ggp_search_new() {{{ */ +GGPSearches *ggp_search_new(void) +{ + GGPSearches *searches; + + searches = g_hash_table_new_full(g_int_hash, g_int_equal, + g_free, NULL); + + return searches; +} +/* }}} */ + +/* void ggp_search_destroy(GGPSearches *searches) {{{ */ +void ggp_search_destroy(GGPSearches *searches) +{ + g_return_if_fail(searches != NULL); + + g_hash_table_destroy(searches); +} +/* }}} */ + +/* guint32 ggp_search_start(GaimConnection *gc, GGPSearchForm *form) {{{ */ +guint32 ggp_search_start(GaimConnection *gc, GGPSearchForm *form) +{ GGPInfo *info = gc->proto_data; gg_pubdir50_t req; + guint seq; gaim_debug_info("gg", "It's time to perform a search...\n"); if ((req = gg_pubdir50_new(GG_PUBDIR50_SEARCH)) == NULL) { gaim_debug_error("gg", "ggp_bmenu_show_details: Unable to create req variable.\n"); - return; + return 0; } if (form->uin != NULL) { @@ -105,12 +190,15 @@ gaim_debug_info("gg", "offset: %s\n", form->offset); gg_pubdir50_add(req, GG_PUBDIR50_START, g_strdup(form->offset)); - if (gg_pubdir50(info->session, req) == 0) { + if ((seq = gg_pubdir50(info->session, req)) == 0) { gaim_debug_warning("gg", "ggp_bmenu_show_details: Search failed.\n"); - return; + return 0; } + gaim_debug_info("gg", "search sequence number: %d\n", seq); gg_pubdir50_free(req); + + return seq; } /* }}} */ Modified: trunk/src/protocols/gg/search.h =================================================================== --- trunk/src/protocols/gg/search.h 2006-04-15 15:01:30 UTC (rev 16037) +++ trunk/src/protocols/gg/search.h 2006-04-16 10:10:55 UTC (rev 16038) @@ -30,6 +30,12 @@ #include "gg.h" +typedef enum { + GGP_SEARCH_TYPE_INFO, + GGP_SEARCH_TYPE_FULL + +} GGPSearchType; + typedef struct { char *uin; @@ -44,8 +50,16 @@ char *last_uin; + GGPSearchType search_type; + guint32 seq; + + void *user_data; + void *window; } GGPSearchForm; +typedef GHashTable GGPSearches; + + /** * Create a new GGPSearchForm structure, and set the fields * to the sane defaults. @@ -53,15 +67,72 @@ * @return Newly allocated GGPSearchForm. */ GGPSearchForm * -ggp_search_form_new(void); +ggp_search_form_new(GGPSearchType st); /** + * Destroy a Search Form. + * + * @param form Search Form to destroy. + */ +void +ggp_search_form_destroy(GGPSearchForm *form); + +/** + * Add a search to the list of searches. + * + * @param searches The list of searches. + * @param seq Search (form) ID number. + * @param form The search form to add. + */ +void +ggp_search_add(GGPSearches *searches, guint32 seq, GGPSearchForm *form); + +/** + * Remove a search from the list. + * + * If you want to destory the search completely also call: + * ggp_search_form_destroy(). + * + * @param searches The list of searches. + * @param seq ID number of the search. + */ +void +ggp_search_remove(GGPSearches *searches, guint32 seq); + +/** + * Return the search with the specified ID. + * + * @param searches The list of searches. + * @param seq ID number of the search. + */ +GGPSearchForm * +ggp_search_get(GGPSearches *searches, guint32 seq); + +/** + * Create a new GGPSearches structure. + * + * @return GGPSearches instance. + */ +GGPSearches * +ggp_search_new(void); + +/** + * Destroy GGPSearches instance. + * + * @param searches GGPSearches instance. + */ +void +ggp_search_destroy(GGPSearches *searches); + +/** * Initiate a search in the public directory. * * @param gc GaimConnection. * @param form Filled in GGPSearchForm. + * + * @return Sequence number of a search or 0 if an error occured. */ -void +guint32 ggp_search_start(GaimConnection *gc, GGPSearchForm *form); /* Modified: trunk/src/protocols/jabber/buddy.c =================================================================== --- trunk/src/protocols/jabber/buddy.c 2006-04-15 15:01:30 UTC (rev 16037) +++ trunk/src/protocols/jabber/buddy.c 2006-04-16 10:10:55 UTC (rev 16038) @@ -1196,7 +1196,7 @@ return NULL; } -static void user_search_result_add_buddy_cb(GaimConnection *gc, GList *row) +static void user_search_result_add_buddy_cb(GaimConnection *gc, GList *row, void *user_data) { /* XXX find out the jid */ gaim_blist_request_add_buddy(gaim_connection_get_account(gc), Modified: trunk/src/protocols/oscar/oscar.c =================================================================== --- trunk/src/protocols/oscar/oscar.c 2006-04-15 15:01:30 UTC (rev 16037) +++ trunk/src/protocols/oscar/oscar.c 2006-04-16 10:10:55 UTC (rev 16038) @@ -3746,7 +3746,7 @@ return 1; } -static void oscar_searchresults_add_buddy_cb(GaimConnection *gc, GList *row) +static void oscar_searchresults_add_buddy_cb(GaimConnection *gc, GList *row, void *user_data) { gaim_blist_request_add_buddy(gaim_connection_get_account(gc), g_list_nth_data(row, 0), NULL, NULL); Modified: trunk/src/protocols/sametime/sametime.c =================================================================== --- trunk/src/protocols/sametime/sametime.c 2006-04-15 15:01:30 UTC (rev 16037) +++ trunk/src/protocols/sametime/sametime.c 2006-04-16 10:10:55 UTC (rev 16038) @@ -4223,7 +4223,7 @@ } -static void notify_im(GaimConnection *gc, GList *row) { +static void notify_im(GaimConnection *gc, GList *row, void *user_data) { GaimAccount *acct; GaimConversation *conv; char *id; @@ -4236,7 +4236,7 @@ } -static void notify_add(GaimConnection *gc, GList *row) { +static void notify_add(GaimConnection *gc, GList *row, void *user_data) { gaim_blist_request_add_buddy(gaim_connection_get_account(gc), g_list_nth_data(row, 1), NULL, g_list_nth_data(row, 0)); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rl...@us...> - 2006-04-19 05:51:01
|
Revision: 16065 Author: rlaager Date: 2006-04-18 22:50:50 -0700 (Tue, 18 Apr 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16065&view=rev Log Message: ----------- Kill a number of trivial UNUSED_VALUE "defects": CID 155 CID 156 CID 157 CID 158 CID 159 CID 160 CID 161 CID 162 CID 163 CID 165 CID 166 CID 167 CID 173 CID 174 CID 177 Modified Paths: -------------- trunk/plugins/notify.c trunk/src/conversation.c trunk/src/gtkconv.c trunk/src/gtkdebug.c trunk/src/gtkprefs.c trunk/src/gtksavedstatuses.c trunk/src/idle.c trunk/src/server.c trunk/src/sslconn.c trunk/src/status.c Modified: trunk/plugins/notify.c =================================================================== --- trunk/plugins/notify.c 2006-04-19 03:31:47 UTC (rev 16064) +++ trunk/plugins/notify.c 2006-04-19 05:50:50 UTC (rev 16065) @@ -591,7 +591,7 @@ static void apply_method() { - GList *convs = gaim_get_conversations(); + GList *convs; GaimGtkWindow *gaimwin = NULL; for (convs = gaim_get_conversations(); convs != NULL; convs = convs->next) { Modified: trunk/src/conversation.c =================================================================== --- trunk/src/conversation.c 2006-04-19 03:31:47 UTC (rev 16064) +++ trunk/src/conversation.c 2006-04-19 05:50:50 UTC (rev 16065) @@ -90,7 +90,6 @@ GaimConversationType type; GaimAccount *account; GaimConnection *gc; - GaimConversationUiOps *ops; char *displayed = NULL, *sent = NULL; int err = 0; @@ -104,7 +103,6 @@ g_return_if_fail(gc != NULL); type = gaim_conversation_get_type(conv); - ops = gaim_conversation_get_ui_ops(conv); /* Always linkfy the text for display */ displayed = gaim_markup_linkify(message); Modified: trunk/src/gtkconv.c =================================================================== --- trunk/src/gtkconv.c 2006-04-19 03:31:47 UTC (rev 16064) +++ trunk/src/gtkconv.c 2006-04-19 05:50:50 UTC (rev 16065) @@ -447,11 +447,9 @@ GaimGtkConversation *gtkconv; char *cmd; const char *prefix; - GaimAccount *account; GtkTextIter start; gtkconv = GAIM_GTK_CONVERSATION(conv); - account = gaim_conversation_get_account(conv); prefix = gaim_gtk_get_cmd_prefix(); cmd = gtk_imhtml_get_text(GTK_IMHTML(gtkconv->entry), NULL, NULL); @@ -2235,8 +2233,6 @@ { GaimGtkConversation *gtkconv; GaimGtkWindow *win; - GaimAccount *account; - const char *name; GdkPixbuf *status = NULL; g_return_if_fail(conv != NULL); @@ -2246,9 +2242,6 @@ if (conv != gtkconv->active_conv) return; - name = gaim_conversation_get_name(conv); - account = gaim_conversation_get_account(conv); - status = gaim_gtkconv_get_tab_icon(conv, TRUE); g_return_if_fail(status != NULL); @@ -6265,10 +6258,7 @@ account_signed_off_cb(GaimConnection *gc, gpointer event) { GList *iter; - GaimAccount *account; - account = gaim_connection_get_account(gc); - for (iter = gaim_get_conversations(); iter; iter = iter->next) { GaimConversation *conv = iter->data; @@ -7504,13 +7494,11 @@ GtkWidget *tab_cont = gtkconv->tab_cont; GtkWidget *close_image; GaimConversationType conv_type; - const char *name; const gchar *tmp_lab; gint close_button_width, close_button_height, focus_width, focus_pad; gboolean tabs_side = FALSE; gint angle = 0; - name = gaim_conversation_get_name(conv); conv_type = gaim_conversation_get_type(conv); Modified: trunk/src/gtkdebug.c =================================================================== --- trunk/src/gtkdebug.c 2006-04-19 03:31:47 UTC (rev 16064) +++ trunk/src/gtkdebug.c 2006-04-19 05:50:50 UTC (rev 16065) @@ -693,7 +693,7 @@ /* Pause */ image = gtk_image_new_from_stock(GAIM_STOCK_PAUSE, GTK_ICON_SIZE_MENU); - button = gtk_toolbar_append_element(GTK_TOOLBAR(toolbar), + gtk_toolbar_append_element(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL, _("Pause"), _("Pause"), NULL, image, Modified: trunk/src/gtkprefs.c =================================================================== --- trunk/src/gtkprefs.c 2006-04-19 03:31:47 UTC (rev 16064) +++ trunk/src/gtkprefs.c 2006-04-19 05:50:50 UTC (rev 16065) @@ -963,7 +963,7 @@ { GtkWidget *ret; GtkWidget *vbox, *hbox, *entry; - GtkWidget *table, *label, *auto_ip_checkbox, *ports_checkbox, *spin_button, *stun_server_entry; + GtkWidget *table, *label, *auto_ip_checkbox, *ports_checkbox, *spin_button; GtkSizeGroup *sg; GaimProxyInfo *proxy_info = NULL; @@ -972,7 +972,7 @@ vbox = gaim_gtk_make_frame (ret, _("IP Address")); - stun_server_entry = gaim_gtk_prefs_labeled_entry(vbox,_("ST_UN server:"), "/core/network/stun_server", NULL); + gaim_gtk_prefs_labeled_entry(vbox,_("ST_UN server:"), "/core/network/stun_server", NULL); auto_ip_checkbox = gaim_gtk_prefs_checkbox(_("_Autodetect IP address"), "/core/network/auto_ip", vbox); Modified: trunk/src/gtksavedstatuses.c =================================================================== --- trunk/src/gtksavedstatuses.c 2006-04-19 03:31:47 UTC (rev 16064) +++ trunk/src/gtksavedstatuses.c 2006-04-19 05:50:50 UTC (rev 16065) @@ -880,7 +880,6 @@ renderer, "active", STATUS_EDITOR_COLUMN_ENABLE_SUBSTATUS, NULL); - column = gtk_tree_view_get_column(GTK_TREE_VIEW(dialog->treeview), 1); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(status_editor_substatus_cb), dialog); Modified: trunk/src/idle.c =================================================================== --- trunk/src/idle.c 2006-04-19 03:31:47 UTC (rev 16064) +++ trunk/src/idle.c 2006-04-19 05:50:50 UTC (rev 16065) @@ -93,12 +93,10 @@ { GaimAccount *account; GaimPresence *presence; - GaimStatus *status; GaimSavedStatus *saved_status; account = gaim_connection_get_account(gc); presence = gaim_account_get_presence(account); - status = gaim_presence_get_active_status(presence); if (!gc->is_auto_away) /* This account is already not auto-away! */ Modified: trunk/src/server.c =================================================================== --- trunk/src/server.c 2006-04-19 03:31:47 UTC (rev 16064) +++ trunk/src/server.c 2006-04-19 05:50:50 UTC (rev 16065) @@ -725,10 +725,7 @@ GSList *bcs; GaimConversation *conv = NULL; GaimConvChat *chat = NULL; - GaimAccount *account; - account = gaim_connection_get_account(g); - for (bcs = g->buddy_chats; bcs != NULL; bcs = bcs->next) { conv = (GaimConversation *)bcs->data; Modified: trunk/src/sslconn.c =================================================================== --- trunk/src/sslconn.c 2006-04-19 03:31:47 UTC (rev 16064) +++ trunk/src/sslconn.c 2006-04-19 05:50:50 UTC (rev 16065) @@ -120,13 +120,9 @@ gaim_ssl_input_add(GaimSslConnection *gsc, GaimSslInputFunction func, void *data) { - GaimSslOps *ops; - g_return_if_fail(func != NULL); g_return_if_fail(gaim_ssl_is_supported()); - ops = gaim_ssl_get_ops(); - gsc->recv_cb_data = data; gsc->recv_cb = func; Modified: trunk/src/status.c =================================================================== --- trunk/src/status.c 2006-04-19 03:31:47 UTC (rev 16064) +++ trunk/src/status.c 2006-04-19 05:50:50 UTC (rev 16065) @@ -864,14 +864,11 @@ gaim_status_set_attr_boolean(GaimStatus *status, const char *id, gboolean value) { - GaimStatusType *status_type; GaimValue *attr_value; g_return_if_fail(status != NULL); g_return_if_fail(id != NULL); - status_type = gaim_status_get_type(status); - /* Make sure this attribute exists and is the correct type. */ attr_value = gaim_status_get_attr_value(status, id); g_return_if_fail(attr_value != NULL); @@ -883,14 +880,11 @@ void gaim_status_set_attr_int(GaimStatus *status, const char *id, int value) { - GaimStatusType *status_type; GaimValue *attr_value; g_return_if_fail(status != NULL); g_return_if_fail(id != NULL); - status_type = gaim_status_get_type(status); - /* Make sure this attribute exists and is the correct type. */ attr_value = gaim_status_get_attr_value(status, id); g_return_if_fail(attr_value != NULL); @@ -903,14 +897,11 @@ gaim_status_set_attr_string(GaimStatus *status, const char *id, const char *value) { - GaimStatusType *status_type; GaimValue *attr_value; g_return_if_fail(status != NULL); g_return_if_fail(id != NULL); - status_type = gaim_status_get_type(status); - /* Make sure this attribute exists and is the correct type. */ attr_value = gaim_status_get_attr_value(status, id); /* This used to be g_return_if_fail, but it's failing a LOT, so This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <the...@us...> - 2006-04-21 03:06:30
|
Revision: 16075 Author: thekingant Date: 2006-04-20 20:06:19 -0700 (Thu, 20 Apr 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16075&view=rev Log Message: ----------- Don't show the current status in the list of popular statuses in the gtkstatusbox and in the system tray Modified Paths: -------------- trunk/src/savedstatuses.c trunk/src/savedstatuses.h Modified: trunk/src/savedstatuses.c =================================================================== --- trunk/src/savedstatuses.c 2006-04-21 02:48:58 UTC (rev 16074) +++ trunk/src/savedstatuses.c 2006-04-21 03:06:19 UTC (rev 16075) @@ -684,18 +684,30 @@ GList * gaim_savedstatuses_get_popular(unsigned int how_many) { - GList *truncated = NULL; + GList *popular = NULL; GList *cur; int i; + GaimSavedStatus *current; + /* We don't want the current status to be in the GList */ + current = gaim_savedstatus_get_current(); + /* Copy 'how_many' elements to a new list */ - for (i = 0, cur = saved_statuses; (i < how_many) && (cur != NULL); i++) + i = 0; + cur = saved_statuses; + while ((i < how_many) && (cur != NULL)) { - truncated = g_list_append(truncated, cur->data); + if (cur->data != current) + { + popular = g_list_prepend(popular, cur->data); + i++; + } cur = cur->next; } - return truncated; + popular = g_list_reverse(popular); + + return popular; } GaimSavedStatus * Modified: trunk/src/savedstatuses.h =================================================================== --- trunk/src/savedstatuses.h 2006-04-21 02:48:58 UTC (rev 16074) +++ trunk/src/savedstatuses.h 2006-04-21 03:06:19 UTC (rev 16075) @@ -154,7 +154,9 @@ /** * Returns the n most popular saved statuses. "Popularity" is * determined by when the last time a saved_status was used and - * how many times it has been used. + * how many times it has been used. If the current status would + * normally show up in this list, then it is omited and instead + * the "how_many+1" saved status will appear in the list. * * @param how_many The maximum number of saved statuses * to return, or '0' to get all saved This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <the...@us...> - 2006-04-21 04:03:59
|
Revision: 16077 Author: thekingant Date: 2006-04-20 21:03:53 -0700 (Thu, 20 Apr 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16077&view=rev Log Message: ----------- Don't show simple transient statuses in the list of popular statuses in the gtkstatusbox or in the docklet. i.e. don't show "Available" twice. The argument in favor of showing "Available" without a message is that you don't have to wait for the timeout before the status is activated. I don't think the added confusion of people saying "Why does it say available 2 times?!" is worth this ability. And you can still create a basic saved status with no message if you want that functionality. Modified Paths: -------------- trunk/src/savedstatuses.c trunk/src/savedstatuses.h Modified: trunk/src/savedstatuses.c =================================================================== --- trunk/src/savedstatuses.c 2006-04-21 03:54:35 UTC (rev 16076) +++ trunk/src/savedstatuses.c 2006-04-21 04:03:53 UTC (rev 16077) @@ -687,7 +687,7 @@ GList *popular = NULL; GList *cur; int i; - GaimSavedStatus *current; + GaimSavedStatus *current, *next; /* We don't want the current status to be in the GList */ current = gaim_savedstatus_get_current(); @@ -697,7 +697,9 @@ cur = saved_statuses; while ((i < how_many) && (cur != NULL)) { - if (cur->data != current) + next = cur->data; + if ((next != current) && (!gaim_savedstatus_is_transient(next) + || gaim_savedstatus_get_message(next) != NULL)) { popular = g_list_prepend(popular, cur->data); i++; Modified: trunk/src/savedstatuses.h =================================================================== --- trunk/src/savedstatuses.h 2006-04-21 03:54:35 UTC (rev 16076) +++ trunk/src/savedstatuses.h 2006-04-21 04:03:53 UTC (rev 16077) @@ -156,7 +156,9 @@ * determined by when the last time a saved_status was used and * how many times it has been used. If the current status would * normally show up in this list, then it is omited and instead - * the "how_many+1" saved status will appear in the list. + * the "how_many+1" saved status will appear in the list. Also + * transient statuses without messages are not included in the + * list. * * @param how_many The maximum number of saved statuses * to return, or '0' to get all saved This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <the...@us...> - 2006-04-23 02:57:12
|
Revision: 16084 Author: thekingant Date: 2006-04-22 19:57:08 -0700 (Sat, 22 Apr 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16084&view=rev Log Message: ----------- Fixed a bug where you wouldn't become auto-away when idle if you're a new user and you haven't selected which status to use when auto-awaying. Also improved a few comments. Modified Paths: -------------- trunk/src/savedstatuses.c trunk/src/savedstatuses.h Modified: trunk/src/savedstatuses.c =================================================================== --- trunk/src/savedstatuses.c 2006-04-22 21:36:31 UTC (rev 16083) +++ trunk/src/savedstatuses.c 2006-04-23 02:57:08 UTC (rev 16084) @@ -39,6 +39,11 @@ #define MAX_TRANSIENTS 5 /** + * The default message to use when the user becomes auto-away. + */ +#define DEFAULT_AUTOAWAY_MESSAGE _("I'm not here right now") + +/** * The information stores a snap-shot of the statuses of all * your accounts. Basically these are your saved away messages. * There is an overall status and message that applies to @@ -713,83 +718,86 @@ } GaimSavedStatus * -gaim_savedstatus_get_startup() +gaim_savedstatus_get_current() { int creation_time; GaimSavedStatus *saved_status = NULL; - creation_time = gaim_prefs_get_int("/core/savedstatus/startup"); + creation_time = gaim_prefs_get_int("/core/savedstatus/current"); if (creation_time != 0) saved_status = g_hash_table_lookup(creation_times, &creation_time); if (saved_status == NULL) { - /* We don't have a status to apply. - * This may be the first login, or the user wants to - * restore the "current" status */ - saved_status = gaim_savedstatus_get_current(); + /* + * We don't have a current saved status! This is either a new + * Gaim user or someone upgrading from Gaim 1.5.0 or older, or + * possibly someone who deleted the status they were currently + * using? In any case, add a default status. + */ + saved_status = gaim_savedstatus_new(NULL, GAIM_STATUS_AVAILABLE); + gaim_prefs_set_int("/core/savedstatus/current", + gaim_savedstatus_get_creation_time(saved_status)); } return saved_status; } - GaimSavedStatus * -gaim_savedstatus_get_current() +gaim_savedstatus_get_idleaway() { int creation_time; GaimSavedStatus *saved_status = NULL; - creation_time = gaim_prefs_get_int("/core/savedstatus/current"); + creation_time = gaim_prefs_get_int("/core/savedstatus/idleaway"); if (creation_time != 0) saved_status = g_hash_table_lookup(creation_times, &creation_time); if (saved_status == NULL) { - /* - * We don't have a current saved statuses! This is either a new - * Gaim user or someone upgrading from Gaim 1.5.0 or older, or - * possibly someone who deleted the status they were currently - * using? In any case, add a default status. - */ - saved_status = gaim_savedstatus_new(NULL, GAIM_STATUS_AVAILABLE); - gaim_prefs_set_int("/core/savedstatus/current", - gaim_savedstatus_get_creation_time(saved_status)); + /* We don't have a specified "idle" status! Weird. */ + saved_status = gaim_savedstatus_find_transient_by_type_and_message( + GAIM_STATUS_AWAY, DEFAULT_AUTOAWAY_MESSAGE); + + if (saved_status == NULL) + { + saved_status = gaim_savedstatus_new(NULL, GAIM_STATUS_AWAY); + gaim_savedstatus_set_message(saved_status, DEFAULT_AUTOAWAY_MESSAGE); + gaim_prefs_set_int("/core/savedstatus/idleaway", + gaim_savedstatus_get_creation_time(saved_status)); + } } return saved_status; } GaimSavedStatus * -gaim_savedstatus_get_idleaway() +gaim_savedstatus_get_startup() { int creation_time; - GaimSavedStatus *saved_status; + GaimSavedStatus *saved_status = NULL; - creation_time = gaim_prefs_get_int("/core/savedstatus/idleaway"); + creation_time = gaim_prefs_get_int("/core/savedstatus/startup"); - if (creation_time == 0) + if (creation_time != 0) + saved_status = g_hash_table_lookup(creation_times, &creation_time); + + if (saved_status == NULL) { /* - * We don't have a current saved statuses! This is either a new - * Gaim user or someone upgrading from Gaim 1.5.0 or older. Add - * a default status. + * We don't have a status to apply. + * This may be the first login, or the user wants to + * restore the "current" status. */ - saved_status = gaim_savedstatus_new(NULL, GAIM_STATUS_AWAY); - gaim_savedstatus_set_message(saved_status, _("I'm not here right now")); - gaim_prefs_set_int("/core/savedstatus/idleaway", - gaim_savedstatus_get_creation_time(saved_status)); + saved_status = gaim_savedstatus_get_current(); } - else - { - saved_status = g_hash_table_lookup(creation_times, &creation_time); - } return saved_status; } + GaimSavedStatus * gaim_savedstatus_find(const char *title) { Modified: trunk/src/savedstatuses.h =================================================================== --- trunk/src/savedstatuses.h 2006-04-22 21:36:31 UTC (rev 16083) +++ trunk/src/savedstatuses.h 2006-04-23 02:57:08 UTC (rev 16084) @@ -174,25 +174,28 @@ * Returns the currently selected saved status. * * @return A pointer to the in-use GaimSavedStatus. + * This function never returns NULL. */ GaimSavedStatus *gaim_savedstatus_get_current(void); /** - * Returns the status to be used when gaim is starting up - * - * @return A pointer to the startup GaimSavedStatus. - */ -GaimSavedStatus *gaim_savedstatus_get_startup(void); - -/** * Returns the saved status that gets used when your * accounts become idle-away. * * @return A pointer to the idle-away GaimSavedStatus. + * This function never returns NULL. */ GaimSavedStatus *gaim_savedstatus_get_idleaway(void); /** + * Returns the status to be used when gaim is starting up + * + * @return A pointer to the startup GaimSavedStatus. + * This function never returns NULL. + */ +GaimSavedStatus *gaim_savedstatus_get_startup(void); + +/** * Finds a saved status with the specified title. * * @param title The name of the saved status. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <the...@us...> - 2006-04-28 03:39:21
|
Revision: 16100 Author: thekingant Date: 2006-04-27 20:39:14 -0700 (Thu, 27 Apr 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16100&view=rev Log Message: ----------- Minor constification Modified Paths: -------------- trunk/src/cipher.c trunk/src/cipher.h Modified: trunk/src/cipher.c =================================================================== --- trunk/src/cipher.c 2006-04-27 22:29:26 UTC (rev 16099) +++ trunk/src/cipher.c 2006-04-28 03:39:14 UTC (rev 16100) @@ -897,7 +897,7 @@ * Does not check for weak keys. **/ static void -des_set_key (GaimCipherContext *context, guchar * key) +des_set_key (GaimCipherContext *context, const guchar * key) { struct _des_ctx *ctx = gaim_cipher_context_get_data(context); int i; @@ -1734,7 +1734,7 @@ } void -gaim_cipher_context_set_key(GaimCipherContext *context, guchar *key) { +gaim_cipher_context_set_key(GaimCipherContext *context, const guchar *key) { GaimCipher *cipher = NULL; g_return_if_fail(context); Modified: trunk/src/cipher.h =================================================================== --- trunk/src/cipher.h 2006-04-27 22:29:26 UTC (rev 16099) +++ trunk/src/cipher.h 2006-04-28 03:39:14 UTC (rev 16100) @@ -98,7 +98,7 @@ size_t (*get_salt_size)(GaimCipherContext *context); /** The set key function */ - void (*set_key)(GaimCipherContext *context, guchar *key); + void (*set_key)(GaimCipherContext *context, const guchar *key); /** The get key size function */ size_t (*get_key_size)(GaimCipherContext *context); @@ -358,7 +358,7 @@ * @param context The context who's key to set * @param key The key */ -void gaim_cipher_context_set_key(GaimCipherContext *context, guchar *key); +void gaim_cipher_context_set_key(GaimCipherContext *context, const guchar *key); /** * Gets the key size for a context This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <the...@us...> - 2006-04-28 03:52:15
|
Revision: 16101 Author: thekingant Date: 2006-04-27 20:52:09 -0700 (Thu, 27 Apr 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16101&view=rev Log Message: ----------- Additional constification, add some comments, remove some superfluous whitespace, and changed gchar to guint8 in a few places. Modified Paths: -------------- trunk/src/ntlm.c trunk/src/ntlm.h trunk/src/protocols/simple/simple.c trunk/src/proxy.c Modified: trunk/src/ntlm.c =================================================================== --- trunk/src/ntlm.c 2006-04-28 03:39:14 UTC (rev 16100) +++ trunk/src/ntlm.c 2006-04-28 03:52:09 UTC (rev 16101) @@ -140,11 +140,11 @@ return gaim_base64_encode((guchar*)msg, sizeof(struct type1_message) + strlen(hostname) + strlen(domain)); } -gchar * +guint8 * gaim_ntlm_parse_type2(const gchar *type2, guint32 *flags) { gsize retlen; - static gchar nonce[8]; + static guint8 nonce[8]; struct type2_message *tmsg = (struct type2_message*)gaim_base64_decode((char*)type2, &retlen); memcpy(nonce, tmsg->nonce, 8); if(flags) *flags = tmsg->flags; @@ -169,7 +169,7 @@ * helper function for gaim cipher.c */ static void -des_ecb_encrypt(char *plaintext, char *result, char *key) +des_ecb_encrypt(const guint8 *plaintext, char *result, char *key) { GaimCipher *cipher; GaimCipherContext *context; @@ -188,17 +188,17 @@ * bytes are stored in the results array. */ static void -calc_resp(unsigned char *keys, unsigned char *plaintext, unsigned char *results) +calc_resp(unsigned char *keys, const guint8 *plaintext, unsigned char *results) { guchar key[8]; setup_des_key(keys, (char*)key); - des_ecb_encrypt((char*)plaintext, (char*)results, (char*)key); + des_ecb_encrypt(plaintext, (char*)results, (char*)key); setup_des_key(keys+7, (char*)key); - des_ecb_encrypt((char*)plaintext, (char*)(results+8), (char*)key); + des_ecb_encrypt(plaintext, (char*)(results+8), (char*)key); setup_des_key(keys+14, (char*)key); - des_ecb_encrypt((char*)plaintext, (char*)(results+16), (char*)key); + des_ecb_encrypt(plaintext, (char*)(results+16), (char*)key); } static void @@ -215,12 +215,11 @@ } gchar * -gaim_ntlm_gen_type3(const gchar *username, const gchar *passw, const gchar *hostname, const gchar *domain, gchar *nonce, guint32 *flags) +gaim_ntlm_gen_type3(const gchar *username, const gchar *passw, const gchar *hostname, const gchar *domain, const guint8 *nonce, guint32 *flags) { char lm_pw[14]; unsigned char lm_hpw[21]; char sesskey[16]; - gchar *sessionnonce = nonce; gchar key[8]; int msglen = sizeof(struct type3_message)+ strlen(domain) + strlen(username)+ @@ -284,13 +283,13 @@ lm_pw[idx] = 0; setup_des_key((unsigned char*)lm_pw, (char*)key); - des_ecb_encrypt((char*)magic, (char*)lm_hpw, (char*)key); + des_ecb_encrypt(magic, (char*)lm_hpw, (char*)key); setup_des_key((unsigned char*)(lm_pw+7), (char*)key); - des_ecb_encrypt((char*)magic, (char*)lm_hpw+8, (char*)key); + des_ecb_encrypt(magic, (char*)lm_hpw+8, (char*)key); memset(lm_hpw+16, 0, 5); - calc_resp(lm_hpw, (guchar*)sessionnonce, lm_resp); + calc_resp(lm_hpw, nonce, lm_resp); /* NTLM */ lennt = strlen(passw); @@ -309,7 +308,7 @@ memset(nt_hpw+16, 0, 5); - calc_resp(nt_hpw, (guchar*)sessionnonce, nt_resp); + calc_resp(nt_hpw, nonce, nt_resp); memcpy(tmp, lm_resp, 0x18); tmp += 0x18; memcpy(tmp, nt_resp, 0x18); Modified: trunk/src/ntlm.h =================================================================== --- trunk/src/ntlm.h 2006-04-28 03:39:14 UTC (rev 16100) +++ trunk/src/ntlm.h 2006-04-28 03:52:09 UTC (rev 16101) @@ -1,13 +1,13 @@ /** * @file ntlm.h - * + * * gaim * * Copyright (C) 2005, Thomas Butter <bu...@un...> * - * ntlm structs are taken from NTLM description on - * http://www.innovation.ch/java/ntlm.html - * + * ntlm structs are taken from NTLM description on + * http://www.innovation.ch/java/ntlm.html + * * 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 @@ -31,7 +31,8 @@ * * @param hostname Your hostname * @param domain The domain to authenticate to - * @return base64 encoded string to send to the server. has to be freed with g_free + * @return base64 encoded string to send to the server. This should + * be g_free'd by the caller. */ gchar *gaim_ntlm_gen_type1(const gchar *hostname, const gchar *domain); @@ -39,9 +40,10 @@ * Parses the ntlm type 2 message * * @param type2 String containing the base64 encoded type2 message - * @return The nonce for use in message type3 + * @return The nonce for use in message type3. This is a statically + * allocated 8 byte binary string. */ -gchar *gaim_ntlm_parse_type2(const gchar *type2, guint32 *flags); +guint8 *gaim_ntlm_parse_type2(const gchar *type2, guint32 *flags); /** * Generates a type3 message @@ -52,8 +54,9 @@ * @param domain The domain to authenticate against * @param nonce The nonce returned by gaim_ntlm_parse_type2 * @param flags Pointer to the flags returned by gaim_ntlm_parse_type2 - * @return A base64 encoded type3 message + * @return A base64 encoded type3 message. This should be g_free'd by + * the caller. */ -gchar *gaim_ntlm_gen_type3(const gchar *username, const gchar *passw, const gchar *hostname, const gchar *domain, gchar *nonce, guint32 *flags); +gchar *gaim_ntlm_gen_type3(const gchar *username, const gchar *passw, const gchar *hostname, const gchar *domain, const guint8 *nonce, guint32 *flags); #endif /* _GAIM_NTLM_H */ Modified: trunk/src/protocols/simple/simple.c =================================================================== --- trunk/src/protocols/simple/simple.c 2006-04-28 03:39:14 UTC (rev 16100) +++ trunk/src/protocols/simple/simple.c 2006-04-28 03:52:09 UTC (rev 16101) @@ -278,7 +278,8 @@ return ret; } else if(auth->type == 2) { /* NTLM */ if(auth->nc == 3 && auth->nonce) { - ret = gaim_ntlm_gen_type3(authuser, sip->password, "gaim", authdomain, auth->nonce, &auth->flags); + /* TODO: Don't hardcode "gaim" as the hostname */ + ret = gaim_ntlm_gen_type3(authuser, sip->password, "gaim", authdomain, (const guint8 *)auth->nonce, &auth->flags); tmp = g_strdup_printf("NTLM qop=\"auth\", opaque=\"%s\", realm=\"%s\", targetname=\"%s\", gssapi-data=\"%s\"\r\n", auth->opaque, auth->realm, auth->target, ret); g_free(ret); return tmp; @@ -339,7 +340,7 @@ while(parts[i]) { gaim_debug_info("simple", "parts[i] %s\n", parts[i]); if((tmp = parse_attribute("gssapi-data=\"", parts[i]))) { - auth->nonce = g_strdup(gaim_ntlm_parse_type2(tmp, &auth->flags)); + auth->nonce = g_memdup(gaim_ntlm_parse_type2(tmp, &auth->flags), 8); g_free(tmp); } if((tmp = parse_attribute("targetname=\"", Modified: trunk/src/proxy.c =================================================================== --- trunk/src/proxy.c 2006-04-28 03:39:14 UTC (rev 16100) +++ trunk/src/proxy.c 2006-04-28 03:52:09 UTC (rev 16101) @@ -1207,7 +1207,8 @@ if(status == 407 /* Proxy Auth */) { gchar *ntlm; if((ntlm = g_strrstr((const gchar *)phb->read_buffer, "Proxy-Authenticate: NTLM "))) { /* Check for Type-2 */ - gchar *nonce = ntlm; + gchar *tmp = ntlm; + guint8 *nonce; gchar *domain = (gchar*)gaim_proxy_info_get_username(phb->gpi); gchar *username; gchar *request; @@ -1230,8 +1231,8 @@ *username = '\0'; username++; ntlm += strlen("Proxy-Authenticate: NTLM "); - while(*nonce != '\r' && *nonce != '\0') nonce ++; - *nonce = '\0'; + while(*tmp != '\r' && *tmp != '\0') tmp++; + *tmp = '\0'; nonce = gaim_ntlm_parse_type2(ntlm, NULL); response = gaim_ntlm_gen_type3(username, (gchar*) gaim_proxy_info_get_password(phb->gpi), This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rl...@us...> - 2006-04-28 06:46:35
|
Revision: 16103 Author: rlaager Date: 2006-04-27 23:46:29 -0700 (Thu, 27 Apr 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16103&view=rev Log Message: ----------- Added some translation comments, as discussed on gaim-i18. I wasn't really sure how to write these, but it's hopefully a step in the right direction... Modified Paths: -------------- trunk/plugins/idle.c trunk/plugins/log_reader.c trunk/plugins/psychic.c trunk/src/gtkaccount.c trunk/src/gtkdialogs.c trunk/src/protocols/silc/chat.c Modified: trunk/plugins/idle.c =================================================================== --- trunk/plugins/idle.c 2006-04-28 04:25:58 UTC (rev 16102) +++ trunk/plugins/idle.c 2006-04-28 06:46:29 UTC (rev 16103) @@ -306,6 +306,9 @@ NULL, GAIM_PRIORITY_DEFAULT, IDLE_PLUGIN_ID, + + /* This is a cultural reference. Dy'er Mak'er is a song by Led Zeppelin. + If that doesn't translate well into your language, drop the 's before translating. */ N_("I'dle Mak'er"), VERSION, N_("Allows you to hand-configure how long you've been idle"), Modified: trunk/plugins/log_reader.c =================================================================== --- trunk/plugins/log_reader.c 2006-04-28 04:25:58 UTC (rev 16102) +++ trunk/plugins/log_reader.c 2006-04-28 06:46:29 UTC (rev 16103) @@ -1832,6 +1832,9 @@ { g_return_val_if_fail(plugin != NULL, FALSE); + /* The names of IM clients are marked for translation at the request of + translators who wanted to transliterate them. Many translators + choose to leave them alone. Choose what's best for your language. */ adium_logger = gaim_log_logger_new("adium", _("Adium"), 6, NULL, NULL, @@ -1841,6 +1844,9 @@ adium_logger_size); gaim_log_logger_add(adium_logger); + /* The names of IM clients are marked for translation at the request of + translators who wanted to transliterate them. Many translators + choose to leave them alone. Choose what's best for your language. */ fire_logger = gaim_log_logger_new("fire", _("Fire"), 6, NULL, NULL, @@ -1850,6 +1856,9 @@ fire_logger_size); gaim_log_logger_add(fire_logger); + /* The names of IM clients are marked for translation at the request of + translators who wanted to transliterate them. Many translators + choose to leave them alone. Choose what's best for your language. */ messenger_plus_logger = gaim_log_logger_new("messenger_plus", _("Messenger Plus!"), 6, NULL, NULL, @@ -1859,6 +1868,9 @@ messenger_plus_logger_size); gaim_log_logger_add(messenger_plus_logger); + /* The names of IM clients are marked for translation at the request of + translators who wanted to transliterate them. Many translators + choose to leave them alone. Choose what's best for your language. */ msn_logger = gaim_log_logger_new("msn", _("MSN Messenger"), 6, NULL, NULL, @@ -1868,6 +1880,9 @@ msn_logger_size); gaim_log_logger_add(msn_logger); + /* The names of IM clients are marked for translation at the request of + translators who wanted to transliterate them. Many translators + choose to leave them alone. Choose what's best for your language. */ trillian_logger = gaim_log_logger_new("trillian", _("Trillian"), 6, NULL, NULL, Modified: trunk/plugins/psychic.c =================================================================== --- trunk/plugins/psychic.c 2006-04-28 04:25:58 UTC (rev 16102) +++ trunk/plugins/psychic.c 2006-04-28 06:46:29 UTC (rev 16103) @@ -54,6 +54,12 @@ if(gaim_prefs_get_bool(PREF_NOTICE)) { gaim_conversation_write(gconv, NULL, + /* This is a quote from Star Wars. You should + probably not translate it literally. If + you can't find a fitting cultural reference + in your language, consider translating + something like this instead: + "You feel a new message coming." */ _("You feel a disturbance in the force..."), GAIM_MESSAGE_SYSTEM | GAIM_MESSAGE_NO_LOG | GAIM_MESSAGE_ACTIVE_ONLY, time(NULL)); Modified: trunk/src/gtkaccount.c =================================================================== --- trunk/src/gtkaccount.c 2006-04-28 04:25:58 UTC (rev 16102) +++ trunk/src/gtkaccount.c 2006-04-28 06:46:29 UTC (rev 16103) @@ -1291,16 +1291,25 @@ static void port_popup_cb(GtkWidget *w, GtkMenu *menu, gpointer data) { - GtkWidget *item; + GtkWidget *item1; + GtkWidget *item2; - item = gtk_menu_item_new_with_label( - _("you can see the butterflies mating")); - gtk_widget_show(item); - gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), item); + /* This is an easter egg. + It means one of two things, both intended as humourus: + A) your network is really slow and you have nothing better to do than + look at butterflies. + B)You are looking really closely at something that shouldn't matter. */ + item1 = gtk_menu_item_new_with_label(_("If you look real closely")); - item = gtk_menu_item_new_with_label(_("If you look real closely")); - gtk_widget_show(item); - gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), item); + /* This is an easter egg. See the comment on the previous line in the source. */ + item2 = gtk_menu_item_new_with_label(_("you can see the butterflies mating")); + + gtk_widget_show(item1); + gtk_widget_show(item2); + + /* Prepend these in reverse order so they appear correctly. */ + gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), item2); + gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), item1); } static void Modified: trunk/src/gtkdialogs.c =================================================================== --- trunk/src/gtkdialogs.c 2006-04-28 04:25:58 UTC (rev 16102) +++ trunk/src/gtkdialogs.c 2006-04-28 06:46:29 UTC (rev 16103) @@ -97,6 +97,7 @@ {"Jim Duchek", N_("maintainer"), "ji...@li..."}, {"Rob Flynn", N_("maintainer"), "ga...@ro..."}, {"Adam Fritzler", N_("libfaim maintainer"), NULL}, + /* If "lazy bum" translates literally into a serious insult, use something else or omit it. */ {"Syd Logan", N_("hacker and designated driver [lazy bum]"), NULL}, {"Jim Seymour", N_("Jabber developer"), NULL}, {"Mark Spencer", N_("original author"), "mar...@ma..."}, Modified: trunk/src/protocols/silc/chat.c =================================================================== --- trunk/src/protocols/silc/chat.c 2006-04-28 04:25:58 UTC (rev 16102) +++ trunk/src/protocols/silc/chat.c 2006-04-28 06:46:29 UTC (rev 16103) @@ -138,6 +138,7 @@ g_string_append_printf(s, _("<br><b>Channel Cipher:</b> %s"), silc_cipher_get_name(channel->channel_key)); if (channel->hmac) + /* Definition of HMAC: http://en.wikipedia.org/wiki/HMAC */ g_string_append_printf(s, _("<br><b>Channel HMAC:</b> %s"), silc_hmac_get_name(channel->hmac)); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <the...@us...> - 2006-05-09 01:22:59
|
Revision: 16141 Author: thekingant Date: 2006-05-07 11:04:24 -0700 (Sun, 07 May 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16141&view=rev Log Message: ----------- Correctly remove the disconnected button when the account successfully connections. This might have only been a problem when the account wanted_to_die Modified Paths: -------------- trunk/src/gtkblist.c trunk/src/gtkconn.c Modified: trunk/src/gtkblist.c =================================================================== --- trunk/src/gtkblist.c 2006-05-07 17:40:42 UTC (rev 16140) +++ trunk/src/gtkblist.c 2006-05-07 18:04:24 UTC (rev 16141) @@ -3527,28 +3527,21 @@ GaimAccount *account; char *primary; const char *text; + gboolean enabled; account = user_data; primary = g_strdup_printf(_("%s disconnected"), gaim_account_get_username(account)); text = g_hash_table_lookup(gtkblist->connection_errors, account); - if (gaim_account_is_connected(account)) - { - gaim_notify_formatted(NULL, _("Connection Error"), - primary, NULL, text, NULL, NULL); - } - else - { - gboolean enabled = gaim_account_get_enabled(account, gaim_core_get_ui()); - gaim_request_action(account, _("Connection Error"), primary, text, 2, - account, 3, - _("OK"), NULL, - _("Modify Account"), GAIM_CALLBACK(ce_modify_account_cb), - enabled ? _("Connect") : _("Re-enable Account"), - enabled ? GAIM_CALLBACK(gaim_account_connect) : - GAIM_CALLBACK(ce_enable_account_cb)); - } + enabled = gaim_account_get_enabled(account, gaim_core_get_ui()); + gaim_request_action(account, _("Connection Error"), primary, text, 2, + account, 3, + _("OK"), NULL, + _("Modify Account"), GAIM_CALLBACK(ce_modify_account_cb), + enabled ? _("Connect") : _("Re-enable Account"), + enabled ? GAIM_CALLBACK(gaim_account_connect) : + GAIM_CALLBACK(ce_enable_account_cb)); g_free(primary); gtk_widget_destroy(GTK_WIDGET(widget)); g_hash_table_remove(gtkblist->connection_errors, account); Modified: trunk/src/gtkconn.c =================================================================== --- trunk/src/gtkconn.c 2006-05-07 17:40:42 UTC (rev 16140) +++ trunk/src/gtkconn.c 2006-05-07 18:04:24 UTC (rev 16141) @@ -51,7 +51,6 @@ * value is a pointer to a GaimAutoRecon. */ static GHashTable *hash = NULL; -static GHashTable *errored_accounts = NULL; static void gaim_gtk_connection_connect_progress(GaimConnection *gc, @@ -64,7 +63,7 @@ (gaim_connections_get_connecting() != NULL)); gtk_gaim_status_box_pulse_connecting(GTK_GAIM_STATUS_BOX(gtkblist->statusbox)); } - +\ static void gaim_gtk_connection_connected(GaimConnection *gc) { @@ -81,11 +80,7 @@ if (hash != NULL) g_hash_table_remove(hash, account); - if (g_hash_table_size(errored_accounts) > 0) - { - g_hash_table_remove(errored_accounts, account); - gaim_gtk_blist_update_account_error_state(account, NULL); - } + gaim_gtk_blist_update_account_error_state(account, NULL); } static void @@ -151,11 +146,9 @@ { GaimAccount *account = NULL; GaimAutoRecon *info; - GSList* errored_account; account = gaim_connection_get_account(gc); info = g_hash_table_lookup(hash, account); - errored_account = g_hash_table_lookup(errored_accounts, account); gaim_gtk_blist_update_account_error_state(account, text); if (!gc->wants_to_die) { @@ -169,16 +162,11 @@ g_source_remove(info->timeout); } info->timeout = g_timeout_add(info->delay, do_signon, account); - - g_hash_table_insert(errored_accounts, account, NULL); } else { char *p, *s, *n=NULL ; if (info != NULL) g_hash_table_remove(hash, account); - if (errored_account != NULL) - g_hash_table_remove(errored_accounts, errored_account); - if (gaim_account_get_alias(account)) { n = g_strdup_printf("%s (%s) (%s)", @@ -231,11 +219,7 @@ { g_hash_table_remove(hash, account); - if (g_hash_table_size(errored_accounts) > 0) - { - g_hash_table_remove(errored_accounts, account); - gaim_gtk_blist_update_account_error_state(account, NULL); - } + gaim_gtk_blist_update_account_error_state(account, NULL); } @@ -257,9 +241,6 @@ hash = g_hash_table_new_full( g_direct_hash, g_direct_equal, NULL, free_auto_recon); - errored_accounts = g_hash_table_new_full( - g_direct_hash, g_direct_equal, - NULL, NULL); gaim_signal_connect(gaim_accounts_get_handle(), "account-removed", gaim_gtk_connection_get_handle(), @@ -272,5 +253,4 @@ gaim_signals_disconnect_by_handle(gaim_gtk_connection_get_handle()); g_hash_table_destroy(hash); - g_hash_table_destroy(errored_accounts); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rl...@us...> - 2006-05-10 17:31:37
|
Revision: 16173 Author: rlaager Date: 2006-05-10 10:31:25 -0700 (Wed, 10 May 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16173&view=rev Log Message: ----------- SF Patch #1482854 from Sadrul "This exposes the savedstatuses-api to dbus and makes the "setstatus" command work for gaim-remot Modified Paths: -------------- trunk/src/Makefile.am trunk/src/dbus-server.c trunk/src/gaim-remote.py trunk/src/savedstatuses.c Modified: trunk/src/Makefile.am =================================================================== --- trunk/src/Makefile.am 2006-05-10 14:02:12 UTC (rev 16172) +++ trunk/src/Makefile.am 2006-05-10 17:31:25 UTC (rev 16173) @@ -176,7 +176,7 @@ dbus_sources = dbus-server.c dbus-useful.c dbus_headers = dbus-bindings.h dbus-gaim.h dbus-server.h dbus-useful.h dbus-define-api.h -dbus_exported = dbus-useful.h dbus-define-api.h account.h blist.h buddyicon.h connection.h conversation.h core.h roomlist.h status.h server.h +dbus_exported = dbus-useful.h dbus-define-api.h account.h blist.h buddyicon.h connection.h conversation.h core.h roomlist.h savedstatuses.h status.h server.h gaim_build_coreheaders = $(addprefix $(srcdir)/, $(gaim_coreheaders)) dbus_build_exported = $(addprefix $(srcdir)/, $(dbus_exported)) Modified: trunk/src/dbus-server.c =================================================================== --- trunk/src/dbus-server.c 2006-05-10 14:02:12 UTC (rev 16172) +++ trunk/src/dbus-server.c 2006-05-10 17:31:25 UTC (rev 16173) @@ -36,6 +36,7 @@ #include "dbus-bindings.h" #include "debug.h" #include "core.h" +#include "savedstatuses.h" #include "value.h" Modified: trunk/src/gaim-remote.py =================================================================== --- trunk/src/gaim-remote.py 2006-05-10 14:02:12 UTC (rev 16172) +++ trunk/src/gaim-remote.py 2006-05-10 17:31:25 UTC (rev 16173) @@ -97,17 +97,34 @@ params.get("group", ""), "") elif command == "setstatus": + current = gaim.GaimSavedstatusGetCurrent() + + if "status" in params: + status_id = params["status"] + status_type = gaim.GaimPrimitiveGetTypeFromId(status_id) + else: + status_type = gaim.GaimSavedStatusGetType(current) + status_id = gaim.GaimPrimitiveGetIdFromType(status_type) + + if "message" in params: + message = params["message"]; + else: + message = gaim.GaimSavedstatusGetMessage(current) + if "account" in params: accounts = [cgaim.GaimAccountsFindAny(accountname, protocol)] + + for account in accounts: + status = gaim.GaimAccountGetStatus(account, status_id) + type = gaim.GaimStatusGetType(status) + gaim.GaimSavedstatusSetSubstatus(current, account, type, message) + gaim.GaimSavedstatusActivateForAccount(current, account) else: accounts = gaim.GaimAccountsGetAllActive() + saved = gaim.GaimSavedstatusNew("", status_type) + gaim.GaimSavedstatusSetMessage(saved, message) + gaim.GaimSavedstatusActivate(saved) - for account in accounts: - status = cgaim.GaimAccountGetStatus(account, params["status"]) - for key, value in params.items(): - if key not in ["status", "account"]: - gaim.GaimStatusSetAttrString(status, key, value) - gaim.GaimAccountSetStatusVargs(account, params["status"], 1) return None elif command == "getinfo": Modified: trunk/src/savedstatuses.c =================================================================== --- trunk/src/savedstatuses.c 2006-05-10 14:02:12 UTC (rev 16172) +++ trunk/src/savedstatuses.c 2006-05-10 17:31:25 UTC (rev 16173) @@ -1,5 +1,5 @@ /** - * @file savedstatus.c Saved Status API + * @file savedstatuses.c Saved Status API * @ingroup core * * gaim @@ -27,6 +27,7 @@ #include "debug.h" #include "notify.h" #include "savedstatuses.h" +#include "dbus-maybe.h" #include "status.h" #include "util.h" #include "xmlnode.h" @@ -108,6 +109,7 @@ g_return_if_fail(substatus != NULL); g_free(substatus->message); + GAIM_DBUS_UNREGISTER_POINTER(substatus); g_free(substatus); } @@ -126,6 +128,7 @@ free_saved_status_sub(substatus); } + GAIM_DBUS_UNREGISTER_POINTER(status); g_free(status); } @@ -369,6 +372,7 @@ char *data; ret = g_new0(GaimSavedStatusSub, 1); + GAIM_DBUS_REGISTER_POINTER(ret, GaimSavedStatusSub); /* Read the account */ node = xmlnode_get_child(substatus, "account"); @@ -442,6 +446,7 @@ int i; ret = g_new0(GaimSavedStatus, 1); + GAIM_DBUS_REGISTER_POINTER(ret, GaimSavedStatus); attrib = xmlnode_get_attrib(status, "transient"); if ((attrib == NULL) || (strcmp(attrib, "true"))) @@ -547,6 +552,7 @@ g_return_val_if_fail(gaim_savedstatus_find(title) == NULL, NULL); status = g_new0(GaimSavedStatus, 1); + GAIM_DBUS_REGISTER_POINTER(status, GaimSavedStatus); status->title = g_strdup(title); status->type = type; set_creation_time(status, time(NULL)); @@ -613,6 +619,7 @@ if (substatus == NULL) { substatus = g_new0(GaimSavedStatusSub, 1); + GAIM_DBUS_REGISTER_POINTER(substatus, GaimSavedStatusSub); substatus->account = (GaimAccount *)account; saved_status->substatuses = g_list_prepend(saved_status->substatuses, substatus); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rl...@us...> - 2006-05-11 17:02:56
|
Revision: 16177 Author: rlaager Date: 2006-05-11 10:02:46 -0700 (Thu, 11 May 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16177&view=rev Log Message: ----------- SF Bug #1485718 "At Solaris ARC review, the architect committee noticed that gaim installs two files to /usr/bin with the *.py extension. These include: gaim-notifications-example.py gaim-remote.py ARC also noticed that there are no other applications in /usr/bin with this extension, and questioned whether it makes sense to add applications to the default user PATH like this. Does it make more sense to remove the .py from the filenames if you are planning to install them into PATH? They recommend changing the name for consistancy. Also, not sure it is a good idea to install example programs to /usr/bin. Perhaps gaim-notifications-example should be installed to a /usr/demo directory, or elsewhere?" I've renamed gaim-remote.py to gaim-remote and moved gaim-notifications-example to /usr/share/gaim/doc/examples. Modified Paths: -------------- trunk/src/Makefile.am Added Paths: ----------- trunk/src/gaim-notifications-example trunk/src/gaim-remote Removed Paths: ------------- trunk/src/gaim-notifications-example.py trunk/src/gaim-remote.py Modified: trunk/src/Makefile.am =================================================================== --- trunk/src/Makefile.am 2006-05-11 01:35:30 UTC (rev 16176) +++ trunk/src/Makefile.am 2006-05-11 17:02:46 UTC (rev 16177) @@ -1,8 +1,8 @@ EXTRA_DIST = \ dbus-analyze-functions.py \ dbus-analyze-types.py \ - gaim-notifications-example.py \ - gaim-remote.py \ + gaim-notifications-example \ + gaim-remote \ gaim-send \ gaim-send-async \ getopt.c \ @@ -228,8 +228,11 @@ # scripts -bin_SCRIPTS = gaim-remote.py gaim-notifications-example.py gaim-send gaim-send-async +bin_SCRIPTS = gaim-remote gaim-send gaim-send-async +exampledir = $(datadir)/doc/@PACKAGE@/examples +example_DATA = gaim-notifications-example + endif bin_PROGRAMS = gaim $(gaim_clientbP) Copied: trunk/src/gaim-notifications-example (from rev 16172, trunk/src/gaim-notifications-example.py) =================================================================== --- trunk/src/gaim-notifications-example (rev 0) +++ trunk/src/gaim-notifications-example 2006-05-11 17:02:46 UTC (rev 16177) @@ -0,0 +1,86 @@ +#!/usr/bin/env python + +# This is a simple gaim notification server. +# It shows notifications when your buddy signs on or you get an IM message. +# +# This script requires Python 2.4 and PyGTK bindings +# +# Note that all function names are resolved dynamically, no +# gaim-specific library is needed. + +import dbus +import dbus.glib +import dbus.decorators +import gobject +import os + +def ensureimconversation(conversation, account, name): + if conversation != 0: + return conversation + else: + # 1 = GAIM_CONV_IM + return gaim.GaimConversationNew(1, account, name) + +def receivedimmsg(account, name, message, conversation, flags): + buddy = gaim.GaimFindBuddy(account, name) + if buddy != 0: + alias = gaim.GaimBuddyGetAlias(buddy) + else: + alias = name + + text = "%s says %s" % (alias, message) + code = os.spawnlp(os.P_WAIT, "xmessage", "xmessage", "-buttons", + "'So what?','Show me',Close,Abuse", text) + + if code == 101: # so what? + pass + else: + conversation = ensureimconversation(conversation, account, name) + + if code == 102: # show me + window = gaim.GaimConversationGetWindow(conversation) + gaim.GaimConvWindowRaise(window) + + if code == 103: # close + gaim.GaimConversationDestroy(conversation) + + if code == 104: # abuse + im = gaim.GaimConversationGetImData(conversation) + gaim.GaimConvImSend(im, "Go away you f...") + + +def buddysignedon(buddyid): + alias = gaim.GaimBuddyGetAlias(buddyid) + text = "%s is online" % alias + + code = os.spawnlp(os.P_WAIT, "xmessage", "xmessage", "-buttons", + "'So what?','Let's talk'", text) + + if code == 101: # so what? + pass + + if code == 102: # talk + name = gaim.GaimBuddyGetName(buddyid) + account = gaim.GaimBuddyGetAccount(buddyid) + gaim.GaimConversationNew(1, account, name) + + +bus = dbus.SessionBus() +obj = bus.get_object("net.sf.gaim.GaimService", "/net/sf/gaim/GaimObject") +gaim = dbus.Interface(obj, "net.sf.gaim.GaimInterface") + +bus.add_signal_receiver(receivedimmsg, + dbus_interface = "net.sf.gaim.GaimInterface", + signal_name = "ReceivedImMsg") + +bus.add_signal_receiver(buddysignedon, + dbus_interface = "net.sf.gaim.GaimInterface", + signal_name = "BuddySignedOn") + +print "This is a simple gaim notification server." +print "It shows notifications when your buddy signs on or you get an IM message." + +loop = gobject.MainLoop() +loop.run() + + Property changes on: trunk/src/gaim-notifications-example ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:keywords + Author Date Id Revision Name: svn:eol-style + native Deleted: trunk/src/gaim-notifications-example.py =================================================================== --- trunk/src/gaim-notifications-example.py 2006-05-11 01:35:30 UTC (rev 16176) +++ trunk/src/gaim-notifications-example.py 2006-05-11 17:02:46 UTC (rev 16177) @@ -1,86 +0,0 @@ -#!/usr/bin/env python - -# This is a simple gaim notification server. -# It shows notifications when your buddy signs on or you get an IM message. -# -# This script requires Python 2.4 and PyGTK bindings -# -# Note that all function names are resolved dynamically, no -# gaim-specific library is needed. - -import dbus -import dbus.glib -import dbus.decorators -import gobject -import os - -def ensureimconversation(conversation, account, name): - if conversation != 0: - return conversation - else: - # 1 = GAIM_CONV_IM - return gaim.GaimConversationNew(1, account, name) - -def receivedimmsg(account, name, message, conversation, flags): - buddy = gaim.GaimFindBuddy(account, name) - if buddy != 0: - alias = gaim.GaimBuddyGetAlias(buddy) - else: - alias = name - - text = "%s says %s" % (alias, message) - code = os.spawnlp(os.P_WAIT, "xmessage", "xmessage", "-buttons", - "'So what?','Show me',Close,Abuse", text) - - if code == 101: # so what? - pass - else: - conversation = ensureimconversation(conversation, account, name) - - if code == 102: # show me - window = gaim.GaimConversationGetWindow(conversation) - gaim.GaimConvWindowRaise(window) - - if code == 103: # close - gaim.GaimConversationDestroy(conversation) - - if code == 104: # abuse - im = gaim.GaimConversationGetImData(conversation) - gaim.GaimConvImSend(im, "Go away you f...") - - -def buddysignedon(buddyid): - alias = gaim.GaimBuddyGetAlias(buddyid) - text = "%s is online" % alias - - code = os.spawnlp(os.P_WAIT, "xmessage", "xmessage", "-buttons", - "'So what?','Let's talk'", text) - - if code == 101: # so what? - pass - - if code == 102: # talk - name = gaim.GaimBuddyGetName(buddyid) - account = gaim.GaimBuddyGetAccount(buddyid) - gaim.GaimConversationNew(1, account, name) - - -bus = dbus.SessionBus() -obj = bus.get_object("net.sf.gaim.GaimService", "/net/sf/gaim/GaimObject") -gaim = dbus.Interface(obj, "net.sf.gaim.GaimInterface") - -bus.add_signal_receiver(receivedimmsg, - dbus_interface = "net.sf.gaim.GaimInterface", - signal_name = "ReceivedImMsg") - -bus.add_signal_receiver(buddysignedon, - dbus_interface = "net.sf.gaim.GaimInterface", - signal_name = "BuddySignedOn") - -print "This is a simple gaim notification server." -print "It shows notifications when your buddy signs on or you get an IM message." - -loop = gobject.MainLoop() -loop.run() - - Copied: trunk/src/gaim-remote (from rev 16173, trunk/src/gaim-remote.py) =================================================================== --- trunk/src/gaim-remote (rev 0) +++ trunk/src/gaim-remote 2006-05-11 17:02:46 UTC (rev 16177) @@ -0,0 +1,212 @@ +#!/usr/bin/python + +import dbus +import re +import urllib +import sys + +import xml.dom.minidom + +xml.dom.minidom.Element.all = xml.dom.minidom.Element.getElementsByTagName + +obj = dbus.SessionBus().get_object("net.sf.gaim.GaimService", "/net/sf/gaim/GaimObject") +gaim = dbus.Interface(obj, "net.sf.gaim.GaimInterface") + +class CheckedObject: + def __init__(self, obj): + self.obj = obj + + def __getattr__(self, attr): + return CheckedAttribute(self, attr) + +class CheckedAttribute: + def __init__(self, cobj, attr): + self.cobj = cobj + self.attr = attr + + def __call__(self, *args): + result = self.cobj.obj.__getattr__(self.attr)(*args) + if result == 0: + raise "Error: " + self.attr + " " + str(args) + " returned " + str(result) + return result + +cgaim = CheckedObject(gaim) + +urlregexp = r"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?" + +def extendlist(list, length, fill): + if len(list) < length: + return list + [fill] * (length - len(list)) + else: + return list + +def convert(value): + try: + return int(value) + except: + return value + +def findaccount(accountname, protocolname): + try: + # prefer connected accounts + account = cgaim.GaimAccountsFindConnected(accountname, protocolname) + return account + except: + # try to get any account and connect it + account = cgaim.GaimAccountsFindAny(accountname, protocolname) + print gaim.GaimAccountGetUsername(account) + gaim.GaimAccountSetStatusVargs(account, "online", 1) + gaim.GaimAccountConnect(account) + return account + + +def execute(uri): + match = re.match(urlregexp, uri) + protocol = match.group(2) + if protocol == "aim" or protocol == "icq": + protocol = "oscar" + if protocol is not None: + protocol = "prpl-" + protocol + command = match.group(5) + paramstring = match.group(7) + params = {} + if paramstring is not None: + for param in paramstring.split("&"): + key, value = extendlist(param.split("=",1), 2, "") + params[key] = urllib.unquote(value) + + accountname = params.get("account", "") + + if command == "goim": + print params + account = findaccount(accountname, protocol) + conversation = cgaim.GaimConversationNew(1, account, params["screenname"]) + if "message" in params: + im = cgaim.GaimConversationGetImData(conversation) + gaim.GaimConvImSend(im, params["message"]) + return None + + elif command == "gochat": + account = findaccount(accountname, protocol) + connection = cgaim.GaimAccountGetConnection(account) + return gaim.ServJoinChat(connection, params) + + elif command == "addbuddy": + account = findaccount(accountname, protocol) + return cgaim.GaimBlistRequestAddBuddy(account, params["screenname"], + params.get("group", ""), "") + + elif command == "setstatus": + current = gaim.GaimSavedstatusGetCurrent() + + if "status" in params: + status_id = params["status"] + status_type = gaim.GaimPrimitiveGetTypeFromId(status_id) + else: + status_type = gaim.GaimSavedStatusGetType(current) + status_id = gaim.GaimPrimitiveGetIdFromType(status_type) + + if "message" in params: + message = params["message"]; + else: + message = gaim.GaimSavedstatusGetMessage(current) + + if "account" in params: + accounts = [cgaim.GaimAccountsFindAny(accountname, protocol)] + + for account in accounts: + status = gaim.GaimAccountGetStatus(account, status_id) + type = gaim.GaimStatusGetType(status) + gaim.GaimSavedstatusSetSubstatus(current, account, type, message) + gaim.GaimSavedstatusActivateForAccount(current, account) + else: + accounts = gaim.GaimAccountsGetAllActive() + saved = gaim.GaimSavedstatusNew("", status_type) + gaim.GaimSavedstatusSetMessage(saved, message) + gaim.GaimSavedstatusActivate(saved) + + return None + + elif command == "getinfo": + account = findaccount(accountname, protocol) + connection = cgaim.GaimAccountGetConnection(account) + return gaim.ServGetInfo(connection, params["screenname"]) + + elif command == "quit": + return gaim.GaimCoreQuit() + + elif command == "uri": + return None + + else: + match = re.match(r"(\w+)\s*\(([^)]*)\)", command) + if match is not None: + name = match.group(1) + argstr = match.group(2) + if argstr == "": + args = [] + else: + args = argstr.split(",") + fargs = [] + for arg in args: + fargs.append(convert(arg.strip())) + return gaim.__getattr__(name)(*fargs) + else: + # introspect the object to get parameter names and types + # this is slow because the entire introspection info must be downloaded + data = dbus.Interface(obj, "org.freedesktop.DBus.Introspectable").\ + Introspect() + introspect = xml.dom.minidom.parseString(data).documentElement + for method in introspect.all("method"): + if command == method.getAttribute("name"): + methodparams = [] + for arg in method.all("arg"): + if arg.getAttribute("direction") == "in": + value = params[arg.getAttribute("name")] + type = arg.getAttribute("type") + if type == "s": + methodparams.append(value) + elif type == "i": + methodparams.append(int(value)) + else: + raise "Don't know how to handle type \"%s\"" % type + return gaim.__getattr__(command)(*methodparams) + raise "Unknown command: %s" % command + + +if len(sys.argv) == 1: + print """This program uses DBus to communicate with gaim. + +Usage: + + %s "command1" "command2" ... + +Each command is of one of the three types: + + [protocol:]commandname?param1=value1¶m2=value2&... + FunctionName?param1=value1¶m2=value2&... + FunctionName(value1,value2,...) + +The second and third form are provided for completeness but their use +is not recommended; use gaim-send or gaim-send-async instead. The +second form uses introspection to find out the parameter names and +their types, therefore it is rather slow. + +Examples of commands: + + jabber:goim?screenname=testone@localhost&message=hi + jabber:gochat?room=TestRoom&server=conference.localhost + jabber:getinfo?screenname=testone@localhost + jabber:addbuddy?screenname=my friend + + setstatus?status=away&message=don't disturb + quit + + GaimAccountsFindConnected?name=&protocol=prpl-jabber + GaimAccountFindConnected(,prpl-jabber) +""" % sys.argv[0] + +for arg in sys.argv[1:]: + print execute(arg) + + Property changes on: trunk/src/gaim-remote ___________________________________________________________________ Name: svn:executable + * Name: svn:mime-type + text/plain Name: svn:keywords + Author Date Id Revision Name: svn:eol-style + native Deleted: trunk/src/gaim-remote.py =================================================================== --- trunk/src/gaim-remote.py 2006-05-11 01:35:30 UTC (rev 16176) +++ trunk/src/gaim-remote.py 2006-05-11 17:02:46 UTC (rev 16177) @@ -1,212 +0,0 @@ -#!/usr/bin/python - -import dbus -import re -import urllib -import sys - -import xml.dom.minidom - -xml.dom.minidom.Element.all = xml.dom.minidom.Element.getElementsByTagName - -obj = dbus.SessionBus().get_object("net.sf.gaim.GaimService", "/net/sf/gaim/GaimObject") -gaim = dbus.Interface(obj, "net.sf.gaim.GaimInterface") - -class CheckedObject: - def __init__(self, obj): - self.obj = obj - - def __getattr__(self, attr): - return CheckedAttribute(self, attr) - -class CheckedAttribute: - def __init__(self, cobj, attr): - self.cobj = cobj - self.attr = attr - - def __call__(self, *args): - result = self.cobj.obj.__getattr__(self.attr)(*args) - if result == 0: - raise "Error: " + self.attr + " " + str(args) + " returned " + str(result) - return result - -cgaim = CheckedObject(gaim) - -urlregexp = r"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?" - -def extendlist(list, length, fill): - if len(list) < length: - return list + [fill] * (length - len(list)) - else: - return list - -def convert(value): - try: - return int(value) - except: - return value - -def findaccount(accountname, protocolname): - try: - # prefer connected accounts - account = cgaim.GaimAccountsFindConnected(accountname, protocolname) - return account - except: - # try to get any account and connect it - account = cgaim.GaimAccountsFindAny(accountname, protocolname) - print gaim.GaimAccountGetUsername(account) - gaim.GaimAccountSetStatusVargs(account, "online", 1) - gaim.GaimAccountConnect(account) - return account - - -def execute(uri): - match = re.match(urlregexp, uri) - protocol = match.group(2) - if protocol == "aim" or protocol == "icq": - protocol = "oscar" - if protocol is not None: - protocol = "prpl-" + protocol - command = match.group(5) - paramstring = match.group(7) - params = {} - if paramstring is not None: - for param in paramstring.split("&"): - key, value = extendlist(param.split("=",1), 2, "") - params[key] = urllib.unquote(value) - - accountname = params.get("account", "") - - if command == "goim": - print params - account = findaccount(accountname, protocol) - conversation = cgaim.GaimConversationNew(1, account, params["screenname"]) - if "message" in params: - im = cgaim.GaimConversationGetImData(conversation) - gaim.GaimConvImSend(im, params["message"]) - return None - - elif command == "gochat": - account = findaccount(accountname, protocol) - connection = cgaim.GaimAccountGetConnection(account) - return gaim.ServJoinChat(connection, params) - - elif command == "addbuddy": - account = findaccount(accountname, protocol) - return cgaim.GaimBlistRequestAddBuddy(account, params["screenname"], - params.get("group", ""), "") - - elif command == "setstatus": - current = gaim.GaimSavedstatusGetCurrent() - - if "status" in params: - status_id = params["status"] - status_type = gaim.GaimPrimitiveGetTypeFromId(status_id) - else: - status_type = gaim.GaimSavedStatusGetType(current) - status_id = gaim.GaimPrimitiveGetIdFromType(status_type) - - if "message" in params: - message = params["message"]; - else: - message = gaim.GaimSavedstatusGetMessage(current) - - if "account" in params: - accounts = [cgaim.GaimAccountsFindAny(accountname, protocol)] - - for account in accounts: - status = gaim.GaimAccountGetStatus(account, status_id) - type = gaim.GaimStatusGetType(status) - gaim.GaimSavedstatusSetSubstatus(current, account, type, message) - gaim.GaimSavedstatusActivateForAccount(current, account) - else: - accounts = gaim.GaimAccountsGetAllActive() - saved = gaim.GaimSavedstatusNew("", status_type) - gaim.GaimSavedstatusSetMessage(saved, message) - gaim.GaimSavedstatusActivate(saved) - - return None - - elif command == "getinfo": - account = findaccount(accountname, protocol) - connection = cgaim.GaimAccountGetConnection(account) - return gaim.ServGetInfo(connection, params["screenname"]) - - elif command == "quit": - return gaim.GaimCoreQuit() - - elif command == "uri": - return None - - else: - match = re.match(r"(\w+)\s*\(([^)]*)\)", command) - if match is not None: - name = match.group(1) - argstr = match.group(2) - if argstr == "": - args = [] - else: - args = argstr.split(",") - fargs = [] - for arg in args: - fargs.append(convert(arg.strip())) - return gaim.__getattr__(name)(*fargs) - else: - # introspect the object to get parameter names and types - # this is slow because the entire introspection info must be downloaded - data = dbus.Interface(obj, "org.freedesktop.DBus.Introspectable").\ - Introspect() - introspect = xml.dom.minidom.parseString(data).documentElement - for method in introspect.all("method"): - if command == method.getAttribute("name"): - methodparams = [] - for arg in method.all("arg"): - if arg.getAttribute("direction") == "in": - value = params[arg.getAttribute("name")] - type = arg.getAttribute("type") - if type == "s": - methodparams.append(value) - elif type == "i": - methodparams.append(int(value)) - else: - raise "Don't know how to handle type \"%s\"" % type - return gaim.__getattr__(command)(*methodparams) - raise "Unknown command: %s" % command - - -if len(sys.argv) == 1: - print """This program uses DBus to communicate with gaim. - -Usage: - - %s "command1" "command2" ... - -Each command is of one of the three types: - - [protocol:]commandname?param1=value1¶m2=value2&... - FunctionName?param1=value1¶m2=value2&... - FunctionName(value1,value2,...) - -The second and third form are provided for completeness but their use -is not recommended; use gaim-send or gaim-send-async instead. The -second form uses introspection to find out the parameter names and -their types, therefore it is rather slow. - -Examples of commands: - - jabber:goim?screenname=testone@localhost&message=hi - jabber:gochat?room=TestRoom&server=conference.localhost - jabber:getinfo?screenname=testone@localhost - jabber:addbuddy?screenname=my friend - - setstatus?status=away&message=don't disturb - quit - - GaimAccountsFindConnected?name=&protocol=prpl-jabber - GaimAccountFindConnected(,prpl-jabber) -""" % sys.argv[0] - -for arg in sys.argv[1:]: - print execute(arg) - - This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rl...@us...> - 2006-05-12 23:05:00
|
Revision: 16185 Author: rlaager Date: 2006-05-12 16:04:48 -0700 (Fri, 12 May 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16185&view=rev Log Message: ----------- SF Patch #1480147 from sanmarcos- "This removes unused scrollbars (i.e, there is nothing to scroll, and the bar is visible) in GtkAccount, GtkPounce, GtkPrivacy, GtkFt and GtkPlugin." I don't know of any compelling reason we have forced scrollbars here, and forcing scrollbars is almost always wrong, in my opinion. Modified Paths: -------------- trunk/src/gtkaccount.c trunk/src/gtkft.c trunk/src/gtkplugin.c trunk/src/gtkpounce.c trunk/src/gtkprivacy.c Modified: trunk/src/gtkaccount.c =================================================================== --- trunk/src/gtkaccount.c 2006-05-12 22:25:26 UTC (rev 16184) +++ trunk/src/gtkaccount.c 2006-05-12 23:04:48 UTC (rev 16185) @@ -2391,10 +2391,10 @@ /* Create the scrolled window. */ sw = gtk_scrolled_window_new(0, 0); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_ALWAYS); + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), - GTK_SHADOW_IN); + GTK_SHADOW_IN); gtk_widget_show(sw); /* Create the list model. */ Modified: trunk/src/gtkft.c =================================================================== --- trunk/src/gtkft.c 2006-05-12 22:25:26 UTC (rev 16184) +++ trunk/src/gtkft.c 2006-05-12 23:04:48 UTC (rev 16185) @@ -547,10 +547,10 @@ /* Create the scrolled window. */ sw = gtk_scrolled_window_new(0, 0); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), - GTK_SHADOW_IN); + GTK_SHADOW_IN); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_ALWAYS); + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); gtk_widget_show(sw); /* Build the tree model */ Modified: trunk/src/gtkplugin.c =================================================================== --- trunk/src/gtkplugin.c 2006-05-12 22:25:26 UTC (rev 16184) +++ trunk/src/gtkplugin.c 2006-05-12 23:04:48 UTC (rev 16185) @@ -547,7 +547,7 @@ gtk_window_set_role(GTK_WINDOW(plugin_dialog), "plugins"); sw = gtk_scrolled_window_new(NULL,NULL); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_IN); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(plugin_dialog)->vbox), sw, TRUE, TRUE, 0); Modified: trunk/src/gtkpounce.c =================================================================== --- trunk/src/gtkpounce.c 2006-05-12 22:25:26 UTC (rev 16184) +++ trunk/src/gtkpounce.c 2006-05-12 23:04:48 UTC (rev 16185) @@ -1184,10 +1184,10 @@ /* Create the scrolled window */ sw = gtk_scrolled_window_new(0, 0); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_ALWAYS); + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), - GTK_SHADOW_IN); + GTK_SHADOW_IN); gtk_widget_show(sw); /* Create the list model */ Modified: trunk/src/gtkprivacy.c =================================================================== --- trunk/src/gtkprivacy.c 2006-05-12 22:25:26 UTC (rev 16184) +++ trunk/src/gtkprivacy.c 2006-05-12 23:04:48 UTC (rev 16185) @@ -150,8 +150,8 @@ sw = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_ALWAYS); + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_IN); treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model)); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rl...@us...> - 2006-05-18 20:53:11
|
Revision: 16193 Author: rlaager Date: 2006-05-18 13:53:03 -0700 (Thu, 18 May 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16193&view=rev Log Message: ----------- SF Patch #1461027 from Sadrul "This patch: - adds a Conversation->More menu with a list of plugin-actions which now show up in the context-menu for a buddy in the buddy-list. - adds the same actions in the context-menu of the buddies in the chat-list. ... I find this somewhat useful to start a conference or start a doodle-session from the conv. window rather than having to do what from the buddy list." It seems useful to me, but I won't cry if people object and want it removed. If you don't like it, let me know. Modified Paths: -------------- trunk/src/gtkconv.c trunk/src/gtkutils.c Modified: trunk/src/gtkconv.c =================================================================== --- trunk/src/gtkconv.c 2006-05-18 15:44:02 UTC (rev 16192) +++ trunk/src/gtkconv.c 2006-05-18 20:53:03 UTC (rev 16193) @@ -1540,6 +1540,7 @@ GaimConvChat *chat = GAIM_CONV_CHAT(conv); gboolean is_me = FALSE; GtkWidget *button; + GaimBuddy *buddy = NULL; if (gc != NULL) prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); @@ -1616,7 +1617,7 @@ } if (!is_me && prpl_info && !(prpl_info->options & OPT_PROTO_UNIQUE_CHATNAME)) { - if (gaim_find_buddy(conv->account, who)) + if ((buddy = gaim_find_buddy(conv->account, who)) != NULL) button = gaim_new_item_from_stock(menu, _("Remove"), GTK_STOCK_REMOVE, G_CALLBACK(menu_chat_add_remove_cb), GAIM_GTK_CONVERSATION(conv), 0, 0, NULL); else @@ -1635,6 +1636,15 @@ if (!get_mark_for_user(GAIM_GTK_CONVERSATION(conv), who)) gtk_widget_set_sensitive(button, FALSE); + if (buddy != NULL) + { + if (gaim_account_is_connected(conv->account)) + gaim_gtk_append_blist_node_proto_menu(menu, conv->account->gc, + (GaimBlistNode *)buddy); + gaim_gtk_append_blist_node_extended_menu(menu, (GaimBlistNode *)buddy); + gtk_widget_show_all(menu); + } + return menu; } @@ -2611,6 +2621,7 @@ "<StockItem>", GAIM_STOCK_INFO }, { N_("/Conversation/In_vite..."), NULL, menu_invite_cb, 0, "<StockItem>", GAIM_STOCK_INVITE }, + { N_("/Conversation/M_ore"), NULL, NULL, 0, "<Branch>", NULL }, { "/Conversation/sep2", NULL, NULL, 0, "<Separator>", NULL }, @@ -2704,12 +2715,67 @@ } } +static void +regenerate_options_items(GaimGtkWindow *win) +{ + GtkWidget *menu; + GList *list; + GaimGtkConversation *gtkconv; + GaimConversation *conv; + GaimBuddy *buddy; + gtkconv = gaim_gtk_conv_window_get_active_gtkconv(win); + conv = gtkconv->active_conv; + buddy = gaim_find_buddy(conv->account, conv->name); + + menu = gtk_item_factory_get_widget(win->menu.item_factory, N_("/Conversation/More")); + + /* Remove the previous entries */ + for (list = gtk_container_get_children(GTK_CONTAINER(menu)); list; ) + { + GtkWidget *w = list->data; + list = list->next; + gtk_widget_destroy(w); + } + + /* Now add the stuff */ + if (buddy) + { + if (gaim_account_is_connected(conv->account)) + gaim_gtk_append_blist_node_proto_menu(menu, conv->account->gc, + (GaimBlistNode *)buddy); + gaim_gtk_append_blist_node_extended_menu(menu, (GaimBlistNode *)buddy); + } + + if ((list = gtk_container_get_children(GTK_CONTAINER(menu))) == NULL) + { + GtkWidget *item = gtk_menu_item_new_with_label(_("No actions available")); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); + gtk_widget_set_sensitive(item, FALSE); + } + + gtk_widget_show_all(menu); +} + +static void menubar_activated(GtkWidget *item, gpointer data) +{ + regenerate_options_items(data); + g_signal_handlers_block_by_func(G_OBJECT(item), G_CALLBACK(menubar_activated), data); +} + +static void +focus_out_from_menubar(GtkWidget *wid, GaimGtkWindow *win) +{ + GtkWidget *menuitem = gtk_item_factory_get_item(win->menu.item_factory, N_("/Conversation")); + g_signal_handlers_unblock_by_func(G_OBJECT(menuitem), G_CALLBACK(menubar_activated), win); +} + static GtkWidget * setup_menubar(GaimGtkWindow *win) { GtkAccelGroup *accel_group; const char *method; + GtkWidget *menuitem; accel_group = gtk_accel_group_new (); gtk_window_add_accel_group(GTK_WINDOW(win->window), accel_group); @@ -2727,10 +2793,13 @@ g_signal_connect(G_OBJECT(accel_group), "accel-changed", G_CALLBACK(gaim_gtk_save_accels_cb), NULL); + menuitem = gtk_item_factory_get_item(win->menu.item_factory, N_("/Conversation")); + g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(menubar_activated), win); win->menu.menubar = gtk_item_factory_get_widget(win->menu.item_factory, "<main>"); + g_signal_connect(G_OBJECT(win->menu.menubar), "deactivate", G_CALLBACK(focus_out_from_menubar), win); win->menu.view_log = gtk_item_factory_get_widget(win->menu.item_factory, Modified: trunk/src/gtkutils.c =================================================================== --- trunk/src/gtkutils.c 2006-05-18 15:44:02 UTC (rev 16192) +++ trunk/src/gtkutils.c 2006-05-18 20:53:03 UTC (rev 16193) @@ -1687,16 +1687,10 @@ if (act == NULL) { gaim_separator(menu); } else { - GtkWidget *menuitem, *label; + GtkWidget *menuitem; if (act->children == NULL) { - menuitem = gtk_menu_item_new(); - label = gtk_label_new(""); - gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); - gtk_label_set_pattern(GTK_LABEL(label), "_"); - gtk_label_set_markup_with_mnemonic(GTK_LABEL(label), - act->label); - gtk_container_add(GTK_CONTAINER(menuitem), label); + menuitem = gtk_menu_item_new_with_mnemonic(act->label); if (act->callback != NULL) { g_object_set_data(G_OBJECT(menuitem), @@ -1716,6 +1710,7 @@ } else { GList *l = NULL; GtkWidget *submenu = NULL; + GtkAccelGroup *group; menuitem = gtk_menu_item_new_with_mnemonic(act->label); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); @@ -1723,6 +1718,14 @@ submenu = gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu); + group = gtk_menu_get_accel_group(GTK_MENU(menu)); + if (group) { + char *path = g_strdup_printf("%s/%s", GTK_MENU_ITEM(menuitem)->accel_path, act->label); + gtk_menu_set_accel_path(GTK_MENU(submenu), path); + g_free(path); + gtk_menu_set_accel_group(GTK_MENU(submenu), group); + } + for (l = act->children; l; l = l->next) { GaimMenuAction *act = (GaimMenuAction *)l->data; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rl...@us...> - 2006-05-21 03:10:53
|
Revision: 16195 Author: rlaager Date: 2006-05-20 20:10:46 -0700 (Sat, 20 May 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16195&view=rev Log Message: ----------- Rest of SF Patch #1492122 from Sadrul Some typo fixes and doc cleanups. Modified Paths: -------------- trunk/src/dbus-server.h trunk/src/gtkutils.h trunk/src/ntlm.h trunk/src/pounce.h trunk/src/util.h Modified: trunk/src/dbus-server.h =================================================================== --- trunk/src/dbus-server.h 2006-05-21 02:58:03 UTC (rev 16194) +++ trunk/src/dbus-server.h 2006-05-21 03:10:46 UTC (rev 16195) @@ -50,7 +50,7 @@ GaimDBusType *parent; }; -/* By convesion, the GaimDBusType variable representing each structure +/* By convention, the GaimDBusType variable representing each structure GaimSomeStructure has the name GAIM_DBUS_TYPE_GaimSomeStructure. The following macros facilitate defining such variables Modified: trunk/src/gtkutils.h =================================================================== --- trunk/src/gtkutils.h 2006-05-21 02:58:03 UTC (rev 16194) +++ trunk/src/gtkutils.h 2006-05-21 03:10:46 UTC (rev 16195) @@ -409,7 +409,7 @@ * Create a Gaim running-man icon with the status emblem overlayed * in the lower right corner. * - * @param status_type The status type to set the emblem for. + * @param primitive The status type to set the emblem for. * @param scale_factor The amount to scale to the original image. * The default size is 32x32 pixels. A scale * factor of 1 means no scaling will be done. @@ -423,15 +423,15 @@ * allocate the image buffer, or the image file contained * invalid data. */ -GdkPixbuf *gaim_gtk_create_gaim_icon_with_status(GaimStatusPrimitive primitve, double scale_factor); +GdkPixbuf *gaim_gtk_create_gaim_icon_with_status(GaimStatusPrimitive primitive, double scale_factor); /** * Append a GaimMenuAction to a menu. * - * @param menu The menu to append to. - * @param act The GaimMenuAction to append. - * @param object The object to be passed to the action callback. + * @param menu The menu to append to. + * @param act The GaimMenuAction to append. + * @param gobject The object to be passed to the action callback. * * @return The menu. */ Modified: trunk/src/ntlm.h =================================================================== --- trunk/src/ntlm.h 2006-05-21 02:58:03 UTC (rev 16194) +++ trunk/src/ntlm.h 2006-05-21 03:10:46 UTC (rev 16195) @@ -40,6 +40,8 @@ * Parses the ntlm type 2 message * * @param type2 String containing the base64 encoded type2 message + * @param flags If not @c NULL, this will store the flags for the message + * * @return The nonce for use in message type3. This is a statically * allocated 8 byte binary string. */ Modified: trunk/src/pounce.h =================================================================== --- trunk/src/pounce.h 2006-05-21 02:58:03 UTC (rev 16194) +++ trunk/src/pounce.h 2006-05-21 03:10:46 UTC (rev 16195) @@ -98,6 +98,7 @@ * @param pouncer The account that will pounce. * @param pouncee The buddy to pounce on. * @param event The event(s) to pounce on. + * @param option Pounce options. * * @return The new buddy pounce structure. */ Modified: trunk/src/util.h =================================================================== --- trunk/src/util.h 2006-05-21 02:58:03 UTC (rev 16194) +++ trunk/src/util.h 2006-05-21 03:10:46 UTC (rev 16195) @@ -244,7 +244,7 @@ * The returned string is stored in a static buffer, so the result * should be g_strdup()'d if it's going to be kept. * - * @param time The time to format, or @c NULL to use the current local time + * @param tm The time to format, or @c NULL to use the current local time * * @return The date, formatted as per the user's settings. */ @@ -256,7 +256,7 @@ * The returned string is stored in a static buffer, so the result * should be g_strdup()'d if it's going to be kept. * - * @param time The time to format, or @c NULL to use the current local time + * @param tm The time to format, or @c NULL to use the current local time * * @return The timestamp, formatted as per the user's settings. */ @@ -268,7 +268,7 @@ * The returned string is stored in a static buffer, so the result * should be g_strdup()'d if it's going to be kept. * - * @param time The time to format, or @c NULL to use the current local time + * @param tm The time to format, or @c NULL to use the current local time * * @return The date and time, formatted as per the user's settings. */ @@ -280,8 +280,7 @@ * The returned string is stored in a static buffer, so the result * should be g_strdup()'d if it's going to be kept. * - * @param time The time value to format. - * @param time The time to format, or @c NULL to use the current local time + * @param tm The time to format, or @c NULL to use the current local time * * @return The time, formatted as per the user's settings. */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dat...@us...> - 2006-05-26 03:26:19
|
Revision: 16198 Author: datallah Date: 2006-05-25 20:26:03 -0700 (Thu, 25 May 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16198&view=rev Log Message: ----------- Fix some places where a closed socket isn't being dealt with correctly. This may be the cause of the high CPU usage that some people have noticed. Most of these were reported by Eduardo P?\195?\169rez. Modified Paths: -------------- trunk/src/ft.c trunk/src/protocols/irc/dcc_send.c trunk/src/protocols/jabber/si.c trunk/src/proxy.c Modified: trunk/src/ft.c =================================================================== --- trunk/src/ft.c 2006-05-24 17:38:42 UTC (rev 16197) +++ trunk/src/ft.c 2006-05-26 03:26:03 UTC (rev 16198) @@ -794,6 +794,8 @@ else if ((gaim_xfer_get_size(xfer) > 0) && ((gaim_xfer_get_bytes_sent(xfer)+r) >= gaim_xfer_get_size(xfer))) gaim_xfer_set_completed(xfer, TRUE); + else if (r == 0) + r = -1; } return r; @@ -835,7 +837,7 @@ r = gaim_xfer_read(xfer, &buffer); if (r > 0) { fwrite(buffer, 1, r, xfer->dest_fp); - } else if(r < 0) { + } else if(r <= 0) { gaim_xfer_cancel_remote(xfer); return; } Modified: trunk/src/protocols/irc/dcc_send.c =================================================================== --- trunk/src/protocols/irc/dcc_send.c 2006-05-24 17:38:42 UTC (rev 16197) +++ trunk/src/protocols/irc/dcc_send.c 2006-05-26 03:26:03 UTC (rev 16198) @@ -178,7 +178,7 @@ if (len < 0 && errno == EAGAIN) return; - else if (len < 0) { + else if (len <= 0) { /* XXX: Shouldn't this be canceling the transfer? */ gaim_input_remove(xd->inpa); xd->inpa = 0; Modified: trunk/src/protocols/jabber/si.c =================================================================== --- trunk/src/protocols/jabber/si.c 2006-05-24 17:38:42 UTC (rev 16197) +++ trunk/src/protocols/jabber/si.c 2006-05-26 03:26:03 UTC (rev 16198) @@ -273,7 +273,7 @@ len = read(source, buffer, 5 - jsx->rxlen); if(len < 0 && errno == EAGAIN) return; - else if(len < 0) { + else if(len <= 0) { gaim_input_remove(xfer->watcher); xfer->watcher = 0; close(source); @@ -297,7 +297,7 @@ len = read(source, buffer, jsx->rxqueue[4] + 5 + 2 - jsx->rxlen); if(len < 0 && errno == EAGAIN) return; - else if(len < 0) { + else if(len <= 0) { gaim_input_remove(xfer->watcher); xfer->watcher = 0; close(source); @@ -415,7 +415,7 @@ len = read(source, buffer, 2 - jsx->rxlen); if(len < 0 && errno == EAGAIN) return; - else if(len < 0) { + else if(len <= 0) { gaim_input_remove(xfer->watcher); xfer->watcher = 0; close(source); @@ -431,7 +431,7 @@ len = read(source, buffer, jsx->rxqueue[1] + 2 - jsx->rxlen); if(len < 0 && errno == EAGAIN) return; - else if(len < 0) { + else if(len <= 0) { gaim_input_remove(xfer->watcher); xfer->watcher = 0; close(source); Modified: trunk/src/proxy.c =================================================================== --- trunk/src/proxy.c 2006-05-24 17:38:42 UTC (rev 16197) +++ trunk/src/proxy.c 2006-05-26 03:26:03 UTC (rev 16198) @@ -1119,7 +1119,7 @@ len = read(source, p, max_read); if(len < 0 && errno == EAGAIN) return; - else if(len < 0) { + else if(len <= 0) { close(source); source = -1; g_free(phb->read_buffer); @@ -1508,7 +1508,7 @@ len = read(source, buf, max_read); - if ((len < 0 && errno == EAGAIN) || len + phb->read_len < 4) + if ((len < 0 && errno == EAGAIN) || (len > 0 && len + phb->read_len < 4)) return; else if (len + phb->read_len >= 4) { if (phb->read_buffer[1] == 90) { @@ -1663,7 +1663,7 @@ len = read(source, dest, (phb->read_buf_len - phb->read_len)); if(len < 0 && errno == EAGAIN) return; - else if(len < 0) { + else if(len <= 0) { gaim_debug_warning("socks5 proxy", "or not...\n"); close(source); gaim_input_remove(phb->inpa); @@ -1775,7 +1775,7 @@ phb->read_buf_len - phb->read_len); if(len < 0 && errno == EAGAIN) return; - else if(len < 0) { + else if(len <= 0) { close(source); gaim_input_remove(phb->inpa); g_free(phb->read_buffer); @@ -1867,7 +1867,7 @@ if(len < 0 && errno == EAGAIN) return; - else if(len < 0) { + else if(len <= 0) { close(source); gaim_input_remove(phb->inpa); g_free(phb->read_buffer); @@ -1994,7 +1994,7 @@ phb->read_buf_len - phb->read_len); if(len < 0 && errno == EAGAIN) return; - else if(len < 0) { + else if(len <= 0) { close(source); gaim_input_remove(phb->inpa); g_free(phb->read_buffer); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rl...@us...> - 2006-06-19 05:39:35
|
Revision: 16282 Author: rlaager Date: 2006-06-18 22:39:30 -0700 (Sun, 18 Jun 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16282&view=rev Log Message: ----------- SF Patch #1502594 from Yosef Radchenko "Patches three instances of memory leaks with gaim_accounts_get_all_active" Modified Paths: -------------- trunk/plugins/idle.c trunk/plugins/perl/common/Account.xs trunk/src/gtkmain.c Modified: trunk/plugins/idle.c =================================================================== --- trunk/plugins/idle.c 2006-06-19 05:17:54 UTC (rev 16281) +++ trunk/plugins/idle.c 2006-06-19 05:39:30 UTC (rev 16282) @@ -102,12 +102,13 @@ idle_all_action_ok(void *ignored, GaimRequestFields *fields) { GaimAccount *acct = NULL; - GList *l = gaim_accounts_get_all_active(); + GList *list, *iter; int tm = gaim_request_fields_get_integer(fields, "mins"); const char *prpl_id = NULL; - for(; l; l = l->next) { - acct = (GaimAccount *)(l->data); + list = gaim_accounts_get_all_active(); + for(iter = list; iter; iter = iter->next) { + acct = (GaimAccount *)(iter->data); if(acct) prpl_id = gaim_account_get_protocol_id(acct); @@ -122,6 +123,8 @@ idled_accts = g_list_append(idled_accts, acct); } } + + g_list_free(list); } static void Modified: trunk/plugins/perl/common/Account.xs =================================================================== --- trunk/plugins/perl/common/Account.xs 2006-06-19 05:17:54 UTC (rev 16281) +++ trunk/plugins/perl/common/Account.xs 2006-06-19 05:39:30 UTC (rev 16282) @@ -286,11 +286,13 @@ void gaim_accounts_get_all_active() PREINIT: - GList *l; + GList *list, *iter; PPCODE: - for (l = gaim_accounts_get_all_active(); l != NULL; l = l->next) { - XPUSHs(sv_2mortal(gaim_perl_bless_object(l->data, "Gaim::Account"))); + list = gaim_accounts_get_all_active(); + for (iter = gaim_accounts_get_all_active(); iter != NULL; iter = iter->next) { + XPUSHs(sv_2mortal(gaim_perl_bless_object(iter->data, "Gaim::Account"))); } + g_list_free(list); Gaim::Account gaim_accounts_find(name, protocol) Modified: trunk/src/gtkmain.c =================================================================== --- trunk/src/gtkmain.c 2006-06-19 05:17:54 UTC (rev 16281) +++ trunk/src/gtkmain.c 2006-06-19 05:39:30 UTC (rev 16282) @@ -432,6 +432,7 @@ char *opt_session_arg = NULL; int dologin_ret = -1; char *search_path; + GList *accounts; #ifdef HAVE_SIGNAL_H int sig_indx; /* for setting up signal catching */ sigset_t sigset; @@ -752,10 +753,14 @@ gaim_accounts_restore_current_statuses(); } - if (gaim_accounts_get_all_active() == NULL) + if ((accounts = gaim_accounts_get_all_active()) == NULL) { gaim_gtk_accounts_window_show(); } + else + { + g_list_free(accounts); + } #ifdef HAVE_STARTUP_NOTIFICATION startup_notification_complete(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rl...@us...> - 2006-06-19 06:31:21
|
Revision: 16287 Author: rlaager Date: 2006-06-18 23:31:11 -0700 (Sun, 18 Jun 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16287&view=rev Log Message: ----------- SF Patch #1503847 from Sadrul "This patch "contactizes" the send history in a conversation, ie. with this patch you can get the previously sent messages by pressing ctrl+up/down after switching the account during a contactized conversation." Modified Paths: -------------- trunk/plugins/ChangeLog.API trunk/plugins/perl/common/Conversation.xs trunk/src/conversation.c trunk/src/conversation.h trunk/src/gtkconv.c trunk/src/gtkconv.h Modified: trunk/plugins/ChangeLog.API =================================================================== --- trunk/plugins/ChangeLog.API 2006-06-19 06:27:18 UTC (rev 16286) +++ trunk/plugins/ChangeLog.API 2006-06-19 06:31:11 UTC (rev 16287) @@ -173,6 +173,8 @@ * GAIM_MESSAGE_COLORIZE * user_data from gaim_notify_searchresults_new_rows and from notify_searchresults in GaimNotifyUiOps. + * gaim_conversation_get_send_history(), and send_history from + GaimConversation Added: * gaim_prefs_disconnect_by_handle() Modified: trunk/plugins/perl/common/Conversation.xs =================================================================== --- trunk/plugins/perl/common/Conversation.xs 2006-06-19 06:27:18 UTC (rev 16286) +++ trunk/plugins/perl/common/Conversation.xs 2006-06-19 06:31:11 UTC (rev 16287) @@ -46,16 +46,6 @@ PROTOTYPES: ENABLE void -gaim_conversation_get_send_history(conv) - Gaim::Conversation conv -PREINIT: - GList *l; -PPCODE: - for (l = gaim_conversation_get_send_history(conv); l != NULL; l = l->next) { - XPUSHs(sv_2mortal(newSVpv(l->data, 0))); - } - -void gaim_conversation_destroy(conv) Gaim::Conversation conv Modified: trunk/src/conversation.c =================================================================== --- trunk/src/conversation.c 2006-06-19 06:27:18 UTC (rev 16286) +++ trunk/src/conversation.c 2006-06-19 06:31:11 UTC (rev 16287) @@ -263,7 +263,6 @@ conv->account = account; conv->name = g_strdup(name); conv->title = g_strdup(name); - conv->send_history = g_list_append(NULL, NULL); conv->data = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); /* copy features from the connection. */ @@ -419,17 +418,6 @@ conv->name = NULL; conv->title = NULL; - for (node = g_list_first(conv->send_history); - node != NULL; - node = g_list_next(node)) { - - if (node->data != NULL) - g_free(node->data); - node->data = NULL; - } - - g_list_free(g_list_first(conv->send_history)); - if (conv->type == GAIM_CONV_TYPE_IM) { gaim_conv_im_stop_typing_timeout(conv->u.im); gaim_conv_im_stop_type_again_timeout(conv->u.im); @@ -708,14 +696,6 @@ conv->logs = NULL; } -GList * -gaim_conversation_get_send_history(const GaimConversation *conv) -{ - g_return_val_if_fail(conv != NULL, NULL); - - return conv->send_history; -} - GaimConvIm * gaim_conversation_get_im_data(const GaimConversation *conv) { Modified: trunk/src/conversation.h =================================================================== --- trunk/src/conversation.h 2006-06-19 06:27:18 UTC (rev 16286) +++ trunk/src/conversation.h 2006-06-19 06:31:11 UTC (rev 16287) @@ -236,8 +236,6 @@ GList *logs; /**< This conversation's logs */ - GList *send_history; /**< The send history. */ - union { GaimConvIm *im; /**< IM-specific data. */ @@ -441,15 +439,6 @@ void gaim_conversation_close_logs(GaimConversation *conv); /** - * Returns the specified conversation's send history. - * - * @param conv The conversation. - * - * @return The conversation's send history. - */ -GList *gaim_conversation_get_send_history(const GaimConversation *conv); - -/** * Returns the specified conversation's IM-specific data. * * If the conversation type is not GAIM_CONV_TYPE_IM, this will return @c NULL. Modified: trunk/src/gtkconv.c =================================================================== --- trunk/src/gtkconv.c 2006-06-19 06:27:18 UTC (rev 16286) +++ trunk/src/gtkconv.c 2006-06-19 06:31:11 UTC (rev 16287) @@ -427,18 +427,14 @@ } static void -send_history_add(GaimConversation *conv, const char *message) +send_history_add(GaimGtkConversation *gtkconv, const char *message) { GList *first; - first = g_list_first(conv->send_history); - - if (first->data) - g_free(first->data); - + first = g_list_first(gtkconv->send_history); + g_free(first->data); first->data = g_strdup(message); - - conv->send_history = g_list_prepend(first, NULL); + gtkconv->send_history = g_list_prepend(first, NULL); } static gboolean @@ -462,7 +458,7 @@ GtkTextIter end; send_history = gtk_imhtml_get_markup(GTK_IMHTML(gtkconv->entry)); - send_history_add(conv, send_history); + send_history_add(gtkconv, send_history); g_free(send_history); cmdline = cmd + strlen(prefix); @@ -562,7 +558,7 @@ bufs = gtk_imhtml_get_markup_lines(GTK_IMHTML(gtkconv->entry)); for (i = 0; bufs[i]; i++) { - send_history_add(conv, bufs[i]); + send_history_add(gtkconv, bufs[i]); if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) gaim_conv_im_send_with_flags(GAIM_CONV_IM(conv), bufs[i], flags); else if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_CHAT) @@ -572,7 +568,7 @@ g_strfreev(bufs); } else { - send_history_add(conv, buf); + send_history_add(gtkconv, buf); if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_IM) gaim_conv_im_send_with_flags(GAIM_CONV_IM(conv), buf, flags); else if (gaim_conversation_get_type(conv) == GAIM_CONV_TYPE_CHAT) @@ -1787,29 +1783,28 @@ if (event->state & GDK_CONTROL_MASK) { switch (event->keyval) { case GDK_Up: - if (!conv->send_history) + if (!gtkconv->send_history) break; - if (!conv->send_history->prev) { + if (!gtkconv->send_history->prev) { GtkTextIter start, end; - if (conv->send_history->data) - g_free(conv->send_history->data); + g_free(gtkconv->send_history->data); gtk_text_buffer_get_start_iter(gtkconv->entry_buffer, &start); gtk_text_buffer_get_end_iter(gtkconv->entry_buffer, &end); - conv->send_history->data = + gtkconv->send_history->data = gtk_imhtml_get_markup(GTK_IMHTML(gtkconv->entry)); } - if (conv->send_history->next && conv->send_history->next->data) { + if (gtkconv->send_history->next && gtkconv->send_history->next->data) { GObject *object; GtkTextIter iter; GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(gtkconv->entry)); - conv->send_history = conv->send_history->next; + gtkconv->send_history = gtkconv->send_history->next; /* Block the signal to prevent application of default formatting. */ object = g_object_ref(G_OBJECT(gtkconv->entry)); @@ -1824,7 +1819,7 @@ gtk_imhtml_clear(GTK_IMHTML(gtkconv->entry)); gtk_imhtml_append_text_with_images( - GTK_IMHTML(gtkconv->entry), conv->send_history->data, + GTK_IMHTML(gtkconv->entry), gtkconv->send_history->data, 0, NULL); /* this is mainly just a hack so the formatting at the * cursor gets picked up. */ @@ -1836,15 +1831,15 @@ break; case GDK_Down: - if (!conv->send_history) + if (!gtkconv->send_history) break; - if (conv->send_history->prev && conv->send_history->prev->data) { + if (gtkconv->send_history->prev && gtkconv->send_history->prev->data) { GObject *object; GtkTextIter iter; GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(gtkconv->entry)); - conv->send_history = conv->send_history->prev; + gtkconv->send_history = gtkconv->send_history->prev; /* Block the signal to prevent application of default formatting. */ object = g_object_ref(G_OBJECT(gtkconv->entry)); @@ -1859,11 +1854,11 @@ gtk_imhtml_clear(GTK_IMHTML(gtkconv->entry)); gtk_imhtml_append_text_with_images( - GTK_IMHTML(gtkconv->entry), conv->send_history->data, + GTK_IMHTML(gtkconv->entry), gtkconv->send_history->data, 0, NULL); /* this is mainly just a hack so the formatting at the * cursor gets picked up. */ - if (*(char *)conv->send_history->data) { + if (*(char *)gtkconv->send_history->data) { gtk_text_buffer_get_end_iter(buffer, &iter); gtk_text_buffer_move_mark_by_name(buffer, "insert", &iter); } else { @@ -4347,6 +4342,7 @@ conv->ui_data = gtkconv; gtkconv->active_conv = conv; gtkconv->convs = g_list_prepend(gtkconv->convs, conv); + gtkconv->send_history = g_list_append(NULL, NULL); /* Setup some initial variables. */ gtkconv->sg = gtk_size_group_new(GTK_SIZE_GROUP_BOTH); @@ -4515,6 +4511,10 @@ gtk_object_sink(GTK_OBJECT(gtkconv->tooltips)); + gtkconv->send_history = g_list_first(gtkconv->send_history); + g_list_foreach(gtkconv->send_history, (GFunc)g_free, NULL); + g_list_free(gtkconv->send_history); + g_free(gtkconv); } Modified: trunk/src/gtkconv.h =================================================================== --- trunk/src/gtkconv.h 2006-06-19 06:27:18 UTC (rev 16286) +++ trunk/src/gtkconv.h 2006-06-19 06:31:11 UTC (rev 16287) @@ -114,6 +114,7 @@ { GaimConversation *active_conv; GList *convs; + GList *send_history; GaimGtkWindow *win; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <the...@us...> - 2006-06-20 08:18:01
|
Revision: 16295 Author: thekingant Date: 2006-06-20 01:17:49 -0700 (Tue, 20 Jun 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16295&view=rev Log Message: ----------- Hopefully improve the typing notification code so it's a lot easier to understand. This also creates a distinction between the signals emitted when receiving GAIM_TYPED and GAIM_NOT_TYPING messages (by adding a gaim-typed signal). And the gaim-not-typing signal should work in all cases. Most of this is stuff I changed last week during work, thanks to Meebo Modified Paths: -------------- trunk/plugins/perl/common/Conversation.xs trunk/plugins/perl/common/Server.xs trunk/src/conversation.c trunk/src/conversation.h trunk/src/gtkconv.c trunk/src/gtkpounce.c trunk/src/pounce.c trunk/src/pounce.h trunk/src/protocols/jabber/message.c trunk/src/protocols/jabber/message.h trunk/src/protocols/msn/msn.c trunk/src/protocols/novell/novell.c trunk/src/protocols/oscar/oscar.c trunk/src/protocols/sametime/sametime.c trunk/src/protocols/simple/simple.c trunk/src/protocols/yahoo/yahoo.c trunk/src/protocols/zephyr/zephyr.c trunk/src/prpl.h trunk/src/server.c trunk/src/server.h Modified: trunk/plugins/perl/common/Conversation.xs =================================================================== --- trunk/plugins/perl/common/Conversation.xs 2006-06-20 04:05:56 UTC (rev 16294) +++ trunk/plugins/perl/common/Conversation.xs 2006-06-20 08:17:49 UTC (rev 16295) @@ -179,15 +179,15 @@ Gaim::Conversation::IM im void -gaim_conv_im_start_type_again_timeout(im) +gaim_conv_im_start_send_typed_timeout(im) Gaim::Conversation::IM im void -gaim_conv_im_stop_type_again_timeout(im) +gaim_conv_im_stop_send_typed_timeout(im) Gaim::Conversation::IM im guint -gaim_conv_im_get_type_again_timeout(im) +gaim_conv_im_get_send_typed_timeout(im) Gaim::Conversation::IM im void Modified: trunk/plugins/perl/common/Server.xs =================================================================== --- trunk/plugins/perl/common/Server.xs 2006-06-20 04:05:56 UTC (rev 16294) +++ trunk/plugins/perl/common/Server.xs 2006-06-20 08:17:49 UTC (rev 16295) @@ -200,10 +200,10 @@ Gaim::MessageFlags flags int -serv_send_typing(con, a, b) +serv_send_typing(con, a, state) Gaim::Connection con const char * a - int b + Gaim::TypingState state void serv_set_buddyicon(gc, filename) Modified: trunk/src/conversation.c =================================================================== --- trunk/src/conversation.c 2006-06-20 04:05:56 UTC (rev 16294) +++ trunk/src/conversation.c 2006-06-20 08:17:49 UTC (rev 16295) @@ -46,39 +46,44 @@ } static gboolean -reset_typing(gpointer data) +reset_typing_cb(gpointer data) { GaimConversation *c = (GaimConversation *)data; GaimConvIm *im; - if (!g_list_find(conversations, c)) - return FALSE; - im = GAIM_CONV_IM(c); gaim_conv_im_set_typing_state(im, GAIM_NOT_TYPING); gaim_conv_im_update_typing(im); gaim_conv_im_stop_typing_timeout(im); + gaim_signal_emit(gaim_conversations_get_handle(), + "buddy-typing-stopped", c); + return FALSE; } static gboolean -send_typed(gpointer data) +send_typed_cb(gpointer data) { GaimConversation *conv = (GaimConversation *)data; GaimConnection *gc; const char *name; g_return_val_if_fail(conv != NULL, FALSE); - + gc = gaim_conversation_get_gc(conv); name = gaim_conversation_get_name(conv); if (gc != NULL && name != NULL) { - gaim_conv_im_set_type_again(GAIM_CONV_IM(conv), TRUE); + /* We set this to 1 so that GAIM_TYPING will be sent + * if the Gaim user types anything else. + */ + gaim_conv_im_set_type_again(GAIM_CONV_IM(conv), 1); serv_send_typing(gc, name, GAIM_TYPED); + gaim_signal_emit(gaim_conversations_get_handle(), + "buddy-typed", conv); gaim_debug(GAIM_DEBUG_MISC, "conversation", "typed...\n"); } @@ -420,7 +425,7 @@ if (conv->type == GAIM_CONV_TYPE_IM) { gaim_conv_im_stop_typing_timeout(conv->u.im); - gaim_conv_im_stop_type_again_timeout(conv->u.im); + gaim_conv_im_stop_send_typed_timeout(conv->u.im); if (conv->u.im->icon != NULL) gaim_buddy_icon_unref(conv->u.im->icon); @@ -986,9 +991,14 @@ gaim_signal_emit(gaim_conversations_get_handle(), "buddy-typing", im->conv->account, im->conv->name); } - else + else if (state == GAIM_TYPED) { gaim_signal_emit(gaim_conversations_get_handle(), + "buddy-typed", im->conv->account, im->conv->name); + } + else if (state == GAIM_NOT_TYPING) + { + gaim_signal_emit(gaim_conversations_get_handle(), "buddy-typing-stopped", im->conv->account, im->conv->name); } } @@ -1016,7 +1026,7 @@ conv = gaim_conv_im_get_conversation(im); name = gaim_conversation_get_name(conv); - im->typing_timeout = gaim_timeout_add(timeout * 1000, reset_typing, conv); + im->typing_timeout = gaim_timeout_add(timeout * 1000, reset_typing_cb, conv); } void @@ -1040,11 +1050,14 @@ } void -gaim_conv_im_set_type_again(GaimConvIm *im, time_t val) +gaim_conv_im_set_type_again(GaimConvIm *im, unsigned int val) { g_return_if_fail(im != NULL); - im->type_again = val; + if (val == 0) + im->type_again = 0; + else + im->type_again = time(NULL) + val; } time_t @@ -1056,32 +1069,32 @@ } void -gaim_conv_im_start_type_again_timeout(GaimConvIm *im) +gaim_conv_im_start_send_typed_timeout(GaimConvIm *im) { g_return_if_fail(im != NULL); - im->type_again_timeout = gaim_timeout_add(SEND_TYPED_TIMEOUT, send_typed, + im->send_typed_timeout = gaim_timeout_add(SEND_TYPED_TIMEOUT, send_typed_cb, gaim_conv_im_get_conversation(im)); } void -gaim_conv_im_stop_type_again_timeout(GaimConvIm *im) +gaim_conv_im_stop_send_typed_timeout(GaimConvIm *im) { g_return_if_fail(im != NULL); - if (im->type_again_timeout == 0) + if (im->send_typed_timeout == 0) return; - gaim_timeout_remove(im->type_again_timeout); - im->type_again_timeout = 0; + gaim_timeout_remove(im->send_typed_timeout); + im->send_typed_timeout = 0; } guint -gaim_conv_im_get_type_again_timeout(const GaimConvIm *im) +gaim_conv_im_get_send_typed_timeout(const GaimConvIm *im) { g_return_val_if_fail(im != NULL, 0); - return im->type_again_timeout; + return im->send_typed_timeout; } void @@ -2090,6 +2103,12 @@ GAIM_SUBTYPE_ACCOUNT), gaim_value_new(GAIM_TYPE_STRING)); + gaim_signal_register(handle, "buddy-typed", + gaim_marshal_VOID__POINTER_POINTER, NULL, 2, + gaim_value_new(GAIM_TYPE_SUBTYPE, + GAIM_SUBTYPE_ACCOUNT), + gaim_value_new(GAIM_TYPE_STRING)); + gaim_signal_register(handle, "buddy-typing-stopped", gaim_marshal_VOID__POINTER_POINTER, NULL, 2, gaim_value_new(GAIM_TYPE_SUBTYPE, Modified: trunk/src/conversation.h =================================================================== --- trunk/src/conversation.h 2006-06-20 04:05:56 UTC (rev 16294) +++ trunk/src/conversation.h 2006-06-20 08:17:49 UTC (rev 16295) @@ -186,7 +186,7 @@ GaimTypingState typing_state; /**< The current typing state. */ guint typing_timeout; /**< The typing timer handle. */ time_t type_again; /**< The type again time. */ - guint type_again_timeout; /**< The type again timer handle. */ + guint send_typed_timeout; /**< The type again timer handle. */ GaimBuddyIcon *icon; /**< The buddy icon. */ }; @@ -666,19 +666,25 @@ guint gaim_conv_im_get_typing_timeout(const GaimConvIm *im); /** - * Sets the IM's time until it should send another typing notification. + * Sets the quiet-time when no GAIM_TYPING messages will be sent. + * Few protocols need this (maybe only MSN). If the user is still + * typing after this quiet-period, then another GAIM_TYPING message + * will be sent. * * @param im The IM. - * @param val The time. + * @param val The number of seconds to wait before allowing another + * GAIM_TYPING message to be sent to the user. Or 0 to + * not send another GAIM_TYPING message. */ -void gaim_conv_im_set_type_again(GaimConvIm *im, time_t val); +void gaim_conv_im_set_type_again(GaimConvIm *im, unsigned int val); /** - * Returns the IM's time until it should send another typing notification. + * Returns the time after which another GAIM_TYPING message should be sent. * * @param im The IM. * - * @return The time. + * @return The time in seconds since the epoch. Or 0 if no additional + * GAIM_TYPING message should be sent. */ time_t gaim_conv_im_get_type_again(const GaimConvIm *im); @@ -687,14 +693,14 @@ * * @param im The IM. */ -void gaim_conv_im_start_type_again_timeout(GaimConvIm *im); +void gaim_conv_im_start_send_typed_timeout(GaimConvIm *im); /** * Stops the IM's type again timeout. * * @param im The IM. */ -void gaim_conv_im_stop_type_again_timeout(GaimConvIm *im); +void gaim_conv_im_stop_send_typed_timeout(GaimConvIm *im); /** * Returns the IM's type again timeout interval. @@ -703,7 +709,7 @@ * * @return The type again timeout interval. */ -guint gaim_conv_im_get_type_again_timeout(const GaimConvIm *im); +guint gaim_conv_im_get_send_typed_timeout(const GaimConvIm *im); /** * Updates the visual typing notification for an IM conversation. Modified: trunk/src/gtkconv.c =================================================================== --- trunk/src/gtkconv.c 2006-06-20 04:05:56 UTC (rev 16294) +++ trunk/src/gtkconv.c 2006-06-20 08:17:49 UTC (rev 16295) @@ -2168,8 +2168,7 @@ if (gtk_text_iter_is_start(start_pos) && gtk_text_iter_is_end(end_pos)) { /* We deleted all the text, so turn off typing. */ - if (gaim_conv_im_get_type_again_timeout(im)) - gaim_conv_im_stop_type_again_timeout(im); + gaim_conv_im_stop_send_typed_timeout(im); serv_send_typing(gaim_conversation_get_gc(conv), gaim_conversation_get_name(conv), @@ -2913,22 +2912,18 @@ im = GAIM_CONV_IM(conv); - if (gaim_conv_im_get_type_again_timeout(im)) - gaim_conv_im_stop_type_again_timeout(im); + gaim_conv_im_stop_send_typed_timeout(im); + gaim_conv_im_start_send_typed_timeout(im); - gaim_conv_im_start_type_again_timeout(im); - + /* Check if we need to send another GAIM_TYPING message */ if (first || (gaim_conv_im_get_type_again(im) != 0 && - time(NULL) > gaim_conv_im_get_type_again(im))) { - - int timeout = serv_send_typing(gaim_conversation_get_gc(conv), - (char *)gaim_conversation_get_name(conv), - GAIM_TYPING); - - if (timeout) - gaim_conv_im_set_type_again(im, time(NULL) + timeout); - else - gaim_conv_im_set_type_again(im, 0); + time(NULL) > gaim_conv_im_get_type_again(im))) + { + unsigned int timeout; + timeout = serv_send_typing(gaim_conversation_get_gc(conv), + gaim_conversation_get_name(conv), + GAIM_TYPING); + gaim_conv_im_set_type_again(im, timeout); } } Modified: trunk/src/gtkpounce.c =================================================================== --- trunk/src/gtkpounce.c 2006-06-20 04:05:56 UTC (rev 16294) +++ trunk/src/gtkpounce.c 2006-06-20 08:17:49 UTC (rev 16295) @@ -81,6 +81,7 @@ GtkWidget *idle; GtkWidget *idle_return; GtkWidget *typing; + GtkWidget *typed; GtkWidget *stop_typing; GtkWidget *message_recv; @@ -278,6 +279,9 @@ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->typing))) events |= GAIM_POUNCE_TYPING; + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->typed))) + events |= GAIM_POUNCE_TYPED; + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->stop_typing))) events |= GAIM_POUNCE_TYPING_STOPPED; @@ -564,7 +568,7 @@ /* Create the "Pounce When Buddy..." frame. */ frame = gaim_gtk_make_frame(vbox2, _("Pounce When Buddy...")); - table = gtk_table_new(2, 4, FALSE); + table = gtk_table_new(5, 2, FALSE); gtk_container_add(GTK_CONTAINER(frame), table); gtk_table_set_col_spacings(GTK_TABLE(table), GAIM_HIG_BORDER); gtk_widget_show(table); @@ -583,29 +587,33 @@ gtk_check_button_new_with_mnemonic(_("Is no longer i_dle")); dialog->typing = gtk_check_button_new_with_mnemonic(_("Starts _typing")); + dialog->typed = + gtk_check_button_new_with_mnemonic(_("P_auses while typing")); dialog->stop_typing = gtk_check_button_new_with_mnemonic(_("Stops t_yping")); dialog->message_recv = gtk_check_button_new_with_mnemonic(_("Sends a _message")); - gtk_table_attach(GTK_TABLE(table), dialog->signon, 0, 1, 0, 1, + gtk_table_attach(GTK_TABLE(table), dialog->message_recv, 0, 1, 0, 1, GTK_FILL, 0, 0, 0); - gtk_table_attach(GTK_TABLE(table), dialog->signoff, 1, 2, 0, 1, + gtk_table_attach(GTK_TABLE(table), dialog->signon, 0, 1, 1, 2, GTK_FILL, 0, 0, 0); - gtk_table_attach(GTK_TABLE(table), dialog->away, 0, 1, 1, 2, + gtk_table_attach(GTK_TABLE(table), dialog->signoff, 0, 1, 2, 3, GTK_FILL, 0, 0, 0); - gtk_table_attach(GTK_TABLE(table), dialog->away_return, 1, 2, 1, 2, + gtk_table_attach(GTK_TABLE(table), dialog->away, 0, 1, 3, 4, GTK_FILL, 0, 0, 0); - gtk_table_attach(GTK_TABLE(table), dialog->idle, 0, 1, 2, 3, + gtk_table_attach(GTK_TABLE(table), dialog->away_return, 0, 1, 4, 5, GTK_FILL, 0, 0, 0); - gtk_table_attach(GTK_TABLE(table), dialog->idle_return, 1, 2, 2, 3, + gtk_table_attach(GTK_TABLE(table), dialog->idle, 1, 2, 0, 1, GTK_FILL, 0, 0, 0); - gtk_table_attach(GTK_TABLE(table), dialog->typing, 0, 1, 3, 4, + gtk_table_attach(GTK_TABLE(table), dialog->idle_return, 1, 2, 1, 2, GTK_FILL, 0, 0, 0); - gtk_table_attach(GTK_TABLE(table), dialog->stop_typing, 1, 2, 3, 4, + gtk_table_attach(GTK_TABLE(table), dialog->typing, 1, 2, 2, 3, GTK_FILL, 0, 0, 0); - gtk_table_attach(GTK_TABLE(table), dialog->message_recv, 0, 1, 4, 5, + gtk_table_attach(GTK_TABLE(table), dialog->typed, 1, 2, 3, 4, GTK_FILL, 0, 0, 0); + gtk_table_attach(GTK_TABLE(table), dialog->stop_typing, 1, 2, 4, 5, + GTK_FILL, 0, 0, 0); gtk_widget_show(dialog->signon); gtk_widget_show(dialog->signoff); @@ -614,6 +622,7 @@ gtk_widget_show(dialog->idle); gtk_widget_show(dialog->idle_return); gtk_widget_show(dialog->typing); + gtk_widget_show(dialog->typed); gtk_widget_show(dialog->stop_typing); gtk_widget_show(dialog->message_recv); @@ -845,6 +854,8 @@ (events & GAIM_POUNCE_IDLE_RETURN)); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->typing), (events & GAIM_POUNCE_TYPING)); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->typed), + (events & GAIM_POUNCE_TYPED)); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->stop_typing), (events & GAIM_POUNCE_TYPING_STOPPED)); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->message_recv), @@ -1429,6 +1440,8 @@ tmp = g_strdup_printf( (events & GAIM_POUNCE_TYPING) ? _("%s has started typing to you (%s)") : + (events & GAIM_POUNCE_TYPED) ? + _("%s has paused while typing to you (%s)") : (events & GAIM_POUNCE_SIGNON) ? _("%s has signed on (%s)") : (events & GAIM_POUNCE_IDLE_RETURN) ? Modified: trunk/src/pounce.c =================================================================== --- trunk/src/pounce.c 2006-06-20 04:05:56 UTC (rev 16294) +++ trunk/src/pounce.c 2006-06-20 08:17:49 UTC (rev 16295) @@ -206,6 +206,8 @@ add_event_to_xmlnode(child, "return-from-idle"); if (events & GAIM_POUNCE_TYPING) add_event_to_xmlnode(child, "start-typing"); + if (events & GAIM_POUNCE_TYPED) + add_event_to_xmlnode(child, "typed"); if (events & GAIM_POUNCE_TYPING_STOPPED) add_event_to_xmlnode(child, "stop-typing"); if (events & GAIM_POUNCE_MESSAGE_RECEIVED) @@ -411,7 +413,7 @@ else if (!strcmp(element_name, "option")) { if (!strcmp(data->option_type, "on-away")) data->options |= GAIM_POUNCE_OPTION_AWAY; - + g_free(data->option_type); data->option_type = NULL; } @@ -430,6 +432,8 @@ data->events |= GAIM_POUNCE_IDLE_RETURN; else if (!strcmp(data->event_type, "start-typing")) data->events |= GAIM_POUNCE_TYPING; + else if (!strcmp(data->event_type, "typed")) + data->events |= GAIM_POUNCE_TYPED; else if (!strcmp(data->event_type, "stop-typing")) data->events |= GAIM_POUNCE_TYPING_STOPPED; else if (!strcmp(data->event_type, "message-received")) @@ -1059,10 +1063,16 @@ conv = gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, name, account); if (conv != NULL) { + GaimTypingState state; GaimPounceEvent event; - event = (gaim_conv_im_get_typing_state(GAIM_CONV_IM(conv)) == GAIM_TYPING - ? GAIM_POUNCE_TYPING : GAIM_POUNCE_TYPING_STOPPED); + state = gaim_conv_im_get_typing_state(GAIM_CONV_IM(conv)); + if (state == GAIM_TYPED) + event = GAIM_POUNCE_TYPED; + else if (state == GAIM_NOT_TYPING) + event = GAIM_POUNCE_TYPING_STOPPED; + else + event = GAIM_POUNCE_TYPING; gaim_pounce_execute(account, name, event); } @@ -1105,6 +1115,8 @@ gaim_signal_connect(conv_handle, "buddy-typing", handle, GAIM_CALLBACK(buddy_typing_cb), NULL); + gaim_signal_connect(conv_handle, "buddy-typed", + handle, GAIM_CALLBACK(buddy_typing_cb), NULL); gaim_signal_connect(conv_handle, "buddy-typing-stopped", handle, GAIM_CALLBACK(buddy_typing_cb), NULL); Modified: trunk/src/pounce.h =================================================================== --- trunk/src/pounce.h 2006-06-20 04:05:56 UTC (rev 16294) +++ trunk/src/pounce.h 2006-06-20 08:17:49 UTC (rev 16295) @@ -35,16 +35,17 @@ */ typedef enum { - GAIM_POUNCE_NONE = 0x00, /**< No events. */ - GAIM_POUNCE_SIGNON = 0x01, /**< The buddy signed on. */ - GAIM_POUNCE_SIGNOFF = 0x02, /**< The buddy signed off. */ - GAIM_POUNCE_AWAY = 0x04, /**< The buddy went away. */ - GAIM_POUNCE_AWAY_RETURN = 0x08, /**< The buddy returned from away. */ - GAIM_POUNCE_IDLE = 0x10, /**< The buddy became idle. */ - GAIM_POUNCE_IDLE_RETURN = 0x20, /**< The buddy is no longer idle. */ - GAIM_POUNCE_TYPING = 0x40, /**< The buddy started typing. */ - GAIM_POUNCE_TYPING_STOPPED = 0x80, /**< The buddy stopped typing. */ - GAIM_POUNCE_MESSAGE_RECEIVED = 0x100 /**< The buddy sent a message */ + GAIM_POUNCE_NONE = 0x000, /**< No events. */ + GAIM_POUNCE_SIGNON = 0x001, /**< The buddy signed on. */ + GAIM_POUNCE_SIGNOFF = 0x002, /**< The buddy signed off. */ + GAIM_POUNCE_AWAY = 0x004, /**< The buddy went away. */ + GAIM_POUNCE_AWAY_RETURN = 0x008, /**< The buddy returned from away. */ + GAIM_POUNCE_IDLE = 0x010, /**< The buddy became idle. */ + GAIM_POUNCE_IDLE_RETURN = 0x020, /**< The buddy is no longer idle. */ + GAIM_POUNCE_TYPING = 0x040, /**< The buddy started typing. */ + GAIM_POUNCE_TYPED = 0x080, /**< The buddy has entered text. */ + GAIM_POUNCE_TYPING_STOPPED = 0x100, /**< The buddy stopped typing. */ + GAIM_POUNCE_MESSAGE_RECEIVED = 0x200 /**< The buddy sent a message */ } GaimPounceEvent; Modified: trunk/src/protocols/jabber/message.c =================================================================== --- trunk/src/protocols/jabber/message.c 2006-06-20 04:05:56 UTC (rev 16294) +++ trunk/src/protocols/jabber/message.c 2006-06-20 08:17:49 UTC (rev 16295) @@ -589,7 +589,7 @@ return 1; } -int jabber_send_typing(GaimConnection *gc, const char *who, int typing) +unsigned int jabber_send_typing(GaimConnection *gc, const char *who, GaimTypingState state) { JabberMessage *jm; JabberBuddy *jb; @@ -611,9 +611,9 @@ jm->to = g_strdup(who); jm->id = jabber_get_next_id(jm->js); - if(GAIM_TYPING == typing) + if(GAIM_TYPING == state) jm->chat_state = JM_STATE_COMPOSING; - else if(GAIM_TYPED == typing) + else if(GAIM_TYPED == state) jm->chat_state = JM_STATE_PAUSED; else jm->chat_state = JM_STATE_ACTIVE; Modified: trunk/src/protocols/jabber/message.h =================================================================== --- trunk/src/protocols/jabber/message.h 2006-06-20 04:05:56 UTC (rev 16294) +++ trunk/src/protocols/jabber/message.h 2006-06-20 08:17:49 UTC (rev 16295) @@ -71,7 +71,7 @@ GaimMessageFlags flags); int jabber_message_send_chat(GaimConnection *gc, int id, const char *message, GaimMessageFlags flags); -int jabber_send_typing(GaimConnection *gc, const char *who, int typing); +unsigned int jabber_send_typing(GaimConnection *gc, const char *who, GaimTypingState state); #endif /* _GAIM_JABBER_MESSAGE_H_ */ Modified: trunk/src/protocols/msn/msn.c =================================================================== --- trunk/src/protocols/msn/msn.c 2006-06-20 04:05:56 UTC (rev 16294) +++ trunk/src/protocols/msn/msn.c 2006-06-20 08:17:49 UTC (rev 16295) @@ -836,8 +836,8 @@ return 1; } -static int -msn_send_typing(GaimConnection *gc, const char *who, int typing) +static unsigned int +msn_send_typing(GaimConnection *gc, const char *who, GaimTypingState state) { GaimAccount *account; MsnSession *session; @@ -847,7 +847,12 @@ account = gaim_connection_get_account(gc); session = gc->proto_data; - if (!typing) + /* + * TODO: I feel like this should be "if (state != GAIM_TYPING)" + * but this is how it was before, and I don't want to break + * anything. --KingAnt + */ + if (state == GAIM_NOT_TYPING) return 0; if (!g_ascii_strcasecmp(who, gaim_account_get_username(account))) Modified: trunk/src/protocols/novell/novell.c =================================================================== --- trunk/src/protocols/novell/novell.c 2006-06-20 04:05:56 UTC (rev 16294) +++ trunk/src/protocols/novell/novell.c 2006-06-20 08:17:49 UTC (rev 16295) @@ -2303,8 +2303,8 @@ return 1; } -static int -novell_send_typing(GaimConnection * gc, const char *name, int typing) +static unsigned int +novell_send_typing(GaimConnection * gc, const char *name, GaimTypingState state) { NMConference *conf = NULL; NMUser *user; @@ -2312,11 +2312,11 @@ NMERR_T rc = NM_OK; if (gc == NULL || name == NULL) - return -1; + return 0; user = gc->proto_data; if (user == NULL) - return -1; + return 0; /* Need to get the DN for the buddy so we can look up the convo */ dn = nm_lookup_dn(user, name); @@ -2327,7 +2327,7 @@ if (conf) { rc = nm_send_typing(user, conf, - ((typing == GAIM_TYPING) ? TRUE : FALSE), NULL); + ((state == GAIM_TYPING) ? TRUE : FALSE), NULL); _check_for_disconnect(user, rc); } Modified: trunk/src/protocols/oscar/oscar.c =================================================================== --- trunk/src/protocols/oscar/oscar.c 2006-06-20 04:05:56 UTC (rev 16294) +++ trunk/src/protocols/oscar/oscar.c 2006-06-20 08:17:49 UTC (rev 16295) @@ -3945,8 +3945,8 @@ flap_connection_send_keepalive(od, conn); } -static int -oscar_send_typing(GaimConnection *gc, const char *name, int typing) +static unsigned int +oscar_send_typing(GaimConnection *gc, const char *name, GaimTypingState state) { OscarData *od; PeerConnection *conn; @@ -3956,7 +3956,7 @@ if ((conn != NULL) && (conn->ready)) { - peer_odc_send_typing(conn, typing); + peer_odc_send_typing(conn, state); } else { /* Don't send if this turkey is in our deny list */ @@ -3965,9 +3965,9 @@ if (!list) { struct buddyinfo *bi = g_hash_table_lookup(od->buddyinfo, gaim_normalize(gc->account, name)); if (bi && bi->typingnot) { - if (typing == GAIM_TYPING) + if (state == GAIM_TYPING) aim_im_sendmtn(od, 0x0001, name, 0x0002); - else if (typing == GAIM_TYPED) + else if (state == GAIM_TYPED) aim_im_sendmtn(od, 0x0001, name, 0x0001); else aim_im_sendmtn(od, 0x0001, name, 0x0000); Modified: trunk/src/protocols/sametime/sametime.c =================================================================== --- trunk/src/protocols/sametime/sametime.c 2006-06-20 04:05:56 UTC (rev 16294) +++ trunk/src/protocols/sametime/sametime.c 2006-06-20 08:17:49 UTC (rev 16295) @@ -3965,14 +3965,14 @@ } -static int mw_prpl_send_typing(GaimConnection *gc, const char *name, - int typing) { +static unsigned int mw_prpl_send_typing(GaimConnection *gc, const char *name, + GaimTypingState state) { struct mwGaimPluginData *pd; struct mwIdBlock who = { (char *) name, NULL }; struct mwConversation *conv; - gpointer t = GINT_TO_POINTER(!! typing); + gpointer t = GINT_TO_POINTER(!! state); g_return_val_if_fail(gc != NULL, 0); pd = gc->proto_data; @@ -3984,7 +3984,7 @@ if(mwConversation_isOpen(conv)) return ! mwConversation_send(conv, mwImSend_TYPING, t); - if(typing) { + if ((state == GAIM_TYPING) || (state == GAIM_TYPED)) { /* let's only open a channel for typing, not for not-typing. Otherwise two users in psychic mode will continually open conversations to each other, never able to get rid of them, as @@ -3996,6 +3996,11 @@ mwConversation_open(conv); } + /* + * TODO: This should probably be "0." When it's set to 1, the Gaim + * core will call serv_send_typing(gc, who, GAIM_TYPING) once + * every second until the Gaim user stops typing. --KingAnt + */ return 1; } Modified: trunk/src/protocols/simple/simple.c =================================================================== --- trunk/src/protocols/simple/simple.c 2006-06-20 04:05:56 UTC (rev 16294) +++ trunk/src/protocols/simple/simple.c 2006-06-20 08:17:49 UTC (rev 16295) @@ -1053,7 +1053,7 @@ send_sip_response(sip->gc, msg, 200, "OK", NULL); } -static int simple_typing(GaimConnection *gc, const char *name, int typing) { +static unsigned int simple_typing(GaimConnection *gc, const char *name, GaimTypingState state) { struct simple_account_data *sip = gc->proto_data; gchar *xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" @@ -1065,16 +1065,22 @@ "<refresh>60</refresh>\n" "</isComposing>"; gchar *recv = g_strdup(name); - if(typing == GAIM_TYPING) { + if(state == GAIM_TYPING) { gchar *msg = g_strdup_printf(xml, "active"); simple_send_message(sip, recv, msg, "application/im-iscomposing+xml"); g_free(msg); - } else { + } else /* TODO: Only if (state == GAIM_TYPED) ? */ { gchar *msg = g_strdup_printf(xml, "idle"); simple_send_message(sip, recv, msg, "application/im-iscomposing+xml"); g_free(msg); } g_free(recv); + /* + * TODO: Is this right? It will cause the core to call + * serv_send_typing(gc, who, GAIM_TYPING) once every second + * until the user stops typing. If that's not desired, + * then return 0 instead. + */ return 1; } Modified: trunk/src/protocols/yahoo/yahoo.c =================================================================== --- trunk/src/protocols/yahoo/yahoo.c 2006-06-20 04:05:56 UTC (rev 16294) +++ trunk/src/protocols/yahoo/yahoo.c 2006-06-20 08:17:49 UTC (rev 16295) @@ -3131,12 +3131,12 @@ return ret; } -static int yahoo_send_typing(GaimConnection *gc, const char *who, int typ) +static unsigned int yahoo_send_typing(GaimConnection *gc, const char *who, GaimTypingState state) { struct yahoo_data *yd = gc->proto_data; struct yahoo_packet *pkt = yahoo_packet_new(YAHOO_SERVICE_NOTIFY, YAHOO_STATUS_TYPING, 0); yahoo_packet_hash(pkt, "ssssss", 49, "TYPING", 1, gaim_connection_get_display_name(gc), - 14, " ", 13, typ == GAIM_TYPING ? "1" : "0", + 14, " ", 13, state == GAIM_TYPING ? "1" : "0", 5, who, 1002, "1"); yahoo_packet_send_and_free(pkt, yd); Modified: trunk/src/protocols/zephyr/zephyr.c =================================================================== --- trunk/src/protocols/zephyr/zephyr.c 2006-06-20 04:05:56 UTC (rev 16294) +++ trunk/src/protocols/zephyr/zephyr.c 2006-06-20 08:17:49 UTC (rev 16295) @@ -2450,14 +2450,15 @@ return "zephyr"; } -static int zephyr_send_typing(GaimConnection *gc, const char *who, int typing) { +static unsigned int zephyr_send_typing(GaimConnection *gc, const char *who, GaimTypingState state) { gchar *recipient; zephyr_account *zephyr = gc->proto_data; if (use_tzc(zephyr)) return 0; - if (!typing) + if (state == GAIM_NOT_TYPING) return 0; + /* XXX We probably should care if this fails. Or maybe we don't want to */ if (!who) { gaim_debug_info("zephyr", "who is null\n"); @@ -2476,6 +2477,12 @@ gaim_debug_info("zephyr","about to send typing notification to %s\n",recipient); zephyr_send_message(zephyr,"MESSAGE","PERSONAL",recipient,"","","PING"); gaim_debug_info("zephyr","sent typing notification\n"); + + /* + * TODO: Is this correct? It means we will call + * serv_send_typing(gc, who, GAIM_TYPING) once every 15 seconds + * until the Gaim user stops typing. + */ return ZEPHYR_TYPING_SEND_TIMEOUT; } Modified: trunk/src/prpl.h =================================================================== --- trunk/src/prpl.h 2006-06-20 04:05:56 UTC (rev 16294) +++ trunk/src/prpl.h 2006-06-20 08:17:49 UTC (rev 16295) @@ -224,7 +224,7 @@ GaimMessageFlags flags); void (*set_info)(GaimConnection *, const char *info); - int (*send_typing)(GaimConnection *, const char *name, int typing); + unsigned int (*send_typing)(GaimConnection *, const char *name, GaimTypingState state); void (*get_info)(GaimConnection *, const char *who); void (*set_status)(GaimAccount *account, GaimStatus *status); Modified: trunk/src/server.c =================================================================== --- trunk/src/server.c 2006-06-20 04:05:56 UTC (rev 16294) +++ trunk/src/server.c 2006-06-20 08:17:49 UTC (rev 16295) @@ -38,18 +38,16 @@ #define SECS_BEFORE_RESENDING_AUTORESPONSE 600 #define SEX_BEFORE_RESENDING_AUTORESPONSE "Only after you're married" -/* This should return the elapsed time in seconds in which Gaim will not send - * typing notifications. - * if it returns zero, it will not send any more typing notifications - * typing is a flag - TRUE for typing, FALSE for stopped typing */ -int serv_send_typing(GaimConnection *g, const char *name, int typing) { +unsigned int +serv_send_typing(GaimConnection *gc, const char *name, GaimTypingState state) +{ GaimPluginProtocolInfo *prpl_info = NULL; - if (g != NULL && g->prpl != NULL) - prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(g->prpl); + if (gc != NULL && gc->prpl != NULL) + prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); - if (g && prpl_info && prpl_info->send_typing) - return prpl_info->send_typing(g, name, typing); + if (prpl_info && prpl_info->send_typing) + return prpl_info->send_typing(gc, name, state); return 0; } @@ -150,8 +148,8 @@ lar->sent = time(NULL); } - if (conv && gaim_conv_im_get_type_again_timeout(GAIM_CONV_IM(conv))) - gaim_conv_im_stop_type_again_timeout(GAIM_CONV_IM(conv)); + if (conv && gaim_conv_im_get_send_typed_timeout(GAIM_CONV_IM(conv))) + gaim_conv_im_stop_send_typed_timeout(GAIM_CONV_IM(conv)); return val; } @@ -593,7 +591,7 @@ else { gaim_signal_emit(gaim_conversations_get_handle(), - "buddy-typing-stopped", gc->account, name); + "buddy-typed", gc->account, name); } } @@ -618,6 +616,11 @@ gaim_conv_im_set_typing_state(im, GAIM_NOT_TYPING); gaim_conv_im_update_typing(im); } + else + { + gaim_signal_emit(gaim_conversations_get_handle(), + "buddy-typing-stopped", gc->account, name); + } gaim_signal_emit(gaim_conversations_get_handle(), "buddy-typing-stopped", gc->account, name); Modified: trunk/src/server.h =================================================================== --- trunk/src/server.h 2006-06-20 04:05:56 UTC (rev 16294) +++ trunk/src/server.h 2006-06-20 08:17:49 UTC (rev 16295) @@ -33,11 +33,27 @@ extern "C" { #endif +/** + * Send a typing message to a given user over a given connection. + * + * TODO: Could probably move this into the conversation API. + * + * @param typing One of GAIM_TYPING, GAIM_TYPED, or GAIM_NOT_TYPING. + * @return A quiet-period, specified in seconds, where Gaim will not + * send any additional typing notification messages. Most + * protocols should return 0, which means that no additional + * GAIM_TYPING messages need to be sent. If this is 5, for + * example, then Gaim will wait five seconds, and if the Gaim + * user is still typing then Gaim will send another GAIM_TYPING + * message. + */ +unsigned int serv_send_typing(GaimConnection *gc, const char *name, GaimTypingState state); + +void serv_move_buddy(GaimBuddy *, GaimGroup *, GaimGroup *); int serv_send_im(GaimConnection *, const char *, const char *, GaimMessageFlags flags); void serv_get_info(GaimConnection *, const char *); void serv_set_info(GaimConnection *, const char *); -int serv_send_typing(GaimConnection *, const char *, int); -void serv_move_buddy(GaimBuddy *, GaimGroup *, GaimGroup *); + void serv_add_permit(GaimConnection *, const char *); void serv_add_deny(GaimConnection *, const char *); void serv_rem_permit(GaimConnection *, const char *); @@ -51,12 +67,31 @@ int serv_chat_send(GaimConnection *, int, const char *, GaimMessageFlags flags); void serv_alias_buddy(GaimBuddy *); void serv_got_alias(GaimConnection *gc, const char *who, const char *alias); + +/** + * Receive a typing message from a remote user. Either GAIM_TYPING + * or GAIM_TYPED. If the user has stopped typing then use + * serv_got_typing_stopped instead. + * + * TODO: Could probably move this into the conversation API. + * + * @param timeout If this is a number greater than 0, then + * Gaim will wait this number of seconds and then + * set this buddy to the GAIM_NOT_TYPING state. This + * is used by protocols that send repeated typing messages + * while the user is composing the message. + */ void serv_got_typing(GaimConnection *gc, const char *name, int timeout, GaimTypingState state); -void serv_set_buddyicon(GaimConnection *gc, const char *filename); + +/** + * TODO: Could probably move this into the conversation API. + */ void serv_got_typing_stopped(GaimConnection *gc, const char *name); + void serv_got_im(GaimConnection *gc, const char *who, const char *msg, GaimMessageFlags flags, time_t mtime); +void serv_set_buddyicon(GaimConnection *gc, const char *filename); void serv_got_chat_invite(GaimConnection *gc, const char *name, const char *who, const char *message, GHashTable *data); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <sa...@us...> - 2006-06-24 22:25:27
|
Revision: 16333 Author: sadrul Date: 2006-06-24 15:25:22 -0700 (Sat, 24 Jun 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16333&view=rev Log Message: ----------- Patch #1511180: Buddy list ui_ops fix I had a hard time figuring out why things were not working even after I set the blist-uiops using gaim_blist_set_ui_ops. This patch is a fix for it. Modified Paths: -------------- trunk/plugins/ChangeLog.API trunk/src/blist.c trunk/src/blist.h trunk/src/status.c Modified: trunk/plugins/ChangeLog.API =================================================================== --- trunk/plugins/ChangeLog.API 2006-06-24 20:32:18 UTC (rev 16332) +++ trunk/plugins/ChangeLog.API 2006-06-24 22:25:22 UTC (rev 16333) @@ -176,6 +176,7 @@ notify_searchresults in GaimNotifyUiOps. * gaim_conversation_get_send_history(), and send_history from GaimConversation + * Removed ui_ops from GaimBuddyList. Use gaim_blist_get_ui_ops() instead Added: * gaim_prefs_disconnect_by_handle() Modified: trunk/src/blist.c =================================================================== --- trunk/src/blist.c 2006-06-24 20:32:18 UTC (rev 16332) +++ trunk/src/blist.c 2006-06-24 22:25:22 UTC (rev 16333) @@ -655,17 +655,18 @@ GaimBuddyList *gaim_blist_new() { + GaimBlistUiOps *ui_ops; GaimBuddyList *gbl = g_new0(GaimBuddyList, 1); GAIM_DBUS_REGISTER_POINTER(gbl, GaimBuddyList); - gbl->ui_ops = gaim_blist_get_ui_ops(); + ui_ops = gaim_blist_get_ui_ops(); gbl->buddies = g_hash_table_new_full((GHashFunc)_gaim_blist_hbuddy_hash, (GEqualFunc)_gaim_blist_hbuddy_equal, (GDestroyNotify)_gaim_blist_hbuddy_free_key, NULL); - if (gbl->ui_ops != NULL && gbl->ui_ops->new_list != NULL) - gbl->ui_ops->new_list(gbl); + if (ui_ops != NULL && ui_ops->new_list != NULL) + ui_ops->new_list(gbl); return gbl; } @@ -690,7 +691,7 @@ void gaim_blist_show() { - GaimBlistUiOps *ops = gaimbuddylist->ui_ops; + GaimBlistUiOps *ops = gaim_blist_get_ui_ops(); if (ops && ops->show) ops->show(gaimbuddylist); @@ -698,7 +699,7 @@ void gaim_blist_destroy() { - GaimBlistUiOps *ops = gaimbuddylist->ui_ops; + GaimBlistUiOps *ops = gaim_blist_get_ui_ops(); gaim_debug(GAIM_DEBUG_INFO, "blist", "Destroying\n"); @@ -708,7 +709,7 @@ void gaim_blist_set_visible(gboolean show) { - GaimBlistUiOps *ops = gaimbuddylist->ui_ops; + GaimBlistUiOps *ops = gaim_blist_get_ui_ops(); if (ops && ops->set_visible) ops->set_visible(gaimbuddylist, show); @@ -744,7 +745,7 @@ void gaim_blist_update_buddy_status(GaimBuddy *buddy, GaimStatus *old_status) { - GaimBlistUiOps *ops = gaimbuddylist->ui_ops; + GaimBlistUiOps *ops = gaim_blist_get_ui_ops(); GaimPresence *presence; GaimStatus *status; @@ -794,7 +795,7 @@ void gaim_blist_update_buddy_icon(GaimBuddy *buddy) { - GaimBlistUiOps *ops = gaimbuddylist->ui_ops; + GaimBlistUiOps *ops = gaim_blist_get_ui_ops(); g_return_if_fail(buddy != NULL); @@ -808,7 +809,7 @@ */ void gaim_blist_rename_buddy(GaimBuddy *buddy, const char *name) { - GaimBlistUiOps *ops = gaimbuddylist->ui_ops; + GaimBlistUiOps *ops = gaim_blist_get_ui_ops(); struct _gaim_hbuddy *hb; g_return_if_fail(buddy != NULL); @@ -834,7 +835,7 @@ void gaim_blist_alias_contact(GaimContact *contact, const char *alias) { - GaimBlistUiOps *ops = gaimbuddylist->ui_ops; + GaimBlistUiOps *ops = gaim_blist_get_ui_ops(); GaimConversation *conv; char *old_alias = contact->alias; GaimBlistNode *bnode; @@ -868,7 +869,7 @@ void gaim_blist_alias_chat(GaimChat *chat, const char *alias) { - GaimBlistUiOps *ops = gaimbuddylist->ui_ops; + GaimBlistUiOps *ops = gaim_blist_get_ui_ops(); char *old_alias = chat->alias; g_return_if_fail(chat != NULL); @@ -890,7 +891,7 @@ void gaim_blist_alias_buddy(GaimBuddy *buddy, const char *alias) { - GaimBlistUiOps *ops = gaimbuddylist->ui_ops; + GaimBlistUiOps *ops = gaim_blist_get_ui_ops(); GaimConversation *conv; char *old_alias = buddy->alias; @@ -918,7 +919,7 @@ void gaim_blist_server_alias_buddy(GaimBuddy *buddy, const char *alias) { - GaimBlistUiOps *ops = gaimbuddylist->ui_ops; + GaimBlistUiOps *ops = gaim_blist_get_ui_ops(); GaimConversation *conv; char *old_alias = buddy->server_alias; @@ -949,7 +950,7 @@ */ void gaim_blist_rename_group(GaimGroup *source, const char *new_name) { - GaimBlistUiOps *ops = gaimbuddylist->ui_ops; + GaimBlistUiOps *ops = gaim_blist_get_ui_ops(); GaimGroup *dest; gchar *old_name; GList *moved_buddies = NULL; @@ -1071,7 +1072,7 @@ GaimChat *gaim_chat_new(GaimAccount *account, const char *alias, GHashTable *components) { - GaimBlistUiOps *ops = gaimbuddylist->ui_ops; + GaimBlistUiOps *ops = gaim_blist_get_ui_ops(); GaimChat *chat; g_return_val_if_fail(account != NULL, FALSE); @@ -1094,7 +1095,7 @@ GaimBuddy *gaim_buddy_new(GaimAccount *account, const char *screenname, const char *alias) { - GaimBlistUiOps *ops = gaimbuddylist->ui_ops; + GaimBlistUiOps *ops = gaim_blist_get_ui_ops(); GaimBuddy *buddy; g_return_val_if_fail(account != NULL, FALSE); @@ -1169,7 +1170,7 @@ void gaim_blist_add_chat(GaimChat *chat, GaimGroup *group, GaimBlistNode *node) { GaimBlistNode *cnode = (GaimBlistNode*)chat; - GaimBlistUiOps *ops = gaimbuddylist->ui_ops; + GaimBlistUiOps *ops = gaim_blist_get_ui_ops(); g_return_if_fail(chat != NULL); g_return_if_fail(GAIM_BLIST_NODE_IS_CHAT((GaimBlistNode *)chat)); @@ -1251,7 +1252,7 @@ GaimBlistNode *cnode, *bnode; GaimGroup *g; GaimContact *c; - GaimBlistUiOps *ops = gaimbuddylist->ui_ops; + GaimBlistUiOps *ops = gaim_blist_get_ui_ops(); struct _gaim_hbuddy *hb; g_return_if_fail(buddy != NULL); @@ -1400,7 +1401,7 @@ void gaim_contact_set_alias(GaimContact *contact, const char *alias) { - GaimBlistUiOps *ops = gaimbuddylist->ui_ops; + GaimBlistUiOps *ops = gaim_blist_get_ui_ops(); char *old_alias = contact->alias; g_return_if_fail(contact != NULL); @@ -1486,7 +1487,7 @@ void gaim_blist_add_contact(GaimContact *contact, GaimGroup *group, GaimBlistNode *node) { - GaimBlistUiOps *ops = gaimbuddylist->ui_ops; + GaimBlistUiOps *ops = gaim_blist_get_ui_ops(); GaimGroup *g; GaimBlistNode *gnode, *cnode, *bnode; @@ -1652,7 +1653,7 @@ g_return_if_fail(group != NULL); g_return_if_fail(GAIM_BLIST_NODE_IS_GROUP((GaimBlistNode *)group)); - ops = gaimbuddylist->ui_ops; + ops = gaim_blist_get_ui_ops(); if (!gaimbuddylist->root) { gaimbuddylist->root = gnode; @@ -1702,7 +1703,7 @@ void gaim_blist_remove_contact(GaimContact *contact) { - GaimBlistUiOps *ops = gaimbuddylist->ui_ops; + GaimBlistUiOps *ops = gaim_blist_get_ui_ops(); GaimBlistNode *node, *gnode; g_return_if_fail(contact != NULL); @@ -1749,7 +1750,7 @@ void gaim_blist_remove_buddy(GaimBuddy *buddy) { - GaimBlistUiOps *ops = gaimbuddylist->ui_ops; + GaimBlistUiOps *ops = gaim_blist_get_ui_ops(); GaimBlistNode *node, *cnode, *gnode; GaimContact *contact; GaimGroup *group; @@ -1837,7 +1838,7 @@ void gaim_blist_remove_chat(GaimChat *chat) { - GaimBlistUiOps *ops = gaimbuddylist->ui_ops; + GaimBlistUiOps *ops = gaim_blist_get_ui_ops(); GaimBlistNode *node, *gnode; GaimGroup *group; @@ -1881,7 +1882,7 @@ void gaim_blist_remove_group(GaimGroup *group) { - GaimBlistUiOps *ops = gaimbuddylist->ui_ops; + GaimBlistUiOps *ops = gaim_blist_get_ui_ops(); GaimBlistNode *node; GList *l; @@ -2244,7 +2245,7 @@ void gaim_blist_add_account(GaimAccount *account) { - GaimBlistUiOps *ops = gaimbuddylist->ui_ops; + GaimBlistUiOps *ops = gaim_blist_get_ui_ops(); GaimBlistNode *gnode, *cnode, *bnode; g_return_if_fail(gaimbuddylist != NULL); @@ -2286,7 +2287,7 @@ void gaim_blist_remove_account(GaimAccount *account) { - GaimBlistUiOps *ops = gaimbuddylist->ui_ops; + GaimBlistUiOps *ops = gaim_blist_get_ui_ops(); GaimBlistNode *gnode, *cnode, *bnode; GaimBuddy *buddy; GaimChat *chat; Modified: trunk/src/blist.h =================================================================== --- trunk/src/blist.h 2006-06-24 20:32:18 UTC (rev 16332) +++ trunk/src/blist.h 2006-06-24 22:25:22 UTC (rev 16333) @@ -152,8 +152,6 @@ struct _GaimBuddyList { GaimBlistNode *root; /**< The first node in the buddy list */ GHashTable *buddies; /**< Every buddy in this list */ - GaimBlistUiOps *ui_ops; /**< The UI operations for the buddy list */ - void *ui_data; /**< UI-specific data. */ }; Modified: trunk/src/status.c =================================================================== --- trunk/src/status.c 2006-06-24 20:32:18 UTC (rev 16332) +++ trunk/src/status.c 2006-06-24 22:25:22 UTC (rev 16333) @@ -1298,7 +1298,7 @@ update_buddy_idle(GaimBuddy *buddy, GaimPresence *presence, time_t current_time, gboolean old_idle, gboolean idle) { - GaimBlistUiOps *ops = gaim_get_blist()->ui_ops; + GaimBlistUiOps *ops = gaim_blist_get_ui_ops(); if (!old_idle && idle) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <aar...@us...> - 2006-06-28 19:42:26
|
Revision: 16370 Author: aaronsheldon Date: 2006-06-28 12:42:20 -0700 (Wed, 28 Jun 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16370&view=rev Log Message: ----------- Merging r16220 through 16367 from blist-efficiency branch into trunk. Modified Paths: -------------- trunk/src/blist.c trunk/src/gtkblist.c Modified: trunk/src/blist.c =================================================================== --- trunk/src/blist.c 2006-06-28 19:12:38 UTC (rev 16369) +++ trunk/src/blist.c 2006-06-28 19:42:20 UTC (rev 16370) @@ -732,13 +732,15 @@ GaimBlistNode *gaim_blist_node_next(GaimBlistNode *node, gboolean offline) { GaimBlistNode *ret = node; - + + if (offline) + return get_next_node(ret, TRUE); do { ret = get_next_node(ret, TRUE); - } while (ret && !offline && GAIM_BLIST_NODE_IS_BUDDY(ret) && + } while (ret && GAIM_BLIST_NODE_IS_BUDDY(ret) && !gaim_account_is_connected(gaim_buddy_get_account((GaimBuddy *)ret))); - + return ret; } Modified: trunk/src/gtkblist.c =================================================================== --- trunk/src/gtkblist.c 2006-06-28 19:12:38 UTC (rev 16369) +++ trunk/src/gtkblist.c 2006-06-28 19:42:20 UTC (rev 16370) @@ -118,9 +118,11 @@ #endif static GaimGtkBuddyList *gtkblist = NULL; +static gboolean gaim_gtk_blist_refresh_timer(GaimBuddyList *list); static void gaim_gtk_blist_update_buddy(GaimBuddyList *list, GaimBlistNode *node); static void gaim_gtk_blist_selection_changed(GtkTreeSelection *selection, gpointer data); static void gaim_gtk_blist_update(GaimBuddyList *list, GaimBlistNode *node); +static void gaim_gtk_blist_update_contact(GaimBuddyList *list, GaimBlistNode *node); static char *gaim_get_tooltip_text(GaimBlistNode *node, gboolean full); static const char *item_factory_translate_func (const char *path, gpointer func_data); static gboolean get_iter_from_node(GaimBlistNode *node, GtkTreeIter *iter); @@ -159,8 +161,10 @@ { if (event->state == GDK_VISIBILITY_FULLY_OBSCURED) gtk_blist_obscured = TRUE; - else - gtk_blist_obscured = FALSE; + else if (gtk_blist_obscured) { + gtk_blist_obscured = FALSE; + gaim_gtk_blist_refresh_timer(gaim_get_blist()); + } /* continue to handle event normally */ return FALSE; @@ -171,8 +175,10 @@ if(event->changed_mask & GDK_WINDOW_STATE_WITHDRAWN) { if(event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN) gaim_prefs_set_bool("/gaim/gtk/blist/list_visible", FALSE); - else + else { gaim_prefs_set_bool("/gaim/gtk/blist/list_visible", TRUE); + gaim_gtk_blist_refresh_timer(gaim_get_blist()); + } } if(event->changed_mask & GDK_WINDOW_STATE_MAXIMIZED) { @@ -181,7 +187,13 @@ else gaim_prefs_set_bool("/gaim/gtk/blist/list_maximized", FALSE); } - + + /* Refresh gtkblist if un-iconifying */ + if (event->changed_mask & GDK_WINDOW_STATE_ICONIFIED){ + if (!(event->new_window_state & GDK_WINDOW_STATE_ICONIFIED)) + gaim_gtk_blist_refresh_timer(gaim_get_blist()); + } + return FALSE; } @@ -877,8 +889,7 @@ gtk_main_iteration(); gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW(gtkblist->treeview), path, NULL, FALSE, 0, 0); - - gaim_gtk_blist_update(NULL, node); + gaim_gtk_blist_update_contact(NULL, node->child); gtk_tree_path_free(path); } @@ -2869,7 +2880,7 @@ struct _gaim_gtk_blist_node *gtkcontactnode = NULL; char *idletime = NULL, *statustext = NULL; time_t t; - /* XXX Clean up this crap */ + /* XXX Good luck cleaning up this crap */ contact = (GaimContact*)((GaimBlistNode*)b)->parent; if(contact) @@ -2881,11 +2892,6 @@ name = gaim_buddy_get_alias(b); esc = g_markup_escape_text(name, strlen(name)); - prpl = gaim_find_prpl(gaim_account_get_protocol_id(b->account)); - - if (prpl != NULL) - prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); - presence = gaim_buddy_get_presence(b); if (!gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons")) @@ -2901,6 +2907,11 @@ return esc; } + prpl = gaim_find_prpl(gaim_account_get_protocol_id(b->account)); + + if (prpl != NULL) + prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); + if (prpl_info && prpl_info->status_text && b->account->gc) { char *tmp = prpl_info->status_text(b); const char *end; @@ -2951,67 +2962,69 @@ #endif } - if (gaim_prefs_get_bool("/gaim/gtk/blist/show_idle_time") && - gaim_presence_is_idle(presence)) - { - time_t idle_secs = gaim_presence_get_idle_time(presence); + if(!gaim_presence_is_online(presence) && !statustext) + statustext = g_strdup(_("Offline")); + else if (!statustext) + text = g_strdup(esc); + + if (gaim_presence_is_idle(presence)) { + if (gaim_prefs_get_bool("/gaim/gtk/blist/show_idle_time")) { + time_t idle_secs = gaim_presence_get_idle_time(presence); - if (idle_secs > 0) { - int ihrs, imin; + if (idle_secs > 0) { + int ihrs, imin; - time(&t); - ihrs = (t - idle_secs) / 3600; - imin = ((t - idle_secs) / 60) % 60; + time(&t); + ihrs = (t - idle_secs) / 3600; + imin = ((t - idle_secs) / 60) % 60; - if (ihrs) - idletime = g_strdup_printf(_("Idle %dh %02dm"), ihrs, imin); + if (ihrs) + idletime = g_strdup_printf(_("Idle %dh %02dm"), ihrs, imin); + else + idletime = g_strdup_printf(_("Idle %dm"), imin); + } else - idletime = g_strdup_printf(_("Idle %dm"), imin); + idletime = g_strdup(_("Idle")); + + if (!selected) + text = g_strdup_printf("<span color='%s'>%s</span>\n" + "<span color='%s' size='smaller'>%s%s%s</span>", + dim_grey(), esc, dim_grey(), + idletime != NULL ? idletime : "", + (idletime != NULL && statustext != NULL) ? " - " : "", + statustext != NULL ? statustext : ""); } - else - idletime = g_strdup(_("Idle")); + else if (!selected && !statustext) /* We handle selected text later */ + text = g_strdup_printf("<span color='%s'>%s</span>", dim_grey(), esc); + else if (!selected && !text) + text = g_strdup_printf("<span color='%s'>%s</span>\n" + "<span color='%s' size='smaller'>%s%s%s</span>", + dim_grey(), esc, dim_grey(), + idletime != NULL ? idletime : "", + (idletime != NULL && statustext != NULL) ? " - " : "", + statustext != NULL ? statustext : ""); } - if(!gaim_presence_is_online(presence) && !statustext) - statustext = g_strdup(_("Offline")); - - if (statustext == NULL && idletime == NULL) + /* Not idle and not selected */ + else if (!selected && !text) { - if (!selected && gaim_presence_is_idle(presence)) - text = g_strdup_printf("<span color='%s'>%s</span>", dim_grey(), esc); - else - text = g_strdup(esc); + text = g_strdup_printf("%s\n" + "<span color='%s' size='smaller'>%s%s%s</span>", + esc, dim_grey(), + idletime != NULL ? idletime : "", + (idletime != NULL && statustext != NULL) ? " - " : "", + statustext != NULL ? statustext : ""); } - else if (!selected) - { - if (gaim_presence_is_idle(presence)) - { - text = g_strdup_printf("<span color='%s'>%s</span>\n" - "<span color='%s' size='smaller'>%s%s%s</span>", - dim_grey(), esc, dim_grey(), - idletime != NULL ? idletime : "", - (idletime != NULL && statustext != NULL) ? " - " : "", - statustext != NULL ? statustext : ""); - } - else - { - text = g_strdup_printf("%s\n" - "<span color='%s' size='smaller'>%s%s%s</span>", - esc, dim_grey(), - idletime != NULL ? idletime : "", - (idletime != NULL && statustext != NULL) ? " - " : "", - statustext != NULL ? statustext : ""); - } - } - else + + /* It is selected. */ + if ((selected && !text) || (selected && idletime)) text = g_strdup_printf("%s\n" - "<span size='smaller'>%s%s%s</span>", - esc, - idletime != NULL ? idletime : "", - (idletime != NULL && statustext != NULL) ? " - " : "", - statustext != NULL ? statustext : ""); + "<span size='smaller'>%s%s%s</span>", + esc, + idletime != NULL ? idletime : "", + (idletime != NULL && statustext != NULL) ? " - " : "", + statustext != NULL ? statustext : ""); - g_free(idletime); g_free(statustext); g_free(esc); @@ -3057,6 +3070,9 @@ { GaimBlistNode *gnode, *cnode; + if (gtk_blist_obscured || !GTK_WIDGET_VISIBLE(gtkblist->window)) + return TRUE; + for(gnode = list->root; gnode; gnode = gnode->next) { if(!GAIM_BLIST_NODE_IS_GROUP(gnode)) continue; @@ -3068,7 +3084,7 @@ if (buddy && gaim_presence_is_idle(gaim_buddy_get_presence(buddy))) - gaim_gtk_blist_update(list, cnode); + gaim_gtk_blist_update_contact(list, (GaimBlistNode*)buddy); } } } @@ -3908,7 +3924,7 @@ while (node) { - if (!GAIM_BLIST_NODE_IS_GROUP(node) && remove) + if (remove && !GAIM_BLIST_NODE_IS_GROUP(node)) gaim_gtk_blist_hide_node(list, node); gaim_gtk_blist_update(list, node); @@ -4081,16 +4097,26 @@ return TRUE; } +/*This version of gaim_gtk_blist_update_group can take the original buddy +or a group, but has much better algorithmic performance with a pre-known buddy*/ static void gaim_gtk_blist_update_group(GaimBuddyList *list, GaimBlistNode *node) { GaimGroup *group; int count; gboolean show = FALSE; + GaimBlistNode* gnode; - g_return_if_fail(GAIM_BLIST_NODE_IS_GROUP(node)); - group = (GaimGroup*)node; + if (GAIM_BLIST_NODE_IS_GROUP(node)) + gnode = node; + else if (GAIM_BLIST_NODE_IS_BUDDY(node)) /* maybe OR'ed with IS_CHAT? */ + gnode = node->parent->parent; + else if (GAIM_BLIST_NODE_IS_CONTACT(node)) + gnode = node->parent; + g_return_if_fail(GAIM_BLIST_NODE_IS_GROUP(gnode)); + group = (GaimGroup*)gnode; + if(gaim_prefs_get_bool("/gaim/gtk/blist/show_offline_buddies")) count = gaim_blist_get_group_size(group, FALSE); else @@ -4098,25 +4124,15 @@ if (count > 0 || gaim_prefs_get_bool("/gaim/gtk/blist/show_empty_groups")) show = TRUE; - else { - GaimBlistNode *n; - n = node->child; - while (n && !GAIM_BLIST_NODE_IS_GROUP(n)) { - if (GAIM_BLIST_NODE_IS_BUDDY(n)) { - if (buddy_is_displayable((GaimBuddy*)n)) { - show = TRUE; - break; - } - } - n = gaim_blist_node_next(n, FALSE); - } - } + else if (GAIM_BLIST_NODE_IS_BUDDY(node)){ /* Or chat? */ + if (buddy_is_displayable((GaimBuddy*)node)) + show = TRUE;} if (show) { char *mark, *esc; GtkTreeIter iter; - if(!insert_node(list, node, &iter)) + if(!insert_node(list, gnode, &iter)) return; esc = g_markup_escape_text(group->name, -1); @@ -4129,11 +4145,11 @@ STATUS_ICON_COLUMN, NULL, STATUS_ICON_VISIBLE_COLUMN, FALSE, NAME_COLUMN, mark, - NODE_COLUMN, node, + NODE_COLUMN, gnode, -1); g_free(mark); } else { - gaim_gtk_blist_hide_node(list, node); + gaim_gtk_blist_hide_node(list, gnode); } } @@ -4155,7 +4171,8 @@ mark = gaim_gtk_blist_get_name_markup(buddy, selected); if (gaim_prefs_get_bool("/gaim/gtk/blist/show_idle_time") && - gaim_presence_is_idle(presence)) + gaim_presence_is_idle(presence) && + !gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons")) { time_t idle_secs = gaim_presence_get_idle_time(presence); @@ -4166,7 +4183,6 @@ time(&t); ihrs = (t - idle_secs) / 3600; imin = ((t - idle_secs) / 60) % 60; - idle = g_strdup_printf("%d:%02d", ihrs, imin); } } @@ -4197,35 +4213,45 @@ g_object_unref(avatar); } - +/* This is a variation on the original gtk_blist_update_contact. Here we + can know in advance which buddy has changed so we can just update that */ static void gaim_gtk_blist_update_contact(GaimBuddyList *list, GaimBlistNode *node) { + GaimBlistNode *cnode; GaimContact *contact; GaimBuddy *buddy; struct _gaim_gtk_blist_node *gtknode; - g_return_if_fail(GAIM_BLIST_NODE_IS_CONTACT(node)); + if (GAIM_BLIST_NODE_IS_BUDDY(node)) + cnode = node->parent; + else + cnode = node; + + g_return_if_fail(GAIM_BLIST_NODE_IS_CONTACT(cnode)); /* First things first, update the group */ - gaim_gtk_blist_update_group(list, node->parent); + if (GAIM_BLIST_NODE_IS_BUDDY(node)) + gaim_gtk_blist_update_group(list, node); + else + gaim_gtk_blist_update_group(list, cnode->parent); - contact = (GaimContact*)node; + contact = (GaimContact*)cnode; buddy = gaim_contact_get_priority_buddy(contact); - + if (buddy_is_displayable(buddy)) { GtkTreeIter iter; - if(!insert_node(list, node, &iter)) + if(!insert_node(list, cnode, &iter)) return; - gtknode = (struct _gaim_gtk_blist_node *)node->ui_data; + gtknode = (struct _gaim_gtk_blist_node *)cnode->ui_data; if(gtknode->contact_expanded) { GdkPixbuf *status; char *mark; - status = gaim_gtk_blist_get_status_icon(node, + status = gaim_gtk_blist_get_status_icon(cnode, (gaim_prefs_get_bool("/gaim/gtk/blist/show_buddy_icons") ? GAIM_STATUS_ICON_LARGE : GAIM_STATUS_ICON_SMALL)); @@ -4242,29 +4268,29 @@ if(status) g_object_unref(status); } else { - buddy_node(buddy, &iter, node); + buddy_node(buddy, &iter, cnode); } } else { - gaim_gtk_blist_hide_node(list, node); + gaim_gtk_blist_hide_node(list, cnode); } } + + static void gaim_gtk_blist_update_buddy(GaimBuddyList *list, GaimBlistNode *node) { - GaimContact *contact; GaimBuddy *buddy; struct _gaim_gtk_blist_node *gtkparentnode; g_return_if_fail(GAIM_BLIST_NODE_IS_BUDDY(node)); + if (node->parent == NULL) + return; + buddy = (GaimBuddy*)node; - contact = (GaimContact*)node->parent; - - if (contact == NULL) - return; - + /* First things first, update the contact */ - gaim_gtk_blist_update_contact(list, node->parent); + gaim_gtk_blist_update_contact(list, node); gtkparentnode = (struct _gaim_gtk_blist_node *)node->parent->ui_data; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <the...@us...> - 2006-06-29 08:14:32
|
Revision: 16372 Author: thekingant Date: 2006-06-29 01:14:29 -0700 (Thu, 29 Jun 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16372&view=rev Log Message: ----------- Some comments changes, and: 1. Don't buddy icons in Jabber 2. When clearing your buddy icon in oscar, do it the same way that WinAIM does it Modified Paths: -------------- trunk/src/blist.h trunk/src/protocols/jabber/presence.c trunk/src/protocols/oscar/family_feedbag.c trunk/src/protocols/oscar/family_oservice.c trunk/src/protocols/oscar/oscar.h Modified: trunk/src/blist.h =================================================================== --- trunk/src/blist.h 2006-06-28 22:03:16 UTC (rev 16371) +++ trunk/src/blist.h 2006-06-29 08:14:29 UTC (rev 16372) @@ -286,6 +286,7 @@ /** * Sets the server-sent alias of a buddy in the buddy list. + * PRPLs should call serv_got_alias() instead of this. * * @param buddy The buddy whose alias will be changed. * @param alias The buddy's "official" alias. Modified: trunk/src/protocols/jabber/presence.c =================================================================== --- trunk/src/protocols/jabber/presence.c 2006-06-28 22:03:16 UTC (rev 16371) +++ trunk/src/protocols/jabber/presence.c 2006-06-29 08:14:29 UTC (rev 16372) @@ -256,13 +256,14 @@ char hash[41], *p; int i; - gaim_cipher_digest_region("sha1", (guchar *)data, size, + gaim_cipher_digest_region("sha1", data, size, sizeof(hashval), hashval, NULL); p = hash; for(i=0; i<20; i++, p+=2) snprintf(p, 3, "%02x", hashval[i]); gaim_blist_node_set_string((GaimBlistNode*)b, "avatar_hash", hash); } + g_free(data); g_free(text); } } Modified: trunk/src/protocols/oscar/family_feedbag.c =================================================================== --- trunk/src/protocols/oscar/family_feedbag.c 2006-06-28 22:03:16 UTC (rev 16371) +++ trunk/src/protocols/oscar/family_feedbag.c 2006-06-29 08:14:29 UTC (rev 16372) @@ -1089,7 +1089,7 @@ * @param iconcsumlen Length of the MD5 checksum given above. Should be 0x10 bytes. * @return Return 0 if no errors, otherwise return the error number. */ -int aim_ssi_seticon(OscarData *od, guint8 *iconsum, guint16 iconsumlen) +int aim_ssi_seticon(OscarData *od, const guint8 *iconsum, guint16 iconsumlen) { struct aim_ssi_item *tmp; guint8 *csumdata; @@ -1099,13 +1099,12 @@ /* Find the ICONINFO item, or add it if it does not exist */ if (!(tmp = aim_ssi_itemlist_finditem(od->ssi.local, NULL, "1", AIM_SSI_TYPE_ICONINFO))) { - tmp = aim_ssi_itemlist_add(&od->ssi.local, "1", 0x0000, 0x51F4, AIM_SSI_TYPE_ICONINFO, NULL); + tmp = aim_ssi_itemlist_add(&od->ssi.local, "1", 0x0000, 0xFFFF, AIM_SSI_TYPE_ICONINFO, NULL); } /* Need to add the 0x00d5 TLV to the TLV chain */ csumdata = (guint8 *)malloc((iconsumlen+2)*sizeof(guint8)); - csumdata[0] = 0x00; - csumdata[1] = 0x10; + aimutil_put16(&csumdata[0], iconsumlen); memcpy(&csumdata[2], iconsum, iconsumlen); aim_tlvlist_replace_raw(&tmp->data, 0x00d5, (iconsumlen+2) * sizeof(guint8), csumdata); free(csumdata); @@ -1122,23 +1121,17 @@ * Remove a reference to a server stored buddy icon. This will make your * icon stop showing up to other people. * - * @param od The oscar odion. + * Really this function just sets the icon to a dummy value. It's weird... + * but I think the dummy value basically means "I don't have an icon!" + * + * @param od The oscar session. * @return Return 0 if no errors, otherwise return the error number. */ int aim_ssi_delicon(OscarData *od) { - struct aim_ssi_item *tmp; + const guint8 csumdata[] = {0x02, 0x01, 0xd2, 0x04, 0x72}; - if (!od) - return -EINVAL; - - /* Find the ICONINFO item and delete it if it exists*/ - if ((tmp = aim_ssi_itemlist_finditem(od->ssi.local, NULL, "1", AIM_SSI_TYPE_ICONINFO))) - aim_ssi_itemlist_del(&od->ssi.local, tmp); - - /* Sync our local list with the server list */ - aim_ssi_sync(od); - return 0; + return aim_ssi_seticon(od, csumdata, 5); } /** Modified: trunk/src/protocols/oscar/family_oservice.c =================================================================== --- trunk/src/protocols/oscar/family_oservice.c 2006-06-28 22:03:16 UTC (rev 16371) +++ trunk/src/protocols/oscar/family_oservice.c 2006-06-29 08:14:29 UTC (rev 16372) @@ -1064,6 +1064,11 @@ flags = byte_stream_get8(bs); length = byte_stream_get8(bs); + /* + * A flag of 0x01 could mean "this is the checksum we have for you" + * A flag of 0x40 could mean "I don't have your icon, upload it" + */ + if ((userfunc = aim_callhandler(od, snac->family, snac->subtype))) { switch (type) { case 0x0000: Modified: trunk/src/protocols/oscar/oscar.h =================================================================== --- trunk/src/protocols/oscar/oscar.h 2006-06-28 22:03:16 UTC (rev 16371) +++ trunk/src/protocols/oscar/oscar.h 2006-06-29 08:14:29 UTC (rev 16372) @@ -1161,7 +1161,7 @@ int aim_ssi_deletelist(OscarData *od); int aim_ssi_setpermdeny(OscarData *od, guint8 permdeny, guint32 vismask); int aim_ssi_setpresence(OscarData *od, guint32 presence); -int aim_ssi_seticon(OscarData *od, guint8 *iconsum, guint16 iconsumlen); +int aim_ssi_seticon(OscarData *od, const guint8 *iconsum, guint16 iconsumlen); int aim_ssi_delicon(OscarData *od); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <the...@us...> - 2006-06-30 06:58:21
|
Revision: 16377 Author: thekingant Date: 2006-06-29 23:58:17 -0700 (Thu, 29 Jun 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16377&view=rev Log Message: ----------- Fix a crash bug pointed out by Alexander Sashnov: There is another segfault (on today SVN trunk version). Steps for reproduce: 1. Create jabber account with incorrect params, check it for connect on start up; 2. run Gaim again. It will not connect and see error message in bottom of users list; 3. Open 'accounts' dialog and deselect this account..... segfault :-) Modified Paths: -------------- trunk/src/dnssrv.c trunk/src/protocols/jabber/jabber.c Modified: trunk/src/dnssrv.c =================================================================== --- trunk/src/dnssrv.c 2006-06-30 03:57:22 UTC (rev 16376) +++ trunk/src/dnssrv.c 2006-06-30 06:58:17 UTC (rev 16377) @@ -275,6 +275,12 @@ #endif +/* + * TODO: It would be really good if this returned some sort of handle + * that we could use to cancel the DNS query. As it is now, + * each callback has to check to make sure gc is still valid. + * And that is ugly. + */ void gaim_srv_resolve(const char *protocol, const char *transport, const char *domain, GaimSRVCallback cb, gpointer extradata) { char *query = g_strdup_printf("_%s._%s.%s",protocol, transport, domain); struct resdata *rdata; Modified: trunk/src/protocols/jabber/jabber.c =================================================================== --- trunk/src/protocols/jabber/jabber.c 2006-06-30 03:57:22 UTC (rev 16376) +++ trunk/src/protocols/jabber/jabber.c 2006-06-30 06:58:17 UTC (rev 16377) @@ -481,8 +481,19 @@ static void srv_resolved_cb(GaimSrvResponse *resp, int results, gpointer data) { - JabberStream *js = (JabberStream*)data; + GaimConnection *gc; + JabberStream *js; + gc = data; + if (!g_list_find(gaim_connections_get_all(), gc)) + { + /* This connection has been closed */ + g_free(resp); + return; + } + + js = (JabberStream*)gc->proto_data; + if(results) { jabber_login_connect(js, resp->hostname, resp->port); g_free(resp); @@ -561,7 +572,7 @@ if(connect_server[0]) { jabber_login_connect(js, connect_server, gaim_account_get_int(account, "port", 5222)); } else { - gaim_srv_resolve("xmpp-client", "tcp", js->user->domain, srv_resolved_cb, js); + gaim_srv_resolve("xmpp-client", "tcp", js->user->domain, srv_resolved_cb, gc); } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <the...@us...> - 2006-07-03 20:39:11
|
Revision: 16414 Author: thekingant Date: 2006-07-03 13:39:04 -0700 (Mon, 03 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16414&view=rev Log Message: ----------- First stab at trying to fix the MSN http connect method. It still doesn't work, and I'm not sure why, but it gets a lot farther in the signon process now. For those unfamiliar with the issue, the MSN http connect method stopped working after all the non-blocking I/O changes. The http connect method is apparently used by lots of people behind silly firewalls and stuff, and therefore we really shouldn't release Gaim 2.0.0 without it working, because people will complain. The two main problems were 1. The outgoing message queue was removed in favor of buffering all data to one large buffer. This sounds good in theory... but apparently each message sent to and from the server has a "SessionID" in the HTTP header. Every message we send should use the same SessionID as the last packet we received from the server. So basically you can't put two messages into the outgoing buffer at the same time because you don't have the correct SessionID to use for the second message. You have to wait until you get the reply from the server. 2. There were some strange buffer problems with using the wrong variable when trying to combine the header+body into one buffer before sending the message. I also fixed a small memleak or two, added some comments, and tried to clean up the code a little. Modified Paths: -------------- trunk/src/connection.c trunk/src/connection.h trunk/src/protocols/msn/httpconn.c trunk/src/protocols/msn/httpconn.h trunk/src/protocols/msn/msn.c Modified: trunk/src/connection.c =================================================================== --- trunk/src/connection.c 2006-07-03 18:28:13 UTC (rev 16413) +++ trunk/src/connection.c 2006-07-03 20:39:04 UTC (rev 16414) @@ -217,12 +217,9 @@ gaim_account_set_connection(account, NULL); - if (gc->password != NULL) - g_free(gc->password); + g_free(gc->password); + g_free(gc->display_name); - if (gc->display_name != NULL) - g_free(gc->display_name); - if (gc->disconnect_timeout) gaim_timeout_remove(gc->disconnect_timeout); Modified: trunk/src/connection.h =================================================================== --- trunk/src/connection.h 2006-07-03 18:28:13 UTC (rev 16413) +++ trunk/src/connection.h 2006-07-03 20:39:04 UTC (rev 16414) @@ -130,12 +130,12 @@ const char *password); /** + * Disconnects and destroys a GaimConnection. + * * This function should only be called by gaim_account_disconnect() - * in account.c. If you're trying to sign on an account, use that + * in account.c. If you're trying to sign off an account, use that * function instead. * - * Disconnects and destroys a GaimConnection. - * * @param gc The gaim connection to destroy. */ void gaim_connection_destroy(GaimConnection *gc); Modified: trunk/src/protocols/msn/httpconn.c =================================================================== --- trunk/src/protocols/msn/httpconn.c 2006-07-03 18:28:13 UTC (rev 16413) +++ trunk/src/protocols/msn/httpconn.c 2006-07-03 20:39:04 UTC (rev 16414) @@ -25,317 +25,242 @@ #include "debug.h" #include "httpconn.h" -static void read_cb(gpointer data, gint source, GaimInputCondition cond); -gboolean msn_httpconn_parse_data(MsnHttpConn *httpconn, const char *buf, - size_t size, char **ret_buf, size_t *ret_size, - gboolean *error); - -MsnHttpConn * -msn_httpconn_new(MsnServConn *servconn) +typedef struct { MsnHttpConn *httpconn; + char *body; + size_t body_len; +} MsnHttpQueueData; - g_return_val_if_fail(servconn != NULL, NULL); +static void +msn_httpconn_process_queue(MsnHttpConn *httpconn) +{ + httpconn->waiting_response = FALSE; - httpconn = g_new0(MsnHttpConn, 1); + if (httpconn->queue != NULL) + { + MsnHttpQueueData *queue_data; - gaim_debug_info("msn", "new httpconn (%p)\n", httpconn); + queue_data = (MsnHttpQueueData *)httpconn->queue->data; - /* TODO: Remove this */ - httpconn->session = servconn->session; + httpconn->queue = g_list_remove(httpconn->queue, queue_data); - httpconn->servconn = servconn; + msn_httpconn_write(queue_data->httpconn, + queue_data->body, + queue_data->body_len); - httpconn->tx_buf = gaim_circ_buffer_new(MSN_BUF_LEN); - httpconn->tx_handler = 0; - - return httpconn; + g_free(queue_data->body); + g_free(queue_data); + } } -void -msn_httpconn_destroy(MsnHttpConn *httpconn) +static gboolean +msn_httpconn_parse_data(MsnHttpConn *httpconn, const char *buf, + size_t size, char **ret_buf, size_t *ret_size, + gboolean *error) { - g_return_if_fail(httpconn != NULL); + const char *s, *c; + char *header, *body; + const char *body_start; + char *tmp; + size_t body_len = 0; + gboolean wasted = FALSE; - gaim_debug_info("msn", "destroy httpconn (%p)\n", httpconn); + g_return_val_if_fail(httpconn != NULL, FALSE); + g_return_val_if_fail(buf != NULL, FALSE); + g_return_val_if_fail(size > 0, FALSE); + g_return_val_if_fail(ret_buf != NULL, FALSE); + g_return_val_if_fail(ret_size != NULL, FALSE); + g_return_val_if_fail(error != NULL, FALSE); - if (httpconn->connected) - msn_httpconn_disconnect(httpconn); +#if 0 + gaim_debug_info("msn", "HTTP: parsing data {%s}\n", buf); +#endif - g_free(httpconn->full_session_id); + /* Healthy defaults. */ + body = NULL; - g_free(httpconn->session_id); + *ret_buf = NULL; + *ret_size = 0; + *error = FALSE; - g_free(httpconn->host); + /* First, some tests to see if we have a full block of stuff. */ + if (((strncmp(buf, "HTTP/1.1 200 OK\r\n", 17) != 0) && + (strncmp(buf, "HTTP/1.1 100 Continue\r\n", 23) != 0)) && + ((strncmp(buf, "HTTP/1.0 200 OK\r\n", 17) != 0) && + (strncmp(buf, "HTTP/1.0 100 Continue\r\n", 23) != 0))) + { + *error = TRUE; - gaim_circ_buffer_destroy(httpconn->tx_buf); - if (httpconn->tx_handler > 0) - gaim_input_remove(httpconn->tx_handler); - - g_free(httpconn); -} - -static char * -msn_httpconn_proxy_auth(MsnHttpConn *httpconn) -{ - GaimAccount *account; - GaimProxyInfo *gpi; - const char *username, *password; - char *auth = NULL; - - account = httpconn->session->account; - - if (gaim_account_get_proxy_info(account) == NULL) - gpi = gaim_global_proxy_get_info(); - else - gpi = gaim_account_get_proxy_info(account); - - if (gpi == NULL || !(gaim_proxy_info_get_type(gpi) == GAIM_PROXY_HTTP || - gaim_proxy_info_get_type(gpi) == GAIM_PROXY_USE_ENVVAR)) - return NULL; - - username = gaim_proxy_info_get_username(gpi); - password = gaim_proxy_info_get_password(gpi); - - if (username != NULL) { - char *tmp; - auth = g_strdup_printf("%s:%s", username, password ? password : ""); - tmp = gaim_base64_encode((const guchar *)auth, strlen(auth)); - g_free(auth); - auth = g_strdup_printf("Proxy-Authorization: Basic %s\r\n", tmp); - g_free(tmp); + return FALSE; } - return auth; -} + if (strncmp(buf, "HTTP/1.1 100 Continue\r\n", 23) == 0) + { + if ((s = strstr(buf, "\r\n\r\n")) == NULL) + return FALSE; -static void -httpconn_write_cb(gpointer data, gint source, GaimInputCondition cond) -{ - MsnHttpConn *httpconn = data; - int ret, writelen; + s += 4; - if (httpconn->waiting_response) - return; + if (*s == '\0') + { + *ret_buf = g_strdup(""); + *ret_size = 0; - writelen = gaim_circ_buffer_get_max_read(httpconn->tx_buf); + msn_httpconn_process_queue(httpconn); - if (writelen == 0) { - httpconn->waiting_response = TRUE; - gaim_input_remove(httpconn->tx_handler); - httpconn->tx_handler = 0; - return; - } + return TRUE; + } - ret = write(httpconn->fd, httpconn->tx_buf->outptr, writelen); - - if (ret < 0 && errno == EAGAIN) - return; - else if (ret <= 0) { - msn_servconn_got_error(httpconn->servconn, - MSN_SERVCONN_ERROR_WRITE); - return; + buf = s; + size -= (s - buf); } - gaim_circ_buffer_mark_read(httpconn->tx_buf, ret); + if ((s = strstr(buf, "\r\n\r\n")) == NULL) + /* Need to wait for the full HTTP header to arrive */ + return FALSE; - if (ret == writelen) - httpconn_write_cb(data, source, cond); -} + s += 4; /* Skip \r\n */ + header = g_strndup(buf, s - buf); + body_start = s; + body_len = size - (body_start - buf); -static ssize_t -write_raw(MsnHttpConn *httpconn, const char *data, size_t data_len) -{ - ssize_t res; /* result of the write operation */ - -#ifdef MSN_DEBUG_HTTP - gaim_debug_misc("msn", "Writing HTTP (header): {%s}\n", header); -#endif - - - if (httpconn->tx_handler == 0 && !httpconn->waiting_response) - res = write(httpconn->fd, data, data_len); - else + if ((s = gaim_strcasestr(header, "Content-Length: ")) != NULL) { - res = -1; - errno = EAGAIN; - } + int tmp_len; - if (res <= 0 && errno != EAGAIN) - { - msn_servconn_got_error(httpconn->servconn, - MSN_SERVCONN_ERROR_WRITE); - return -1; - } else if (res < 0 || res < data_len) { - if (res < 0) - res = 0; - if (httpconn->tx_handler == 0 && httpconn->fd) - httpconn->tx_handler = gaim_input_add(httpconn->fd, - GAIM_INPUT_WRITE, httpconn_write_cb, httpconn); - gaim_circ_buffer_append(httpconn->tx_buf, data + res, - data_len - res); - } + s += strlen("Content-Length: "); - return res; -} + if ((c = strchr(s, '\r')) == NULL) + { + g_free(header); -static void -msn_httpconn_poll(MsnHttpConn *httpconn) -{ - char *header; - char *auth; - int r; + return FALSE; + } - g_return_if_fail(httpconn != NULL); + tmp = g_strndup(s, c - s); + tmp_len = atoi(tmp); + g_free(tmp); - if (httpconn->waiting_response || - httpconn->tx_handler > 0) - { - return; - } + if (body_len != tmp_len) + { + /* Need to wait for the full packet to arrive */ - /* It is OK if this is buffered because it will only be buffered if - nothing else is in the buffer */ + g_free(header); - auth = msn_httpconn_proxy_auth(httpconn); +#if 0 + gaim_debug_warning("msn", + "body length (%d) != content length (%d)\n", + body_len, tmp_len); +#endif - header = g_strdup_printf( - "POST http://%s/gateway/gateway.dll?Action=poll&SessionID=%s HTTP/1.1\r\n" - "Accept: */*\r\n" - "Accept-Language: en-us\r\n" - "User-Agent: MSMSGS\r\n" - "Host: %s\r\n" - "Proxy-Connection: Keep-Alive\r\n" - "%s" /* Proxy auth */ - "Connection: Keep-Alive\r\n" - "Pragma: no-cache\r\n" - "Content-Type: application/x-msn-messenger\r\n" - "Content-Length: 0\r\n\r\n", - httpconn->host, - httpconn->full_session_id, - httpconn->host, - auth ? auth : ""); - - g_free(auth); - - r = write_raw(httpconn, header, strlen(header)); - - g_free(header); - - if (r >= 0) - { - httpconn->waiting_response = TRUE; - httpconn->dirty = FALSE; + return FALSE; + } } -} -static gboolean -do_poll(gpointer data) -{ - MsnHttpConn *httpconn; + body = g_malloc0(body_len + 1); + memcpy(body, body_start, body_len); - httpconn = data; - - g_return_val_if_fail(httpconn != NULL, TRUE); - -#if 0 - gaim_debug_info("msn", "polling from %s\n", httpconn->session_id); +#ifdef MSN_DEBUG_HTTP + gaim_debug_misc("msn", "Incoming HTTP buffer (header): {%s\r\n}\n", + header); #endif - if ((httpconn->host == NULL) || (httpconn->full_session_id == NULL)) + /* Now we should be able to process the data. */ + if ((s = gaim_strcasestr(header, "X-MSN-Messenger: ")) != NULL) { - gaim_debug_warning("msn", "Attempted HTTP poll before session is established\n"); - return TRUE; - } + char *full_session_id, *gw_ip, *session_action; + char *t, *session_id; + char **elems, **cur, **tokens; - if (httpconn->dirty) - msn_httpconn_poll(httpconn); + full_session_id = gw_ip = session_action = NULL; - return TRUE; -} + s += strlen("X-MSN-Messenger: "); -static void -connect_cb(gpointer data, gint source, GaimInputCondition cond) -{ - MsnHttpConn *httpconn = data; + if ((c = strchr(s, '\r')) == NULL) + { + msn_session_set_error(httpconn->session, + MSN_ERROR_HTTP_MALFORMED, NULL); + gaim_debug_error("msn", "Malformed X-MSN-Messenger field.\n{%s}", + buf); - httpconn->fd = source; + g_free(body); + return FALSE; + } - if (source > 0) - { - httpconn->inpa = gaim_input_add(httpconn->fd, GAIM_INPUT_READ, - read_cb, data); + tmp = g_strndup(s, c - s); - httpconn->timer = gaim_timeout_add(2000, do_poll, httpconn); + elems = g_strsplit(tmp, "; ", 0); - httpconn->waiting_response = FALSE; - if (httpconn->tx_handler > 0) - gaim_input_remove(httpconn->tx_handler); + for (cur = elems; *cur != NULL; cur++) + { + tokens = g_strsplit(*cur, "=", 2); - httpconn->tx_handler = gaim_input_add(source, - GAIM_INPUT_WRITE, httpconn_write_cb, httpconn); + if (strcmp(tokens[0], "SessionID") == 0) + full_session_id = tokens[1]; + else if (strcmp(tokens[0], "GW-IP") == 0) + gw_ip = tokens[1]; + else if (strcmp(tokens[0], "Session") == 0) + session_action = tokens[1]; + else + g_free(tokens[1]); - httpconn_write_cb(httpconn, source, GAIM_INPUT_WRITE); - } - else - { - gaim_debug_error("msn", "HTTP: Connection error\n"); - msn_servconn_got_error(httpconn->servconn, MSN_SERVCONN_ERROR_CONNECT); - } -} + g_free(tokens[0]); + /* Don't free each of the tokens, only the array. */ + g_free(tokens); + } -gboolean -msn_httpconn_connect(MsnHttpConn *httpconn, const char *host, int port) -{ - int r; + g_strfreev(elems); - g_return_val_if_fail(httpconn != NULL, FALSE); - g_return_val_if_fail(host != NULL, FALSE); - g_return_val_if_fail(port > 0, FALSE); + g_free(tmp); - if (httpconn->connected) - msn_httpconn_disconnect(httpconn); + if ((session_action != NULL) && (strcmp(session_action, "close") == 0)) + wasted = TRUE; - r = gaim_proxy_connect(httpconn->session->account, - "gateway.messenger.hotmail.com", 80, connect_cb, httpconn); + g_free(session_action); - if (r == 0) - { - httpconn->waiting_response = TRUE; - httpconn->connected = TRUE; - } + t = strchr(full_session_id, '.'); + session_id = g_strndup(full_session_id, t - full_session_id); - return httpconn->connected; -} + if (!wasted) + { + g_free(httpconn->full_session_id); + httpconn->full_session_id = full_session_id; -void -msn_httpconn_disconnect(MsnHttpConn *httpconn) -{ - g_return_if_fail(httpconn != NULL); + g_free(httpconn->session_id); + httpconn->session_id = session_id; - if (!httpconn->connected) - return; + g_free(httpconn->host); + httpconn->host = gw_ip; + } + else + { + MsnServConn *servconn; - if (httpconn->timer) - gaim_timeout_remove(httpconn->timer); + /* It's going to die. */ + /* poor thing */ - httpconn->timer = 0; + servconn = httpconn->servconn; - if (httpconn->inpa > 0) - { - gaim_input_remove(httpconn->inpa); - httpconn->inpa = 0; + /* I'll be honest, I don't fully understand all this, but this + * causes crashes, Stu. */ + /* if (servconn != NULL) + servconn->wasted = TRUE; */ + + g_free(full_session_id); + g_free(session_id); + g_free(gw_ip); + } } - close(httpconn->fd); + g_free(header); - g_free(httpconn->rx_buf); - httpconn->rx_buf = NULL; - httpconn->rx_len = 0; + *ret_buf = body; + *ret_size = body_len; - httpconn->connected = FALSE; + msn_httpconn_process_queue(httpconn); - /* msn_servconn_disconnect(httpconn->servconn); */ + return TRUE; } static void @@ -376,7 +301,7 @@ if (!msn_httpconn_parse_data(httpconn, httpconn->rx_buf, httpconn->rx_len, &result_msg, &result_len, &error)) { - /* We must wait for more input, or something went wrong */ + /* Either we must wait for more input, or something went wrong */ if (error) msn_servconn_got_error(httpconn->servconn, MSN_SERVCONN_ERROR_READ); @@ -472,15 +397,169 @@ g_free(old_rx_buf); } +static void +httpconn_write_cb(gpointer data, gint source, GaimInputCondition cond) +{ + MsnHttpConn *httpconn; + int ret, writelen; + + httpconn = data; + writelen = gaim_circ_buffer_get_max_read(httpconn->tx_buf); + + if (writelen == 0) + { + gaim_input_remove(httpconn->tx_handler); + httpconn->tx_handler = 0; + return; + } + + ret = write(httpconn->fd, httpconn->tx_buf->outptr, writelen); + if (ret <= 0) + { + if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) + /* No worries */ + return; + + /* Error! */ + msn_servconn_got_error(httpconn->servconn, MSN_SERVCONN_ERROR_WRITE); + return; + } + + gaim_circ_buffer_mark_read(httpconn->tx_buf, ret); + + /* TODO: I don't think these 2 lines are needed. Remove them? */ + if (ret == writelen) + httpconn_write_cb(data, source, cond); +} + +static gboolean +write_raw(MsnHttpConn *httpconn, const char *data, size_t data_len) +{ + ssize_t res; /* result of the write operation */ + + if (httpconn->tx_handler == 0) + res = write(httpconn->fd, data, data_len); + else + { + res = -1; + errno = EAGAIN; + } + + if ((res <= 0) && ((errno != EAGAIN) && (errno != EWOULDBLOCK))) + { + msn_servconn_got_error(httpconn->servconn, MSN_SERVCONN_ERROR_WRITE); + return FALSE; + } + + if (res < 0 || res < data_len) + { + if (res < 0) + res = 0; + if (httpconn->tx_handler == 0 && httpconn->fd) + httpconn->tx_handler = gaim_input_add(httpconn->fd, + GAIM_INPUT_WRITE, httpconn_write_cb, httpconn); + gaim_circ_buffer_append(httpconn->tx_buf, data + res, + data_len - res); + } + + return TRUE; +} + +static char * +msn_httpconn_proxy_auth(MsnHttpConn *httpconn) +{ + GaimAccount *account; + GaimProxyInfo *gpi; + const char *username, *password; + char *auth = NULL; + + account = httpconn->session->account; + + if (gaim_account_get_proxy_info(account) == NULL) + gpi = gaim_global_proxy_get_info(); + else + gpi = gaim_account_get_proxy_info(account); + + if (gpi == NULL || !(gaim_proxy_info_get_type(gpi) == GAIM_PROXY_HTTP || + gaim_proxy_info_get_type(gpi) == GAIM_PROXY_USE_ENVVAR)) + return NULL; + + username = gaim_proxy_info_get_username(gpi); + password = gaim_proxy_info_get_password(gpi); + + if (username != NULL) { + char *tmp; + auth = g_strdup_printf("%s:%s", username, password ? password : ""); + tmp = gaim_base64_encode((const guchar *)auth, strlen(auth)); + g_free(auth); + auth = g_strdup_printf("Proxy-Authorization: Basic %s\r\n", tmp); + g_free(tmp); + } + + return auth; +} + +static gboolean +msn_httpconn_poll(gpointer data) +{ + MsnHttpConn *httpconn; + char *header; + char *auth; + + data = httpconn; + + g_return_val_if_fail(httpconn != NULL, FALSE); + + if ((httpconn->host == NULL) || (httpconn->full_session_id == NULL)) + { + /* There's no need to poll if the session is not fully established */ + return TRUE; + } + + if (httpconn->waiting_response) + { + /* There's no need to poll if we're already waiting for a response */ + return TRUE; + } + + auth = msn_httpconn_proxy_auth(httpconn); + + header = g_strdup_printf( + "POST http://%s/gateway/gateway.dll?Action=poll&SessionID=%s HTTP/1.1\r\n" + "Accept: */*\r\n" + "Accept-Language: en-us\r\n" + "User-Agent: MSMSGS\r\n" + "Host: %s\r\n" + "Proxy-Connection: Keep-Alive\r\n" + "%s" /* Proxy auth */ + "Connection: Keep-Alive\r\n" + "Pragma: no-cache\r\n" + "Content-Type: application/x-msn-messenger\r\n" + "Content-Length: 0\r\n\r\n", + httpconn->host, + httpconn->full_session_id, + httpconn->host, + auth ? auth : ""); + + g_free(auth); + + if (write_raw(httpconn, header, strlen(header))) + httpconn->waiting_response = TRUE; + + g_free(header); + + return TRUE; +} + ssize_t -msn_httpconn_write(MsnHttpConn *httpconn, const char *body, size_t size) +msn_httpconn_write(MsnHttpConn *httpconn, const char *body, size_t body_len) { char *params; char *data; + int header_len; char *auth; const char *server_types[] = { "NS", "SB" }; const char *server_type; - ssize_t r; /* result of the write operation */ char *host; MsnServConn *servconn; @@ -488,10 +567,23 @@ g_return_val_if_fail(httpconn != NULL, 0); g_return_val_if_fail(body != NULL, 0); - g_return_val_if_fail(size > 0, 0); + g_return_val_if_fail(body_len > 0, 0); servconn = httpconn->servconn; + if (httpconn->waiting_response) + { + MsnHttpQueueData *queue_data = g_new0(MsnHttpQueueData, 1); + + queue_data->httpconn = httpconn; + queue_data->body = g_memdup(body, body_len); + queue_data->body_len = body_len; + + httpconn->queue = g_list_append(httpconn->queue, queue_data); + + return body_len; + } + server_type = server_types[servconn->type]; if (httpconn->virgin) @@ -532,245 +624,158 @@ "Connection: Keep-Alive\r\n" "Pragma: no-cache\r\n" "Content-Type: application/x-msn-messenger\r\n" - "Content-Length: %d\r\n\r\n" - "%s", + "Content-Length: %d\r\n\r\n", host, params, host, auth ? auth : "", - (int) size, - body ? body : ""); + (int) body_len); - g_free(params); g_free(auth); - r = write_raw(httpconn, data, strlen(data)); + header_len = strlen(data); + data = g_realloc(data, header_len + body_len); + memcpy(data + header_len, body, body_len); + if (write_raw(httpconn, data, header_len + body_len)) + httpconn->waiting_response = TRUE; + g_free(data); - if (r >= 0) - { - httpconn->waiting_response = TRUE; - httpconn->dirty = FALSE; - } - - return r; + return body_len; } -gboolean -msn_httpconn_parse_data(MsnHttpConn *httpconn, const char *buf, - size_t size, char **ret_buf, size_t *ret_size, - gboolean *error) +MsnHttpConn * +msn_httpconn_new(MsnServConn *servconn) { - const char *s, *c; - char *header, *body; - const char *body_start; - char *tmp; - size_t body_len = 0; - gboolean wasted = FALSE; + MsnHttpConn *httpconn; - g_return_val_if_fail(httpconn != NULL, FALSE); - g_return_val_if_fail(buf != NULL, FALSE); - g_return_val_if_fail(size > 0, FALSE); - g_return_val_if_fail(ret_buf != NULL, FALSE); - g_return_val_if_fail(ret_size != NULL, FALSE); - g_return_val_if_fail(error != NULL, FALSE); + g_return_val_if_fail(servconn != NULL, NULL); -#if 0 - gaim_debug_info("msn", "HTTP: parsing data {%s}\n", buf); -#endif + httpconn = g_new0(MsnHttpConn, 1); - httpconn->waiting_response = FALSE; + gaim_debug_info("msn", "new httpconn (%p)\n", httpconn); - /* Healthy defaults. */ - body = NULL; + /* TODO: Remove this */ + httpconn->session = servconn->session; - *ret_buf = NULL; - *ret_size = 0; - *error = FALSE; + httpconn->servconn = servconn; - /* First, some tests to see if we have a full block of stuff. */ - if (((strncmp(buf, "HTTP/1.1 200 OK\r\n", 17) != 0) && - (strncmp(buf, "HTTP/1.1 100 Continue\r\n", 23) != 0)) && - ((strncmp(buf, "HTTP/1.0 200 OK\r\n", 17) != 0) && - (strncmp(buf, "HTTP/1.0 100 Continue\r\n", 23) != 0))) - { - *error = TRUE; + httpconn->tx_buf = gaim_circ_buffer_new(MSN_BUF_LEN); + httpconn->tx_handler = 0; - return FALSE; - } + return httpconn; +} - if (strncmp(buf, "HTTP/1.1 100 Continue\r\n", 23) == 0) - { - if ((s = strstr(buf, "\r\n\r\n")) == NULL) - return FALSE; +void +msn_httpconn_destroy(MsnHttpConn *httpconn) +{ + g_return_if_fail(httpconn != NULL); - s += 4; + gaim_debug_info("msn", "destroy httpconn (%p)\n", httpconn); - if (*s == '\0') - { - *ret_buf = g_strdup(""); - *ret_size = 0; + if (httpconn->connected) + msn_httpconn_disconnect(httpconn); - if (httpconn->tx_handler > 0) - httpconn_write_cb(httpconn, httpconn->fd, - GAIM_INPUT_WRITE); - else - httpconn->dirty = TRUE; + g_free(httpconn->full_session_id); - return TRUE; - } + g_free(httpconn->session_id); - buf = s; - size -= (s - buf); - } + g_free(httpconn->host); - if ((s = strstr(buf, "\r\n\r\n")) == NULL) - return FALSE; + gaim_circ_buffer_destroy(httpconn->tx_buf); + if (httpconn->tx_handler > 0) + gaim_input_remove(httpconn->tx_handler); - s += 4; /* Skip \r\n */ - header = g_strndup(buf, s - buf); - body_start = s; - body_len = size - (body_start - buf); + g_free(httpconn); +} - if ((s = gaim_strcasestr(header, "Content-Length: ")) != NULL) +static void +connect_cb(gpointer data, gint source, GaimInputCondition cond) +{ + MsnHttpConn *httpconn = data; + + /* + TODO: Need to do this in case the account is disabled while connecting + if (!g_list_find(gaim_connections_get_all(), gc)) { - int tmp_len; + if (source >= 0) + close(source); + destroy_new_conn_data(new_conn_data); + return; + } + */ - s += strlen("Content-Length: "); + httpconn->fd = source; - if ((c = strchr(s, '\r')) == NULL) - { - g_free(header); + if (source >= 0) + { + httpconn->inpa = gaim_input_add(httpconn->fd, GAIM_INPUT_READ, + read_cb, data); - return FALSE; - } + httpconn->timer = gaim_timeout_add(2000, msn_httpconn_poll, httpconn); - tmp = g_strndup(s, c - s); - tmp_len = atoi(tmp); - g_free(tmp); - - if (body_len != tmp_len) - { - g_free(header); - -#if 0 - gaim_debug_warning("msn", - "body length (%d) != content length (%d)\n", - body_len, tmp_len); -#endif - - return FALSE; - } + msn_httpconn_process_queue(httpconn); } - - body = g_malloc0(body_len + 1); - memcpy(body, body_start, body_len); - -#ifdef MSN_DEBUG_HTTP - gaim_debug_misc("msn", "Incoming HTTP buffer (header): {%s\r\n}\n", - header); -#endif - - /* Now we should be able to process the data. */ - if ((s = gaim_strcasestr(header, "X-MSN-Messenger: ")) != NULL) + else { - char *full_session_id, *gw_ip, *session_action; - char *t, *session_id; - char **elems, **cur, **tokens; + gaim_debug_error("msn", "HTTP: Connection error\n"); + msn_servconn_got_error(httpconn->servconn, MSN_SERVCONN_ERROR_CONNECT); + } +} - full_session_id = gw_ip = session_action = NULL; +gboolean +msn_httpconn_connect(MsnHttpConn *httpconn, const char *host, int port) +{ + int r; - s += strlen("X-MSN-Messenger: "); + g_return_val_if_fail(httpconn != NULL, FALSE); + g_return_val_if_fail(host != NULL, FALSE); + g_return_val_if_fail(port > 0, FALSE); - if ((c = strchr(s, '\r')) == NULL) - { - msn_session_set_error(httpconn->session, - MSN_ERROR_HTTP_MALFORMED, NULL); - gaim_debug_error("msn", "Malformed X-MSN-Messenger field.\n{%s}", - buf); + if (httpconn->connected) + msn_httpconn_disconnect(httpconn); - g_free(body); - return FALSE; - } + r = gaim_proxy_connect(httpconn->session->account, + "gateway.messenger.hotmail.com", 80, connect_cb, httpconn); - tmp = g_strndup(s, c - s); + if (r == 0) + { + httpconn->waiting_response = TRUE; + httpconn->connected = TRUE; + } - elems = g_strsplit(tmp, "; ", 0); + return httpconn->connected; +} - for (cur = elems; *cur != NULL; cur++) - { - tokens = g_strsplit(*cur, "=", 2); +void +msn_httpconn_disconnect(MsnHttpConn *httpconn) +{ + g_return_if_fail(httpconn != NULL); - if (strcmp(tokens[0], "SessionID") == 0) - full_session_id = tokens[1]; - else if (strcmp(tokens[0], "GW-IP") == 0) - gw_ip = tokens[1]; - else if (strcmp(tokens[0], "Session") == 0) - session_action = tokens[1]; + if (!httpconn->connected) + return; - g_free(tokens[0]); - /* Don't free each of the tokens, only the array. */ - g_free(tokens); - } + if (httpconn->timer) + gaim_timeout_remove(httpconn->timer); - g_strfreev(elems); + httpconn->timer = 0; - 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) - { - g_free(httpconn->full_session_id); - - httpconn->full_session_id = full_session_id; - - g_free(httpconn->session_id); - - httpconn->session_id = session_id; - - g_free(httpconn->host); - - httpconn->host = gw_ip; - } - else - { - MsnServConn *servconn; - - /* It's going to die. */ - /* poor thing */ - - servconn = httpconn->servconn; - - /* I'll be honest, I don't fully understand all this, but this - * causes crashes, Stu. */ - /* if (servconn != NULL) - servconn->wasted = TRUE; */ - - g_free(full_session_id); - g_free(session_id); - g_free(gw_ip); - } + if (httpconn->inpa > 0) + { + gaim_input_remove(httpconn->inpa); + httpconn->inpa = 0; } - g_free(header); + close(httpconn->fd); - *ret_buf = body; - *ret_size = body_len; + g_free(httpconn->rx_buf); + httpconn->rx_buf = NULL; + httpconn->rx_len = 0; - if (httpconn->tx_handler > 0) - httpconn_write_cb(httpconn, httpconn->fd, GAIM_INPUT_WRITE); - else - httpconn->dirty = TRUE; + httpconn->connected = FALSE; - return TRUE; + /* msn_servconn_disconnect(httpconn->servconn); */ } Modified: trunk/src/protocols/msn/httpconn.h =================================================================== --- trunk/src/protocols/msn/httpconn.h 2006-07-03 18:28:13 UTC (rev 16413) +++ trunk/src/protocols/msn/httpconn.h 2006-07-03 20:39:04 UTC (rev 16414) @@ -44,13 +44,13 @@ gboolean waiting_response; /**< The flag that states if we are waiting a response from the server. */ - gboolean dirty; /**< The flag that states if we should poll. */ gboolean connected; /**< The flag that states if the connection is on. */ gboolean virgin; /**< The flag that states if this connection should specify the host (not gateway) to connect to. */ char *host; /**< The HTTP gateway host. */ + GList *queue; /**< The queue of data chunks to write. */ int fd; /**< The connection's file descriptor. */ guint inpa; /**< The connection's input handler. */ @@ -83,11 +83,11 @@ * * @param servconn The server connection. * @param data The data to write. - * @param size The size of the data to write. + * @param data_len The size of the data to write. * * @return The number of bytes written. */ -ssize_t msn_httpconn_write(MsnHttpConn *httpconn, const char *data, size_t size); +ssize_t msn_httpconn_write(MsnHttpConn *httpconn, const char *data, size_t data_len); /** * Connects the HTTP connection object to a host. Modified: trunk/src/protocols/msn/msn.c =================================================================== --- trunk/src/protocols/msn/msn.c 2006-07-03 18:28:13 UTC (rev 16413) +++ trunk/src/protocols/msn/msn.c 2006-07-03 20:39:04 UTC (rev 16414) @@ -731,8 +731,7 @@ return; } - if (gaim_account_get_bool(account, "http_method", FALSE)) - http_method = TRUE; + http_method = gaim_account_get_bool(account, "http_method", FALSE); host = gaim_account_get_string(account, "server", MSN_SERVER); port = gaim_account_get_int(account, "port", MSN_PORT); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <the...@us...> - 2006-07-06 08:11:13
|
Revision: 16439 Author: thekingant Date: 2006-07-06 01:11:08 -0700 (Thu, 06 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16439&view=rev Log Message: ----------- Minor odds and ends Modified Paths: -------------- trunk/plugins/ssl/ssl-gnutls.c trunk/src/conversation.c trunk/src/server.c trunk/src/util.c Modified: trunk/plugins/ssl/ssl-gnutls.c =================================================================== --- trunk/plugins/ssl/ssl-gnutls.c 2006-07-06 08:01:36 UTC (rev 16438) +++ trunk/plugins/ssl/ssl-gnutls.c 2006-07-06 08:11:08 UTC (rev 16439) @@ -106,6 +106,11 @@ GaimSslGnutlsData *gnutls_data; static const int cert_type_priority[2] = { GNUTLS_CRT_X509, 0 }; + /* + * TODO: Uh, this needs to somehow check to make sure that gsc is + * still valid before actually doing anything. + */ + if(source < 0) { if(gsc->error_cb != NULL) gsc->error_cb(gsc, GAIM_SSL_CONNECT_FAILED, gsc->connect_cb_data); Modified: trunk/src/conversation.c =================================================================== --- trunk/src/conversation.c 2006-07-06 08:01:36 UTC (rev 16438) +++ trunk/src/conversation.c 2006-07-06 08:11:08 UTC (rev 16439) @@ -57,9 +57,6 @@ gaim_conv_im_update_typing(im); gaim_conv_im_stop_typing_timeout(im); - gaim_signal_emit(gaim_conversations_get_handle(), - "buddy-typing-stopped", c->account, c->name); - return FALSE; } Modified: trunk/src/server.c =================================================================== --- trunk/src/server.c 2006-07-06 08:01:36 UTC (rev 16438) +++ trunk/src/server.c 2006-07-06 08:11:08 UTC (rev 16439) @@ -621,9 +621,6 @@ gaim_signal_emit(gaim_conversations_get_handle(), "buddy-typing-stopped", gc->account, name); } - - gaim_signal_emit(gaim_conversations_get_handle(), - "buddy-typing-stopped", gc->account, name); } struct chat_invite_data { Modified: trunk/src/util.c =================================================================== --- trunk/src/util.c 2006-07-06 08:01:36 UTC (rev 16438) +++ trunk/src/util.c 2006-07-06 08:11:08 UTC (rev 16439) @@ -2521,7 +2521,7 @@ } } else { gaim_debug(GAIM_DEBUG_ERROR, "gaim_mkstemp", - "g_get_tmp_dir() failed!"); + "g_get_tmp_dir() failed!\n"); } return fp; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <the...@us...> - 2006-07-06 09:22:03
|
Revision: 16445 Author: thekingant Date: 2006-07-06 02:21:57 -0700 (Thu, 06 Jul 2006) ViewCVS: http://svn.sourceforge.net/gaim/?rev=16445&view=rev Log Message: ----------- Fix a crash bug on some systems (mostly amd64) caused by using a va_list twice. My bad! Thanks to Kevin Stange and Vincent Ho for noticing this and suggesting the cause. Vincent's IRC handle reminds me of a Harvey Danger song. Modified Paths: -------------- trunk/src/debug.c trunk/src/debug.h trunk/src/gtkdebug.c Modified: trunk/src/debug.c =================================================================== --- trunk/src/debug.c 2006-07-06 09:15:56 UTC (rev 16444) +++ trunk/src/debug.c 2006-07-06 09:21:57 UTC (rev 16445) @@ -46,15 +46,21 @@ const char *format, va_list args) { GaimDebugUiOps *ops; + char *arg_s = NULL; g_return_if_fail(level != GAIM_DEBUG_ALL); g_return_if_fail(format != NULL); + ops = gaim_debug_get_ui_ops(); + + if (!debug_enabled && ((ops == NULL) || (ops->print == NULL))) + return; + + arg_s = g_strdup_vprintf(format, args); + if (debug_enabled) { - gchar *arg_s, *ts_s; + gchar *ts_s; - arg_s = g_strdup_vprintf(format, args); - if ((category != NULL) && (gaim_prefs_exists("/core/debug/timestamps")) && (gaim_prefs_get_bool("/core/debug/timestamps"))) { @@ -72,14 +78,13 @@ else g_print("%s%s: %s", ts_s, category, arg_s); - g_free(arg_s); g_free(ts_s); } - ops = gaim_debug_get_ui_ops(); + if (ops != NULL && ops->print != NULL) + ops->print(level, category, arg_s); - if (ops != NULL && ops->print != NULL) - ops->print(level, category, format, args); + g_free(arg_s); } void Modified: trunk/src/debug.h =================================================================== --- trunk/src/debug.h 2006-07-06 09:15:56 UTC (rev 16444) +++ trunk/src/debug.h 2006-07-06 09:21:57 UTC (rev 16445) @@ -48,7 +48,7 @@ typedef struct { void (*print)(GaimDebugLevel level, const char *category, - const char *format, va_list args); + const char *arg_s); } GaimDebugUiOps; #ifdef __cplusplus Modified: trunk/src/gtkdebug.c =================================================================== --- trunk/src/gtkdebug.c 2006-07-06 09:15:56 UTC (rev 16444) +++ trunk/src/gtkdebug.c 2006-07-06 09:21:57 UTC (rev 16445) @@ -931,13 +931,13 @@ static void gaim_gtk_debug_print(GaimDebugLevel level, const char *category, - const char *format, va_list args) + const char *arg_s) { #ifdef HAVE_REGEX_H GtkTreeIter iter; #endif /* HAVE_REGEX_H */ gboolean timestamps; - gchar *arg_s, *ts_s; + gchar *ts_s; gchar *esc_s, *cat_s, *tmp, *s; if (!gaim_prefs_get_bool("/gaim/gtk/debug/enabled") || @@ -948,8 +948,6 @@ timestamps = gaim_prefs_get_bool("/core/debug/timestamps"); - arg_s = g_strdup_vprintf(format, args); - /* * For some reason we only print the timestamp if category is * not NULL. Why the hell do we do that? --Mark @@ -971,8 +969,6 @@ esc_s = g_markup_escape_text(arg_s, -1); - g_free(arg_s); - s = g_strdup_printf("<font color=\"%s\">%s%s%s</font>", debug_fg_colors[level], ts_s, cat_s, esc_s); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |