PieceInfo Storage::GetPieceInfo(UINT pieceIndex) const { PieceInfoCollection::const_iterator iter = m_dataPieces.find(pieceIndex); if (iter == m_dataPieces.end()) return PieceInfo(); return iter->second; }
void PieceManager::ResetPiecesInfo() { m_is_endgame = false; assert(m_storage.IsOpen()); for(StartedPiecesMap::iterator it = m_started_pieces.begin(); it != m_started_pieces.end(); ++it) { delete it->second; } m_started_pieces.clear(); assert(m_torrent_file.GetPieceCount() == m_bitfield.NBits()); assert(m_torrent_file.GetPieceCount() > 0); m_pieces_info.clear(); m_pieces_info.reserve(m_torrent_file.GetPieceCount()); m_pos_in_interests.clear(); m_pos_in_interests.reserve(m_torrent_file.GetPieceCount()); for(size_t i = 0; i < m_torrent_file.GetPieceCount(); ++i) { m_pieces_info.push_back(PieceInfo(P_FREE, 0)); m_pos_in_interests.push_back(NONE_POS); } assert(m_pieces_info.size() == m_bitfield.NBits()); m_interests.clear(); m_interests.push_back(std::vector<t_uint32>(0)); std::vector<t_uint32> &pieces_list = m_interests[0]; for(size_t i = 0; i < m_pieces_info.size(); ++i) { if(m_bitfield.IsSet(i)) { m_pieces_info[i].state = P_DONE; } else { pieces_list.push_back(i); } } srand(TimeSpace::CycleTimer::GetCycleCount()); std::random_shuffle(pieces_list.begin(), pieces_list.end()); for(size_t i = 0; i < pieces_list.size(); ++i) { m_pos_in_interests[pieces_list[i]] = i; } if(need_enter_endgame()) { m_is_endgame = true; } }
PieceInfo Storage::GetFirstPiece() const { if (m_dataPieces.empty()) return PieceInfo(); return m_dataPieces.begin()->second; }
bool Storage::AddDataPiece(MediaDataPiecePtr piece) { CheckDataPiece(piece); // const BYTE* packetBuffer = packet->GetMediaData(); // LIVE_ASSERT( packetBuffer[0] == (char)0x82 && packetBuffer[1] == (char)0 && packetBuffer[2] == (char)0 ); // LIVE_ASSERT( ( packetBuffer[3] & (char)0x80 ) == (char)0x00 ); // no error correction // LIVE_ASSERT( packetBuffer[4] == (char)0x5D ); // payload length type OK UINT pieceIndex = piece->GetPieceIndex(); //m_unfinishedDataPieces.Remove(pieceIndex); pair<PieceInfoCollection::iterator, bool> result = m_dataPieces.insert(make_pair(pieceIndex, PieceInfo(piece))); if (!result.second) { STREAMBUFFER_WARN("Recv an already had DataPacket, index = "<<pieceIndex); return false; } m_pieceSize = (UINT)piece->GetPieceLength(); //LIMIT_MIN(m_MaxSubPieceCountPerPiece, packet->GetSubPieceCount(MAX_SUB_PIECE_DATA_SIZE)); return true; }