📄 sdpcontents.cxx
字号:
} 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;}voidSdpContents::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); }}voidSdpContents::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;}intparseTypedTime(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;}voidSdpContents::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;}voidSdpContents::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);}voidSdpContents::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;}voidSdpContents::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;}voidSdpContents::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()) { s << "u="; 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;}voidSdpContents::Session::addEmail(const Email& email){ mEmails.push_back(email);}voidSdpContents::Session::addTime(const Time& t){ mTimes.push_back(t);}voidSdpContents::Session::addPhone(const Phone& phone){ mPhones.push_back(phone);}voidSdpContents::Session::addBandwidth(const Bandwidth& bandwidth){ mBandwidths.push_back(bandwidth);}voidSdpContents::Session::addMedium(const Medium& medium){ mMedia.push_back(medium); mMedia.back().setSession(this);}voidSdpContents::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; } }}voidSdpContents::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; } }}boolSdpContents::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; 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; } return *this;}voidSdpContents::Session::Medium::setPort(int port){ mPort = port;}voidSdpContents::Session::Medium::setSession(Session* session){ mSession = session;}voidSdpContents::Session::Medium::parse(ParseBuffer& pb){ pb.skipChar('m'); const char* anchor = pb.skipChar(Symbols::EQUALS[0]); pb.skipToChar(Symbols::SPACE[0]);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -