rtspmsg.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:14k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. //#include "hlxclib/stdlib.h"
  36. //#include "hlxclib/stdio.h"
  37. #include "hxcom.h"
  38. #include "hxstring.h"
  39. #include "hxslist.h"
  40. #include "hxstrutl.h"
  41. #include "hxtypes.h"
  42. #include "smpte.h"
  43. #include "nptime.h"
  44. #include "mimehead.h"
  45. #include "rtspmsg.h"
  46. #include "ihxpckts.h"
  47. #include "hxauth.h"
  48. #include "chxpckts.h"
  49. #include "hxbuffer.h"
  50. #include "hxheap.h"
  51. #ifdef _DEBUG
  52. #undef HX_THIS_FILE
  53. static const char HX_THIS_FILE[] = __FILE__;
  54. #endif
  55. RTSPRange::RTSPRange(UINT32 begin, UINT32 end, RangeType rType):
  56.     m_begin(begin),
  57.     m_end(end),
  58.     m_rangeType(rType)
  59. {
  60.     if(m_rangeType == TR_SMPTE)
  61.     {
  62. SMPTETimeCode tBegin(m_begin);
  63. SMPTETimeCode tEnd(m_end);
  64. char tmpBuf[80]; /* Flawfinder: ignore */
  65. if(m_begin != RTSP_PLAY_RANGE_BLANK && 
  66.    m_end == RTSP_PLAY_RANGE_BLANK)
  67. {
  68.     SafeSprintf(tmpBuf, 80, "%s-", (const char*)tBegin);
  69. }
  70. else if(m_begin != RTSP_PLAY_RANGE_BLANK && 
  71. m_end != RTSP_PLAY_RANGE_BLANK)
  72. {
  73.     SafeSprintf(tmpBuf, 80, "%s-%s", (const char*)tBegin, (const char*)tEnd);
  74. }
  75. else if(m_begin == RTSP_PLAY_RANGE_BLANK && 
  76.         m_end != RTSP_PLAY_RANGE_BLANK)
  77. {
  78.     SafeSprintf(tmpBuf, 80, "-%s", (const char*)tEnd);
  79. }
  80. else if(m_begin == RTSP_PLAY_RANGE_BLANK &&
  81.         m_end == RTSP_PLAY_RANGE_BLANK)
  82. {
  83.     strcpy(tmpBuf, "-"); /* Flawfinder: ignore */
  84. }
  85. else if(m_begin == 0 && m_end == 0)
  86. {
  87.     SafeSprintf(tmpBuf, 80, "0-0"); 
  88. }
  89. else
  90. {
  91.     tmpBuf[0] = 0;
  92. }
  93. addParameter(tmpBuf);
  94.     }
  95.     else if(m_rangeType == TR_NPT)
  96.     {
  97. NPTime tBegin(m_begin);
  98. NPTime tEnd(m_end);
  99. char tmpBuf[80]; /* Flawfinder: ignore */
  100. if(m_begin != RTSP_PLAY_RANGE_BLANK && 
  101.    m_end == RTSP_PLAY_RANGE_BLANK)
  102. {
  103.     SafeSprintf(tmpBuf, 80, "%s-", (const char*)tBegin);
  104. }
  105. else if(m_begin != RTSP_PLAY_RANGE_BLANK && 
  106. m_end != RTSP_PLAY_RANGE_BLANK)
  107. {
  108.     SafeSprintf(tmpBuf, 80, "%s-%s", (const char*)tBegin, (const char*)tEnd);
  109. }
  110. else if(m_begin == RTSP_PLAY_RANGE_BLANK && 
  111.         m_end != RTSP_PLAY_RANGE_BLANK)
  112. {
  113.     SafeSprintf(tmpBuf, 80, "-%s", (const char*)tEnd);
  114. }
  115. else if(m_begin == RTSP_PLAY_RANGE_BLANK &&
  116.         m_end == RTSP_PLAY_RANGE_BLANK)
  117. {
  118.     SafeSprintf(tmpBuf, 80, "-"); 
  119. }
  120. else if(m_begin == 0 && m_end == 0)
  121. {
  122.     SafeSprintf(tmpBuf, 80, "0-0"); 
  123. }
  124. else
  125. {
  126.     tmpBuf[0] = 0;
  127. }
  128. addParameter(tmpBuf);
  129.     }
  130.     else if(m_rangeType == TR_CLOCK)
  131.     {
  132.     }
  133. }
  134. void
  135. RTSPRange::asString(CHXString& str)
  136. {
  137.     MIMEParameter* pParam = getFirstParameter();
  138.     if(pParam)
  139.     {
  140. if(m_rangeType == TR_SMPTE)
  141. {
  142.     str = CHXString("smpte=") + pParam->m_attribute;
  143. }
  144. else if(m_rangeType == TR_NPT)
  145. {
  146.     str = CHXString("npt=") + pParam->m_attribute;
  147. }
  148.     }
  149.     else
  150.     {
  151. str = "";
  152.     }
  153. }
  154. CHXString
  155. RTSPRange::asString()
  156. {
  157.     CHXString str;
  158.     asString(str);
  159.     return str;
  160. }
  161. /*
  162.  * RTSPAuthentication methods
  163.  */
  164. RTSPAuthentication::RTSPAuthentication(const char* authString,
  165.     AuthenticationType authType):
  166.     m_authString(authString),
  167.     m_authValues(NULL),
  168.     m_authType(authType)
  169. {
  170. }
  171. RTSPAuthentication::RTSPAuthentication(IHXValues* pAuth):
  172.     m_authValues(pAuth),
  173.     m_authType(AU_DIGEST)
  174. {
  175.     if(m_authValues)
  176. m_authValues->AddRef();
  177. }
  178. RTSPAuthentication::~RTSPAuthentication()
  179. {
  180.     if(m_authValues)
  181. m_authValues->Release();
  182. }
  183. void
  184. RTSPAuthentication::asString(CHXString& str)
  185. {
  186.     if(m_authType == AU_HX_PRIVATE)
  187.     {
  188. str = CHXString("HXPrivate nonce="") + m_authString + """;
  189.     }
  190.     else if(m_authType == AU_DIGEST)
  191.     {
  192. UINT32 subAuthType;
  193. if(HXR_OK != m_authValues->GetPropertyULONG32("AuthType", subAuthType))
  194. {
  195.     str = "";
  196.     return;
  197. }
  198. switch(subAuthType)
  199. {
  200.     case HX_AUTH_DIGEST:
  201.     {
  202. IHXBuffer* pRealm = 0;
  203. IHXBuffer* pNonce = 0;
  204. IHXBuffer* pOpaque= 0;
  205. if(HXR_OK == m_authValues->GetPropertyCString("Realm", pRealm) &&
  206.    HXR_OK == m_authValues->GetPropertyCString("Nonce", pNonce) &&
  207.    HXR_OK == m_authValues->GetPropertyCString("Opaque", pOpaque))
  208. {
  209.     str = CHXString("Digest realm="") + 
  210. pRealm->GetBuffer() + "",rn" +
  211. "    nonce=" + pNonce->GetBuffer() + ",rn" +
  212. "    opaque=" + pOpaque->GetBuffer();
  213. }
  214. if(pRealm) pRealm->Release();
  215. if(pNonce) pNonce->Release();
  216. if(pOpaque) pOpaque->Release();
  217. break;
  218.     }
  219.     case HX_AUTH_BASIC:
  220.     {
  221. IHXBuffer* pRealm = 0;
  222. IHXBuffer* pUserName = 0;
  223. IHXBuffer* pPassword = 0;
  224. IHXBuffer* pResponse = 0;
  225. if(HXR_OK == m_authValues->GetPropertyCString("Realm", pRealm))
  226. {
  227.     str = CHXString("Basic realm="") + 
  228. pRealm->GetBuffer() + """;
  229. }
  230. else if(HXR_OK == m_authValues->GetPropertyCString(
  231.     "Response", pResponse))
  232. {
  233.     str = CHXString("Basic ") + pResponse->GetBuffer();
  234. }
  235. else if(HXR_OK == m_authValues->GetPropertyCString(
  236.                                    "UserName", pUserName) &&
  237.     HXR_OK == m_authValues->GetPropertyCString("Password",
  238.        pPassword))
  239. {
  240.     str = CHXString(pUserName->GetBuffer()) + 
  241. ":" + pPassword->GetBuffer();
  242. }
  243. if(pUserName) pUserName->Release();
  244. if(pPassword) pPassword->Release();
  245. if(pResponse) pResponse->Release();
  246. if(pRealm) pRealm->Release();
  247. break;
  248.     }
  249.     default:
  250. str = "";
  251. break;
  252. }
  253.     }
  254.     else
  255.     {
  256. str = "";
  257.     }
  258. }
  259. CHXString
  260. RTSPAuthentication::asString()
  261. {
  262.     CHXString str;
  263.     asString(str);
  264.     return str;
  265. }
  266. RTSPDigestAuthorization::RTSPDigestAuthorization(IHXValues* pValues):
  267.     m_values(pValues)
  268. {
  269.     if(m_values)
  270. m_values->AddRef();
  271. }
  272. void
  273. RTSPDigestAuthorization::asString(CHXString& str)
  274. {
  275.     char buf[1024]; /* Flawfinder: ignore */
  276.     IHXBuffer* strBuf;
  277.     INT32 lBytes = 0;
  278.     lBytes += SafeSprintf(buf, 1024, "Digest ");
  279.     if(HXR_OK == m_values->GetPropertyCString("UserName", strBuf))
  280.     {
  281. lBytes += SafeSprintf(buf + lBytes, 1024 - lBytes, "username="%s",", strBuf->GetBuffer());
  282. strBuf->Release();
  283.     }
  284.     if(HXR_OK == m_values->GetPropertyCString("Realm", strBuf))
  285.     {
  286. lBytes += SafeSprintf(buf + lBytes, 1024 - lBytes, "realm="%s",", strBuf->GetBuffer());
  287. strBuf->Release();
  288.     }
  289.     if(HXR_OK == m_values->GetPropertyCString("Response", strBuf))
  290.     {
  291. lBytes += SafeSprintf(buf + lBytes, 1024 - lBytes, "response="%s",", strBuf->GetBuffer());
  292. strBuf->Release();
  293.     }
  294.     if(HXR_OK == m_values->GetPropertyCString("URI", strBuf))
  295.     {
  296. lBytes += SafeSprintf(buf + lBytes, 1024 - lBytes, "uri="%s",", strBuf->GetBuffer());
  297. strBuf->Release();
  298.     }
  299.     if(HXR_OK == m_values->GetPropertyCString("UserName", strBuf))
  300.     {
  301. lBytes += SafeSprintf(buf + lBytes, 1024 - lBytes, "nonce="%s",", strBuf->GetBuffer());
  302. strBuf->Release();
  303.     }
  304.     if(HXR_OK == m_values->GetPropertyCString("UserName", strBuf))
  305.     {
  306. lBytes += SafeSprintf(buf + lBytes, 1024 - lBytes, "opaque="%s",", strBuf->GetBuffer());
  307. strBuf->Release();
  308.     }
  309.     char* comma = strrchr(buf, ',');
  310.     if(comma)
  311. *comma = 0;
  312.     str = CHXString(buf);
  313. }
  314. CHXString
  315. RTSPDigestAuthorization::asString()
  316. {
  317.     CHXString str;
  318.     asString(str);
  319.     return str;
  320. }
  321. /*
  322.  * RTSPPEPInfo methods
  323.  */
  324. RTSPPEPInfo::RTSPPEPInfo(BOOL bStrengthMust):
  325.     m_bStrengthMust(bStrengthMust)
  326. {
  327. }
  328. RTSPPEPInfo::~RTSPPEPInfo()
  329. {
  330. }
  331. void
  332. RTSPPEPInfo::asString(CHXString& str)
  333. {
  334.     if(m_bStrengthMust)
  335.     {
  336. str = "{ {strength must} }";
  337.     }
  338.     else
  339.     {
  340. str = "{ {strength may} }";
  341.     }
  342. }
  343. CHXString
  344. RTSPPEPInfo::asString()
  345. {
  346.     CHXString str;
  347.     asString(str);
  348.     return str;
  349. }
  350. // static definitions
  351. const int RTSPMessage::MAJ_VERSION = 1;
  352. const int RTSPMessage::MIN_VERSION = 0;
  353. RTSPMessage::RTSPMessage():
  354.     m_seqNo(0)
  355. {
  356.     setVersion(MAJ_VERSION, MIN_VERSION);
  357. }
  358. RTSPMessage::~RTSPMessage()
  359. {
  360.     clearHeaderList();
  361. }
  362. void
  363. RTSPMessage::addHeader(MIMEHeader* pHeader, BOOL bAtHead)
  364. {
  365.     if(bAtHead)
  366.     {
  367. m_headers.AddHead(pHeader);
  368.     }
  369.     else
  370.     {
  371. m_headers.AddTail(pHeader);
  372.     }
  373. }
  374. void 
  375. RTSPMessage::addHeader(const char* pName, const char* pValue, BOOL bAtHead)
  376. {
  377.     MIMEHeader* pHeader = new MIMEHeader(pName);
  378.     pHeader->addHeaderValue(pValue);
  379.     addHeader(pHeader, bAtHead);
  380. }
  381. MIMEHeader*
  382. RTSPMessage::getHeader(const char* pName)
  383. {
  384.     LISTPOSITION pos = m_headers.GetHeadPosition();
  385.     while(pos)
  386.     {
  387. MIMEHeader* pHeader = (MIMEHeader*)m_headers.GetNext(pos);
  388. if(strcasecmp(pHeader->name(), pName) == 0)
  389. {
  390.     return pHeader;
  391. }
  392.     }
  393.     return 0;
  394. }
  395. CHXString
  396. RTSPMessage::getHeaderValue(const char* pName)
  397. {
  398.     MIMEHeader* pHeader = getHeader(pName);
  399.     if(pHeader)
  400.     {
  401. MIMEHeaderValue* pHeaderValue = pHeader->getFirstHeaderValue();
  402. if(pHeaderValue)
  403. {
  404.     CHXString str = pHeaderValue->value();
  405.     return str;
  406. }
  407.     }
  408.     return CHXString("");
  409. }
  410. int
  411. RTSPMessage::getHeaderValue(const char* pName, UINT32& value)
  412. {
  413.     CHXString strValue = getHeaderValue(pName);
  414.     if(strValue.GetLength() > 0)
  415.     {
  416. value = strtol((const char*)strValue, 0, 10);
  417. return 1;
  418.     }
  419.     return 0;
  420. }
  421. MIMEHeader*
  422. RTSPMessage::getFirstHeader()
  423. {
  424.     m_listpos = m_headers.GetHeadPosition();
  425.     if(m_listpos)
  426. return (MIMEHeader*)m_headers.GetNext(m_listpos);
  427.     return 0;
  428. }
  429. MIMEHeader*
  430. RTSPMessage::getNextHeader()
  431. {
  432.     if(m_listpos)
  433. return (MIMEHeader*)m_headers.GetNext(m_listpos);
  434.     return 0;
  435. }
  436. void
  437. RTSPMessage::clearHeaderList()
  438. {
  439.     MIMEHeader* pHeader = getFirstHeader();
  440.     while(pHeader)
  441.     {
  442. delete pHeader;
  443. pHeader = getNextHeader();
  444.     }
  445. }
  446. int
  447. RTSPMessage::contentLength()
  448. {
  449.     return m_content.GetLength();
  450. }
  451. HX_RESULT 
  452. RTSPMessage::AsValues(REF(IHXValues*) pIHXValuesHeaders)
  453. {
  454.     pIHXValuesHeaders = new CHXHeader;
  455.     if(pIHXValuesHeaders)
  456.     {
  457. pIHXValuesHeaders->AddRef();
  458. IHXBuffer* pIHXBufferValue = NULL;
  459. MIMEHeader* pMIMEHeaderCurrent = getFirstHeader();
  460. CHXString CHXStringValue;
  461. while(pMIMEHeaderCurrent)
  462. {
  463.     CHXStringValue.Empty();
  464.     pMIMEHeaderCurrent->asString(CHXStringValue);
  465.     CHXBuffer::FromCharArray
  466.     (
  467. CHXStringValue,
  468. &pIHXBufferValue
  469.     );
  470.     pIHXValuesHeaders->SetPropertyCString
  471.     (
  472. pMIMEHeaderCurrent->name(),
  473. pIHXBufferValue
  474.     );
  475.     HX_RELEASE(pIHXBufferValue);
  476.     pMIMEHeaderCurrent = getNextHeader();
  477. }
  478. return HXR_OK;
  479.     }
  480.     return HXR_OUTOFMEMORY;
  481. }
  482. CHXString
  483. RTSPRequestMessage::asString()
  484. {
  485. int lenTmpBuf = strlen(tagStr()) + strlen(url()) + 80;
  486.     char* pTmpBuf = new char[lenTmpBuf];
  487.     SafeSprintf(pTmpBuf, lenTmpBuf, "%s %s RTSP/%d.%drn",
  488. tagStr(), url(), majorVersion(), minorVersion());
  489.     CHXString msgStr = pTmpBuf;
  490.     delete[] pTmpBuf;
  491.     MIMEHeader* pHeader = getFirstHeader();
  492.     while(pHeader)
  493.     {
  494. msgStr += pHeader->name();
  495. msgStr += ": ";
  496. pHeader->asString(msgStr);
  497. pHeader = getNextHeader();
  498.     }
  499.     msgStr += "rn";
  500.     if(contentLength() > 0)
  501.     {
  502. msgStr += getContent();
  503.     }
  504.     return msgStr;
  505. }
  506. void
  507. RTSPRequestMessage::asString(char* pBuf, int& msgLen)
  508. {
  509.     CHXString msgStr = asString();
  510.     SafeStrCpy(pBuf, msgStr, msgLen);
  511.     msgLen = strlen(pBuf);
  512. }
  513. CHXString
  514. RTSPResponseMessage::asString()
  515. {
  516. int lenTmpBuf = m_errorMsg.GetLength() + 80;
  517.     char* pTmpBuf = new char[lenTmpBuf];
  518.     SafeSprintf(pTmpBuf, lenTmpBuf, "RTSP/%d.%d %s %srn",
  519. majorVersion(), minorVersion(), (const char*)m_errorCode,
  520. (const char*)m_errorMsg);
  521.     CHXString msgStr = pTmpBuf;
  522.     delete[] pTmpBuf;
  523.     MIMEHeader* pHeader = getFirstHeader();
  524.     while(pHeader)
  525.     {
  526. msgStr += pHeader->name();
  527. msgStr += ": ";
  528. pHeader->asString(msgStr);
  529. pHeader = getNextHeader();
  530.     }
  531.     msgStr += "rn";
  532.     if(contentLength() > 0)
  533.     {
  534. msgStr += getContent();
  535.     }
  536.     return msgStr;
  537. }
  538. void
  539. RTSPResponseMessage::asString(char* pMsg, int& msgLen)
  540. {
  541.     CHXString msgStr = asString();
  542.     SafeStrCpy(pMsg, msgStr, msgLen);
  543.     msgLen = strlen(pMsg);
  544. }