/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=2 et sw=2 tw=80: */
/* 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/. */
#ifndef _RSDPARSA_SDP_ATTRIBUTE_LIST_H_
#define _RSDPARSA_SDP_ATTRIBUTE_LIST_H_
#include "sdp/RsdparsaSdpGlue.h"
#include "sdp/RsdparsaSdpInc.h"
#include "sdp/SdpAttributeList.h"
namespace mozilla {
class RsdparsaSdp;
class RsdparsaSdpMediaSection;
class SdpParser;
class RsdparsaSdpAttributeList :
public SdpAttributeList {
friend class RsdparsaSdpMediaSection;
friend class RsdparsaSdp;
public:
// Make sure we don't hide the default arg thunks
using SdpAttributeList::GetAttribute;
using SdpAttributeList::HasAttribute;
bool HasAttribute(AttributeType type,
bool sessionFallback)
const override;
const SdpAttribute* GetAttribute(AttributeType type,
bool sessionFallback)
const override;
void SetAttribute(SdpAttribute* attr) override;
void RemoveAttribute(AttributeType type) override;
void Clear() override;
uint32_t Count()
const override;
const SdpConnectionAttribute& GetConnection()
const override;
const SdpFingerprintAttributeList& GetFingerprint()
const override;
const SdpGroupAttributeList& GetGroup()
const override;
const SdpOptionsAttribute& GetIceOptions()
const override;
const SdpRtcpAttribute& GetRtcp()
const override;
const SdpRemoteCandidatesAttribute& GetRemoteCandidates()
const override;
const SdpSetupAttribute& GetSetup()
const override;
const SdpSsrcAttributeList& GetSsrc()
const override;
const SdpSsrcGroupAttributeList& GetSsrcGroup()
const override;
const SdpDtlsMessageAttribute& GetDtlsMessage()
const override;
// These attributes can appear multiple times, so the returned
// classes actually represent a collection of values.
const std::vector<std::string>& GetCandidate()
const override;
const SdpExtmapAttributeList& GetExtmap()
const override;
const SdpFmtpAttributeList& GetFmtp()
const override;
const SdpImageattrAttributeList& GetImageattr()
const override;
const SdpSimulcastAttribute& GetSimulcast()
const override;
const SdpMsidAttributeList& GetMsid()
const override;
const SdpMsidSemanticAttributeList& GetMsidSemantic()
const override;
const SdpRidAttributeList& GetRid()
const override;
const SdpRtcpFbAttributeList& GetRtcpFb()
const override;
const SdpRtpmapAttributeList& GetRtpmap()
const override;
const SdpSctpmapAttributeList& GetSctpmap()
const override;
// These attributes are effectively simple types, so we'll make life
// easy by just returning their value.
uint32_t GetSctpPort()
const override;
uint32_t GetMaxMessageSize()
const override;
const std::string& GetIcePwd()
const override;
const std::string& GetIceUfrag()
const override;
const std::string& GetIdentity()
const override;
const std::string& GetLabel()
const override;
unsigned int GetMaxptime()
const override;
const std::string& GetMid()
const override;
unsigned int GetPtime()
const override;
SdpDirectionAttribute::Direction GetDirection()
const override;
void Serialize(std::ostream&)
const override;
virtual ~RsdparsaSdpAttributeList();
private:
explicit RsdparsaSdpAttributeList(RsdparsaSessionHandle session)
: mSession(std::move(session)),
mSessionAttributes(nullptr),
mIsVideo(
false),
mAttributes() {
RustAttributeList* attributes = get_sdp_session_attributes(mSession.get());
LoadAll(attributes);
}
RsdparsaSdpAttributeList(RsdparsaSessionHandle session,
const RustMediaSection*
const msection,
const RsdparsaSdpAttributeList* sessionAttributes)
: mSession(std::move(session)),
mSessionAttributes(sessionAttributes),
mAttributes() {
mIsVideo =
sdp_rust_get_media_type(msection) == RustSdpMediaValue::kRustVideo;
RustAttributeList* attributes = sdp_get_media_attribute_list(msection);
LoadAll(attributes);
}
static const std::string kEmptyString;
static const size_t kNumAttributeTypes = SdpAttribute::kLastAttribute + 1;
const RsdparsaSessionHandle mSession;
const RsdparsaSdpAttributeList* mSessionAttributes;
bool mIsVideo;
bool AtSessionLevel()
const {
return !mSessionAttributes; }
bool IsAllowedHere(SdpAttribute::AttributeType type);
void LoadAll(RustAttributeList* attributeList);
void LoadAttribute(RustAttributeList* attributeList, AttributeType type);
void LoadIceUfrag(RustAttributeList* attributeList);
void LoadIcePwd(RustAttributeList* attributeList);
void LoadIdentity(RustAttributeList* attributeList);
void LoadIceOptions(RustAttributeList* attributeList);
void LoadFingerprint(RustAttributeList* attributeList);
void LoadDtlsMessage(RustAttributeList* attributeList);
void LoadSetup(RustAttributeList* attributeList);
void LoadSsrc(RustAttributeList* attributeList);
void LoadSsrcGroup(RustAttributeList* attributeList);
void LoadRtpmap(RustAttributeList* attributeList);
void LoadFmtp(RustAttributeList* attributeList);
void LoadPtime(RustAttributeList* attributeList);
void LoadFlags(RustAttributeList* attributeList);
void LoadMaxMessageSize(RustAttributeList* attributeList);
void LoadMid(RustAttributeList* attributeList);
void LoadMsid(RustAttributeList* attributeList);
void LoadMsidSemantics(RustAttributeList* attributeList);
void LoadGroup(RustAttributeList* attributeList);
void LoadRtcp(RustAttributeList* attributeList);
void LoadRtcpFb(RustAttributeList* attributeList);
void LoadSctpPort(RustAttributeList* attributeList);
void LoadSimulcast(RustAttributeList* attributeList);
void LoadImageattr(RustAttributeList* attributeList);
void LoadSctpmaps(RustAttributeList* attributeList);
void LoadDirection(RustAttributeList* attributeList);
void LoadRemoteCandidates(RustAttributeList* attributeList);
void LoadRids(RustAttributeList* attributeList);
void LoadExtmap(RustAttributeList* attributeList);
void LoadMaxPtime(RustAttributeList* attributeList);
void LoadCandidate(RustAttributeList* attributeList);
void WarnAboutMisplacedAttribute(SdpAttribute::AttributeType type,
uint32_t lineNumber, SdpParser& errorHolder);
SdpAttribute* mAttributes[kNumAttributeTypes];
RsdparsaSdpAttributeList(
const RsdparsaSdpAttributeList& orig) =
delete;
RsdparsaSdpAttributeList&
operator=(
const RsdparsaSdpAttributeList& rhs) =
delete;
};
}
// namespace mozilla
#endif