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

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. #ifndef RtspMsg_hxx
  2. #define RtspMsg_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 281421,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 RtspMsg_hxx_Version =
  53.     "$Id: RtspMsg.hxx,v 1.20 2001/05/15 20:26:12 bko Exp $";
  54. #include "Data.hxx"
  55. #include "RtspUtil.hxx"
  56. #include "RtspTransportHdr.hxx"
  57. #include "RtspRangeHdr.hxx"
  58. #include "RtspBadDataException.hxx"
  59. #include "Sptr.hxx"
  60. #include "RtspTcpBuffer.hxx"
  61. typedef struct RtspHeaderValueData_t
  62. {
  63.     int offset;
  64.     u_int32_t len;
  65. }
  66. HeaderValueData;
  67. enum RtspTransportType
  68. {
  69.     RTSP_TCP,
  70.     RTSP_UDP
  71. };
  72. enum RtspMsgCompletionType
  73. {
  74.     RTSP_MSG_NEW, // a newly created msg or startline not complete msg
  75.     RTSP_MSG_STRTLINE_COMPLETE, // The headers and on are not completed
  76.     RTSP_MSG_HEADERS_COMPLETE, // Found emptyline but msgbody is not completed
  77.     RTSP_MSG_COMPLETE,    // found emptyline, may or maynot have msgbody
  78. };
  79. /** */
  80. class RtspMsg
  81. {
  82.     public:
  83.         /** */
  84.         RtspMsg();
  85.         /** */
  86.         RtspMsg(const RtspMsg& src);
  87.         /** */
  88.         RtspMsg& operator= (const RtspMsg& src);
  89.         /** */
  90.         virtual ~RtspMsg() {}
  91.         /** transport connection */
  92.         Sptr< RtspTcpBuffer > getTransConnPtr() const { return myTransConnPtr; }
  93.         /** */
  94.         void setTransConnPtr(Sptr< RtspTcpBuffer > ptr) 
  95.             { myTransConnPtr = ptr; }
  96.         /** */
  97.         void setStartLine(const Data& stline) { myStartLine = stline; }
  98.         /** */
  99.         void setNumHeader(u_int32_t num) { myNumHeader = num; }
  100.         /** */
  101.         void setHeaders(const Data& hdr) { myHeaders = hdr; }
  102.         /** */
  103.         const Data& getHeaders() const { return myHeaders; }
  104.         /** */
  105.         void setHeadersMap(u_int32_t hdrType, const HeaderValueData& hvd) 
  106.              { myHeaderMap[hdrType].offset = hvd.offset; 
  107.                myHeaderMap[hdrType].len = hvd.len; }
  108.         /** if it's the first time call, it will parse content-length header
  109.             and set myContentLength, otherwise it directly return it
  110.          */
  111.         const int getContentLength() ; 
  112.         /** */                       
  113.         void setHasBody(bool has) { myHasBody = has; }
  114.         /** */                       
  115.         bool hasBody() const { return myHasBody; }
  116.         /** */
  117.         void setMsgBody(const Data& body) { myMsgBody = body; }
  118.         /** */
  119.         const Data& getMsgBody() const { return myMsgBody; }
  120.         /** */
  121.         const RtspMsgCompletionType getCompletionFlag() const 
  122.             { return myCompletionFlag; }
  123.         /** */
  124.         void setCompletionFlag(RtspMsgCompletionType flag) 
  125.             { myCompletionFlag = flag; }
  126.         /** */                       
  127.         void setFirstWordUnknown(bool flag) { myFirstWordUnknown = flag; }
  128.         /** */                       
  129.         bool getFirstWordUnknown() const { return myFirstWordUnknown; }
  130.         /** check if there is Cseq number */
  131.         bool isValid();
  132.         /** It will look at the first word of the startLine
  133.          *  if it is *not* RTSP, return true; otherwise false.
  134.          */
  135.         virtual bool isRequest();
  136.         /** It will look at the first word of the startLine
  137.          *  if it *is* RTSP, return true; otherwise false.
  138.          */
  139.         virtual bool isResponse();
  140.         /** It parse Session header for the first time and assign mySessionId */
  141.         const Data& getSessionId() ;
  142.         /** It parse Cseq header for the first time and assign myCSeq */
  143.         const Data& getCSeq() ;
  144.         /** It parse Content-Base header for the first time and 
  145.             return a reference of the data
  146.          */
  147.         const Data& getContentBase();
  148.         /** It parse Content-Type header and return a copy of the data
  149.          *  Return the whole string of the header body for now
  150.          *  Application just need to see if the returned Data has
  151.          *  substring of "application/sdp" to know if it support sdp
  152.          *
  153.          *  TODO: try parse the detail of Content-Type and Accept
  154.          */
  155.         const Data& getContentType();
  156.         /** It returns an object when parser found a suitable transport-spec in
  157.          *  the transport hdr, and it assigns myTransportSpec; 
  158.          *  otherwise it returns 0
  159.          */
  160.         Sptr< RtspTransportSpec > getTransport();
  161.         /** It returns an object when parser found and understood the Range hdr,
  162.          *  and it assigns myRange; otherwise return 0
  163.          */
  164.         Sptr< RtspRangeHdr > getRange();
  165.         /** */
  166.         Data& getStartLine() { return myStartLine; }
  167.         /** not finished */
  168.         virtual Data encode() { return ""; }
  169.     protected:
  170.         friend class RtspMsgParser;
  171.         /** return a Data copy of the header body
  172.          * if full is true, the data stops at the CRLF
  173.          * if full is not tru, the data stops at the first space or CRLF
  174.          */
  175.         const Data getHdrBodyData(RtspHeadersType header, bool full) const;
  176.         /** return a value of the number header body */
  177.         const u_int32_t getHdrBodyValue(RtspHeadersType header) const;
  178.         
  179.         /** saves the connection where the msg comming from 
  180.          * Curretnly it only support TCP, if support UDP later may need to
  181.          * create the higher level class and points to that
  182.          */
  183.         Sptr< RtspTcpBuffer > myTransConnPtr;
  184.         
  185.         /** This is the beginning of the msg.
  186.          * because not whole msg being decoded at once, so need to 
  187.          * hold the orig data
  188.          *
  189.          * The following are filled in by preParse() function:
  190.          * myStartLine, myHeaders, myNumHeader, myHeaderMap, myContentLength, 
  191.          * myHasBody, myMsgBody, myCompletionFlag
  192.          */
  193.         Data myStartLine;
  194.         /** Holds all the header data for this msg */
  195.         Data myHeaders;
  196.         /** TODO if no one use it, remove it */
  197.         u_int32_t myNumHeader;
  198.         /**
  199.          * Holds all kind of the headers' body offset, and only to parse 
  200.          * when needed. The offset points to the beginning of the first 
  201.          * non-space after ":", each item initialzed with -1.
  202.          */
  203.         HeaderValueData myHeaderMap[RTSP_UNKNOWN_HDR];
  204.         /** */
  205.         u_int32_t myContentLength;
  206.         /** */
  207.         bool myHasBody;
  208.         /** */
  209.         Data myMsgBody;
  210.         /** A RtspMsg can be incomplete because when reading from TCP 
  211.          *  connection we read a fixed size of bytes, and there can be 
  212.          *  incomplete msg at the end. So use this flag to indicate the
  213.          *  completion status of this msg.
  214.          *
  215.          */
  216.         RtspMsgCompletionType myCompletionFlag;
  217.         /** To save an incomplete header */
  218.         Data myIncompHeader;
  219.         /** This is to indicate the msg has firstword incomplete or unknown */
  220.         bool myFirstWordUnknown;
  221.         /** following headers are parsed after preParse(), whenever
  222.          *  the server trys to get it
  223.          */
  224.         /** */
  225.         Data mySessionId;
  226.         /** */
  227.         Data myCSeq;
  228.         /** */
  229.         Data myContentBase;
  230.         /** */
  231.         Data myContentType;
  232.         /** */
  233.         Sptr< RtspTransportSpec > myTransportSpec;
  234.         /** */
  235.         Sptr< RtspRangeHdr > myRange;
  236.     private:
  237. };
  238. /* Local Variables: */
  239. /* c-file-style: "stroustrup" */
  240. /* indent-tabs-mode: nil */
  241. /* c-file-offsets: ((access-label . -) (inclass . ++)) */
  242. /* c-basic-offset: 4 */
  243. /* End: */
  244. #endif