Exemple #1
0
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;
    }


}
Exemple #3
0
PieceInfo Storage::GetFirstPiece() const
{
	if (m_dataPieces.empty())
		return PieceInfo();
	return m_dataPieces.begin()->second;
}
Exemple #4
0
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;
}