package org.red5.server.net.rtsp.messages; /* * RED5 Open Source Flash Server - http://www.osflash.org/red5 * * Copyright (c) 2006-2008 by respective authors (see below). All rights reserved. * * This library 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 2.1 of the License, or (at your option) any later * version. * * This library 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 library; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * Copyright (C) 2005 - Matteo Merli - matteo.merli@gmail.com * * * ***************************************************************************/ import java.nio.CharBuffer; import java.util.Properties; import org.red5.server.api.Red5; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Base abstract class for RTSP messages. * * @author Matteo Merli (matteo.merli@gmail.com) */ public abstract class RTSPMessage { /** * RTSP Message Type */ public enum Type { /** Generic message (internal use) */ TypeNone, /** Request message */ TypeRequest, /** Response message */ TypeResponse }; private static Logger log = LoggerFactory.getLogger(RTSPMessage.class); // CRLF public static final String CRLF = "\r\n"; private int sequenceNumber; private Properties headers; private StringBuffer buffer; private final static String serverSignature; static { serverSignature = Red5.getVersion().split("[$]")[0] + " (" + System.getProperty("os.name") + " / " + System.getProperty("os.version") + " / " + System.getProperty("os.arch") + ")"; log.debug("RTSP signature set to: {}", serverSignature); } /** * Constructor. */ public RTSPMessage() { sequenceNumber = 0; headers = new Properties(); buffer = new StringBuffer(); } /** * @return the RTSP type of the message */ public Type getType() { return Type.TypeNone; } /** * Adds a new header to the RTSP message. * * @param key * The name of the header * @param value * Its value */ public void setHeader(String key, String value) { // Handle some bad formatted headers if (key.compareToIgnoreCase("content-length") == 0) { headers.setProperty("Content-Length", value); } else { headers.setProperty(key, value); } } /** * @param key * Header name * @return the value of the header */ public String getHeader(String key) { return headers.getProperty(key); } /** * * @param key * Header name * @param defaultValue * the default value * @return the value of the header of <i>defaultValue</i> if header is not * found */ public String getHeader(String key, String defaultValue) { String value = getHeader(key); if (value == null) return defaultValue; else return value; } /** * Remove an header from the message headers collection * * @param key * the name of the header */ public void removeHeader(String key) { headers.remove(key); } /** * Formats all the headers into a string ready to be sent in a RTSP message. * * <pre> * Header1: Value1 * Header2: value 2 * ... * </pre> * * @return a string containing the serialized headers */ public String getHeadersString() { StringBuilder buf = new StringBuilder(); for (Object key : headers.keySet()) { String value = headers.getProperty((String) key); buf.append(key + ": " + value + CRLF); } return buf.toString(); } /** * * @return the number of headers owned by the message */ public int getHeadersCount() { return headers.size(); } /** * Sets common headers like <code>Server</code> and <code>Via</code>. */ public void setCommonHeaders() { if (getHeader("Server") != null) { setHeader("Via", serverSignature); } else { setHeader("Server", serverSignature); } } /** * * @param buffer * StringBuffer containing the contents */ public void setBuffer(StringBuffer buffer) { this.buffer = buffer; } /** * @param other * buffer with content to be appended */ public void appendToBuffer(StringBuffer other) { this.buffer.append(other); } /** * @param other * buffer with content to be appended */ public void appendToBuffer(CharBuffer other) { this.buffer.append(other); } /** * @return the content buffer */ public StringBuffer getBuffer() { return buffer; } /** * @return the size of the content buffer */ public int getBufferSize() { return buffer.length(); } /** * @return Returns the sequenceNumber. */ public int getSequenceNumber() { return sequenceNumber; } /** * @param sequenceNumber * The sequenceNumber to set. */ public void setSequenceNumber(int sequenceNumber) { this.sequenceNumber = sequenceNumber; } }