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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: rtspmsg.cpp,v 1.5.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 "hxcom.h"
  52. #include "hxstring.h"
  53. #include "hxslist.h"
  54. #include "hxstrutl.h"
  55. #include "hxtypes.h"
  56. #include "smpte.h"
  57. #include "nptime.h"
  58. #include "mimehead.h"
  59. #include "rtspmsg.h"
  60. #include "ihxpckts.h"
  61. #include "hxauth.h"
  62. #include "chxpckts.h"
  63. #include "hxbuffer.h"
  64. #include "hxheap.h"
  65. #ifdef _DEBUG
  66. #undef HX_THIS_FILE
  67. static const char HX_THIS_FILE[] = __FILE__;
  68. #endif
  69. RTSPRange::RTSPRange(UINT32 begin, UINT32 end, RangeType rType):
  70.     m_begin(begin),
  71.     m_end(end),
  72.     m_rangeType(rType)
  73. {
  74.     if(m_rangeType == TR_SMPTE)
  75.     {
  76. SMPTETimeCode tBegin(m_begin);
  77. SMPTETimeCode tEnd(m_end);
  78. char tmpBuf[80]; /* Flawfinder: ignore */
  79. if(m_begin != RTSP_PLAY_RANGE_BLANK && 
  80.    m_end == RTSP_PLAY_RANGE_BLANK)
  81. {
  82.     SafeSprintf(tmpBuf, 80, "%s-", (const char*)tBegin);
  83. }
  84. else if(m_begin != RTSP_PLAY_RANGE_BLANK && 
  85. m_end != RTSP_PLAY_RANGE_BLANK)
  86. {
  87.     SafeSprintf(tmpBuf, 80, "%s-%s", (const char*)tBegin, (const char*)tEnd);
  88. }
  89. else if(m_begin == RTSP_PLAY_RANGE_BLANK && 
  90.         m_end != RTSP_PLAY_RANGE_BLANK)
  91. {
  92.     SafeSprintf(tmpBuf, 80, "-%s", (const char*)tEnd);
  93. }
  94. else if(m_begin == RTSP_PLAY_RANGE_BLANK &&
  95.         m_end == RTSP_PLAY_RANGE_BLANK)
  96. {
  97.     strcpy(tmpBuf, "-"); /* Flawfinder: ignore */
  98. }
  99. else if(m_begin == 0 && m_end == 0)
  100. {
  101.     SafeSprintf(tmpBuf, 80, "0-0"); 
  102. }
  103. else
  104. {
  105.     tmpBuf[0] = 0;
  106. }
  107. addParameter(tmpBuf);
  108.     }
  109.     else if(m_rangeType == TR_NPT)
  110.     {
  111. NPTime tBegin(m_begin);
  112. NPTime tEnd(m_end);
  113. char tmpBuf[80]; /* Flawfinder: ignore */
  114. if(m_begin != RTSP_PLAY_RANGE_BLANK && 
  115.    m_end == RTSP_PLAY_RANGE_BLANK)
  116. {
  117.     SafeSprintf(tmpBuf, 80, "%s-", (const char*)tBegin);
  118. }
  119. else if(m_begin != RTSP_PLAY_RANGE_BLANK && 
  120. m_end != RTSP_PLAY_RANGE_BLANK)
  121. {
  122.     SafeSprintf(tmpBuf, 80, "%s-%s", (const char*)tBegin, (const char*)tEnd);
  123. }
  124. else if(m_begin == RTSP_PLAY_RANGE_BLANK && 
  125.         m_end != RTSP_PLAY_RANGE_BLANK)
  126. {
  127.     SafeSprintf(tmpBuf, 80, "-%s", (const char*)tEnd);
  128. }
  129. else if(m_begin == RTSP_PLAY_RANGE_BLANK &&
  130.         m_end == RTSP_PLAY_RANGE_BLANK)
  131. {
  132.     SafeSprintf(tmpBuf, 80, "-"); 
  133. }
  134. else if(m_begin == 0 && m_end == 0)
  135. {
  136.     SafeSprintf(tmpBuf, 80, "0-0"); 
  137. }
  138. else
  139. {
  140.     tmpBuf[0] = 0;
  141. }
  142. addParameter(tmpBuf);
  143.     }
  144.     else if(m_rangeType == TR_CLOCK)
  145.     {
  146.     }
  147. }
  148. void
  149. RTSPRange::asString(CHXString& str)
  150. {
  151.     MIMEParameter* pParam = getFirstParameter();
  152.     if(pParam)
  153.     {
  154. if(m_rangeType == TR_SMPTE)
  155. {
  156.     str = CHXString("smpte=") + pParam->m_attribute;
  157. }
  158. else if(m_rangeType == TR_NPT)
  159. {
  160.     str = CHXString("npt=") + pParam->m_attribute;
  161. }
  162.     }
  163.     else
  164.     {
  165. str = "";
  166.     }
  167. }
  168. CHXString
  169. RTSPRange::asString()
  170. {
  171.     CHXString str;
  172.     asString(str);
  173.     return str;
  174. }
  175. /*
  176.  * RTSPAuthentication methods
  177.  */
  178. RTSPAuthentication::RTSPAuthentication(const char* authString,
  179.     AuthenticationType authType):
  180.     m_authString(authString),
  181.     m_authValues(NULL),
  182.     m_authType(authType)
  183. {
  184. }
  185. RTSPAuthentication::RTSPAuthentication(IHXValues* pAuth):
  186.     m_authValues(pAuth),
  187.     m_authType(AU_DIGEST)
  188. {
  189.     if(m_authValues)
  190. m_authValues->AddRef();
  191. }
  192. RTSPAuthentication::~RTSPAuthentication()
  193. {
  194.     if(m_authValues)
  195. m_authValues->Release();
  196. }
  197. void
  198. RTSPAuthentication::asString(CHXString& str)
  199. {
  200.     if(m_authType == AU_HX_PRIVATE)
  201.     {
  202. str = CHXString("HXPrivate nonce="") + m_authString + """;
  203.     }
  204.     else if(m_authType == AU_DIGEST)
  205.     {
  206. UINT32 subAuthType;
  207. if(HXR_OK != m_authValues->GetPropertyULONG32("AuthType", subAuthType))
  208. {
  209.     str = "";
  210.     return;
  211. }
  212. switch(subAuthType)
  213. {
  214.     case HX_AUTH_DIGEST:
  215.     {
  216. IHXBuffer* pRealm = 0;
  217. IHXBuffer* pNonce = 0;
  218. IHXBuffer* pOpaque= 0;
  219. if(HXR_OK == m_authValues->GetPropertyCString("Realm", pRealm) &&
  220.    HXR_OK == m_authValues->GetPropertyCString("Nonce", pNonce) &&
  221.    HXR_OK == m_authValues->GetPropertyCString("Opaque", pOpaque))
  222. {
  223.     str = CHXString("Digest realm="") + 
  224. pRealm->GetBuffer() + "",rn" +
  225. "    nonce=" + pNonce->GetBuffer() + ",rn" +
  226. "    opaque=" + pOpaque->GetBuffer();
  227. }
  228. if(pRealm) pRealm->Release();
  229. if(pNonce) pNonce->Release();
  230. if(pOpaque) pOpaque->Release();
  231. break;
  232.     }
  233.     case HX_AUTH_BASIC:
  234.     {
  235. IHXBuffer* pRealm = 0;
  236. IHXBuffer* pUserName = 0;
  237. IHXBuffer* pPassword = 0;
  238. IHXBuffer* pResponse = 0;
  239. if(HXR_OK == m_authValues->GetPropertyCString("Realm", pRealm))
  240. {
  241.     str = CHXString("Basic realm="") + 
  242. pRealm->GetBuffer() + """;
  243. }
  244. else if(HXR_OK == m_authValues->GetPropertyCString(
  245.     "Response", pResponse))
  246. {
  247.     str = CHXString("Basic ") + pResponse->GetBuffer();
  248. }
  249. else if(HXR_OK == m_authValues->GetPropertyCString(
  250.                                    "UserName", pUserName) &&
  251.     HXR_OK == m_authValues->GetPropertyCString("Password",
  252.        pPassword))
  253. {
  254.     str = CHXString(pUserName->GetBuffer()) + 
  255. ":" + pPassword->GetBuffer();
  256. }
  257. if(pUserName) pUserName->Release();
  258. if(pPassword) pPassword->Release();
  259. if(pResponse) pResponse->Release();
  260. if(pRealm) pRealm->Release();
  261. break;
  262.     }
  263.     default:
  264. str = "";
  265. break;
  266. }
  267.     }
  268.     else
  269.     {
  270. str = "";
  271.     }
  272. }
  273. CHXString
  274. RTSPAuthentication::asString()
  275. {
  276.     CHXString str;
  277.     asString(str);
  278.     return str;
  279. }
  280. RTSPDigestAuthorization::RTSPDigestAuthorization(IHXValues* pValues):
  281.     m_values(pValues)
  282. {
  283.     if(m_values)
  284. m_values->AddRef();
  285. }
  286. void
  287. RTSPDigestAuthorization::asString(CHXString& str)
  288. {
  289.     char buf[1024]; /* Flawfinder: ignore */
  290.     IHXBuffer* strBuf;
  291.     INT32 lBytes = 0;
  292.     lBytes += SafeSprintf(buf, 1024, "Digest ");
  293.     if(HXR_OK == m_values->GetPropertyCString("UserName", strBuf))
  294.     {
  295. lBytes += SafeSprintf(buf + lBytes, 1024 - lBytes, "username="%s",", strBuf->GetBuffer());
  296. strBuf->Release();
  297.     }
  298.     if(HXR_OK == m_values->GetPropertyCString("Realm", strBuf))
  299.     {
  300. lBytes += SafeSprintf(buf + lBytes, 1024 - lBytes, "realm="%s",", strBuf->GetBuffer());
  301. strBuf->Release();
  302.     }
  303.     if(HXR_OK == m_values->GetPropertyCString("Response", strBuf))
  304.     {
  305. lBytes += SafeSprintf(buf + lBytes, 1024 - lBytes, "response="%s",", strBuf->GetBuffer());
  306. strBuf->Release();
  307.     }
  308.     if(HXR_OK == m_values->GetPropertyCString("URI", strBuf))
  309.     {
  310. lBytes += SafeSprintf(buf + lBytes, 1024 - lBytes, "uri="%s",", strBuf->GetBuffer());
  311. strBuf->Release();
  312.     }
  313.     if(HXR_OK == m_values->GetPropertyCString("UserName", strBuf))
  314.     {
  315. lBytes += SafeSprintf(buf + lBytes, 1024 - lBytes, "nonce="%s",", strBuf->GetBuffer());
  316. strBuf->Release();
  317.     }
  318.     if(HXR_OK == m_values->GetPropertyCString("UserName", strBuf))
  319.     {
  320. lBytes += SafeSprintf(buf + lBytes, 1024 - lBytes, "opaque="%s",", strBuf->GetBuffer());
  321. strBuf->Release();
  322.     }
  323.     char* comma = strrchr(buf, ',');
  324.     if(comma)
  325. *comma = 0;
  326.     str = CHXString(buf);
  327. }
  328. CHXString
  329. RTSPDigestAuthorization::asString()
  330. {
  331.     CHXString str;
  332.     asString(str);
  333.     return str;
  334. }
  335. /*
  336.  * RTSPPEPInfo methods
  337.  */
  338. RTSPPEPInfo::RTSPPEPInfo(BOOL bStrengthMust):
  339.     m_bStrengthMust(bStrengthMust)
  340. {
  341. }
  342. RTSPPEPInfo::~RTSPPEPInfo()
  343. {
  344. }
  345. void
  346. RTSPPEPInfo::asString(CHXString& str)
  347. {
  348.     if(m_bStrengthMust)
  349.     {
  350. str = "{ {strength must} }";
  351.     }
  352.     else
  353.     {
  354. str = "{ {strength may} }";
  355.     }
  356. }
  357. CHXString
  358. RTSPPEPInfo::asString()
  359. {
  360.     CHXString str;
  361.     asString(str);
  362.     return str;
  363. }
  364. // static definitions
  365. const int RTSPMessage::MAJ_VERSION = 1;
  366. const int RTSPMessage::MIN_VERSION = 0;
  367. RTSPMessage::RTSPMessage():
  368.     m_seqNo(0)
  369. {
  370.     setVersion(MAJ_VERSION, MIN_VERSION);
  371. }
  372. RTSPMessage::~RTSPMessage()
  373. {
  374.     clearHeaderList();
  375. }
  376. void
  377. RTSPMessage::addHeader(MIMEHeader* pHeader, BOOL bAtHead)
  378. {
  379.     if(bAtHead)
  380.     {
  381. m_headers.AddHead(pHeader);
  382.     }
  383.     else
  384.     {
  385. m_headers.AddTail(pHeader);
  386.     }
  387. }
  388. void 
  389. RTSPMessage::addHeader(const char* pName, const char* pValue, BOOL bAtHead)
  390. {
  391.     MIMEHeader* pHeader = new MIMEHeader(pName);
  392.     pHeader->addHeaderValue(pValue);
  393.     addHeader(pHeader, bAtHead);
  394. }
  395. MIMEHeader*
  396. RTSPMessage::getHeader(const char* pName)
  397. {
  398.     LISTPOSITION pos = m_headers.GetHeadPosition();
  399.     while(pos)
  400.     {
  401. MIMEHeader* pHeader = (MIMEHeader*)m_headers.GetNext(pos);
  402. if(strcasecmp(pHeader->name(), pName) == 0)
  403. {
  404.     return pHeader;
  405. }
  406.     }
  407.     return 0;
  408. }
  409. CHXString
  410. RTSPMessage::getHeaderValue(const char* pName)
  411. {
  412.     MIMEHeader* pHeader = getHeader(pName);
  413.     if(pHeader)
  414.     {
  415. MIMEHeaderValue* pHeaderValue = pHeader->getFirstHeaderValue();
  416. if(pHeaderValue)
  417. {
  418.     CHXString str = pHeaderValue->value();
  419.     return str;
  420. }
  421.     }
  422.     return CHXString("");
  423. }
  424. int
  425. RTSPMessage::getHeaderValue(const char* pName, UINT32& value)
  426. {
  427.     CHXString strValue = getHeaderValue(pName);
  428.     if(strValue.GetLength() > 0)
  429.     {
  430. value = strtol((const char*)strValue, 0, 10);
  431. return 1;
  432.     }
  433.     return 0;
  434. }
  435. MIMEHeader*
  436. RTSPMessage::getFirstHeader()
  437. {
  438.     m_listpos = m_headers.GetHeadPosition();
  439.     if(m_listpos)
  440. return (MIMEHeader*)m_headers.GetNext(m_listpos);
  441.     return 0;
  442. }
  443. MIMEHeader*
  444. RTSPMessage::getNextHeader()
  445. {
  446.     if(m_listpos)
  447. return (MIMEHeader*)m_headers.GetNext(m_listpos);
  448.     return 0;
  449. }
  450. void
  451. RTSPMessage::clearHeaderList()
  452. {
  453.     MIMEHeader* pHeader = getFirstHeader();
  454.     while(pHeader)
  455.     {
  456. delete pHeader;
  457. pHeader = getNextHeader();
  458.     }
  459. }
  460. int
  461. RTSPMessage::contentLength()
  462. {
  463.     return m_content.GetLength();
  464. }
  465. HX_RESULT 
  466. RTSPMessage::AsValues(REF(IHXValues*) pIHXValuesHeaders)
  467. {
  468.     pIHXValuesHeaders = new CHXHeader;
  469.     if(pIHXValuesHeaders)
  470.     {
  471. pIHXValuesHeaders->AddRef();
  472. IHXBuffer* pIHXBufferValue = NULL;
  473. MIMEHeader* pMIMEHeaderCurrent = getFirstHeader();
  474. CHXString CHXStringValue;
  475. while(pMIMEHeaderCurrent)
  476. {
  477.     CHXStringValue.Empty();
  478.     pMIMEHeaderCurrent->asString(CHXStringValue);
  479.     CHXBuffer::FromCharArray
  480.     (
  481. CHXStringValue,
  482. &pIHXBufferValue
  483.     );
  484.     pIHXValuesHeaders->SetPropertyCString
  485.     (
  486. pMIMEHeaderCurrent->name(),
  487. pIHXBufferValue
  488.     );
  489.     HX_RELEASE(pIHXBufferValue);
  490.     pMIMEHeaderCurrent = getNextHeader();
  491. }
  492. return HXR_OK;
  493.     }
  494.     return HXR_OUTOFMEMORY;
  495. }
  496. CHXString
  497. RTSPRequestMessage::asString()
  498. {
  499. int lenTmpBuf = strlen(tagStr()) + strlen(url()) + 80;
  500.     char* pTmpBuf = new char[lenTmpBuf];
  501.     SafeSprintf(pTmpBuf, lenTmpBuf, "%s %s RTSP/%d.%drn",
  502. tagStr(), url(), majorVersion(), minorVersion());
  503.     CHXString msgStr = pTmpBuf;
  504.     delete[] pTmpBuf;
  505.     MIMEHeader* pHeader = getFirstHeader();
  506.     while(pHeader)
  507.     {
  508. msgStr += pHeader->name();
  509. msgStr += ": ";
  510. pHeader->asString(msgStr);
  511. pHeader = getNextHeader();
  512.     }
  513.     msgStr += "rn";
  514.     if(contentLength() > 0)
  515.     {
  516. msgStr += getContent();
  517.     }
  518.     return msgStr;
  519. }
  520. void
  521. RTSPRequestMessage::asString(char* pBuf, int& msgLen)
  522. {
  523.     CHXString msgStr = asString();
  524.     SafeStrCpy(pBuf, msgStr, msgLen);
  525.     msgLen = strlen(pBuf);
  526. }
  527. CHXString
  528. RTSPResponseMessage::asString()
  529. {
  530. int lenTmpBuf = m_errorMsg.GetLength() + 80;
  531.     char* pTmpBuf = new char[lenTmpBuf];
  532.     SafeSprintf(pTmpBuf, lenTmpBuf, "RTSP/%d.%d %s %srn",
  533. majorVersion(), minorVersion(), (const char*)m_errorCode,
  534. (const char*)m_errorMsg);
  535.     CHXString msgStr = pTmpBuf;
  536.     delete[] pTmpBuf;
  537.     MIMEHeader* pHeader = getFirstHeader();
  538.     while(pHeader)
  539.     {
  540. msgStr += pHeader->name();
  541. msgStr += ": ";
  542. pHeader->asString(msgStr);
  543. pHeader = getNextHeader();
  544.     }
  545.     msgStr += "rn";
  546.     if(contentLength() > 0)
  547.     {
  548. msgStr += getContent();
  549.     }
  550.     return msgStr;
  551. }
  552. void
  553. RTSPResponseMessage::asString(char* pMsg, int& msgLen)
  554. {
  555.     CHXString msgStr = asString();
  556.     SafeStrCpy(pMsg, msgStr, msgLen);
  557.     msgLen = strlen(pMsg);
  558. }