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

流媒体/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 281421,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 RtspTcpBuffer_cxx_Version =
  51.     "$Id: RtspTcpBuffer.cxx,v 1.35 2001/07/26 21:47:16 kle Exp $";
  52. #include "RtspTcpBuffer.hxx"
  53. #include "RtspTcpConnection.hxx"
  54. #include "RtspMsgParser.hxx"
  55. #include "RtspMsg.hxx"
  56. #include "RtspTransceiver.hxx"
  57. #include "cpLog.h"
  58. //isAlive isn't being used by anyone right now
  59. RtspTcpBuffer::RtspTcpBuffer( Connection conn, int keepAliveCounter,
  60.                               Fifo< Sptr<RtspMsg> >& recvFifo, int bufferSize )
  61.     : myMapIndex( conn.getConnId() ),
  62.       myConnection( conn ),
  63.       myMaxKeepAliveCounter( keepAliveCounter ),
  64.       myKeepAliveCounter( keepAliveCounter ),
  65.       myBufferSize( bufferSize ),
  66.       mySavedRtspMsg( 0 ),
  67.       myRecvFifo( recvFifo )
  68. {
  69.     myCharBuf = new char[myBufferSize];
  70. }
  71. RtspTcpBuffer::~RtspTcpBuffer()
  72. {
  73.     // delete data buffer
  74.     delete[] myCharBuf;
  75. }
  76. bool
  77. RtspTcpBuffer::processConnection( Sptr<RtspTcpBuffer> tcpBufferObj )
  78. {
  79.     bool result = true;
  80.     // reset keepAliveCounter;
  81.     myKeepAliveCounter = myMaxKeepAliveCounter;
  82.     try
  83.     {
  84.         result = readTcpData( tcpBufferObj );
  85.     }
  86.     catch( VException& e )
  87.     {
  88.         cpLog( LOG_DEBUG, e.getDescription().c_str() );
  89.         result = false;
  90.     }
  91.     return result;
  92. }
  93. bool
  94. RtspTcpBuffer::readTcpData( Sptr<RtspTcpBuffer> tcpBufferObj )
  95. throw( VNetworkException&, RtspBadDataException& )
  96. {
  97.     char* readStart = myCharBuf;
  98.     u_int32_t charRead = myBufferSize;
  99.     int charReadReal = 0;
  100.     memset(readStart, 0, myBufferSize);
  101.     RtspTransceiver::readData( myConnection,(void*)readStart,
  102.                                charRead, charReadReal );
  103.     if( charReadReal == 0 )
  104.     {
  105.         //cpLog( LOG_DEBUG, "Tcp connection closed" );
  106.         return false;
  107.     }
  108.     else if( charReadReal < 0 )
  109.     {
  110.         throw VNetworkException( "Error reading connection",
  111.                                  __FILE__, __LINE__, 0 );
  112.     }
  113.     cpLog( LOG_DEBUG, "Received:n%s", readStart );
  114.     int bytesDecoded = 0;
  115.     int bytesNeedtoDecode = charReadReal;
  116.     Sptr< RtspMsg > newMsg = 0;
  117.     Sptr< RtspMsg > msg = 0;
  118.     while( bytesDecoded < bytesNeedtoDecode )
  119.     {
  120.         msg = RtspMsgParser::preParse( myCharBuf + bytesDecoded,
  121.                                        bytesNeedtoDecode,
  122.                                        bytesDecoded,
  123.                                        mySavedRtspMsg);
  124.         if( msg->getCompletionFlag() == RTSP_MSG_COMPLETE )
  125.         {
  126.             if (msg->getFirstWordUnknown())
  127.             {
  128.                 //Here msg is still in base class, need to create derived class
  129.                 // and assign msg to the derived class
  130.                 newMsg = RtspMsgParser::createRtspMsg(
  131.                     (msg->getStartLine()).getDataBuf(), 
  132.                     (msg->getStartLine()).length());
  133.                 (*newMsg) = *msg;
  134.                 msg = newMsg;
  135.                   
  136.             }
  137.             cpLog( LOG_DEBUG, "Adding RTSP msg to fifo" );
  138.             msg->setTransConnPtr( tcpBufferObj );
  139.             myRecvFifo.add( msg );
  140.             mySavedRtspMsg = 0;
  141.         }
  142.         else
  143.         {
  144.             if( bytesDecoded != bytesNeedtoDecode )
  145.             {
  146.                 // The incomplete msg is in the middle of the buffer
  147.                 // which should not happen
  148.                 throw RtspBadDataException( "Bad RTSP message",
  149.                                             __FILE__, __LINE__, 0 );
  150.             }
  151.             else
  152.             {
  153.                 // save this incomplete msg in this object
  154.                 cpLog( LOG_DEBUG_STACK, "Saved an incomplete msg" );
  155.                 mySavedRtspMsg = msg;
  156.             }
  157.         }
  158.     }
  159.     return true;
  160. }
  161. void RtspTcpBuffer::closeConnection()
  162. {
  163.     cpLog( LOG_DEBUG, "TCP Buffer connection closed for: %s",
  164.            myConnection.getDescription().c_str() );
  165.     myConnection.close();
  166. }
  167. bool RtspTcpBuffer::isAlive()
  168. {
  169.     return ( myKeepAliveCounter-- < 0 ) ? true : false;
  170. }
  171. /* Local Variables: */
  172. /* c-file-style: "stroustrup" */
  173. /* indent-tabs-mode: nil */
  174. /* c-file-offsets: ((access-label . -) (inclass . ++)) */
  175. /* c-basic-offset: 4 */
  176. /* End: */