net.i2p.i2ptunnel

## Class I2PTunnelIRCClient

- java.lang.Object
- - net.i2p.util.EventDispatcherImpl
  - - net.i2p.i2ptunnel.I2PTunnelTask
    - - net.i2p.i2ptunnel.I2PTunnelClientBase
      - - net.i2p.i2ptunnel.I2PTunnelIRCClient

- All Implemented Interfaces:
    Runnable, EventDispatcher

      public class I2PTunnelIRCClient
      extends I2PTunnelClientBase

  IRC client tunnel with DCC support and filtering.

  TODO: Consider extending I2PTunnelClient to reduce code duplication.

- - ### Field Summary

    Fields
    Modifier and Type | Field and Description
    --- | ---
    `static String` | `PROP_AUTO_RECONNECT` Automatically reconnect on tunnel failure.
    `static String` | `PROP_DCC`
    `protected long` | `readTimeout`

    - ### Fields inherited from class net.i2p.i2ptunnel.I2PTunnelClientBase

      `_clientId, _context, _log, _ownDest, DEFAULT_CONNECT_TIMEOUT, dest, l, listenerReady, mySockets, PROP_USE_SSL, sockLock, sockMgr, ss`

    - ### Fields inherited from class net.i2p.i2ptunnel.I2PTunnelTask

      `open, tunnel`

  - ### Constructor Summary

    Constructors
    Constructor and Description
    `I2PTunnelIRCClient(int localPort, String destinations, Logging l, boolean ownDest, EventDispatcher notifyThis, I2PTunnel tunnel, String pkf)` As of 0.9.20 this is fast, and does NOT connect the manager to the router, or open the local socket.

  - ### Method Summary

    All Methods Instance Methods Concrete Methods
    Modifier and Type | Method and Description
    --- | ---
    `protected void` | `clientConnectionRun(Socket s)` Manage a connection in a separate thread.
    `boolean` | `close(boolean forced)` Note that the tunnel can be reopened after this by calling startRunning().
    `void` | `optionsUpdated(I2PTunnel tunnel)` Update the dests then call super.
    `void` | `startRunning()` Actually open the local socket and start working on incoming connections.

    - ### Methods inherited from class net.i2p.i2ptunnel.I2PTunnelClientBase

      `buildSocketManager, buildSocketManager, buildSocketManager, buildSocketManager, closeSocket, createI2PSocket, createI2PSocket, createI2PSocket, destroy, getDefaultOptions, getDefaultOptions, getListenHost, getLocalPort, getSocketManager, getSocketManager, getSocketManager, killSharedClient, manageConnection, run, verifySocketManager`

    - ### Methods inherited from class net.i2p.i2ptunnel.I2PTunnelTask

      `connected, disconnected, errorOccurred, getBooleanOption, getId, getTunnel, isOpen, reportAbuse, routerDisconnected, setId, setName, setTunnel, toString`

    - ### Methods inherited from class net.i2p.util.EventDispatcherImpl

      `attachEventDispatcher, detachEventDispatcher, getEventDispatcher, getEvents, getEventValue, ignoreEvents, notifyEvent, unIgnoreEvents, waitEventValue`

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait`

- - ### Field Detail

    - #### PROP_AUTO_RECONNECT

          public static final String PROP_AUTO_RECONNECT

      Automatically reconnect on tunnel failure. When enabled, closes local socket on I2P disconnect to force IRC app reconnection.
      See Also:
        Constant Field Values

    - #### PROP_DCC

          public static final String PROP_DCC

      See Also:
        Constant Field Values

    - #### readTimeout

          protected long readTimeout

  - ### Constructor Detail

    - #### I2PTunnelIRCClient

          public I2PTunnelIRCClient(int localPort,
                                    String destinations,
                                    Logging l,
                                    boolean ownDest,
                                    EventDispatcher notifyThis,
                                    I2PTunnel tunnel,
                                    String pkf)
                             throws IllegalArgumentException

      As of 0.9.20 this is fast, and does NOT connect the manager to the router, or open the local socket. You MUST call startRunning() for that.
      Parameters:
        `destinations` - peers we target, comma- or space-separated. Since 0.9.9, each dest may be appended with :port
      Throws:
        `IllegalArgumentException` - if the I2PTunnel does not contain valid config to contact the router

  - ### Method Detail

    - #### clientConnectionRun

          protected void clientConnectionRun(Socket s)

      Description copied from class: `I2PTunnelClientBase`
      Manage a connection in a separate thread. This only works if you do not override manageConnection(). This is run in a thread from an unlimited-size thread pool, so it may block or run indefinitely.
      Specified by:
        `clientConnectionRun` in class `I2PTunnelClientBase`

    - #### close

          public boolean close(boolean forced)

      Description copied from class: `I2PTunnelClientBase`
      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(). Does nothing if open is already false. Sets open = false but does not notifyAll().
      Overrides:
        `close` in class `I2PTunnelClientBase`
      Returns:
        success

    - #### optionsUpdated

          public void optionsUpdated(I2PTunnel tunnel)

      Update the dests then call super.
      Overrides:
        `optionsUpdated` in class `I2PTunnelClientBase`

    - #### startRunning

          public void startRunning()

      Description copied from class: `I2PTunnelClientBase`
      Actually open the local socket and start working on incoming connections. *Must* be called by derived classes after initialization. (this wasn't actually true until 0.9.20) This will be fast if i2cp.delayOpen is true, but could take a LONG TIME if it is false, as it connects to the router and builds tunnels. Extending classes must check the value of boolean open after calling super.startRunning(), if false then something went wrong.
      Overrides:
        `startRunning` in class `I2PTunnelClientBase`