| 35 #include "gtkft.h" |
35 #include "gtkft.h" |
| 36 #include "prefs.h" |
36 #include "prefs.h" |
| 37 #include "pidginstock.h" |
37 #include "pidginstock.h" |
| 38 #include "gtkutils.h" |
38 #include "gtkutils.h" |
| 39 |
39 |
| 40 #define PIDGINXFER(xfer) \ |
|
| 41 (PidginXferUiData *)(xfer)->ui_data |
|
| 42 |
|
| 43 /* the maximum size of files we will try to make a thumbnail for */ |
40 /* the maximum size of files we will try to make a thumbnail for */ |
| 44 #define PIDGIN_XFER_MAX_SIZE_IMAGE_THUMBNAIL 10 * 1024 * 1024 |
41 #define PIDGIN_XFER_MAX_SIZE_IMAGE_THUMBNAIL 10 * 1024 * 1024 |
| 45 |
42 |
| 46 struct _PidginXferDialog |
43 struct _PidginXferDialog |
| 47 { |
44 { |
| 114 { |
111 { |
| 115 double kb_sent, kb_rem; |
112 double kb_sent, kb_rem; |
| 116 double kbps = 0.0; |
113 double kbps = 0.0; |
| 117 time_t elapsed, now; |
114 time_t elapsed, now; |
| 118 |
115 |
| 119 if (xfer->end_time != 0) |
116 now = purple_xfer_get_end_time(xfer); |
| 120 now = xfer->end_time; |
117 if (now == 0) |
| 121 else |
|
| 122 now = time(NULL); |
118 now = time(NULL); |
| 123 |
119 |
| 124 kb_sent = purple_xfer_get_bytes_sent(xfer) / 1024.0; |
120 kb_sent = purple_xfer_get_bytes_sent(xfer) / 1024.0; |
| 125 kb_rem = purple_xfer_get_bytes_remaining(xfer) / 1024.0; |
121 kb_rem = purple_xfer_get_bytes_remaining(xfer) / 1024.0; |
| 126 elapsed = (xfer->start_time > 0 ? now - xfer->start_time : 0); |
122 elapsed = purple_xfer_get_start_time(xfer); |
| |
123 if (elapsed > 0) |
| |
124 elapsed = now - elapsed; |
| |
125 else |
| |
126 elapsed = 0; |
| 127 kbps = (elapsed > 0 ? (kb_sent / elapsed) : 0); |
127 kbps = (elapsed > 0 ? (kb_sent / elapsed) : 0); |
| 128 |
128 |
| 129 if (kbsec != NULL) { |
129 if (kbsec != NULL) { |
| 130 *kbsec = g_strdup_printf(_("%.2f KiB/s"), kbps); |
130 *kbsec = g_strdup_printf(_("%.2f KiB/s"), kbps); |
| 131 } |
131 } |
| 133 if (time_elapsed != NULL) |
133 if (time_elapsed != NULL) |
| 134 { |
134 { |
| 135 int h, m, s; |
135 int h, m, s; |
| 136 int secs_elapsed; |
136 int secs_elapsed; |
| 137 |
137 |
| 138 if (xfer->start_time > 0) |
138 if (purple_xfer_get_start_time(xfer) > 0) |
| 139 { |
139 { |
| 140 secs_elapsed = now - xfer->start_time; |
140 secs_elapsed = now - purple_xfer_get_start_time(xfer); |
| 141 |
141 |
| 142 h = secs_elapsed / 3600; |
142 h = secs_elapsed / 3600; |
| 143 m = (secs_elapsed % 3600) / 60; |
143 m = (secs_elapsed % 3600) / 60; |
| 144 s = secs_elapsed % 60; |
144 s = secs_elapsed % 60; |
| 145 |
145 |
| 153 |
153 |
| 154 if (time_remaining != NULL) { |
154 if (time_remaining != NULL) { |
| 155 if (purple_xfer_is_completed(xfer)) { |
155 if (purple_xfer_is_completed(xfer)) { |
| 156 *time_remaining = g_strdup(_("Finished")); |
156 *time_remaining = g_strdup(_("Finished")); |
| 157 } |
157 } |
| 158 else if (purple_xfer_is_canceled(xfer)) { |
158 else if (purple_xfer_is_cancelled(xfer)) { |
| 159 *time_remaining = g_strdup(_("Cancelled")); |
159 *time_remaining = g_strdup(_("Cancelled")); |
| 160 } |
160 } |
| 161 else if (purple_xfer_get_size(xfer) == 0 || (kb_sent > 0 && kbps == 0)) { |
161 else if (purple_xfer_get_size(xfer) == 0 || (kb_sent > 0 && kbps == 0)) { |
| 162 *time_remaining = g_strdup(_("Unknown")); |
162 *time_remaining = g_strdup(_("Unknown")); |
| 163 } |
163 } |
| 241 char *status, *utf8; |
241 char *status, *utf8; |
| 242 |
242 |
| 243 if (dialog == NULL || xfer == NULL) |
243 if (dialog == NULL || xfer == NULL) |
| 244 return; |
244 return; |
| 245 |
245 |
| 246 data = PIDGINXFER(xfer); |
246 data = purple_xfer_get_ui_data(xfer); |
| 247 |
247 |
| 248 get_xfer_info_strings(xfer, &kbsec, &time_elapsed, &time_remaining); |
248 get_xfer_info_strings(xfer, &kbsec, &time_elapsed, &time_remaining); |
| 249 |
249 |
| 250 status = g_strdup_printf("%d%% (%" G_GSIZE_FORMAT " of %" G_GSIZE_FORMAT " bytes)", |
250 status = g_strdup_printf("%d%% (%" G_GOFFSET_FORMAT " of %" G_GOFFSET_FORMAT " bytes)", |
| 251 (int)(purple_xfer_get_progress(xfer)*100), |
251 (int)(purple_xfer_get_progress(xfer)*100), |
| 252 purple_xfer_get_bytes_sent(xfer), |
252 purple_xfer_get_bytes_sent(xfer), |
| 253 purple_xfer_get_size(xfer)); |
253 purple_xfer_get_size(xfer)); |
| 254 |
254 |
| 255 if (purple_xfer_is_completed(xfer)) { |
255 if (purple_xfer_is_completed(xfer)) { |
| 279 gtk_label_set_markup(GTK_LABEL(dialog->local_user_desc_label), |
279 gtk_label_set_markup(GTK_LABEL(dialog->local_user_desc_label), |
| 280 _("<b>Sending As:</b>")); |
280 _("<b>Sending As:</b>")); |
| 281 } |
281 } |
| 282 |
282 |
| 283 gtk_label_set_text(GTK_LABEL(dialog->local_user_label), |
283 gtk_label_set_text(GTK_LABEL(dialog->local_user_label), |
| 284 purple_account_get_username(xfer->account)); |
284 purple_account_get_username(purple_xfer_get_account(xfer))); |
| 285 gtk_label_set_text(GTK_LABEL(dialog->remote_user_label), xfer->who); |
285 gtk_label_set_text(GTK_LABEL(dialog->remote_user_label), purple_xfer_get_remote_user(xfer)); |
| 286 gtk_label_set_text(GTK_LABEL(dialog->protocol_label), |
286 gtk_label_set_text(GTK_LABEL(dialog->protocol_label), |
| 287 purple_account_get_protocol_name(xfer->account)); |
287 purple_account_get_protocol_name(purple_xfer_get_account(xfer))); |
| 288 |
288 |
| 289 if (purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE) { |
289 if (purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE) { |
| 290 gtk_label_set_text(GTK_LABEL(dialog->filename_label), |
290 gtk_label_set_text(GTK_LABEL(dialog->filename_label), |
| 291 purple_xfer_get_filename(xfer)); |
291 purple_xfer_get_filename(xfer)); |
| 292 } else { |
292 } else { |
| 355 gtk_widget_set_sensitive (dialog->open_button, FALSE); |
355 gtk_widget_set_sensitive (dialog->open_button, FALSE); |
| 356 } |
356 } |
| 357 #endif |
357 #endif |
| 358 |
358 |
| 359 gtk_widget_set_sensitive(dialog->remove_button, TRUE); |
359 gtk_widget_set_sensitive(dialog->remove_button, TRUE); |
| 360 } else if (purple_xfer_is_canceled(xfer)) { |
360 } else if (purple_xfer_is_cancelled(xfer)) { |
| 361 gtk_widget_hide(dialog->stop_button); |
361 gtk_widget_hide(dialog->stop_button); |
| 362 gtk_widget_show(dialog->remove_button); |
362 gtk_widget_show(dialog->remove_button); |
| 363 |
363 |
| 364 gtk_widget_set_sensitive(dialog->open_button, FALSE); |
364 gtk_widget_set_sensitive(dialog->open_button, FALSE); |
| 365 |
365 |
| 730 vbox2 = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); |
730 vbox2 = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); |
| 731 gtk_box_pack_start(GTK_BOX(vbox1), vbox2, TRUE, TRUE, 0); |
731 gtk_box_pack_start(GTK_BOX(vbox1), vbox2, TRUE, TRUE, 0); |
| 732 gtk_widget_show(vbox2); |
732 gtk_widget_show(vbox2); |
| 733 |
733 |
| 734 /* Setup the listbox */ |
734 /* Setup the listbox */ |
| 735 gtk_box_pack_start(GTK_BOX(vbox2), |
735 gtk_box_pack_start(GTK_BOX(vbox2), |
| 736 pidgin_make_scrollable(setup_tree(dialog), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC, GTK_SHADOW_IN, -1, 140), |
736 pidgin_make_scrollable(setup_tree(dialog), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC, GTK_SHADOW_IN, -1, 140), |
| 737 TRUE, TRUE, 0); |
737 TRUE, TRUE, 0); |
| 738 |
738 |
| 739 /* "Close this window when all transfers finish" */ |
739 /* "Close this window when all transfers finish" */ |
| 740 checkbox = gtk_check_button_new_with_mnemonic( |
740 checkbox = gtk_check_button_new_with_mnemonic( |
| 741 _("Close this window when all transfers _finish")); |
741 _("Close this window when all transfers _finish")); |
| 867 g_return_if_fail(dialog != NULL); |
867 g_return_if_fail(dialog != NULL); |
| 868 g_return_if_fail(xfer != NULL); |
868 g_return_if_fail(xfer != NULL); |
| 869 |
869 |
| 870 purple_xfer_ref(xfer); |
870 purple_xfer_ref(xfer); |
| 871 |
871 |
| 872 data = PIDGINXFER(xfer); |
872 data = purple_xfer_get_ui_data(xfer); |
| 873 data->in_list = TRUE; |
873 data->in_list = TRUE; |
| 874 |
874 |
| 875 pidgin_xfer_dialog_show(dialog); |
875 pidgin_xfer_dialog_show(dialog); |
| 876 |
876 |
| 877 data->last_updated_time = 0; |
877 data->last_updated_time = 0; |
| 968 if ((purple_xfer_get_status(xfer) == PURPLE_XFER_STATUS_CANCEL_LOCAL) && (dialog->auto_clear)) { |
968 if ((purple_xfer_get_status(xfer) == PURPLE_XFER_STATUS_CANCEL_LOCAL) && (dialog->auto_clear)) { |
| 969 pidgin_xfer_dialog_remove_xfer(dialog, xfer); |
969 pidgin_xfer_dialog_remove_xfer(dialog, xfer); |
| 970 return; |
970 return; |
| 971 } |
971 } |
| 972 |
972 |
| 973 data = PIDGINXFER(xfer); |
973 data = purple_xfer_get_ui_data(xfer); |
| 974 |
974 |
| 975 update_detailed_info(dialog, xfer); |
975 update_detailed_info(dialog, xfer); |
| 976 update_title_progress(dialog); |
976 update_title_progress(dialog); |
| 977 |
977 |
| 978 pixbuf = gtk_widget_render_icon(dialog->window, |
978 pixbuf = gtk_widget_render_icon(dialog->window, |
| 979 PIDGIN_STOCK_FILE_CANCELED, |
979 PIDGIN_STOCK_FILE_CANCELED, |
| 980 GTK_ICON_SIZE_MENU, NULL); |
980 GTK_ICON_SIZE_MENU, NULL); |
| 981 |
981 |
| 982 if (purple_xfer_is_canceled(xfer)) |
982 if (purple_xfer_is_cancelled(xfer)) |
| 983 status = _("Cancelled"); |
983 status = _("Cancelled"); |
| 984 else |
984 else |
| 985 status = _("Failed"); |
985 status = _("Failed"); |
| 986 |
986 |
| 987 gtk_list_store_set(dialog->model, &data->iter, |
987 gtk_list_store_set(dialog->model, &data->iter, |
| 1093 static void |
1093 static void |
| 1094 pidgin_xfer_new_xfer(PurpleXfer *xfer) |
1094 pidgin_xfer_new_xfer(PurpleXfer *xfer) |
| 1095 { |
1095 { |
| 1096 PidginXferUiData *data; |
1096 PidginXferUiData *data; |
| 1097 |
1097 |
| 1098 /* This is where we're setting xfer->ui_data for the first time. */ |
1098 /* This is where we're setting xfer's "ui_data" for the first time. */ |
| 1099 data = g_new0(PidginXferUiData, 1); |
1099 data = g_new0(PidginXferUiData, 1); |
| 1100 xfer->ui_data = data; |
1100 purple_xfer_set_ui_data(xfer, data); |
| 1101 } |
1101 } |
| 1102 |
1102 |
| 1103 static void |
1103 static void |
| 1104 pidgin_xfer_destroy(PurpleXfer *xfer) |
1104 pidgin_xfer_destroy(PurpleXfer *xfer) |
| 1105 { |
1105 { |
| 1106 PidginXferUiData *data; |
1106 PidginXferUiData *data; |
| 1107 |
1107 |
| 1108 data = PIDGINXFER(xfer); |
1108 data = purple_xfer_get_ui_data(xfer); |
| 1109 if (data) { |
1109 if (data) { |
| 1110 g_free(data->name); |
1110 g_free(data->name); |
| 1111 g_free(data); |
1111 g_free(data); |
| 1112 xfer->ui_data = NULL; |
1112 purple_xfer_set_ui_data(xfer, NULL); |
| 1113 } |
1113 } |
| 1114 } |
1114 } |
| 1115 |
1115 |
| 1116 static void |
1116 static void |
| 1117 pidgin_xfer_add_xfer(PurpleXfer *xfer) |
1117 pidgin_xfer_add_xfer(PurpleXfer *xfer) |