3
* Copyright 2010, Google Inc.
5
* Redistribution and use in source and binary forms, with or without
6
* modification, are permitted provided that the following conditions are met:
8
* 1. Redistributions of source code must retain the above copyright notice,
9
* this list of conditions and the following disclaimer.
10
* 2. Redistributions in binary form must reproduce the above copyright notice,
11
* this list of conditions and the following disclaimer in the documentation
12
* and/or other materials provided with the distribution.
13
* 3. The name of the author may not be used to endorse or promote products
14
* derived from this software without specific prior written permission.
16
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
#include "talk/p2p/base/sessiondescription.h"
30
#include "talk/xmllite/xmlelement.h"
34
const ContentInfo* FindContentInfoByName(
35
const ContentInfos& contents, const std::string& name) {
36
for (ContentInfos::const_iterator content = contents.begin();
37
content != contents.end(); content++) {
38
if (content->name == name) {
45
const ContentInfo* FindContentInfoByType(
46
const ContentInfos& contents, const std::string& type) {
47
for (ContentInfos::const_iterator content = contents.begin();
48
content != contents.end(); content++) {
49
if (content->type == type) {
56
void ContentGroup::AddContentName(const std::string& content_name) {
57
content_types_.insert(content_name);
60
bool ContentGroup::RemoveContentName(const std::string& content_name) {
62
std::set<std::string>::iterator iter;
63
iter = content_types_.find(content_name);
64
if (iter != content_types_.end()) {
65
content_types_.erase(iter);
71
bool ContentGroup::HasContentName(const std::string& content_name) const {
72
return (content_types_.find(content_name) != content_types_.end());
75
const std::string* ContentGroup::FirstContentName() const {
76
return (content_types_.begin() != content_types_.end()) ?
77
&(*content_types_.begin()) : NULL;
80
SessionDescription* SessionDescription::Copy() const {
81
SessionDescription* copy = new SessionDescription(*this);
82
// Copy all ContentDescriptions.
83
for (ContentInfos::iterator content = copy->contents_.begin();
84
content != copy->contents().end(); ++content) {
85
content->description = content->description->Copy();
89
const ContentInfo* SessionDescription::GetContentByName(
90
const std::string& name) const {
91
return FindContentInfoByName(contents_, name);
94
const ContentInfo* SessionDescription::FirstContentByType(
95
const std::string& type) const {
96
return FindContentInfoByType(contents_, type);
99
const ContentInfo* SessionDescription::FirstContent() const {
100
return (contents_.empty()) ? NULL : &(*contents_.begin());
103
void SessionDescription::AddContent(const std::string& name,
104
const std::string& type,
105
const ContentDescription* description) {
106
contents_.push_back(ContentInfo(name, type, description));
109
bool SessionDescription::RemoveContentByName(const std::string& name) {
110
for (ContentInfos::iterator content = contents_.begin();
111
content != contents_.end(); ++content) {
112
if (content->name == name) {
113
delete content->description;
114
contents_.erase(content);
122
void SessionDescription::RemoveGroupByName(const std::string& name) {
123
for (ContentGroups::iterator iter = content_groups_.begin();
124
iter != content_groups_.end(); ++iter) {
125
if (iter->semantics() == name) {
126
content_groups_.erase(iter);
132
bool SessionDescription::HasGroup(const std::string& name) const {
133
for (ContentGroups::const_iterator iter = content_groups_.begin();
134
iter != content_groups_.end(); ++iter) {
135
if (iter->semantics() == name) {
142
const ContentGroup* SessionDescription::GetGroupByName(
143
const std::string& name) const {
144
for (ContentGroups::const_iterator iter = content_groups_.begin();
145
iter != content_groups_.end(); ++iter) {
146
if (iter->semantics() == name) {
153
} // namespace cricket