static void chat_sendfile(ToxWindow *self, ChatContext *ctx, Tox *m, uint8_t *path) { int path_len = strlen(path); if (path_len > MAX_STR_SIZE) { wprintw(ctx->history, "File path exceeds character limit.\n"); return; } FILE *file_to_send = fopen(path, "r"); if (file_to_send == NULL) { wprintw(ctx->history, "File '%s' not found.\n", path); return; } fseek(file_to_send, 0, SEEK_END); uint64_t filesize = ftell(file_to_send); fseek(file_to_send, 0, SEEK_SET); int friendnum = self->num; uint8_t friendname[TOX_MAX_NAME_LENGTH] = {'\0'}; tox_getname(m, friendnum, friendname); int filenum = tox_new_filesender(m, friendnum, filesize, path, path_len + 1); if (filenum == -1) { wprintw(ctx->history, "Error sending file.\n"); return; } memcpy(file_senders[num_file_senders].pathname, path, path_len + 1); memcpy(file_senders[num_file_senders].friendname, friendname, strlen(friendname) + 1); file_senders[num_file_senders].file = file_to_send; file_senders[num_file_senders].filenum = filenum; file_senders[num_file_senders].friendnum = friendnum; file_senders[num_file_senders].piecelen = fread(file_senders[num_file_senders].nextpiece, 1, tox_filedata_size(m, friendnum), file_to_send); wprintw(ctx->history, "Sending file '%s'...\n", path); ++num_file_senders; }
void do_file_senders(Tox *m) { int i; for (i = 0; i < MAX_FILES; ++i) { if (!file_senders[i].active) continue; while (true) { uint8_t filenum = file_senders[i].filenum; int friendnum = file_senders[i].friendnum; if (!tox_file_senddata(m, friendnum, filenum, file_senders[i].nextpiece, file_senders[i].piecelen)) return; file_senders[i].piecelen = fread(file_senders[i].nextpiece, 1, tox_filedata_size(m, friendnum), file_senders[i].file); if (file_senders[i].piecelen == 0) { fclose(file_senders[i].file); memset(&file_senders[i], 0, sizeof(FileSender)); tox_file_sendcontrol(m, friendnum, 0, filenum, TOX_FILECONTROL_FINISHED, 0, 0); uint8_t *pathname = file_senders[i].pathname; wprintw(file_senders[i].chatwin, "File '%s' successfuly sent.\n", pathname); int i; for (i = num_file_senders; i > 0; --i) { if (file_senders[i-1].active) break; } num_file_senders = i; return; } } } }