Limit active pieces and expose file list
This commit is contained in:
parent
ff8e0f5f5b
commit
6dc711cf57
6 changed files with 117 additions and 3 deletions
|
|
@ -285,6 +285,51 @@ static void snapshot_tracker_stats(naut_swarm_stats *stats,
|
|||
stats->tracker_stats[i] = trackers[i];
|
||||
}
|
||||
|
||||
static void snapshot_file_stats(naut_swarm_stats *stats,
|
||||
const naut_download *download,
|
||||
const naut_metainfo *metainfo) {
|
||||
if (!stats || !metainfo || !metainfo->files) return;
|
||||
uint64_t offset = 0;
|
||||
uint32_t count = 0;
|
||||
for (size_t i = 0;
|
||||
i < metainfo->num_files && count < NAUT_SWARM_MAX_FILE_STATS;
|
||||
i++) {
|
||||
const naut_file *file = &metainfo->files[i];
|
||||
uint64_t size = file->length > 0 ? (uint64_t)file->length : 0;
|
||||
uint64_t done = 0;
|
||||
if (download && size > 0) {
|
||||
uint64_t start = offset;
|
||||
uint64_t end = offset + size;
|
||||
uint32_t first = (uint32_t)(start / (uint64_t)metainfo->piece_length);
|
||||
uint32_t last = (uint32_t)((end - 1) /
|
||||
(uint64_t)metainfo->piece_length);
|
||||
for (uint32_t p = first; p <= last; p++) {
|
||||
if (!naut_download_have(download, p)) continue;
|
||||
uint64_t piece_start = (uint64_t)p *
|
||||
(uint64_t)metainfo->piece_length;
|
||||
uint64_t piece_end = piece_start +
|
||||
(uint64_t)metainfo->piece_length;
|
||||
if (piece_end > (uint64_t)metainfo->total_length)
|
||||
piece_end = (uint64_t)metainfo->total_length;
|
||||
uint64_t lo = piece_start > start ? piece_start : start;
|
||||
uint64_t hi = piece_end < end ? piece_end : end;
|
||||
if (hi > lo) done += hi - lo;
|
||||
}
|
||||
}
|
||||
naut_swarm_file_stats *out = &stats->file_stats[count++];
|
||||
memset(out, 0, sizeof(*out));
|
||||
snprintf(out->path, sizeof out->path, "%s",
|
||||
file->path ? file->path : "");
|
||||
out->size = size;
|
||||
out->progress = size ? (double)done / (double)size : 1.0;
|
||||
if (out->progress > 1.0) out->progress = 1.0;
|
||||
out->priority = 1;
|
||||
out->availability = 1.0;
|
||||
offset += size;
|
||||
}
|
||||
stats->file_count = count;
|
||||
}
|
||||
|
||||
static void report_progress(const naut_swarm_config *config,
|
||||
const naut_download *download,
|
||||
const naut_metainfo *metainfo,
|
||||
|
|
@ -308,6 +353,7 @@ static void report_progress(const naut_swarm_config *config,
|
|||
};
|
||||
snapshot_peer_stats(&stats, peers, npeers, metainfo->num_pieces);
|
||||
snapshot_tracker_stats(&stats, trackers, tracker_count);
|
||||
snapshot_file_stats(&stats, download, metainfo);
|
||||
if (download) {
|
||||
stats.piece_state_count = (uint32_t)naut_download_piece_states(
|
||||
download, stats.piece_states, NAUT_SWARM_MAX_PIECE_STATS);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue