diff --git a/src/media_delivery/media_delivery.c b/src/media_delivery/media_delivery.c index 389f73a3..7247c6bd 100644 --- a/src/media_delivery/media_delivery.c +++ b/src/media_delivery/media_delivery.c @@ -1384,40 +1384,16 @@ void media_delivery_cancel_channel(struct UTUN_INSTANCE* inst, uint64_t group_id if (stream->group_id == group_id) stream_free(stream); stream = next; } - struct relay_fwd_ctx* forward = md->forwards; - while (forward) { - struct relay_fwd_ctx* next = forward->next; - if (forward->group_id == group_id) relay_fwd_free(forward); - forward = next; - } - - /* 1. собрать media_id активных загрузок этого канала и отменить их */ - uint8_t media_ids[MEDIA_MAX_DOWNLOADS][16]; + /* Callback отмены может изменить остальные загрузки: каждый раз ищем следующую заново. */ int nm = 0; - if (md->downloads) { - struct ll_entry* de = md->downloads->head; - while (de) { - struct media_download* dl = (struct media_download*)de->data; - struct ll_entry* next = de->next; - if (dl->group_id == group_id) { - if (nm < MEDIA_MAX_DOWNLOADS) memcpy(media_ids[nm++], dl->media_id, 16); - media_download_cancel(inst, dl->media_id, NULL, 0); - } - de = next; - } - } - - /* 2. удалить relay-контексты этих media (остаются после отмены загрузки) */ - for (int i = 0; i < nm; i++) { - if (!md->relay_blocks) break; - struct ll_entry* re = md->relay_blocks->head; - while (re) { - struct relay_block_ctx* rc = (struct relay_block_ctx*)re->data; - struct ll_entry* next = re->next; - if (memcmp(rc->media_id, media_ids[i], 16) == 0) - md_relay_remove(md, rc->block_id); - re = next; + for (;;) { + struct media_download* found = NULL; + for (struct ll_entry* e = md->downloads ? md->downloads->head : NULL; e; e = e->next) { + struct media_download* dl = (struct media_download*)e->data; + if (dl->group_id == group_id) { found = dl; break; } } + if (!found) break; + media_download_cancel(inst, found->media_id, NULL, 0); nm++; } /* 3. удалить super_peers этой группы */ diff --git a/src/media_delivery/media_download.c b/src/media_delivery/media_download.c index bf783fed..67f683c6 100644 --- a/src/media_delivery/media_download.c +++ b/src/media_delivery/media_download.c @@ -13,6 +13,7 @@ #include "../routing_layer/etcp_router.h" #include "../routing_layer/conn_mgr.h" #include "../routing_layer/topo_group.h" +#include "../routing_layer/topo_node_sqlite.h" #include "../transport_layer/etcp_api.h" #include "../transport_layer/secure_channel.h" #include "../lib/debug_config.h" @@ -24,6 +25,7 @@ #include #include #include +#include #define MDL_ID "media_download" @@ -55,11 +57,14 @@ static int md_dl_block_inflight(const struct media_download_block* block) { } static int md_dl_reset_block_file(struct media_download* dl, int bi) { - char tmp[2048]; - snprintf(tmp, sizeof(tmp), "%s.chunk_%d", dl->dest_path, bi); - FILE* f = fopen(tmp, "wb"); - if (f && !fclose(f)) return 0; - DEBUG_ERROR(DEBUG_CATEGORY_MEDIA, "%s: cannot reset block file %s: %s", MDL_ID, tmp, strerror(errno)); return -1; + struct media_download_block* b = &dl->blocks[bi]; + if (b->source) { md_block_abort(b->source); md_block_release(b->source); b->source = NULL; } + if (RAND_bytes(b->transfer_id, sizeof(b->transfer_id)) != 1) { + DEBUG_ERROR(DEBUG_CATEGORY_MEDIA, "%s: transfer UUID generation failed block=%d", MDL_ID, bi); return -1; + } + b->source = md_block_create(&dl->inst->md, dl->group_id, dl->media_id, b->block_id, + (uint32_t)bi, b->expected_size, dl->dest_path); + return b->source ? 0 : -1; } static struct media_download_peer* md_dl_get_peer(struct media_download* dl, uint64_t node_id) { @@ -130,11 +135,10 @@ static int md_dl_send_block_req(struct UTUN_INSTANCE* inst, uint64_t dst, struct struct media_pkt_block_req req; memset(&req, 0, sizeof(req)); req.subcmd = MEDIA_SUBCMD_BLOCK_REQ; - req.group_id = dl->group_id; memcpy(req.media_id, dl->media_id, 16); memcpy(req.block_id, dl->blocks[bi].block_id, 16); + memcpy(req.transfer_id, dl->blocks[bi].transfer_id, 16); req.chunk = (uint32_t)bi; - req.offset = 0; DEBUG_INFO(DEBUG_CATEGORY_MEDIA, "%s: BLOCK_REQ to 0x%016llx blk=%d/%d block_id=%02x%02x%02x%02x...", MDL_ID, (unsigned long long)dst, bi, dl->num_blocks,