new realization of cancel download
This commit is contained in:
@@ -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
@@ -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
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
/* } */
|
/* } */
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user