void do_file_senders(Tox *m) { int i; for (i = 0; i < max_file_senders_index; ++i) { if (!file_senders[i].active) continue; if (file_senders[i].queue_pos > 0) { --file_senders[i].queue_pos; continue; } ToxWindow *self = file_senders[i].toxwin; char *filename = file_senders[i].filename; int filenum = file_senders[i].filenum; int32_t friendnum = file_senders[i].friendnum; /* kill file transfer if chatwindow is closed */ if (self->chatwin == NULL) { close_file_sender(self, m, i, NULL, TOX_FILECONTROL_KILL, filenum, friendnum); continue; } /* If file transfer has timed out kill transfer and send kill control */ if (timed_out(file_senders[i].timestamp, get_unix_time(), TIMEOUT_FILESENDER)) { char msg[MAX_STR_SIZE]; snprintf(msg, sizeof(msg), "File transfer for '%s' timed out.", filename); close_file_sender(self, m, i, msg, TOX_FILECONTROL_KILL, filenum, friendnum); sound_notify(self, error, NT_NOFOCUS | NT_WNDALERT_2, NULL); if (self->active_box != -1) box_notify2(self, error, NT_NOFOCUS | NT_WNDALERT_2, self->active_box, "%s", msg); else box_notify(self, error, NT_NOFOCUS | NT_WNDALERT_2, &self->active_box, self->name, "%s", msg); continue; } send_file_data(self, m, i, friendnum, filenum, filename); file_senders[i].queue_pos = num_active_file_senders - 1; } }
void cmd_cancelfile(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]) { if (argc < 2) { line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Requires type in|out and the file ID."); return; } const char *inoutstr = argv[1]; int filenum = atoi(argv[2]); if (filenum >= MAX_FILES || filenum < 0) { line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Invalid file ID."); return; } if (strcasecmp(inoutstr, "in") == 0) { /* cancel an incoming file transfer */ if (!Friends.list[self->num].file_receiver[filenum].active) { line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Invalid file ID."); return; } const char *filepath = Friends.list[self->num].file_receiver[filenum].filename; char name[MAX_STR_SIZE]; get_file_name(name, sizeof(name), filepath); line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "File transfer for '%s' canceled.", name); chat_close_file_receiver(m, filenum, self->num, TOX_FILECONTROL_KILL); return; } else if (strcasecmp(inoutstr, "out") == 0) { /* cancel an outgoing file transfer */ int i; bool match = false; for (i = 0; i < MAX_FILES; ++i) { if (file_senders[i].active && file_senders[i].filenum == filenum) { match = true; break; } } if (!match) { line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Invalid file ID."); return; } const char *filename = file_senders[i].filename; char msg[MAX_STR_SIZE]; snprintf(msg, sizeof(msg), "File transfer for '%s' canceled.", filename); close_file_sender(self, m, i, msg, TOX_FILECONTROL_KILL, filenum, self->num); return; } else { line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Type must be 'in' or 'out'."); return; } }
static void chat_onFileControl(ToxWindow *self, Tox *m, int num, uint8_t receive_send, uint8_t filenum, uint8_t control_type, uint8_t *data, uint16_t length) { if (self->num != num) return; ChatContext *ctx = self->chatwin; uint8_t *filename; if (receive_send == 0) filename = friends[num].file_receiver.filenames[filenum]; else filename = file_senders[filenum].pathname; switch (control_type) { case TOX_FILECONTROL_ACCEPT: wprintw(ctx->history, "File transfer for '%s' accepted.\n", filename); break; case TOX_FILECONTROL_PAUSE: // wprintw(ctx->history, "File transfer for '%s' paused.\n", filename); break; case TOX_FILECONTROL_KILL: wprintw(ctx->history, "File transfer for '%s' failed.\n", filename); if (receive_send == 0) friends[num].file_receiver.pending[filenum] = false; else close_file_sender(filenum); break; case TOX_FILECONTROL_FINISHED: wprintw(ctx->history, "File transfer for '%s' complete.\n", filename); break; } alert_window(self, WINDOW_ALERT_2, true); }