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

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 "smlffpln.ver"
  36. #include "hxtypes.h"
  37. #include "hxcom.h"
  38. #include "hxcomm.h"
  39. #include "ihxpckts.h"
  40. #include "hxformt.h"
  41. #include "hxvsrc.h"  /*IHXFileViewSource*/
  42. #include "chxfgbuf.h"  /*CHXFragmentedBuffer*/
  43. #include "shadvsrc.h"
  44. #include "escsmil.h" /* CEscapeSMIL */
  45. // as defined in smlffpln.cpp
  46. static const UINT32 FileChunkSize = 10000; //XXXBAB adjust
  47. CShadowViewSource::CShadowViewSource(IUnknown* pContext, 
  48.      IUnknown* pContainer)
  49.     : m_lRefCount(0)
  50.     , m_pContext(NULL)
  51.     , m_pCommonClassFactory(NULL)
  52.     , m_pFileObject(NULL)
  53.     , m_pViewSourceResponse(NULL)
  54.     , m_type(HTML_SOURCE)
  55.     , m_pBuffer(NULL)
  56.     , m_pContainer(NULL)
  57.     , m_pOptions(NULL)
  58. {
  59.     m_pContext = pContext;
  60.     HX_ASSERT(m_pContext != NULL);
  61.     m_pContext->AddRef();
  62.     m_pContainer = pContainer;
  63.     HX_ASSERT(m_pContainer != NULL);
  64.     m_pContainer->AddRef();
  65. };
  66. CShadowViewSource::~CShadowViewSource()
  67. {
  68.     Close();
  69. }
  70. /* *** IUnknown methods *** */
  71. /************************************************************************
  72.  *  Method:
  73.  * IUnknown::QueryInterface
  74.  *  Purpose:
  75.  * Implement this to export the interfaces supported by your 
  76.  * object.
  77.  */
  78. STDMETHODIMP CShadowViewSource::QueryInterface(REFIID riid, void** ppvObj)
  79. {
  80.     if (IsEqualIID(riid, IID_IHXFileViewSource))
  81.     {
  82. AddRef();
  83. *ppvObj = (IHXFileViewSource*)this;
  84. return HXR_OK;
  85.     }
  86.     else if (m_pContainer != NULL)
  87.     {
  88.         // deligate to our container
  89.         return m_pContainer->QueryInterface(riid, ppvObj);
  90.     }
  91.     else if (IsEqualIID(riid, IID_IUnknown))
  92.     {
  93.         AddRef();
  94.         *ppvObj = m_pContainer;
  95.         return HXR_OK;
  96.     }
  97.     *ppvObj = NULL;
  98.     // deligate to our container
  99.     return HXR_NOINTERFACE;
  100. }
  101. /************************************************************************
  102.  *  Method:
  103.  * IUnknown::AddRef
  104.  *  Purpose:
  105.  * Everyone usually implements this the same... feel free to use
  106.  * this implementation.
  107.  */
  108. STDMETHODIMP_(ULONG32) CShadowViewSource::AddRef()
  109. {
  110.     return InterlockedIncrement(&m_lRefCount);
  111. }
  112. /************************************************************************
  113.  *  Method:
  114.  * IUnknown::Release
  115.  *  Purpose:
  116.  * Everyone usually implements this the same... feel free to use
  117.  * this implementation.
  118.  */
  119. STDMETHODIMP_(ULONG32) CShadowViewSource::Release()
  120. {
  121.     if (InterlockedDecrement(&m_lRefCount) > 0)
  122.     {
  123.         return m_lRefCount;
  124.     }
  125.     delete this;
  126.     return 0;
  127. }
  128. /************************************************************************
  129.  * Method:
  130.  *     IHXFileViewSource::Close()
  131.  * Purpose:
  132.  *     Close down...
  133.  */
  134. STDMETHODIMP 
  135. CShadowViewSource::Close()
  136. {
  137.     HX_RELEASE(m_pContext);
  138.     HX_RELEASE(m_pCommonClassFactory);
  139.     HX_RELEASE(m_pOptions);
  140.     if (m_pFileObject)
  141.     {
  142. m_pFileObject->Close();
  143. HX_RELEASE(m_pFileObject);
  144.     }
  145.     HX_RELEASE(m_pBuffer);
  146.     HX_RELEASE(m_pContainer);
  147.     if ( m_pViewSourceResponse != NULL )
  148.     {
  149. m_pViewSourceResponse->CloseDone(HXR_OK);
  150. HX_RELEASE(m_pViewSourceResponse);
  151.     }
  152.     return HXR_OK;
  153. }
  154. /************************************************************************
  155.  * Method:
  156.  *     IHXFileViewSource::InitViewSource
  157.  * Purpose:
  158.  *     Called by the user to init before a viewsource.
  159.  */
  160. STDMETHODIMP
  161. CShadowViewSource::InitViewSource(
  162. IHXFileObject* pFileObject,
  163. IHXFileViewSourceResponse* pResp,
  164. SOURCE_TYPE sourceType,
  165. IHXValues* pOptions)
  166. {
  167.     if ( sourceType == HTML_SOURCE )
  168.     {
  169. m_type = HTML_SOURCE;
  170.     }
  171.     else if ( sourceType == RAW_SOURCE )
  172.     {
  173. m_type = RAW_SOURCE;
  174.     }
  175.     else
  176.     {
  177. HX_ASSERT(FALSE);
  178. return HXR_UNEXPECTED;
  179.     }
  180.     HX_RELEASE(m_pCommonClassFactory);
  181.     HX_RESULT ret = m_pContext->QueryInterface(IID_IHXCommonClassFactory, 
  182. (void**)&m_pCommonClassFactory);
  183.     if ( !SUCCEEDED(ret) )
  184.     {
  185. return ret;
  186.     }
  187.     HX_ASSERT(pResp != NULL);
  188.     
  189.     HX_RELEASE(m_pOptions);
  190.     m_pOptions = pOptions;
  191.     m_pOptions->AddRef();
  192.     HX_RELEASE(m_pViewSourceResponse);
  193.     m_pViewSourceResponse = pResp;
  194.     m_pViewSourceResponse->AddRef();
  195.     if ( m_pFileObject != NULL )
  196.     {
  197. m_pFileObject->Close();
  198.         HX_RELEASE(m_pFileObject);
  199.     }
  200.     m_pFileObject = pFileObject;
  201.     HX_ASSERT(m_pFileObject != NULL);
  202.     m_pFileObject->AddRef();
  203.     IHXFileStat* pStat = NULL;
  204.     if ( SUCCEEDED(m_pFileObject->QueryInterface(IID_IHXFileStat, 
  205. (void**)&pStat)) )
  206.     {
  207. pStat->Stat(this);
  208.     }
  209.     HX_RELEASE(pStat);
  210.     return HXR_OK;
  211. }
  212. STDMETHODIMP
  213. CShadowViewSource::StatDone(HX_RESULT status, UINT32 ulSize, UINT32 ulCreationTime,
  214.     UINT32 ulAccessTime, UINT32 ulModificationTime, 
  215.     UINT32 ulMode)
  216. {
  217.     m_pOptions->SetPropertyULONG32("FileSize", ulSize);
  218.     m_pOptions->SetPropertyULONG32("ModificationTime", ulModificationTime);
  219.     IHXBuffer* pName = NULL;
  220.     const char* p = NULL;
  221.     m_pFileObject->GetFilename(p);
  222.     if ( SUCCEEDED(m_pCommonClassFactory->CreateInstance(CLSID_IHXBuffer, 
  223. (void**)&pName)) )
  224.     {
  225. pName->Set((const UCHAR*)p, strlen(p) + 1);
  226.     }
  227.     m_pOptions->SetPropertyCString("FileName", pName);
  228.     HX_RELEASE(pName);
  229.     return m_pFileObject->Init(HX_FILE_READ, this);
  230. }
  231. /************************************************************************
  232.  * Method:
  233.  *     IHXFileViewSource::GetSource
  234.  * Purpose:
  235.  *     Called to get source html source.  Return the source
  236.  * through m_pViewSourceResoponse
  237.  */
  238. STDMETHODIMP
  239. CShadowViewSource::GetSource()
  240. {
  241.     HX_ASSERT(m_pViewSourceResponse != NULL);
  242.     HX_ASSERT(m_pFileObject != NULL);
  243.     return m_pFileObject->Read(FileChunkSize);
  244. }
  245. /************************************************************************
  246.  *  Method:
  247.  *    IHXFileResponse::InitDone
  248.  *  Purpose:
  249.  *    Notification interface provided by users of the IHXFileObject
  250.  *    interface. This method is called by the IHXFileObject when the
  251.  *    initialization of the file is complete.
  252.  */
  253. STDMETHODIMP CShadowViewSource::InitDone( HX_RESULT status )
  254. {
  255.     HX_ASSERT(m_pViewSourceResponse != NULL);
  256.     return m_pViewSourceResponse->InitDone(status);
  257. }
  258. /************************************************************************
  259.  *  Method:
  260.  * IHXFileResponse::ReadDone
  261.  *  Purpose:
  262.  * Notification interface provided by users of the IHXFileObject
  263.  * interface. This method is called by the IHXFileObject when the
  264.  * last read from the file is complete and a buffer is available.
  265.  */
  266. STDMETHODIMP CShadowViewSource::ReadDone(HX_RESULT status, 
  267.        IHXBuffer* pBuffer)
  268. {
  269.     HX_RESULT result = HXR_OK;
  270.     if ( m_pBuffer == NULL )
  271.     {
  272. m_pBuffer = new CHXFragmentedBuffer();
  273. if ( m_pBuffer == NULL )
  274. {
  275.     return HXR_OUTOFMEMORY;
  276. }
  277. m_pBuffer->AddRef();
  278. m_pBuffer->Set(pBuffer->GetBuffer(), pBuffer->GetSize());
  279.     }
  280.     else // we are in a recursion...
  281.     {
  282. // guard against a unneeded recursion in the case that our file size was
  283. // an exact multiple of FileChunkSize
  284. if ( pBuffer != NULL )
  285. {
  286.     m_pBuffer->Append(pBuffer, 0, pBuffer->GetSize());
  287. }
  288.     }
  289.     if ( pBuffer->GetSize() == FileChunkSize )
  290.     {
  291. m_pFileObject->Read(FileChunkSize); //XXXBAB recursive!!!
  292.     }
  293.     else
  294.     {
  295. HX_ASSERT(m_pViewSourceResponse != NULL);
  296. if ( SUCCEEDED(result) )
  297. {
  298.     if ( m_type == HTML_SOURCE )
  299.     {
  300. CEscapeSMIL smilParser(m_pOptions);
  301. IHXBuffer* pTheStuff = NULL;
  302. if ( SUCCEEDED(smilParser.Convert(m_pBuffer, pTheStuff)) )
  303. {
  304.          result = m_pViewSourceResponse->SourceReady(HXR_OK,
  305. pTheStuff);
  306. }
  307. else
  308. {
  309.     result = m_pViewSourceResponse->SourceReady(HXR_FAIL, NULL);
  310. }
  311. HX_RELEASE(pTheStuff);
  312.     }
  313.     else
  314.     {
  315. result = m_pViewSourceResponse->SourceReady(HXR_OK, m_pBuffer);
  316.     }
  317. }
  318. else
  319. {
  320.     result = m_pViewSourceResponse->SourceReady(HXR_FAIL, NULL);
  321. }
  322.     }
  323.     return result;
  324. }
  325. /************************************************************************
  326.  *  Method:
  327.  * IHXFileResponse::WriteDone
  328.  *  Purpose:
  329.  * Notification interface provided by users of the IHXFileObject
  330.  * interface. This method is called by the IHXFileObject when the
  331.  * last write to the file is complete.
  332.  */
  333. STDMETHODIMP CShadowViewSource::WriteDone(HX_RESULT status)
  334. {
  335.     // We don't ever write, so we don't expect to get this...
  336.     return HXR_UNEXPECTED;
  337. }
  338. /************************************************************************
  339.  *  Method:
  340.  * IHXFileResponse::SeekDone
  341.  *  Purpose:
  342.  * Notification interface provided by users of the IHXFileObject
  343.  * interface. This method is called by the IHXFileObject when the
  344.  * last seek in the file is complete.
  345.  */
  346. STDMETHODIMP CShadowViewSource::SeekDone(HX_RESULT status)
  347. {
  348.     return HXR_OK;
  349. }
  350. /************************************************************************
  351.  *  Method:
  352.  * IHXFileResponse::CloseDone
  353.  *  Purpose:
  354.  * Notification interface provided by users of the IHXFileObject
  355.  * interface. This method is called by the IHXFileObject when the
  356.  * close of the file is complete.
  357.  */
  358. STDMETHODIMP CShadowViewSource::CloseDone(HX_RESULT status)
  359. {
  360.     return HXR_OK;
  361. }