net.i2p.client.impl

## Class I2PSessionMuxedImpl

- java.lang.Object
- - net.i2p.client.impl.I2PSessionImpl
  - - net.i2p.client.impl.I2PSessionImpl2
    - - net.i2p.client.impl.I2PSessionMuxedImpl

- All Implemented Interfaces:
    I2PSession, I2CPMessageReader.I2CPMessageEventListener
  Direct Known Subclasses:
    SubSession

      class I2PSessionMuxedImpl
      extends I2PSessionImpl2

  I2PSession with protocol and ports Streaming lib has been modified to send I2PSession.PROTO_STREAMING but still receives all. It sends with fromPort and toPort = 0, and receives on all ports. No datagram apps have been modified yet. Therefore the compatibility situation is as follows: Compatibility: old streaming -> new streaming: sends proto anything, rcvs proto anything new streaming -> old streaming: sends PROTO_STREAMING, ignores rcvd proto old datagram -> new datagram: sends proto anything, rcvs proto anything new datagram -> old datagram: sends PROTO_DATAGRAM, ignores rcvd proto In all the above cases, streaming and datagram receive traffic for the other protocol, same as before. old datagram -> new muxed: doesn't work because the old sends proto 0 but the udp side of the mux registers with PROTO_DATAGRAM, so the datagrams go to the streaming side, same as before. old streaming -> new muxed: works Typical Usage: Streaming + datagrams: I2PSocketManager sockMgr = getSocketManager(); I2PSession session = sockMgr.getSession(); session.addMuxedSessionListener(myI2PSessionMuxedListener, I2PSession.PROTO_DATAGRAM, I2PSession.PORT_ANY); * or * session.addSessionListener(myI2PSessionListener, I2PSession.PROTO_DATAGRAM, I2PSession.PORT_ANY); session.sendMessage(dest, payload, I2PSession.PROTO_DATAGRAM, fromPort, toPort); Datagrams only, with multiple ports: I2PClient client = I2PClientFactory.createClient(); ... I2PSession session = client.createSession(...); session.addMuxedSessionListener(myI2PSessionMuxedListener, I2PSession.PROTO_DATAGRAM, I2PSession.PORT_ANY); * or * session.addSessionListener(myI2PSessionListener, I2PSession.PROTO_DATAGRAM, I2PSession.PORT_ANY); session.sendMessage(dest, payload, I2PSession.PROTO_DATAGRAM, fromPort, toPort); Multiple streaming ports: Needs some streaming lib hacking

