Class I2PTunnelClientBase

    • Constructor Detail

      • I2PTunnelClientBase

        public I2PTunnelClientBase​(int localPort,
                                   Logging l,
                                   I2PSocketManager sktMgr,
                                   I2PTunnel tunnel,
                                   EventDispatcher notifyThis,
                                   long clientId)
                            throws IllegalArgumentException
        This constructor is used to add a client to an existing socket manager.

        As of 0.9.21 this does NOT open the local socket. You MUST call startRunning() for that. The local socket will be opened immediately (ignoring the i2cp.delayOpen option).

        Parameters:
        localPort - if 0, use any port, get actual port selected with getLocalPort()
        sktMgr - the existing socket manager
        Throws:
        IllegalArgumentException
      • I2PTunnelClientBase

        public I2PTunnelClientBase​(int localPort,
                                   boolean ownDest,
                                   Logging l,
                                   EventDispatcher notifyThis,
                                   String handlerName,
                                   I2PTunnel tunnel)
                            throws IllegalArgumentException
        The main constructor.

        As of 0.9.21 this is fast, and does NOT connect the manager to the router, or open the local socket. You MUST call startRunning() for that.

        (0.9.20 claimed to be fast, but due to a bug it DID connect the manager to the router. It did NOT open the local socket however, so it was still necessary to call startRunning() for that.)

        Parameters:
        localPort - if 0, use any port, get actual port selected with getLocalPort()
        Throws:
        IllegalArgumentException - if the I2CP configuration is b0rked so badly that we can't create a socketManager
      • I2PTunnelClientBase

        public I2PTunnelClientBase​(int localPort,
                                   boolean ownDest,
                                   Logging l,
                                   EventDispatcher notifyThis,
                                   String handlerName,
                                   I2PTunnel tunnel,
                                   String pkf)
                            throws IllegalArgumentException
        Use this to build a client with a persistent private key.

        As of 0.9.21 this is fast, and does NOT connect the manager to the router, or open the local socket. You MUST call startRunning() for that.

        (0.9.20 claimed to be fast, but due to a bug it DID connect the manager to the router. It did NOT open the local socket however, so it was still necessary to call startRunning() for that.)

        Parameters:
        localPort - if 0, use any port, get actual port selected with getLocalPort()
        pkf - Path to the private key file, or null to generate a transient key
        Throws:
        IllegalArgumentException - if the I2CP configuration is b0rked so badly that we can't create a socketManager
    • Method Detail

      • verifySocketManager

        protected void verifySocketManager()
        Create the manager if it doesn't exist, AND connect it to the router and build tunnels. Sets the this.sockMgr field if it is null, or if we want a new one. This may take a LONG time if building a new manager. We need a socket manager before getDefaultOptions() and most other things
        Throws:
        IllegalArgumentException - if the I2CP configuration is b0rked so badly that we cant create a socketManager
      • getSocketManager

        protected I2PSocketManager getSocketManager()
        This is ONLY for shared clients. As of 0.9.20 this is fast, and does NOT connect the manager to the router. Call verifySocketManager() for that.
        Returns:
        non-null
        Throws:
        IllegalArgumentException - if the I2CP configuration is b0rked so badly that we cant create a socketManager
      • getSocketManager

        protected static I2PSocketManager getSocketManager​(I2PTunnel tunnel)
        This is ONLY for shared clients. As of 0.9.20 this is fast, and does NOT connect the manager to the router. Call verifySocketManager() for that.
        Returns:
        non-null
        Throws:
        IllegalArgumentException - if the I2CP configuration is b0rked so badly that we cant create a socketManager
      • getSocketManager

        protected static I2PSocketManager getSocketManager​(I2PTunnel tunnel,
                                                           String pkf)
        This is ONLY for shared clients. As of 0.9.20 this is fast, and does NOT connect the manager to the router. Call verifySocketManager() for that.
        Returns:
        non-null
        Throws:
        IllegalArgumentException - if the I2CP configuration is b0rked so badly that we cant create a socketManager
      • addSubsession

        @Deprecated
        protected static I2PSession addSubsession​(I2PTunnel tunnel)
        Deprecated.
        unused as of 0.9.49
        Add a DSA_SHA1 subsession to the shared client if necessary.
        Returns:
        subsession, or null if none was added
        Since:
        0.9.20
      • killSharedClient

        protected static void killSharedClient()
        Kill the shared client, so that on restart in android we won't latch onto the old one
        Since:
        0.9.18
      • buildSocketManager

        protected I2PSocketManager buildSocketManager()
        For NON-SHARED clients (ownDest = true). As of 0.9.20 this is fast, and does NOT connect the manager to the router. Call verifySocketManager() for that.
        Returns:
        non-null
        Throws:
        IllegalArgumentException - if the I2CP configuration is b0rked so badly that we cant create a socketManager
      • buildSocketManager

        protected static I2PSocketManager buildSocketManager​(I2PTunnel tunnel)
        As of 0.9.20 this is fast, and does NOT connect the manager to the router. Call verifySocketManager() for that.
        Returns:
        non-null
        Throws:
        IllegalArgumentException - if the I2CP configuration is b0rked so badly that we cant create a socketManager
      • buildSocketManager

        protected static I2PSocketManager buildSocketManager​(I2PTunnel tunnel,
                                                             String pkf)
        As of 0.9.20 this is fast, and does NOT connect the manager to the router. Call verifySocketManager() for that.
        Parameters:
        pkf - absolute path or null
        Returns:
        non-null
        Throws:
        IllegalArgumentException - if the I2CP configuration is b0rked so badly that we cant create a socketManager
      • buildSocketManager

        protected static I2PSocketManager buildSocketManager​(I2PTunnel tunnel,
                                                             String pkf,
                                                             Logging log)
        As of 0.9.20 this is fast, and does NOT connect the manager to the router. Call verifySocketManager() for that.
        Parameters:
        pkf - absolute path or null
        Returns:
        non-null
        Throws:
        IllegalArgumentException - if the I2CP configuration is b0rked so badly that we cant create a socketManager
      • getLocalPort

        public final int getLocalPort()
      • startRunning

        public void startRunning()
        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.
      • getDefaultOptions

        protected I2PSocketOptions getDefaultOptions()
        Create the default options (using the default timeout, etc). Warning, this does not make a copy of I2PTunnel's client options, it modifies them directly.
      • getDefaultOptions

        protected I2PSocketOptions getDefaultOptions​(Properties overrides)
        Create the default options (using the default timeout, etc). Warning, this does not make a copy of I2PTunnel's client options, it modifies them directly. Do not use overrides for per-socket options.
      • run

        public void run()
        Non-final since 0.9.11. open will be true before being called. Any overrides must set listenerReady = true and then notifyAll() if setup is successful, and must call close() and then notifyAll() on failure or termination.
        Specified by:
        run in interface Runnable
      • manageConnection

        protected void manageConnection​(Socket s)
        Manage the connection just opened on the specified socket
        Parameters:
        s - Socket to take care of
      • close

        public boolean close​(boolean forced)
        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().
        Specified by:
        close in class I2PTunnelTask
        Returns:
        success
      • destroy

        public boolean destroy()
        Note that the tunnel cannot be reopened after this by calling startRunning(), as it will destroy the underlying socket manager. This releases all resources if not a shared client. For shared client, the router will kill all the remaining streaming timers at shutdown.
        Overrides:
        destroy in class I2PTunnelTask
        Returns:
        success
        Since:
        0.9.17
      • closeSocket

        public static void closeSocket​(Socket s)
      • clientConnectionRun

        protected abstract void clientConnectionRun​(Socket s)
        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.