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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: baserend.cpp,v 1.6.24.1 2004/07/09 01:55:25 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
  50. #include "hxtypes.h"
  51. #include "hxwintyp.h"
  52. #include "hxcom.h"
  53. #include "hxcomm.h"
  54. #include "ihxpckts.h"
  55. #include "hxhyper.h"
  56. #include "hxupgrd.h"
  57. #include "hxprefs.h"
  58. #include "hxplugn.h"
  59. #include "hxengin.h"
  60. #include "hxrendr.h"
  61. #include "hxwin.h"
  62. #include "hxmon.h"
  63. #include "hxcore.h"
  64. #include "hxasm.h"
  65. #include "hxerror.h"
  66. #include "hxstrutl.h"
  67. #include "addupcol.h"
  68. #include "hxver.h"
  69. #include "hxbuffer.h"
  70. #include "pckunpck.h"
  71. #include "baseobj.h"
  72. #include "baserend.h"
  73. #include "debugout.h"
  74. #include "hxheap.h"
  75. #ifdef _DEBUG
  76. #undef HX_THIS_FILE
  77. static const char HX_THIS_FILE[] = __FILE__;
  78. #endif
  79. const char* const CRNBaseRenderer::m_pszBaseCopyright   = HXVER_COPYRIGHT;
  80. const char* const CRNBaseRenderer::m_pszBaseMoreInfoURL = HXVER_MOREINFO;
  81. CRNBaseRenderer::CRNBaseRenderer()
  82. {
  83.     m_lRefCount            = 0;
  84.     m_pContext             = NULL;
  85.     m_pCommonClassFactory  = NULL;
  86.     m_pHyperNavigate       = NULL;
  87.     m_pPreferences         = NULL;
  88.     m_pScheduler           = NULL;
  89.     m_pStream              = NULL;
  90.     m_pPlayer              = NULL;
  91.     m_pBackChannel         = NULL;
  92.     m_pASMStream           = NULL;
  93.     m_pErrorMessages       = NULL;
  94.     m_pValues              = NULL;
  95.     m_ulRegistryID         = 0;
  96.     m_lTimeOffset          = 0;
  97.     m_ulContentVersion     = HX_ENCODE_PROD_VERSION(0, 0, 0, 0);
  98.     m_ulStreamVersion      = HX_ENCODE_PROD_VERSION(0, 0, 0, 0);
  99.     m_ulLastTimeSync       = 0;
  100.     m_pStreamSourceURL     = NULL;
  101. }
  102. CRNBaseRenderer::~CRNBaseRenderer()
  103. {
  104.     HX_RELEASE(m_pContext);
  105.     HX_RELEASE(m_pCommonClassFactory);
  106.     HX_RELEASE(m_pHyperNavigate);
  107.     HX_RELEASE(m_pPreferences);
  108.     HX_RELEASE(m_pScheduler);
  109.     HX_RELEASE(m_pStream);
  110.     HX_RELEASE(m_pPlayer);
  111.     HX_RELEASE(m_pBackChannel);
  112.     HX_RELEASE(m_pASMStream);
  113.     HX_RELEASE(m_pErrorMessages);
  114.     HX_RELEASE(m_pValues);
  115.     HX_RELEASE(m_pStreamSourceURL);
  116. }
  117. STDMETHODIMP CRNBaseRenderer::QueryInterface(REFIID riid, void** ppvObj)
  118. {
  119.     HX_RESULT retVal = HXR_OK;
  120.     if (ppvObj)
  121.     {
  122.         // Set default
  123.         *ppvObj = NULL;
  124.         // Check for IID type
  125.         if (IsEqualIID(riid, IID_IUnknown))
  126.         {
  127.             AddRef();
  128.             *ppvObj = (IUnknown*) (IHXPlugin*) this;
  129.         }
  130.         else if (IsEqualIID(riid, IID_IHXPlugin))
  131.         {
  132.             AddRef();
  133.             *ppvObj = (IHXPlugin*) this;
  134.         }
  135.         else if (IsEqualIID(riid, IID_IHXStatistics))
  136.         {
  137.             AddRef();
  138.             *ppvObj = (IHXStatistics*) this;
  139.         }
  140.         else if (IsEqualIID(riid, IID_IHXRenderer))
  141.         {
  142.             AddRef();
  143.             *ppvObj = (IHXRenderer*) this;
  144.         }
  145.         else if (IsEqualIID(riid, IID_IHXValues))
  146.         {
  147.             AddRef();
  148.             *ppvObj = (IHXValues*) this;
  149.         }
  150.         else if (IsEqualIID(riid, IID_IHXUpdateProperties))
  151.         {
  152.             AddRef();
  153.             *ppvObj = (IHXUpdateProperties*) this;
  154.         }
  155.         else
  156.         {
  157.             retVal = HXR_NOINTERFACE;
  158.         }
  159.     }
  160.     else
  161.     {
  162.         retVal = HXR_FAIL;
  163.     }
  164.     return retVal;
  165. }
  166. STDMETHODIMP_(UINT32) CRNBaseRenderer::AddRef()
  167. {
  168.     return InterlockedIncrement(&m_lRefCount);
  169. }
  170. STDMETHODIMP_(UINT32) CRNBaseRenderer::Release()
  171. {
  172.     if (InterlockedDecrement(&m_lRefCount) > 0)
  173.     {
  174.         return m_lRefCount;
  175.     }
  176.     delete this;
  177.     return 0;
  178. }
  179. STDMETHODIMP CRNBaseRenderer::GetPluginInfo(REF(BOOL)         rbLoadMultiple,
  180.                                             REF(const char *) rpszDescription,
  181.                                             REF(const char *) rpszCopyright,
  182.                                             REF(const char *) rpszMoreInfoURL,
  183.                                             REF(UINT32)       rulVersionNumber)
  184. {
  185.     rbLoadMultiple   = GetLoadMultiple();
  186.     GetDescription(rpszDescription);
  187.     GetCopyright(rpszCopyright);
  188.     GetMoreInfoURL(rpszMoreInfoURL);
  189.     rulVersionNumber = GetPluginVersion();
  190.     return HXR_OK;
  191. }
  192. STDMETHODIMP CRNBaseRenderer::InitPlugin(IUnknown *pContext)
  193. {
  194.     HX_RESULT retVal = HXR_OK;
  195.     if (pContext)
  196.     {
  197.         // Save a copy of the calling context
  198.         m_pContext = pContext;
  199.         m_pContext->AddRef();
  200.         // Get a IHXCommonClassFactory interface
  201.         HX_RELEASE(m_pCommonClassFactory);
  202.         retVal = m_pContext->QueryInterface(IID_IHXCommonClassFactory, (void **) &m_pCommonClassFactory);
  203.         if (SUCCEEDED(retVal))
  204.         {
  205.             // Get an IHXScheduler interface
  206.             HX_RELEASE(m_pScheduler);
  207.             retVal = m_pContext->QueryInterface(IID_IHXScheduler, (void **) &m_pScheduler);
  208.             if (SUCCEEDED(retVal))
  209.             {
  210.                 // Get an IHXPreferences interface
  211.                 HX_RELEASE(m_pPreferences);
  212.                 retVal = m_pContext->QueryInterface(IID_IHXPreferences, (void **) &m_pPreferences);
  213.                 if (SUCCEEDED(retVal))
  214.                 {
  215.                     // Get an IHXHyperNavigate interface - OK if TLC doesn't support it,
  216.                     // so we don't check the return value
  217.                     HX_RELEASE(m_pHyperNavigate);
  218.                     m_pContext->QueryInterface(IID_IHXHyperNavigate, (void **) &m_pHyperNavigate);
  219.                     // Get the IHXErrorMessages interface - OK if TLC doesn't support it,
  220.                     // so we don't check the return value
  221.                     HX_RELEASE(m_pErrorMessages);
  222.                     m_pContext->QueryInterface(IID_IHXErrorMessages, (void**) &m_pErrorMessages);
  223.                     // Create an IHXValues
  224.                     HX_RELEASE(m_pValues);
  225.                     retVal = m_pCommonClassFactory->CreateInstance(CLSID_IHXValues,
  226.                                                                    (void**) &m_pValues);
  227.                 }
  228.             }
  229.         }
  230.     }
  231.     else
  232.     {
  233.         retVal = HXR_FAIL;
  234.     }
  235.     if (FAILED(retVal))
  236.     {
  237.         HX_RELEASE(m_pHyperNavigate);
  238.         HX_RELEASE(m_pPreferences);
  239.         HX_RELEASE(m_pScheduler);
  240.         HX_RELEASE(m_pCommonClassFactory);
  241.         HX_RELEASE(m_pContext);
  242.     }
  243.     return retVal;
  244. }
  245. STDMETHODIMP CRNBaseRenderer::InitializeStatistics(UINT32 ulRegistryID)
  246. {
  247.     // Save a copy of the registry ID
  248.     m_ulRegistryID = ulRegistryID;
  249.     // Initialize the local variables
  250.     IHXRegistry* pRegistry       = NULL;
  251.     IHXBuffer*     pszRegistryName = NULL;
  252.     IHXBuffer*     pValue          = NULL;
  253.     HX_RESULT       retVal          = HXR_OK;
  254.     // Add our renderer name to the HXRegistry
  255.     retVal = m_pContext->QueryInterface(IID_IHXRegistry, (void **) &pRegistry);
  256.     if (SUCCEEDED(retVal))
  257.     {
  258.         // Get the current registry key name
  259.         retVal = pRegistry->GetPropName(m_ulRegistryID, pszRegistryName);
  260.         if (SUCCEEDED(retVal))
  261.         {
  262.             // Create an IHXBuffer to hold the name
  263.             pValue = new CHXBuffer();
  264.             if (pValue)
  265.             {
  266.                 // Addref the object
  267.                 pValue->AddRef();
  268.                 // Create the key name
  269.                 char szRegistryEntry[MAX_DISPLAY_NAME] = {0}; /* Flawfinder: ignore */
  270.                 SafeSprintf(szRegistryEntry, MAX_DISPLAY_NAME, "%s.name", pszRegistryName->GetBuffer());
  271.                 // Set the key value
  272.                 const char* pszBaseName = NULL;
  273.                 retVal = GetName(pszBaseName);
  274.                 if (SUCCEEDED(retVal))
  275.                 {
  276.                     retVal = pValue->Set((const UCHAR *) pszBaseName, strlen(pszBaseName) + 1);
  277.                     if (SUCCEEDED(retVal))
  278.                     {
  279.                         // Add the key/value pair to the registry
  280.                         pRegistry->AddStr(szRegistryEntry, pValue);
  281.                         HX_RELEASE(pValue);
  282.                         HX_RELEASE(pszRegistryName);
  283.                         HX_RELEASE(pRegistry);
  284.                     }
  285.                 }
  286.             }
  287.             else
  288.             {
  289.                 retVal = HXR_OUTOFMEMORY;
  290.             }
  291.         }
  292.     }
  293.     if (FAILED(retVal))
  294.     {
  295.         HX_RELEASE(pValue);
  296.         HX_RELEASE(pszRegistryName);
  297.         HX_RELEASE(pRegistry);
  298.     }
  299.     return retVal;
  300. }
  301. STDMETHODIMP CRNBaseRenderer::UpdateStatistics()
  302. {
  303.     return HXR_OK;
  304. }
  305. STDMETHODIMP CRNBaseRenderer::GetRendererInfo(REF(const char**) pStreamMimeTypes,
  306.                                               REF(UINT32)       rulInitialGranularity)
  307. {
  308.     GetMimeTypes(pStreamMimeTypes);
  309.     rulInitialGranularity = GetInitialGranularity();
  310.     return HXR_OK;
  311. }
  312. STDMETHODIMP CRNBaseRenderer::GetDisplayType(REF(HX_DISPLAY_TYPE) rulFlags,
  313.                                              REF(IHXBuffer*)      pBuffer)
  314. {
  315.     rulFlags = GetDisplayFlags();
  316.     return HXR_OK;
  317. }
  318. STDMETHODIMP CRNBaseRenderer::StartStream(IHXStream *pStream, IHXPlayer *pPlayer)
  319. {
  320.     HX_RESULT retVal = HXR_OK;
  321.  
  322.     if (pStream && pPlayer)
  323.     {
  324.         // Save a copy of the IHXStream interface
  325.         HX_RELEASE(m_pStream);
  326.         m_pStream = pStream;
  327.         m_pStream->AddRef();
  328.         // Save a copy of the IHXPlayer interface
  329.         HX_RELEASE(m_pPlayer);
  330.         m_pPlayer = pPlayer;
  331.         m_pPlayer->AddRef();
  332.         // Get an IHXBackChannel interface if the source
  333.         // supports it - it's OK if it doesn't
  334.         IHXStreamSource* pSource = NULL;
  335.         HX_RESULT         srcRet  = m_pStream->GetSource(pSource);
  336.         if (SUCCEEDED(srcRet))
  337.         {
  338.             // Get the URL
  339.             const char* pszURL = pSource->GetURL();
  340.             if (pszURL)
  341.             {
  342.                 HX_RELEASE(m_pStreamSourceURL);
  343.                 CreateStringBuffer(m_pStreamSourceURL, pszURL, m_pContext);
  344.             }
  345.             HX_RELEASE(m_pBackChannel);
  346.             pSource->QueryInterface(IID_IHXBackChannel, (void**) &m_pBackChannel);
  347.             HX_RELEASE(pSource);
  348.         }
  349.         // Get an IHXASMStream interface if it's support - OK if it doesn't
  350.         HX_RELEASE(m_pASMStream);
  351.         m_pStream->QueryInterface(IID_IHXASMStream, (void**) &m_pASMStream);
  352.     }
  353.     else
  354.     {
  355.         retVal = HXR_FAIL;
  356.     }
  357.     return retVal;
  358. }
  359. STDMETHODIMP CRNBaseRenderer::OnPreSeek(UINT32 ulOldTime, UINT32 ulNewTime)
  360. {
  361.     return HXR_OK;
  362. }
  363. STDMETHODIMP CRNBaseRenderer::OnPostSeek(UINT32 ulOldTime, UINT32 ulNewTime)
  364. {
  365.     return HXR_OK;
  366. }
  367. STDMETHODIMP CRNBaseRenderer::OnBegin(UINT32 ulTime)
  368. {
  369.     return HXR_OK;
  370. }
  371. STDMETHODIMP CRNBaseRenderer::OnPause(UINT32 ulTime)
  372. {
  373.     return HXR_OK;
  374. }
  375. STDMETHODIMP CRNBaseRenderer::OnBuffering(UINT32 ulFlags, UINT16 usPercentComplete)
  376. {
  377.     return HXR_OK;
  378. }
  379. STDMETHODIMP CRNBaseRenderer::OnEndofPackets(void)
  380. {
  381.     return HXR_OK;
  382. }
  383. STDMETHODIMP CRNBaseRenderer::SetPropertyULONG32(const char* pName, ULONG32 ulVal)
  384. {
  385.     HX_RESULT retVal = HXR_FAIL;
  386.     if (m_pValues)
  387.     {
  388.         retVal = m_pValues->SetPropertyULONG32(pName, ulVal);
  389.     }
  390.     return retVal;
  391. }
  392. STDMETHODIMP CRNBaseRenderer::GetPropertyULONG32(const char* pName, REF(ULONG32) rulVal)
  393. {
  394.     HX_RESULT retVal = HXR_FAIL;
  395.     if (m_pValues)
  396.     {
  397.         retVal = m_pValues->GetPropertyULONG32(pName, rulVal);
  398.     }
  399.     return retVal;
  400. }
  401. STDMETHODIMP CRNBaseRenderer::GetFirstPropertyULONG32(REF(const char*) rpName, REF(ULONG32) rulVal)
  402. {
  403.     HX_RESULT retVal = HXR_FAIL;
  404.     if (m_pValues)
  405.     {
  406.         retVal = m_pValues->GetFirstPropertyULONG32(rpName, rulVal);
  407.     }
  408.     return retVal;
  409. }
  410. STDMETHODIMP CRNBaseRenderer::GetNextPropertyULONG32(REF(const char*) rpName, REF(ULONG32) rulVal)
  411. {
  412.     HX_RESULT retVal = HXR_FAIL;
  413.     if (m_pValues)
  414.     {
  415.         retVal = m_pValues->GetNextPropertyULONG32(rpName, rulVal);
  416.     }
  417.     return retVal;
  418. }
  419. STDMETHODIMP CRNBaseRenderer::SetPropertyBuffer(const char* pName, IHXBuffer* pVal)
  420. {
  421.     HX_RESULT retVal = HXR_FAIL;
  422.     if (m_pValues)
  423.     {
  424.         retVal = m_pValues->SetPropertyBuffer(pName, pVal);
  425.     }
  426.     return retVal;
  427. }
  428. STDMETHODIMP CRNBaseRenderer::GetPropertyBuffer(const char* pName, REF(IHXBuffer*) rpVal)
  429. {
  430.     HX_RESULT retVal = HXR_FAIL;
  431.     if (m_pValues)
  432.     {
  433.         retVal = m_pValues->GetPropertyBuffer(pName, rpVal);
  434.     }
  435.     return retVal;
  436. }
  437. STDMETHODIMP CRNBaseRenderer::GetFirstPropertyBuffer(REF(const char*) rpName, REF(IHXBuffer*) rpVal)
  438. {
  439.     HX_RESULT retVal = HXR_FAIL;
  440.     if (m_pValues)
  441.     {
  442.         retVal = m_pValues->GetFirstPropertyBuffer(rpName, rpVal);
  443.     }
  444.     return retVal;
  445. }
  446. STDMETHODIMP CRNBaseRenderer::GetNextPropertyBuffer(REF(const char*) rpName, REF(IHXBuffer*) rpVal)
  447. {
  448.     HX_RESULT retVal = HXR_FAIL;
  449.     if (m_pValues)
  450.     {
  451.         retVal = m_pValues->GetNextPropertyBuffer(rpName, rpVal);
  452.     }
  453.     return retVal;
  454. }
  455. STDMETHODIMP CRNBaseRenderer::SetPropertyCString(const char* pName, IHXBuffer* pVal)
  456. {
  457.     HX_RESULT retVal = HXR_FAIL;
  458.     if (m_pValues)
  459.     {
  460.         retVal = m_pValues->SetPropertyCString(pName, pVal);
  461.     }
  462.     return retVal;
  463. }
  464. STDMETHODIMP CRNBaseRenderer::GetPropertyCString(const char* pName, REF(IHXBuffer*) rpVal)
  465. {
  466.     HX_RESULT retVal = HXR_FAIL;
  467.     if (m_pValues)
  468.     {
  469.         retVal = m_pValues->GetPropertyCString(pName, rpVal);
  470.     }
  471.     return retVal;
  472. }
  473. STDMETHODIMP CRNBaseRenderer::GetFirstPropertyCString(REF(const char*) rpName, REF(IHXBuffer*) rpVal)
  474. {
  475.     HX_RESULT retVal = HXR_FAIL;
  476.     if (m_pValues)
  477.     {
  478.         retVal = m_pValues->GetFirstPropertyCString(rpName, rpVal);
  479.     }
  480.     return retVal;
  481. }
  482. STDMETHODIMP CRNBaseRenderer::GetNextPropertyCString(REF(const char*) rpName, REF(IHXBuffer*) rpVal)
  483. {
  484.     HX_RESULT retVal = HXR_FAIL;
  485.     if (m_pValues)
  486.     {
  487.         retVal = m_pValues->GetNextPropertyCString(rpName, rpVal);
  488.     }
  489.     return retVal;
  490. }
  491. STDMETHODIMP CRNBaseRenderer::UpdatePacketTimeOffset(INT32 lTimeOffset)
  492. {
  493.     HX_RESULT retVal = HXR_OK;
  494.     // Save the offset time
  495.     m_lTimeOffset = -lTimeOffset;
  496.     return retVal;
  497. }
  498. STDMETHODIMP
  499. CRNBaseRenderer::UpdatePlayTimes(IHXValues* pProps)
  500. {
  501.     return HXR_OK;
  502. }
  503. STDMETHODIMP CRNBaseRenderer::EndStream()
  504. {
  505.     // Can't use IHXStream, IHXBackChannel, or IHXASMStream
  506.     // after EndStream() is called.
  507.     HX_RELEASE(m_pStream);
  508.     HX_RELEASE(m_pBackChannel);
  509.     HX_RELEASE(m_pASMStream);
  510.     return HXR_OK;
  511. }
  512. STDMETHODIMP CRNBaseRenderer::OnPacket(IHXPacket *pPacket, INT32 lTimeOffset)
  513. {
  514.     // Save the offset time
  515.     m_lTimeOffset = lTimeOffset;
  516.     return OnPacketNoOffset(pPacket);
  517. }
  518. STDMETHODIMP CRNBaseRenderer::OnTimeSync(UINT32 ulTime)
  519. {
  520.     HX_RESULT retVal = HXR_OK;
  521.     
  522.     // Adjust the time
  523.     UINT32 ulAdjustedTime = 0;
  524.     if (m_lTimeOffset < 0 && ulTime < (UINT32)(-m_lTimeOffset))
  525.     {
  526.         ulAdjustedTime = 0;
  527.     }
  528.     else
  529.     {
  530.         ulAdjustedTime = ulTime + m_lTimeOffset;
  531.     }
  532.     // Save the last time sync
  533.     m_ulLastTimeSync = ulAdjustedTime;
  534.     if(_IsValidRendererSurface())
  535.     {
  536.         retVal = OnTimeSyncOffset(ulAdjustedTime);
  537.     }
  538.     
  539.     return retVal;
  540. }
  541. STDMETHODIMP CRNBaseRenderer::CheckStreamVersions(IHXValues* pHeader)
  542. {
  543.     BOOL bVersionOK = TRUE;
  544.     HX_RESULT retVal = pHeader->GetPropertyULONG32("StreamVersion", m_ulStreamVersion);
  545.     if (SUCCEEDED(retVal))
  546.     {
  547.         UINT32 ulDataMajor = HX_GET_MAJOR_VERSION(m_ulStreamVersion);
  548.         UINT32 ulDataMinor = HX_GET_MINOR_VERSION(m_ulStreamVersion);
  549.         UINT32 ulRendMajor = HX_GET_MAJOR_VERSION(GetHighestSupportedStreamVersion());
  550.         UINT32 ulRendMinor = HX_GET_MINOR_VERSION(GetHighestSupportedStreamVersion());
  551.         if((ulDataMajor >  ulRendMajor) ||
  552.            (ulDataMajor == ulRendMajor && ulDataMinor > ulRendMinor))
  553.         {
  554.             bVersionOK = FALSE;
  555.         }
  556.     }
  557.     retVal = pHeader->GetPropertyULONG32("ContentVersion", m_ulContentVersion);
  558.     if(bVersionOK && SUCCEEDED(retVal))
  559.     {
  560.         UINT32 ulDataMajor = HX_GET_MAJOR_VERSION(m_ulContentVersion);
  561.         UINT32 ulDataMinor = HX_GET_MINOR_VERSION(m_ulContentVersion);
  562.         UINT32 ulRendMajor = HX_GET_MAJOR_VERSION(GetHighestSupportedContentVersion());
  563.         UINT32 ulRendMinor = HX_GET_MINOR_VERSION(GetHighestSupportedContentVersion());
  564.         if((ulDataMajor >  ulRendMajor) ||
  565.            (ulDataMajor == ulRendMajor && ulDataMinor > ulRendMinor))
  566.         {
  567.             bVersionOK = FALSE;
  568.         }
  569.     }
  570.     if(bVersionOK)
  571.     {
  572.         retVal = HXR_OK;
  573.     }
  574.     else
  575.     {
  576.         retVal = HXR_FAIL;
  577.     }
  578.     return retVal;
  579. }
  580. STDMETHODIMP CRNBaseRenderer::AddMimeToUpgradeCollection(const char* pszMimeType)
  581. {
  582.     return AddToAutoUpgradeCollection(pszMimeType, m_pContext);
  583. }
  584. STDMETHODIMP CRNBaseRenderer::GetPreference(const char*      pszPrefName,
  585.                                             REF(BOOL)        rbPresent,
  586.                                             REF(IHXBuffer*) rpBuffer)
  587. {
  588.     HX_RESULT retVal  = HXR_OK;
  589.     if (pszPrefName)
  590.     {
  591.         // Set defaults
  592.         rbPresent = FALSE;
  593.         rpBuffer  = NULL;
  594.         if (m_pPreferences)
  595.         {
  596.             HX_RESULT rv = m_pPreferences->ReadPref(pszPrefName, rpBuffer);
  597.             if (SUCCEEDED(rv))
  598.             {
  599.                 rbPresent = TRUE;
  600.             }
  601.         }
  602.         else
  603.         {
  604.             retVal = HXR_NOT_INITIALIZED;
  605.         }
  606.     }
  607.     else
  608.     {
  609.         retVal = HXR_INVALID_PARAMETER;
  610.     }
  611.     return retVal;
  612. }
  613. BOOL CRNBaseRenderer::_IsValidRendererSurface()
  614. {
  615.     return TRUE;
  616. }
  617. STDMETHODIMP_(BOOL) CRNBaseRenderer::GetLoadMultiple()
  618. {
  619.     return TRUE;
  620. }
  621. STDMETHODIMP CRNBaseRenderer::GetCopyright(REF(const char*) rpszCopyright)
  622. {
  623.     rpszCopyright = (const char*) m_pszBaseCopyright;
  624.     return HXR_OK;
  625. }
  626. STDMETHODIMP CRNBaseRenderer::GetMoreInfoURL(REF(const char*) rpszMoreInfoURL)
  627. {
  628.     rpszMoreInfoURL = (const char*) m_pszBaseMoreInfoURL;
  629.     return HXR_OK;
  630. }
  631. STDMETHODIMP_(UINT32) CRNBaseRenderer::GetInitialGranularity()
  632. {
  633.     return 33;
  634. }
  635. STDMETHODIMP_(UINT32) CRNBaseRenderer::GetDisplayFlags()
  636. {
  637.     UINT32 ulRet = HX_DISPLAY_WINDOW          |
  638.                    HX_DISPLAY_SUPPORTS_RESIZE |
  639.                    HX_DISPLAY_SUPPORTS_FULLSCREEN;
  640.     return ulRet;
  641. }
  642. STDMETHODIMP_(UINT32) CRNBaseRenderer::GetHighestSupportedContentVersion()
  643. {
  644.     return HX_ENCODE_PROD_VERSION(0, 0, 0, 0);
  645. }
  646. STDMETHODIMP_(UINT32) CRNBaseRenderer::GetHighestSupportedStreamVersion()
  647. {
  648.     return HX_ENCODE_PROD_VERSION(0, 0, 0, 0);
  649. }