5 * Created by Victor Grishchenko on 10/6/09.
6 * Copyright 2009 Delft University of Technology. All rights reserved.
10 #include "compat/unixio.h"
18 #include "compat/util.h"
22 std::vector<FileTransfer*> FileTransfer::files(20);
24 int FileTransfer::instance = 0;
25 #define BINHASHSIZE (sizeof(bin64_t)+sizeof(Sha1Hash))
27 #include "ext/seq_picker.cpp"
29 // FIXME: separate Bootstrap() and Download(), then Size(), Progress(), SeqProgress()
31 FileTransfer::FileTransfer (const char* filename, const Sha1Hash& _root_hash) :
32 file_(filename,_root_hash), hs_in_offset_(0)
34 if (files.size()<fd()+1)
37 picker_ = new SeqPiecePicker(this);
39 picker_->Randomize(rand()&31&(file_.peak(0).width()-1));
44 FileTransfer::~FileTransfer ()
51 FileTransfer* FileTransfer::Find (const Sha1Hash& root_hash) {
52 for(int i=0; i<files.size(); i++)
53 if (files[i] && files[i]->root_hash()==root_hash)
59 void FileTransfer::OnPexIn (const Address& addr) {
60 for(int i=0; i<hs_in_.size(); i++) {
61 Channel* c = Channel::channels[hs_in_[i]];
62 if (c && c->transfer().fd()==this->fd() && c->peer_==addr)
63 return; // already connected
65 if (hs_in_.size()<20) {
66 new Channel(this,Channel::sockets[0],addr);
68 pex_in_.push_back(addr);
69 if (pex_in_.size()>1000)
75 int FileTransfer::RevealChannel (int& pex_out_) {
76 pex_out_ -= hs_in_offset_;
79 while (pex_out_<hs_in_.size()) {
80 Channel* c = Channel::channels[hs_in_[pex_out_]];
81 if (c && c->transfer().fd()==this->fd()) {
82 pex_out_ += hs_in_offset_ + 1;
85 hs_in_[pex_out_] = hs_in_[0];
90 pex_out_ += hs_in_offset_;