Search in sources :

Example 1 with TRTrackerBTAnnouncerImpl

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

Example 2 with TRTrackerBTAnnouncerImpl

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);
        }
    }
}
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)

Aggregations

TOTorrentAnnounceURLSet (com.biglybt.core.torrent.TOTorrentAnnounceURLSet)2 TRTrackerBTAnnouncerImpl (com.biglybt.core.tracker.client.impl.bt.TRTrackerBTAnnouncerImpl)2 URL (java.net.URL)2 LogEvent (com.biglybt.core.logging.LogEvent)1 TOTorrent (com.biglybt.core.torrent.TOTorrent)1 TRTrackerDHTAnnouncerImpl (com.biglybt.core.tracker.client.impl.dht.TRTrackerDHTAnnouncerImpl)1