dtrvtcon.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 "hxcom.h"
  36. #include "ihxpckts.h"
  37. #include "hxdtcvt.h"
  38. #include "plghand2.h"
  39. #include "dtrvtcon.h"
  40. #include "hxmarsh.h"
  41. #include "hxstrutl.h"
  42. #include "rtsputil.h"
  43. #include "hxbuffer.h"
  44. #define HX_CONVERT_MIME_TYPE "application/vnd.rn.dataconvert."
  45. DataRevertController::DataRevertController(IUnknown* pContext)
  46. : m_pPlugin2Handler(0)
  47. , m_pContext(0)
  48. , m_pControlResp(0)
  49. , m_lRefCount(0)
  50. , m_pDataRevert(0)
  51. , m_pStreamHeaders(0)
  52. , m_pRevertedStreamHeaders(0)
  53. , m_pFileHeaders(0)
  54. , m_pResponseHeaders(0)
  55. , m_pCurrentStreamHeader(0)
  56. , m_pDataResp(0)
  57. , m_pPacketList(0)
  58. , m_pControlBufferList(0)
  59. , m_bInited(FALSE)
  60. {
  61.     m_pContext = pContext;
  62.     m_pContext->AddRef();
  63.     m_pContext->QueryInterface(IID_IHXPlugin2Handler,
  64.     (void**)&m_pPlugin2Handler);
  65. }
  66. DataRevertController::~DataRevertController()
  67. {
  68.     HX_RELEASE(m_pContext);
  69.     HX_RELEASE(m_pPlugin2Handler);
  70.     HX_RELEASE(m_pDataRevert);
  71.     HX_RELEASE(m_pCurrentStreamHeader);
  72.     CleanStreamHeaders();
  73.     CleanControlBuffers();
  74.     HX_RELEASE(m_pFileHeaders);
  75.     HX_RELEASE(m_pResponseHeaders);
  76.     delete m_pPacketList;
  77. }
  78. void
  79. DataRevertController::CleanControlBuffers()
  80. {
  81.     IHXBuffer* pBuffer;
  82.     if (m_pControlBufferList)
  83.     {
  84. while (!m_pControlBufferList->IsEmpty())
  85. {
  86.     pBuffer = (IHXBuffer*)m_pControlBufferList->RemoveHead();
  87.     pBuffer->Release();
  88. }
  89. delete m_pControlBufferList;
  90.     }
  91. }
  92. void
  93. DataRevertController::CleanStreamHeaders()
  94. {
  95.     IHXValues* pHeader;
  96.     if (m_pStreamHeaders)
  97.     {
  98. while (!m_pStreamHeaders->IsEmpty())
  99. {
  100.     pHeader = (IHXValues*)m_pStreamHeaders->RemoveHead();
  101.     pHeader->Release();
  102. }
  103. delete m_pStreamHeaders;
  104.     }
  105.     if (m_pRevertedStreamHeaders)
  106.     {
  107. while (!m_pRevertedStreamHeaders->IsEmpty())
  108. {
  109.     pHeader = (IHXValues*)m_pRevertedStreamHeaders->RemoveHead();
  110.     pHeader->Release();
  111. }
  112. delete m_pRevertedStreamHeaders;
  113.     }
  114. }
  115. void
  116. DataRevertController::SetControlResponse(DataRevertControllerResponse* pResp)
  117. {
  118.     m_pControlResp = pResp;
  119. }
  120. void
  121. DataRevertController::RevertHeaders(IHXValues* pFileHeader,
  122.     CHXSimpleList* pStreamHeaders,
  123.     IHXValues* pResponseHeaders)
  124. {
  125.     IHXBuffer* pMimeType = 0;
  126.     IHXValues* pHeader;
  127.     CHXSimpleList::Iterator i;
  128.     char* pConversionType = NULL;
  129.     IUnknown* pUnkReverter = NULL;
  130.     HX_RELEASE(m_pDataRevert);
  131.     
  132.     i = pStreamHeaders->Begin();
  133.     if (i != pStreamHeaders->End())
  134.     {
  135. pHeader = (IHXValues*)(*i);
  136. pHeader->GetPropertyCString("MimeType", pMimeType);
  137. if (!pMimeType)
  138. {
  139.     HX_ASSERT(0);
  140.     goto exit;
  141. }
  142. if (strncasecmp((const char*)pMimeType->GetBuffer(),
  143.     HX_CONVERT_MIME_TYPE, (int)strlen(HX_CONVERT_MIME_TYPE)))
  144. {
  145.     goto exit;
  146. }
  147. pConversionType = (char*)pMimeType->GetBuffer() +
  148.     strlen(HX_CONVERT_MIME_TYPE);
  149. if (m_pPlugin2Handler &&
  150.     HXR_OK == m_pPlugin2Handler->FindPluginUsingStrings(
  151. PLUGIN_CLASS, PLUGIN_REVERTER_TYPE,
  152. PLUGIN_REVERTER_MIME, pConversionType,
  153. NULL, NULL, pUnkReverter))
  154. {
  155.     pUnkReverter->QueryInterface(IID_IHXDataRevert,
  156.     (void**)&m_pDataRevert);
  157.     pUnkReverter->Release();
  158. }
  159. if (!m_pDataRevert)
  160. {
  161.     goto exit;
  162. }
  163. IHXPlugin* pPlugin;
  164. m_pDataRevert->QueryInterface(IID_IHXPlugin, (void**)&pPlugin);
  165. pPlugin->InitPlugin(m_pContext);
  166. pPlugin->Release();
  167. HX_RELEASE(pMimeType);
  168. m_pStreamHeaders = new CHXSimpleList;
  169. m_pRevertedStreamHeaders = new CHXSimpleList;
  170. IHXBuffer* pConvertHeader = 0;
  171. for (i = pStreamHeaders->Begin(); i != pStreamHeaders->End(); ++i)
  172. {
  173.     pHeader = (IHXValues*)(*i);
  174.     /*
  175.      * If this stream header was converted and flattened then
  176.      * the one we want to give to the plugin is the result
  177.      * of re-inflating that.  If not, then just give the plugin
  178.      * the one we already got.
  179.      */
  180.     if (HXR_OK == pHeader->GetPropertyBuffer("DataConvertStreamHeader",
  181.     pConvertHeader))
  182.     {
  183. pHeader = InflateConvertHeader(pConvertHeader);
  184. pConvertHeader->Release();
  185.     }
  186.     else
  187.     {
  188. IHXBuffer* pPreConvertMimeType;
  189. if (HXR_OK == pHeader->GetPropertyCString("PreConvertMimeType",
  190. pPreConvertMimeType))
  191. {
  192.     pHeader->SetPropertyCString("MimeType",
  193. pPreConvertMimeType);
  194.     pPreConvertMimeType->Release();
  195. }
  196. pHeader->AddRef();
  197.     }
  198.     m_pStreamHeaders->AddTail((void*)pHeader);
  199. }
  200. m_pResponseHeaders = pResponseHeaders;
  201. m_pResponseHeaders->AddRef();
  202. /*
  203.  * If playing through an old proxy which does not support
  204.  * initiate-session then the DataConvertBuffer will come in here.
  205.  * This is not an ideal situation because only one can come in
  206.  * at this point, but it's better then nothing. 
  207.  */
  208. IHXBuffer* pConvertBuffer = 0;
  209. if (HXR_OK == pFileHeader->GetPropertyBuffer("DataConvertBuffer",
  210.     pConvertBuffer))
  211. {
  212.     const char* pContent = (const char*)pConvertBuffer->GetBuffer();
  213.     IHXBuffer* pNewBuffer = new CHXBuffer();
  214.     int contentLen = pConvertBuffer->GetSize();
  215.     pNewBuffer->SetSize(contentLen);
  216.     int offset = BinFrom64(pContent, contentLen,
  217.     (unsigned char*)pNewBuffer->GetBuffer());
  218.     pNewBuffer->SetSize(offset);
  219.     pNewBuffer->AddRef();
  220.     ControlBufferReady(pNewBuffer);
  221.     pNewBuffer->Release();
  222.     pConvertBuffer->Release();
  223. }
  224. /*
  225.  * Again for file header, if the header was converted and
  226.  * flattened then give to plugin the inflated version of that.
  227.  * If not, then give the straight old header that we already
  228.  * have.
  229.  */
  230. if (HXR_OK == pFileHeader->GetPropertyBuffer("DataConvertFileHeader",
  231.     pConvertHeader))
  232. {
  233.     m_pFileHeaders = InflateConvertHeader(pConvertHeader);
  234.     pConvertHeader->Release();
  235. }
  236. else
  237. {
  238.     m_pFileHeaders = pFileHeader;
  239.     m_pFileHeaders->AddRef();
  240. }
  241. m_pDataRevert->DataRevertInit(this);
  242. return;
  243.     }
  244. exit:;
  245.     HX_RELEASE(pMimeType);
  246.     m_pControlResp->RevertHeadersDone(pFileHeader, 
  247.       pStreamHeaders,
  248.       pResponseHeaders,
  249.       FALSE);
  250. }
  251. void
  252. DataRevertController::ControlBufferReady(IHXBuffer* pBuffer)
  253. {
  254.     if (!m_bInited)
  255.     {
  256. if (!m_pControlBufferList)
  257. {
  258.     m_pControlBufferList = new CHXSimpleList;
  259. }
  260. m_pControlBufferList->AddTail((void*)pBuffer);
  261. pBuffer->AddRef();
  262.     }
  263.     else
  264.     {
  265. m_pDataRevert->ControlBufferReady(pBuffer);
  266.     }
  267. }
  268. /*
  269.  *  IUnknown methods
  270.  */
  271. STDMETHODIMP
  272. DataRevertController::QueryInterface(REFIID riid, void** ppvObj)
  273. {
  274.     QInterfaceList qiList[] =
  275.         {
  276.             { GET_IIDHANDLE(IID_IHXDataRevertResponse), (IHXDataRevertResponse*)this },
  277.             { GET_IIDHANDLE(IID_IUnknown), (IUnknown*)(IHXDataRevertResponse*)this },
  278.         };
  279.     
  280.     return ::QIFind(qiList, QILISTSIZE(qiList), riid, ppvObj);
  281. }
  282. STDMETHODIMP_(ULONG32)
  283. DataRevertController::AddRef()
  284. {
  285.     return InterlockedIncrement(&m_lRefCount);
  286. }
  287. STDMETHODIMP_(ULONG32)
  288. DataRevertController::Release()
  289. {
  290.     if (InterlockedDecrement(&m_lRefCount) > 0)
  291.     {
  292. return m_lRefCount;
  293.     }
  294.     delete this;
  295.     return 0;
  296. }
  297. /************************************************************************
  298.  *  IHXDataRevertResponse
  299.  */
  300. STDMETHODIMP
  301. DataRevertController::DataRevertInitDone(HX_RESULT status)
  302. {
  303.     m_bInited = TRUE;
  304.     if (m_pControlBufferList)
  305.     {
  306. IHXBuffer* pBuffer;
  307. while (!m_pControlBufferList->IsEmpty())
  308. {
  309.     pBuffer = (IHXBuffer*)m_pControlBufferList->RemoveHead();
  310.     m_pDataRevert->ControlBufferReady(pBuffer);
  311.     pBuffer->Release();
  312. }
  313.     }
  314.     m_pDataRevert->RevertFileHeader(m_pFileHeaders);
  315.     return HXR_OK;
  316. }
  317. STDMETHODIMP
  318. DataRevertController::RevertedFileHeaderReady(HX_RESULT status,
  319. IHXValues* pHeader)
  320. {
  321.     if (pHeader)
  322.     {
  323. HX_RELEASE(m_pFileHeaders);
  324. m_pFileHeaders = pHeader;
  325. pHeader->AddRef();
  326.     }
  327.     pHeader = (IHXValues*)m_pStreamHeaders->RemoveHead(); 
  328.     if (!pHeader)
  329.     {
  330. m_pControlResp->RevertHeadersDone(m_pFileHeaders,
  331.   m_pRevertedStreamHeaders, 
  332.   m_pResponseHeaders,
  333.   TRUE);
  334. return HXR_OK;
  335.     }
  336.     
  337.     HX_RELEASE(m_pCurrentStreamHeader);
  338.     m_pCurrentStreamHeader = pHeader;
  339.     m_pDataRevert->RevertStreamHeader(pHeader);
  340.     return HXR_OK;
  341. }
  342. STDMETHODIMP
  343. DataRevertController::RevertedStreamHeaderReady(HX_RESULT status,
  344. IHXValues* pHeader)
  345. {
  346.     if (!pHeader)
  347.     {
  348. pHeader = m_pCurrentStreamHeader;
  349.     }
  350.     else
  351.     {
  352. pHeader->AddRef();
  353.     }
  354.     m_pRevertedStreamHeaders->AddTail((void*)pHeader);
  355.     if (!m_pStreamHeaders->IsEmpty())
  356.     {
  357. HX_RELEASE(m_pCurrentStreamHeader);
  358. m_pCurrentStreamHeader = (IHXValues*)m_pStreamHeaders->RemoveHead();
  359. m_pDataRevert->RevertStreamHeader(m_pCurrentStreamHeader);
  360.     }
  361.     else
  362.     {
  363. m_pControlResp->RevertHeadersDone(m_pFileHeaders,
  364.   m_pRevertedStreamHeaders, 
  365.   m_pResponseHeaders,
  366.   TRUE);
  367.     }
  368.     return HXR_OK;
  369. }
  370. STDMETHODIMP
  371. DataRevertController::RevertedDataReady(HX_RESULT status, IHXPacket* pPacket)
  372. {
  373.     IHXPacket* pThisPacket;
  374.     pThisPacket = (IHXPacket*)m_pPacketList->RemoveTail();
  375.     if (pPacket)
  376.     {
  377. HX_RELEASE(pThisPacket);
  378. pThisPacket = pPacket;
  379. pThisPacket->AddRef();
  380.     }
  381.     m_pDataResp->FilterPacket(pThisPacket);
  382.     pThisPacket->Release();
  383.     return HXR_OK;
  384. }
  385. STDMETHODIMP
  386. DataRevertController::SendControlBuffer(IHXBuffer* pBuffer)
  387. {
  388.     m_pControlResp->SendControlBuffer(pBuffer);
  389.     return HXR_OK;
  390. }
  391. void
  392. DataRevertController::FilterPacket(IHXPacket* pPacket)
  393. {
  394.     if (m_pDataRevert)
  395.     {
  396. pPacket->AddRef();
  397. if (!m_pPacketList)
  398. {
  399.     m_pPacketList = new CHXSimpleList;
  400. }
  401. m_pPacketList->AddHead((void*)pPacket);
  402. m_pDataRevert->RevertData(pPacket);
  403.     }
  404.     else
  405.     {
  406. m_pDataResp->FilterPacket(pPacket);
  407.     }
  408. }
  409. void
  410. DataRevertController::SetFilterResponse(RawPacketFilter* pFilt)
  411. {
  412.     m_pDataResp = pFilt;
  413. }
  414. IHXValues*
  415. DataRevertController::InflateConvertHeader(IHXBuffer* pInflate)
  416. {
  417.     IHXValues* pNewHeader = NULL;
  418.     IHXCommonClassFactory* pCCF;
  419.     
  420.     m_pContext->QueryInterface(IID_IHXCommonClassFactory,
  421.     (void**)&pCCF);
  422.     
  423.     pCCF->CreateInstance(CLSID_IHXValues, (void**)&pNewHeader);
  424.     ULONG32 ul;
  425.     IHXBuffer* pBuffer;
  426.     const char* p;
  427.     IHXBuffer* pTemp;
  428.     ULONG32 ulTemp;
  429.     pCCF->CreateInstance(CLSID_IHXBuffer, (void**)&pTemp);
  430.     UINT32 limit = pInflate->GetSize();
  431.     UINT32 i = 0;
  432.     p = (const char*)pInflate->GetBuffer();
  433.     while (i < pInflate->GetSize() - 5)
  434.     {
  435. if (p[i] == 'u')
  436. {
  437.     i++;
  438.     ulTemp = getlong((UINT8*) &(p[i]));
  439.     i += 4;
  440.     if (i + ulTemp > limit)
  441.     {
  442. goto error;
  443.     }
  444.     pTemp->SetSize(ulTemp + 1);
  445.     memcpy((char *)pTemp->GetBuffer(), &(p[i]), ulTemp); /* Flawfinder: ignore */
  446.     ((char*)pTemp->GetBuffer())[ulTemp] = 0;
  447.     i += ulTemp;
  448.     if (i + 4 > limit)
  449.     {
  450. goto error;
  451.     }
  452.     ul = getlong((UINT8*) &(p[i]));
  453.     i += 4;
  454.     pNewHeader->SetPropertyULONG32((char*)pTemp->GetBuffer(), ul);
  455. }
  456. else if (p[i] == 's' || p[i] == 'b')
  457. {
  458.     int at = i;
  459.     i++;
  460.     ulTemp = getlong((UINT8*) &(p[i]));
  461.     i += 4;
  462.     if (i + ulTemp > limit)
  463.     {
  464. goto error;
  465.     }
  466.     pTemp->SetSize(ulTemp + 1);
  467.     memcpy((char*)pTemp->GetBuffer(), &(p[i]), ulTemp); /* Flawfinder: ignore */
  468.     ((char*)pTemp->GetBuffer())[ulTemp] = 0;
  469.     i += ulTemp;
  470.     if (i + 4 > limit)
  471.     {
  472. goto error;
  473.     }
  474.     ulTemp = getlong((UINT8*) &(p[i]));
  475.     i += 4;
  476.     if (i + ulTemp > limit)
  477.     {
  478. goto error;
  479.     }
  480.     pCCF->CreateInstance(CLSID_IHXBuffer, (void**)&pBuffer);
  481.     pBuffer->SetSize(ulTemp);
  482.     memcpy((char*)pBuffer->GetBuffer(), &(p[i]), ulTemp); /* Flawfinder: ignore */
  483.     if (p[at] == 's')
  484.     {
  485. pNewHeader->SetPropertyCString((const char*)pTemp->GetBuffer(),
  486. pBuffer);
  487.     }
  488.     else
  489.     {
  490. pNewHeader->SetPropertyBuffer((const char*)pTemp->GetBuffer(),
  491. pBuffer);
  492.     }
  493.     pBuffer->Release();
  494.     i+= ulTemp;
  495. }
  496. else
  497. {
  498.     goto error;
  499. }
  500.     }
  501.     if (i != pInflate->GetSize())
  502.     {
  503. goto error;
  504.     }
  505.     
  506.     goto exit;
  507.     
  508. error:;
  509.     
  510. exit:;
  511.     HX_RELEASE(pTemp);
  512.     HX_RELEASE(pCCF);
  513.     
  514.     return pNewHeader;
  515. }
  516. void
  517. DataRevertController::Done(void)
  518. {
  519.     HX_RELEASE(m_pDataRevert);
  520. }