use of com.biglybt.core.tracker.client.impl.bt.TRTrackerBTAnnouncerImpl in project BiglyBT by BiglySoftware.
the class TRTrackerAnnouncerMuxer method create.
private TRTrackerAnnouncerHelper create(TOTorrent torrent, String[] networks, TOTorrentAnnounceURLSet[] sets) throws TRTrackerAnnouncerException {
TRTrackerAnnouncerHelper announcer;
boolean decentralised;
if (sets.length == 0) {
decentralised = TorrentUtils.isDecentralised(torrent.getAnnounceURL());
} else {
decentralised = TorrentUtils.isDecentralised(sets[0].getAnnounceURLs()[0]);
}
if (decentralised) {
announcer = new TRTrackerDHTAnnouncerImpl(torrent, networks, is_manual, getHelper());
} else {
announcer = new TRTrackerBTAnnouncerImpl(getTorrentHashOverride(), torrent, sets, networks, is_manual, getHelper());
}
for (TOTorrentAnnounceURLSet set : sets) {
URL[] urls = set.getAnnounceURLs();
for (URL u : urls) {
String key = u.toExternalForm();
StatusSummary summary = recent_responses.get(key);
if (summary == null) {
summary = new StatusSummary(announcer, u);
recent_responses.put(key, summary);
} else {
summary.setHelper(announcer);
}
}
}
if (provider != null) {
announcer.setAnnounceDataProvider(provider);
}
if (ip_override != null) {
announcer.setIPOverride(ip_override);
}
return (announcer);
}
use of com.biglybt.core.tracker.client.impl.bt.TRTrackerBTAnnouncerImpl in project BiglyBT by BiglySoftware.
the class TRTrackerAnnouncerMuxer method split.
protected void split(boolean first_time) throws TRTrackerAnnouncerException {
String[] networks = f_provider == null ? null : f_provider.getNetworks();
boolean force_recreate = false;
if (!first_time) {
if (current_networks != networks) {
if (current_networks == null || networks == null) {
force_recreate = true;
} else {
if (networks.length != current_networks.length) {
force_recreate = true;
} else {
for (String net1 : current_networks) {
boolean match = false;
for (String net2 : networks) {
if (net1 == net2) {
match = true;
}
}
if (!match) {
force_recreate = true;
break;
}
}
}
}
}
}
current_networks = networks;
TRTrackerAnnouncerHelper to_activate = null;
synchronized (this) {
if (stopped || destroyed) {
return;
}
TOTorrent torrent = getTorrent();
TOTorrentAnnounceURLSet[] sets = torrent.getAnnounceURLGroup().getAnnounceURLSets();
if (sets.length == 0) {
sets = new TOTorrentAnnounceURLSet[] { torrent.getAnnounceURLGroup().createAnnounceURLSet(new URL[] { torrent.getAnnounceURL() }) };
} else {
boolean found_decentralised = false;
boolean modified = false;
for (int i = 0; i < sets.length; i++) {
TOTorrentAnnounceURLSet set = sets[i];
URL[] urls = set.getAnnounceURLs().clone();
for (int j = 0; j < urls.length; j++) {
URL u = urls[j];
if (u != null && TorrentUtils.isDecentralised(u)) {
if (found_decentralised) {
modified = true;
urls[j] = null;
} else {
found_decentralised = true;
}
}
}
}
if (modified) {
List<TOTorrentAnnounceURLSet> s_list = new ArrayList<>();
for (TOTorrentAnnounceURLSet set : sets) {
URL[] urls = set.getAnnounceURLs();
List<URL> u_list = new ArrayList<>(urls.length);
for (URL u : urls) {
if (u != null) {
u_list.add(u);
}
}
if (u_list.size() > 0) {
s_list.add(torrent.getAnnounceURLGroup().createAnnounceURLSet(u_list.toArray(new URL[u_list.size()])));
}
}
sets = s_list.toArray(new TOTorrentAnnounceURLSet[s_list.size()]);
}
}
List<TOTorrentAnnounceURLSet[]> new_sets = new ArrayList<>();
if (is_manual || sets.length < 2) {
new_sets.add(sets);
} else {
List<TOTorrentAnnounceURLSet> list = new ArrayList<>(Arrays.asList(sets));
while (list.size() > 0) {
TOTorrentAnnounceURLSet set1 = list.remove(0);
boolean done = false;
URL[] urls1 = set1.getAnnounceURLs();
if (urls1.length == 1) {
URL url1 = urls1[0];
String prot1 = url1.getProtocol().toLowerCase();
String host1 = url1.getHost();
for (int i = 0; i < list.size(); i++) {
TOTorrentAnnounceURLSet set2 = list.get(i);
URL[] urls2 = set2.getAnnounceURLs();
if (urls2.length == 1) {
URL url2 = urls2[0];
String prot2 = url2.getProtocol().toLowerCase();
String host2 = url2.getHost();
if (host1.equals(host2)) {
if ((prot1.equals("udp") && prot2.startsWith("http")) || (prot2.equals("udp") && prot1.startsWith("http"))) {
list.remove(i);
new_sets.add(new TOTorrentAnnounceURLSet[] { set1, set2 });
done = true;
}
}
}
}
}
if (!done) {
new_sets.add(new TOTorrentAnnounceURLSet[] { set1 });
}
}
}
// work out the difference
Iterator<TOTorrentAnnounceURLSet[]> ns_it = new_sets.iterator();
// need to copy list as we modify it and returned list ain't thread safe
List<TRTrackerAnnouncerHelper> existing_announcers = new ArrayList<>(announcers.getList());
List<TRTrackerAnnouncerHelper> new_announcers = new ArrayList<>();
if (!force_recreate) {
while (ns_it.hasNext()) {
TOTorrentAnnounceURLSet[] ns = ns_it.next();
Iterator<TRTrackerAnnouncerHelper> a_it = existing_announcers.iterator();
while (a_it.hasNext()) {
TRTrackerAnnouncerHelper a = a_it.next();
TOTorrentAnnounceURLSet[] os = a.getAnnounceSets();
if (same(ns, os)) {
ns_it.remove();
a_it.remove();
new_announcers.add(a);
break;
}
}
}
}
// first remove dht ones from the equation
TRTrackerAnnouncerHelper existing_dht_announcer = null;
TOTorrentAnnounceURLSet[] new_dht_set = null;
ns_it = new_sets.iterator();
while (ns_it.hasNext()) {
TOTorrentAnnounceURLSet[] x = ns_it.next();
if (TorrentUtils.isDecentralised(x[0].getAnnounceURLs()[0])) {
new_dht_set = x;
ns_it.remove();
break;
}
}
Iterator<TRTrackerAnnouncerHelper> an_it = existing_announcers.iterator();
while (an_it.hasNext()) {
TRTrackerAnnouncerHelper a = an_it.next();
TOTorrentAnnounceURLSet[] x = a.getAnnounceSets();
if (TorrentUtils.isDecentralised(x[0].getAnnounceURLs()[0])) {
existing_dht_announcer = a;
an_it.remove();
break;
}
}
if (existing_dht_announcer != null && new_dht_set != null) {
new_announcers.add(existing_dht_announcer);
} else if (existing_dht_announcer != null) {
activated.remove(existing_dht_announcer);
existing_dht_announcer.destroy();
} else if (new_dht_set != null) {
TRTrackerAnnouncerHelper a = create(torrent, networks, new_dht_set);
new_announcers.add(a);
}
// create any new ones required
ns_it = new_sets.iterator();
while (ns_it.hasNext()) {
TOTorrentAnnounceURLSet[] s = ns_it.next();
TRTrackerAnnouncerHelper a = create(torrent, networks, s);
new_announcers.add(a);
}
// finally fix up the announcer list to represent the new state
Iterator<TRTrackerAnnouncerHelper> a_it = announcers.iterator();
while (a_it.hasNext()) {
TRTrackerAnnouncerHelper a = a_it.next();
if (!new_announcers.contains(a)) {
a_it.remove();
try {
if (activated.contains(a) && torrent.getPrivate() && a instanceof TRTrackerBTAnnouncerImpl) {
URL url = a.getTrackerURL();
if (url != null) {
forceStop((TRTrackerBTAnnouncerImpl) a, networks, url);
}
}
} finally {
if (Logger.isEnabled()) {
Logger.log(new LogEvent(getTorrent(), LOGID, "Deactivating " + getString(a.getAnnounceSets())));
}
activated.remove(a);
a.destroy();
}
}
}
a_it = new_announcers.iterator();
while (a_it.hasNext()) {
TRTrackerAnnouncerHelper a = a_it.next();
if (!announcers.contains(a)) {
announcers.add(a);
}
}
if (!is_manual && announcers.size() > 0) {
if (activated.size() == 0) {
TRTrackerAnnouncerHelper a = announcers.get(0);
if (Logger.isEnabled()) {
Logger.log(new LogEvent(getTorrent(), LOGID, "Activating " + getString(a.getAnnounceSets())));
}
activated.add(a);
last_activation_time = SystemTime.getMonotonousTime();
if (provider != null) {
to_activate = a;
}
}
setupActivationCheck(ACT_CHECK_INIT_DELAY);
}
}
if (to_activate != null) {
if (complete) {
to_activate.complete(true);
} else {
to_activate.update(false);
}
}
}
Aggregations