diff --git a/sflphone-common/src/sip/Fmtp.h b/sflphone-common/src/sip/Fmtp.h new file mode 100644 index 0000000000000000000000000000000000000000..1bb287513d5ad8e34464f37b4297b61f4d3e975c --- /dev/null +++ b/sflphone-common/src/sip/Fmtp.h @@ -0,0 +1,155 @@ +/* + * Copyright (C) 2004, 2005, 2006, 2009, 2008, 2009, 2010 Savoir-Faire Linux Inc. + * Author: Pierre-Luc Bacon <pierre-luc.bacon@savoirfairelinux.com> + * + * 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 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Additional permission under GNU GPL version 3 section 7: + * + * If you modify this program, or any covered work, by linking or + * combining it with the OpenSSL project's OpenSSL library (or a + * modified version of that library), containing parts covered by the + * terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc. + * grants you additional permission to convey the resulting work. + * Corresponding Source for a non-source form of such a combination + * shall include the source code for the parts of OpenSSL used as well + * as that of the covered work. + */ +#ifndef __SFL_FMTP_H__ +#define __SFL_FMTP_H__ + +#include "logger.h" + +#include <cc++/tokenizer.h> +#include <string> +#include <map> + +namespace sfl { + +/** + * A utility class for holding SDP parameters. + */ +class SdpParameter: public std::pair<std::string, std::string> { +public: + SdpParameter(const std::string& name, const std::string& value) : + std::pair<std::string, std::string>(name, value) { + } + ; + inline ~SdpParameter() { + } + ; + std::string getName() const { + return first; + } + std::string getValue() const { + return second; + } +}; + +/** + * Class for holding the attributes of a a=fmtp SDP line. + */ +class Fmtp: public std::map<std::string, std::string> { +public: + Fmtp(const std::string& payloadType) { + this->payloadType = payloadType; + params = ""; + } + + Fmtp() { + payloadType = "96"; + params = ""; + } + + /** + * Split the params of a a=fmtp line into its individual parameter, separated by ";" tokens. + * Note that RFC4566 indicates no assumption about how this piece of data should be formatted. + * + * @param payloadType The static or dynamic payload type corresponding to some a=rtpmap line. + * @params params Codec specific parameters. + */ + Fmtp(const std::string& payloadType, const std::string& paramsUnparsed) { + this->payloadType = payloadType; + params = paramsUnparsed; + + ost::StringTokenizer paramsTokenizer(paramsUnparsed.c_str(), ";", + false, true); + ost::StringTokenizer::iterator it; + + for (it = paramsTokenizer.begin(); it != paramsTokenizer.end(); ++it) { + std::string param(*it); + size_t pos = param.find("="); + std::string value = param.substr(pos + 1); // FIXME Too naive ! + std::string property = param.substr(0, pos); // FIXME Too naive ! + + insert(std::pair<std::string, std::string>(property, value)); + } + } + + /** + * Given the list of parameters kept in this object, + * create a formatted string that represents this list. + * @return The formatted list of parameters. + */ + std::string getParametersFormatted() const { + std::string output = ""; + int numberParamsAppended = 0; + + const_iterator it; + for (it = begin(); it != end(); it++) { + std::string name = (*it).first; + std::string value = (*it).second; + if (numberParamsAppended != 0) { + output.append("; "); + } + + output.append(name + "=" + value); + + numberParamsAppended += 1; + } + + return output; + } + + /** + * @return An iterator to the element, if the specified key value is found, + * or Fmtp::end if the specified is not found in the parameter list. + */ + iterator getParameter(const std::string& paramName) { + return find(paramName); + } + + /** + * @return An iterator to the element, if the specified key value is found, + * or Fmtp::end if the specified is not found in the parameter list. + */ + const_iterator getParameter(const std::string& paramName) const { + return find(paramName); + } + + /** + * @return The static or dynamic payload type corresponding to some a=rtpmap line. + */ + std::string getPayloadType() const { + return payloadType; + } + +private: + std::string payloadType; + std::string params; +}; + +} + +#endif