## Uses of Interface
net.i2p.data.i2cp.I2CPMessage

- Packages that use I2CPMessage
  Package | Description
  --- | ---
  net.i2p.client.impl | Internal implementation of the I2P client SDK, providing the client side of the I2CP protocol for applications communicating through I2P.
  net.i2p.data.i2cp | The Invisible Internet Client Protocol (I2CP) allows applications simplified access to I2P network without requiring them to deal with the issues involved with the Invisible Internet Network Protocol (I2NP).
  net.i2p.internal | Internal communication interfaces for router and client within same JVM, using queues instead of socket-based I2CP.
  net.i2p.router.client | Router-side implementation of the I2CP (I2P Client Protocol) interface for application integration.

- - ### Uses of I2CPMessage in net.i2p.client.impl

    Methods in net.i2p.client.impl with parameters of type I2CPMessage
    Modifier and Type | Method and Description
    --- | ---
    `void` | ClientWriterRunner.`addMessage(I2CPMessage msg)` Add this message to the writer's queue.
    `void` | HostReplyMessageHandler.`handleMessage(I2CPMessage message, I2PSessionImpl session)`
    `void` | SessionStatusMessageHandler.`handleMessage(I2CPMessage message, I2PSessionImpl session)`
    `void` | DisconnectMessageHandler.`handleMessage(I2CPMessage message, I2PSessionImpl session)`
    `void` | RequestVariableLeaseSetMessageHandler.`handleMessage(I2CPMessage message, I2PSessionImpl session)`
    `void` | BWLimitsMessageHandler.`handleMessage(I2CPMessage message, I2PSessionImpl session)`
    `void` | DestReplyMessageHandler.`handleMessage(I2CPMessage message, I2PSessionImpl session)`
    `void` | I2CPMessageHandler.`handleMessage(I2CPMessage message, I2PSessionImpl session)`
    `void` | RequestLeaseSetMessageHandler.`handleMessage(I2CPMessage message, I2PSessionImpl session)`
    `void` | SetDateMessageHandler.`handleMessage(I2CPMessage message, I2PSessionImpl session)`
    `void` | MessageStatusMessageHandler.`handleMessage(I2CPMessage message, I2PSessionImpl session)`
    `void` | MessagePayloadMessageHandler.`handleMessage(I2CPMessage message, I2PSessionImpl session)`
    `void` | I2PSessionImpl.`messageReceived(I2CPMessageReader reader, I2CPMessage message)` The I2CPMessageEventListener callback.
    `(package private) void` | I2PSessionImpl.`sendMessage_unchecked(I2CPMessage message)` Deliver an I2CP message to the router.
    `(package private) void` | SubSession.`sendMessage_unchecked(I2CPMessage message)` Deliver an I2CP message to the router.
    `(package private) void` | I2PSessionImpl.`sendMessage(I2CPMessage message)` Deliver an I2CP message to the router As of 0.9.3, may block for several seconds if the write queue to the router is full
    `(package private) void` | SubSession.`sendMessage(I2CPMessage message)` Deliver an I2CP message to the router May block for several seconds if the write queue to the router is full

  - ### Uses of I2CPMessage in net.i2p.data.i2cp

    Classes in net.i2p.data.i2cp that implement I2CPMessage
    Modifier and Type | Class and Description
    --- | ---
    `class` | `BandwidthLimitsMessage` Tell the other side the limits
    `class` | `BlindingInfoMessage` Advise the router that the endpoint is blinded.
    `class` | `CreateLeaseSet2Message` Like CreateLeaseSetMessage, but supports both old and new LeaseSet types, including LS2, Meta, and Encrypted.
    `class` | `CreateLeaseSetMessage` Defines the message a client sends to a router when authorizing the LeaseSet
    `class` | `CreateSessionMessage` Defines the message a client sends to a router when establishing a new session.
    `class` | `DestLookupMessage` Request the router look up the dest for a hash
    `class` | `DestReplyMessage` Response to DestLookupMessage.
    `class` | `DestroySessionMessage` Defines the message a client sends to a router when destroying existing session.
    `class` | `DisconnectMessage` Defines the message a client sends to a router when destroying existing session.
    `class` | `GetBandwidthLimitsMessage` Request the router tells us the current bw limits
    `class` | `GetDateMessage` Request the other side to send us what they think the current time is.
    `class` | `HostLookupMessage` Request the router look up the dest for a hash or a host.
    `class` | `HostReplyMessage` Response to HostLookupMessage.
    `class` | `I2CPMessageImpl` Defines the base message implementation.
    `class` | `MessagePayloadMessage` Defines the payload message a router sends to the client
    `class` | `MessageStatusMessage` Defines the message a router sends to a client about a single message.
    `class` | `ReceiveMessageBeginMessage` Defines the message a client sends to a router when asking the router to start sending a message to it.
    `class` | `ReceiveMessageEndMessage` Defines the message a client sends to a router when asking the router to start sending a message to it.
    `class` | `ReconfigureSessionMessage` Defines the message a client sends to a router when updating the config on an existing session.
    `class` | `ReportAbuseMessage` Defines the message a client sends to a router when asking the router what its address visibility is
    `class` | `RequestLeaseSetMessage` Defines the message a router sends to a client to request that a leaseset be created and signed.
    `class` | `RequestVariableLeaseSetMessage` Defines the message a router sends to a client to request that a leaseset be created and signed.
    `class` | `SendMessageExpiresMessage` Same as SendMessageMessage, but with an expiration to be passed to the router As of 0.8.4, retrofitted to use DateAndFlags.
    `class` | `SendMessageMessage` Defines the message a client sends to a router to ask it to deliver a new message
    `class` | `SessionStatusMessage` Defines the message a router sends to a client indicating the status of the session.
    `class` | `SetDateMessage` Tell the other side what time it is.

    Methods in net.i2p.data.i2cp that return I2CPMessage
    Modifier and Type | Method and Description
    --- | ---
    `static I2CPMessage` | I2CPMessageHandler.`readMessage(InputStream in)` Read an I2CPMessage from the stream and return the fully populated object.

    Methods in net.i2p.data.i2cp with parameters of type I2CPMessage
    Modifier and Type | Method and Description
    --- | ---
    `void` | I2CPMessageReader.I2CPMessageEventListener.`messageReceived(I2CPMessageReader reader, I2CPMessage message)` Notify the listener that a message has been received from the given reader

  - ### Uses of I2CPMessage in net.i2p.internal

    Classes in net.i2p.internal that implement I2CPMessage
    Modifier and Type | Class and Description
    --- | ---
    `class` | `PoisonI2CPMessage` For marking end-of-queues in a standard manner.

    Methods in net.i2p.internal that return I2CPMessage
    Modifier and Type | Method and Description
    --- | ---
    `abstract I2CPMessage` | I2CPMessageQueue.`poll()` Receive a message, nonblocking.
    `abstract I2CPMessage` | I2CPMessageQueue.`take()` Receive a message, blocking until one is available.

    Methods in net.i2p.internal with parameters of type I2CPMessage
    Modifier and Type | Method and Description
    --- | ---
    `abstract boolean` | I2CPMessageQueue.`offer(I2CPMessage msg)` Send a message, nonblocking.
    `abstract boolean` | I2CPMessageQueue.`offer(I2CPMessage msg, long timeout)` Send a message, blocking.
    `abstract void` | I2CPMessageQueue.`put(I2CPMessage msg)` Send a message, blocking until space is available.

  - ### Uses of I2CPMessage in net.i2p.router.client

    Methods in net.i2p.router.client that return I2CPMessage
    Modifier and Type | Method and Description
    --- | ---
    `I2CPMessage` | I2CPMessageQueueImpl.`poll()` Receive a message, non-blocking
    `I2CPMessage` | I2CPMessageQueueImpl.`take()` Receive a message, blocking until one is available

    Methods in net.i2p.router.client with parameters of type I2CPMessage
    Modifier and Type | Method and Description
    --- | ---
    `void` | ClientWriterRunner.`addMessage(I2CPMessage msg)` Add this message to the writer's queue Nonblocking, throws exception if queue is full
    `(package private) void` | ClientConnectionRunner.`doSend(I2CPMessage msg)` Actually send the I2CPMessage to the peer through the socket
    `(package private) void` | QueuedClientConnectionRunner.`doSend(I2CPMessage msg)` Actually send the I2CPMessage to the client.
    `void` | ClientMessageEventListener.`messageReceived(I2CPMessageReader reader, I2CPMessage message)` Handle an incoming message and dispatch it to the appropriate handler
    `boolean` | I2CPMessageQueueImpl.`offer(I2CPMessage msg)` Send a message, nonblocking
    `boolean` | I2CPMessageQueueImpl.`offer(I2CPMessage msg, long timeout)` Send a message, blocking.
    `void` | I2CPMessageQueueImpl.`put(I2CPMessage msg)` Send a message, blocking until space is available
    `(package private) void` | ClientConnectionRunner.`writeMessage(I2CPMessage msg)` Not thread-safe.
    `(package private) void` | QueuedClientConnectionRunner.`writeMessage(I2CPMessage msg)` In super(), doSend queues it to the writer thread and the writer thread calls writeMessage() to write to the output stream.

    Constructor parameters in net.i2p.router.client with type arguments of type I2CPMessage
    Constructor and Description
    `I2CPMessageQueueImpl(BlockingQueue<I2CPMessage> in, BlockingQueue<I2CPMessage> out)`
    `I2CPMessageQueueImpl(BlockingQueue<I2CPMessage> in, BlockingQueue<I2CPMessage> out)`