- - ### Nested Class Summary

    Nested Classes
    Modifier and Type | Class and Description
    --- | ---
    `protected class` | `I2PSessionMuxedImpl.MuxedAvailabilityNotifier`

    - ### Nested classes/interfaces inherited from class net.i2p.client.impl.I2PSessionImpl

      `I2PSessionImpl.AvailabilityNotifier, I2PSessionImpl.State`

  - ### Field Summary

    - ### Fields inherited from class net.i2p.client.impl.I2PSessionImpl2

      `_noEffort, _sendingStates, _sendMessageNonce`

    - ### Fields inherited from class net.i2p.client.impl.I2PSessionImpl

      `_availabilityNotifier, _availableMessages, _bwLimits, _bwReceivedLock, _context, _handlerMap, _hostname, _leaseSet, _leaseSetWait, _log, _pendingLookups, _portNum, _producer, _queue, _reader, _sessionListener, _socket, _state, _stateLock, _transientSigningPublicKey, _writer, CACHE_MAX_SIZE, DUMMY_SESSION, LISTEN_PORT, PROP_DOMAIN_SOCKET`

    - ### Fields inherited from interface net.i2p.client.I2PSession

      `PORT_ANY, PORT_UNSPECIFIED, PROTO_ANY, PROTO_DATAGRAM, PROTO_DATAGRAM_RAW, PROTO_DATAGRAM2, PROTO_DATAGRAM3, PROTO_STREAMING, PROTO_UNSPECIFIED`

  - ### Constructor Summary

    Constructors
    Modifier | Constructor and Description
    --- | ---
    `` | `I2PSessionMuxedImpl(I2PAppContext ctx, InputStream destKeyStream, Properties options)`
    `protected` | `I2PSessionMuxedImpl(I2PSessionImpl primary, InputStream destKeyStream, Properties options)`

  - ### Method Summary

    All Methods Instance Methods Concrete Methods
    Modifier and Type | Method and Description
    --- | ---
    `void` | `addMuxedSessionListener(I2PSessionMuxedListener l, int proto, int port)` Listen on specified protocol and port, and receive notification of proto, fromPort, and toPort for every message.
    `void` | `addNewMessage(MessagePayloadMessage msg)` Receive a payload message and let the app know its available
    `void` | `addSessionListener(I2PSessionListener lsnr, int proto, int port)` Listen on specified protocol and port.
    `void` | `removeListener(int proto, int port)` removes the specified listener (only)
    `boolean` | `sendMessage(Destination dest, byte[] payload)` unused, see MuxedImpl override
    `boolean` | `sendMessage(Destination dest, byte[] payload, int proto, int fromport, int toport)` See I2PSessionMuxedImpl for proto/port details.
    `boolean` | `sendMessage(Destination dest, byte[] payload, int offset, int size, int proto, int fromPort, int toPort, SendMessageOptions options)` See SendMessageOptions for option details.
    `long` | `sendMessage(Destination dest, byte[] payload, int offset, int size, int proto, int fromPort, int toPort, SendMessageOptions options, SendMessageStatusListener listener)` Send a message and request an asynchronous notification of delivery status.
    `boolean` | `sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set<SessionTag> tagsSent, int proto, int fromport, int toport)` See I2PSessionMuxedImpl for proto/port details.
    `boolean` | `sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set<SessionTag> tagsSent, long expires)` Unused? see MuxedImpl override
    `boolean` | `sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set<SessionTag> tagsSent, long expires, int proto, int fromPort, int toPort)` See I2PSessionMuxedImpl for proto/port details.
    `boolean` | `sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set<SessionTag> tagsSent, long expires, int proto, int fromPort, int toPort, int flags)` See I2PSessionMuxedImpl for proto/port details.
    `void` | `setSessionListener(I2PSessionListener lsnr)` listen on all protocols and ports

    - ### Methods inherited from class net.i2p.client.impl.I2PSessionImpl2

      `destroySession, getTimeout, receiveMessage, receiveStatus, reconnect, sendBestEffort, sendBestEffort, sendMessage, sendMessage, sendMessage, sendNoEffort, shouldCompress, startVerifyUsage`

    - ### Methods inherited from class net.i2p.client.impl.I2PSessionImpl

      `addSubsession, bandwidthLimits, bwReceived, changeState, clearCache, connect, dateUpdated, destLookupFailed, destLookupFailed, destReceived, destReceived, destroySession, disconnect, disconnected, getContext, getFastReceive, getHandlerMap, getLastLS2SignTime, getLeaseSet, getMyDestination, getName, getOfflineExpiration, getOfflineSignature, getOptions, getPrefix, getPrivateKey, getProducer, getRouterVersion, getSessionId, getSubsessions, getTransientSigningPublicKey, isClosed, isOffline, lastActivity, lookupDest, lookupDest, lookupDest, lookupDest, lookupDest, lookupDest, lookupDest2, messageReceived, propagateError, readError, removeSubsession, reportAbuse, sendBlindingInfo, sendMessage_unchecked, sendMessage, setLastLS2SignTime, setLeaseSet, setReduced, setSessionId, shouldReconnect, supportsLS2, toString, updateActivity, updateOptions, verifyOpen, waitForDate`

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

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

