use of com.biglybt.core.torrent.TOTorrentAnnounceURLSet in project BiglyBT by BiglySoftware.
the class TrackerNameItem method getTrackerName.
public static String getTrackerName(TOTorrent torrent) {
String name = "";
Set<String> pref_names = preferred_tracker_names;
URL url = null;
if (pref_names != null) {
TOTorrentAnnounceURLSet[] sets = torrent.getAnnounceURLGroup().getAnnounceURLSets();
if (sets.length > 0) {
String host = torrent.getAnnounceURL().getHost();
if (pref_names.contains(host)) {
url = torrent.getAnnounceURL();
} else {
for (TOTorrentAnnounceURLSet set : sets) {
URL[] urls = set.getAnnounceURLs();
for (URL u : urls) {
if (pref_names.contains(u.getHost())) {
url = u;
break;
}
}
if (url != null) {
break;
}
}
}
}
}
if (url == null) {
url = torrent.getAnnounceURL();
}
String host = url.getHost();
if (host.endsWith(".dht")) {
name = "dht";
} else {
if (AENetworkClassifier.categoriseAddress(host) == AENetworkClassifier.AT_PUBLIC) {
String[] parts = host.split("\\.");
int used = 0;
for (int i = parts.length - 1; i >= 0; i--) {
// don't use more than 4 segments
if (used > 4)
break;
String chunk = parts[i];
if (used < 2 || chunk.length() < 11) {
// use first end two always, but trim out >10 chars (passkeys)
if (used == 0)
name = chunk;
else
name = chunk + "." + name;
used++;
} else
break;
}
} else {
name = host;
}
}
if (name.equals(host)) {
name = host;
} else {
name = StringInterner.intern(name);
}
return name;
}
use of com.biglybt.core.torrent.TOTorrentAnnounceURLSet in project BiglyBT by BiglySoftware.
the class AENetworkClassifier method getNetworks.
public static String[] getNetworks(TOTorrent torrent, String display_name) {
// go through all the announce URL and find all networks
List<URL> urls = new ArrayList();
urls.add(torrent.getAnnounceURL());
TOTorrentAnnounceURLSet[] sets = torrent.getAnnounceURLGroup().getAnnounceURLSets();
for (int i = 0; i < sets.length; i++) {
URL[] u = sets[i].getAnnounceURLs();
Collections.addAll(urls, u);
}
List<String> available_networks = new ArrayList<>();
for (int i = 0; i < urls.size(); i++) {
URL u = (URL) urls.get(i);
String network = categoriseAddress(u.getHost());
if (!available_networks.contains(network)) {
available_networks.add(network);
}
}
if (available_networks.size() == 1 && available_networks.get(0) == AT_PUBLIC) {
return (new String[] { AT_PUBLIC });
}
boolean prompt = COConfigurationManager.getBooleanParameter("Network Selection Prompt");
List<String> res = new ArrayList<>();
if (prompt && listeners.size() > 0) {
String[] t_nets = new String[available_networks.size()];
available_networks.toArray(t_nets);
for (int i = 0; i < listeners.size(); i++) {
try {
String[] selected = ((AENetworkClassifierListener) listeners.get(i)).selectNetworks(display_name, t_nets);
if (selected != null) {
Collections.addAll(res, selected);
}
} catch (Throwable e) {
Debug.printStackTrace(e);
}
}
} else {
for (int i = 0; i < available_networks.size(); i++) {
if (COConfigurationManager.getBooleanParameter("Network Selection Default." + available_networks.get(i))) {
res.add(available_networks.get(i));
}
}
}
String[] x = new String[res.size()];
res.toArray(x);
return (x);
}
use of com.biglybt.core.torrent.TOTorrentAnnounceURLSet in project BiglyBT by BiglySoftware.
the class TorrentAnnounceURLListImpl method setSets.
@Override
public void setSets(TorrentAnnounceURLListSet[] sets) {
TOTorrentAnnounceURLGroup group = torrent.getTorrent().getAnnounceURLGroup();
TOTorrentAnnounceURLSet[] res = new TOTorrentAnnounceURLSet[sets.length];
for (int i = 0; i < res.length; i++) {
res[i] = ((TorrentAnnounceURLListSetImpl) sets[i]).getSet();
}
group.setAnnounceURLSets(res);
updated();
}
use of com.biglybt.core.torrent.TOTorrentAnnounceURLSet 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);
}
}
}
use of com.biglybt.core.torrent.TOTorrentAnnounceURLSet in project BiglyBT by BiglySoftware.
the class TRTrackerAnnouncerMuxer method getString.
private String getString(TOTorrentAnnounceURLSet[] sets) {
StringBuilder str = new StringBuilder();
str.append("[");
int num1 = 0;
for (TOTorrentAnnounceURLSet s : sets) {
if (num1++ > 0) {
str.append(", ");
}
str.append("[");
URL[] urls = s.getAnnounceURLs();
int num2 = 0;
for (URL u : urls) {
if (num2++ > 0) {
str.append(", ");
}
str.append(u.toExternalForm());
}
str.append("]");
}
str.append("]");
return (str.toString());
}
Aggregations