/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "sdp/SdpImpl.h" #include #include "mozilla/Assertions.h" #ifdef CRLF # undef CRLF #endif #define CRLF "\r\n" namespace mozilla { SdpImpl::SdpImpl(const SdpOrigin& origin, UniquePtr&& attributeList) : mOrigin(origin), mAttributeList(std::move(attributeList)) {} SdpImpl::SdpImpl(const SdpImpl& aOrig, UniquePtr&& attributeList) : mOrigin(aOrig.mOrigin), mBandwidths(aOrig.mBandwidths), mAttributeList(std::move(attributeList)) {} UniquePtr SdpImpl::Clone() const { UniquePtr sdp(new SdpImpl( *this, MakeUnique(*mAttributeList, nullptr))); for (const auto& msection : mMediaSections) { sdp->mMediaSections.emplace_back(new SdpMediaSectionImpl( *msection, MakeUnique( *msection->mAttributeList, sdp->mAttributeList.get()))); } return sdp; } UniquePtr SdpImpl::CreateMediaSection(const size_t level) { return UniquePtr(new SdpMediaSectionImpl( level, MakeUnique(mAttributeList.get()))); } const SdpOrigin& SdpImpl::GetOrigin() const { return mOrigin; } uint32_t SdpImpl::GetBandwidth(const std::string& type) const { auto found = mBandwidths.find(type); if (found == mBandwidths.end()) { return 0; } return found->second; } const SdpAttributeList& SdpImpl::GetAttributeList() const { return *mAttributeList; } SdpAttributeList& SdpImpl::GetAttributeList() { return *mAttributeList; } const SdpMediaSection& SdpImpl::GetMediaSection(const size_t level) const { if (level >= mMediaSections.size()) { MOZ_CRASH(); } return *mMediaSections[level]; } SdpMediaSection& SdpImpl::GetMediaSection(const size_t level) { if (level >= mMediaSections.size()) { MOZ_CRASH(); } return *mMediaSections[level]; } SdpMediaSection& SdpImpl::AddMediaSection( const SdpMediaSection::MediaType mediaType, const SdpDirectionAttribute::Direction dir, const uint16_t port, const SdpMediaSection::Protocol protocol, const sdp::AddrType addrType, const std::string& addr) { UniquePtr media = CreateMediaSection(mMediaSections.size()); media->mMediaType = mediaType; media->mPort = port; media->mPortCount = 0; media->mProtocol = protocol; media->mConnection = MakeUnique(addrType, addr); media->GetAttributeList().SetAttribute( MakeUnique(dir)); mMediaSections.emplace_back(std::move(media)); return *mMediaSections.back(); } void SdpImpl::Serialize(std::ostream& os) const { os << "v=0" << CRLF << mOrigin << "s=-" << CRLF; // We don't support creating i=, u=, e=, p= // We don't generate c= at the session level (only in media) mBandwidths.Serialize(os); os << "t=0 0" << CRLF; // We don't support r= or z= // attributes os << *mAttributeList; // media sections for (const auto& msection : mMediaSections) { os << *msection; } } } // namespace mozilla