experimental cancel of upload
This commit is contained in:
+53
-10
@@ -197,6 +197,7 @@ int file_receive_prepare(session *sess, char *line, server_data_t *s_d) {
|
||||
sess->file->path = malloc(sizeof(STORAGE_FOLDER) + 2 + 9);
|
||||
sess->file->permissions = (char)perm;
|
||||
sess->file->description = NULL;
|
||||
sess->file->package_rest = 0;
|
||||
strncpy(sess->file->name, name_begin, name_len);
|
||||
sess->file->name[name_len] = 0;
|
||||
|
||||
@@ -286,19 +287,15 @@ void clear_file_from_sess(session *s) {
|
||||
s->file = NULL;
|
||||
}
|
||||
|
||||
void file_load(session *sess, enum f_actions f_action) {
|
||||
int source_d = f_action == F_DOWNLOAD ? sess->fd : sess->sd;
|
||||
int dest_d = f_action == F_DOWNLOAD ? sess->sd : sess->fd;
|
||||
/* download to the client */
|
||||
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);
|
||||
if (rlen == 0) {
|
||||
if (sess->file->rest) {
|
||||
if (f_action == F_DOWNLOAD) {
|
||||
fprintf(stderr, "Error downloading file %s!\n", sess->file->name);
|
||||
} else {
|
||||
fprintf(stderr, "Error uploading file %s!\n", sess->file->name);
|
||||
unlink(sess->file->path); /* remove file */
|
||||
}
|
||||
clear_file_from_sess(sess);
|
||||
}
|
||||
sess->state = OP_WAIT;
|
||||
@@ -307,16 +304,62 @@ void file_load(session *sess, enum f_actions f_action) {
|
||||
write(dest_d, buf, rlen);
|
||||
sess->file->rest -= rlen;
|
||||
if (!sess->file->rest) {
|
||||
if (f_action == F_DOWNLOAD) {
|
||||
printf("File %s is downloaded from the server\n", sess->file->name);
|
||||
clear_file_from_sess(sess);
|
||||
sess->state = OP_WAIT;
|
||||
}
|
||||
}
|
||||
|
||||
/* upload to the server */
|
||||
void file_upload(session *sess) {
|
||||
int source_d = sess->sd;
|
||||
int dest_d = sess->fd;
|
||||
char buf[INBUFSIZE];
|
||||
int rlen = read(source_d, buf, INBUFSIZE);
|
||||
if (rlen == 0) {
|
||||
if (sess->file->rest) {
|
||||
fprintf(stderr, "Error uploading file %s!\n", sess->file->name);
|
||||
unlink(sess->file->path); /* remove file */
|
||||
clear_file_from_sess(sess);
|
||||
}
|
||||
sess->state = OP_WAIT;
|
||||
return;
|
||||
}
|
||||
if (sess->file->package_rest < rlen) {
|
||||
write(dest_d, buf, sess->file->package_rest);
|
||||
s_file_pd_t *fpd = (s_file_pd_t *)buf + sess->file->package_rest;
|
||||
switch (fpd->signal) {
|
||||
case sig_continue:
|
||||
sess->file->package_rest = fpd->package_size;
|
||||
rlen -= sizeof(s_file_pd_t);
|
||||
if (rlen > 0) {
|
||||
write(dest_d, buf + sizeof(s_file_pd_t), rlen);
|
||||
}
|
||||
break;
|
||||
case sig_cancel:
|
||||
fprintf(stderr, "Upload of %s is cancelled!\n", sess->file->name);
|
||||
unlink(sess->file->path); /* remove file */
|
||||
clear_file_from_sess(sess);
|
||||
sess->state = OP_WAIT;
|
||||
return;
|
||||
case sig_finish:
|
||||
/* TODO: implement */
|
||||
case sig_pause:
|
||||
/* TODO: implement */
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
write(dest_d, buf, rlen);
|
||||
}
|
||||
|
||||
sess->file->rest -= rlen;
|
||||
sess->file->package_rest -= rlen;
|
||||
if (!sess->file->rest) {
|
||||
printf("File %s is uploaded to the server\n", sess->file->name);
|
||||
session_send_string(sess, "finished\n");
|
||||
if (db_save_file(sess)) {
|
||||
clear_file_from_sess(sess);
|
||||
}
|
||||
}
|
||||
sess->state = OP_WAIT;
|
||||
}
|
||||
}
|
||||
|
||||
+8
-4
@@ -5,22 +5,26 @@
|
||||
#define FILEP_H
|
||||
#include "main.h"
|
||||
#include <stdint.h>
|
||||
void clear_list(fl_t *start);
|
||||
|
||||
typedef struct {
|
||||
int32_t page;
|
||||
int32_t limit;
|
||||
char *name;
|
||||
} i_file_list_t;
|
||||
void file_list(session *, server_data_t *, i_file_list_t *l_args);
|
||||
int file_send_prepare(session *, char *, server_data_t *);
|
||||
|
||||
enum f_actions {
|
||||
F_UPLOAD,
|
||||
F_DOWNLOAD,
|
||||
};
|
||||
void file_load(session *sess, enum f_actions);
|
||||
|
||||
void clear_list(fl_t *start);
|
||||
void file_list(session *, server_data_t *, i_file_list_t *l_args);
|
||||
int file_send_prepare(session *, char *, server_data_t *);
|
||||
int file_receive_prepare(session *sess, char *line, server_data_t *s_d);
|
||||
int file_upload_description(session *sess, char *line, server_data_t *s_d);
|
||||
int file_save_db(session *sess, server_data_t *s_d);
|
||||
void clear_file_from_sess(session *);
|
||||
int directory_exists(const char *path);
|
||||
void file_download(session *sess);
|
||||
void file_upload(session *sess);
|
||||
#endif
|
||||
+13
@@ -54,11 +54,24 @@ typedef struct {
|
||||
char permissions;
|
||||
size_t size;
|
||||
size_t rest;
|
||||
size_t package_rest;
|
||||
int32_t hash;
|
||||
int32_t id;
|
||||
int32_t owner_id;
|
||||
} s_file_t;
|
||||
|
||||
enum package_signal {
|
||||
sig_continue,
|
||||
sig_cancel,
|
||||
sig_finish,
|
||||
sig_pause
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
enum package_signal signal;
|
||||
size_t package_size;
|
||||
} s_file_pd_t; /* file package descriptor */
|
||||
|
||||
typedef struct fl_t {
|
||||
char *name;
|
||||
char *description;
|
||||
|
||||
+2
-2
@@ -149,10 +149,10 @@ void perform_session_action(session *sess, char *line, server_data_t *s_d) {
|
||||
process_client_command(line, sess, s_d);
|
||||
break;
|
||||
case OP_DOWNLOAD:
|
||||
file_load(sess, F_DOWNLOAD);
|
||||
file_download(sess);
|
||||
break;
|
||||
case OP_UPLOAD:
|
||||
file_load(sess, F_UPLOAD);
|
||||
file_upload(sess);
|
||||
break;
|
||||
case OP_UPLOAD_DESCRIPTION:
|
||||
res = file_upload_description(sess, line, s_d);
|
||||
|
||||
Reference in New Issue
Block a user