/* * This file is part of mlDHT. * * mlDHT is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * mlDHT is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with mlDHT. If not, see <http://www.gnu.org/licenses/>. */ package lbms.plugins.mldht.kad; import java.net.InetAddress; import java.util.*; import lbms.plugins.mldht.kad.messages.GetPeersResponse; import lbms.plugins.mldht.kad.utils.AddressUtils; import lbms.plugins.mldht.utils.Blackhole; public class ScrapeResponseHandler { private List<GetPeersResponse> scrapeResponses = new ArrayList<GetPeersResponse>(20); private int scrapeSeeds; private int scrapePeers; private int direct; public void addGetPeersRespone(GetPeersResponse gpr) { scrapeResponses.add(gpr); } public int getScrapedPeers() { return scrapePeers; } public int getScrapedSeeds() { return scrapeSeeds; } public int getDirectResultCount() { return direct; } public void process() { List<BloomFilterBEP33> seedFilters = new ArrayList<BloomFilterBEP33>(); List<BloomFilterBEP33> peerFilters = new ArrayList<BloomFilterBEP33>(); Set<InetAddress> directPeers = new HashSet<InetAddress>(); // process seeds first, we need them for some checks later (not yet implemented) for(int i=0;i<scrapeResponses.size();i++) { GetPeersResponse response = scrapeResponses.get(i); BloomFilterBEP33 f = response.getScrapeSeeds(); if(f != null) seedFilters.add(f); } scrapeSeeds = BloomFilterBEP33.unionSize(seedFilters); for(int i=0;i<scrapeResponses.size();i++) { GetPeersResponse response = scrapeResponses.get(i); BloomFilterBEP33 f = response.getScrapePeers(); Set<InetAddress> addrs = new HashSet<InetAddress>(); for(DBItem item : response.getPeerItems()) { if (item instanceof PeerAddressDBItem) { PeerAddressDBItem peer = (PeerAddressDBItem) item; if(!AddressUtils.isBogon(peer)) addrs.add(peer.getInetAddress()); } } directPeers.addAll(addrs); if(f == null) { // TODO cross-check with seed filters f = new BloomFilterBEP33(); for(InetAddress addr : addrs) f.insert(addr); } peerFilters.add(f); } scrapePeers = BloomFilterBEP33.unionSize(peerFilters); direct = directPeers.size(); // we extracted the results, no need to retain all the networking stuff, replace it with a dummy scrapeResponses = (List<GetPeersResponse>) Blackhole.SINGLETON; } }