use of com.biglybt.pif.peers.Peer in project BiglyBT by BiglySoftware.
the class SpeedLimitHandler method peersAdded.
private void peersAdded(Download download, PeerManager peer_manager, Peer[] peers) {
IPSet[] sets;
long[][][] set_ranges;
Set[] set_ccs;
Set[] set_nets;
boolean has_ccs = false;
boolean has_nets = false;
Set<String> category_or_tags = null;
TagManager tm = TagManagerFactory.getTagManager();
synchronized (this) {
int len = current_ip_sets.size();
sets = new IPSet[len];
set_ranges = new long[len][][];
set_ccs = new Set[len];
set_nets = new Set[len];
int pos = 0;
for (IPSet set : current_ip_sets.values()) {
sets[pos] = set;
set_ranges[pos] = set.getRanges();
set_ccs[pos] = set.getCountryCodes();
set_nets[pos] = set.getNetworks();
if (set_ccs[pos].size() > 0) {
has_ccs = true;
}
if (set_nets[pos].size() > 0) {
has_nets = true;
}
pos++;
if (category_or_tags == null && set.getCategoriesOrTags() != null) {
category_or_tags = new HashSet<>();
String cat = download.getAttribute(category_attribute);
if (cat != null && cat.length() > 0) {
category_or_tags.add(cat);
}
List<Tag> tags = tm.getTagsForTaggable(TagType.TT_DOWNLOAD_MANUAL, PluginCoreUtils.unwrap(download));
for (Tag t : tags) {
category_or_tags.add(t.getTagName(true));
}
}
}
}
if (sets.length == 0) {
return;
}
for (Peer peer : peers) {
List<RateLimiter> rlu_tbr;
List<RateLimiter> rld_tbr;
synchronized (RL_TO_BE_REMOVED_LOCK) {
rlu_tbr = (List<RateLimiter>) peer.getUserData(RLU_TO_BE_REMOVED_KEY);
rld_tbr = (List<RateLimiter>) peer.getUserData(RLD_TO_BE_REMOVED_KEY);
if (rlu_tbr != null) {
peer.setUserData(RLU_TO_BE_REMOVED_KEY, null);
}
if (rld_tbr != null) {
peer.setUserData(RLD_TO_BE_REMOVED_KEY, null);
}
}
try {
long[] entry = (long[]) peer.getUserData(ip_set_peer_key);
long l_address;
if (entry == null) {
l_address = 0;
String ip = peer.getIp();
if (!ip.contains(":")) {
byte[] bytes = HostNameToIPResolver.hostAddressToBytes(ip);
if (bytes != null) {
l_address = ((long) ((bytes[0] << 24) & 0xff000000 | (bytes[1] << 16) & 0x00ff0000 | (bytes[2] << 8) & 0x0000ff00 | bytes[3] & 0x000000ff)) & 0xffffffffL;
}
}
entry = new long[] { l_address };
peer.setUserData(ip_set_peer_key, entry);
} else {
l_address = entry[0];
}
String peer_cc = null;
String peer_net = null;
if (has_ccs) {
String[] details = PeerUtils.getCountryDetails(peer);
if (details != null && details.length > 0) {
peer_cc = details[0];
}
}
if (has_nets) {
peer_net = AENetworkClassifier.categoriseAddress(peer.getIp());
}
Set<IPSet> added_to_sets = new HashSet<>();
if (l_address != 0) {
for (int i = 0; i < set_ranges.length; i++) {
long[][] ranges = set_ranges[i];
if (ranges.length == 0) {
continue;
}
IPSet set = sets[i];
boolean is_inverse = set.isInverse();
Set<String> set_cats_or_tags = set.getCategoriesOrTags();
if (set_cats_or_tags == null || new HashSet<>(set_cats_or_tags).removeAll(category_or_tags)) {
boolean hit = false;
for (long[] range : ranges) {
if (l_address >= range[0] && l_address <= range[1]) {
hit = true;
if (!is_inverse) {
addLimiters(peer_manager, peer, set, rlu_tbr, rld_tbr);
added_to_sets.add(set);
}
break;
}
}
if (is_inverse && !hit) {
addLimiters(peer_manager, peer, set, rlu_tbr, rld_tbr);
added_to_sets.add(set);
}
}
}
}
if (peer_cc != null) {
for (int i = 0; i < set_ccs.length; i++) {
IPSet set = sets[i];
if (added_to_sets.contains(set)) {
continue;
}
Set<String> ccs = set_ccs[i];
if (ccs.size() == 0) {
continue;
}
boolean not_inverse = !set.isInverse();
Set<String> set_cats_or_tags = set.getCategoriesOrTags();
if (set_cats_or_tags == null || new HashSet<>(set_cats_or_tags).removeAll(category_or_tags)) {
boolean hit = ccs.contains(peer_cc);
if (hit == not_inverse) {
addLimiters(peer_manager, peer, set, rlu_tbr, rld_tbr);
added_to_sets.add(set);
}
}
}
}
if (peer_net != null) {
String pub_peer_net = null;
String pub_lan = null;
if (peer_net == AENetworkClassifier.AT_PUBLIC) {
try {
byte[] address = InetAddress.getByName(peer.getIp()).getAddress();
pub_peer_net = address.length == 4 ? NET_IPV4 : NET_IPV6;
} catch (Throwable e) {
}
if (peer.isLANLocal()) {
pub_lan = NET_LAN;
} else {
pub_lan = NET_WAN;
}
}
for (int i = 0; i < set_nets.length; i++) {
IPSet set = sets[i];
if (added_to_sets.contains(set)) {
continue;
}
Set<String> nets = set_nets[i];
if (nets.size() == 0) {
continue;
}
boolean not_inverse = !set.isInverse();
Set<String> set_cats_or_tags = set.getCategoriesOrTags();
if (set_cats_or_tags == null || new HashSet<>(set_cats_or_tags).removeAll(category_or_tags)) {
boolean hit = nets.contains(peer_net);
if (!hit) {
if (pub_peer_net != null) {
hit = nets.contains(pub_peer_net);
}
if (!hit && pub_lan != null) {
hit = nets.contains(pub_lan);
}
}
if (hit == not_inverse) {
addLimiters(peer_manager, peer, set, rlu_tbr, rld_tbr);
added_to_sets.add(set);
}
}
}
}
} finally {
if (rlu_tbr != null) {
for (RateLimiter l : rlu_tbr) {
peer.removeRateLimiter(l, true);
}
}
if (rld_tbr != null) {
for (RateLimiter l : rld_tbr) {
peer.removeRateLimiter(l, false);
}
}
}
}
}
use of com.biglybt.pif.peers.Peer in project BiglyBT by BiglySoftware.
the class PluginCoreUtils method convert.
public static Object convert(Object datasource, boolean toCore) {
if (datasource instanceof Object[]) {
Object[] array = (Object[]) datasource;
Object[] newArray = new Object[array.length];
for (int i = 0; i < array.length; i++) {
Object o = array[i];
newArray[i] = convert(o, toCore);
}
return newArray;
}
try {
if (toCore) {
if (datasource instanceof com.biglybt.core.download.DownloadManager) {
return datasource;
}
if (datasource instanceof DownloadImpl) {
return ((DownloadImpl) datasource).getDownload();
}
if (datasource instanceof com.biglybt.core.disk.DiskManager) {
return datasource;
}
if (datasource instanceof DiskManagerImpl) {
return ((DiskManagerImpl) datasource).getDiskmanager();
}
if (datasource instanceof PEPeerManager) {
return datasource;
}
if (datasource instanceof PeerManagerImpl) {
return ((PeerManagerImpl) datasource).getDelegate();
}
if (datasource instanceof PEPeer) {
return datasource;
}
if (datasource instanceof PeerImpl) {
return ((PeerImpl) datasource).getPEPeer();
}
if (datasource instanceof com.biglybt.core.disk.DiskManagerFileInfo) {
return datasource;
}
if (datasource instanceof com.biglybt.pifimpl.local.disk.DiskManagerFileInfoImpl) {
return ((com.biglybt.pifimpl.local.disk.DiskManagerFileInfoImpl) datasource).getCore();
}
if (datasource instanceof TRHostTorrent) {
return datasource;
}
if (datasource instanceof TrackerTorrentImpl) {
((TrackerTorrentImpl) datasource).getHostTorrent();
}
} else {
// to PI
if (datasource instanceof com.biglybt.core.download.DownloadManager) {
return wrap((com.biglybt.core.download.DownloadManager) datasource);
}
if (datasource instanceof DownloadImpl) {
return datasource;
}
if (datasource instanceof com.biglybt.core.disk.DiskManager) {
return wrap((com.biglybt.core.disk.DiskManager) datasource);
}
if (datasource instanceof DiskManagerImpl) {
return datasource;
}
if (datasource instanceof PEPeerManager) {
return wrap((PEPeerManager) datasource);
}
if (datasource instanceof PeerManagerImpl) {
return datasource;
}
if (datasource instanceof PEPeer) {
return PeerManagerImpl.getPeerForPEPeer((PEPeer) datasource);
}
if (datasource instanceof Peer) {
return datasource;
}
if (datasource instanceof com.biglybt.core.disk.DiskManagerFileInfo) {
DiskManagerFileInfo fileInfo = (com.biglybt.core.disk.DiskManagerFileInfo) datasource;
if (fileInfo != null) {
try {
DownloadManager dm = fileInfo.getDownloadManager();
return new com.biglybt.pifimpl.local.disk.DiskManagerFileInfoImpl(dm == null ? null : DownloadManagerImpl.getDownloadStatic(dm), fileInfo);
} catch (DownloadException e) {
/* Ignore */
}
}
}
if (datasource instanceof com.biglybt.pifimpl.local.disk.DiskManagerFileInfoImpl) {
return datasource;
}
if (datasource instanceof TRHostTorrent) {
TRHostTorrent item = (TRHostTorrent) datasource;
return new TrackerTorrentImpl(item);
}
if (datasource instanceof TrackerTorrentImpl) {
return datasource;
}
}
} catch (Throwable t) {
Debug.out(t);
}
return datasource;
}
use of com.biglybt.pif.peers.Peer in project BiglyBT by BiglySoftware.
the class SpeedLimitHandler method checkIPSetsSupport.
private synchronized void checkIPSetsSupport() {
final com.biglybt.pif.download.DownloadManager download_manager = plugin_interface.getDownloadManager();
if (current_dml != null) {
current_dml.destroy();
current_dml = null;
}
Download[] downloads = download_manager.getDownloads();
for (Download dm : downloads) {
PeerManager pm = dm.getPeerManager();
if (pm != null) {
Peer[] peers = pm.getPeers();
for (Peer peer : peers) {
RateLimiter[] lims = peer.getRateLimiters(false);
for (RateLimiter l : lims) {
if (ip_set_rate_limiters_down.containsValue(l)) {
synchronized (RL_TO_BE_REMOVED_LOCK) {
List<RateLimiter> to_be_removed = (List<RateLimiter>) peer.getUserData(RLD_TO_BE_REMOVED_KEY);
if (to_be_removed == null) {
to_be_removed = new ArrayList<>();
peer.setUserData(RLD_TO_BE_REMOVED_KEY, to_be_removed);
}
to_be_removed.add(l);
}
// defer as removing the rate limiter and then re-adding it gives time for
// quite a lot to happen in between
// peer.removeRateLimiter( l , false );
}
}
lims = peer.getRateLimiters(true);
for (RateLimiter l : lims) {
if (ip_set_rate_limiters_up.containsValue(l)) {
synchronized (RL_TO_BE_REMOVED_LOCK) {
List<RateLimiter> to_be_removed = (List<RateLimiter>) peer.getUserData(RLU_TO_BE_REMOVED_KEY);
if (to_be_removed == null) {
to_be_removed = new ArrayList<>();
peer.setUserData(RLU_TO_BE_REMOVED_KEY, to_be_removed);
}
to_be_removed.add(l);
}
// peer.removeRateLimiter( l , true );
}
}
}
}
}
ip_set_rate_limiters_down.clear();
ip_set_rate_limiters_up.clear();
boolean has_cats_or_tags = false;
for (IPSet set : current_ip_sets.values()) {
ip_set_rate_limiters_down.put(set.getName(), set.getDownLimiter());
ip_set_rate_limiters_up.put(set.getName(), set.getUpLimiter());
if (set.getCategoriesOrTags() != null) {
has_cats_or_tags = true;
}
set.removeAllPeers();
}
if (current_ip_sets.size() == 0) {
if (ip_set_event != null) {
ip_set_event.cancel();
ip_set_event = null;
}
} else {
if (ip_set_event == null) {
ip_set_event = SimpleTimer.addPeriodicEvent("speed handler ip set scheduler", 1000, new TimerEventPerformer() {
private int tick_count;
@Override
public void perform(TimerEvent event) {
tick_count++;
synchronized (SpeedLimitHandler.this) {
for (IPSet set : current_ip_sets.values()) {
set.updateStats(tick_count);
}
/*
if ( tick_count % 30 == 0 ){
String str = "";
for ( IPSet set: current_ip_sets.values()){
str += (str.length()==0?"":", ") + set.getString();
}
logger.log( str );
}
*/
}
}
});
}
current_dml = new DML(download_manager, has_cats_or_tags);
}
}
use of com.biglybt.pif.peers.Peer in project BiglyBT by BiglySoftware.
the class LocProvUtils method addColumns.
private void addColumns() {
synchronized (this) {
if (cl_installed || active_provider == null) {
return;
}
TableManager tm = core.getPluginManager().getDefaultPluginInterface().getUIManager().getTableManager();
String[] peer_tables = new String[] { TableManager.TABLE_TORRENT_PEERS, TableManager.TABLE_ALL_PEERS };
for (int i = 0; i < peer_tables.length; i++) {
TableColumn iso3166Column = tm.createColumn(peer_tables[i], "CountryCode");
iso3166Column.initialize(TableColumn.ALIGN_LEAD, TableColumn.POSITION_LAST, 30, TableColumn.INTERVAL_INVALID_ONLY);
iso3166Column.addCellRefreshListener(new TableCellRefreshListener() {
@Override
public void refresh(TableCell cell) {
Peer peer = (Peer) cell.getDataSource();
String s = getCountryCode(peer);
if (!cell.setSortValue(s) && cell.isValid()) {
return;
}
cell.setText(s);
}
});
tm.addColumn(iso3166Column);
columns.add(iso3166Column);
// Country Name
TableColumn countryColumn = tm.createColumn(peer_tables[i], "Country");
countryColumn.initialize(TableColumn.ALIGN_LEAD, TableColumn.POSITION_INVISIBLE, 80, TableColumn.INTERVAL_INVALID_ONLY);
countryColumn.addCellRefreshListener(new TableCellRefreshListener() {
@Override
public void refresh(TableCell cell) {
Peer peer = (Peer) cell.getDataSource();
String s = getCountryName(peer);
if (!cell.setSortValue(s) && cell.isValid()) {
return;
}
cell.setText(s);
}
});
tm.addColumn(countryColumn);
columns.add(countryColumn);
// Small Flags
TableColumn flagsColumn = tm.createColumn(peer_tables[i], "CountryFlagSmall");
flagsColumn.initialize(TableColumn.ALIGN_LEAD, TableColumn.POSITION_INVISIBLE, 25, TableColumn.INTERVAL_INVALID_ONLY);
flagsColumn.setType(TableColumn.TYPE_GRAPHIC);
FlagListener flagListener = new FlagListener(true);
flagsColumn.addCellRefreshListener(flagListener);
flagsColumn.addCellToolTipListener(flagListener);
tm.addColumn(flagsColumn);
columns.add(flagsColumn);
// Normal Flags
flagsColumn = tm.createColumn(peer_tables[i], "CountryFlag");
flagsColumn.initialize(TableColumn.ALIGN_LEAD, TableColumn.POSITION_LAST, 25, TableColumn.INTERVAL_INVALID_ONLY);
flagsColumn.setType(TableColumn.TYPE_GRAPHIC);
flagListener = new FlagListener(false);
flagsColumn.addCellRefreshListener(flagListener);
flagsColumn.addCellToolTipListener(flagListener);
tm.addColumn(flagsColumn);
columns.add(flagsColumn);
}
}
}
use of com.biglybt.pif.peers.Peer in project BiglyBT by BiglySoftware.
the class DHTPluginImpl method checkForReSeed.
public void checkForReSeed(boolean force) {
int seed_limit = 32;
try {
long[] router_stats = dht.getRouter().getStats().getStats();
if (router_stats[DHTRouterStats.ST_CONTACTS_LIVE] < seed_limit || force) {
if (force) {
log.log("Reseeding");
} else {
log.log("Less than 32 live contacts, reseeding");
}
int peers_imported = 0;
if (network == DHT.NW_AZ_MAIN || network == DHT.NW_AZ_MAIN_V6) {
// first look for peers to directly import
Download[] downloads = plugin_interface.getDownloadManager().getDownloads();
outer: for (int i = 0; i < downloads.length; i++) {
Download download = downloads[i];
PeerManager pm = download.getPeerManager();
if (pm == null) {
continue;
}
Peer[] peers = pm.getPeers();
for (int j = 0; j < peers.length; j++) {
Peer p = peers[j];
int peer_udp_port = p.getUDPNonDataListenPort();
if (peer_udp_port != 0) {
boolean is_v6 = p.getIp().contains(":");
if (is_v6 == v6) {
String ip = p.getIp();
if (AENetworkClassifier.categoriseAddress(ip) == AENetworkClassifier.AT_PUBLIC) {
if (importSeed(ip, peer_udp_port) != null) {
peers_imported++;
if (peers_imported > seed_limit) {
break outer;
}
}
}
}
}
}
}
if (peers_imported < 16) {
List<InetSocketAddress> list = VersionCheckClient.getSingleton().getDHTBootstrap(network != DHT.NW_AZ_MAIN_V6);
for (InetSocketAddress address : list) {
if (importSeed(address) != null) {
peers_imported++;
if (peers_imported > seed_limit) {
break;
}
}
}
}
} else if (network == DHT.NW_BIGLYBT_MAIN) {
List<InetSocketAddress> list = VersionCheckClient.getSingleton().getDHTBootstrap(true);
for (InetSocketAddress address : list) {
if (importSeed(address) != null) {
peers_imported++;
if (peers_imported > seed_limit) {
break;
}
}
}
}
DHTTransportContact root_to_remove = null;
if (peers_imported == 0) {
root_to_remove = importRootSeed();
if (root_to_remove != null) {
peers_imported++;
}
}
if (peers_imported > 0) {
integrateDHT(false, root_to_remove);
} else {
log.log("No valid peers found to reseed from");
}
}
} catch (Throwable e) {
log.log(e);
}
}
Aggregations