Mercurial > pidgin
annotate finch/gntft.c @ 31167:060739bdc84d
Suppress msgfmt errors by removing c-format markers
This is unfortunate, but it's the best that I could come up with. The
translator, Khaled Hosny, informed me that C does not allow you to skip
positional format string arguments, and printf(3) on my system agrees.
It does work on glibc, but I'm not sure if gettext guarantees this. It
does make other guarantees about the printf implementation above those
from C, but this involves replacing the printf function if the native one
doesn't provide it. So, even assuming that gettext's printf allows this
like glibc's does, gettext may not replace the printf function if the
native C printf provides positional arguments but does not allow skipping
them.
Finally, intltool-update does not seem to put the c-format marker back,
which actually surprised me. So we'll see how this goes long-term.
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Wed, 26 Jan 2011 18:48:19 +0000 |
parents | a8cc50c2279f |
children | e893296d853b 3828a61c44da |
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(); | |
31086
a8cc50c2279f
Remove trailing whitespace
Richard Laager <rlaager@wiktel.com>
parents:
30432
diff
changeset
|
359 else |
15817 | 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 } |