/*
* 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.types.InvalidValueException;
import org.teleal.common.util.MimeType;
/**
* Encaspulates a MIME type (content format) and transport, protocol, additional information.
*
* @author Christian Bauer
*/
public class ProtocolInfo {
public static final String WILDCARD = "*";
public static final String TRAILING_ZEROS = "000000000000000000000000";
public static final class DLNAFlags {
public static final int SENDER_PACED = (1 << 31);
public static final int TIME_BASED_SEEK = (1 << 30);
public static final int BYTE_BASED_SEEK = (1 << 29);
public static final int FLAG_PLAY_CONTAINER = (1 << 28);
public static final int S0_INCREASE = (1 << 27);
public static final int SN_INCREASE = (1 << 26);
public static final int RTSP_PAUSE = (1 << 25);
public static final int STREAMING_TRANSFER_MODE = (1 << 24);
public static final int INTERACTIVE_TRANSFERT_MODE = (1 << 23);
public static final int BACKGROUND_TRANSFERT_MODE = (1 << 22);
public static final int CONNECTION_STALL = (1 << 21);
public static final int DLNA_V15 = (1 << 20);
}
protected Protocol protocol = Protocol.ALL;
protected String network = WILDCARD;
protected String contentFormat = WILDCARD;
protected String additionalInfo = WILDCARD;
public ProtocolInfo(String s) throws InvalidValueException {
if (s == null) throw new NullPointerException();
s = s.trim();
String[] split = s.split(":");
if (split.length != 4) {
throw new InvalidValueException("Can't parse ProtocolInfo string: " + s);
}
this.protocol = Protocol.valueOrNullOf(split[0]);
this.network = split[1];
this.contentFormat = split[2];
this.additionalInfo = split[3];
}
public ProtocolInfo(MimeType contentFormatMimeType) {
this.protocol = Protocol.HTTP_GET;
this.contentFormat = contentFormatMimeType.toString();
}
public ProtocolInfo(Protocol protocol, String network, String contentFormat, String additionalInfo) {
this.protocol = protocol;
this.network = network;
this.contentFormat = contentFormat;
this.additionalInfo = additionalInfo;
}
public Protocol getProtocol() {
return protocol;
}
public String getNetwork() {
return network;
}
public String getContentFormat() {
return contentFormat;
}
public MimeType getContentFormatMimeType() throws IllegalArgumentException {
return MimeType.valueOf(contentFormat);
}
public String getAdditionalInfo() {
return additionalInfo;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ProtocolInfo that = (ProtocolInfo) o;
if (!additionalInfo.equals(that.additionalInfo)) return false;
if (!contentFormat.equals(that.contentFormat)) return false;
if (!network.equals(that.network)) return false;
if (protocol != that.protocol) return false;
return true;
}
@Override
public int hashCode() {
int result = protocol.hashCode();
result = 31 * result + network.hashCode();
result = 31 * result + contentFormat.hashCode();
result = 31 * result + additionalInfo.hashCode();
return result;
}
@Override
public String toString() {
return protocol.toString() + ":" +
network + ":" +
contentFormat + ":" +
additionalInfo;
}
}