Пример #1
0
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;
}
Пример #2
0
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;
            }
        }
    }
}