- - ### Constructor Detail

    - #### I2PSessionMuxedImpl

          public I2PSessionMuxedImpl(I2PAppContext ctx,
                                     InputStream destKeyStream,
                                     Properties options)
                              throws I2PSessionException

      Throws:
        `I2PSessionException`

    - #### I2PSessionMuxedImpl

          protected I2PSessionMuxedImpl(I2PSessionImpl primary,
                                        InputStream destKeyStream,
                                        Properties options)
                                 throws I2PSessionException

      Throws:
        `I2PSessionException`

  - ### Method Detail

    - #### addMuxedSessionListener

          public void addMuxedSessionListener(I2PSessionMuxedListener l,
                                              int proto,
                                              int port)

      Listen on specified protocol and port, and receive notification of proto, fromPort, and toPort for every message.
      Specified by:
        `addMuxedSessionListener` in interface `I2PSession`
      Overrides:
        `addMuxedSessionListener` in class `I2PSessionImpl2`
      Parameters:
        `proto` - 1-254 or PROTO_ANY (0) for all; 255 disallowed
        `port` - 1-65535 or PORT_ANY (0) for all

    - #### addNewMessage

          public void addNewMessage(MessagePayloadMessage msg)

      Receive a payload message and let the app know its available
      Overrides:
        `addNewMessage` in class `I2PSessionImpl`

    - #### addSessionListener

          public void addSessionListener(I2PSessionListener lsnr,
                                         int proto,
                                         int port)

      Listen on specified protocol and port. An existing listener with the same proto and port is replaced. Only the listener with the best match is called back for each message.
      Specified by:
        `addSessionListener` in interface `I2PSession`
      Overrides:
        `addSessionListener` in class `I2PSessionImpl2`
      Parameters:
        `proto` - 1-254 or PROTO_ANY (0) for all; recommended: I2PSession.PROTO_STREAMING I2PSession.PROTO_DATAGRAM 255 disallowed
        `port` - 1-65535 or PORT_ANY (0) for all

    - #### removeListener

          public void removeListener(int proto,
                                     int port)

      removes the specified listener (only)
      Specified by:
        `removeListener` in interface `I2PSession`
      Overrides:
        `removeListener` in class `I2PSessionImpl2`

    - #### sendMessage

          public boolean sendMessage(Destination dest,
                                     byte[] payload)
                              throws I2PSessionException

      Description copied from class: `I2PSessionImpl2`
      unused, see MuxedImpl override
      Specified by:
        `sendMessage` in interface `I2PSession`
      Overrides:
        `sendMessage` in class `I2PSessionImpl2`
      Parameters:
        `dest` - location to send the message
        `payload` - body of the message to be sent (unencrypted)
      Returns:
        whether it was accepted by the router for delivery or not
      Throws:
        `I2PSessionException`

    - #### sendMessage

          public boolean sendMessage(Destination dest,
                                     byte[] payload,
                                     int proto,
                                     int fromport,
                                     int toport)
                              throws I2PSessionException

      Description copied from interface: `I2PSession`
      See I2PSessionMuxedImpl for proto/port details.
      Specified by:
        `sendMessage` in interface `I2PSession`
      Overrides:
        `sendMessage` in class `I2PSessionImpl2`
      Returns:
        success
      Throws:
        `I2PSessionException`

    - #### sendMessage

          public boolean sendMessage(Destination dest,
                                     byte[] payload,
                                     int offset,
                                     int size,
                                     int proto,
                                     int fromPort,
                                     int toPort,
                                     SendMessageOptions options)
                              throws I2PSessionException

      See SendMessageOptions for option details. Always uses sendNoEffort for now.
      Specified by:
        `sendMessage` in interface `I2PSession`
      Overrides:
        `sendMessage` in class `I2PSessionImpl2`
      Parameters:
        `proto` - 1-254 or 0 for unset; recommended: I2PSession.PROTO_UNSPECIFIED I2PSession.PROTO_STREAMING I2PSession.PROTO_DATAGRAM 255 disallowed
        `fromPort` - 1-65535 or 0 for unset
        `toPort` - 1-65535 or 0 for unset
        `options` - to be passed to the router
      Returns:
        success
      Throws:
        `I2PSessionException`

    - #### sendMessage

          public long sendMessage(Destination dest,
                                  byte[] payload,
                                  int offset,
                                  int size,
                                  int proto,
                                  int fromPort,
                                  int toPort,
                                  SendMessageOptions options,
                                  SendMessageStatusListener listener)
                           throws I2PSessionException

      Send a message and request an asynchronous notification of delivery status. See I2PSessionMuxedImpl for proto/port details. See SendMessageOptions for option details.
      Specified by:
        `sendMessage` in interface `I2PSession`
      Overrides:
        `sendMessage` in class `I2PSessionImpl2`
        `proto` - 1-254 or 0 for unset; recommended: I2PSession.PROTO_UNSPECIFIED I2PSession.PROTO_STREAMING I2PSession.PROTO_DATAGRAM 255 disallowed
        `fromPort` - 1-65535 or 0 for unset
        `toPort` - 1-65535 or 0 for unset
        `options` - to be passed to the router
      Returns:
        the message ID to be used for later notification to the listener
      Throws:
        `I2PSessionException` - on all errors

    - #### sendMessage

          public boolean sendMessage(Destination dest,
                                     byte[] payload,
                                     int offset,
                                     int size,
                                     SessionKey keyUsed,
                                     Set<SessionTag> tagsSent,
                                     int proto,
                                     int fromport,
                                     int toport)
                              throws I2PSessionException

      Description copied from interface: `I2PSession`
      See I2PSessionMuxedImpl for proto/port details. End-to-End Crypto is disabled, tags and keys are ignored.
      Specified by:
        `sendMessage` in interface `I2PSession`
      Overrides:
        `sendMessage` in class `I2PSessionImpl2`
      Parameters:
        `keyUsed` - unused - no end-to-end crypto
        `tagsSent` - unused - no end-to-end crypto
        `proto` - 1-254 or 0 for unset; recommended: I2PSession.PROTO_UNSPECIFIED I2PSession.PROTO_STREAMING I2PSession.PROTO_DATAGRAM 255 disallowed
        `fromport` - 1-65535 or 0 for unset
        `toport` - 1-65535 or 0 for unset
      Returns:
        success
      Throws:
        `I2PSessionException`

    - #### sendMessage

          public boolean sendMessage(Destination dest,
                                     byte[] payload,
                                     int offset,
                                     int size,
                                     SessionKey keyUsed,
                                     Set<SessionTag> tagsSent,
                                     long expires)
                              throws I2PSessionException

      Description copied from class: `I2PSessionImpl2`
      Unused? see MuxedImpl override
      Specified by:
        `sendMessage` in interface `I2PSession`
      Overrides:
        `sendMessage` in class `I2PSessionImpl2`
      Parameters:
        `keyUsed` - unused - no end-to-end crypto
        `tagsSent` - unused - no end-to-end crypto
        `expires` - absolute expiration timestamp, NOT interval from now
      Returns:
        success
      Throws:
        `I2PSessionException`

    - #### sendMessage

          public boolean sendMessage(Destination dest,
                                     byte[] payload,
                                     int offset,
                                     int size,
                                     SessionKey keyUsed,
                                     Set<SessionTag> tagsSent,
                                     long expires,
                                     int proto,
                                     int fromPort,
                                     int toPort)
                              throws I2PSessionException

      Description copied from interface: `I2PSession`
      See I2PSessionMuxedImpl for proto/port details. End-to-End Crypto is disabled, tags and keys are ignored.
      Specified by:
        `sendMessage` in interface `I2PSession`
      Overrides:
        `sendMessage` in class `I2PSessionImpl2`
      Parameters:
        `keyUsed` - unused - no end-to-end crypto
        `tagsSent` - unused - no end-to-end crypto
        `proto` - 1-254 or 0 for unset; recommended: I2PSession.PROTO_UNSPECIFIED I2PSession.PROTO_STREAMING I2PSession.PROTO_DATAGRAM 255 disallowed
        `fromPort` - 1-65535 or 0 for unset
        `toPort` - 1-65535 or 0 for unset
        `expires` - absolute expiration timestamp, NOT interval from now
      Returns:
        success
      Throws:
        `I2PSessionException`

    - #### sendMessage

          public boolean sendMessage(Destination dest,
                                     byte[] payload,
                                     int offset,
                                     int size,
                                     SessionKey keyUsed,
                                     Set<SessionTag> tagsSent,
                                     long expires,
                                     int proto,
                                     int fromPort,
                                     int toPort,
                                     int flags)
                              throws I2PSessionException

      Description copied from interface: `I2PSession`
      See I2PSessionMuxedImpl for proto/port details. End-to-End Crypto is disabled, tags and keys are ignored.
      Specified by:
        `sendMessage` in interface `I2PSession`
      Overrides:
        `sendMessage` in class `I2PSessionImpl2`
      Parameters:
        `keyUsed` - unused - no end-to-end crypto
        `tagsSent` - unused - no end-to-end crypto
        `proto` - 1-254 or 0 for unset; recommended: I2PSession.PROTO_UNSPECIFIED I2PSession.PROTO_STREAMING I2PSession.PROTO_DATAGRAM 255 disallowed
        `fromPort` - 1-65535 or 0 for unset
        `toPort` - 1-65535 or 0 for unset
        `flags` - to be passed to the router
        `expires` - absolute expiration timestamp, NOT interval from now
      Returns:
        success
      Throws:
        `I2PSessionException`

    - #### setSessionListener

          public void setSessionListener(I2PSessionListener lsnr)

      listen on all protocols and ports
      Specified by:
        `setSessionListener` in interface `I2PSession`
      Overrides:
        `setSessionListener` in class `I2PSessionImpl`
      Parameters:
        `lsnr` - listener to retrieve events