rtspmdsc.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:9k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: rtspmdsc.cpp,v 1.3.32.1 2004/07/09 02:04:52 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. //#include "hlxclib/stdlib.h"
  50. //#include "hlxclib/stdio.h"
  51. #include "hxtypes.h"
  52. #include "hxcom.h"
  53. #include "ihxpckts.h"
  54. #include "hxstrutl.h"
  55. #include "chxpckts.h"
  56. #include "rtsputil.h"
  57. #include "cbqueue.h"
  58. #include "hxslist.h"
  59. #include "looseprs.h"
  60. #include "rtspprop.h"
  61. #include "mhprop.h"
  62. #include "rtspmdsc.h"
  63. #include "hxheap.h"
  64. #ifdef _DEBUG
  65. #undef HX_THIS_FILE
  66. static const char HX_THIS_FILE[] = __FILE__;
  67. #endif
  68. RTSPMediaDesc::RTSPMediaDesc():
  69.     m_pFileHeader(0)
  70. {
  71.     m_streams = new CHXSimpleList;
  72. }
  73. RTSPMediaDesc::~RTSPMediaDesc()
  74. {
  75.     delete m_pFileHeader;
  76.     clearStreamList();
  77.     delete m_streams;
  78. }
  79. HX_RESULT
  80. RTSPMediaDesc::fromExternalRep(char* pData)
  81. {
  82.     XMLParser parser;
  83.     XMLTag* pTag = 0;
  84.     CByteQueue* pQueue = new CByteQueue(strlen(pData));
  85.     BOOL inMediaHeader = FALSE;
  86.     BOOL inMediaStream = FALSE;
  87.     HX_RESULT hresult = HXR_OK;
  88.     RTSPPropertyList* pMediaHeader = 0;
  89.     RTSPPropertyList* pMediaStream = 0;
  90.     pQueue->EnQueue(pData, strlen(pData));
  91.     for(;;)
  92.     {
  93. UINT32 bytesUsed;
  94. UINT32 bytesAvail = pQueue->GetQueuedItemCount();
  95. if(bytesAvail <= 0)
  96. {
  97.     break;
  98. }
  99. BYTE* pBuf = new BYTE[bytesAvail];
  100. BYTE* p = pBuf;
  101. HX_ASSERT(bytesAvail == (UINT16)bytesAvail);
  102. pQueue->DeQueue(pBuf, (UINT16)bytesAvail);
  103. bytesUsed = bytesAvail;
  104. if(pTag)
  105. {
  106.     delete pTag;
  107.     pTag = 0;
  108. }
  109. XMLParseResult rc = parser.Parse((const char*&)p, bytesAvail, pTag);
  110. HX_ASSERT(bytesAvail == (UINT16)bytesAvail);
  111. pQueue->EnQueue(p, (UINT16)bytesAvail - (p - pBuf));
  112. switch(rc)
  113. {
  114.     case XMLPTag:
  115.     {
  116. switch(pTag->m_type)
  117. {
  118.     case XMLPlainTag:
  119.     {
  120. if(strcasecmp(pTag->m_name, "MediaHeader") == 0)
  121. {
  122.     if(inMediaHeader)
  123.     {
  124. //XXXBAB parse error
  125.     }
  126.     if(pMediaHeader)
  127.     {
  128. delete pMediaHeader;
  129.     }
  130.     pMediaHeader = new RTSPPropertyList;
  131.     inMediaHeader = TRUE;
  132.     inMediaStream = FALSE;
  133. }
  134. else if(strcasecmp(pTag->m_name, "MediaStream") == 0)
  135. {
  136.     if(inMediaStream)
  137.     {
  138. //XXXBAB parse error
  139.     }
  140.     pMediaStream = new RTSPPropertyList;
  141.     inMediaHeader = FALSE;
  142.     inMediaStream = TRUE;
  143. }
  144. else
  145. {
  146.     RTSPProperty* pProp = makeProperty(pTag);
  147.     if(pProp)
  148.     {
  149. if(inMediaHeader)
  150. {
  151.     pMediaHeader->addProperty(pProp);
  152. }
  153. else if(inMediaStream)
  154. {
  155.     pMediaStream->addProperty(pProp);
  156. }
  157.     }
  158. }
  159.     }
  160.     break;
  161.     case XMLEndTag:
  162.     {
  163. if(strcasecmp(pTag->m_name, "MediaHeader") == 0)
  164. {
  165.     if(inMediaHeader)
  166.     {
  167. m_pFileHeader = pMediaHeader;
  168.     }
  169.     else
  170.     {
  171. // error
  172.     }
  173.     inMediaHeader = FALSE;
  174. }
  175. else if(strcasecmp(pTag->m_name, "MediaStream") == 0)
  176. {
  177.     if(inMediaStream)
  178.     {
  179. m_streams->AddTail(pMediaStream);
  180.     }
  181.     else
  182.     {
  183. // error
  184.     }
  185.     inMediaStream = FALSE;
  186. }
  187.     }
  188.     break;
  189.     default:
  190.     {
  191. // unexpected
  192.     }
  193.     break;
  194. }
  195.     }
  196.     break;
  197.     case XMLPPlainText:
  198.     {
  199. // unexpected
  200.     }
  201.     break;
  202.     case XMLPComment:
  203.     {
  204. // oh, yeah?
  205.     }
  206.     break;
  207.     default:
  208.     {
  209. // unexpected
  210.     }
  211.     break;
  212. }
  213. delete[] pBuf;
  214.     }
  215.     if(pTag)
  216.     {
  217. delete pTag;
  218.     }
  219.     delete pQueue;
  220.     return hresult;
  221. }
  222.  
  223. HX_RESULT
  224. RTSPMediaDesc::toExternalRep(char *pBuf)
  225. {
  226.     CHXString mDesc = toExternalRep();
  227.     strcpy(pBuf, mDesc);
  228.     return HXR_OK;
  229. }
  230. CHXString
  231. RTSPMediaDesc::toExternalRep()
  232. {
  233.     CHXString mDesc;
  234.    
  235.     mDesc =  "<MediaDescription>rn";
  236.     
  237.     if(m_pFileHeader)
  238.     {
  239. mDesc += "    <MediaHeader>rn";
  240. RTSPProperty* pProp = m_pFileHeader->getFirstProperty();
  241. while(pProp)
  242. {
  243.     mDesc += "        " + pProp->asString() + "rn";
  244.     pProp = m_pFileHeader->getNextProperty();
  245. }
  246. mDesc += "    </MediaHeader>rn";
  247.     }
  248.     CHXSimpleList::Iterator i;
  249.     for (i = m_streams->Begin();
  250.      i != m_streams->End();
  251.      ++i)
  252.     {
  253. RTSPPropertyList* pStream = (RTSPPropertyList*)*i;
  254. if(pStream)
  255. {
  256.     mDesc += "    <MediaStream>rn";
  257.     RTSPProperty* pProp = pStream->getFirstProperty();
  258.     while(pProp)
  259.     {
  260. mDesc += "        " + pProp->asString() + "rn";
  261. pProp = pStream->getNextProperty();
  262.     }
  263.     mDesc += "    </MediaStream>rn";
  264. }
  265.     }
  266.     mDesc += "</MediaDescription>rn";
  267.     return mDesc;
  268. }
  269. RTSPPropertyList*
  270. RTSPMediaDesc::getFirstStream()
  271. {
  272.     m_listPos = m_streams->GetHeadPosition();
  273.     if(m_listPos)
  274.     {
  275. RTSPPropertyList* pStream = 
  276.     (RTSPPropertyList*)m_streams->GetNext(m_listPos);
  277. return pStream;
  278.     }
  279.     return 0;
  280. }
  281. RTSPPropertyList*
  282. RTSPMediaDesc::getNextStream()
  283. {
  284.     RTSPPropertyList* pStream = 0;
  285.     if(m_listPos)
  286.     {
  287. pStream = (RTSPPropertyList*)m_streams->GetNext(m_listPos);
  288.     }
  289.     return pStream;
  290. }
  291. CHXSimpleList*
  292. RTSPMediaDesc::getStreamList()
  293. {
  294.     return m_streams;
  295. }
  296. void 
  297. RTSPMediaDesc::addStream(RTSPPropertyList* pStream)
  298. {
  299.     m_streams->AddTail(pStream);
  300. }
  301. void
  302. RTSPMediaDesc::addHeader(RTSPPropertyList* pHeader)
  303. {
  304.     m_pFileHeader = pHeader;
  305. }
  306. RTSPPropertyList*
  307. RTSPMediaDesc::getFileHeader()
  308. {
  309.     return m_pFileHeader;
  310. }
  311. void
  312. RTSPMediaDesc::clearStreamList()
  313. {
  314.     LISTPOSITION pos = m_streams->GetHeadPosition();
  315.     while(pos)
  316.     {
  317. RTSPPropertyList* pStream = (RTSPPropertyList*)m_streams->GetNext(pos);
  318. delete pStream;
  319.     }
  320.     m_streams->RemoveAll();
  321. }
  322. RTSPProperty*
  323. RTSPMediaDesc::makeProperty(XMLTag* pTag)
  324. {
  325.     const char* pDataName = pTag->m_name;
  326.     const char* pDataType = pTag->get_attribute("type");
  327.     if(pDataType)
  328.     {
  329. const char* pDataValue = pTag->get_attribute("value");
  330. if(strcasecmp(pDataType, "integer") == 0)
  331. {
  332.     INT32 dataValue = strtol(pDataValue, 0, 10);
  333.     return new MHIntegerProperty(pDataName, dataValue);
  334. }
  335. else if(strcasecmp(pDataType, "string") == 0)
  336. {
  337.     return new MHStringProperty(pDataName, pDataValue);
  338. }
  339. else if(strcasecmp(pDataType, "buffer") == 0)
  340. {
  341.     char* pTmpBuf = new char[strlen(pDataValue)];
  342.     UINT32 dataLen = BinFrom64(pDataValue,
  343. strlen(pDataValue), (BYTE*)pTmpBuf);
  344.     CHXBuffer* pBuffer = new CHXBuffer;
  345.     pBuffer->AddRef();
  346.     pBuffer->Set((BYTE*)pTmpBuf, dataLen);
  347.     RTSPBufferProperty* pProp =
  348. new MHBufferProperty(pDataName, pBuffer);
  349.     pBuffer->Release();
  350.     delete[] pTmpBuf;
  351.     return pProp;
  352. }
  353.     }
  354.     return 0;
  355. }