📄 sdpcontents.cxx
字号:
SdpContents::Session::Time::Time(const Time& rhs)
: mStart(rhs.mStart),
mStop(rhs.mStop)
{}
SdpContents::Session::Time&
SdpContents::Session::Time::operator=(const Time& rhs)
{
if (this != &rhs)
{
mStart = rhs.mStart;
mStop = rhs.mStop;
mRepeats = rhs.mRepeats;
}
return *this;
}
ostream&
SdpContents::Session::Time::encode(ostream& s) const
{
s << "t=" << mStart << Symbols::SPACE[0]
<< mStop
<< Symbols::CRLF;
for (list<Repeat>::const_iterator i = mRepeats.begin();
i != mRepeats.end(); ++i)
{
i->encode(s);
}
return s;
}
void
SdpContents::Session::Time::parse(ParseBuffer& pb)
{
pb.skipChar('t');
pb.skipChar(Symbols::EQUALS[0]);
mStart = pb.uInt32();
pb.skipChar(Symbols::SPACE[0]);
mStop = pb.uInt32();
skipEol(pb);
while (!pb.eof() && *pb.position() == 'r')
{
addRepeat(Repeat());
mRepeats.back().parse(pb);
}
}
void
SdpContents::Session::Time::addRepeat(const Repeat& repeat)
{
mRepeats.push_back(repeat);
}
SdpContents::Session::Time::Repeat::Repeat(unsigned long interval,
unsigned long duration,
list<int> offsets)
: mInterval(interval),
mDuration(duration),
mOffsets(offsets)
{}
ostream&
SdpContents::Session::Time::Repeat::encode(ostream& s) const
{
s << "r="
<< mInterval << Symbols::SPACE[0]
<< mDuration << 's';
for (list<int>::const_iterator i = mOffsets.begin();
i != mOffsets.end(); ++i)
{
s << Symbols::SPACE[0] << *i << 's';
}
s << Symbols::CRLF;
return s;
}
int
parseTypedTime(ParseBuffer& pb)
{
int v = pb.integer();
if (!pb.eof())
{
switch (*pb.position())
{
case 's' :
pb.skipChar();
break;
case 'm' :
v *= 60;
pb.skipChar();
break;
case 'h' :
v *= 3600;
pb.skipChar();
break;
case 'd' :
v *= 3600*24;
pb.skipChar();
}
}
return v;
}
void
SdpContents::Session::Time::Repeat::parse(ParseBuffer& pb)
{
pb.skipChar('r');
pb.skipChar(Symbols::EQUALS[0]);
mInterval = parseTypedTime(pb);
pb.skipChar(Symbols::SPACE[0]);
mDuration = parseTypedTime(pb);
while (!pb.eof() && *pb.position() != Symbols::CR[0])
{
pb.skipChar(Symbols::SPACE[0]);
mOffsets.push_back(parseTypedTime(pb));
}
skipEol(pb);
}
SdpContents::Session::Timezones::Adjustment::Adjustment(unsigned long _time,
int _offset)
: time(_time),
offset(_offset)
{}
SdpContents::Session::Timezones::Adjustment::Adjustment(const Adjustment& rhs)
: time(rhs.time),
offset(rhs.offset)
{}
SdpContents::Session::Timezones::Adjustment&
SdpContents::Session::Timezones::Adjustment::operator=(const Adjustment& rhs)
{
if (this != &rhs)
{
time = rhs.time;
offset = rhs.offset;
}
return *this;
}
SdpContents::Session::Timezones::Timezones()
: mAdjustments()
{}
SdpContents::Session::Timezones::Timezones(const Timezones& rhs)
: mAdjustments(rhs.mAdjustments)
{}
SdpContents::Session::Timezones&
SdpContents::Session::Timezones::operator=(const Timezones& rhs)
{
if (this != &rhs)
{
mAdjustments = rhs.mAdjustments;
}
return *this;
}
ostream&
SdpContents::Session::Timezones::encode(ostream& s) const
{
if (!mAdjustments.empty())
{
s << "z=";
bool first = true;
for (list<Adjustment>::const_iterator i = mAdjustments.begin();
i != mAdjustments.end(); ++i)
{
if (!first)
{
s << Symbols::SPACE[0];
}
first = false;
s << i->time << Symbols::SPACE[0]
<< i->offset << 's';
}
s << Symbols::CRLF;
}
return s;
}
void
SdpContents::Session::Timezones::parse(ParseBuffer& pb)
{
pb.skipChar('z');
pb.skipChar(Symbols::EQUALS[0]);
while (!pb.eof() && *pb.position() != Symbols::CR[0])
{
Adjustment adj(0, 0);
adj.time = pb.integer();
pb.skipChar(Symbols::SPACE[0]);
adj.offset = parseTypedTime(pb);
addAdjustment(adj);
if (!pb.eof() && *pb.position() == Symbols::SPACE[0])
{
pb.skipChar();
}
}
skipEol(pb);
}
void
SdpContents::Session::Timezones::addAdjustment(const Adjustment& adjust)
{
mAdjustments.push_back(adjust);
}
SdpContents::Session::Encryption::Encryption()
: mMethod(NoEncryption),
mKey(Data::Empty)
{}
SdpContents::Session::Encryption::Encryption(const KeyType& method,
const Data& key)
: mMethod(method),
mKey(key)
{}
SdpContents::Session::Encryption::Encryption(const Encryption& rhs)
: mMethod(rhs.mMethod),
mKey(rhs.mKey)
{}
SdpContents::Session::Encryption&
SdpContents::Session::Encryption::operator=(const Encryption& rhs)
{
if (this != &rhs)
{
mMethod = rhs.mMethod;
mKey = rhs.mKey;
}
return *this;
}
const char* KeyTypes[] = {"????", "prompt", "clear", "base64", "uri"};
ostream&
SdpContents::Session::Encryption::encode(ostream& s) const
{
s << "k="
<< KeyTypes[mMethod];
if (mMethod != Prompt)
{
s << Symbols::COLON[0] << mKey;
}
s << Symbols::CRLF;
return s;
}
void
SdpContents::Session::Encryption::parse(ParseBuffer& pb)
{
pb.skipChar('k');
const char* anchor = pb.skipChar(Symbols::EQUALS[0]);
pb.skipToChar(Symbols::COLON[0]);
if (!pb.eof())
{
Data p;
pb.data(p, anchor);
if (p == KeyTypes[Clear])
{
mMethod = Clear;
}
else if (p == KeyTypes[Base64])
{
mMethod = Base64;
}
else if (p == KeyTypes[UriKey])
{
mMethod = UriKey;
}
anchor = pb.skipChar(Symbols::COLON[0]);
pb.skipToOneOf(Symbols::CRLF);
pb.data(mKey, anchor);
}
else
{
pb.reset(anchor);
pb.skipToOneOf(Symbols::CRLF);
Data p;
pb.data(p, anchor);
if (p == KeyTypes[Prompt])
{
mMethod = Prompt;
}
}
skipEol(pb);
}
SdpContents::Session::Session(int version,
const Origin& origin,
const Data& name)
: mVersion(version),
mOrigin(origin),
mName(name)
{}
SdpContents::Session::Session(const Session& rhs)
{
*this = rhs;
}
SdpContents::Session&
SdpContents::Session::operator=(const Session& rhs)
{
if (this != &rhs)
{
mVersion = rhs.mVersion;
mOrigin = rhs.mOrigin;
mName = rhs.mName;
mMedia = rhs.mMedia;
mInformation = rhs.mInformation;
mUri = rhs.mUri;
mEmails = rhs.mEmails;
mPhones = rhs.mPhones;
mConnection = rhs.mConnection;
mBandwidths = rhs.mBandwidths;
mTimes = rhs.mTimes;
mTimezones = rhs.mTimezones;
mEncryption = rhs.mEncryption;
mAttributeHelper = rhs.mAttributeHelper;
for (std::list<Medium>::iterator i=mMedia.begin(); i != mMedia.end(); ++i)
{
i->setSession(this);
}
}
return *this;
}
void
SdpContents::Session::parse(ParseBuffer& pb)
{
pb.skipChar('v');
pb.skipChar(Symbols::EQUALS[0]);
mVersion = pb.integer();
skipEol(pb);
mOrigin.parse(pb);
pb.skipChar('s');
const char* anchor = pb.skipChar(Symbols::EQUALS[0]);
pb.skipToOneOf(Symbols::CRLF);
pb.data(mName, anchor);
skipEol(pb);
if (!pb.eof() && *pb.position() == 'i')
{
pb.skipChar('i');
const char* anchor = pb.skipChar(Symbols::EQUALS[0]);
pb.skipToOneOf(Symbols::CRLF);
pb.data(mInformation, anchor);
skipEol(pb);
}
if (!pb.eof() && *pb.position() == 'u')
{
pb.skipChar('u');
pb.skipChar(Symbols::EQUALS[0]);
mUri.parse(pb);
skipEol(pb);
}
while (!pb.eof() && *pb.position() == 'e')
{
addEmail(Email());
mEmails.back().parse(pb);
}
while (!pb.eof() && *pb.position() == 'p')
{
addPhone(Phone());
mPhones.back().parse(pb);
}
if (!pb.eof() && *pb.position() == 'c')
{
mConnection.parse(pb);
}
while (!pb.eof() && *pb.position() == 'b')
{
addBandwidth(Bandwidth());
mBandwidths.back().parse(pb);
}
while (!pb.eof() && *pb.position() == 't')
{
addTime(Time());
mTimes.back().parse(pb);
}
if (!pb.eof() && *pb.position() == 'z')
{
mTimezones.parse(pb);
}
if (!pb.eof() && *pb.position() == 'k')
{
mEncryption.parse(pb);
}
mAttributeHelper.parse(pb);
while (!pb.eof() && *pb.position() == 'm')
{
addMedium(Medium());
mMedia.back().parse(pb);
}
}
ostream&
SdpContents::Session::encode(ostream& s) const
{
s << "v=" << mVersion << Symbols::CRLF;
mOrigin.encode(s);
s << "s=" << mName << Symbols::CRLF;
if (!mInformation.empty())
{
s << "i=" << mInformation << Symbols::CRLF;
}
if (!mUri.host().empty())
{
mUri.encode(s);
s << Symbols::CRLF;
}
for (list<Email>::const_iterator i = mEmails.begin();
i != mEmails.end(); ++i)
{
i->encode(s);
}
for (list<Phone>::const_iterator i = mPhones.begin();
i != mPhones.end(); ++i)
{
i->encode(s);
}
if (!mConnection.getAddress().empty())
{
mConnection.encode(s);
}
for (list<Bandwidth>::const_iterator i = mBandwidths.begin();
i != mBandwidths.end(); ++i)
{
i->encode(s);
}
if (mTimes.empty())
{
s << "t=0 0" << Symbols::CRLF;
}
else
{
for (list<Time>::const_iterator i = mTimes.begin();
i != mTimes.end(); ++i)
{
i->encode(s);
}
}
mTimezones.encode(s);
if (mEncryption.getMethod() != Encryption::NoEncryption)
{
mEncryption.encode(s);
}
mAttributeHelper.encode(s);
for (list<Medium>::const_iterator i = mMedia.begin();
i != mMedia.end(); ++i)
{
i->encode(s);
}
return s;
}
void
SdpContents::Session::addEmail(const Email& email)
{
mEmails.push_back(email);
}
void
SdpContents::Session::addTime(const Time& t)
{
mTimes.push_back(t);
}
void
SdpContents::Session::addPhone(const Phone& phone)
{
mPhones.push_back(phone);
}
void
SdpContents::Session::addBandwidth(const Bandwidth& bandwidth)
{
mBandwidths.push_back(bandwidth);
}
void
SdpContents::Session::addMedium(const Medium& medium)
{
mMedia.push_back(medium);
mMedia.back().setSession(this);
}
void
SdpContents::Session::addAttribute(const Data& key, const Data& value)
{
mAttributeHelper.addAttribute(key, value);
if (key == rtpmap)
{
for (list<Medium>::iterator i = mMedia.begin();
i != mMedia.end(); ++i)
{
i->mRtpMapDone = false;
}
}
}
void
SdpContents::Session::clearAttribute(const Data& key)
{
mAttributeHelper.clearAttribute(key);
if (key == rtpmap)
{
for (list<Medium>::iterator i = mMedia.begin();
i != mMedia.end(); ++i)
{
i->mRtpMapDone = false;
}
}
}
bool
SdpContents::Session::exists(const Data& key) const
{
return mAttributeHelper.exists(key);
}
const list<Data>&
SdpContents::Session::getValues(const Data& key) const
{
return mAttributeHelper.getValues(key);
}
SdpContents::Session::Medium::Medium(const Data& name,
unsigned long port,
unsigned long multicast,
const Data& protocol)
: mSession(0),
mName(name),
mPort(port),
mMulticast(multicast),
mProtocol(protocol),
mRtpMapDone(false)
{}
SdpContents::Session::Medium::Medium()
: mSession(0),
mPort(0),
mMulticast(1),
mRtpMapDone(false)
{}
SdpContents::Session::Medium::Medium(const Medium& rhs)
: mSession(0),
mName(rhs.mName),
mPort(rhs.mPort),
mMulticast(rhs.mMulticast),
mProtocol(rhs.mProtocol),
mFormats(rhs.mFormats),
mCodecs(rhs.mCodecs),
mTransport(rhs.mTransport),
mInformation(rhs.mInformation),
mConnections(rhs.mConnections),
mBandwidths(rhs.mBandwidths),
mEncryption(rhs.mEncryption),
mAttributeHelper(rhs.mAttributeHelper),
mRtpMapDone(rhs.mRtpMapDone),
mRtpMap(rhs.mRtpMap)
{
}
SdpContents::Session::Medium&
SdpContents::Session::Medium::operator=(const Medium& rhs)
{
if (this != &rhs)
{
mSession = 0;
mName = rhs.mName;
mPort = rhs.mPort;
mMulticast = rhs.mMulticast;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -