#include "deluge.h"
void
pieceinit(Piece *p, int n, uchar *hash, ulong length)
{
p->n = n;
memmove(p->hash, hash, Piecehashlen);
p->ids = nil;
p->nids = 0;
p->length = length;
p->bites = bitnew((length+Bitelength-1) / Bitelength, nil);
p->reqbites = bitnew((length+Bitelength-1) / Bitelength, nil);
}
int
piecehaspeer(Piece *p, int id)
{
int i;
for(i = 0; i < p->nids; i++)
if(p->ids[i] == id)
return 1;
return 0;
}
void
pieceaddpeer(Piece *p, int id)
{
if(piecehaspeer(p, id))
return;
p->ids = erealloc(p->ids, sizeof p->ids[0] * (p->nids+1));
p->ids[p->nids] = id;
p->nids++;
}
void
pieceremovepeer(Piece *p, int id)
{
int i;
for(i = 0; i < p->nids; i++){
if(p->ids[i] == id){
p->ids[i] = p->ids[p->nids-1];
p->ids[p->nids-1] = -1;
p->nids--;
break;
}
}
}
void
pieceaddpeerhaves(Torrent *t, Peer *p)
{
int i;
DEBUG(2, "pieceaddpeerhaves: p->pieces=%B\n", p->pieces);
for(i = 0; i < t->npieces; i++)
if(bitget(p->pieces, i))
pieceaddpeer(&t->pieces[i], p->n);
}
void
pieceremoveid(Piece *pc, int peern)
{
int i;
for(i = 0; i < pc->nids; i++)
if(pc->ids[i] == peern){
pc->ids[i] = pc->ids[pc->nids-1];
pc->nids--;
return;
}
}
|