new realization of cancel download
This commit is contained in:
@@ -5,6 +5,7 @@
|
||||
#include "file_p.h"
|
||||
#include "main.h"
|
||||
#include "session.h"
|
||||
#include "utils.h"
|
||||
#include <fcntl.h>
|
||||
#include <stdint.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");
|
||||
}
|
||||
}
|
||||
|
||||
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
@@ -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
|
||||
+16
-1
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
/* } */
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user