jrtplib
3.7.1
|
00001 /* 00002 00003 This file is a part of JRTPLIB 00004 Copyright (c) 1999-2007 Jori Liesenborgs 00005 00006 Contact: jori.liesenborgs@gmail.com 00007 00008 This library was developed at the "Expertisecentrum Digitale Media" 00009 (http://www.edm.uhasselt.be), a research center of the Hasselt University 00010 (http://www.uhasselt.be). The library is based upon work done for 00011 my thesis at the School for Knowledge Technology (Belgium/The Netherlands). 00012 00013 Permission is hereby granted, free of charge, to any person obtaining a 00014 copy of this software and associated documentation files (the "Software"), 00015 to deal in the Software without restriction, including without limitation 00016 the rights to use, copy, modify, merge, publish, distribute, sublicense, 00017 and/or sell copies of the Software, and to permit persons to whom the 00018 Software is furnished to do so, subject to the following conditions: 00019 00020 The above copyright notice and this permission notice shall be included 00021 in all copies or substantial portions of the Software. 00022 00023 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 00024 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00025 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 00026 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00027 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 00028 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 00029 IN THE SOFTWARE. 00030 00031 */ 00032 00037 #ifndef RTCPSDESINFO_H 00038 00039 #define RTCPSDESINFO_H 00040 00041 #include "rtpconfig.h" 00042 #include "rtperrors.h" 00043 #include "rtpdefines.h" 00044 #include "rtptypes.h" 00045 #include "rtpmemoryobject.h" 00046 #include <string.h> 00047 #include <list> 00048 00050 class RTCPSDESInfo : public RTPMemoryObject 00051 { 00052 public: 00054 RTCPSDESInfo(RTPMemoryManager *mgr = 0) : RTPMemoryObject(mgr) { for (int i = 0 ; i < RTCP_SDES_NUMITEMS_NONPRIVATE ; i++) nonprivateitems[i].SetMemoryManager(mgr); } 00055 virtual ~RTCPSDESInfo() { Clear(); } 00056 00058 void Clear(); 00059 00061 int SetCNAME(const uint8_t *s,size_t l) { return SetNonPrivateItem(RTCP_SDES_ID_CNAME-1,s,l); } 00062 00064 int SetName(const uint8_t *s,size_t l) { return SetNonPrivateItem(RTCP_SDES_ID_NAME-1,s,l); } 00065 00067 int SetEMail(const uint8_t *s,size_t l) { return SetNonPrivateItem(RTCP_SDES_ID_EMAIL-1,s,l); } 00068 00070 int SetPhone(const uint8_t *s,size_t l) { return SetNonPrivateItem(RTCP_SDES_ID_PHONE-1,s,l); } 00071 00073 int SetLocation(const uint8_t *s,size_t l) { return SetNonPrivateItem(RTCP_SDES_ID_LOCATION-1,s,l); } 00074 00076 int SetTool(const uint8_t *s,size_t l) { return SetNonPrivateItem(RTCP_SDES_ID_TOOL-1,s,l); } 00077 00079 int SetNote(const uint8_t *s,size_t l) { return SetNonPrivateItem(RTCP_SDES_ID_NOTE-1,s,l); } 00080 00081 #ifdef RTP_SUPPORT_SDESPRIV 00082 00086 int SetPrivateValue(const uint8_t *prefix,size_t prefixlen,const uint8_t *value,size_t valuelen); 00087 00089 int DeletePrivatePrefix(const uint8_t *s,size_t len); 00090 #endif // RTP_SUPPORT_SDESPRIV 00091 00093 uint8_t *GetCNAME(size_t *len) const { return GetNonPrivateItem(RTCP_SDES_ID_CNAME-1,len); } 00094 00096 uint8_t *GetName(size_t *len) const { return GetNonPrivateItem(RTCP_SDES_ID_NAME-1,len); } 00097 00099 uint8_t *GetEMail(size_t *len) const { return GetNonPrivateItem(RTCP_SDES_ID_EMAIL-1,len); } 00100 00102 uint8_t *GetPhone(size_t *len) const { return GetNonPrivateItem(RTCP_SDES_ID_PHONE-1,len); } 00103 00105 uint8_t *GetLocation(size_t *len) const { return GetNonPrivateItem(RTCP_SDES_ID_LOCATION-1,len); } 00106 00108 uint8_t *GetTool(size_t *len) const { return GetNonPrivateItem(RTCP_SDES_ID_TOOL-1,len); } 00109 00111 uint8_t *GetNote(size_t *len) const { return GetNonPrivateItem(RTCP_SDES_ID_NOTE-1,len); } 00112 #ifdef RTP_SUPPORT_SDESPRIV 00113 00114 void GotoFirstPrivateValue(); 00115 00123 bool GetNextPrivateValue(uint8_t **prefix,size_t *prefixlen,uint8_t **value,size_t *valuelen); 00124 00132 bool GetPrivateValue(const uint8_t *prefix,size_t prefixlen,uint8_t **value,size_t *valuelen) const; 00133 #endif // RTP_SUPPORT_SDESPRIV 00134 private: 00135 int SetNonPrivateItem(int itemno,const uint8_t *s,size_t l) { if (l > RTCP_SDES_MAXITEMLENGTH) return ERR_RTP_SDES_LENGTHTOOBIG; return nonprivateitems[itemno].SetInfo(s,l); } 00136 uint8_t *GetNonPrivateItem(int itemno,size_t *len) const { return nonprivateitems[itemno].GetInfo(len); } 00137 00138 class SDESItem : public RTPMemoryObject 00139 { 00140 public: 00141 SDESItem(RTPMemoryManager *mgr = 0) : RTPMemoryObject(mgr) 00142 { 00143 str = 0; 00144 length = 0; 00145 } 00146 void SetMemoryManager(RTPMemoryManager *mgr) 00147 { 00148 RTPMemoryObject::SetMemoryManager(mgr); 00149 } 00150 ~SDESItem() 00151 { 00152 if (str) 00153 RTPDeleteByteArray(str,GetMemoryManager()); 00154 } 00155 uint8_t *GetInfo(size_t *len) const { *len = length; return str; } 00156 int SetInfo(const uint8_t *s,size_t len) { return SetString(&str,&length,s,len); } 00157 protected: 00158 int SetString(uint8_t **dest,size_t *destlen,const uint8_t *s,size_t len) 00159 { 00160 if (len <= 0) 00161 { 00162 if (*dest) 00163 RTPDeleteByteArray((*dest),GetMemoryManager()); 00164 *dest = 0; 00165 *destlen = 0; 00166 } 00167 else 00168 { 00169 len = (len>RTCP_SDES_MAXITEMLENGTH)?RTCP_SDES_MAXITEMLENGTH:len; 00170 uint8_t *str2 = RTPNew(GetMemoryManager(),RTPMEM_TYPE_BUFFER_SDESITEM) uint8_t[len]; 00171 if (str2 == 0) 00172 return ERR_RTP_OUTOFMEM; 00173 memcpy(str2,s,len); 00174 *destlen = len; 00175 if (*dest) 00176 RTPDeleteByteArray((*dest),GetMemoryManager()); 00177 *dest = str2; 00178 } 00179 return 0; 00180 } 00181 private: 00182 uint8_t *str; 00183 size_t length; 00184 }; 00185 00186 SDESItem nonprivateitems[RTCP_SDES_NUMITEMS_NONPRIVATE]; 00187 00188 #ifdef RTP_SUPPORT_SDESPRIV 00189 class SDESPrivateItem : public SDESItem 00190 { 00191 public: 00192 SDESPrivateItem(RTPMemoryManager *mgr) : SDESItem(mgr) 00193 { 00194 prefixlen = 0; 00195 prefix = 0; 00196 } 00197 ~SDESPrivateItem() 00198 { 00199 if (prefix) 00200 RTPDeleteByteArray(prefix,GetMemoryManager()); 00201 } 00202 uint8_t *GetPrefix(size_t *len) const { *len = prefixlen; return prefix; } 00203 int SetPrefix(const uint8_t *s,size_t len) { return SetString(&prefix,&prefixlen,s,len); } 00204 private: 00205 uint8_t *prefix; 00206 size_t prefixlen; 00207 }; 00208 00209 std::list<SDESPrivateItem *> privitems; 00210 std::list<SDESPrivateItem *>::const_iterator curitem; 00211 #endif // RTP_SUPPORT_SDESPRIV 00212 }; 00213 00214 #endif // RTCPSDESINFO_H 00215