00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
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