Mercurial > pidgin
annotate finch/gntft.c @ 30912:63aeff4ebc19
jabber: Avoid a double-free in the google relay code.
Also some whitespace clean-up right next to the double-free. Reported by
"mordy" in #pidgin.
| author | Paul Aurich <paul@darkrain42.org> |
|---|---|
| date | Mon, 08 Nov 2010 17:05:18 +0000 |
| parents | 1cdae196aac8 |
| children | a8cc50c2279f |
| rev | line source |
|---|---|
| 15817 | 1 /** |
| 2 * @file gntft.c GNT File Transfer UI | |
|
16194
0f0832c13fcb
Rename the Doxygen group from gntui to finch and define the finch group
Richard Laager <rlaager@wiktel.com>
parents:
15964
diff
changeset
|
3 * @ingroup finch |
|
20074
6bf32c9e15a7
remove gpl boilerplate from doxygen docs
Sean Egan <seanegan@gmail.com>
parents:
19681
diff
changeset
|
4 */ |
|
6bf32c9e15a7
remove gpl boilerplate from doxygen docs
Sean Egan <seanegan@gmail.com>
parents:
19681
diff
changeset
|
5 |
|
6bf32c9e15a7
remove gpl boilerplate from doxygen docs
Sean Egan <seanegan@gmail.com>
parents:
19681
diff
changeset
|
6 /* finch |
| 15817 | 7 * |
|
15870
66dff3dfdea6
Re-sed the copyright notices so they don't all talk about Purple.
Richard Laager <rlaager@wiktel.com>
parents:
15822
diff
changeset
|
8 * Finch is the legal property of its developers, whose names are too numerous |
| 15817 | 9 * to list here. Please refer to the COPYRIGHT file distributed with this |
| 10 * source distribution. | |
| 11 * | |
| 12 * This program is free software; you can redistribute it and/or modify | |
| 13 * it under the terms of the GNU General Public License as published by | |
| 14 * the Free Software Foundation; either version 2 of the License, or | |
| 15 * (at your option) any later version. | |
| 16 * | |
| 17 * This program is distributed in the hope that it will be useful, | |
| 18 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 20 * GNU General Public License for more details. | |
| 21 * | |
| 22 * You should have received a copy of the GNU General Public License | |
| 23 * along with this program; if not, write to the Free Software | |
|
19681
44b4e8bd759b
The FSF changed its address a while ago; our files were out of date.
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
19374
diff
changeset
|
24 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA |
| 15817 | 25 */ |
|
28770
259bbfb423d4
Fix all the remaining files for which internal.h doesn't end up being the first include.
Paul Aurich <paul@darkrain42.org>
parents:
27587
diff
changeset
|
26 #include <internal.h> |
|
22217
ad357ca94de9
We will probably eventually use purple_object_[get|set]_ui_data. Until then, this will do.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22216
diff
changeset
|
27 #include "finch.h" |
|
ad357ca94de9
We will probably eventually use purple_object_[get|set]_ui_data. Until then, this will do.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22216
diff
changeset
|
28 |
| 15817 | 29 #include <gnt.h> |
| 30 #include <gntbox.h> | |
| 31 #include <gntbutton.h> | |
| 32 #include <gntcheckbox.h> | |
| 33 #include <gntlabel.h> | |
| 34 #include <gnttree.h> | |
| 35 | |
|
26347
1c73d2ef9ddc
Remove some extra edits that snuck into Finch.
Mike Ruprecht <maiku@soc.pidgin.im>
parents:
23840
diff
changeset
|
36 #include "debug.h" |
|
1c73d2ef9ddc
Remove some extra edits that snuck into Finch.
Mike Ruprecht <maiku@soc.pidgin.im>
parents:
23840
diff
changeset
|
37 #include "notify.h" |
|
1c73d2ef9ddc
Remove some extra edits that snuck into Finch.
Mike Ruprecht <maiku@soc.pidgin.im>
parents:
23840
diff
changeset
|
38 #include "ft.h" |
|
1c73d2ef9ddc
Remove some extra edits that snuck into Finch.
Mike Ruprecht <maiku@soc.pidgin.im>
parents:
23840
diff
changeset
|
39 #include "prpl.h" |
|
1c73d2ef9ddc
Remove some extra edits that snuck into Finch.
Mike Ruprecht <maiku@soc.pidgin.im>
parents:
23840
diff
changeset
|
40 #include "util.h" |
|
1c73d2ef9ddc
Remove some extra edits that snuck into Finch.
Mike Ruprecht <maiku@soc.pidgin.im>
parents:
23840
diff
changeset
|
41 |
| 15817 | 42 #include "gntft.h" |
| 43 #include "prefs.h" | |
| 44 | |
| 15822 | 45 #define FINCHXFER(xfer) \ |
|
22217
ad357ca94de9
We will probably eventually use purple_object_[get|set]_ui_data. Until then, this will do.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22216
diff
changeset
|
46 (PurpleGntXferUiData *)FINCH_GET_DATA(xfer) |
| 15817 | 47 |
| 48 typedef struct | |
| 49 { | |
| 50 gboolean keep_open; | |
| 51 gboolean auto_clear; | |
| 52 gint num_transfers; | |
| 53 | |
| 54 GntWidget *window; | |
| 55 GntWidget *tree; | |
| 56 | |
| 57 GntWidget *remove_button; | |
| 58 GntWidget *stop_button; | |
| 59 GntWidget *close_button; | |
| 15822 | 60 } PurpleGntXferDialog; |
| 15817 | 61 |
| 15822 | 62 static PurpleGntXferDialog *xfer_dialog = NULL; |
| 15817 | 63 |
| 64 typedef struct | |
| 65 { | |
| 66 time_t last_updated_time; | |
| 67 gboolean in_list; | |
| 68 | |
| 69 char *name; | |
|
22049
3f7e58ae1305
Don't print 'file transfer complete' message more than once for the same xfer.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22048
diff
changeset
|
70 gboolean notified; /* Has the completion of the transfer been notified? */ |
| 15817 | 71 |
| 15822 | 72 } PurpleGntXferUiData; |
| 15817 | 73 |
| 74 enum | |
| 75 { | |
| 76 COLUMN_PROGRESS = 0, | |
| 77 COLUMN_FILENAME, | |
| 78 COLUMN_SIZE, | |
| 79 COLUMN_SPEED, | |
| 80 COLUMN_REMAINING, | |
| 81 COLUMN_STATUS, | |
| 82 NUM_COLUMNS | |
| 83 }; | |
| 84 | |
| 85 | |
| 86 /************************************************************************** | |
| 87 * Utility Functions | |
| 88 **************************************************************************/ | |
| 89 | |
| 90 static void | |
|
22007
c38d72677c8a
Probe for -Wstrict-prototypes to get some more warnings. I then cleaned up
Richard Laager <rlaager@wiktel.com>
parents:
20074
diff
changeset
|
91 update_title_progress(void) |
| 15817 | 92 { |
|
18118
ab6d2763b8d8
Re-fix the DBus list handling code by killing const GList* / const GSList*
Richard Laager <rlaager@wiktel.com>
parents:
16669
diff
changeset
|
93 GList *list; |
| 15817 | 94 int num_active_xfers = 0; |
| 95 guint64 total_bytes_xferred = 0; | |
| 96 guint64 total_file_size = 0; | |
| 97 | |
| 98 if (xfer_dialog == NULL || xfer_dialog->window == NULL) | |
| 99 return; | |
| 100 | |
| 101 /* Find all active transfers */ | |
| 102 for (list = gnt_tree_get_rows(GNT_TREE(xfer_dialog->tree)); list; list = list->next) { | |
| 15822 | 103 PurpleXfer *xfer = (PurpleXfer *)list->data; |
| 15817 | 104 |
| 15822 | 105 if (purple_xfer_get_status(xfer) == PURPLE_XFER_STATUS_STARTED) { |
| 15817 | 106 num_active_xfers++; |
| 15822 | 107 total_bytes_xferred += purple_xfer_get_bytes_sent(xfer); |
| 108 total_file_size += purple_xfer_get_size(xfer); | |
| 15817 | 109 } |
| 110 } | |
| 111 | |
| 112 /* Update the title */ | |
| 113 if (num_active_xfers > 0) { | |
| 114 gchar *title; | |
| 115 int total_pct = 0; | |
| 116 | |
| 117 if (total_file_size > 0) { | |
| 118 total_pct = 100 * total_bytes_xferred / total_file_size; | |
| 119 } | |
| 120 | |
|
23332
19ab21882b38
"This patch pluralizes a few strings that should be pluralized for
Laurynas Biveinis <laurynas.biveinis@gmail.com>
parents:
22633
diff
changeset
|
121 title = g_strdup_printf(ngettext("File Transfers - %d%% of %d file", |
|
19ab21882b38
"This patch pluralizes a few strings that should be pluralized for
Laurynas Biveinis <laurynas.biveinis@gmail.com>
parents:
22633
diff
changeset
|
122 "File Transfers - %d%% of %d files", |
|
19ab21882b38
"This patch pluralizes a few strings that should be pluralized for
Laurynas Biveinis <laurynas.biveinis@gmail.com>
parents:
22633
diff
changeset
|
123 num_active_xfers), |
| 15817 | 124 total_pct, num_active_xfers); |
| 125 gnt_screen_rename_widget((xfer_dialog->window), title); | |
| 126 g_free(title); | |
| 127 } else { | |
| 128 gnt_screen_rename_widget((xfer_dialog->window), _("File Transfers")); | |
| 129 } | |
| 130 } | |
| 131 | |
| 132 | |
| 133 /************************************************************************** | |
| 134 * Callbacks | |
| 135 **************************************************************************/ | |
| 136 static void | |
| 137 toggle_keep_open_cb(GntWidget *w) | |
| 138 { | |
| 139 xfer_dialog->keep_open = !xfer_dialog->keep_open; | |
|
16424
4999bbc52881
Works for me! Renames prefs: /core to /purple, /gaim/gtk to /pidgin, /gaim/gnt to /finch
Sean Egan <seanegan@gmail.com>
parents:
16194
diff
changeset
|
140 purple_prefs_set_bool("/finch/filetransfer/keep_open", |
| 15817 | 141 xfer_dialog->keep_open); |
| 142 } | |
| 143 | |
| 144 static void | |
| 145 toggle_clear_finished_cb(GntWidget *w) | |
| 146 { | |
| 147 xfer_dialog->auto_clear = !xfer_dialog->auto_clear; | |
|
16424
4999bbc52881
Works for me! Renames prefs: /core to /purple, /gaim/gtk to /pidgin, /gaim/gnt to /finch
Sean Egan <seanegan@gmail.com>
parents:
16194
diff
changeset
|
148 purple_prefs_set_bool("/finch/filetransfer/clear_finished", |
| 15817 | 149 xfer_dialog->auto_clear); |
|
22048
6704629dc478
Remove the completed/cancelled xfers when 'Clear finished transfers' is selected. (Did anyone notice our 'purple_xfer_is_canceled' is typoed?)
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22007
diff
changeset
|
150 if (xfer_dialog->auto_clear) { |
|
6704629dc478
Remove the completed/cancelled xfers when 'Clear finished transfers' is selected. (Did anyone notice our 'purple_xfer_is_canceled' is typoed?)
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22007
diff
changeset
|
151 GList *iter = purple_xfers_get_all(); |
|
6704629dc478
Remove the completed/cancelled xfers when 'Clear finished transfers' is selected. (Did anyone notice our 'purple_xfer_is_canceled' is typoed?)
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22007
diff
changeset
|
152 while (iter) { |
|
6704629dc478
Remove the completed/cancelled xfers when 'Clear finished transfers' is selected. (Did anyone notice our 'purple_xfer_is_canceled' is typoed?)
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22007
diff
changeset
|
153 PurpleXfer *xfer = iter->data; |
|
6704629dc478
Remove the completed/cancelled xfers when 'Clear finished transfers' is selected. (Did anyone notice our 'purple_xfer_is_canceled' is typoed?)
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22007
diff
changeset
|
154 iter = iter->next; |
|
6704629dc478
Remove the completed/cancelled xfers when 'Clear finished transfers' is selected. (Did anyone notice our 'purple_xfer_is_canceled' is typoed?)
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22007
diff
changeset
|
155 if (purple_xfer_is_completed(xfer) || purple_xfer_is_canceled(xfer)) |
|
6704629dc478
Remove the completed/cancelled xfers when 'Clear finished transfers' is selected. (Did anyone notice our 'purple_xfer_is_canceled' is typoed?)
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22007
diff
changeset
|
156 finch_xfer_dialog_remove_xfer(xfer); |
|
6704629dc478
Remove the completed/cancelled xfers when 'Clear finished transfers' is selected. (Did anyone notice our 'purple_xfer_is_canceled' is typoed?)
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22007
diff
changeset
|
157 } |
|
6704629dc478
Remove the completed/cancelled xfers when 'Clear finished transfers' is selected. (Did anyone notice our 'purple_xfer_is_canceled' is typoed?)
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22007
diff
changeset
|
158 } |
| 15817 | 159 } |
| 160 | |
| 161 static void | |
| 162 remove_button_cb(GntButton *button) | |
| 163 { | |
| 15822 | 164 PurpleXfer *selected_xfer = gnt_tree_get_selection_data(GNT_TREE(xfer_dialog->tree)); |
|
22048
6704629dc478
Remove the completed/cancelled xfers when 'Clear finished transfers' is selected. (Did anyone notice our 'purple_xfer_is_canceled' is typoed?)
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22007
diff
changeset
|
165 if (selected_xfer && (purple_xfer_is_completed(selected_xfer) || |
|
6704629dc478
Remove the completed/cancelled xfers when 'Clear finished transfers' is selected. (Did anyone notice our 'purple_xfer_is_canceled' is typoed?)
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22007
diff
changeset
|
166 purple_xfer_is_canceled(selected_xfer))) { |
| 15817 | 167 finch_xfer_dialog_remove_xfer(selected_xfer); |
| 168 } | |
| 169 } | |
| 170 | |
| 171 static void | |
| 172 stop_button_cb(GntButton *button) | |
| 173 { | |
| 15822 | 174 PurpleXfer *selected_xfer = gnt_tree_get_selection_data(GNT_TREE(xfer_dialog->tree)); |
|
22216
b99d6d21cd79
Add accessor and update finch to not touch the internals of PurpleXfer.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22049
diff
changeset
|
175 PurpleXferStatusType status; |
|
b99d6d21cd79
Add accessor and update finch to not touch the internals of PurpleXfer.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22049
diff
changeset
|
176 |
|
b99d6d21cd79
Add accessor and update finch to not touch the internals of PurpleXfer.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22049
diff
changeset
|
177 if (!selected_xfer) |
|
b99d6d21cd79
Add accessor and update finch to not touch the internals of PurpleXfer.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22049
diff
changeset
|
178 return; |
|
b99d6d21cd79
Add accessor and update finch to not touch the internals of PurpleXfer.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22049
diff
changeset
|
179 |
|
b99d6d21cd79
Add accessor and update finch to not touch the internals of PurpleXfer.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22049
diff
changeset
|
180 status = purple_xfer_get_status(selected_xfer); |
|
b99d6d21cd79
Add accessor and update finch to not touch the internals of PurpleXfer.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22049
diff
changeset
|
181 if (status != PURPLE_XFER_STATUS_CANCEL_LOCAL && |
|
b99d6d21cd79
Add accessor and update finch to not touch the internals of PurpleXfer.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22049
diff
changeset
|
182 status != PURPLE_XFER_STATUS_CANCEL_REMOTE && |
|
b99d6d21cd79
Add accessor and update finch to not touch the internals of PurpleXfer.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22049
diff
changeset
|
183 status != PURPLE_XFER_STATUS_DONE) |
| 15822 | 184 purple_xfer_cancel_local(selected_xfer); |
| 15817 | 185 } |
| 186 | |
| 187 /************************************************************************** | |
| 188 * Dialog Building Functions | |
| 189 **************************************************************************/ | |
| 190 | |
| 191 | |
| 192 void | |
| 193 finch_xfer_dialog_new(void) | |
| 194 { | |
|
18118
ab6d2763b8d8
Re-fix the DBus list handling code by killing const GList* / const GSList*
Richard Laager <rlaager@wiktel.com>
parents:
16669
diff
changeset
|
195 GList *iter; |
| 15817 | 196 GntWidget *window; |
| 197 GntWidget *bbox; | |
| 198 GntWidget *button; | |
| 199 GntWidget *checkbox; | |
| 200 GntWidget *tree; | |
|
18404
9a0f99ea664d
Resize tree-columns nicely when the tree is resized. We can tell it to
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18345
diff
changeset
|
201 int widths[] = {8, 12, 8, 8, 8, 8, -1}; |
| 15817 | 202 |
| 203 if (!xfer_dialog) | |
| 15822 | 204 xfer_dialog = g_new0(PurpleGntXferDialog, 1); |
| 15817 | 205 |
| 206 xfer_dialog->keep_open = | |
|
16424
4999bbc52881
Works for me! Renames prefs: /core to /purple, /gaim/gtk to /pidgin, /gaim/gnt to /finch
Sean Egan <seanegan@gmail.com>
parents:
16194
diff
changeset
|
207 purple_prefs_get_bool("/finch/filetransfer/keep_open"); |
| 15817 | 208 xfer_dialog->auto_clear = |
|
16424
4999bbc52881
Works for me! Renames prefs: /core to /purple, /gaim/gtk to /pidgin, /gaim/gnt to /finch
Sean Egan <seanegan@gmail.com>
parents:
16194
diff
changeset
|
209 purple_prefs_get_bool("/finch/filetransfer/clear_finished"); |
| 15817 | 210 |
| 211 /* Create the window. */ | |
| 212 xfer_dialog->window = window = gnt_vbox_new(FALSE); | |
| 213 g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(finch_xfer_dialog_destroy), NULL); | |
| 214 gnt_box_set_toplevel(GNT_BOX(window), TRUE); | |
| 215 gnt_box_set_title(GNT_BOX(window), _("File Transfers")); | |
|
19374
d65ce3df5be2
Make some of the dialogs look and behave more like each other.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18404
diff
changeset
|
216 gnt_box_set_fill(GNT_BOX(window), TRUE); |
|
d65ce3df5be2
Make some of the dialogs look and behave more like each other.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18404
diff
changeset
|
217 gnt_box_set_alignment(GNT_BOX(window), GNT_ALIGN_MID); |
| 15817 | 218 |
| 219 xfer_dialog->tree = tree = gnt_tree_new_with_columns(NUM_COLUMNS); | |
| 220 gnt_tree_set_column_titles(GNT_TREE(tree), _("Progress"), _("Filename"), _("Size"), _("Speed"), _("Remaining"), _("Status")); | |
|
18404
9a0f99ea664d
Resize tree-columns nicely when the tree is resized. We can tell it to
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18345
diff
changeset
|
221 gnt_tree_set_column_width_ratio(GNT_TREE(tree), widths); |
|
9a0f99ea664d
Resize tree-columns nicely when the tree is resized. We can tell it to
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18345
diff
changeset
|
222 gnt_tree_set_column_resizable(GNT_TREE(tree), COLUMN_PROGRESS, FALSE); |
|
9a0f99ea664d
Resize tree-columns nicely when the tree is resized. We can tell it to
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18345
diff
changeset
|
223 gnt_tree_set_column_resizable(GNT_TREE(tree), COLUMN_SIZE, FALSE); |
|
9a0f99ea664d
Resize tree-columns nicely when the tree is resized. We can tell it to
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18345
diff
changeset
|
224 gnt_tree_set_column_resizable(GNT_TREE(tree), COLUMN_SPEED, FALSE); |
|
9a0f99ea664d
Resize tree-columns nicely when the tree is resized. We can tell it to
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18345
diff
changeset
|
225 gnt_tree_set_column_resizable(GNT_TREE(tree), COLUMN_REMAINING, FALSE); |
|
9a0f99ea664d
Resize tree-columns nicely when the tree is resized. We can tell it to
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18345
diff
changeset
|
226 gnt_widget_set_size(tree, 70, -1); |
| 15817 | 227 gnt_tree_set_show_title(GNT_TREE(tree), TRUE); |
| 228 gnt_box_add_widget(GNT_BOX(window), tree); | |
|
15942
ee397e53d9ce
allow cancellation of transfers waiting to be accepted
Richard Nelson <wabz@pidgin.im>
parents:
15870
diff
changeset
|
229 |
| 15817 | 230 checkbox = gnt_check_box_new( _("Close this window when all transfers finish")); |
| 231 gnt_check_box_set_checked(GNT_CHECK_BOX(checkbox), | |
| 232 !xfer_dialog->keep_open); | |
| 233 g_signal_connect(G_OBJECT(checkbox), "toggled", | |
| 234 G_CALLBACK(toggle_keep_open_cb), NULL); | |
| 235 gnt_box_add_widget(GNT_BOX(window), checkbox); | |
| 236 | |
| 237 checkbox = gnt_check_box_new(_("Clear finished transfers")); | |
| 238 gnt_check_box_set_checked(GNT_CHECK_BOX(checkbox), | |
| 239 xfer_dialog->auto_clear); | |
| 240 g_signal_connect(G_OBJECT(checkbox), "toggled", | |
| 241 G_CALLBACK(toggle_clear_finished_cb), NULL); | |
| 242 gnt_box_add_widget(GNT_BOX(window), checkbox); | |
| 243 | |
|
19374
d65ce3df5be2
Make some of the dialogs look and behave more like each other.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18404
diff
changeset
|
244 bbox = gnt_hbox_new(FALSE); |
| 15817 | 245 |
| 246 xfer_dialog->remove_button = button = gnt_button_new(_("Remove")); | |
| 247 g_signal_connect(G_OBJECT(button), "activate", | |
| 248 G_CALLBACK(remove_button_cb), NULL); | |
| 249 gnt_box_add_widget(GNT_BOX(bbox), button); | |
| 250 | |
| 251 xfer_dialog->stop_button = button = gnt_button_new(_("Stop")); | |
| 252 g_signal_connect(G_OBJECT(button), "activate", | |
| 253 G_CALLBACK(stop_button_cb), NULL); | |
| 254 gnt_box_add_widget(GNT_BOX(bbox), button); | |
| 255 | |
| 256 xfer_dialog->close_button = button = gnt_button_new(_("Close")); | |
| 257 g_signal_connect(G_OBJECT(button), "activate", | |
| 258 G_CALLBACK(finch_xfer_dialog_destroy), NULL); | |
| 259 gnt_box_add_widget(GNT_BOX(bbox), button); | |
| 260 | |
| 261 gnt_box_add_widget(GNT_BOX(window), bbox); | |
| 262 | |
| 15822 | 263 for (iter = purple_xfers_get_all(); iter; iter = iter->next) { |
| 264 PurpleXfer *xfer = (PurpleXfer *)iter->data; | |
| 265 PurpleGntXferUiData *data = FINCHXFER(xfer); | |
| 15817 | 266 if (data->in_list) { |
| 267 finch_xfer_dialog_add_xfer(xfer); | |
| 268 finch_xfer_dialog_update_xfer(xfer); | |
| 269 gnt_tree_set_selected(GNT_TREE(tree), xfer); | |
| 270 } | |
| 271 } | |
| 272 gnt_widget_show(xfer_dialog->window); | |
| 273 } | |
| 274 | |
| 275 void | |
| 276 finch_xfer_dialog_destroy() | |
| 277 { | |
| 278 gnt_widget_destroy(xfer_dialog->window); | |
| 279 g_free(xfer_dialog); | |
| 280 xfer_dialog = NULL; | |
| 281 } | |
| 282 | |
| 283 void | |
| 284 finch_xfer_dialog_show() | |
| 285 { | |
| 286 if (xfer_dialog == NULL) | |
| 287 finch_xfer_dialog_new(); | |
|
18345
2d4df5ef0090
If the action-windows are already there, then bring them to front when
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18129
diff
changeset
|
288 else |
|
2d4df5ef0090
If the action-windows are already there, then bring them to front when
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18129
diff
changeset
|
289 gnt_window_present(xfer_dialog->window); |
| 15817 | 290 } |
| 291 | |
| 292 void | |
| 15822 | 293 finch_xfer_dialog_add_xfer(PurpleXfer *xfer) |
| 15817 | 294 { |
| 15822 | 295 PurpleGntXferUiData *data; |
| 296 PurpleXferType type; | |
| 15817 | 297 char *size_str, *remaining_str; |
| 298 char *lfilename, *utf8; | |
| 299 | |
| 300 g_return_if_fail(xfer_dialog != NULL); | |
| 301 g_return_if_fail(xfer != NULL); | |
| 302 | |
| 15822 | 303 purple_xfer_ref(xfer); |
| 15817 | 304 |
| 15822 | 305 data = FINCHXFER(xfer); |
| 15817 | 306 data->in_list = TRUE; |
| 307 | |
| 308 finch_xfer_dialog_show(); | |
| 309 | |
| 310 data->last_updated_time = 0; | |
| 311 | |
| 15822 | 312 type = purple_xfer_get_type(xfer); |
| 15817 | 313 |
| 15822 | 314 size_str = purple_str_size_to_units(purple_xfer_get_size(xfer)); |
| 315 remaining_str = purple_str_size_to_units(purple_xfer_get_bytes_remaining(xfer)); | |
| 15817 | 316 |
| 15822 | 317 lfilename = g_path_get_basename(purple_xfer_get_local_filename(xfer)); |
| 15817 | 318 utf8 = g_filename_to_utf8(lfilename, -1, NULL, NULL, NULL); |
| 319 g_free(lfilename); | |
| 320 lfilename = utf8; | |
| 321 gnt_tree_add_row_last(GNT_TREE(xfer_dialog->tree), xfer, | |
| 322 gnt_tree_create_row(GNT_TREE(xfer_dialog->tree), | |
| 15822 | 323 "0.0", (type == PURPLE_XFER_RECEIVE) ? purple_xfer_get_filename(xfer) : lfilename, |
| 15817 | 324 size_str, "0.0", "",_("Waiting for transfer to begin")), NULL); |
| 325 g_free(lfilename); | |
| 326 | |
| 327 g_free(size_str); | |
| 328 g_free(remaining_str); | |
| 329 | |
| 330 xfer_dialog->num_transfers++; | |
| 331 | |
| 332 update_title_progress(); | |
| 333 } | |
| 334 | |
| 335 void | |
| 15822 | 336 finch_xfer_dialog_remove_xfer(PurpleXfer *xfer) |
| 15817 | 337 { |
| 15822 | 338 PurpleGntXferUiData *data; |
| 15817 | 339 |
| 340 g_return_if_fail(xfer_dialog != NULL); | |
| 341 g_return_if_fail(xfer != NULL); | |
| 342 | |
| 15822 | 343 data = FINCHXFER(xfer); |
| 15817 | 344 |
| 345 if (data == NULL) | |
| 346 return; | |
| 347 | |
| 348 if (!data->in_list) | |
| 349 return; | |
| 350 | |
| 351 data->in_list = FALSE; | |
| 352 | |
| 353 gnt_tree_remove(GNT_TREE(xfer_dialog->tree), xfer); | |
| 354 | |
| 355 xfer_dialog->num_transfers--; | |
| 356 | |
| 357 if (xfer_dialog->num_transfers == 0 && !xfer_dialog->keep_open) | |
| 358 finch_xfer_dialog_destroy(); | |
| 359 else | |
| 360 update_title_progress(); | |
| 15822 | 361 purple_xfer_unref(xfer); |
| 15817 | 362 } |
| 363 | |
| 364 void | |
| 15822 | 365 finch_xfer_dialog_cancel_xfer(PurpleXfer *xfer) |
| 15817 | 366 { |
| 15822 | 367 PurpleGntXferUiData *data; |
| 15817 | 368 const gchar *status; |
| 369 | |
| 370 g_return_if_fail(xfer_dialog != NULL); | |
| 371 g_return_if_fail(xfer != NULL); | |
| 372 | |
| 15822 | 373 data = FINCHXFER(xfer); |
| 15817 | 374 |
| 375 if (data == NULL) | |
| 376 return; | |
| 377 | |
| 378 if (!data->in_list) | |
| 379 return; | |
| 380 | |
| 15822 | 381 if ((purple_xfer_get_status(xfer) == PURPLE_XFER_STATUS_CANCEL_LOCAL) && (xfer_dialog->auto_clear)) { |
| 15817 | 382 finch_xfer_dialog_remove_xfer(xfer); |
| 383 return; | |
| 384 } | |
| 385 | |
| 386 update_title_progress(); | |
| 387 | |
| 15822 | 388 if (purple_xfer_is_canceled(xfer)) |
|
30432
1cdae196aac8
Standardize on "cancelled".
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
30430
diff
changeset
|
389 status = _("Cancelled"); |
| 15817 | 390 else |
| 391 status = _("Failed"); | |
| 392 | |
| 393 gnt_tree_change_text(GNT_TREE(xfer_dialog->tree), xfer, COLUMN_STATUS, status); | |
| 394 } | |
| 395 | |
| 396 void | |
| 15822 | 397 finch_xfer_dialog_update_xfer(PurpleXfer *xfer) |
| 15817 | 398 { |
| 15822 | 399 PurpleGntXferUiData *data; |
| 15817 | 400 char *size_str, *remaining_str; |
| 401 time_t current_time; | |
| 402 char prog_str[5]; | |
|
30430
351d07aefb09
Kill off many dead assignments and any useless remaining variables.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
28770
diff
changeset
|
403 double kb_sent; |
| 15817 | 404 double kbps = 0.0; |
| 405 time_t elapsed, now; | |
| 406 char *kbsec; | |
|
22633
bcc355f38ba4
Show better status text for file transfers.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22217
diff
changeset
|
407 gboolean send; |
| 15817 | 408 |
|
22216
b99d6d21cd79
Add accessor and update finch to not touch the internals of PurpleXfer.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22049
diff
changeset
|
409 if ((now = purple_xfer_get_end_time(xfer)) == 0) |
| 15817 | 410 now = time(NULL); |
| 411 | |
| 15822 | 412 kb_sent = purple_xfer_get_bytes_sent(xfer) / 1024.0; |
|
22216
b99d6d21cd79
Add accessor and update finch to not touch the internals of PurpleXfer.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22049
diff
changeset
|
413 elapsed = (purple_xfer_get_start_time(xfer) > 0 ? now - purple_xfer_get_start_time(xfer) : 0); |
| 15817 | 414 kbps = (elapsed > 0 ? (kb_sent / elapsed) : 0); |
| 415 | |
| 416 g_return_if_fail(xfer_dialog != NULL); | |
| 417 g_return_if_fail(xfer != NULL); | |
| 418 | |
| 15822 | 419 if ((data = FINCHXFER(xfer)) == NULL) |
| 15817 | 420 return; |
| 421 | |
|
22049
3f7e58ae1305
Don't print 'file transfer complete' message more than once for the same xfer.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22048
diff
changeset
|
422 if (data->in_list == FALSE || data->notified) |
| 15817 | 423 return; |
| 424 | |
| 425 current_time = time(NULL); | |
| 426 if (((current_time - data->last_updated_time) == 0) && | |
| 15822 | 427 (!purple_xfer_is_completed(xfer))) { |
| 15817 | 428 /* Don't update the window more than once per second */ |
| 429 return; | |
| 430 } | |
| 431 data->last_updated_time = current_time; | |
| 432 | |
|
22633
bcc355f38ba4
Show better status text for file transfers.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22217
diff
changeset
|
433 send = (purple_xfer_get_type(xfer) == PURPLE_XFER_SEND); |
| 15822 | 434 size_str = purple_str_size_to_units(purple_xfer_get_size(xfer)); |
| 435 remaining_str = purple_str_size_to_units(purple_xfer_get_bytes_remaining(xfer)); | |
|
18129
16f3919b78f5
Use the IEC binary units to match our math.
Richard Laager <rlaager@wiktel.com>
parents:
18118
diff
changeset
|
436 kbsec = g_strdup_printf(_("%.2f KiB/s"), kbps); |
| 15817 | 437 |
| 438 gnt_tree_change_text(GNT_TREE(xfer_dialog->tree), xfer, COLUMN_PROGRESS, | |
| 15822 | 439 g_ascii_dtostr(prog_str, sizeof(prog_str), purple_xfer_get_progress(xfer) * 100.)); |
| 15817 | 440 gnt_tree_change_text(GNT_TREE(xfer_dialog->tree), xfer, COLUMN_SIZE, size_str); |
| 441 gnt_tree_change_text(GNT_TREE(xfer_dialog->tree), xfer, COLUMN_REMAINING, remaining_str); | |
| 442 gnt_tree_change_text(GNT_TREE(xfer_dialog->tree), xfer, COLUMN_SPEED, kbsec); | |
| 443 g_free(size_str); | |
| 444 g_free(remaining_str); | |
| 15964 | 445 g_free(kbsec); |
| 15822 | 446 if (purple_xfer_is_completed(xfer)) { |
|
22633
bcc355f38ba4
Show better status text for file transfers.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22217
diff
changeset
|
447 gnt_tree_change_text(GNT_TREE(xfer_dialog->tree), xfer, COLUMN_STATUS, send ? _("Sent") : _("Received")); |
|
15942
ee397e53d9ce
allow cancellation of transfers waiting to be accepted
Richard Nelson <wabz@pidgin.im>
parents:
15870
diff
changeset
|
448 gnt_tree_change_text(GNT_TREE(xfer_dialog->tree), xfer, COLUMN_REMAINING, _("Finished")); |
|
22633
bcc355f38ba4
Show better status text for file transfers.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22217
diff
changeset
|
449 if (!send) { |
|
bcc355f38ba4
Show better status text for file transfers.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22217
diff
changeset
|
450 char *msg = g_strdup_printf(_("The file was saved as %s."), purple_xfer_get_local_filename(xfer)); |
|
bcc355f38ba4
Show better status text for file transfers.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22217
diff
changeset
|
451 purple_xfer_conversation_write(xfer, msg, FALSE); |
|
bcc355f38ba4
Show better status text for file transfers.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22217
diff
changeset
|
452 g_free(msg); |
|
bcc355f38ba4
Show better status text for file transfers.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22217
diff
changeset
|
453 } |
|
22049
3f7e58ae1305
Don't print 'file transfer complete' message more than once for the same xfer.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22048
diff
changeset
|
454 data->notified = TRUE; |
| 15817 | 455 } else { |
|
22633
bcc355f38ba4
Show better status text for file transfers.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22217
diff
changeset
|
456 gnt_tree_change_text(GNT_TREE(xfer_dialog->tree), xfer, COLUMN_STATUS, |
|
bcc355f38ba4
Show better status text for file transfers.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22217
diff
changeset
|
457 send ? _("Sending") : _("Receiving")); |
| 15817 | 458 } |
| 459 | |
| 460 update_title_progress(); | |
| 461 | |
| 15822 | 462 if (purple_xfer_is_completed(xfer) && xfer_dialog->auto_clear) |
| 15817 | 463 finch_xfer_dialog_remove_xfer(xfer); |
| 464 } | |
| 465 | |
| 466 /************************************************************************** | |
| 467 * File Transfer UI Ops | |
| 468 **************************************************************************/ | |
| 469 static void | |
| 15822 | 470 finch_xfer_new_xfer(PurpleXfer *xfer) |
| 15817 | 471 { |
| 15822 | 472 PurpleGntXferUiData *data; |
| 15817 | 473 |
| 474 /* This is where we're setting xfer->ui_data for the first time. */ | |
| 15822 | 475 data = g_new0(PurpleGntXferUiData, 1); |
|
22217
ad357ca94de9
We will probably eventually use purple_object_[get|set]_ui_data. Until then, this will do.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22216
diff
changeset
|
476 FINCH_SET_DATA(xfer, data); |
| 15817 | 477 } |
| 478 | |
| 479 static void | |
| 15822 | 480 finch_xfer_destroy(PurpleXfer *xfer) |
| 15817 | 481 { |
| 15822 | 482 PurpleGntXferUiData *data; |
| 15817 | 483 |
| 15822 | 484 data = FINCHXFER(xfer); |
| 15817 | 485 if (data) { |
| 486 g_free(data->name); | |
| 487 g_free(data); | |
|
22217
ad357ca94de9
We will probably eventually use purple_object_[get|set]_ui_data. Until then, this will do.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22216
diff
changeset
|
488 FINCH_SET_DATA(xfer, NULL); |
| 15817 | 489 } |
| 490 } | |
| 491 | |
| 492 static void | |
| 15822 | 493 finch_xfer_add_xfer(PurpleXfer *xfer) |
| 15817 | 494 { |
| 495 if (!xfer_dialog) | |
| 496 finch_xfer_dialog_new(); | |
| 497 | |
| 498 finch_xfer_dialog_add_xfer(xfer); | |
| 499 gnt_tree_set_selected(GNT_TREE(xfer_dialog->tree), xfer); | |
| 500 } | |
| 501 | |
| 502 static void | |
| 15822 | 503 finch_xfer_update_progress(PurpleXfer *xfer, double percent) |
| 15817 | 504 { |
| 505 if (xfer_dialog) | |
| 506 finch_xfer_dialog_update_xfer(xfer); | |
| 507 } | |
| 508 | |
| 509 static void | |
| 15822 | 510 finch_xfer_cancel_local(PurpleXfer *xfer) |
| 15817 | 511 { |
| 512 if (xfer_dialog) | |
| 513 finch_xfer_dialog_cancel_xfer(xfer); | |
| 514 } | |
| 515 | |
| 516 static void | |
| 15822 | 517 finch_xfer_cancel_remote(PurpleXfer *xfer) |
| 15817 | 518 { |
| 519 if (xfer_dialog) | |
| 520 finch_xfer_dialog_cancel_xfer(xfer); | |
| 521 } | |
| 522 | |
| 15822 | 523 static PurpleXferUiOps ops = |
| 15817 | 524 { |
| 525 finch_xfer_new_xfer, | |
| 526 finch_xfer_destroy, | |
| 527 finch_xfer_add_xfer, | |
| 528 finch_xfer_update_progress, | |
| 529 finch_xfer_cancel_local, | |
|
16669
30829e806dae
And finch is up to date
Gary Kramlich <grim@reaperworld.com>
parents:
16424
diff
changeset
|
530 finch_xfer_cancel_remote, |
|
30829e806dae
And finch is up to date
Gary Kramlich <grim@reaperworld.com>
parents:
16424
diff
changeset
|
531 |
|
30829e806dae
And finch is up to date
Gary Kramlich <grim@reaperworld.com>
parents:
16424
diff
changeset
|
532 /* padding */ |
|
30829e806dae
And finch is up to date
Gary Kramlich <grim@reaperworld.com>
parents:
16424
diff
changeset
|
533 NULL, |
|
30829e806dae
And finch is up to date
Gary Kramlich <grim@reaperworld.com>
parents:
16424
diff
changeset
|
534 NULL, |
|
30829e806dae
And finch is up to date
Gary Kramlich <grim@reaperworld.com>
parents:
16424
diff
changeset
|
535 NULL, |
|
30829e806dae
And finch is up to date
Gary Kramlich <grim@reaperworld.com>
parents:
16424
diff
changeset
|
536 NULL |
| 15817 | 537 }; |
| 538 | |
| 539 /************************************************************************** | |
| 540 * GNT File Transfer API | |
| 541 **************************************************************************/ | |
| 542 void | |
| 543 finch_xfers_init(void) | |
| 544 { | |
|
16424
4999bbc52881
Works for me! Renames prefs: /core to /purple, /gaim/gtk to /pidgin, /gaim/gnt to /finch
Sean Egan <seanegan@gmail.com>
parents:
16194
diff
changeset
|
545 purple_prefs_add_none("/finch/filetransfer"); |
|
4999bbc52881
Works for me! Renames prefs: /core to /purple, /gaim/gtk to /pidgin, /gaim/gnt to /finch
Sean Egan <seanegan@gmail.com>
parents:
16194
diff
changeset
|
546 purple_prefs_add_bool("/finch/filetransfer/clear_finished", TRUE); |
|
4999bbc52881
Works for me! Renames prefs: /core to /purple, /gaim/gtk to /pidgin, /gaim/gnt to /finch
Sean Egan <seanegan@gmail.com>
parents:
16194
diff
changeset
|
547 purple_prefs_add_bool("/finch/filetransfer/keep_open", FALSE); |
| 15817 | 548 } |
| 549 | |
| 550 void | |
| 551 finch_xfers_uninit(void) | |
| 552 { | |
| 553 if (xfer_dialog != NULL) | |
| 554 finch_xfer_dialog_destroy(); | |
| 555 } | |
| 556 | |
| 15822 | 557 PurpleXferUiOps * |
| 15817 | 558 finch_xfers_get_ui_ops(void) |
| 559 { | |
| 560 return &ops; | |
| 561 } |
