new realization of cancel download

This commit is contained in:
2026-06-05 16:26:39 +03:00
parent 8ef755b0a7
commit 9988e5e7af
6 changed files with 40 additions and 2 deletions
+15
View File
@@ -5,6 +5,7 @@
#include "file_p.h" #include "file_p.h"
#include "main.h" #include "main.h"
#include "session.h" #include "session.h"
#include "utils.h"
#include <fcntl.h> #include <fcntl.h>
#include <stdint.h> #include <stdint.h>
#include <stdio.h> #include <stdio.h>
@@ -85,3 +86,17 @@ void process_client_command(char *line, session *sess, server_data_t *s_d) {
session_send_string(sess, "OK. Bye!\n"); 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;
}
}
+1 -1
View File
@@ -6,5 +6,5 @@
#include "main.h" #include "main.h"
void process_client_command(char *line, session *sess, server_data_t *s_d); 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 #endif
+16 -1
View File
@@ -183,6 +183,7 @@ int32_t file_send_prepare(session *sess, char *line, server_data_t *s_d) {
sess->file->rest = fsize; sess->file->rest = fsize;
sess->fd = file_d; sess->fd = file_d;
sess->file->package_rest = PACKAGE_SIZE;
return 0; return 0;
} }
@@ -294,7 +295,15 @@ void file_download(session *sess) {
int source_d = sess->fd; int source_d = sess->fd;
int dest_d = sess->sd; int dest_d = sess->sd;
char buf[INBUFSIZE]; 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 (rlen == 0) {
if (sess->file->rest) { if (sess->file->rest) {
print_log(stdout, pl_error, "Error downloading file %s!\n", print_log(stdout, pl_error, "Error downloading file %s!\n",
@@ -312,11 +321,17 @@ void file_download(session *sess) {
sess->state = ERR; sess->state = ERR;
} }
sess->file->rest -= rlen; sess->file->rest -= rlen;
sess->file->package_rest -= rlen;
if (!sess->file->rest) { if (!sess->file->rest) {
print_log(stdout, pl_info, "File %s is downloaded from the server\n", print_log(stdout, pl_info, "File %s is downloaded from the server\n",
sess->file->name); sess->file->name);
clear_file_from_sess(sess); clear_file_from_sess(sess);
sess->state = OP_WAIT; sess->state = OP_WAIT;
return;
}
if (sess->file->package_rest == 0) {
sess->state = OP_DOWNLOAD_WAIT_CONFIRM_PACKAGE;
} }
} }
+2
View File
@@ -16,6 +16,7 @@
#define FILE_DESCRIPTIONS_NAME "./file_descriptions" #define FILE_DESCRIPTIONS_NAME "./file_descriptions"
#define FILE_USER_LIST_NAME "userlist" #define FILE_USER_LIST_NAME "userlist"
#define WELCOME_FILE_NAME "welcome" #define WELCOME_FILE_NAME "welcome"
#define PACKAGE_SIZE INBUFSIZE * 10
#ifndef __USE_MISC #ifndef __USE_MISC
#define __USE_MISC #define __USE_MISC
@@ -31,6 +32,7 @@ enum sess_states {
OP_WAIT, OP_WAIT,
OP_UPLOAD, OP_UPLOAD,
OP_UPLOAD_DESCRIPTION, OP_UPLOAD_DESCRIPTION,
OP_DOWNLOAD_WAIT_CONFIRM_PACKAGE,
ERR, ERR,
FIN FIN
}; };
+3
View File
@@ -58,6 +58,9 @@ void server_main_loop(server_data_t *s_d) {
maxfd = i; maxfd = i;
/* active uploads/downloads */ /* active uploads/downloads */
if (connections[i]->fd > -1) { if (connections[i]->fd > -1) {
if (connections[i]->state == OP_DOWNLOAD_WAIT_CONFIRM_PACKAGE) {
continue;
}
int fd = connections[i]->fd; int fd = connections[i]->fd;
FD_SET(fd, &readfds); FD_SET(fd, &readfds);
if (fd > maxfd) if (fd > maxfd)
+3
View File
@@ -211,6 +211,9 @@ void perform_session_action(session *sess, char *line, server_data_t *s_d) {
} }
} }
break; break;
case OP_DOWNLOAD_WAIT_CONFIRM_PACKAGE:
download_confirm(line, sess, s_d);
break;
} }
/* } */ /* } */
} }