diff --git a/src/client.c b/src/client.c index 10bfbd7..ee4b26e 100644 --- a/src/client.c +++ b/src/client.c @@ -5,6 +5,7 @@ #include "file_p.h" #include "main.h" #include "session.h" +#include "utils.h" #include #include #include @@ -84,4 +85,18 @@ void process_client_command(char *line, session *sess, server_data_t *s_d) { sess->reason = EXIT; session_send_string(sess, "OK. Bye!\n"); } +} + +void download_confirm(char *line, session *sess, server_data_t *s_d) { + if (!strncmp(line, "continue", sizeof "continue" - 1)) { + sess->state = OP_DOWNLOAD; + sess->file->package_rest = PACKAGE_SIZE; + return; + } + if (!strncmp(line, "cancel", sizeof "cancel" - 1)) { + print_log(stdout, pl_info, "Downloading of %s is canceled by the client\n", + sess->file->name); + clear_file_from_sess(sess); + sess->state = OP_WAIT; + } } \ No newline at end of file diff --git a/src/client.h b/src/client.h index 8d49da6..711f93e 100644 --- a/src/client.h +++ b/src/client.h @@ -6,5 +6,5 @@ #include "main.h" void process_client_command(char *line, session *sess, server_data_t *s_d); - +void download_confirm(char *line, session *sess, server_data_t *s_d); #endif \ No newline at end of file diff --git a/src/file_p.c b/src/file_p.c index 93031ec..cdf9b24 100644 --- a/src/file_p.c +++ b/src/file_p.c @@ -183,6 +183,7 @@ int32_t file_send_prepare(session *sess, char *line, server_data_t *s_d) { sess->file->rest = fsize; sess->fd = file_d; + sess->file->package_rest = PACKAGE_SIZE; return 0; } @@ -294,7 +295,15 @@ void file_download(session *sess) { int source_d = sess->fd; int dest_d = sess->sd; char buf[INBUFSIZE]; - int rlen = read(source_d, buf, INBUFSIZE); + int read_len; + + if (sess->file->package_rest < INBUFSIZE) { + read_len = sess->file->package_rest; + } else { + read_len = INBUFSIZE; + } + + int rlen = read(source_d, buf, read_len); if (rlen == 0) { if (sess->file->rest) { print_log(stdout, pl_error, "Error downloading file %s!\n", @@ -312,11 +321,17 @@ void file_download(session *sess) { sess->state = ERR; } sess->file->rest -= rlen; + sess->file->package_rest -= rlen; if (!sess->file->rest) { print_log(stdout, pl_info, "File %s is downloaded from the server\n", sess->file->name); clear_file_from_sess(sess); sess->state = OP_WAIT; + return; + } + + if (sess->file->package_rest == 0) { + sess->state = OP_DOWNLOAD_WAIT_CONFIRM_PACKAGE; } } diff --git a/src/main.h b/src/main.h index ead3e55..6ad81dd 100644 --- a/src/main.h +++ b/src/main.h @@ -16,6 +16,7 @@ #define FILE_DESCRIPTIONS_NAME "./file_descriptions" #define FILE_USER_LIST_NAME "userlist" #define WELCOME_FILE_NAME "welcome" +#define PACKAGE_SIZE INBUFSIZE * 10 #ifndef __USE_MISC #define __USE_MISC @@ -31,6 +32,7 @@ enum sess_states { OP_WAIT, OP_UPLOAD, OP_UPLOAD_DESCRIPTION, + OP_DOWNLOAD_WAIT_CONFIRM_PACKAGE, ERR, FIN }; diff --git a/src/server.c b/src/server.c index 8902f15..cb1a07d 100644 --- a/src/server.c +++ b/src/server.c @@ -58,6 +58,9 @@ void server_main_loop(server_data_t *s_d) { maxfd = i; /* active uploads/downloads */ if (connections[i]->fd > -1) { + if (connections[i]->state == OP_DOWNLOAD_WAIT_CONFIRM_PACKAGE) { + continue; + } int fd = connections[i]->fd; FD_SET(fd, &readfds); if (fd > maxfd) diff --git a/src/session.c b/src/session.c index d715f34..24ce2ab 100644 --- a/src/session.c +++ b/src/session.c @@ -211,6 +211,9 @@ void perform_session_action(session *sess, char *line, server_data_t *s_d) { } } break; + case OP_DOWNLOAD_WAIT_CONFIRM_PACKAGE: + download_confirm(line, sess, s_d); + break; } /* } */ }