void xfer_network_connect_init (struct t_xfer *xfer) { if (!xfer_network_connect (xfer)) { xfer_close (xfer, XFER_STATUS_FAILED); xfer_buffer_refresh (WEECHAT_HOTLIST_MESSAGE); } else { /* for a file: launch child process */ if (XFER_IS_FILE(xfer->type)) { xfer->status = XFER_STATUS_CONNECTING; xfer_network_recv_file_fork (xfer); } else { /* for a chat => associate with buffer */ xfer->status = XFER_STATUS_ACTIVE; xfer_chat_open_buffer (xfer); } } xfer_buffer_refresh (WEECHAT_HOTLIST_MESSAGE); }
void xfer_network_accept (struct t_xfer *xfer) { if (XFER_IS_FILE(xfer->type) && (xfer->start_resume > 0)) { xfer->status = XFER_STATUS_CONNECTING; xfer_send_signal (xfer, "xfer_resume_ready"); xfer_buffer_refresh (WEECHAT_HOTLIST_MESSAGE); } else xfer_network_connect_init (xfer); }
void xfer_network_connect_init (struct t_xfer *xfer) { if (!xfer_network_connect (xfer)) { xfer_close (xfer, XFER_STATUS_FAILED); } else { /* for a file: launch child process */ if (XFER_IS_FILE(xfer->type)) xfer_network_recv_file_fork (xfer); xfer->status = XFER_STATUS_CONNECTING; } xfer_buffer_refresh (DOGECHAT_HOTLIST_MESSAGE); }
void xfer_file_find_filename (struct t_xfer *xfer) { const char *dir_separator; char *path, *filename2; int length; if (!XFER_IS_FILE(xfer->type)) return; path = weechat_string_eval_path_home ( weechat_config_string (xfer_config_file_download_path), NULL, NULL, NULL); if (!path) return; xfer->local_filename = malloc (strlen (path) + strlen (xfer->remote_nick) + strlen (xfer->filename) + 4); if (!xfer->local_filename) { free (path); return; } strcpy (xfer->local_filename, path); dir_separator = weechat_info_get("dir_separator", ""); if (dir_separator && (xfer->local_filename[strlen (xfer->local_filename) - 1] != dir_separator[0])) strcat (xfer->local_filename, dir_separator); if (weechat_config_boolean (xfer_config_file_use_nick_in_filename)) { strcat (xfer->local_filename, xfer->remote_nick); strcat (xfer->local_filename, "."); } strcat (xfer->local_filename, xfer->filename); free (path); /* file already exists? */ if (access (xfer->local_filename, F_OK) == 0) { if (xfer_file_resume (xfer, xfer->local_filename)) return; /* if auto rename is not set, then abort xfer */ if (!xfer_config_file_auto_rename) { xfer_close (xfer, XFER_STATUS_FAILED); xfer_buffer_refresh (WEECHAT_HOTLIST_MESSAGE); return; } length = strlen (xfer->local_filename) + 16; filename2 = malloc (length); if (!filename2) { xfer_close (xfer, XFER_STATUS_FAILED); xfer_buffer_refresh (WEECHAT_HOTLIST_MESSAGE); return; } xfer->filename_suffix = 0; do { xfer->filename_suffix++; snprintf (filename2, length, "%s.%d", xfer->local_filename, xfer->filename_suffix); if (access (filename2, F_OK) == 0) { if (xfer_file_resume (xfer, filename2)) break; } else break; } while (1); free (xfer->local_filename); xfer->local_filename = strdup (filename2); free (filename2); } }
void xfer_command_xfer_list (int full) { struct t_xfer *ptr_xfer; int i; char date[128]; unsigned long long pct_complete; struct tm *date_tmp; if (xfer_list) { dogechat_printf (NULL, ""); dogechat_printf (NULL, _("Xfer list:")); i = 1; for (ptr_xfer = xfer_list; ptr_xfer; ptr_xfer = ptr_xfer->next_xfer) { /* xfer info */ if (XFER_IS_FILE(ptr_xfer->type)) { if (ptr_xfer->size == 0) { if (ptr_xfer->status == XFER_STATUS_DONE) pct_complete = 100; else pct_complete = 0; } else pct_complete = (unsigned long long)(((float)(ptr_xfer->pos)/(float)(ptr_xfer->size)) * 100); dogechat_printf (NULL, _("%3d. %s (%s), file: \"%s\" (local: " "\"%s\"), %s %s, status: %s%s%s " "(%llu %%)"), i, xfer_type_string[ptr_xfer->type], xfer_protocol_string[ptr_xfer->protocol], ptr_xfer->filename, ptr_xfer->local_filename, (XFER_IS_SEND(ptr_xfer->type)) ? _("sent to") : _("received from"), ptr_xfer->remote_nick, dogechat_color ( dogechat_config_string ( xfer_config_color_status[ptr_xfer->status])), _(xfer_status_string[ptr_xfer->status]), dogechat_color ("chat"), pct_complete); } else { date[0] = '\0'; date_tmp = localtime (&(ptr_xfer->start_time)); if (date_tmp) { strftime (date, sizeof (date), "%a, %d %b %Y %H:%M:%S", date_tmp); } dogechat_printf (NULL, /* TRANSLATORS: "%s" after "started on" is a date */ _("%3d. %s, chat with %s (local nick: %s), " "started on %s, status: %s%s"), i, xfer_type_string[ptr_xfer->type], ptr_xfer->remote_nick, ptr_xfer->local_nick, date, dogechat_color( dogechat_config_string( xfer_config_color_status[ptr_xfer->status])), _(xfer_status_string[ptr_xfer->status])); } if (full) { /* second line of xfer info */ if (XFER_IS_FILE(ptr_xfer->type)) { dogechat_printf (NULL, _(" plugin: %s (id: %s), file: %llu " "bytes (position: %llu), address: " "%s (port %d)"), ptr_xfer->plugin_name, ptr_xfer->plugin_id, ptr_xfer->size, ptr_xfer->pos, ptr_xfer->remote_address_str, ptr_xfer->port); date[0] = '\0'; date_tmp = localtime (&(ptr_xfer->start_transfer)); if (date_tmp) { strftime (date, sizeof (date), "%a, %d %b %Y %H:%M:%S", date_tmp); } dogechat_printf (NULL, /* TRANSLATORS: "%s" after "started on" is a date */ _(" fast_send: %s, blocksize: %d, " "started on %s"), (ptr_xfer->fast_send) ? _("yes") : _("no"), ptr_xfer->blocksize, date); } } i++; } } else dogechat_printf (NULL, _("No xfer")); }
void xfer_buffer_refresh (const char *hotlist) { struct t_xfer *ptr_xfer, *xfer_selected; char str_color[256], suffix[32], status[64], date[128], eta[128]; char str_ip[128], str_hash[128]; char *progress_bar, *str_pos, *str_total, *str_bytes_per_sec; int i, length, line, progress_bar_size, num_bars; unsigned long long pos, pct_complete; struct tm *date_tmp; if (xfer_buffer) { weechat_buffer_clear (xfer_buffer); line = 0; xfer_selected = xfer_search_by_number (xfer_buffer_selected_line); weechat_printf_y (xfer_buffer, 0, "%s%s%s%s%s%s%s%s", weechat_color ("green"), _("Actions (letter+enter):"), weechat_color ("lightgreen"), /* accept */ (xfer_selected && XFER_IS_RECV(xfer_selected->type) && (xfer_selected->status == XFER_STATUS_WAITING)) ? _(" [A] Accept") : "", /* cancel */ (xfer_selected && !XFER_HAS_ENDED(xfer_selected->status)) ? _(" [C] Cancel") : "", /* remove */ (xfer_selected && XFER_HAS_ENDED(xfer_selected->status)) ? _(" [R] Remove") : "", /* purge old */ _(" [P] Purge finished"), /* quit */ _(" [Q] Close this buffer")); for (ptr_xfer = xfer_list; ptr_xfer; ptr_xfer = ptr_xfer->next_xfer) { suffix[0] = '\0'; if (ptr_xfer->filename_suffix >= 0) { snprintf (suffix, sizeof (suffix), " (.%d)", ptr_xfer->filename_suffix); } snprintf (str_color, sizeof (str_color), "%s,%s", (line == xfer_buffer_selected_line) ? weechat_config_string (xfer_config_color_text_selected) : weechat_config_string (xfer_config_color_text), weechat_config_string (xfer_config_color_text_bg)); str_ip[0] = '\0'; if (ptr_xfer->remote_address_str) { snprintf (str_ip, sizeof (str_ip), " (%s)", ptr_xfer->remote_address_str); } str_hash[0] = '\0'; if (ptr_xfer->hash_target && ptr_xfer->hash_handle && (ptr_xfer->hash_status != XFER_HASH_STATUS_UNKNOWN) && ((ptr_xfer->status == XFER_STATUS_ACTIVE) || (ptr_xfer->status == XFER_STATUS_DONE) || (ptr_xfer->status == XFER_STATUS_HASHING))) { snprintf (str_hash, sizeof (str_hash), " (%s)", _(xfer_hash_status_string[ptr_xfer->hash_status])); } /* display first line with remote nick, filename and plugin name/id */ weechat_printf_y (xfer_buffer, (line * 2) + 2, "%s%s%-24s %s%s%s%s (%s.%s)%s%s", weechat_color (str_color), (line == xfer_buffer_selected_line) ? "*** " : " ", ptr_xfer->remote_nick, (XFER_IS_FILE(ptr_xfer->type)) ? "\"" : "", (XFER_IS_FILE(ptr_xfer->type)) ? ptr_xfer->filename : _("xfer chat"), (XFER_IS_FILE(ptr_xfer->type)) ? "\"" : "", suffix, ptr_xfer->plugin_name, ptr_xfer->plugin_id, str_ip, str_hash); snprintf (status, sizeof (status), "%s", _(xfer_status_string[ptr_xfer->status])); length = weechat_utf8_strlen_screen (status); if (length < 20) { for (i = 0; i < 20 - length; i++) { strcat (status, " "); } } if (XFER_IS_CHAT(ptr_xfer->type)) { /* display second line for chat with status and date */ date[0] = '\0'; date_tmp = localtime (&(ptr_xfer->start_time)); if (date_tmp) { if (strftime (date, sizeof (date), "%a, %d %b %Y %H:%M:%S", date_tmp) == 0) date[0] = '\0'; } weechat_printf_y (xfer_buffer, (line * 2) + 3, "%s%s%s %s%s%s%s%s", weechat_color (str_color), (line == xfer_buffer_selected_line) ? "*** " : " ", (XFER_IS_SEND(ptr_xfer->type)) ? "<<--" : "-->>", weechat_color (weechat_config_string (xfer_config_color_status[ptr_xfer->status])), status, weechat_color ("reset"), weechat_color (str_color), date); } else { /* build progress bar */ pos = (ptr_xfer->pos <= ptr_xfer->size) ? ptr_xfer->pos : ptr_xfer->size; progress_bar = NULL; progress_bar_size = weechat_config_integer (xfer_config_look_progress_bar_size); if (progress_bar_size > 0) { progress_bar = malloc (1 + progress_bar_size + 1 + 1 + 1); strcpy (progress_bar, "["); if (ptr_xfer->size == 0) { if (ptr_xfer->status == XFER_STATUS_DONE) num_bars = progress_bar_size; else num_bars = 0; } else num_bars = (int)(((float)(pos)/(float)(ptr_xfer->size)) * (float)progress_bar_size); for (i = 0; i < num_bars - 1; i++) { strcat (progress_bar, "="); } if (num_bars > 0) strcat (progress_bar, ">"); for (i = 0; i < progress_bar_size - num_bars; i++) { strcat (progress_bar, " "); } strcat (progress_bar, "] "); } /* computes percentage */ if (ptr_xfer->size == 0) { if (ptr_xfer->status == XFER_STATUS_DONE) pct_complete = 100; else pct_complete = 0; } else pct_complete = (unsigned long long)(((float)(pos)/(float)(ptr_xfer->size)) * 100); /* position, total and bytes per second */ str_pos = weechat_string_format_size (pos); str_total = weechat_string_format_size (ptr_xfer->size); str_bytes_per_sec = weechat_string_format_size (ptr_xfer->bytes_per_sec); /* ETA */ eta[0] = '\0'; if (ptr_xfer->status == XFER_STATUS_ACTIVE) { snprintf (eta, sizeof (eta), "%s: %.2llu:%.2llu:%.2llu - ", _("ETA"), ptr_xfer->eta / 3600, (ptr_xfer->eta / 60) % 60, ptr_xfer->eta % 60); } /* display second line for file with status, progress bar and estimated time */ weechat_printf_y (xfer_buffer, (line * 2) + 3, "%s%s%s %s%s%s%s%3llu%% %s / %s (%s%s/s)", weechat_color (str_color), (line == xfer_buffer_selected_line) ? "*** " : " ", (XFER_IS_SEND(ptr_xfer->type)) ? "<<--" : "-->>", weechat_color (weechat_config_string (xfer_config_color_status[ptr_xfer->status])), status, weechat_color (str_color), (progress_bar) ? progress_bar : "", pct_complete, (str_pos) ? str_pos : "?", (str_total) ? str_total : "?", eta, str_bytes_per_sec); if (progress_bar) free (progress_bar); if (str_pos) free (str_pos); if (str_total) free (str_total); if (str_bytes_per_sec) free (str_bytes_per_sec); } line++; } weechat_buffer_set (xfer_buffer, "hotlist", hotlist); } }