• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * libjingle
3  * Copyright 2010, Google Inc.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *
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.
15  *
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.
26  */
27 
28 #include "talk/p2p/base/sessiondescription.h"
29 
30 #include "talk/xmllite/xmlelement.h"
31 
32 namespace cricket {
33 
FindContentInfoByName(ContentInfos & contents,const std::string & name)34 ContentInfo* FindContentInfoByName(
35     ContentInfos& contents, const std::string& name) {
36   for (ContentInfos::iterator content = contents.begin();
37        content != contents.end(); ++content) {
38     if (content->name == name) {
39       return &(*content);
40     }
41   }
42   return NULL;
43 }
44 
FindContentInfoByName(const ContentInfos & contents,const std::string & name)45 const ContentInfo* FindContentInfoByName(
46     const ContentInfos& contents, const std::string& name) {
47   for (ContentInfos::const_iterator content = contents.begin();
48        content != contents.end(); ++content) {
49     if (content->name == name) {
50       return &(*content);
51     }
52   }
53   return NULL;
54 }
55 
FindContentInfoByType(const ContentInfos & contents,const std::string & type)56 const ContentInfo* FindContentInfoByType(
57     const ContentInfos& contents, const std::string& type) {
58   for (ContentInfos::const_iterator content = contents.begin();
59        content != contents.end(); ++content) {
60     if (content->type == type) {
61       return &(*content);
62     }
63   }
64   return NULL;
65 }
66 
FirstContentName() const67 const std::string* ContentGroup::FirstContentName() const {
68   return (!content_names_.empty()) ? &(*content_names_.begin()) : NULL;
69 }
70 
HasContentName(const std::string & content_name) const71 bool ContentGroup::HasContentName(const std::string& content_name) const {
72   return (std::find(content_names_.begin(), content_names_.end(),
73                     content_name) != content_names_.end());
74 }
75 
AddContentName(const std::string & content_name)76 void ContentGroup::AddContentName(const std::string& content_name) {
77   if (!HasContentName(content_name)) {
78     content_names_.push_back(content_name);
79   }
80 }
81 
RemoveContentName(const std::string & content_name)82 bool ContentGroup::RemoveContentName(const std::string& content_name) {
83   ContentNames::iterator iter = std::find(
84       content_names_.begin(), content_names_.end(), content_name);
85   if (iter == content_names_.end()) {
86     return false;
87   }
88   content_names_.erase(iter);
89   return true;
90 }
91 
Copy() const92 SessionDescription* SessionDescription::Copy() const {
93   SessionDescription* copy = new SessionDescription(*this);
94   // Copy all ContentDescriptions.
95   for (ContentInfos::iterator content = copy->contents_.begin();
96       content != copy->contents().end(); ++content) {
97     content->description = content->description->Copy();
98   }
99   return copy;
100 }
101 
GetContentByName(const std::string & name) const102 const ContentInfo* SessionDescription::GetContentByName(
103     const std::string& name) const {
104   return FindContentInfoByName(contents_, name);
105 }
106 
GetContentByName(const std::string & name)107 ContentInfo* SessionDescription::GetContentByName(
108     const std::string& name)  {
109   return FindContentInfoByName(contents_, name);
110 }
111 
GetContentDescriptionByName(const std::string & name) const112 const ContentDescription* SessionDescription::GetContentDescriptionByName(
113     const std::string& name) const {
114   const ContentInfo* cinfo = FindContentInfoByName(contents_, name);
115   if (cinfo == NULL) {
116     return NULL;
117   }
118 
119   return cinfo->description;
120 }
121 
GetContentDescriptionByName(const std::string & name)122 ContentDescription* SessionDescription::GetContentDescriptionByName(
123     const std::string& name) {
124   ContentInfo* cinfo = FindContentInfoByName(contents_, name);
125   if (cinfo == NULL) {
126     return NULL;
127   }
128 
129   return cinfo->description;
130 }
131 
FirstContentByType(const std::string & type) const132 const ContentInfo* SessionDescription::FirstContentByType(
133     const std::string& type) const {
134   return FindContentInfoByType(contents_, type);
135 }
136 
FirstContent() const137 const ContentInfo* SessionDescription::FirstContent() const {
138   return (contents_.empty()) ? NULL : &(*contents_.begin());
139 }
140 
AddContent(const std::string & name,const std::string & type,ContentDescription * description)141 void SessionDescription::AddContent(const std::string& name,
142                                     const std::string& type,
143                                     ContentDescription* description) {
144   contents_.push_back(ContentInfo(name, type, description));
145 }
146 
AddContent(const std::string & name,const std::string & type,bool rejected,ContentDescription * description)147 void SessionDescription::AddContent(const std::string& name,
148                                     const std::string& type,
149                                     bool rejected,
150                                     ContentDescription* description) {
151   contents_.push_back(ContentInfo(name, type, rejected, description));
152 }
153 
RemoveContentByName(const std::string & name)154 bool SessionDescription::RemoveContentByName(const std::string& name) {
155   for (ContentInfos::iterator content = contents_.begin();
156        content != contents_.end(); ++content) {
157     if (content->name == name) {
158       delete content->description;
159       contents_.erase(content);
160       return true;
161     }
162   }
163 
164   return false;
165 }
166 
AddTransportInfo(const TransportInfo & transport_info)167 bool SessionDescription::AddTransportInfo(const TransportInfo& transport_info) {
168   if (GetTransportInfoByName(transport_info.content_name) != NULL) {
169     return false;
170   }
171   transport_infos_.push_back(transport_info);
172   return true;
173 }
174 
RemoveTransportInfoByName(const std::string & name)175 bool SessionDescription::RemoveTransportInfoByName(const std::string& name) {
176   for (TransportInfos::iterator transport_info = transport_infos_.begin();
177        transport_info != transport_infos_.end(); ++transport_info) {
178     if (transport_info->content_name == name) {
179       transport_infos_.erase(transport_info);
180       return true;
181     }
182   }
183   return false;
184 }
185 
GetTransportInfoByName(const std::string & name) const186 const TransportInfo* SessionDescription::GetTransportInfoByName(
187     const std::string& name) const {
188   for (TransportInfos::const_iterator iter = transport_infos_.begin();
189        iter != transport_infos_.end(); ++iter) {
190     if (iter->content_name == name) {
191       return &(*iter);
192     }
193   }
194   return NULL;
195 }
196 
GetTransportInfoByName(const std::string & name)197 TransportInfo* SessionDescription::GetTransportInfoByName(
198     const std::string& name) {
199   for (TransportInfos::iterator iter = transport_infos_.begin();
200        iter != transport_infos_.end(); ++iter) {
201     if (iter->content_name == name) {
202       return &(*iter);
203     }
204   }
205   return NULL;
206 }
207 
RemoveGroupByName(const std::string & name)208 void SessionDescription::RemoveGroupByName(const std::string& name) {
209   for (ContentGroups::iterator iter = content_groups_.begin();
210        iter != content_groups_.end(); ++iter) {
211     if (iter->semantics() == name) {
212       content_groups_.erase(iter);
213       break;
214     }
215   }
216 }
217 
HasGroup(const std::string & name) const218 bool SessionDescription::HasGroup(const std::string& name) const {
219   for (ContentGroups::const_iterator iter = content_groups_.begin();
220        iter != content_groups_.end(); ++iter) {
221     if (iter->semantics() == name) {
222       return true;
223     }
224   }
225   return false;
226 }
227 
GetGroupByName(const std::string & name) const228 const ContentGroup* SessionDescription::GetGroupByName(
229     const std::string& name) const {
230   for (ContentGroups::const_iterator iter = content_groups_.begin();
231        iter != content_groups_.end(); ++iter) {
232     if (iter->semantics() == name) {
233       return &(*iter);
234     }
235   }
236   return NULL;
237 }
238 
239 }  // namespace cricket
240