Search in sources :

Example 1 with TOTorrentAnnounceURLSet

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;
}
Also used : TOTorrentAnnounceURLSet(com.biglybt.core.torrent.TOTorrentAnnounceURLSet) URL(java.net.URL)

Example 2 with TOTorrentAnnounceURLSet

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);
}
Also used : ArrayList(java.util.ArrayList) URL(java.net.URL) TOTorrentAnnounceURLSet(com.biglybt.core.torrent.TOTorrentAnnounceURLSet)

Example 3 with TOTorrentAnnounceURLSet

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();
}
Also used : TOTorrentAnnounceURLSet(com.biglybt.core.torrent.TOTorrentAnnounceURLSet) TOTorrentAnnounceURLGroup(com.biglybt.core.torrent.TOTorrentAnnounceURLGroup)

Example 4 with TOTorrentAnnounceURLSet

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);
        }
    }
}
Also used : LogEvent(com.biglybt.core.logging.LogEvent) URL(java.net.URL) TRTrackerBTAnnouncerImpl(com.biglybt.core.tracker.client.impl.bt.TRTrackerBTAnnouncerImpl) TOTorrent(com.biglybt.core.torrent.TOTorrent) TOTorrentAnnounceURLSet(com.biglybt.core.torrent.TOTorrentAnnounceURLSet)

Example 5 with TOTorrentAnnounceURLSet

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());
}
Also used : TOTorrentAnnounceURLSet(com.biglybt.core.torrent.TOTorrentAnnounceURLSet) URL(java.net.URL)

Aggregations

TOTorrentAnnounceURLSet (com.biglybt.core.torrent.TOTorrentAnnounceURLSet)16 URL (java.net.URL)14 TOTorrent (com.biglybt.core.torrent.TOTorrent)7 TOTorrentAnnounceURLGroup (com.biglybt.core.torrent.TOTorrentAnnounceURLGroup)7 File (java.io.File)3 TOTorrentException (com.biglybt.core.torrent.TOTorrentException)2 TRTrackerBTAnnouncerImpl (com.biglybt.core.tracker.client.impl.bt.TRTrackerBTAnnouncerImpl)2 DiskManagerFileInfo (com.biglybt.core.disk.DiskManagerFileInfo)1 DiskManagerFileInfoSet (com.biglybt.core.disk.DiskManagerFileInfoSet)1 LocaleUtilDecoder (com.biglybt.core.internat.LocaleUtilDecoder)1 LogAlert (com.biglybt.core.logging.LogAlert)1 LogEvent (com.biglybt.core.logging.LogEvent)1 TOTorrentCreator (com.biglybt.core.torrent.TOTorrentCreator)1 TOTorrentFile (com.biglybt.core.torrent.TOTorrentFile)1 TOTorrentProgressListener (com.biglybt.core.torrent.TOTorrentProgressListener)1 TRTrackerAnnouncer (com.biglybt.core.tracker.client.TRTrackerAnnouncer)1 TRTrackerScraperResponse (com.biglybt.core.tracker.client.TRTrackerScraperResponse)1 TRTrackerDHTAnnouncerImpl (com.biglybt.core.tracker.client.impl.dht.TRTrackerDHTAnnouncerImpl)1 DownloadTypeComplete (com.biglybt.pif.download.DownloadTypeComplete)1 DownloadTypeIncomplete (com.biglybt.pif.download.DownloadTypeIncomplete)1