SdpConnection.cxx
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:9k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. /* ====================================================================
  2.  * The Vovida Software License, Version 1.0 
  3.  * 
  4.  * Copyright (c) 2000 Vovida Networks, Inc.  All rights reserved.
  5.  * 
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 
  10.  * 1. Redistributions of source code must retain the above copyright
  11.  *    notice, this list of conditions and the following disclaimer.
  12.  * 
  13.  * 2. Redistributions in binary form must reproduce the above copyright
  14.  *    notice, this list of conditions and the following disclaimer in
  15.  *    the documentation and/or other materials provided with the
  16.  *    distribution.
  17.  * 
  18.  * 3. The names "VOCAL", "Vovida Open Communication Application Library",
  19.  *    and "Vovida Open Communication Application Library (VOCAL)" must
  20.  *    not be used to endorse or promote products derived from this
  21.  *    software without prior written permission. For written
  22.  *    permission, please contact vocal@vovida.org.
  23.  *
  24.  * 4. Products derived from this software may not be called "VOCAL", nor
  25.  *    may "VOCAL" appear in their name, without prior written
  26.  *    permission of Vovida Networks, Inc.
  27.  * 
  28.  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
  29.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  30.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
  31.  * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA
  32.  * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
  33.  * IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
  34.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  35.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  36.  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  37.  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  38.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
  39.  * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  40.  * DAMAGE.
  41.  * 
  42.  * ====================================================================
  43.  * 
  44.  * This software consists of voluntary contributions made by Vovida
  45.  * Networks, Inc. and many individuals on behalf of Vovida Networks,
  46.  * Inc.  For more information on Vovida Networks, Inc., please see
  47.  * <http://www.vovida.org/>.
  48.  *
  49.  */
  50. static const char* const SdpConnection_cxx_Version =
  51.     "$Id: SdpConnection.cxx,v 1.16 2001/06/14 16:28:24 chok Exp $";
  52. #include <string>
  53. #include "support.hxx"
  54. #include "SdpExceptions.hxx"
  55. #include "SdpConnection.hxx"
  56. /************************ SdpConnection class methods *************************/
  57. ///
  58. SdpConnection::SdpConnection ()
  59. {
  60.     addresstype = AddressTypeIPV4;
  61.     networktype = NetworkTypeInternet;
  62.     strcpy (address, "0.0.0.0");
  63.     multicast = 0;
  64. }    // SdpConnection::SdpConnection
  65. ///
  66. SdpConnection::SdpConnection (string& str)
  67. {
  68.     //initialize multicast.
  69.     multicast = 0;
  70.     //str.erase(0,2);
  71.     //split based on '/'
  72.     // use split instead of sub_split.
  73.     // -ctam
  74.     split_t connectionList(split(str, "/"));
  75.     if (connectionList.size() < 1)
  76.     {
  77.         // not enough parameters
  78.         cpLog(LOG_ERR, "SdpConnection: parameter count < 1 on connection list");
  79.         throw SdpExceptions(PARAM_NUMERR);
  80.     }
  81.     else // >=1
  82.     {
  83.         if (connectionList.size() > 1)
  84.         {
  85.             cpLog( LOG_DEBUG_STACK, "connectionList size is %d", connectionList.size() );
  86.             cpLog( LOG_DEBUG_STACK, "Multi-cast address in %s", str.c_str() );
  87.             //set the multicast specific parts.
  88.             //create the multicast details.
  89.             multicast = new SdpMulticast;
  90.             assert(multicast);
  91.             multicast->setTtl(atoi(connectionList[1].c_str()) );
  92.         }
  93.         if (connectionList.size() > 2)
  94.         {
  95.             assert(multicast);
  96.             multicast->setnumAddr(atoi(connectionList[2].c_str() ));
  97.         }
  98.         //sub parms: get the address specific.
  99.         //split again.
  100.         //const char* str = connectionList[0].c_str();
  101.         string str2 = connectionList[0].c_str();
  102.         string addressSpec(str2);
  103.         // take out sub_split.  This may be causing corruption in the sdp.
  104.         // -ctam
  105.         split_t addrSpec(split(addressSpec, " "));
  106.         // Use nTypeStr to make a copy of the addrSpec.
  107.         string nTypeStr = addrSpec[0].c_str();
  108.         if (strcmp(nTypeStr.c_str(), SdpNetworkTypeIN) == 0)
  109.         {
  110.             networktype = NetworkTypeInternet;
  111.         }
  112.         else
  113.         {
  114.             cpLog(LOG_ERR, "addressSpec: {%s}", addressSpec.c_str());
  115.             // bad!
  116.             // -ctam
  117.             printf("***  nTypeStr.c_str()= <%s>, SdpNetworkTypeIN = <%s> ***n",
  118.                    nTypeStr.c_str(), SdpNetworkTypeIN );
  119.             cpLog( LOG_ERR, "SdpConnection: unknown transport type");
  120.             throw SdpExceptions(UNKNOWN_NETTYPE);
  121.         }
  122.         if (addrSpec[1] == SdpAddressTypeIP4)
  123.         {
  124.             addresstype = AddressTypeIPV4;
  125.         }
  126.         else if (addrSpec[1] == SdpAddressTypeIP6)
  127.         {
  128.             addresstype = AddressTypeIPV6;
  129.         }
  130.         else
  131.         {
  132.             cpLog(LOG_ERR, "SdpConnection: unknown address type");
  133.             throw SdpExceptions(UNKNOWN_ADDRTYPE);
  134.         }
  135.         if (multicast)
  136.         {
  137.             multicast->setAddress(addrSpec[2].c_str());
  138.         }
  139.         else
  140.         {
  141.             strcpy(address, addrSpec[2].c_str());
  142.         }
  143.     }
  144. }
  145. ///
  146. SdpConnection&
  147. SdpConnection::operator=(const SdpConnection& connection)
  148. {
  149.     cpLog( LOG_DEBUG_STACK, "SdpConnection operator=" );
  150.     networktype = connection.getNetworkType();
  151.     addresstype = connection.getAddressType();
  152.     SdpMulticast* mult = connection.getMulticast();
  153.     if (mult) //multicast address present.
  154.     {
  155.         cpLog( LOG_DEBUG_STACK, "Multi-cast address" );
  156.         if (!multicast)
  157.         {
  158.             multicast = new SdpMulticast;
  159.             assert(multicast);
  160.         }
  161.         (*multicast) = (*mult);
  162.     }
  163.     else
  164.     {
  165.         //if previously multicast is defined, delete that.
  166.         if (multicast)
  167.         {
  168.             cpLog( LOG_DEBUG_STACK, "Delete multi-cast address" );
  169.             delete multicast;
  170.         }
  171.         multicast = 0;
  172.         //assign the unicast address.
  173.         strcpy(address, connection.getUnicast().c_str());
  174.     }
  175.     return *(this);
  176. }
  177. /// Copy constructor
  178. SdpConnection::SdpConnection( const SdpConnection& connection )
  179. {
  180.     cpLog( LOG_DEBUG_STACK, "SdpConnection copy constructor" );
  181.     networktype = connection.getNetworkType();
  182.     addresstype = connection.getAddressType();
  183.     strcpy(address, connection.getUnicast().c_str());
  184.     SdpMulticast* mult = connection.getMulticast();
  185.     if ( mult )
  186.     {
  187.         cpLog( LOG_DEBUG_STACK, "Multi-cast address" );
  188.         multicast = new SdpMulticast;
  189.         assert(multicast);
  190.         *multicast = *mult;
  191.     }
  192.     else
  193.     {
  194.         multicast = 0;
  195.     }
  196. }
  197. ///
  198. string
  199. SdpConnection::networkTypeString ()
  200. {
  201.     string s;
  202.     switch (networktype)
  203.     {
  204.         case NetworkTypeInternet:
  205.         {
  206.             s = SdpNetworkTypeIN;
  207.             break;
  208.         }
  209.         default:
  210.         {
  211.             //TODO Throw some exception
  212.             break;
  213.         }
  214.     }
  215.     return s;
  216. }    // SdpConnection::networkTypeString
  217. ///
  218. string
  219. SdpConnection::addressTypeString ()
  220. {
  221.     string s;
  222.     switch (addresstype)
  223.     {
  224.         case AddressTypeIPV4:
  225.         {
  226.             s = SdpAddressTypeIP4;
  227.             break;
  228.         }
  229.         case AddressTypeIPV6:
  230.         {
  231.             s = SdpAddressTypeIP6;
  232.             break;
  233.         }
  234.         default:
  235.         {
  236.             //TODO Throw some exception
  237.             break;
  238.         }
  239.     }
  240.     return s;
  241. }    // SdpConnection::addressTypeString
  242. ///
  243. void
  244. SdpConnection::encode (ostrstream& s)
  245. {
  246.     s << "c=" << networkTypeString()
  247.     << ' '
  248.     << addressTypeString()
  249.     << ' ';
  250.     if (multicast)
  251.     {
  252.         multicast->encode (s);
  253.     }
  254.     else
  255.     {
  256.         s << address;
  257.     }
  258.     s << "rn";
  259. }    // SdpConnection::encode
  260. ///
  261. void
  262. SdpConnection::setHold ()
  263. {
  264.     if ( !multicast )
  265.     {
  266.         // We are copying a fixed string, hence no need for
  267.         // those init buffer & copy with strncpy(..) overhead
  268.         strcpy(address, "0.0.0.0");
  269.     }
  270.     else
  271.     {
  272.         multicast->setAddress("0.0.0.0");
  273.     }
  274. }
  275. ///
  276. bool
  277. SdpConnection::isHold ()
  278. {
  279.     string addr;
  280.     if ( !multicast )
  281.     {
  282.         addr = getUnicast();
  283.     }
  284.     else
  285.     {
  286.         addr = multicast->getAddress();
  287.     }
  288.     return (addr == "0.0.0.0") ? true : false;
  289. }
  290. /************************** SdpMulticast class methods *************************/
  291. SdpMulticast::SdpMulticast() :
  292.         numAddress( 0 )
  293. {}
  294. ///
  295. void
  296. SdpMulticast::encode (ostrstream& s)
  297. {
  298.     s << address << '/' << ttl;
  299.     if (numAddress > 0)
  300.     {
  301.         s << '/' << numAddress;
  302.     }
  303. }    // SdpMulticast::encode