All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.frostwire.jlibtorrent.plugins.SwigPlugin Maven / Gradle / Ivy

There is a newer version: 1.2.0.18
Show newest version
package com.frostwire.jlibtorrent.plugins;

import com.frostwire.jlibtorrent.*;
import com.frostwire.jlibtorrent.alerts.Alerts;
import com.frostwire.jlibtorrent.swig.*;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

/**
 * @author gubatron
 * @author aldenml
 */
public final class SwigPlugin extends swig_plugin {

    private static final Logger LOG = Logger.getLogger(SwigPlugin.class);

    private final Plugin p;

    private final List mem;
    private final Object memLock;

    private final List memDht;

    public SwigPlugin(Plugin p) {
        this.p = p;

        this.mem = new LinkedList();
        this.memLock = new Object();

        this.memDht = new LinkedList();
    }

    /*
    @Override
    public swig_torrent_plugin new_torrent(torrent_handle t) {
        try {
            if (p.handleOperation(Plugin.Operation.NEW_TORRENT)) {
                TorrentPlugin tp = p.newTorrent(new TorrentHandle(t));

                if (tp != null) {
                    return pin(new SwigTorrentPlugin(tp, t));
                }
            }
        } catch (Throwable e) {
            LOG.error("Error in plugin (new_torrent)", e);
        }

        return super.new_torrent(t);
    }*/

    @Override
    public void added(session_handle s) {
        try {
            p.added(new SessionHandle(s));
        } catch (Throwable e) {
            LOG.error("Error in plugin (added)", e);
        }
    }

    @Override
    public void register_dht_extensions(string_dht_extension_handler_listener_ptr_pair_vector dht_extensions) {
        try {
            if (p.handleOperation(Plugin.Operation.REGISTER_DHT_EXTENSIONS)) {
                List> plugins = new LinkedList>();
                p.registerDhtPlugins(plugins);

                for (Pair pp : plugins) {
                    String q = pp.first;
                    SwigDhtPlugin h = pin(new SwigDhtPlugin(pp.second));
                    string_dht_extension_handler_listener_ptr_pair pair = new string_dht_extension_handler_listener_ptr_pair(q, h);
                    dht_extensions.push_back(pair);
                }
            }
        } catch (Throwable e) {
            LOG.error("Error in plugin (register_dht_extensions)", e);
        }
    }

    @Override
    public void on_alert(alert a) {
        try {
            if (p.handleOperation(Plugin.Operation.ON_ALERT)) {
                p.onAlert(Alerts.cast(a));
            }
        } catch (Throwable e) {
            LOG.error("Error in plugin (on_alert)", e);
        }
    }

    @Override
    public boolean on_unknown_torrent(sha1_hash info_hash, peer_connection_handle pc, add_torrent_params p) {
        try {
            if (this.p.handleOperation(Plugin.Operation.ON_UNKNOWN_TORRENT)) {
                return this.p.onUnknownTorrent(new Sha1Hash(info_hash), new PeerConnectionHandle(pc), new AddTorrentParams(p));
            }
        } catch (Throwable e) {
            LOG.error("Error in plugin (on_unknown_torrent)", e);
        }

        return false;
    }

    @Override
    public void on_tick() {
        try {
            p.onTick();
        } catch (Throwable e) {
            LOG.error("Error in plugin (on_tick)", e);
        }

        cleanup();
    }

    @Override
    public void save_state(entry e) {
        try {
            if (p.handleOperation(Plugin.Operation.SAVE_STATE)) {
                p.saveState(new Entry(e));
            }
        } catch (Throwable t) {
            LOG.error("Error in plugin (save_state)", t);
        }
    }

    @Override
    public void load_state(bdecode_node n) {
        try {
            if (p.handleOperation(Plugin.Operation.LOAD_STATE)) {
                p.loadState(n);
            }
        } catch (Throwable e) {
            LOG.error("Error in plugin (load_state)", e);
        }
    }

    private SwigTorrentPlugin pin(SwigTorrentPlugin p) {
        mem.add(p);
        return p;
    }

    private SwigDhtPlugin pin(SwigDhtPlugin p) {
        memDht.add(p);
        return p;
    }

    private void cleanup() {
        synchronized (memLock) {
            Iterator it = mem.iterator();
            while (it.hasNext()) {
                SwigTorrentPlugin p = it.next();
                if (!p.t.is_valid()) {
                    it.remove();
                }
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy