TcpTransceiver.java

// Copyright (c) ZeroC, Inc.

package com.zeroc.Ice;

import java.net.Socket;
import java.nio.channels.SelectableChannel;

final class TcpTransceiver implements Transceiver {
    @Override
    public SelectableChannel fd() {
        assert (_stream != null);
        return _stream.fd();
    }

    @Override
    public void setReadyCallback(ReadyCallback callback) {
        // No need of the callback
    }

    @Override
    public int initialize(Buffer readBuffer, Buffer writeBuffer) {
        return _stream.connect(readBuffer, writeBuffer);
    }

    @Override
    public int closing(boolean initiator, LocalException ex) {
        // If we are initiating the connection closure, wait for the peer to close the TCP/IP
        // connection. Otherwise, close immediately.
        return initiator ? SocketOperation.Read : SocketOperation.None;
    }

    @Override
    public void close() {
        _stream.close();
    }

    @Override
    public EndpointI bind() {
        assert false;
        return null;
    }

    @Override
    public int write(Buffer buf) {
        return _stream.write(buf);
    }

    @Override
    public int read(Buffer buf) {
        return _stream.read(buf);
    }

    @Override
    public String protocol() {
        return _instance.protocol();
    }

    @Override
    public String toString() {
        return _stream.toString();
    }

    @Override
    public String toDetailedString() {
        return toString();
    }

    @Override
    public ConnectionInfo getInfo(boolean incoming, String adapterName, String connectionId) {
        if (_stream.fd() == null) {
            return new TCPConnectionInfo(incoming, adapterName, connectionId);
        } else {
            Socket socket = _stream.fd().socket();

            String remoteAddress = "";
            int remotePort = -1;
            if (socket.getInetAddress() != null) {
                remoteAddress = socket.getInetAddress().getHostAddress();
                remotePort = socket.getPort();
            }

            int rcvSize = 0;
            int sndSize = 0;
            if (!socket.isClosed()) {
                rcvSize = Network.getRecvBufferSize(_stream.fd());
                sndSize = Network.getSendBufferSize(_stream.fd());
            }

            return new TCPConnectionInfo(
                incoming,
                adapterName,
                connectionId,
                socket.getLocalAddress().getHostAddress(),
                socket.getLocalPort(),
                remoteAddress,
                remotePort,
                rcvSize,
                sndSize);
        }
    }

    @Override
    public void checkSendSize(Buffer buf) {}

    @Override
    public void setBufferSize(int rcvSize, int sndSize) {
        _stream.setBufferSize(rcvSize, sndSize);
    }

    TcpTransceiver(ProtocolInstance instance, StreamSocket stream) {
        _instance = instance;
        _stream = stream;
    }

    private final ProtocolInstance _instance;
    private final StreamSocket _stream;
}