/* I2PTunnel is GPL'ed (with the exception mentioned in I2PTunnel.java)
* (c) 2003 - 2004 mihi
*/
package net.i2p.i2ptunnel;
import net.i2p.client.I2PSession;
import net.i2p.util.EventDispatcher;
import net.i2p.util.EventDispatcherImpl;
/**
* Either a Server or a Client.
*
* Use caution if extending externally.
* This class should be maintained as a stable API,
* but ask to be sure.
*
* Note that there is no startRunning() method,
* however all extending classes implement one.
*/
public abstract class I2PTunnelTask extends EventDispatcherImpl {
private int id;
private String name;
protected volatile boolean open;
private I2PTunnel tunnel;
//protected I2PTunnelTask(String name) {
// I2PTunnelTask(name, (EventDispatcher)null);
//}
protected I2PTunnelTask(String name, EventDispatcher notifyThis, I2PTunnel tunnel) {
attachEventDispatcher(notifyThis);
this.name = name;
this.id = -1;
this.tunnel = tunnel;
}
/** for apps that use multiple I2PTunnel instances */
public void setTunnel(I2PTunnel pTunnel) {
tunnel = pTunnel;
}
public I2PTunnel getTunnel() { return tunnel; }
public int getId() {
return this.id;
}
public boolean isOpen() {
return open;
}
public void setId(int id) {
this.id = id;
}
protected void setName(String name) {
this.name = name;
}
protected void routerDisconnected() {
tunnel.routerDisconnected();
}
/**
* Note that the tunnel can be reopened after this by calling startRunning().
* This may not release all resources. In particular, the I2PSocketManager remains
* and it may have timer threads that continue running.
*
* To release all resources permanently, call destroy().
*
* @return success
*/
public abstract boolean close(boolean forced);
/**
* Note that the tunnel cannot be reopened after this by calling startRunning(),
* as it may destroy the underlying socket manager, depending on implementation.
* This should release all resources.
*
* The implementation here simply calls close(true).
* Extending classes should override to release all resources.
*
* @return success
* @since 0.9.17
*/
public boolean destroy() {
return close(true);
}
/**
* Notify the task that I2PTunnel's options have been updated.
* Extending classes should override and call I2PTunnel.getClientOptions(),
* then update the I2PSocketManager.
* Does nothing here.
*
* @since 0.9.1
*/
public void optionsUpdated(I2PTunnel tunnel) {}
/**
* For tasks that don't call I2PTunnel.addSession() directly
* @since 0.8.13
*/
public void connected(I2PSession session) {
getTunnel().addSession(session);
}
public void disconnected(I2PSession session) {
routerDisconnected();
getTunnel().removeSession(session);
}
/**
* Does nothing here. Extending classes may override.
*/
public void errorOccurred(I2PSession session, String message, Throwable error) {
}
/**
* Does nothing here. Extending classes may override.
*/
public void reportAbuse(I2PSession session, int severity) {
}
@Override
public String toString() {
return name;
}
}