/*
* Copyright (C) 2010 Teleal GmbH, Switzerland
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.teleal.cling.support.model;
import org.teleal.cling.model.ServiceReference;
/**
* Immutable type encapsulating the state of a single connection.
*
* @author Alessio Gaeta
* @author Christian Bauer
*/
public class ConnectionInfo {
public enum Status {
OK,
ContentFormatMismatch,
InsufficientBandwidth,
UnreliableChannel,
Unknown
}
public enum Direction {
Output,
Input;
public Direction getOpposite() {
return this.equals(Output) ? Input : Output;
}
}
final protected int connectionID;
final protected int rcsID;
final protected int avTransportID;
final protected ProtocolInfo protocolInfo;
final protected ServiceReference peerConnectionManager;
final protected int peerConnectionID;
final protected Direction direction;
protected Status connectionStatus = Status.Unknown;
/**
* Creates a default instance with values expected for the default connection ID "0".
* <p>
* The ConnectionManager 1.0 specification says:
* </p>
* <p>
* If optional action PrepareForConnection is not implemented then (limited) connection
* information can be retrieved for ConnectionID 0. The device should return all known
* information:
* </p>
* <ul>
* <li>RcsID should be 0 or -1</li>
* <li>AVTransportID should be 0 or -1</li>
* <li>ProtocolInfo should contain accurate information if it is known, otherwhise
* it should be NULL (empty string)</li>
* <li>PeerConnectionManager should be NULL (empty string)</li>
* <li>PeerConnectionID should be -1</li>
* <li>Direction should be Input or Output</li>
* <li>Status should be OK or Unknown</li>
* </ul>
*/
public ConnectionInfo() {
this(0, 0, 0, null, null, -1, Direction.Input, Status.Unknown);
}
public ConnectionInfo(int connectionID,
int rcsID, int avTransportID,
ProtocolInfo protocolInfo,
ServiceReference peerConnectionManager, int peerConnectionID,
Direction direction, Status connectionStatus) {
this.connectionID = connectionID;
this.rcsID = rcsID;
this.avTransportID = avTransportID;
this.protocolInfo = protocolInfo;
this.peerConnectionManager = peerConnectionManager;
this.peerConnectionID = peerConnectionID;
this.direction = direction;
this.connectionStatus = connectionStatus;
}
public int getConnectionID() {
return connectionID;
}
public int getRcsID() {
return rcsID;
}
public int getAvTransportID() {
return avTransportID;
}
public ProtocolInfo getProtocolInfo() {
return protocolInfo;
}
public ServiceReference getPeerConnectionManager() {
return peerConnectionManager;
}
public int getPeerConnectionID() {
return peerConnectionID;
}
public Direction getDirection() {
return direction;
}
synchronized public Status getConnectionStatus() {
return connectionStatus;
}
synchronized public void setConnectionStatus(Status connectionStatus) {
this.connectionStatus = connectionStatus;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ConnectionInfo that = (ConnectionInfo) o;
if (avTransportID != that.avTransportID) return false;
if (connectionID != that.connectionID) return false;
if (peerConnectionID != that.peerConnectionID) return false;
if (rcsID != that.rcsID) return false;
if (connectionStatus != that.connectionStatus) return false;
if (direction != that.direction) return false;
if (peerConnectionManager != null ? !peerConnectionManager.equals(that.peerConnectionManager) : that.peerConnectionManager != null)
return false;
if (protocolInfo != null ? !protocolInfo.equals(that.protocolInfo) : that.protocolInfo != null) return false;
return true;
}
@Override
public int hashCode() {
int result = connectionID;
result = 31 * result + rcsID;
result = 31 * result + avTransportID;
result = 31 * result + (protocolInfo != null ? protocolInfo.hashCode() : 0);
result = 31 * result + (peerConnectionManager != null ? peerConnectionManager.hashCode() : 0);
result = 31 * result + peerConnectionID;
result = 31 * result + direction.hashCode();
result = 31 * result + connectionStatus.hashCode();
return result;
}
@Override
public String toString() {
return "(" + getClass().getSimpleName() + ") ID: " + getConnectionID() + ", Status: " + getConnectionStatus();
}
}