~ubuntu-branches/debian/experimental/libtorrent/experimental

« back to all changes in this revision

Viewing changes to src/protocol/request_list.cc

  • Committer: Bazaar Package Importer
  • Author(s): Qingning Huo
  • Date: 2006-01-12 20:47:33 UTC
  • mto: (4.1.1 edgy) (6.2.1 squeeze) (1.3.1 upstream)
  • mto: This revision was merged to the branch mainline in revision 4.
  • Revision ID: james.westby@ubuntu.com-20060112204733-2vw5t3vdne40s8mq
Tags: upstream-0.8.2
ImportĀ upstreamĀ versionĀ 0.8.2

Show diffs side-by-side

added added

removed removed

Lines of Context:
49
49
 
50
50
namespace torrent {
51
51
 
 
52
struct request_list_same_piece {
 
53
  request_list_same_piece(const Piece& p) : m_piece(p) {}
 
54
 
 
55
  bool operator () (const DelegatorReservee* d) {
 
56
    return
 
57
      m_piece.get_index() == d->get_piece().get_index() &&
 
58
      m_piece.get_offset() == d->get_piece().get_offset();
 
59
  }
 
60
 
 
61
  Piece m_piece;
 
62
};
 
63
 
52
64
const Piece*
53
65
RequestList::delegate() {
54
66
  DelegatorReservee* r = m_delegator->delegate(m_peerChunks, m_affinity);
88
100
bool
89
101
RequestList::downloading(const Piece& p) {
90
102
  if (m_downloading)
91
 
    throw internal_error("RequestList::downloading(...) bug, m_downloaing is already set");
 
103
    throw internal_error("RequestList::downloading(...) bug, m_downloading is already set");
92
104
 
93
105
  remove_invalid();
94
106
 
95
107
  ReserveeList::iterator itr =
96
108
    std::find_if(m_reservees.begin(), m_reservees.end(),
97
 
                 rak::equal(p, std::mem_fun(&DelegatorReservee::get_piece)));
 
109
                 //rak::equal(p, std::mem_fun(&DelegatorReservee::get_piece)));
 
110
                 request_list_same_piece(p));
98
111
  
99
112
  if (itr == m_reservees.end()) {
100
113
    itr = std::find_if(m_canceled.begin(), m_canceled.end(),
101
 
                       rak::equal(p, std::mem_fun(&DelegatorReservee::get_piece)));
 
114
                       //rak::equal(p, std::mem_fun(&DelegatorReservee::get_piece)));
 
115
                       request_list_same_piece(p));
102
116
 
103
117
    if (itr == m_canceled.end())
104
118
      return false;
105
119
 
 
120
    // The iterator needs to remain valid.
106
121
    m_reservees.push_front(*itr);
107
122
    m_canceled.erase(itr);
108
123
 
110
125
    cancel_range(itr);
111
126
  }
112
127
  
 
128
  // Make sure pieces are removed from the reservee list if the peer
 
129
  // returns zero length pieces.
 
130
  if (p.get_length() != (*itr)->get_piece().get_length()) {
 
131
    m_reservees.erase(itr);
 
132
    return false;
 
133
  }
 
134
 
113
135
  m_downloading = true;
114
136
 
115
137
  if (p != m_reservees.front()->get_piece())