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

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. #ifndef SDPSESSION_HXX
  2. #define SDPSESSION_HXX
  3. /* ====================================================================
  4.  * The Vovida Software License, Version 1.0 
  5.  * 
  6.  * Copyright (c) 2000 Vovida Networks, Inc.  All rights reserved.
  7.  * 
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, are permitted provided that the following conditions
  10.  * are met:
  11.  * 
  12.  * 1. Redistributions of source code must retain the above copyright
  13.  *    notice, this list of conditions and the following disclaimer.
  14.  * 
  15.  * 2. Redistributions in binary form must reproduce the above copyright
  16.  *    notice, this list of conditions and the following disclaimer in
  17.  *    the documentation and/or other materials provided with the
  18.  *    distribution.
  19.  * 
  20.  * 3. The names "VOCAL", "Vovida Open Communication Application Library",
  21.  *    and "Vovida Open Communication Application Library (VOCAL)" must
  22.  *    not be used to endorse or promote products derived from this
  23.  *    software without prior written permission. For written
  24.  *    permission, please contact vocal@vovida.org.
  25.  *
  26.  * 4. Products derived from this software may not be called "VOCAL", nor
  27.  *    may "VOCAL" appear in their name, without prior written
  28.  *    permission of Vovida Networks, Inc.
  29.  * 
  30.  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
  31.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  32.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
  33.  * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA
  34.  * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
  35.  * IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
  36.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  37.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  38.  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  39.  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  40.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
  41.  * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  42.  * DAMAGE.
  43.  * 
  44.  * ====================================================================
  45.  * 
  46.  * This software consists of voluntary contributions made by Vovida
  47.  * Networks, Inc. and many individuals on behalf of Vovida Networks,
  48.  * Inc.  For more information on Vovida Networks, Inc., please see
  49.  * <http://www.vovida.org/>.
  50.  *
  51.  */
  52. static const char* const SdpSessionVersion =
  53.     "$Id: SdpSession.hxx,v 1.20 2001/07/25 23:04:14 bko Exp $";
  54. #include "global.h"
  55. #include <string>
  56. #include "Data.hxx"
  57. #include <vector>
  58. #include <sys/types.h>
  59. #include "support.hxx"
  60. #include "SdpMedia.hxx"
  61. #include "SdpConnection.hxx"
  62. #include "SdpTime.hxx"
  63. #include "SdpAttributes.hxx"
  64. #include "SdpBandwidth.hxx"
  65. #include "SdpEncryptkey.hxx"
  66. #include "SdpZoneAdjustment.hxx"
  67. #include "SdpExceptions.hxx"
  68. enum SdpProtocolType
  69. {
  70.     SdpProtocolTypeSDP = 0,     // Conforms to RFC 2327
  71.     SdpProtocolTypeNCS         // Conforms to additional NCS requirements
  72. };
  73. /** Implement Session Description Protocol (RFC 2327)
  74.  *
  75.  */
  76. class SdpSession
  77. {
  78.     public:
  79.         ///
  80.         SdpSession ();
  81.         ///
  82.         SdpSession (const SdpSession& x);
  83.         ///
  84.         ~SdpSession();
  85.         ///
  86.         bool isValidDescriptor()
  87.         {
  88.             return isValid;
  89.         }
  90.         ///
  91.         void setProtocolType (SdpProtocolType protocol);
  92.         ///
  93.         SdpProtocolType getProtocolType ();
  94.         /// Verify if this a well formed SDP according to protocol type
  95.         bool verify (SdpProtocolType protocol = SdpProtocolTypeSDP);
  96.         ///
  97.         // Do we need this? Comment out to see what happens
  98.         //    void setValidDescriptor(bool valid) { isValid = valid; }
  99.         // No setProtocolVersion() is needed for now. It is always 0.
  100.         ///
  101.         int getProtocolVersion()
  102.         {
  103.             return protocolVersion;
  104.         }
  105.         ///
  106.         void setUserName(char* name)
  107.         {
  108.             username = name;
  109.             isValid = true;
  110.         }
  111.         ///
  112.         void setUserName(const string& name)
  113.         {
  114.             username = name;
  115.             isValid = true;
  116.         }
  117.         ///
  118.         string getUserName()
  119.         {
  120.             return username;
  121.         }
  122.         ///
  123.         void setSessionId(unsigned int session)
  124.         {
  125.             sessionId = session;
  126.             isValid = true;
  127.         }
  128.         ///
  129.         unsigned int getSessionId()
  130.         {
  131.             return sessionId;
  132.         }
  133.         ///
  134.         void setVersion(unsigned int vers)
  135.         {
  136.             version = vers;
  137.             isValid = true;
  138.         }
  139.         ///
  140.         unsigned int getVersion()
  141.         {
  142.             return version;
  143.         }
  144.         // void setNetworkType (NetworkType ntwkype);
  145.         ///
  146.         NetworkType getNetworkType()
  147.         {
  148.             return networkType;
  149.         }
  150.         // void setAddressType(AddressType addrType);
  151.         ///
  152.         AddressType getAddressType()
  153.         {
  154.             return addressType;
  155.         }
  156.         ///
  157.         void setSessionName(char* name)
  158.         {
  159.             sessionName = name;
  160.         }
  161.         ///
  162.         void setSessionName(const string& name)
  163.         {
  164.             sessionName = name;
  165.         }
  166.         ///
  167.         string getSessionName()
  168.         {
  169.             return sessionName;
  170.         }
  171.         ///
  172.         void setAddress(char* addr)
  173.         {
  174.             address = string (addr);
  175.         }
  176.         ///
  177.         void setAddress(const string& addr)
  178.         {
  179.             address = addr;
  180.         }
  181.         ///
  182.         string getAddress()
  183.         {
  184.             return address;
  185.         }
  186.         ///
  187.         void setSessionInfo(char* info)
  188.         {
  189.             sessionInfo = info;
  190.         }
  191.         ///
  192.         void setSessionInfo(const string& info)
  193.         {
  194.             sessionInfo = info;
  195.         }
  196.         ///
  197.         string getSessionInfo()
  198.         {
  199.             return sessionInfo;
  200.         }
  201.         ///
  202.         void setURIInfo(char* uri)
  203.         {
  204.             uriInfo = uri;
  205.         }
  206.         ///
  207.         void setURIInfo(const string& uri)
  208.         {
  209.             uriInfo = uri;
  210.         }
  211.         ///
  212.         string getURIInfo()
  213.         {
  214.             return uriInfo;
  215.         }
  216.         ///
  217.         void setEmailAddr(const char* emailAddr);
  218.         ///
  219.         void setEmailAddr(const string& emailAddr);
  220.         ///
  221.         vector < string > getEmailList()
  222.         {
  223.             return emailList;
  224.         }
  225.         ///
  226.         void setPhoneNum(const char* phoneNum);
  227.         ///
  228.         void setPhoneNum(const string& phoneNum);
  229.         ///
  230.         vector < string > getPhoneList()
  231.         {
  232.             return phoneList;
  233.         }
  234.         ///
  235.         void setConnection (const SdpConnection& conn);
  236.         ///
  237.         SdpConnection* getConnection();
  238.         ///
  239.         void setBandwidth (SdpBandwidth& bw);
  240.         ///
  241.         SdpBandwidth* getBandwidth ()
  242.         {
  243.             return bandwidth;
  244.         }
  245.         ///
  246.         vector < SdpTime > getSdpTimeList() const
  247.         {
  248.             return sdpTimeList;
  249.         }
  250. void clearSdpTimeList();
  251.         ///
  252.         void addTime (const SdpTime& time);
  253.         vector < SdpZoneAdjustment > getZoneAdjustmentList() const
  254.         {
  255.             return zoneAdjustmentList;
  256.         }
  257.         ///
  258.         void addZoneAdjustment (SdpZoneAdjustment& adjustment)
  259.         {
  260.             zoneAdjustmentList.push_back(adjustment);
  261.         }
  262.     ///
  263.         void setEncryptkey (const SdpEncryptkey& conn);
  264.         ///
  265.         SdpEncryptkey* getEncryptkey();
  266.         ///
  267.         SdpAttributes* getAttribute() const
  268.         {
  269.             return attribute;
  270.         }
  271.         ///
  272.         void setAttribute (SdpAttributes* attrib)
  273.         {
  274.             attribute = attrib;
  275.         }
  276.         ///
  277.         void addMedia (SdpMedia* media)
  278.         {
  279.             mediaList.push_back(media);
  280.         }
  281.         ///
  282.         vector < SdpMedia* > getMediaList() const
  283.         {
  284.             return mediaList;
  285.         }
  286.         /// Encode object into text string
  287.         string encode();
  288.         /// Reset all member variables so the object can be re-used
  289.         void reset();
  290.         /// Decode text string into object
  291.         bool decode(const string& buffer);
  292.         ///
  293.         bool decode(split_t& parms);
  294.         /// assignment operator
  295.         SdpSession& operator= (const SdpSession& x);
  296. #if 0
  297.         /// equality operator -- not implemented
  298.         bool operator == (const SdpSession& x) const;
  299. #endif
  300.         /// Clear all data in media list
  301.         void flushMediaList();
  302.         /// Implement INVITE(HOLD)
  303.         void setHold();  // set "c="'s <connection address> to "0.0.0.0"
  304.         bool isHold();
  305.     private:
  306.         ///
  307.         void encodeVersion (ostrstream& s);
  308.         ///
  309.         string networkTypeString();
  310.         ///
  311.         string addressTypeString();
  312.         ///
  313.         void encodeOrigin (ostrstream& s);
  314.         ///
  315.         void encodeSessionName (ostrstream& s);
  316.         ///
  317.         void encodeSessionInformation (ostrstream& s);
  318.         ///
  319.         void encodeURI (ostrstream& s);
  320.         ///
  321.         void encodeEmailAddress (ostrstream& s);
  322.         ///
  323.         void encodePhoneNumber (ostrstream& s);
  324.         ///
  325.         void encodeTime (ostrstream& s);
  326.         ///
  327.         void encodeTimeZoneAdjustment (ostrstream& s);
  328.         ///
  329.         void encodeMedia (ostrstream& s);
  330.         /// Set this SDP according to the PacketCable NCS requirements
  331.         void setNcs ();
  332.         /// Check if this SDP has all the mandatory fields
  333.         bool conformToSdp ();
  334.         /// Check if this SDP conforms to the PacketCable NCS spec
  335.         bool conformToNcs ();
  336.     private:
  337.         /// ostrstream buffer during encoding
  338.         char buf[4096];
  339.         /// set to true if this session descriptor is meant to be valid
  340.         bool isValid;
  341.         /** SDP Protocol Type indicates this SDP descriptor must conform to a
  342.          *  specific protocol.
  343.          *  Default is SDP which means no additional requirements.
  344.          *  For example, NCS means this SDP conforms to Packet Cable NCS protocol
  345.          */
  346.         SdpProtocolType protocolType;
  347.         /// Session Description data
  348.         /// Protocol Version in "v=" line. Default is 0
  349.         int protocolVersion;
  350.         /** Origin
  351.          *  o=<username> <session id> <version> <network type> <address type> <address>
  352.          */
  353.         /// <username> in "o=" line. Default is "-"
  354.         string username;
  355.         /// <session id> in "o=" line. TODO: Use NTP time
  356.         unsigned int sessionId;
  357.         /// <version> in "o=" line. TODO: Use NTP time
  358.         unsigned int version;
  359.         /// <network type> in "o=" line. Default is IN
  360.         NetworkType networkType;
  361.         /// <address type> in "o=" line. Default is IP4
  362.         AddressType addressType;
  363.         /// <address> in "o=" line
  364.         string address;  // contains the address in the o field
  365.         /// Session Name
  366.         /// <session name> in "s=" line. Default is "-"
  367.         string sessionName;
  368.         /// Session and Media Information - optional
  369.         string sessionInfo;
  370.         //URI for more information "u=*" - optional
  371.         string uriInfo;
  372.         //"e=*" email address list - optional
  373.         vector < string > emailList;
  374.         //"p=*" phone list - optional
  375.         vector < string > phoneList;
  376.         /// Connection Data
  377.         /// Session level connection information("c=") - not required if include in all media
  378.         SdpConnection* connection;
  379.         /// Bandwidth
  380.         /// Session level bandwidth information("b=") - optional
  381.         SdpBandwidth* bandwidth;
  382.         /// Times, Repeat Times and Time Zones
  383.         vector < SdpTime > sdpTimeList;
  384.         //"t="
  385.         /// Repeat times("r=") - optional, done in SdpTime
  386.         ///"z=*" - optional
  387.         vector < SdpZoneAdjustment > zoneAdjustmentList;
  388.         /// Encryption Key
  389.         /// Session level encryption ket("k=") lines - optional
  390.         SdpEncryptkey* encryptkey;
  391.         /// Attributes
  392.         /// Session level attribute("a=") lines - optional
  393.         SdpAttributes* attribute;
  394.         /// Media Announcements
  395.         /// List of Media descriptions
  396.         vector < SdpMedia* > mediaList;
  397. };
  398. typedef SdpSession SessionDescriptor;
  399. #endif