ECode DatagramChannelImpl::DatagramSocketAdapter::Connect(
    /* [in] */ ISocketAddress* peer)
{
    Boolean bval;
    if (IsConnected(&bval), bval) {
        // RI compatibility: If the socket is already connected this fails.
        // throw new IllegalStateException("Socket is already connected.");
        return E_ILLEGAL_STATE_EXCEPTION;
    }

    FAIL_RETURN(DatagramSocket::Connect(peer))
    // Connect may have performed an implicit bind(). Sync up here.
    mChannelImpl->OnBind(FALSE /* updateSocketState */);

    IInetSocketAddress* inetSocketAddress = IInetSocketAddress::Probe(peer);
    AutoPtr<IInetAddress> address;
    inetSocketAddress->GetAddress((IInetAddress**)&address);
    Int32 port;
    inetSocketAddress->GetPort(&port);
    return mChannelImpl->OnConnect(address, port, FALSE /* updateSocketState */);
}
ECode DatagramSocket::constructor(
    /* [in] */ ISocketAddress* localAddr)
{
    if (localAddr != NULL) {
        IInetSocketAddress* netSocketAddr = IInetSocketAddress::Probe(localAddr);
        if (netSocketAddr == NULL) {
            ALOGD("Error in DatagramSocket: Local address not an InetSocketAddress!");
            return E_ILLEGAL_ARGUMENT_EXCEPTION;
        }

        Int32 port;
        netSocketAddr->GetPort(&port);
        FAIL_RETURN(CheckPort(port));
    }
    if (mFactory != NULL) {
        mFactory->CreateDatagramSocketImpl((IDatagramSocketImpl**)&mImpl);
    }
    else {
       CPlainDatagramSocketImpl::New((IDatagramSocketImpl**)&mImpl);
    }
    mImpl->Create();
    if (localAddr != NULL) {
        // try {
        ECode ec = Bind(localAddr);
        if (FAILED(ec)) {
            Close();
            ALOGD("Error in DatagramSocket: failed to bind socket!");
            return ec;
        }
        // } catch (SocketException e) {
        //    close();
        //    throw e;
        // }
    }
    // SocketOptions.SO_BROADCAST is set by default for DatagramSocket
    return SetBroadcast(TRUE);
}