From 371fbc87a5fc80831cfaacf9ffb9fc055abb00ac Mon Sep 17 00:00:00 2001 From: Jfreegman Date: Sun, 13 Oct 2013 19:09:20 -0400 Subject: [PATCH] refactored sendfile and invite commands to not require names and to only work in chat windows --- src/chat.c | 87 +++++++++++++++++++++++++++++++----- src/commands.c | 104 ++------------------------------------------ src/commands.h | 10 ++--- src/groupchat.c | 1 - src/main.c | 2 +- src/prompt.c | 1 - src/toxic_windows.h | 4 +- 7 files changed, 85 insertions(+), 124 deletions(-) diff --git a/src/chat.c b/src/chat.c index d0debad..97afed5 100644 --- a/src/chat.c +++ b/src/chat.c @@ -100,14 +100,14 @@ static void chat_onStatusMessageChange(ToxWindow *self, int num, uint8_t *status } static void chat_onFileSendRequest(ToxWindow *self, Tox *m, int num, uint8_t filenum, - uint64_t filesize, uint8_t *filename, uint16_t filename_len) + uint64_t filesize, uint8_t *pathname, uint16_t path_len) { if (self-> num != num) return; ChatContext *ctx = (ChatContext *) self->chatwin; - wprintw(ctx->history, "File transfer request for '%s' of size %llu.\n", filename, + wprintw(ctx->history, "File transfer request for '%s' of size %llu.\n", pathname, (long long unsigned int)filesize); if (filenum > MAX_FILENUMBER) { @@ -115,7 +115,7 @@ static void chat_onFileSendRequest(ToxWindow *self, Tox *m, int num, uint8_t fil return; } - wprintw(ctx->history, "Type '/file %d' to accept the file transfer.\n", filenum); + wprintw(ctx->history, "Type '/savefile %d' to accept the file transfer.\n", filenum); pending_file_transfers[filenum] = num; @@ -156,10 +156,10 @@ static void chat_onFileData(ToxWindow *self, Tox *m, int num, uint8_t filenum, u ChatContext *ctx = (ChatContext *) self->chatwin; - char filename[MAX_STR_SIZE]; - snprintf(filename, sizeof(filename), "%d.%u.bin", num, filenum); + char pathname[MAX_STR_SIZE]; + snprintf(pathname, sizeof(pathname), "%d.%u.bin", num, filenum); - FILE *file_to_save = fopen(filename, "a"); + FILE *file_to_save = fopen(pathname, "a"); if (fwrite(data, length, 1, file_to_save) != 1) { wattron(ctx->history, COLOR_PAIR(RED)); @@ -170,6 +170,67 @@ static void chat_onFileData(ToxWindow *self, Tox *m, int num, uint8_t filenum, u fclose(file_to_save); } +static void chat_groupinvite(ToxWindow *self, ChatContext *ctx, Tox *m, uint8_t *line) +{ + int groupnum = atoi(line); + + if (groupnum == 0 && strcmp(line, "0")) { /* atoi returns 0 value on invalid input */ + wprintw(ctx->history, "Invalid syntax.\n"); + return; + } + + if (tox_invite_friend(m, self->num, groupnum) == -1) { + wprintw(ctx->history, "Failed to invite friend.\n"); + return; + } + + wprintw(ctx->history, "Invited friend to group chat %d.\n", groupnum); +} + +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; +} + static void print_chat_help(ChatContext *ctx) { wattron(ctx->history, COLOR_PAIR(CYAN) | A_BOLD); @@ -179,13 +240,13 @@ static void print_chat_help(ChatContext *ctx) wprintw(ctx->history, " /status : Set your status with optional note\n"); wprintw(ctx->history, " /note : Set a personal note\n"); wprintw(ctx->history, " /nick : Set your nickname\n"); - wprintw(ctx->history, " /invite : Invite friend to a groupchat\n"); + wprintw(ctx->history, " /invite : Invite friend to a groupchat\n"); wprintw(ctx->history, " /me : Do an action\n"); wprintw(ctx->history, " /myid : Print your ID\n"); wprintw(ctx->history, " /clear : Clear the screen\n"); wprintw(ctx->history, " /close : Close the current chat window\n"); - wprintw(ctx->history, " /sendfile : Send a file\n"); - wprintw(ctx->history, " /file : Accept a file\n"); + wprintw(ctx->history, " /sendfile : Send a file\n"); + wprintw(ctx->history, " /savefile : Receive a file\n"); wprintw(ctx->history, " /quit or /exit : Exit Toxic\n"); wprintw(ctx->history, " /help : Print this message again\n"); @@ -251,11 +312,11 @@ static void chat_onKey(ToxWindow *self, Tox *m, wint_t key) /* RETURN key: Execute command or print line */ else if (key == '\n') { uint8_t *line = wcs_to_char(ctx->line); + line[ctx->pos+1] = '\0'; wclear(ctx->linewin); wmove(self->window, y2 - CURS_Y_OFFSET, 0); wclrtobot(self->window); bool close_win = false; - if (line[0] == '/') { if (close_win = !strncmp(line, "/close", strlen("/close"))) { int f_num = self->num; @@ -264,9 +325,13 @@ static void chat_onKey(ToxWindow *self, Tox *m, wint_t key) del_window(self); disable_chatwin(f_num); } else if (!strncmp(line, "/me ", strlen("/me "))) - send_action(self, ctx, m, line+4); + send_action(self, ctx, m, line + strlen("/me ")); else if (!strncmp(line, "/help", strlen("/help"))) print_chat_help(ctx); + else if (!strncmp(line, "/invite", strlen("/invite"))) + chat_groupinvite(self, ctx, m, line + strlen("/invite ")); + else if(!strncmp(line, "/sendfile ", strlen("/sendfile "))) + chat_sendfile(self, ctx, m, line + strlen("/sendfile ")); else execute(ctx->history, self->prompt, m, line, ctx->pos); } else { diff --git a/src/commands.c b/src/commands.c index bce5095..8f2b2c7 100644 --- a/src/commands.c +++ b/src/commands.c @@ -180,7 +180,7 @@ void cmd_connect(WINDOW *window, ToxWindow *prompt, Tox *m, int argc, char **arg free(binary_string); } -void cmd_file(WINDOW *window, ToxWindow *prompt, Tox *m, int argc, char **argv) +void cmd_savefile(WINDOW *window, ToxWindow *prompt, Tox *m, int argc, char **argv) { if (argc < 1) { wprintw(window, "Wrong number of arguments.\n"); @@ -228,39 +228,6 @@ void cmd_groupchat(WINDOW *window, ToxWindow *prompt, Tox *m, int argc, char **a wprintw(window, "Group chat created as %d.\n", groupnum); } -void cmd_invite(WINDOW *window, ToxWindow *prompt, Tox *m, int argc, char **argv) -{ - if (argc != 2) { - wprintw(window, "Invalid syntax.\n"); - return; - } - - if (argv[1] == NULL || argv[2] == NULL) { - wprintw(window, "Invalid syntax.\n"); - return; - } - - uint8_t *friendname = argv[1]; - int groupnum = atoi(argv[2]); - - if (friendname[0] == '\"') - friendname[strlen(++friendname)-1] = L'\0'; - - int friendnum = get_friendnum(friendname); - - if (friendnum == -1) { - wprintw(window, "Friend '%s' not found.\n", friendname); - return; - } - - if (tox_invite_friend(m, friendnum, groupnum) == -1) { - wprintw(window, "Failed to invite friend.\n"); - return; - } - - wprintw(window, "Invited '%s' to group chat %d.\n", friendname, groupnum); -} - void cmd_join(WINDOW *window, ToxWindow *prompt, Tox *m, int argc, char **argv) { if (argc != 1) { @@ -400,7 +367,7 @@ void cmd_note(WINDOW *window, ToxWindow *prompt, Tox *m, int argc, char **argv) } if (msg[0] != '\"') { - wprintw(window, "Messages must be enclosed in quotes.\n"); + wprintw(window, "Note must be enclosed in quotes.\n"); return; } @@ -415,71 +382,6 @@ void cmd_quit(WINDOW *window, ToxWindow *prompt, Tox *m, int argc, char **argv) exit_toxic(m); } -void cmd_sendfile(WINDOW *window, ToxWindow *prompt, Tox *m, int argc, char **argv) -{ - if (argc < 1) { - wprintw(window, "Wrong number of arguments.\n"); - return; - } - - uint8_t *friendname = argv[1]; - - int friendnum = get_friendnum(friendname); - - if (friendnum == -1) { - wprintw(window, "Friend '%s' not found.\n", friendname); - return; - } - - if (friendname[0] == '\"') - friendname[strlen(++friendname)-1] = L'\0'; - - uint8_t *filename = argv[2]; - int filename_len = strlen(filename); - - if (filename[0] != '\"') { - wprintw(window, "File name must be enclosed in quotes.\n"); - return; - } - - filename[strlen(++filename)-1] = L'\0'; - - if (filename_len > MAX_STR_SIZE) { - wprintw(window, "File path exceeds character limit.\n"); - return; - } - - FILE *file_to_send = fopen(filename, "r"); - - if (file_to_send == NULL) { - wprintw(window, "File '%s' not found.\n", filename); - return; - } - - fseek(file_to_send, 0, SEEK_END); - uint64_t filesize = ftell(file_to_send); - fseek(file_to_send, 0, SEEK_SET); - - int filenum = tox_new_filesender(m, friendnum, filesize, filename, filename_len + 1); - - if (filenum == -1) { - wprintw(window, "Error sending file\n"); - return; - } - - memcpy(file_senders[num_file_senders].filename, filename, filename_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(window, "Sending file '%s' to %s...\n", filename, friendname); - ++num_file_senders; -} - void cmd_status(WINDOW *window, ToxWindow *prompt, Tox *m, int argc, char **argv) { uint8_t *msg = NULL; @@ -494,7 +396,7 @@ void cmd_status(WINDOW *window, ToxWindow *prompt, Tox *m, int argc, char **argv } if (msg[0] != '\"') { - wprintw(window, "Messages must be enclosed in quotes.\n"); + wprintw(window, "Note must be enclosed in quotes.\n"); return; } } else if (argc != 1) { diff --git a/src/commands.h b/src/commands.h index 3d48cc8..dd7f5cc 100644 --- a/src/commands.h +++ b/src/commands.h @@ -7,21 +7,19 @@ void cmd_accept(WINDOW *, ToxWindow *, Tox *m, int, char **); void cmd_add(WINDOW *, ToxWindow *, Tox *m, int, char **); void cmd_clear(WINDOW *, ToxWindow *, Tox *m, int, char **); void cmd_connect(WINDOW *, ToxWindow *, Tox *m, int, char **); -void cmd_file(WINDOW *, ToxWindow *, Tox *m, int, char **); +void cmd_savefile(WINDOW *, ToxWindow *, Tox *m, int, char **); void cmd_groupchat(WINDOW *, ToxWindow *, Tox *m, int, char **); -void cmd_invite(WINDOW *, ToxWindow *, Tox *m, int, char **); void cmd_join(WINDOW *, ToxWindow *, Tox *m, int, char **); void cmd_msg(WINDOW *, ToxWindow *, Tox *m, int, char **); void cmd_myid(WINDOW *, ToxWindow *, Tox *m, int, char **); void cmd_nick(WINDOW *, ToxWindow *, Tox *m, int, char **); void cmd_note(WINDOW *, ToxWindow *, Tox *m, int, char **); void cmd_quit(WINDOW *, ToxWindow *, Tox *m, int, char **); -void cmd_sendfile(WINDOW *, ToxWindow *, Tox *m, int, char **); void cmd_status(WINDOW *, ToxWindow *, Tox *m, int, char **); void execute(WINDOW *window, ToxWindow *prompt, Tox *m, char *u_cmd, int buf_len); -#define NUM_COMMANDS 17 +#define NUM_COMMANDS 15 static struct { char *name; @@ -32,9 +30,8 @@ static struct { { "/clear", cmd_clear }, { "/connect", cmd_connect }, { "/exit", cmd_quit }, - { "/file", cmd_file }, + { "/savefile", cmd_savefile }, { "/groupchat", cmd_groupchat }, - { "/invite", cmd_invite }, { "/join", cmd_join }, { "/msg", cmd_msg }, { "/myid", cmd_myid }, @@ -42,6 +39,5 @@ static struct { { "/note", cmd_note }, { "/q", cmd_quit }, { "/quit", cmd_quit }, - { "/sendfile", cmd_sendfile }, { "/status", cmd_status }, }; diff --git a/src/groupchat.c b/src/groupchat.c index db11c15..f5cdde7 100644 --- a/src/groupchat.c +++ b/src/groupchat.c @@ -79,7 +79,6 @@ static void print_groupchat_help(ChatContext *ctx) wprintw(ctx->history, " /status : Set your status with optional note\n"); wprintw(ctx->history, " /note : Set a personal note\n"); wprintw(ctx->history, " /nick : Set your nickname\n"); - wprintw(ctx->history, " /invite : Invite friend to a groupchat\n"); wprintw(ctx->history, " /groupchat : Create a group chat\n"); wprintw(ctx->history, " /myid : Print your ID\n"); wprintw(ctx->history, " /clear : Clear the screen\n"); diff --git a/src/main.c b/src/main.c index 550ccf7..9429499 100644 --- a/src/main.c +++ b/src/main.c @@ -371,7 +371,7 @@ void do_file_senders(Tox *m) /* TODO: move this alert to chat window */ wprintw(prompt->window, "File '%s' successfuly sent to %s.\n", - file_senders[i].filename, file_senders[i].friendname); + file_senders[i].pathname, file_senders[i].friendname); return; } } diff --git a/src/prompt.c b/src/prompt.c index 4e6e8ab..d5fb7a5 100644 --- a/src/prompt.c +++ b/src/prompt.c @@ -92,7 +92,6 @@ static void print_prompt_help(ToxWindow *self) wprintw(self->window, " /note : Set a personal note\n"); wprintw(self->window, " /nick : Set your nickname\n"); wprintw(self->window, " /join : Join a group chat\n"); - wprintw(self->window, " /invite : Invite friend to a groupchat\n"); wprintw(self->window, " /groupchat : Create a group chat\n"); wprintw(self->window, " /myid : Print your ID\n"); wprintw(self->window, " /quit or /exit : Exit Toxic\n"); diff --git a/src/toxic_windows.h b/src/toxic_windows.h index 37c3e8c..2d0d504 100644 --- a/src/toxic_windows.h +++ b/src/toxic_windows.h @@ -108,7 +108,7 @@ typedef struct { uint8_t nextpiece[FILE_PIECE_SIZE]; uint16_t piecelen; uint8_t friendname[TOXIC_MAX_NAME_LENGTH]; - uint8_t filename[MAX_STR_SIZE]; + uint8_t pathname[MAX_STR_SIZE]; } FileSender; FileSender file_senders[NUM_FILE_SENDERS]; @@ -128,7 +128,7 @@ void on_statusmessagechange(Tox *m, int friendnumber, uint8_t *string, uint16_t void on_friendadded(Tox *m, int friendnumber); void on_groupmessage(Tox *m, int groupnumber, int peernumber, uint8_t *message, uint16_t length, void *userdata); void on_groupinvite(Tox *m, int friendnumber, uint8_t *group_pub_key, void *userdata); -void on_file_sendrequest(Tox *m, int friendnumber, uint8_t filenumber, uint64_t filesize, uint8_t *filename, uint16_t filename_length, void *userdata); +void on_file_sendrequest(Tox *m, int friendnumber, uint8_t filenumber, uint64_t filesize, uint8_t *pathname, uint16_t pathname_length, void *userdata); void on_file_control(Tox *m, int friendnumber, uint8_t receive_send, uint8_t filenumber, uint8_t control_type, uint8_t *data, uint16_t length, void *userdata); void on_file_data(Tox *m, int friendnumber, uint8_t filenumber, uint8_t *data, uint16_t length, void *userdata);