UdpConnector.java

// Copyright (c) ZeroC, Inc.

package com.zeroc.Ice;

import java.net.InetSocketAddress;
import java.nio.channels.SelectableChannel;
import java.util.Objects;

final class UdpConnector implements Connector {
    @Override
    public Transceiver connect() {
        if (Util.isAndroid() && _addr.getAddress().isMulticastAddress()) {
            return new UdpMulticastClientTransceiver(_instance, _addr, _mcastInterface, _mcastTtl);
        } else {
            return new UdpTransceiver(_instance, _addr, _sourceAddr, _mcastInterface, _mcastTtl);
        }
    }

    public SelectableChannel fd() {
        assert false; // Shouldn't be called, startConnect always completes immediately.
        return null;
    }

    @Override
    public short type() {
        return _instance.type();
    }

    @Override
    public String toString() {
        return Network.addrToString(_addr);
    }

    @Override
    public int hashCode() {
        int h = 5381;
        h = HashUtil.hashAdd(h, _addr.getAddress().getHostAddress());
        h = HashUtil.hashAdd(h, _addr.getPort());
        if (_sourceAddr != null) {
            h = HashUtil.hashAdd(h, _sourceAddr.getAddress().getHostAddress());
        }
        h = HashUtil.hashAdd(h, _mcastInterface);
        h = HashUtil.hashAdd(h, _mcastTtl);
        h = HashUtil.hashAdd(h, _connectionId);
        return h;
    }

    //
    // Only for use by UdpEndpointI
    //
    UdpConnector(
            ProtocolInstance instance,
            InetSocketAddress addr,
            InetSocketAddress sourceAddr,
            String mcastInterface,
            int mcastTtl,
            String connectionId) {
        _instance = instance;
        _addr = addr;
        _sourceAddr = sourceAddr;
        _mcastInterface = mcastInterface;
        _mcastTtl = mcastTtl;
        _connectionId = connectionId;
    }

    @Override
    public boolean equals(java.lang.Object obj) {
        if (!(obj instanceof UdpConnector)) {
            return false;
        }

        if (this == obj) {
            return true;
        }

        UdpConnector p = (UdpConnector) obj;
        if (!_connectionId.equals(p._connectionId)) {
            return false;
        }

        if (_mcastTtl != p._mcastTtl) {
            return false;
        }

        if (_mcastInterface.compareTo(p._mcastInterface) != 0) {
            return false;
        }

        if (!Objects.equals(_sourceAddr, p._sourceAddr)) {
            return false;
        }

        return Objects.equals(_addr, p._addr);
    }

    private final ProtocolInstance _instance;
    private final InetSocketAddress _addr;
    private final InetSocketAddress _sourceAddr;
    private final String _mcastInterface;
    private final int _mcastTtl;
    private final String _connectionId;
}