Home | History | Annotate | Download | only in base
      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 
     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 
     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 
     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 
     67 const std::string* ContentGroup::FirstContentName() const {
     68   return (!content_names_.empty()) ? &(*content_names_.begin()) : NULL;
     69 }
     70 
     71 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 
     76 void ContentGroup::AddContentName(const std::string& content_name) {
     77   if (!HasContentName(content_name)) {
     78     content_names_.push_back(content_name);
     79   }
     80 }
     81 
     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 
     92 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 
    102 const ContentInfo* SessionDescription::GetContentByName(
    103     const std::string& name) const {
    104   return FindContentInfoByName(contents_, name);
    105 }
    106 
    107 ContentInfo* SessionDescription::GetContentByName(
    108     const std::string& name)  {
    109   return FindContentInfoByName(contents_, name);
    110 }
    111 
    112 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 
    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 
    132 const ContentInfo* SessionDescription::FirstContentByType(
    133     const std::string& type) const {
    134   return FindContentInfoByType(contents_, type);
    135 }
    136 
    137 const ContentInfo* SessionDescription::FirstContent() const {
    138   return (contents_.empty()) ? NULL : &(*contents_.begin());
    139 }
    140 
    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 
    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 
    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 
    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 
    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 
    186 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 
    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 
    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 
    218 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 
    228 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