|
|
|
@ -17,7 +17,7 @@ |
|
|
|
#define FT_DATA 2 /* tid:16, offset:8, bytes */ |
|
|
|
#define FT_DATA 2 /* tid:16, offset:8, bytes */ |
|
|
|
#define FT_DONE 3 /* tid:16 */ |
|
|
|
#define FT_DONE 3 /* tid:16 */ |
|
|
|
#define FT_REFUSE 4 /* tid:16 */ |
|
|
|
#define FT_REFUSE 4 /* tid:16 */ |
|
|
|
#define FT_CHUNK 32768u |
|
|
|
#define FT_CHUNK 8192u /* Вместе с подписью и полным путём помещается в кодограмму router (16 КиБ). */ |
|
|
|
#define FT_MAX_OPS 16 |
|
|
|
#define FT_MAX_OPS 16 |
|
|
|
|
|
|
|
|
|
|
|
struct file_transfer { |
|
|
|
struct file_transfer { |
|
|
|
@ -114,7 +114,7 @@ static void ft_pump(void* arg) { |
|
|
|
op->pump = NULL; |
|
|
|
op->pump = NULL; |
|
|
|
if (!op->up || op->receiving) return; |
|
|
|
if (!op->up || op->receiving) return; |
|
|
|
struct file_transfer* ft = op->ft; |
|
|
|
struct file_transfer* ft = op->ft; |
|
|
|
for (unsigned i = 0; i < 1 && op->offset < op->size; i++) { |
|
|
|
if (op->offset < op->size) { |
|
|
|
if (!etcp_router_send_q_has_room(ft->inst, op->group, op->peer, ETCP_RT_ID_FILE_TRANSFER)) { |
|
|
|
if (!etcp_router_send_q_has_room(ft->inst, op->group, op->peer, ETCP_RT_ID_FILE_TRANSFER)) { |
|
|
|
etcp_router_on_send_ready(ft->inst, op->group, op->peer, ETCP_RT_ID_FILE_TRANSFER, &op->waiter, ft_ready, op); |
|
|
|
etcp_router_on_send_ready(ft->inst, op->group, op->peer, ETCP_RT_ID_FILE_TRANSFER, &op->waiter, ft_ready, op); |
|
|
|
return; |
|
|
|
return; |
|
|
|
@ -130,7 +130,8 @@ static void ft_pump(void* arg) { |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
int error = ft_send(ft, op->group, op->peer, FT_DATA, body, 24 + n); |
|
|
|
int error = ft_send(ft, op->group, op->peer, FT_DATA, body, 24 + n); |
|
|
|
if (error) return; |
|
|
|
if (error < 0) { ft_finish(op, -1); return; } |
|
|
|
|
|
|
|
if (error > 0) return; |
|
|
|
op->offset += n; |
|
|
|
op->offset += n; |
|
|
|
op->progress_tb = get_time_tb(); |
|
|
|
op->progress_tb = get_time_tb(); |
|
|
|
} |
|
|
|
} |
|
|
|
|