Mercurial > pidgin
annotate finch/gntft.c @ 32774:069919a0896c
Validate utf8 for a few random strings that we read, in case AOL or ICQ
decide to start sending us non-utf8
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Thu, 03 May 2012 09:28:11 +0000 |
parents | 48bc3f9f2115 |
children |
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 | |
45 typedef struct | |
46 { | |
47 gboolean keep_open; | |
48 gboolean auto_clear; | |
49 gint num_transfers; | |
50 | |
51 GntWidget *window; | |
52 GntWidget *tree; | |
53 | |
54 GntWidget *remove_button; | |
55 GntWidget *stop_button; | |
56 GntWidget *close_button; | |
15822 | 57 } PurpleGntXferDialog; |
15817 | 58 |
15822 | 59 static PurpleGntXferDialog *xfer_dialog = NULL; |
15817 | 60 |
61 typedef struct | |
62 { | |
63 time_t last_updated_time; | |
64 gboolean in_list; | |
65 | |
66 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
|
67 gboolean notified; /* Has the completion of the transfer been notified? */ |
15817 | 68 |
15822 | 69 } PurpleGntXferUiData; |
15817 | 70 |
71 enum | |
72 { | |
73 COLUMN_PROGRESS = 0, | |
74 COLUMN_FILENAME, | |
75 COLUMN_SIZE, | |
76 COLUMN_SPEED, | |
77 COLUMN_REMAINING, | |
78 COLUMN_STATUS, | |
79 NUM_COLUMNS | |
80 }; | |
81 | |
82 | |
83 /************************************************************************** | |
84 * Utility Functions | |
85 **************************************************************************/ | |
86 | |
87 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
|
88 update_title_progress(void) |
15817 | 89 { |
18118
ab6d2763b8d8
Re-fix the DBus list handling code by killing const GList* / const GSList*
Richard Laager <rlaager@wiktel.com>
parents:
16669
diff
changeset
|
90 GList *list; |
15817 | 91 int num_active_xfers = 0; |
92 guint64 total_bytes_xferred = 0; | |
93 guint64 total_file_size = 0; | |
94 | |
95 if (xfer_dialog == NULL || xfer_dialog->window == NULL) | |
96 return; | |
97 | |
98 /* Find all active transfers */ | |
99 for (list = gnt_tree_get_rows(GNT_TREE(xfer_dialog->tree)); list; list = list->next) { | |
15822 | 100 PurpleXfer *xfer = (PurpleXfer *)list->data; |
15817 | 101 |
15822 | 102 if (purple_xfer_get_status(xfer) == PURPLE_XFER_STATUS_STARTED) { |
15817 | 103 num_active_xfers++; |
15822 | 104 total_bytes_xferred += purple_xfer_get_bytes_sent(xfer); |
105 total_file_size += purple_xfer_get_size(xfer); | |
15817 | 106 } |
107 } | |
108 | |
109 /* Update the title */ | |
110 if (num_active_xfers > 0) { | |
111 gchar *title; | |
112 int total_pct = 0; | |
113 | |
114 if (total_file_size > 0) { | |
115 total_pct = 100 * total_bytes_xferred / total_file_size; | |
116 } | |
117 | |
23332
19ab21882b38
"This patch pluralizes a few strings that should be pluralized for
Laurynas Biveinis <laurynas.biveinis@gmail.com>
parents:
22633
diff
changeset
|
118 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
|
119 "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
|
120 num_active_xfers), |
15817 | 121 total_pct, num_active_xfers); |
122 gnt_screen_rename_widget((xfer_dialog->window), title); | |
123 g_free(title); | |
124 } else { | |
125 gnt_screen_rename_widget((xfer_dialog->window), _("File Transfers")); | |
126 } | |
127 } | |
128 | |
129 | |
130 /************************************************************************** | |
131 * Callbacks | |
132 **************************************************************************/ | |
133 static void | |
134 toggle_keep_open_cb(GntWidget *w) | |
135 { | |
136 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
|
137 purple_prefs_set_bool("/finch/filetransfer/keep_open", |
15817 | 138 xfer_dialog->keep_open); |
139 } | |
140 | |
141 static void | |
142 toggle_clear_finished_cb(GntWidget *w) | |
143 { | |
144 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
|
145 purple_prefs_set_bool("/finch/filetransfer/clear_finished", |
15817 | 146 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
|
147 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
|
148 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
|
149 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
|
150 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
|
151 iter = iter->next; |
32228
48bc3f9f2115
purple_xfer_is_canceled() renamed to purple_xfer_is_cancelled()
andrew.victor@mxit.com
parents:
31970
diff
changeset
|
152 if (purple_xfer_is_completed(xfer) || purple_xfer_is_cancelled(xfer)) |
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
|
153 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
|
154 } |
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 } |
15817 | 156 } |
157 | |
158 static void | |
159 remove_button_cb(GntButton *button) | |
160 { | |
15822 | 161 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
|
162 if (selected_xfer && (purple_xfer_is_completed(selected_xfer) || |
32228
48bc3f9f2115
purple_xfer_is_canceled() renamed to purple_xfer_is_cancelled()
andrew.victor@mxit.com
parents:
31970
diff
changeset
|
163 purple_xfer_is_cancelled(selected_xfer))) { |
15817 | 164 finch_xfer_dialog_remove_xfer(selected_xfer); |
165 } | |
166 } | |
167 | |
168 static void | |
169 stop_button_cb(GntButton *button) | |
170 { | |
15822 | 171 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
|
172 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
|
173 |
b99d6d21cd79
Add accessor and update finch to not touch the internals of PurpleXfer.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22049
diff
changeset
|
174 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
|
175 return; |
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 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
|
178 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
|
179 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
|
180 status != PURPLE_XFER_STATUS_DONE) |
15822 | 181 purple_xfer_cancel_local(selected_xfer); |
15817 | 182 } |
183 | |
184 /************************************************************************** | |
185 * Dialog Building Functions | |
186 **************************************************************************/ | |
187 | |
188 | |
189 void | |
190 finch_xfer_dialog_new(void) | |
191 { | |
18118
ab6d2763b8d8
Re-fix the DBus list handling code by killing const GList* / const GSList*
Richard Laager <rlaager@wiktel.com>
parents:
16669
diff
changeset
|
192 GList *iter; |
15817 | 193 GntWidget *window; |
194 GntWidget *bbox; | |
195 GntWidget *button; | |
196 GntWidget *checkbox; | |
197 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
|
198 int widths[] = {8, 12, 8, 8, 8, 8, -1}; |
15817 | 199 |
200 if (!xfer_dialog) | |
15822 | 201 xfer_dialog = g_new0(PurpleGntXferDialog, 1); |
15817 | 202 |
203 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
|
204 purple_prefs_get_bool("/finch/filetransfer/keep_open"); |
15817 | 205 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
|
206 purple_prefs_get_bool("/finch/filetransfer/clear_finished"); |
15817 | 207 |
208 /* Create the window. */ | |
209 xfer_dialog->window = window = gnt_vbox_new(FALSE); | |
210 g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(finch_xfer_dialog_destroy), NULL); | |
211 gnt_box_set_toplevel(GNT_BOX(window), TRUE); | |
212 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
|
213 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
|
214 gnt_box_set_alignment(GNT_BOX(window), GNT_ALIGN_MID); |
15817 | 215 |
216 xfer_dialog->tree = tree = gnt_tree_new_with_columns(NUM_COLUMNS); | |
217 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
|
218 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
|
219 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
|
220 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
|
221 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
|
222 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
|
223 gnt_widget_set_size(tree, 70, -1); |
15817 | 224 gnt_tree_set_show_title(GNT_TREE(tree), TRUE); |
225 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
|
226 |
15817 | 227 checkbox = gnt_check_box_new( _("Close this window when all transfers finish")); |
228 gnt_check_box_set_checked(GNT_CHECK_BOX(checkbox), | |
229 !xfer_dialog->keep_open); | |
230 g_signal_connect(G_OBJECT(checkbox), "toggled", | |
231 G_CALLBACK(toggle_keep_open_cb), NULL); | |
232 gnt_box_add_widget(GNT_BOX(window), checkbox); | |
233 | |
234 checkbox = gnt_check_box_new(_("Clear finished transfers")); | |
235 gnt_check_box_set_checked(GNT_CHECK_BOX(checkbox), | |
236 xfer_dialog->auto_clear); | |
237 g_signal_connect(G_OBJECT(checkbox), "toggled", | |
238 G_CALLBACK(toggle_clear_finished_cb), NULL); | |
239 gnt_box_add_widget(GNT_BOX(window), checkbox); | |
240 | |
19374
d65ce3df5be2
Make some of the dialogs look and behave more like each other.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18404
diff
changeset
|
241 bbox = gnt_hbox_new(FALSE); |
15817 | 242 |
243 xfer_dialog->remove_button = button = gnt_button_new(_("Remove")); | |
244 g_signal_connect(G_OBJECT(button), "activate", | |
245 G_CALLBACK(remove_button_cb), NULL); | |
246 gnt_box_add_widget(GNT_BOX(bbox), button); | |
247 | |
248 xfer_dialog->stop_button = button = gnt_button_new(_("Stop")); | |
249 g_signal_connect(G_OBJECT(button), "activate", | |
250 G_CALLBACK(stop_button_cb), NULL); | |
251 gnt_box_add_widget(GNT_BOX(bbox), button); | |
252 | |
253 xfer_dialog->close_button = button = gnt_button_new(_("Close")); | |
254 g_signal_connect(G_OBJECT(button), "activate", | |
255 G_CALLBACK(finch_xfer_dialog_destroy), NULL); | |
256 gnt_box_add_widget(GNT_BOX(bbox), button); | |
257 | |
258 gnt_box_add_widget(GNT_BOX(window), bbox); | |
259 | |
15822 | 260 for (iter = purple_xfers_get_all(); iter; iter = iter->next) { |
261 PurpleXfer *xfer = (PurpleXfer *)iter->data; | |
31970
e893296d853b
Convert Finch to use the new accessor functions.
andrew.victor@mxit.com
parents:
31086
diff
changeset
|
262 PurpleGntXferUiData *data = purple_xfer_get_ui_data(xfer); |
15817 | 263 if (data->in_list) { |
264 finch_xfer_dialog_add_xfer(xfer); | |
265 finch_xfer_dialog_update_xfer(xfer); | |
266 gnt_tree_set_selected(GNT_TREE(tree), xfer); | |
267 } | |
268 } | |
269 gnt_widget_show(xfer_dialog->window); | |
270 } | |
271 | |
272 void | |
273 finch_xfer_dialog_destroy() | |
274 { | |
275 gnt_widget_destroy(xfer_dialog->window); | |
276 g_free(xfer_dialog); | |
277 xfer_dialog = NULL; | |
278 } | |
279 | |
280 void | |
281 finch_xfer_dialog_show() | |
282 { | |
283 if (xfer_dialog == NULL) | |
284 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
|
285 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
|
286 gnt_window_present(xfer_dialog->window); |
15817 | 287 } |
288 | |
289 void | |
15822 | 290 finch_xfer_dialog_add_xfer(PurpleXfer *xfer) |
15817 | 291 { |
15822 | 292 PurpleGntXferUiData *data; |
293 PurpleXferType type; | |
15817 | 294 char *size_str, *remaining_str; |
295 char *lfilename, *utf8; | |
296 | |
297 g_return_if_fail(xfer_dialog != NULL); | |
298 g_return_if_fail(xfer != NULL); | |
299 | |
15822 | 300 purple_xfer_ref(xfer); |
15817 | 301 |
31970
e893296d853b
Convert Finch to use the new accessor functions.
andrew.victor@mxit.com
parents:
31086
diff
changeset
|
302 data = purple_xfer_get_ui_data(xfer); |
15817 | 303 data->in_list = TRUE; |
304 | |
305 finch_xfer_dialog_show(); | |
306 | |
307 data->last_updated_time = 0; | |
308 | |
15822 | 309 type = purple_xfer_get_type(xfer); |
15817 | 310 |
15822 | 311 size_str = purple_str_size_to_units(purple_xfer_get_size(xfer)); |
312 remaining_str = purple_str_size_to_units(purple_xfer_get_bytes_remaining(xfer)); | |
15817 | 313 |
15822 | 314 lfilename = g_path_get_basename(purple_xfer_get_local_filename(xfer)); |
15817 | 315 utf8 = g_filename_to_utf8(lfilename, -1, NULL, NULL, NULL); |
316 g_free(lfilename); | |
317 lfilename = utf8; | |
318 gnt_tree_add_row_last(GNT_TREE(xfer_dialog->tree), xfer, | |
319 gnt_tree_create_row(GNT_TREE(xfer_dialog->tree), | |
15822 | 320 "0.0", (type == PURPLE_XFER_RECEIVE) ? purple_xfer_get_filename(xfer) : lfilename, |
15817 | 321 size_str, "0.0", "",_("Waiting for transfer to begin")), NULL); |
322 g_free(lfilename); | |
323 | |
324 g_free(size_str); | |
325 g_free(remaining_str); | |
326 | |
327 xfer_dialog->num_transfers++; | |
328 | |
329 update_title_progress(); | |
330 } | |
331 | |
332 void | |
15822 | 333 finch_xfer_dialog_remove_xfer(PurpleXfer *xfer) |
15817 | 334 { |
15822 | 335 PurpleGntXferUiData *data; |
15817 | 336 |
337 g_return_if_fail(xfer_dialog != NULL); | |
338 g_return_if_fail(xfer != NULL); | |
339 | |
31970
e893296d853b
Convert Finch to use the new accessor functions.
andrew.victor@mxit.com
parents:
31086
diff
changeset
|
340 data = purple_xfer_get_ui_data(xfer); |
15817 | 341 |
342 if (data == NULL) | |
343 return; | |
344 | |
345 if (!data->in_list) | |
346 return; | |
347 | |
348 data->in_list = FALSE; | |
349 | |
350 gnt_tree_remove(GNT_TREE(xfer_dialog->tree), xfer); | |
351 | |
352 xfer_dialog->num_transfers--; | |
353 | |
354 if (xfer_dialog->num_transfers == 0 && !xfer_dialog->keep_open) | |
355 finch_xfer_dialog_destroy(); | |
31086
a8cc50c2279f
Remove trailing whitespace
Richard Laager <rlaager@wiktel.com>
parents:
30432
diff
changeset
|
356 else |
15817 | 357 update_title_progress(); |
15822 | 358 purple_xfer_unref(xfer); |
15817 | 359 } |
360 | |
361 void | |
15822 | 362 finch_xfer_dialog_cancel_xfer(PurpleXfer *xfer) |
15817 | 363 { |
15822 | 364 PurpleGntXferUiData *data; |
15817 | 365 const gchar *status; |
366 | |
367 g_return_if_fail(xfer_dialog != NULL); | |
368 g_return_if_fail(xfer != NULL); | |
369 | |
31970
e893296d853b
Convert Finch to use the new accessor functions.
andrew.victor@mxit.com
parents:
31086
diff
changeset
|
370 data = purple_xfer_get_ui_data(xfer); |
15817 | 371 |
372 if (data == NULL) | |
373 return; | |
374 | |
375 if (!data->in_list) | |
376 return; | |
377 | |
15822 | 378 if ((purple_xfer_get_status(xfer) == PURPLE_XFER_STATUS_CANCEL_LOCAL) && (xfer_dialog->auto_clear)) { |
15817 | 379 finch_xfer_dialog_remove_xfer(xfer); |
380 return; | |
381 } | |
382 | |
383 update_title_progress(); | |
384 | |
32228
48bc3f9f2115
purple_xfer_is_canceled() renamed to purple_xfer_is_cancelled()
andrew.victor@mxit.com
parents:
31970
diff
changeset
|
385 if (purple_xfer_is_cancelled(xfer)) |
30432
1cdae196aac8
Standardize on "cancelled".
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
30430
diff
changeset
|
386 status = _("Cancelled"); |
15817 | 387 else |
388 status = _("Failed"); | |
389 | |
390 gnt_tree_change_text(GNT_TREE(xfer_dialog->tree), xfer, COLUMN_STATUS, status); | |
391 } | |
392 | |
393 void | |
15822 | 394 finch_xfer_dialog_update_xfer(PurpleXfer *xfer) |
15817 | 395 { |
15822 | 396 PurpleGntXferUiData *data; |
15817 | 397 char *size_str, *remaining_str; |
398 time_t current_time; | |
399 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
|
400 double kb_sent; |
15817 | 401 double kbps = 0.0; |
402 time_t elapsed, now; | |
403 char *kbsec; | |
22633
bcc355f38ba4
Show better status text for file transfers.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22217
diff
changeset
|
404 gboolean send; |
15817 | 405 |
22216
b99d6d21cd79
Add accessor and update finch to not touch the internals of PurpleXfer.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22049
diff
changeset
|
406 if ((now = purple_xfer_get_end_time(xfer)) == 0) |
15817 | 407 now = time(NULL); |
408 | |
15822 | 409 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
|
410 elapsed = (purple_xfer_get_start_time(xfer) > 0 ? now - purple_xfer_get_start_time(xfer) : 0); |
15817 | 411 kbps = (elapsed > 0 ? (kb_sent / elapsed) : 0); |
412 | |
413 g_return_if_fail(xfer_dialog != NULL); | |
414 g_return_if_fail(xfer != NULL); | |
415 | |
31970
e893296d853b
Convert Finch to use the new accessor functions.
andrew.victor@mxit.com
parents:
31086
diff
changeset
|
416 if ((data = purple_xfer_get_ui_data(xfer)) == NULL) |
15817 | 417 return; |
418 | |
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
|
419 if (data->in_list == FALSE || data->notified) |
15817 | 420 return; |
421 | |
422 current_time = time(NULL); | |
423 if (((current_time - data->last_updated_time) == 0) && | |
15822 | 424 (!purple_xfer_is_completed(xfer))) { |
15817 | 425 /* Don't update the window more than once per second */ |
426 return; | |
427 } | |
428 data->last_updated_time = current_time; | |
429 | |
22633
bcc355f38ba4
Show better status text for file transfers.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22217
diff
changeset
|
430 send = (purple_xfer_get_type(xfer) == PURPLE_XFER_SEND); |
15822 | 431 size_str = purple_str_size_to_units(purple_xfer_get_size(xfer)); |
432 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
|
433 kbsec = g_strdup_printf(_("%.2f KiB/s"), kbps); |
15817 | 434 |
435 gnt_tree_change_text(GNT_TREE(xfer_dialog->tree), xfer, COLUMN_PROGRESS, | |
15822 | 436 g_ascii_dtostr(prog_str, sizeof(prog_str), purple_xfer_get_progress(xfer) * 100.)); |
15817 | 437 gnt_tree_change_text(GNT_TREE(xfer_dialog->tree), xfer, COLUMN_SIZE, size_str); |
438 gnt_tree_change_text(GNT_TREE(xfer_dialog->tree), xfer, COLUMN_REMAINING, remaining_str); | |
439 gnt_tree_change_text(GNT_TREE(xfer_dialog->tree), xfer, COLUMN_SPEED, kbsec); | |
440 g_free(size_str); | |
441 g_free(remaining_str); | |
15964 | 442 g_free(kbsec); |
15822 | 443 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
|
444 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
|
445 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
|
446 if (!send) { |
bcc355f38ba4
Show better status text for file transfers.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22217
diff
changeset
|
447 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
|
448 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
|
449 g_free(msg); |
bcc355f38ba4
Show better status text for file transfers.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22217
diff
changeset
|
450 } |
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
|
451 data->notified = TRUE; |
15817 | 452 } else { |
22633
bcc355f38ba4
Show better status text for file transfers.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22217
diff
changeset
|
453 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
|
454 send ? _("Sending") : _("Receiving")); |
15817 | 455 } |
456 | |
457 update_title_progress(); | |
458 | |
15822 | 459 if (purple_xfer_is_completed(xfer) && xfer_dialog->auto_clear) |
15817 | 460 finch_xfer_dialog_remove_xfer(xfer); |
461 } | |
462 | |
463 /************************************************************************** | |
464 * File Transfer UI Ops | |
465 **************************************************************************/ | |
466 static void | |
15822 | 467 finch_xfer_new_xfer(PurpleXfer *xfer) |
15817 | 468 { |
15822 | 469 PurpleGntXferUiData *data; |
15817 | 470 |
31970
e893296d853b
Convert Finch to use the new accessor functions.
andrew.victor@mxit.com
parents:
31086
diff
changeset
|
471 /* This is where we're setting xfer's "ui_data" for the first time. */ |
15822 | 472 data = g_new0(PurpleGntXferUiData, 1); |
31970
e893296d853b
Convert Finch to use the new accessor functions.
andrew.victor@mxit.com
parents:
31086
diff
changeset
|
473 purple_xfer_set_ui_data(xfer, data); |
15817 | 474 } |
475 | |
476 static void | |
15822 | 477 finch_xfer_destroy(PurpleXfer *xfer) |
15817 | 478 { |
15822 | 479 PurpleGntXferUiData *data; |
15817 | 480 |
31970
e893296d853b
Convert Finch to use the new accessor functions.
andrew.victor@mxit.com
parents:
31086
diff
changeset
|
481 data = purple_xfer_get_ui_data(xfer); |
15817 | 482 if (data) { |
483 g_free(data->name); | |
484 g_free(data); | |
31970
e893296d853b
Convert Finch to use the new accessor functions.
andrew.victor@mxit.com
parents:
31086
diff
changeset
|
485 purple_xfer_set_ui_data(xfer, NULL); |
15817 | 486 } |
487 } | |
488 | |
489 static void | |
15822 | 490 finch_xfer_add_xfer(PurpleXfer *xfer) |
15817 | 491 { |
492 if (!xfer_dialog) | |
493 finch_xfer_dialog_new(); | |
494 | |
495 finch_xfer_dialog_add_xfer(xfer); | |
496 gnt_tree_set_selected(GNT_TREE(xfer_dialog->tree), xfer); | |
497 } | |
498 | |
499 static void | |
15822 | 500 finch_xfer_update_progress(PurpleXfer *xfer, double percent) |
15817 | 501 { |
502 if (xfer_dialog) | |
503 finch_xfer_dialog_update_xfer(xfer); | |
504 } | |
505 | |
506 static void | |
15822 | 507 finch_xfer_cancel_local(PurpleXfer *xfer) |
15817 | 508 { |
509 if (xfer_dialog) | |
510 finch_xfer_dialog_cancel_xfer(xfer); | |
511 } | |
512 | |
513 static void | |
15822 | 514 finch_xfer_cancel_remote(PurpleXfer *xfer) |
15817 | 515 { |
516 if (xfer_dialog) | |
517 finch_xfer_dialog_cancel_xfer(xfer); | |
518 } | |
519 | |
15822 | 520 static PurpleXferUiOps ops = |
15817 | 521 { |
522 finch_xfer_new_xfer, | |
523 finch_xfer_destroy, | |
524 finch_xfer_add_xfer, | |
525 finch_xfer_update_progress, | |
526 finch_xfer_cancel_local, | |
16669
30829e806dae
And finch is up to date
Gary Kramlich <grim@reaperworld.com>
parents:
16424
diff
changeset
|
527 finch_xfer_cancel_remote, |
30829e806dae
And finch is up to date
Gary Kramlich <grim@reaperworld.com>
parents:
16424
diff
changeset
|
528 |
30829e806dae
And finch is up to date
Gary Kramlich <grim@reaperworld.com>
parents:
16424
diff
changeset
|
529 /* padding */ |
30829e806dae
And finch is up to date
Gary Kramlich <grim@reaperworld.com>
parents:
16424
diff
changeset
|
530 NULL, |
30829e806dae
And finch is up to date
Gary Kramlich <grim@reaperworld.com>
parents:
16424
diff
changeset
|
531 NULL, |
30829e806dae
And finch is up to date
Gary Kramlich <grim@reaperworld.com>
parents:
16424
diff
changeset
|
532 NULL, |
30829e806dae
And finch is up to date
Gary Kramlich <grim@reaperworld.com>
parents:
16424
diff
changeset
|
533 NULL |
15817 | 534 }; |
535 | |
536 /************************************************************************** | |
537 * GNT File Transfer API | |
538 **************************************************************************/ | |
539 void | |
540 finch_xfers_init(void) | |
541 { | |
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
|
542 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
|
543 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
|
544 purple_prefs_add_bool("/finch/filetransfer/keep_open", FALSE); |
15817 | 545 } |
546 | |
547 void | |
548 finch_xfers_uninit(void) | |
549 { | |
550 if (xfer_dialog != NULL) | |
551 finch_xfer_dialog_destroy(); | |
552 } | |
553 | |
15822 | 554 PurpleXferUiOps * |
15817 | 555 finch_xfers_get_ui_ops(void) |
556 { | |
557 return &ops; | |
558 } |