static void startft(Tox *tox, uint32_t fid, uint8_t *path, uint8_t *name, uint16_t name_length) { debug("Sending: %s\n", path); FILE *file = fopen((char*)path, "rb"); if(!file) { return; } uint64_t size; fseek(file, 0, SEEK_END); size = ftell(file); fseek(file, 0, SEEK_SET); int filenumber = tox_new_file_sender(tox, fid, size, name, name_length); if(filenumber != -1) { FILE_T *ft = &friend[fid].outgoing[filenumber]; memset(ft, 0, sizeof(FILE)); *file_tend++ = ft; ft->fid = fid; ft->filenumber = filenumber; name_length = name_length > sizeof(ft->name) ? sizeof(ft->name) : name_length; ft->name_length = name_length; ft->status = FT_PENDING; ft->sendsize = tox_file_data_size(tox, fid); memcpy(ft->name, name, name_length); ft->total = size; ft->path = (uint8_t*)strdup((char*)path); ft->data = file; ft->buffer = malloc(ft->sendsize); fillbuffer(ft); postmessage(FRIEND_FILE_OUT_NEW, fid, filenumber, NULL); } else {
void Core::sendFile(int32_t friendId, QString Filename, QString FilePath, long long filesize) { QByteArray fileName = Filename.toUtf8(); int fileNum = tox_new_file_sender(tox, friendId, filesize, (uint8_t*)fileName.data(), fileName.size()); if (fileNum == -1) { qWarning() << "Core::sendFile: Can't create the Tox file sender"; return; } qDebug() << QString("Core::sendFile: Created file sender %1 with friend %2").arg(fileNum).arg(friendId); ToxFile file{fileNum, friendId, fileName, FilePath, ToxFile::SENDING}; file.filesize = filesize; if (!file.open(false)) { qWarning() << QString("Core::sendFile: Can't open file, error: %1").arg(file.file->errorString()); } fileSendQueue.append(file); emit fileSendStarted(fileSendQueue.last()); }
int add_filesender(Tox *m, uint16_t friendnum, char *filename) { FILE *tempfile = fopen(filename, "rb"); if (tempfile == 0) return -1; fseek(tempfile, 0, SEEK_END); uint64_t filesize = ftell(tempfile); fseek(tempfile, 0, SEEK_SET); int filenum = tox_new_file_sender(m, friendnum, filesize, (uint8_t *)filename, strlen(filename) + 1); if (filenum == -1) return -1; file_senders[numfilesenders].file = tempfile; file_senders[numfilesenders].piecelength = fread(file_senders[numfilesenders].nextpiece, 1, tox_file_data_size(m, file_senders[numfilesenders].friendnum), file_senders[numfilesenders].file); file_senders[numfilesenders].friendnum = friendnum; file_senders[numfilesenders].filenumber = filenum; ++numfilesenders; return filenum; }
void cmd_sendfile(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]) { if (max_file_senders_index >= (MAX_FILES - 1)) { const char *errmsg = "Please wait for some of your outgoing file transfers to complete."; line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, errmsg); return; } if (argc < 1) { line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "File path required."); return; } if (argv[1][0] != '\"') { line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "File path must be enclosed in quotes."); return; } /* remove opening and closing quotes */ char path[MAX_STR_SIZE]; snprintf(path, sizeof(path), "%s", &argv[1][1]); int path_len = strlen(path) - 1; path[path_len] = '\0'; if (path_len >= MAX_STR_SIZE) { line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "File path exceeds character limit."); return; } FILE *file_to_send = fopen(path, "r"); if (file_to_send == NULL) { line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "File not found."); return; } off_t filesize = file_size(path); if (filesize == -1) { line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "File corrupt."); fclose(file_to_send); return; } char filename[MAX_STR_SIZE] = {0}; get_file_name(filename, sizeof(filename), path); int namelen = strlen(filename); int filenum = tox_new_file_sender(m, self->num, filesize, (const uint8_t *) filename, namelen); if (filenum == -1) { line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Error sending file."); fclose(file_to_send); return; } int i; for (i = 0; i < MAX_FILES; ++i) { if (!file_senders[i].active) { memcpy(file_senders[i].filename, filename, namelen + 1); file_senders[i].active = true; file_senders[i].toxwin = self; file_senders[i].file = file_to_send; file_senders[i].filenum = filenum; file_senders[i].friendnum = self->num; file_senders[i].timestamp = get_unix_time(); file_senders[i].size = filesize; file_senders[i].piecelen = fread(file_senders[i].nextpiece, 1, tox_file_data_size(m, self->num), file_to_send); char sizestr[32]; bytes_convert_str(sizestr, sizeof(sizestr), filesize); line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Sending file [%d]: '%s' (%s)", filenum, filename, sizestr); ++num_active_file_senders; if (i == max_file_senders_index) ++max_file_senders_index; reset_file_sender_queue(); return; } } }
void cmd_sendfile(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]) { uint8_t *errmsg; if (max_file_senders_index >= (MAX_FILES-1)) { errmsg = "Please wait for some of your outgoing file transfers to complete."; line_info_add(self, NULL, NULL, NULL, errmsg, SYS_MSG, 0, 0); return; } if (argc < 1) { errmsg = "Invalid syntax."; line_info_add(self, NULL, NULL, NULL, errmsg, SYS_MSG, 0, 0); return; } uint8_t *path = argv[1]; if (path[0] != '\"') { errmsg = "File path must be enclosed in quotes."; line_info_add(self, NULL, NULL, NULL, errmsg, SYS_MSG, 0, 0); return; } path[strlen(++path)-1] = L'\0'; int path_len = strlen(path); if (path_len > MAX_STR_SIZE) { errmsg = "File path exceeds character limit."; line_info_add(self, NULL, NULL, NULL, errmsg, SYS_MSG, 0, 0); return; } FILE *file_to_send = fopen(path, "r"); if (file_to_send == NULL) { errmsg = "File not found."; line_info_add(self, NULL, NULL, NULL, errmsg, SYS_MSG, 0, 0); return; } fseek(file_to_send, 0, SEEK_END); uint64_t filesize = ftell(file_to_send); fseek(file_to_send, 0, SEEK_SET); uint8_t filename[MAX_STR_SIZE]; get_file_name(path, filename); int filenum = tox_new_file_sender(m, self->num, filesize, filename, strlen(filename) + 1); if (filenum == -1) { errmsg = "Error sending file."; line_info_add(self, NULL, NULL, NULL, errmsg, SYS_MSG, 0, 0); return; } int i; for (i = 0; i < MAX_FILES; ++i) { if (!file_senders[i].active) { memcpy(file_senders[i].pathname, path, path_len + 1); file_senders[i].active = true; file_senders[i].toxwin = self; file_senders[i].file = file_to_send; file_senders[i].filenum = filenum; file_senders[i].friendnum = self->num; file_senders[i].timestamp = get_unix_time(); file_senders[i].piecelen = fread(file_senders[i].nextpiece, 1, tox_file_data_size(m, self->num), file_to_send); uint8_t msg[MAX_STR_SIZE]; snprintf(msg, sizeof(msg), "Sending file: '%s'", path); line_info_add(self, NULL, NULL, NULL, msg, SYS_MSG, 0, 0); if (i == max_file_senders_index) ++max_file_senders_index; return; } } }