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

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