/*
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
*
* Copyright @ 2015 Atlassian Pty Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.java.sip.communicator.impl.protocol.jabber;
import java.lang.reflect.*;
import java.net.*;
import org.ice4j.*;
import org.ice4j.ice.*;
import org.ice4j.socket.*;
/**
* Represents a <tt>Candidate</tt> obtained via Jingle Nodes.
*
* @author Sebastien Vincent
*/
public class JingleNodesCandidate
extends LocalCandidate
{
/**
* The socket used to communicate with relay.
*/
private IceSocketWrapper socket = null;
/**
* The <tt>RelayedCandidateDatagramSocket</tt> of this
* <tt>JingleNodesCandidate</tt>.
*/
private JingleNodesCandidateDatagramSocket
jingleNodesCandidateDatagramSocket = null;
/**
* <tt>TransportAddress</tt> of the Jingle Nodes relay where we will send
* our packet.
*/
private TransportAddress localEndPoint = null;
/**
* Creates a <tt>JingleNodesRelayedCandidate</tt> for the specified
* transport, address, and base.
*
* @param transportAddress the transport address that this candidate is
* encapsulating.
* @param parentComponent the <tt>Component</tt> that this candidate
* belongs to.
* @param localEndPoint <tt>TransportAddress</tt> of the Jingle Nodes relay
* where we will send our packet.
*/
public JingleNodesCandidate(TransportAddress transportAddress,
Component parentComponent, TransportAddress localEndPoint)
{
super(
transportAddress,
parentComponent,
CandidateType.RELAYED_CANDIDATE,
CandidateExtendedType.JINGLE_NODE_CANDIDATE,
null);
setBase(this);
setRelayServerAddress(localEndPoint);
this.localEndPoint = localEndPoint;
}
/**
* Gets the <tt>JingleNodesCandidateDatagramSocket</tt> of this
* <tt>JingleNodesCandidate</tt>.
* <p>
* <b>Note</b>: The method is part of the internal API of
* <tt>RelayedCandidate</tt> and <tt>TurnCandidateHarvest</tt> and is not
* intended for public use.
* </p>
*
* @return the <tt>RelayedCandidateDatagramSocket</tt> of this
* <tt>RelayedCandidate</tt>
*/
private synchronized JingleNodesCandidateDatagramSocket
getRelayedCandidateDatagramSocket()
{
if (jingleNodesCandidateDatagramSocket == null)
{
try
{
jingleNodesCandidateDatagramSocket
= new JingleNodesCandidateDatagramSocket(
this, localEndPoint);
}
catch (SocketException sex)
{
throw new UndeclaredThrowableException(sex);
}
}
return jingleNodesCandidateDatagramSocket;
}
/**
* Gets the <tt>DatagramSocket</tt> associated with this <tt>Candidate</tt>.
*
* @return the <tt>DatagramSocket</tt> associated with this
* <tt>Candidate</tt>
*/
@Override
protected IceSocketWrapper getCandidateIceSocketWrapper()
{
if (socket == null)
{
try
{
socket
= new IceUdpSocketWrapper(new MultiplexingDatagramSocket(
getRelayedCandidateDatagramSocket()));
}
catch (SocketException sex)
{
throw new UndeclaredThrowableException(sex);
}
}
return socket;
}
}