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