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

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 <stdio.h>
  36. #include <math.h>
  37. #include "hxtypes.h"
  38. #include "hxwintyp.h"
  39. #include "chxxtype.h"
  40. #include "smil1typ.h"   /* renamed for SHAZAM; used to be smiltype.h */
  41. #include "hxcom.h"
  42. #include "hxcomm.h"
  43. #include "ihxpckts.h"
  44. #include "hxfiles.h"
  45. #include "hxcore.h"
  46. #include "hxprefs.h"
  47. #include "hxrendr.h"
  48. #include "hxasm.h"
  49. #include "hxplugn.h"
  50. #include "hxengin.h"
  51. #include "hxcore.h"
  52. #include "hxclsnk.h"
  53. #include "hxwin.h"
  54. #include "hxsite2.h"
  55. #include "hxsrc.h"
  56. #include "hxgroup.h"
  57. #include "hxrendr.h"
  58. #include "hxevent.h"
  59. #include "hxvsurf.h"
  60. #include "hxerror.h"
  61. #include "hxupgrd.h"
  62. #include "hxvsurf.h"
  63. #include "hxhyper.h"
  64. #include "hxxres.h"
  65. #include "hxxrsmg.h"
  66. #include "hxsm2sm.h"
  67. #include "hxxml.h"
  68. #include "hxxmlprs.h"
  69. #include "xmlreslt.h"
  70. #include "hxstack.h"
  71. #include "hxslist.h"
  72. #include "chxpckts.h"
  73. #include "hxstring.h"
  74. #include "hxurl.h"
  75. #include "hxmap.h"
  76. #include "hxstrutl.h"
  77. #include "hxalloc.h"
  78. #include "errdbg.h"
  79. #include "hxordval.h" // CHXOrderedValues
  80. #if defined(_WINDOWS)
  81. #include "diballoc.h"
  82. #define IDC_HANDCURSOR 102
  83. #elif defined (_MACINTOSH)
  84. #include "hxmm.h"
  85. #include "cresload.h"
  86. extern FSSpec g_DLLFSpec;
  87. #endif
  88. #if defined(_UNIX)  &&  (!defined(_BEOS))  &&  defined(USE_XWINDOWS)
  89. #include <X11/Xlib.h>
  90. #include <X11/Xutil.h>
  91. #include <X11/cursorfont.h>
  92. /* USE_SHM doesn't work yet */
  93. #ifdef USE_SHM
  94. #undef USE_SHM
  95. #endif /* USE_SHM */
  96. #endif
  97. #include "sm1elem.h"
  98. #include "sm1parse.h"
  99. #include "sm1error.h"
  100. #include "smilres.h"
  101. #include "smlrendr.h" /* for SMIL2+ renderer (CSmilRenderer) */
  102. #include "sm1rendr.h"
  103. #include "sm1doc.h"
  104. #include "debugout.h" // XXXMEH
  105. #include "hxtick.h"   // XXXMEH
  106. #include "hxheap.h"
  107. #ifdef _DEBUG
  108. #undef HX_THIS_FILE
  109. static const char HX_THIS_FILE[] = __FILE__;
  110. #endif
  111. #ifdef _DEBUG
  112. #ifdef _WINDOWS
  113. static const char SMILDEPFILE[] = "\smildep.txt";
  114. #else
  115. static const char SMILDEPFILE[] = "smildep.txt";
  116. #endif
  117. #endif
  118. #ifdef _WINDOWS
  119. extern HINSTANCE g_hInstance;
  120. #endif
  121. #ifdef _DEBUG
  122. #define MAX_DEBUG_STRING 20000
  123. #define SDEBUG_OUT(x, y) {
  124.     char* s;
  125.     FILE* f1;
  126.     s = new char[MAX_DEBUG_STRING];
  127.     sprintf y;
  128.     f1 = (x)?(::fopen(x, "a+")):(NULL);
  129.     (f1)?(::fprintf(f1, s), ::fclose(f1)):(0);
  130.     delete[] s; 
  131.        }
  132. #else
  133. #define SDEBUG_OUT(x, y)
  134. #endif
  135. #define SDEBUG_FILE 0//"e:\temp\smilout.txt"
  136. //
  137. // site information - used
  138. // to handle site show/hide
  139. // behavior in seek and hyperlinking
  140. //
  141. struct SMIL1SiteInfo
  142. {
  143.     IHXSite* m_pRendererSite;
  144.     IHXSite* m_pRegionSite;
  145.     HXxSize m_rendererSize;
  146.     UINT16 m_uGroupIndex;
  147.     UINT32 m_ulDelay;
  148.     UINT32 m_ulDuration;
  149.     BOOL m_bRemoveSite;
  150.     BOOL m_bNoRegion;
  151.     CHXString m_regionID;
  152.     IHXRenderer* m_pRenderer;
  153. };
  154. // source information - contained
  155. // in SMIL1PlayToAssoc.m_sourceMap
  156. struct SMIL1SourceInfo
  157. {
  158.     IUnknown* m_pStream;
  159.     IHXRenderer* m_pRenderer;
  160.     CHXString m_tunerName;
  161.     CHXString m_childTunerName;
  162.     CSmil1EventHook* m_pRendererEventHook;
  163.     UINT32 m_ulDuration;
  164.     UINT32 m_ulDelay;
  165. };
  166. //
  167. // struct that associates group,track,and playto property of a stream
  168. //
  169. struct SMIL1PlayToAssoc
  170. {
  171.     UINT16 m_uGroupIndex;
  172.     UINT16 m_uTrackIndex;
  173.     BOOL m_bDurationResolved;
  174.     CHXMapLongToObj m_sourceMap;
  175.     CHXString m_playTo;
  176.     CHXString m_id;
  177.     CHXString m_repeatid;
  178.     CHXString m_tunerName;
  179.     CHXString m_childTunerName;
  180.     CHXString m_regionName;
  181.     UINT32 m_ulDelay;
  182.     UINT32 m_ulDuration;
  183.     BOOL m_bRemoveSite;
  184.     CHXSimpleList* m_pHyperlinks;
  185.     CSmil1EventHook* m_pRendererEventHook;
  186.     CHXSimpleList* m_pSiteInfoList;
  187.     BOOL m_bLiveSource;
  188. };
  189. //
  190. // group information
  191. //
  192. struct SMIL1GroupInfo
  193. {
  194.     int m_nTracks;
  195.     int m_nTracksAdded;
  196.     int m_nTrackDurationsSet;
  197.     UINT32 m_ulDuration;
  198. };
  199. //
  200. // site/z-order info 
  201. //
  202. struct SMIL1ZOrderInfo
  203. {
  204.     IHXSite* m_pSite;
  205.     INT32 m_lZIndex;
  206. };
  207. //
  208. // event source info (endsync in SMIL)
  209. //
  210. struct SMIL1DeferredSourceInfo
  211. {
  212.     UINT32 m_ulDuration;
  213.     UINT32 m_ulDelay;
  214. };
  215. //
  216. // event handler classes
  217. //
  218. class CSmil1LayoutEvent : public CHXBaseCountingObject
  219. {
  220. public:
  221.     CSmil1LayoutEvent     (UINT16 uGroupIndex,
  222.     UINT32 ulEventTime);
  223.     virtual ~CSmil1LayoutEvent     ();
  224.     virtual HX_RESULT handleEvent   () = 0;
  225.     UINT32 m_ulEventTime;
  226.     UINT16 m_uGroupIndex;
  227. };
  228. CSmil1LayoutEvent::CSmil1LayoutEvent(UINT16 uGroupIndex, UINT32 ulEventTime):
  229.     m_uGroupIndex(uGroupIndex),
  230.     m_ulEventTime(ulEventTime)
  231. {
  232. }
  233. CSmil1LayoutEvent::~CSmil1LayoutEvent()
  234. {
  235. }
  236. class CSmil1ShowSiteEvent: public CSmil1LayoutEvent
  237. {
  238. public:
  239.     CSmil1ShowSiteEvent     (UINT16 uGroupIndex,
  240.     UINT32 ulEventTime,
  241.     IHXSite* pSite,
  242.     IHXSite* pRegionSite,
  243.     BOOL bShowSite);
  244.     virtual ~CSmil1ShowSiteEvent     ();
  245.     virtual HX_RESULT handleEvent   ();
  246.     IHXSite* getRegionSite     () { return m_pRegionSite; }
  247.     IHXSite* getRendererSite     () { return m_pSite; }
  248.     BOOL showSite        () { return m_bShowSite; }
  249.     IHXSite* m_pSite;
  250.     IHXSite* m_pRegionSite;
  251.     BOOL m_bShowSite;
  252. };
  253. CSmil1ShowSiteEvent::CSmil1ShowSiteEvent(UINT16 uGroupIndex,
  254.       UINT32 ulEventTime,
  255.       IHXSite* pSite,
  256.       IHXSite* pRegionSite,
  257.       BOOL bShowSite):
  258.     CSmil1LayoutEvent(uGroupIndex, ulEventTime),
  259.     m_pSite(pSite),
  260.     m_pRegionSite(pRegionSite),
  261.     m_bShowSite(bShowSite)
  262. {
  263. #if defined(_DEBUG) && defined(XXXMEH_CHECK_FOR_LEAKS)
  264.     char szDbgStr[128]; /* Flawfinder: ignore */
  265.     sprintf(szDbgStr, "CON CSmil1LayoutEvent 0x%08xn", this); /* Flawfinder: ignore */
  266.     OutputDebugString(szDbgStr);
  267. #endif
  268.     if (m_pSite)
  269.     {
  270.         m_pSite->AddRef();
  271.     }
  272.     if (m_pRegionSite)
  273.     {
  274.         m_pRegionSite->AddRef();
  275.     }
  276. }
  277. CSmil1ShowSiteEvent::~CSmil1ShowSiteEvent()
  278. {
  279. #if defined(_DEBUG) && defined(XXXMEH_CHECK_FOR_LEAKS)
  280.     char szDbgStr[128]; /* Flawfinder: ignore */
  281.     sprintf(szDbgStr, "DES CSmil1LayoutEvent 0x%08xn", this); /* Flawfinder: ignore */
  282.     OutputDebugString(szDbgStr);
  283. #endif
  284.     HX_RELEASE(m_pSite);
  285.     HX_RELEASE(m_pRegionSite);
  286. }
  287. HX_RESULT
  288. CSmil1ShowSiteEvent::handleEvent()
  289. {
  290.     HX_RESULT rc = HXR_OK;
  291.     IHXSite2* pRegionSite2 = 0;
  292.     IHXSite2* pSite2 = 0;
  293.     
  294.     if (m_pRegionSite)
  295. m_pRegionSite->QueryInterface(IID_IHXSite2,(void**)&pRegionSite2);
  296.     if (m_pSite)
  297. m_pSite->QueryInterface(IID_IHXSite2,(void**)&pSite2);
  298.     
  299.     if (m_bShowSite)
  300.     {
  301. // if showing, then first show the site before the region site
  302. // to prevent the flash when the region site is shown before the
  303. // site.
  304. if (pSite2) pSite2->ShowSite(m_bShowSite);
  305. if (pRegionSite2) pRegionSite2->ShowSite(m_bShowSite);
  306.     }
  307.     else
  308.     {
  309. // if hiding, then first hide the region so it's a one-step
  310. // process visually.
  311. if (pRegionSite2) pRegionSite2->ShowSite(m_bShowSite);
  312. if (pSite2) pSite2->ShowSite(m_bShowSite);
  313.     }
  314.     
  315.     if (pRegionSite2) pRegionSite2->Release();
  316.     if (pSite2) pSite2->Release();
  317.     
  318.     return rc;
  319. }
  320. /*
  321.  * CSmil1DocumentRenderer methods
  322.  */
  323. CSmil1DocumentRenderer::CSmil1DocumentRenderer(
  324.     CSmil1Renderer* pParent, IUnknown* pContext):
  325.     m_pParent(pParent),
  326.     m_pSmilParser(0),
  327.     m_ulParseResult(HXR_OK),
  328.     m_lRefCount(0),
  329.     m_pContext(pContext),
  330.     m_pMISUSSite(0),
  331.     m_pRegionMap(0),
  332.     m_pSiteInfoByRendererMap(0),
  333.     m_pSiteWatcherMap(0),
  334.     m_pGroupInfoMap(0),
  335.     m_pGroupMap(0),
  336.     m_pDeferredSourceMap(0),
  337.     m_pRepeatIDMap(0),
  338.     m_pSiteInfoList(0),
  339.     m_uCurrentGroupIndex(-1),
  340.     m_pPlayToAssocList(0),
  341.     m_pZOrderList(0),
  342.     m_pSiteMgr(0),
  343.     m_pScheduler(0),
  344.     m_pEventList(0),
  345.     m_pValues(0),
  346.     m_pFragment(0),
  347.     m_ulCurrentTime(0),
  348.     m_ulEventListPosition(0),
  349.     m_bFirstTimeSync(FALSE),
  350.     m_bSiteChangingSize(FALSE),
  351.     m_bRootLayoutWidthSet(FALSE),
  352.     m_bRootLayoutHeightSet(FALSE),
  353.     m_ulRootLayoutHeight(0),
  354.     m_ulRootLayoutWidth(0),
  355.     m_ulNoRootLayoutHeight(0),
  356.     m_ulNoRootLayoutWidth(0),
  357.     m_ulRootLayoutBGColor(0),
  358.     m_bSettingFragment(FALSE),
  359.     m_bInHyperlink(FALSE),
  360.     m_pStatusMessage(0),
  361.     m_bStatusMessageSet(FALSE),
  362. #ifdef _WINDOWS
  363.     m_hPreHyperlinkCursor(0),
  364.     m_hHyperlinkCursor(0),
  365.     m_bNeedToSetHyperlinkCursor(FALSE),
  366. #endif
  367. #ifdef _MACINTOSH
  368.     m_hHyperlinkCursor(0),
  369.     m_bResetCursor(FALSE),
  370. #endif
  371. #if defined(_UNIX)  &&  (!defined(_BEOS))  &&  defined(USE_XWINDOWS)
  372.     m_hHyperlinkCursor(0),
  373.     m_hCurrentCursor(0),
  374.     m_pDisplay(0),
  375.     m_Window(0),
  376.     m_pPixmapDisplay(NULL),
  377.     m_pVisualInfo(NULL),
  378. #endif
  379.     m_bSiteLayoutComplete(FALSE),
  380.     m_nFragmentTracks(0),
  381.     m_bShowDependencies(FALSE),
  382.     m_dResizeXScale(1.0),
  383.     m_dResizeYScale(1.0)
  384.     , m_ulGroupIndex(0)
  385.     , m_ulTrackIndex(0)
  386.     , m_uGroupIndexWithin(0)
  387.     , m_bSitesDetached(FALSE)
  388.     , m_bInRAM20(FALSE)
  389.     , m_bLastGroupInRAM20(FALSE)
  390.     , m_ulPersistentComponentDelay(0)
  391.     , m_ulPersistentComponentID(0)
  392.     , m_uPersistentGroupID(0)
  393.     , m_uPersistentTrackID(0)
  394.     , m_elementWithinTag(WithinUnknown)
  395.     , m_pPersistentProperties(NULL)
  396.     , m_pPersistentParentRenderer(NULL)
  397.     , m_bCloseCalled(FALSE)
  398.     , m_pProcessElementCallback(NULL)
  399.     , m_ulPktnum(0)
  400.     , m_usOldXPos(0)
  401.     , m_usOldYPos(0)
  402. {
  403. #if defined(_DEBUG) && defined(XXXMEH_CHECK_FOR_LEAKS)
  404.     char szDbgStr[128]; /* Flawfinder: ignore */
  405.     sprintf(szDbgStr, "CON CSmil1DocumentRenderer 0x%08xn", this); /* Flawfinder: ignore */
  406.     OutputDebugString(szDbgStr);
  407. #endif
  408.     HX_ASSERT( m_pContext );
  409.     if(m_pContext)
  410.     {
  411. m_pContext->AddRef();
  412. HX_VERIFY(HXR_OK == m_pContext->
  413.   QueryInterface(IID_IHXSiteManager,(void**)&m_pSiteMgr));
  414. HX_VERIFY(HXR_OK == m_pContext->
  415.   QueryInterface(IID_IHXScheduler, (void**)&m_pScheduler));
  416. if (HXR_OK != m_pContext->QueryInterface(IID_IHXStatusMessage,
  417.  (void**)&m_pStatusMessage))
  418. {
  419.     // not an error, just a feature waiting to happen...
  420.     m_pStatusMessage = NULL;
  421. }
  422.     }
  423. #ifdef _WINDOWS
  424.     m_hHyperlinkCursor = LoadCursor(g_hInstance,
  425.         MAKEINTRESOURCE(IDC_HANDCURSOR));
  426. #endif
  427. #ifdef _MACINTOSH
  428.     const short HAND_CURSOR  = 1313;
  429.     m_pResourceLoader = CResourceLoader::CreateInstance(g_DLLFSpec);
  430.     m_hHyperlinkCursor = (CursHandle)m_pResourceLoader->LoadResource('CURS', HAND_CURSOR);
  431. #endif
  432.     
  433. #ifdef _DEBUG
  434.     IHXPreferences* pPrefs = NULL;
  435.     // get "showdependencies" preference
  436.     //IHXPreferences* pPrefs = 0;
  437.     if(HXR_OK == m_pContext->QueryInterface(
  438.        IID_IHXPreferences, (void**)&pPrefs))
  439.     {
  440. IHXBuffer* pBuf = 0;
  441. if(HXR_OK == pPrefs->ReadPref("showdependencies", pBuf))
  442. {
  443.     m_bShowDependencies = (BOOL)atol((const char*)pBuf->GetBuffer());
  444.     HX_RELEASE(pBuf);
  445. }
  446. pPrefs->Release();
  447.     }
  448.     if(m_bShowDependencies)
  449.     {
  450. // mark file boundary
  451. FILE* fp = fopen(SMILDEPFILE, "a");
  452. if(fp)
  453. {
  454.          fprintf(fp, "===========================n");
  455.     fclose(fp);
  456. }
  457.     }
  458. #endif
  459. }
  460. CSmil1DocumentRenderer::~CSmil1DocumentRenderer()
  461. {
  462. #if defined(_DEBUG) && defined(XXXMEH_CHECK_FOR_LEAKS)
  463.     char szDbgStr[128]; /* Flawfinder: ignore */
  464.     sprintf(szDbgStr, "DES CSmil1DocumentRenderer 0x%08xn", this); /* Flawfinder: ignore */
  465.     OutputDebugString(szDbgStr);
  466. #endif
  467.     HX_RELEASE(m_pSiteMgr);
  468. #if defined(_UNIX)  &&  (!defined(_BEOS))  &&  defined(USE_XWINDOWS)
  469.     CHXMapPtrToPtr::Iterator i = m_siteToXDataMap.Begin();
  470.     for(; i != m_siteToXDataMap.End(); ++i)
  471.     {
  472.         XData* xData = (XData*)(*i);
  473. delete xData;
  474.     }
  475.     if (m_pVisualInfo)
  476.     {
  477. XFree(m_pVisualInfo);
  478. m_pVisualInfo = NULL;
  479.     }
  480.     if (m_pDisplay && m_hHyperlinkCursor)
  481.     {
  482. XFreeCursor(m_pDisplay, m_hHyperlinkCursor);
  483. m_hHyperlinkCursor = 0;
  484.     }
  485. #endif    
  486. #if defined(_MACINTOSH)
  487.     if (m_hHyperlinkCursor)
  488.     {
  489.      m_pResourceLoader->UnloadResource((Handle)m_hHyperlinkCursor);
  490.      m_hHyperlinkCursor = NULL;
  491.     
  492.      HX_RELEASE(m_pResourceLoader);
  493.     }
  494.     if (m_bResetCursor)
  495.     {
  496. ::InitCursor();
  497.     }
  498. #endif
  499. }
  500. /*
  501.  * IUnknown methods
  502.  */
  503. STDMETHODIMP
  504. CSmil1DocumentRenderer::QueryInterface(REFIID riid, void** ppvObj)
  505. {
  506.     if(IsEqualIID(riid, IID_IUnknown))
  507.     {
  508. AddRef();
  509. *ppvObj = this;
  510. return HXR_OK;
  511.     }
  512.     else if(IsEqualIID(riid, IID_IHXValues))
  513.     {
  514. AddRef();
  515. *ppvObj = (IHXValues*)this;
  516. return HXR_OK;
  517.     }
  518.     else if(IsEqualIID(riid, IID_IHXSiteUser))
  519.     {
  520. AddRef();
  521. *ppvObj = (IHXSiteUser*)this;
  522. return HXR_OK;
  523.     }
  524.     else if(IsEqualIID(riid, IID_IHXRendererAdviseSink))
  525.     {
  526. AddRef();
  527. *ppvObj = (IHXRendererAdviseSink*)this;
  528. return HXR_OK;
  529.     }
  530.     else if(IsEqualIID(riid, IID_IHXGroupSink))
  531.     {
  532. AddRef();
  533. *ppvObj = (IHXGroupSink*)this;
  534. return HXR_OK;
  535.     }
  536.     *ppvObj = NULL;
  537.     return HXR_NOINTERFACE;
  538. }
  539. STDMETHODIMP_(ULONG32)
  540. CSmil1DocumentRenderer::AddRef()
  541. {
  542.     return InterlockedIncrement(&m_lRefCount);
  543. }
  544. STDMETHODIMP_(ULONG32)
  545. CSmil1DocumentRenderer::Release()
  546. {
  547.     if(InterlockedDecrement(&m_lRefCount) > 0)
  548.     {
  549. return m_lRefCount;
  550.     }
  551.     delete this;
  552.     return 0;
  553. }
  554. HX_RESULT
  555. CSmil1DocumentRenderer::close(CSmil1Renderer* pParent)
  556. {
  557.     if (m_pProcessElementCallback)
  558.     {
  559. if (m_pScheduler && m_pProcessElementCallback->m_bIsCallbackPending)
  560. {
  561.          m_pProcessElementCallback->m_bIsCallbackPending = FALSE;
  562.     m_pScheduler->Remove(m_pProcessElementCallback->m_PendingHandle);
  563.     m_pProcessElementCallback->m_PendingHandle = 0;
  564. }
  565. HX_RELEASE(m_pProcessElementCallback);
  566.     }
  567.     IUnknown* pThisUnk = 0;
  568.     if(HXR_OK == QueryInterface(IID_IUnknown, (void**)&pThisUnk))
  569.     {
  570. pParent->HandleRemoveLayoutSiteGroup(pThisUnk);
  571. pThisUnk->Release();
  572.     }
  573.     if(m_pEventList)
  574.     {
  575. CHXSimpleList::Iterator i = m_pEventList->Begin();
  576. for(; i != m_pEventList->End(); ++i)
  577. {
  578.     CSmil1LayoutEvent* pEvent = (CSmil1LayoutEvent*)(*i);
  579.     delete pEvent;
  580. }
  581.     }
  582.     HX_DELETE(m_pEventList);
  583.     removeAllPlayToAssoc();
  584.     if (m_bSitesDetached)
  585.     {
  586.         if(m_pRegionMap)
  587.         {
  588.     CHXMapStringToOb::Iterator i = m_pRegionMap->Begin();
  589.     for(; i != m_pRegionMap->End(); ++i)
  590.     {
  591.         CSmil1BasicRegion* pRegion = (CSmil1BasicRegion*)(*i);
  592.         delete pRegion;
  593.     }
  594.         }
  595.         HX_DELETE(m_pRegionMap);
  596.     }
  597.     if(m_pGroupInfoMap)
  598.     {
  599. CHXMapLongToObj::Iterator i = m_pGroupInfoMap->Begin();
  600. for(; i != m_pGroupInfoMap->End(); ++i)
  601. {
  602.     SMIL1GroupInfo* pGroupInfo = (SMIL1GroupInfo*)(*i);
  603.     delete pGroupInfo;
  604. }
  605.     }
  606.     HX_DELETE(m_pGroupInfoMap);
  607.     if(m_pDeferredSourceMap)
  608.     {
  609. CHXMapStringToOb::Iterator i = m_pDeferredSourceMap->Begin();
  610. for(; i != m_pDeferredSourceMap->End(); ++i)
  611. {
  612.     SMIL1DeferredSourceInfo* pInfo = (SMIL1DeferredSourceInfo*)(*i);
  613.     delete pInfo;
  614. }
  615.     }
  616.     HX_DELETE(m_pDeferredSourceMap);
  617.     HX_DELETE(m_pRepeatIDMap);
  618.     if (m_bSitesDetached)
  619.     {
  620.         if(m_pSiteInfoList)
  621.         {
  622.     CHXSimpleList::Iterator i = m_pSiteInfoList->Begin();
  623.     for(; i != m_pSiteInfoList->End(); ++i)
  624.     {
  625.         SMIL1SiteInfo* pSiteInfo = (SMIL1SiteInfo*)(*i);
  626.         delete pSiteInfo;
  627.     }
  628.         }
  629.         HX_DELETE(m_pSiteInfoList);
  630.     }
  631.     if(m_pStatusMessage)
  632.     {
  633. m_pStatusMessage->SetStatus(NULL);
  634.     }
  635.     HX_RELEASE(m_pStatusMessage);
  636.     if (m_bSitesDetached)
  637.     {
  638.         HX_DELETE(m_pSiteInfoByRendererMap);
  639.     }
  640.     if (m_bSitesDetached)
  641.     {
  642.         if(m_pSiteWatcherMap)
  643.         {
  644.     CHXMapPtrToPtr::Iterator i= m_pSiteWatcherMap->Begin();
  645.     for(; i != m_pSiteWatcherMap->End(); ++i)
  646.     {
  647.         CSmil1SiteWatcher* pSiteWatcher = (CSmil1SiteWatcher*)(*i);
  648.         pSiteWatcher->Release();
  649.     }
  650.     HX_DELETE(m_pSiteWatcherMap);
  651.         }
  652.     }
  653.     HX_RELEASE(m_pValues);
  654.     HX_DELETE(m_pSmilParser);
  655.     HX_VECTOR_DELETE(m_pFragment);
  656.     HX_RELEASE(m_pScheduler);
  657.     HX_RELEASE(m_pContext);
  658. #ifdef _MACINTOSH
  659.     if (m_bResetCursor)
  660.     {
  661. m_bResetCursor = FALSE;
  662. ::InitCursor();
  663.     }
  664. #endif
  665.     m_bCloseCalled = TRUE;
  666.     return HXR_OK;
  667. }
  668. HX_RESULT
  669. CSmil1DocumentRenderer::onHeader(IHXValues* pHeader)
  670. {
  671.     m_pValues = new CHXHeader;
  672.     m_pValues->AddRef();
  673.     m_pRegionMap = new CHXMapStringToOb;
  674.     m_pSiteInfoByRendererMap = new CHXMapPtrToPtr;
  675.  
  676.     if (m_pPersistentParentRenderer &&
  677. HXR_OK == m_pPersistentParentRenderer->GetElementProperties(m_uPersistentGroupID,
  678.     m_uPersistentTrackID,
  679.     m_pPersistentProperties))
  680.     {
  681. m_pPersistentProperties->GetPropertyULONG32("ElementWithinTag", (UINT32&)m_elementWithinTag);
  682.     }
  683.     
  684.     IHXBuffer* pBuffer = 0;
  685.     IHXCommonClassFactory* pFactory = m_pParent->getFactory();
  686.     if(HXR_OK == pFactory->CreateInstance(CLSID_IHXBuffer,
  687. (void**)&pBuffer))
  688.     {
  689. pBuffer->Set((const BYTE*)"TopLevelSite", strlen("TopLevelSite")+1);
  690. SetPropertyCString("name", pBuffer);
  691. SetPropertyULONG32("GroupIndex", m_uPersistentGroupID);
  692. SetPropertyULONG32("TrackIndex", m_uPersistentTrackID);
  693. pBuffer->Release();
  694.     }
  695.     m_pSmilParser = new CSmil1Parser(m_pContext);
  696.     m_pSmilParser->init();
  697.     m_pSmilParser->InitPersistent(m_ulPersistentComponentID, m_elementWithinTag);
  698.     return HXR_OK;
  699. }
  700. HX_RESULT
  701. CSmil1DocumentRenderer::getErrorInfo(REF(UINT32) ulLineNumber,
  702.     REF(UINT32) ulColumnNumber,
  703.     REF(IHXBuffer*) pErrorText)
  704. {
  705.     ulLineNumber = m_pSmilParser->m_ulErrorLineNumber;
  706.     ulColumnNumber = m_pSmilParser->m_ulErrorColumnNumber;
  707.     pErrorText = m_pSmilParser->m_pErrorText;
  708.     if(pErrorText)
  709.     {
  710. pErrorText->AddRef();
  711.     }
  712.     return HXR_OK;
  713. }
  714. HX_RESULT
  715. CSmil1DocumentRenderer::onPacket(IHXBuffer* pBuffer, BOOL bIsLast)
  716. {
  717.     HX_RESULT rc = HXR_OK;
  718.     BOOL bDumpToFile = FALSE;
  719.     getBooleanPreference(m_pContext,
  720.                          "NonObviousKeyNameVer1",
  721.                          bDumpToFile);
  722.     BOOL bShowPacketBoundaries = FALSE;
  723.     getBooleanPreference(m_pContext,
  724.                          "NonObviousKeyNameVer1Option1",
  725.                          bShowPacketBoundaries);
  726.     if (bDumpToFile)
  727.     {
  728. #ifdef _WINDOWS
  729.         const char* pszFile = "c:\smil1dump.txt";
  730. #else
  731.         const char* pszFile = "smil1dump.txt";
  732. #endif
  733.         FILE* pFoo = fopen(pszFile, m_ulPktnum > 0L ? "a" : "w");
  734.         if (pFoo)
  735.         {
  736.             char* pBuf = (char*) pBuffer->GetBuffer();
  737.             if(pBuf && strlen(pBuf) > 0)
  738.             {
  739.                 if (bShowPacketBoundaries)
  740.                 {
  741.                     fprintf(pFoo, "[[[packet # %lu]]]:{{{", m_ulPktnum);
  742.                 }
  743.                 fwrite(pBuf, 1, pBuffer->GetSize(), pFoo);
  744.                 if (bShowPacketBoundaries)
  745.                 {
  746.                     fprintf(pFoo, "}}}n");
  747.                 }
  748.             }
  749.             else
  750.             {
  751.                 if (bShowPacketBoundaries)
  752.                 {
  753.                     fprintf(pFoo, "n[[[Packet %lu empty in onPacket()]]]n",
  754.                             m_ulPktnum);
  755.                 }
  756.             }
  757.         }
  758.         fclose(pFoo);
  759.         if (bIsLast)
  760.             m_ulPktnum = 0L;
  761.         else
  762.             m_ulPktnum++;
  763.     }
  764.     rc = m_pSmilParser->parse(pBuffer, bIsLast);
  765.     return rc;
  766. }
  767. HX_RESULT
  768. CSmil1DocumentRenderer::setDocument(const char* pFragment)
  769. {
  770.     HX_RESULT rc = m_pSmilParser->createElements();
  771.     if(HXR_OK == rc)
  772.     {
  773. rc = handleElements();
  774. IHXPlayer* pPlayer = m_pParent->getPlayer();
  775. IHXGroupManager* pMgr = 0;
  776. if(HXR_OK == pPlayer->QueryInterface(IID_IHXGroupManager, (void**)&pMgr))
  777. {
  778.     if(pFragment)
  779.     {
  780. m_pFragment = new_string(pFragment);
  781. m_bSettingFragment = TRUE;
  782.           m_nFragmentTracks = 0;
  783. UINT16 uFragmentGroup = 
  784.     m_pSmilParser->getFragmentGroup(m_pFragment);
  785. pMgr->SetCurrentGroup(uFragmentGroup);
  786.     }
  787.     // /Adding the "else" around this fixes PR 75814; without this,
  788.     // the code was ignoring the uFragmentGroup set already, above,
  789.     // and thus "foo.smil#fragmentInHighGroup" links stopped working
  790.     // in the RealOne Player:
  791.     else
  792.     {
  793. if (m_pParent->m_bUseNestedMeta && !m_bLastGroupInRAM20 && m_uCurrentGroupIndex == -1)
  794. {
  795.     pMgr->GetCurrentGroup((UINT16&)m_uCurrentGroupIndex);
  796. }
  797. else
  798. {
  799.     pMgr->SetCurrentGroup(0);
  800. }
  801.     }
  802.     pMgr->Release();
  803. }
  804.     }
  805.     return rc;
  806. }
  807. HX_RESULT
  808. CSmil1DocumentRenderer::handleElements()
  809. {
  810.     HX_RESULT rc = HXR_OK;
  811.     if(m_pSmilParser)
  812.     {
  813. //if(m_ulParseResult != HXR_STREAM_DONE)
  814. //{
  815.     while(HXR_OK == rc)
  816.     {
  817. rc = m_pSmilParser->handleNextElement(this);
  818.     }
  819.     m_ulParseResult = rc;
  820. //}
  821.     }
  822.     return HXR_OK;
  823. }
  824. HX_RESULT
  825. CSmil1DocumentRenderer::parseDimension(const char* pDimensionString,
  826.       REF(UINT32) ulValue,
  827.       REF(BOOL) bIsPercent)
  828. {
  829.     HX_RESULT rc = HXR_OK;
  830.     if(!pDimensionString || strlen(pDimensionString) == 0)
  831.     {
  832. ulValue = 0L;
  833. //[SMIL 1.0 compliance] Helps fix PR 16542.  The caller of this
  834. // function should look at this return value to determine whether
  835. // or not the string was empty (and thus 0 is returned in ulValue) or
  836. // whether "0" or "0%" IS the string (and thus 0 is returned in
  837. // ulValue along with HXR_OK):
  838. rc = HXR_FAIL;
  839.     }
  840.     else
  841.     {
  842. char* pEndPtr = 0;
  843. ulValue = (UINT32)strtod(pDimensionString, &pEndPtr);
  844. if(pEndPtr && strcmp(pEndPtr, "%") == 0)
  845. {
  846.     bIsPercent = TRUE;
  847. }
  848. else
  849. {
  850.     bIsPercent = FALSE;
  851. }
  852.     }
  853.     return rc;
  854. }
  855. HX_RESULT
  856. CSmil1DocumentRenderer::regionToRect(CSmil1Region* pElement, 
  857.     HXxRect* pRect, BOOL& bWidthUnspecified, BOOL& bHeightUnspecified)
  858. {
  859.     HX_RESULT rc = HXR_OK;
  860.     bWidthUnspecified = bHeightUnspecified = FALSE;
  861.     UINT32 ulTop = 0;
  862.     UINT32 ulLeft = 0;
  863.     UINT32 ulWidth = 0;
  864.     UINT32 ulHeight = 0;
  865.     BOOL bTopIsPercent = FALSE;
  866.     BOOL bLeftIsPercent = FALSE;
  867.     BOOL bWidthIsPercent = FALSE;
  868.     BOOL bHeightIsPercent = FALSE;
  869.     parseDimension(pElement->m_left, ulLeft, bLeftIsPercent);
  870.     parseDimension(pElement->m_top, ulTop, bTopIsPercent);
  871.     HX_RESULT rsltW =
  872.     parseDimension(pElement->m_width, ulWidth, bWidthIsPercent);
  873.     HX_RESULT rsltH =
  874.     parseDimension(pElement->m_height, ulHeight, bHeightIsPercent);
  875.     /* check for valid region constraints */
  876.     BOOL bRegionError = FALSE;
  877.     char errorBuf[256]; /* Flawfinder: ignore */
  878.     //[SMIL 1.0 compliance] helps fix PR 24630; separate width & height logic
  879.     if((!m_bRootLayoutWidthSet && 
  880.     (bLeftIsPercent  ||  bWidthIsPercent))  ||
  881.     (!m_bRootLayoutHeightSet && 
  882.     (bTopIsPercent  ||  bHeightIsPercent)) )
  883.     {
  884. //XXXE: needs err msg: "Region can't use % without root-layout"
  885. rc = HXR_FAIL;
  886. SafeSprintf(errorBuf, 256, "region %s",
  887.     (const char*)pElement->m_pNode->m_id);
  888. CSmil1SMILSyntaxErrorHandler errHandler(m_pContext);
  889. errHandler.ReportError(SMILErrorBadAttribute, errorBuf, 0);
  890. return rc;
  891.     }
  892.     if(m_bRootLayoutWidthSet)
  893.     {
  894. if(bLeftIsPercent)
  895. {
  896.     ulLeft = (UINT32)(((float)ulLeft/100.0) * m_ulRootLayoutWidth);
  897. }
  898. if(bWidthIsPercent)
  899. {
  900.     ulWidth = (UINT32)(((float)ulWidth/100.0) * m_ulRootLayoutWidth);
  901. }
  902.     }
  903.     if(m_bRootLayoutHeightSet)
  904.     {
  905. if(bTopIsPercent)
  906. {
  907.     ulTop = (UINT32)(((float)ulTop/100.0) * m_ulRootLayoutHeight);
  908. }
  909. if(bHeightIsPercent)
  910. {
  911.     ulHeight = (UINT32)(((float)ulHeight/100.0) * m_ulRootLayoutHeight);
  912. }
  913.     }
  914.     if(m_ulNoRootLayoutHeight < (ulTop + ulHeight))
  915.     {
  916. m_ulNoRootLayoutHeight = ulTop + ulHeight;
  917.     }
  918.     if(m_ulNoRootLayoutWidth < (ulLeft + ulWidth))
  919.     {
  920. m_ulNoRootLayoutWidth =  ulLeft + ulWidth;
  921.     }
  922.     //[SMIL 1.0 compliance] Helps fix PR 16542:
  923.     if(m_pSmilParser)
  924.     {
  925. //If we're in full-compliance mode and someone enters a
  926. // width="0" or width="0%", we should leave it as 0.  We
  927. // know that they omitted width or height (which is returned as 0
  928. // from parseDimension), if the return value is HXR_FAIL:
  929. if (!ulWidth  &&  HXR_FAIL == rsltW)
  930. {
  931.     bWidthUnspecified = TRUE;
  932. }
  933. if (!ulHeight  &&  HXR_FAIL == rsltH)
  934. {
  935.     bHeightUnspecified = TRUE;
  936. }
  937.     }
  938.     pRect->left = ulLeft;
  939.     pRect->top = ulTop;
  940.     pRect->right = ulLeft + ulWidth;
  941.     pRect->bottom = ulTop + ulHeight;
  942.     return rc;
  943. }
  944. HX_RESULT
  945. CSmil1DocumentRenderer::handleRegion(CSmil1Region* pElement)
  946. {
  947.     HX_RESULT rc = HXR_OK;
  948.     HXxRect rect;
  949.     rect.left = 0;
  950.     rect.right = 0;
  951.     rect.top = 0;
  952.     rect.bottom = 0;
  953.     BOOL bWidthUnspecified, bHeightUnspecified;
  954.     if(HXR_OK != regionToRect(pElement, &rect,
  955.     //[SMIL 1.0 compliance] Helps fix PR 16542; these are passed
  956.     // by reference and set to TRUE if width or height (respectively)
  957.     // is not explicitly set:
  958.     bWidthUnspecified, bHeightUnspecified))
  959.     {
  960. rc = HXR_FAIL;
  961.     }
  962.     else
  963.     {
  964. CSmil1BasicRegion* pRegion = new CSmil1BasicRegion(pElement->m_pNode->m_id, rect, 
  965.     pElement->m_zIndex, pElement->m_fit, pElement->m_ulBgColor,
  966.     pElement->m_bBgColorSet, FALSE,
  967.     bWidthUnspecified, bHeightUnspecified);
  968. (*m_pRegionMap)[(const char*)pElement->m_pNode->m_id] = pRegion;
  969.     }
  970.     return rc;
  971. }
  972. HX_RESULT
  973. CSmil1DocumentRenderer::handleRootLayout(CSmil1RootLayout* pElement)
  974. {
  975.     HX_RESULT rc = HXR_OK;
  976.     m_bRootLayoutWidthSet = !pElement->m_bWidthUnspecified;
  977.     m_bRootLayoutHeightSet = !pElement->m_bHeightUnspecified;
  978.     m_ulRootLayoutHeight = pElement->m_ulHeight;
  979.     m_ulRootLayoutWidth = pElement->m_ulWidth;
  980.     m_ulRootLayoutBGColor = pElement->m_ulBgColor;
  981.     return rc;
  982. }
  983. HX_RESULT
  984. CSmil1DocumentRenderer::handleAddGroup(CSmil1AddGroup* pElement)
  985. {
  986.     HX_RESULT rc = HXR_OK;
  987.     if (m_bInRAM20 && !m_bLastGroupInRAM20 && m_ulGroupIndex)
  988.     {
  989. return rc;
  990.     }
  991.     if(!m_pGroupMap)
  992.     {
  993. m_pGroupMap = new CHXMapLongToObj;
  994.     }
  995.     IHXPlayer* pPlayer = m_pParent->getPlayer();
  996.     IHXGroupManager* pMgr = 0;
  997.     if(HXR_OK == pPlayer->QueryInterface(IID_IHXGroupManager, (void**)&pMgr))
  998.     {
  999. IHXGroup* pGroup = NULL;
  1000. IHXGroup2* pGroup2 = NULL;
  1001. if (m_pParent->m_bUseNestedMeta && 0 == m_ulGroupIndex)
  1002. {
  1003.     if (m_bLastGroupInRAM20)
  1004.     {
  1005. rc = pMgr->CreateGroup(pGroup);
  1006.     }
  1007.     else
  1008.     {
  1009. HX_ASSERT(pMgr->GetGroupCount());
  1010. rc = pMgr->GetCurrentGroup(m_uGroupIndexWithin);
  1011. rc = pMgr->GetGroup(m_uGroupIndexWithin, pGroup);
  1012.     }
  1013. }
  1014. else
  1015. {
  1016.     rc = pMgr->CreateGroup(pGroup);
  1017. }
  1018. if(HXR_OK == rc)
  1019.     // release pGroup when m_pGroupMap is destructed
  1020. {
  1021.     CHXHeader* pGroupValues = new CHXHeader;
  1022.     pGroupValues->AddRef();
  1023.     if(pElement->m_ulDuration != (UINT32)-1)
  1024.     {
  1025. pGroupValues->SetPropertyULONG32("duration", pElement->m_ulDuration);
  1026.     }
  1027.     pGroupValues->SetPropertyULONG32("total_tracks", pElement->m_nTotalTracks);
  1028.     pGroupValues->SetPropertyULONG32("initial_tracks", pElement->m_nInitTracks);    
  1029.     pGroupValues->SetPropertyULONG32("PersistentComponentID", m_ulPersistentComponentID);
  1030.     
  1031.     if (m_bLastGroupInRAM20)
  1032.     {
  1033. pGroupValues->SetPropertyULONG32("LastGroupInRAM20", 1);
  1034.     }
  1035.     // copy all the node values to group values
  1036.     IHXValues* pValues = pElement->m_pValues;
  1037.     if(pValues)
  1038.     {
  1039. IHXBuffer* pBuf = NULL;
  1040. const char* pName = NULL;
  1041. HX_RESULT res = 
  1042.     pValues->GetFirstPropertyCString(pName, pBuf);
  1043. while(HXR_OK == res)
  1044. {
  1045.     pGroupValues->SetPropertyCString(pName, pBuf);
  1046.     HX_RELEASE(pBuf);
  1047.     res = pValues->GetNextPropertyCString(pName, pBuf);
  1048. }
  1049.     }
  1050.     pGroup->SetGroupProperties(pGroupValues);
  1051.     if (HXR_OK == pGroup->QueryInterface(IID_IHXGroup2, (void**)&pGroup2))
  1052.     {
  1053. pGroup2->SetPersistentComponentProperties(m_ulPersistentComponentID,
  1054.   pGroupValues);
  1055.     }
  1056.     HX_RELEASE(pGroup2);
  1057.     HX_RELEASE(pGroupValues);
  1058.     if (m_pParent->m_bUseNestedMeta && 0 == m_ulGroupIndex)
  1059.     {
  1060. if (m_bLastGroupInRAM20)
  1061. {
  1062.     pMgr->AddGroup(pGroup);
  1063. }
  1064. else
  1065. {
  1066.     GroupAdded(m_uGroupIndexWithin, pGroup);
  1067. }
  1068.     }
  1069.     else
  1070.     {
  1071. pMgr->AddGroup(pGroup);
  1072.     }     
  1073.     m_ulTrackIndex = 0;
  1074.     m_ulGroupIndex++;
  1075.     (*m_pGroupMap)[pElement->m_nGroup] = pGroup;
  1076. }
  1077.     }
  1078.     HX_RELEASE(pMgr);
  1079.     return rc;
  1080. }
  1081. void
  1082. CSmil1DocumentRenderer::setProperty(IHXValues* pValues, 
  1083.     const char* pName, const char* pValue)
  1084. {
  1085.     IHXBuffer* pBuf = 0;
  1086.     IHXCommonClassFactory* pFactory = m_pParent->getFactory();
  1087.     if(HXR_OK == pFactory->CreateInstance(CLSID_IHXBuffer,
  1088.          (void**)&pBuf))
  1089.     {
  1090. pBuf->Set((BYTE*)pValue, strlen(pValue)+1);
  1091. pValues->SetPropertyCString(pName, pBuf);
  1092. pBuf->Release();
  1093.     }
  1094. }
  1095. HX_RESULT
  1096. CSmil1DocumentRenderer::convertURL(const char* pURL, CHXString& newURL)
  1097. {
  1098.     CHXURL urlObj(pURL);
  1099.     IHXValues* pHeader = urlObj.GetProperties();
  1100.     IHXBuffer* pBuffer = NULL;
  1101.     if(!pHeader)
  1102.     {
  1103. return HXR_FAIL;
  1104.     }
  1105.     if(HXR_OK == pHeader->GetPropertyBuffer(PROPERTY_SCHEME, pBuffer))
  1106.     {
  1107. // fully qualified URL
  1108. newURL = pURL;
  1109. HX_RELEASE(pBuffer);
  1110.     }
  1111.     else
  1112.     {
  1113. // relative URL
  1114. // if it starts with '/', make it relative to the root of 
  1115. // the URL prefix
  1116. if(*pURL == '/')
  1117. {
  1118.     newURL = m_pParent->getURLRoot() + pURL;
  1119. }
  1120. else if (strnicmp(pURL, URL_COMMAND, sizeof(URL_COMMAND) - 1) == 0)
  1121. {
  1122.     newURL = pURL;
  1123. }
  1124. else
  1125. {
  1126.     newURL = m_pParent->getURLPrefix() + pURL;
  1127. }
  1128.     }
  1129.     HX_RELEASE(pHeader);
  1130.     return HXR_OK;
  1131. }
  1132. HX_RESULT
  1133. CSmil1DocumentRenderer::handleSource(CSmil1Source* pElement)
  1134. {
  1135.     HX_RESULT rc = HXR_OK;
  1136.     CHXString urlString;
  1137.     convertURL(pElement->m_src, urlString);
  1138.     if (!m_pRepeatIDMap)
  1139.     {
  1140. m_pRepeatIDMap = new CHXMapStringToOb;
  1141.     }
  1142.     IHXGroup* pGroup = 0;
  1143.     if(m_pGroupMap && 
  1144.        m_pGroupMap->Lookup(pElement->m_pNode->m_nGroup, (void*&)pGroup))
  1145.     {
  1146. IHXCommonClassFactory* pFactory = m_pParent->getFactory();
  1147. IHXValues* pValues = 0;
  1148. if(HXR_OK == pFactory->CreateInstance(CLSID_IHXValues,
  1149. (void**)&pValues))
  1150. {
  1151.     pValues->SetPropertyULONG32("PersistentComponentID", m_ulPersistentComponentID);    
  1152.     setProperty(pValues, "url", urlString);
  1153.     setProperty(pValues, "id", pElement->m_pNode->m_id);
  1154.     setProperty(pValues, "repeatid", pElement->m_pNode->m_repeatid);
  1155.     setProperty(pValues, "playto", pElement->m_region);
  1156.     if(pElement->m_region.GetLength() > 0)
  1157.     {
  1158. // save original region name in track values
  1159. setProperty(pValues, "region", pElement->m_region);
  1160.     }
  1161.     setProperty(pValues, "fill", pElement->m_fill);
  1162.     setProperty(pValues, "track-hint", pElement->m_pNode->m_trackHint);
  1163.     UINT32 ulDelay = 0;
  1164.     if(pElement->m_ulDelay != (UINT32)-1)
  1165.     {
  1166. //if(pElement->m_ulBeginOffset != (UINT32)-1)
  1167. //{
  1168. //    pValues->SetPropertyULONG32("delay", pElement->m_ulDelay +
  1169. //     pElement->m_ulBeginOffset);
  1170. //}
  1171. //else
  1172. //{
  1173.     ulDelay = pElement->m_ulDelay + m_ulPersistentComponentDelay;
  1174. //}
  1175.     }
  1176.     else
  1177.     {
  1178. ulDelay = m_ulPersistentComponentDelay;
  1179.     }
  1180.     if (ulDelay)
  1181.     {
  1182. pValues->SetPropertyULONG32("delay", ulDelay);
  1183.     }
  1184.     if(pElement->m_ulDuration != (UINT32)-1)
  1185.     {
  1186. pValues->SetPropertyULONG32("duration", pElement->m_ulDuration);
  1187.     }
  1188.     if(pElement->m_ulMaxDuration != (UINT32)-1)
  1189.     {
  1190. pValues->SetPropertyULONG32("maxduration", pElement->m_ulMaxDuration);
  1191.     }
  1192.     if(pElement->m_ulClipBegin != (UINT32)-1)
  1193.     {
  1194. pValues->SetPropertyULONG32("start", pElement->m_ulClipBegin);
  1195.     }
  1196.     if(pElement->m_ulClipEnd != (UINT32)-1)
  1197.     {
  1198. pValues->SetPropertyULONG32("end", pElement->m_ulClipEnd);
  1199.     }
  1200.     if (pElement->m_pNode->m_repeatTag !=
  1201. RepeatUnknown)
  1202.     {
  1203. pValues->SetPropertyULONG32("repeatTag", pElement->m_pNode->m_repeatTag);
  1204.     }
  1205.     if (pElement->m_bIndefiniteDuration)
  1206.     {
  1207. pValues->SetPropertyULONG32("indefiniteduration", TRUE);
  1208.     }
  1209.     
  1210.     // add arbitrary name-value pairs to track
  1211.     if(pElement->m_pNode->m_pValues)
  1212.     {
  1213. IHXValues* pSrcValues = pElement->m_pNode->m_pValues;
  1214. const char* pName = 0;
  1215. IHXBuffer* pValue = 0;
  1216. HX_RESULT rCode = pSrcValues->GetFirstPropertyCString(
  1217.     pName, pValue);
  1218. while(HXR_OK == rCode)
  1219. {
  1220.     // skip the values we already have or have overridden...
  1221.     if((strcasecmp(pName, "url") != 0) &&
  1222.        (strcasecmp(pName, "id") != 0) &&
  1223.        (strcasecmp(pName, "playto") != 0) &&
  1224.        (strcasecmp(pName, "fill") != 0))
  1225.     {
  1226. setProperty(pValues, pName, 
  1227.     (const char*)pValue->GetBuffer());
  1228.     }
  1229.     HX_RELEASE(pValue);
  1230.     rCode = pSrcValues->GetNextPropertyCString(
  1231. pName, pValue);
  1232. }
  1233. HX_RELEASE(pValue);
  1234.     }
  1235. #ifdef _DEBUG
  1236.     // just resolve this puppy at the outset and send 
  1237.     // to an output file
  1238.     if(m_bShowDependencies)
  1239.     {
  1240. FILE* fp = fopen(SMILDEPFILE, "a");
  1241. if(fp)
  1242. {
  1243.     fprintf(fp, "src %s url %s group %d delay %ldn",
  1244. (const char*)pElement->m_pNode->m_id, 
  1245. (const char*)urlString,
  1246. pElement->m_pNode->m_nGroup,
  1247. (pElement->m_ulBeginOffset != (UINT32)-1) ?
  1248.     pElement->m_ulDelay + pElement->m_ulBeginOffset :
  1249.     pElement->m_ulDelay);
  1250.     fclose(fp);
  1251. }
  1252. // determine duration resolution
  1253. // NOTE - this will give lame results 
  1254. // for values that exceed ulNominalDuration
  1255. const UINT32 ulNominalDuration = 60000; // 1 min nominal
  1256. UINT32 ulDuration = ulNominalDuration;
  1257. if(pElement->m_ulClipEnd != (UINT32)-1)
  1258. {
  1259.     ulDuration = pElement->m_ulClipEnd;
  1260. }
  1261. if(pElement->m_ulDuration != (UINT32)-1)
  1262. {
  1263.     ulDuration = pElement->m_ulDuration;
  1264. }
  1265. if(pElement->m_ulBeginOffset != (UINT32)-1)
  1266. {
  1267.     ulDuration += pElement->m_ulBeginOffset;
  1268. }
  1269. if(pElement->m_ulEndOffset != (UINT32)-1)
  1270. {
  1271.     ulDuration -= pElement->m_ulEndOffset;
  1272. }
  1273. if(pElement->m_ulClipBegin != (UINT32)-1)
  1274. {
  1275.     ulDuration -= pElement->m_ulClipBegin;
  1276. }
  1277. m_pSmilParser->durationResolved(pElement->m_pNode->m_id, ulDuration);
  1278.     }
  1279.     else
  1280.     {
  1281. #if defined(PRE_SHAZAM_SMIL_1_0_CODE)
  1282. IHXGroup* pTempGroup = NULL;
  1283. if (m_pRepeatIDMap->Lookup(pElement->m_pNode->m_repeatid, (void*&)pTempGroup))
  1284. {
  1285.     IHXGroup2* pTempGroup2 = NULL;
  1286.     if (HXR_OK == pTempGroup->QueryInterface(IID_IHXGroup2, (void**)&pTempGroup2))
  1287.     {
  1288. pTempGroup2->AddRepeatTrack(pValues);
  1289.     }
  1290.     HX_RELEASE(pTempGroup2);
  1291. }
  1292. else
  1293. #else
  1294. // /The following was added for SHAZAM since
  1295. // IHXGroup2's AddRepeatTrack() has been deprecated
  1296. // in favor of calling IHXTrack's AddTrack():
  1297. BOOL bRepeatTrackHandled = FALSE;
  1298. SMIL1PlayToAssoc*    pPlayToAssoc = NULL;
  1299.   if(m_pPlayToAssocList)
  1300. {
  1301.     CHXSimpleList::Iterator i = m_pPlayToAssocList->Begin();
  1302.     for ( ;i!=m_pPlayToAssocList->End()  &&  !bRepeatTrackHandled; ++i)
  1303.     {
  1304. SMIL1PlayToAssoc* pThisAssoc = (SMIL1PlayToAssoc*)(*i);
  1305. if (pThisAssoc->m_repeatid ==
  1306. pElement->m_pNode->m_repeatid)
  1307. {
  1308.     IHXGroup2* pGroup2 = NULL;
  1309.     IHXTrack* pHXTrack = NULL;
  1310.     if (HXR_OK == pGroup->QueryInterface(IID_IHXGroup2,
  1311.     (void**)&pGroup2))
  1312.     {
  1313. if (HXR_OK == pGroup2->GetIHXTrack(
  1314. pThisAssoc->m_uTrackIndex, pHXTrack)  &&
  1315. pHXTrack)
  1316. {
  1317.     pHXTrack->AddRepeat(pValues);
  1318.     bRepeatTrackHandled = TRUE;
  1319. }
  1320. HX_RELEASE(pHXTrack);
  1321.     }
  1322.     HX_RELEASE(pGroup2);
  1323. }
  1324.     }
  1325. }
  1326. if (!bRepeatTrackHandled)
  1327. #endif
  1328. {
  1329.     (*m_pRepeatIDMap)[pElement->m_pNode->m_repeatid] = pGroup;
  1330.     pGroup->AddTrack(pValues);
  1331. }
  1332.     }
  1333. #else
  1334. #if defined(PRE_SHAZAM_SMIL_1_0_CODE)
  1335.     IHXGroup* pTempGroup = NULL;
  1336.     if (m_pRepeatIDMap->Lookup(pElement->m_pNode->m_repeatid, (void*&)pTempGroup))
  1337.     {
  1338. IHXGroup2* pTempGroup2 = NULL;
  1339. if (HXR_OK == pTempGroup->QueryInterface(IID_IHXGroup2, (void**)&pTempGroup2))
  1340. {
  1341.     pTempGroup2->AddRepeat(pValues);
  1342. }
  1343. HX_RELEASE(pTempGroup2);
  1344.     }
  1345.     else
  1346. #else
  1347.     // /The following was added for SHAZAM since
  1348.     // IHXGroup2's AddRepeatTrack() has been deprecated
  1349.     // in favor of calling IHXTrack's AddTrack():
  1350.     BOOL bRepeatTrackHandled = FALSE;
  1351.     SMIL1PlayToAssoc*    pPlayToAssoc = NULL;
  1352.       if(m_pPlayToAssocList)
  1353.     {
  1354. CHXSimpleList::Iterator i = m_pPlayToAssocList->Begin();
  1355. for ( ;i!=m_pPlayToAssocList->End()  &&  !bRepeatTrackHandled; ++i)
  1356. {
  1357.     SMIL1PlayToAssoc* pThisAssoc = (SMIL1PlayToAssoc*)(*i);
  1358.     if (pThisAssoc->m_repeatid ==
  1359.     pElement->m_pNode->m_repeatid)
  1360.     {
  1361. IHXGroup2* pGroup2 = NULL;
  1362. IHXTrack* pHXTrack = NULL;
  1363. if (HXR_OK == pGroup->QueryInterface(IID_IHXGroup2,
  1364. (void**)&pGroup2))
  1365. {
  1366.     if (HXR_OK == pGroup2->GetIHXTrack(
  1367.     pThisAssoc->m_uTrackIndex, pHXTrack)  &&
  1368.     pHXTrack)
  1369.     {
  1370. pHXTrack->AddRepeat(pValues);
  1371. bRepeatTrackHandled = TRUE;
  1372.     }
  1373.     HX_RELEASE(pHXTrack);
  1374. }
  1375. HX_RELEASE(pGroup2);
  1376.     }
  1377. }
  1378.     }
  1379.     if (!bRepeatTrackHandled)
  1380. #endif
  1381.     {
  1382. (*m_pRepeatIDMap)[pElement->m_pNode->m_repeatid] = pGroup;
  1383. pGroup->AddTrack(pValues);
  1384.     }
  1385. #endif
  1386.     pValues->Release();
  1387. }
  1388.     }
  1389.     return rc;
  1390. }
  1391. HX_RESULT
  1392. CSmil1DocumentRenderer::handleSourceUpdate(CSmil1SourceUpdate* pElement)
  1393. {
  1394.     HX_RESULT rc = HXR_OK;
  1395.     const char* pID = (const char*)pElement->m_srcID;
  1396.     // determine whether this source has been initialized yet...
  1397.     SMIL1PlayToAssoc* pPlayToAssoc = 0;
  1398.     if(m_pPlayToAssocList)
  1399.     {
  1400. CHXSimpleList::Iterator i;
  1401. for(i=m_pPlayToAssocList->Begin();i!=m_pPlayToAssocList->End();++i)
  1402. {
  1403.     SMIL1PlayToAssoc* pThisAssoc = (SMIL1PlayToAssoc*)(*i);
  1404.     if(pThisAssoc->m_id == pID)
  1405.     {
  1406. pPlayToAssoc = pThisAssoc;
  1407. break;
  1408.     }
  1409. }
  1410.     }
  1411.     if(pPlayToAssoc &&
  1412. pPlayToAssoc->m_sourceMap.GetCount() > 0)
  1413.     {
  1414.         CSmil1Element* pThisElement = 
  1415.     m_pSmilParser->findElement(pID);
  1416. if(pThisElement->m_ulBeginOffset != (UINT32)-1)
  1417. {
  1418.     if(pElement->m_ulUpdatedDuration > pThisElement->m_ulBeginOffset)
  1419.     {
  1420. updateStreamTiming(pID, pElement->m_ulUpdatedDuration -
  1421.     pThisElement->m_ulBeginOffset);
  1422.     }
  1423.     else
  1424.     {
  1425. updateStreamTiming(pID, 0);
  1426.     }
  1427. }
  1428. else
  1429. {
  1430.     updateStreamTiming(pID, pElement->m_ulUpdatedDuration);
  1431. }
  1432.     }
  1433.     else
  1434.     {
  1435. // stick it into the deferred map,
  1436. // it will be handled in RendererInitialized()
  1437. if(!m_pDeferredSourceMap)
  1438. {
  1439.     m_pDeferredSourceMap = new CHXMapStringToOb;
  1440. }
  1441. SMIL1DeferredSourceInfo* pInfo = new SMIL1DeferredSourceInfo;
  1442. pInfo->m_ulDuration = pElement->m_ulUpdatedDuration;
  1443. pInfo->m_ulDelay = 0;
  1444. // /Fixes mem leak when pID is already in the map:
  1445. SMIL1DeferredSourceInfo* pTmpInfo;
  1446. if (m_pDeferredSourceMap->Lookup(pID, (void*&)pTmpInfo))
  1447. {
  1448.     HX_DELETE(pTmpInfo);
  1449. }
  1450. (*m_pDeferredSourceMap)[pID] = pInfo;
  1451.     }
  1452.     return rc;
  1453. }
  1454. HX_RESULT
  1455. CSmil1DocumentRenderer::handleEndLayout(CSmil1EndLayout* pElement)
  1456. {
  1457.     return setupRootLayout();
  1458. }
  1459. HX_RESULT CSmil1DocumentRenderer::setupRootLayout()
  1460. {
  1461.     HX_RESULT rc = HXR_OK;
  1462.     IUnknown* pThisUnk = 0;
  1463.     if(HXR_OK == QueryInterface(IID_IUnknown, (void**)&pThisUnk))
  1464.     {
  1465. m_pParent->HandleAddLayoutSiteGroup(pThisUnk);
  1466. pThisUnk->Release();
  1467. m_bSiteLayoutComplete = TRUE;
  1468.     }
  1469.     createRegionSites();
  1470.     // force initial redraw
  1471.     HXxSize siteWinSize;
  1472.     if (m_pMISUSSite)
  1473.     {
  1474. m_pMISUSSite->GetSize(siteWinSize);
  1475. CHXxRect updateRect(0, 0, siteWinSize.cx, siteWinSize.cy);
  1476. m_pMISUSSite->DamageRect(updateRect);
  1477. #ifndef  _WIN32
  1478. m_pMISUSSite->ForceRedraw();
  1479. #endif
  1480.     }
  1481.     return rc;
  1482. }
  1483. HX_RESULT
  1484. CSmil1DocumentRenderer::handleMeta(CSmil1Meta* pElement)
  1485. {
  1486.     HX_RESULT rc = HXR_OK;
  1487.     IHXPlayer* pPlayer = m_pParent->getPlayer();
  1488.     IHXGroupManager* pMgr = NULL;
  1489.     IHXValues* pValues = NULL;
  1490.     if(pElement->m_name.GetLength() > 0)
  1491.     {
  1492. if(HXR_OK == pPlayer->QueryInterface(IID_IHXGroupManager, (void**)&pMgr))
  1493. {
  1494.     pValues = pMgr->GetPresentationProperties();
  1495.     if(!pValues)
  1496.     {
  1497. pValues = new CHXOrderedValues;
  1498. pValues->AddRef();
  1499. pMgr->SetPresentationProperties(pValues);
  1500.     }
  1501.     IHXBuffer* pBuf = new CHXBuffer;
  1502.     pBuf->AddRef();
  1503.     pBuf->Set((BYTE*)(const char*)pElement->m_content,
  1504. pElement->m_content.GetLength()+1);
  1505.     pValues->SetPropertyCString((const char*)pElement->m_name,
  1506. pBuf);
  1507.     pBuf->Release();
  1508.     pValues->Release();
  1509.     pMgr->Release();
  1510. }
  1511.     }
  1512.     return rc;
  1513. }
  1514. HX_RESULT
  1515. CSmil1DocumentRenderer::handleRendererPreFetch(CSmil1RendererPreFetch *pRend)
  1516. {
  1517.     HX_RESULT rc = HXR_OK;
  1518.     const char* pMimeType = (const char*)pRend->m_mimeType;
  1519.     IHXRendererUpgrade* pUpgrade = 0;
  1520.     if(m_pContext)
  1521.     {
  1522. IHXSystemRequired* pISystemRequired = NULL;
  1523. m_pContext->QueryInterface(IID_IHXSystemRequired, 
  1524.     (void**)&pISystemRequired);
  1525. CHXBuffer* pBuffer = new CHXBuffer;
  1526. pBuffer->AddRef();
  1527. pBuffer->Set((BYTE*)pMimeType, strlen(pMimeType)+1);
  1528. if (pISystemRequired)
  1529. {
  1530.     IHXUpgradeCollection* pUpgradeCollection = NULL;
  1531.     IHXPlayer* pPlayer = m_pParent->getPlayer();     
  1532.     if(pPlayer)
  1533. pPlayer->QueryInterface(IID_IHXUpgradeCollection, (void**)&pUpgradeCollection);
  1534.     if(pUpgradeCollection)
  1535.     {
  1536. pUpgradeCollection->Add(eUT_Required, pBuffer, 0, 0);
  1537. // HasFeatures() calls removes all existing features from pUpgradeCollection.
  1538. pISystemRequired->HasFeatures(pUpgradeCollection);
  1539.     }
  1540.     HX_RELEASE(pUpgradeCollection);
  1541.     HX_RELEASE(pISystemRequired);
  1542. }
  1543. HX_RELEASE(pBuffer);
  1544.     }
  1545.     return rc;
  1546. }
  1547. HX_RESULT
  1548. CSmil1DocumentRenderer::insertEvent(CSmil1ShowSiteEvent* pEvent)
  1549. {
  1550.     if(!m_pEventList)
  1551.     {
  1552. m_pEventList = new CHXSimpleList;
  1553.     }
  1554.     LISTPOSITION lPos = m_pEventList->GetHeadPosition();
  1555.     LISTPOSITION lPrev = lPos;
  1556.     BOOL bInserted = FALSE;
  1557.     while(lPos)
  1558.     {
  1559. CSmil1ShowSiteEvent* pThisEvent = 
  1560.     (CSmil1ShowSiteEvent*)m_pEventList->GetNext(lPos);
  1561. if(pThisEvent->m_ulEventTime == pEvent->m_ulEventTime &&
  1562.     pThisEvent->getRegionSite() == pEvent->getRegionSite())
  1563. {
  1564.     if(pEvent->showSite())
  1565.     {
  1566. if(!lPos)
  1567. {
  1568.     m_pEventList->AddTail(pEvent);
  1569.     bInserted = TRUE;
  1570.     break;
  1571. }
  1572. // find position of last 'hide' event at this time
  1573. while(lPos &&
  1574.     pThisEvent->m_ulEventTime == pEvent->m_ulEventTime &&
  1575.     pThisEvent->getRegionSite() == pEvent->getRegionSite() &&
  1576.     !pThisEvent->showSite())
  1577. {
  1578.     lPrev = lPos;
  1579.     pThisEvent = (CSmil1ShowSiteEvent*)m_pEventList->GetNext(lPos);
  1580. }
  1581.     }
  1582.     m_pEventList->InsertBefore(lPrev, pEvent);
  1583.     bInserted = TRUE;
  1584.     break;
  1585. }
  1586. else if(pThisEvent->m_ulEventTime > pEvent->m_ulEventTime)
  1587. {
  1588.     m_pEventList->InsertBefore(lPrev, pEvent);
  1589.     bInserted = TRUE;
  1590.     break;
  1591. }
  1592. lPrev = lPos;
  1593.     }
  1594.     if(!bInserted)
  1595.     {
  1596. // not inserted, stick it on the end of the list
  1597. m_pEventList->AddTail(pEvent);
  1598.     }
  1599.     // set list position member
  1600.     m_ulEventListPosition = m_pEventList->GetHeadPosition();
  1601.     return HXR_OK;
  1602. }
  1603. CSmil1ShowSiteEvent* 
  1604. CSmil1DocumentRenderer::getShowHideEvent(IHXSite*  pRegionSite,
  1605.  IHXSite*  pRendererSite,
  1606.                                          BOOL     bShowEvent)
  1607. {
  1608.     CSmil1ShowSiteEvent* pRet = NULL;
  1609.     if (m_pEventList && pRegionSite)
  1610.     {
  1611.         LISTPOSITION pos = m_pEventList->GetHeadPosition();
  1612.         while (pos)
  1613.         {
  1614.             CSmil1ShowSiteEvent* pEvent = (CSmil1ShowSiteEvent*) m_pEventList->GetNext(pos);
  1615.             if (pEvent)
  1616.             {
  1617.                 if (pEvent->showSite() == bShowEvent     &&
  1618.     pEvent->getRegionSite() == pRegionSite  &&
  1619.     pEvent->getRendererSite() == pRendererSite)
  1620.                 {
  1621.                     pRet = pEvent;
  1622.                     break;
  1623.                 }
  1624.             }
  1625.         }
  1626.     }
  1627.     return pRet;
  1628. }
  1629. HX_RESULT
  1630. CSmil1DocumentRenderer::insertSiteInfo(void* pVoidInfo)
  1631. {
  1632.     if(!m_pSiteInfoList)
  1633.     {
  1634. m_pSiteInfoList = new CHXSimpleList;
  1635.     }
  1636.     SMIL1SiteInfo* pInfo = (SMIL1SiteInfo*)pVoidInfo;
  1637.     LISTPOSITION lPos = m_pSiteInfoList->GetHeadPosition();
  1638.     LISTPOSITION lPrev = lPos;
  1639.     BOOL bInserted = FALSE;
  1640.     while(lPos)
  1641.     {
  1642. SMIL1SiteInfo* pThisInfo = 
  1643.     (SMIL1SiteInfo*)m_pSiteInfoList->GetNext(lPos);
  1644. if(pThisInfo->m_ulDelay > pInfo->m_ulDelay)
  1645. {
  1646.     m_pSiteInfoList->InsertBefore(lPrev, pInfo);
  1647.     bInserted = TRUE;
  1648.     break;
  1649. }
  1650. lPrev = lPos;
  1651.     }
  1652.     if(!bInserted)
  1653.     {
  1654. // not inserted, stick it on the end of the list
  1655. m_pSiteInfoList->AddTail(pInfo);
  1656.     }
  1657.     return HXR_OK;
  1658. }
  1659. void
  1660. CSmil1DocumentRenderer::resizeSite(IHXSite* pSite,
  1661.   double dXScale,
  1662.   double dYScale)
  1663. {
  1664.     if (!pSite)
  1665.     {
  1666. return;
  1667.     }
  1668.     HXxSize oldChildSize;
  1669.     HXxPoint oldChildPosition;
  1670.     pSite->GetSize(oldChildSize);
  1671.     pSite->GetPosition(oldChildPosition);
  1672.     HXxSize newChildSize;
  1673.     HXxPoint newChildPosition;
  1674.     newChildSize.cx = (INT32)(dXScale * (double)(oldChildSize.cx) + 0.5);
  1675.     newChildSize.cy = (INT32)(dYScale * (double)(oldChildSize.cy) + 0.5);
  1676.     newChildPosition.x = (INT32)(dXScale*(double)(oldChildPosition.x) + 0.5);
  1677.     newChildPosition.y = (INT32)(dYScale*(double)(oldChildPosition.y) + 0.5);
  1678.     CSmil1SiteWatcher* pSiteWatcher = NULL;
  1679.     if(m_pSiteWatcherMap && m_pSiteWatcherMap->Lookup(pSite, (void*&)pSiteWatcher))
  1680.     {
  1681. pSiteWatcher->SiteChangingSize(TRUE);
  1682. //        char szDbgStr[128];
  1683. //        DEBUGPRINTF(szDbgStr, "(%ld,%ld) ", newChildSize.cx, newChildSize.cy);
  1684. pSite->SetSize(newChildSize);
  1685. pSiteWatcher->SiteChangingSize(FALSE);
  1686.     }
  1687.     else
  1688.     {
  1689. //        char szDbgStr[128];
  1690. //        DEBUGPRINTF(szDbgStr, "(%ld,%ld) ", newChildSize.cx, newChildSize.cy);
  1691. pSite->SetSize(newChildSize);
  1692.     }
  1693. //    char szDbgStr[128];
  1694. //    DEBUGPRINTF(szDbgStr, "repos to (%ld,%ld)n", newChildPosition.x, newChildPosition.y);
  1695.     pSite->SetPosition(newChildPosition);
  1696.     CHXxRect updateRect(0, 0, newChildSize.cx, newChildSize.cy);
  1697.     pSite->DamageRect(updateRect);
  1698. #ifndef  _WIN32
  1699.     pSite->ForceRedraw();
  1700. #endif
  1701. }
  1702. void CSmil1DocumentRenderer::resizeRegionSiteAbs(CSmil1BasicRegion* pRegion,
  1703.                                                 double            dXAbsScale,
  1704.                                                 double            dYAbsScale)
  1705. {
  1706.     if (pRegion && pRegion->m_pSite)
  1707.     {
  1708.         HXxSize  cSize = {0, 0};
  1709.         HXxPoint cPos  = {0, 0};
  1710.         cPos.x         = (INT32) floor(dXAbsScale * ((double) pRegion->m_originalRect.left) + 0.5);
  1711.         cPos.y         = (INT32) floor(dYAbsScale * ((double) pRegion->m_originalRect.top)  + 0.5);
  1712.         cSize.cx       = (INT32) floor(dXAbsScale * ((double) HXxRECT_WIDTH(pRegion->m_originalRect)) + 0.5);
  1713.         cSize.cy       = (INT32) floor(dYAbsScale * ((double) HXxRECT_HEIGHT(pRegion->m_originalRect)) + 0.5);
  1714.         CSmil1SiteWatcher* pSiteWatcher = NULL;
  1715.         if(m_pSiteWatcherMap && m_pSiteWatcherMap->Lookup(pRegion->m_pSite, (void*&)pSiteWatcher))
  1716.         {
  1717.     pSiteWatcher->SiteChangingSize(TRUE);
  1718. //            char szDbgStr[128];
  1719. //            DEBUGPRINTF(szDbgStr, "(%ld,%ld) ", cSize.cx, cSize.cy);
  1720.     pRegion->m_pSite->SetSize(cSize);
  1721.     pSiteWatcher->SiteChangingSize(FALSE);
  1722.         }
  1723.         else
  1724.         {
  1725. //            char szDbgStr[128];
  1726. //            DEBUGPRINTF(szDbgStr, "(%ld,%ld) ", cSize.cx, cSize.cy);
  1727.     pRegion->m_pSite->SetSize(cSize);
  1728.         }
  1729. //        char szDbgStr[128];
  1730. //        DEBUGPRINTF(szDbgStr, "repos to (%ld,%ld)n", cPos.x, cPos.y);
  1731.         pRegion->m_pSite->SetPosition(cPos);
  1732.         pRegion->m_rect.left   = cPos.x;
  1733.         pRegion->m_rect.top    = cPos.y;
  1734.         pRegion->m_rect.right  = cPos.x + cSize.cx;
  1735.         pRegion->m_rect.bottom = cPos.y + cSize.cy;
  1736.         CHXxRect updateRect(0, 0, cSize.cx, cSize.cy);
  1737.         pRegion->m_pSite->DamageRect(updateRect);
  1738. #ifndef  _WIN32
  1739.         pRegion->m_pSite->ForceRedraw();
  1740. #endif
  1741.     }
  1742. }
  1743. void
  1744. CSmil1DocumentRenderer::resizeSite(HXxSize newSize)
  1745. {
  1746.     double dXScale = 1.0;
  1747.     double dYScale = 1.0;
  1748.     if(newSize.cx       > 0 &&
  1749.        newSize.cy       > 0 &&
  1750.        m_topSiteSize.cx > 0 &&
  1751.        m_topSiteSize.cy > 0)
  1752.     {
  1753. dXScale = (double)newSize.cx / (double)m_topSiteSize.cx;
  1754. dYScale = (double)newSize.cy / (double)m_topSiteSize.cy;
  1755.     }
  1756.     double dXAbsScale = 1.0;
  1757.     double dYAbsScale = 1.0;
  1758.     if (m_topSiteOriginalSize.cx > 0 &&
  1759.         m_topSiteOriginalSize.cy > 0)
  1760.     {
  1761.         dXAbsScale = (double) newSize.cx / (double) m_topSiteOriginalSize.cx;
  1762.         dYAbsScale = (double) newSize.cy / (double) m_topSiteOriginalSize.cy;
  1763.     }
  1764.     m_topSiteSize.cx = newSize.cx;
  1765.     m_topSiteSize.cy = newSize.cy;
  1766.     BOOL bSetOriginalSize = FALSE;
  1767.     if(m_topSiteSize.cx == m_topSiteOriginalSize.cx &&
  1768. m_topSiteSize.cy == m_topSiteOriginalSize.cy)
  1769.     {
  1770. bSetOriginalSize = TRUE;
  1771. m_dResizeXScale = 1.0;
  1772. m_dResizeYScale = 1.0;
  1773.     }
  1774.     else
  1775.     {
  1776. m_dResizeXScale = dXScale;
  1777. m_dResizeYScale = dYScale;
  1778.     }
  1779.     if(m_pRegionMap)
  1780.     {
  1781. // scale regions
  1782. CHXMapStringToOb::Iterator i = m_pRegionMap->Begin();
  1783. for(; i != m_pRegionMap->End(); ++i)
  1784. {
  1785.             BOOL bAbs = FALSE;
  1786.     CSmil1BasicRegion* pRegion = (CSmil1BasicRegion*)(*i);
  1787.             if ((m_bRootLayoutWidthSet || m_ulNoRootLayoutWidth) &&
  1788.                 (m_bRootLayoutHeightSet || m_ulNoRootLayoutHeight) &&
  1789.                 !pRegion->m_bWidthUnspecified &&
  1790.                 !pRegion->m_bHeightUnspecified)
  1791.             {
  1792.                 bAbs = TRUE;
  1793. //                char szDbgStr[128];
  1794. //                DEBUGPRINTF(szDbgStr, "region %s abs resizing to ", (const char*) pRegion->m_region);
  1795.                 resizeRegionSiteAbs(pRegion, dXAbsScale, dYAbsScale);
  1796.             }
  1797.             else
  1798.             {
  1799. //                char szDbgStr[128];
  1800. //                DEBUGPRINTF(szDbgStr, "region %s resizing to ", (const char*) pRegion->m_region);
  1801.                 resizeSite(pRegion->m_pSite, dXScale, dYScale);
  1802.             }
  1803.     SMIL1PlayToAssoc* pAssoc = getPlayToAssoc(pRegion->m_region);
  1804.     if(bSetOriginalSize)
  1805.     {
  1806. pRegion->m_rect = pRegion->m_originalRect;
  1807. //Helps fix PR 11265:
  1808. pRegion->m_mediaSize.cx = pRegion->m_originalMediaSize.cx;
  1809. pRegion->m_mediaSize.cy = pRegion->m_originalMediaSize.cy;
  1810. if(pAssoc && pAssoc->m_pHyperlinks)
  1811. {
  1812.     CHXSimpleList::Iterator i = pAssoc->m_pHyperlinks->Begin();
  1813.     for(; i != pAssoc->m_pHyperlinks->End(); ++i)
  1814.     {
  1815. CSmil1AAnchorElement* pAnchor = 
  1816.     (CSmil1AAnchorElement*)(*i);
  1817. pAnchor->rescale(0.0, 0.0, TRUE);   // set to original coords
  1818.     }
  1819. }
  1820.     }
  1821.     else
  1822.             {
  1823.                 if (!bAbs)
  1824.                 {
  1825.     // Fix for PR 17415
  1826.     // dXScale & dYScale are reletive to the current size, 
  1827.     UINT32 ulNewLeft = (INT32)(dXScale * 
  1828.         (double)(pRegion->m_rect.left) + 0.5);
  1829.     UINT32 ulNewTop = (INT32)(dYScale * 
  1830.         (double)(pRegion->m_rect.top) + 0.5);
  1831.     UINT32 ulNewWidth = (INT32)(dXScale * 
  1832.                   (double)(pRegion->m_rect.right -
  1833.         pRegion->m_rect.left) + 0.5);
  1834.     UINT32 ulNewHeight = (INT32)(dYScale * 
  1835.         (double)(pRegion->m_rect.bottom -
  1836.         pRegion->m_rect.top) + 0.5);
  1837.     pRegion->m_rect.left = ulNewLeft;
  1838.     pRegion->m_rect.top = ulNewTop;
  1839.     pRegion->m_rect.right = ulNewLeft + ulNewWidth;
  1840.     pRegion->m_rect.bottom = ulNewTop + ulNewHeight;
  1841.     //Fixes PR 11265:
  1842.     pRegion->m_mediaSize.cx = ulNewWidth;
  1843.     pRegion->m_mediaSize.cy = ulNewHeight;
  1844.                 }
  1845. if(pAssoc && pAssoc->m_pHyperlinks)
  1846. {
  1847.     CHXSimpleList::Iterator i = pAssoc->m_pHyperlinks->Begin();
  1848.     for(; i != pAssoc->m_pHyperlinks->End(); ++i)
  1849.     {
  1850. CSmil1AAnchorElement* pAnchor = 
  1851.     (CSmil1AAnchorElement*)(*i);
  1852. pAnchor->rescale(dXScale, dYScale, FALSE);
  1853.     }
  1854. }
  1855.     }
  1856. }
  1857.     }
  1858.     if(m_pSiteInfoList)
  1859.     {
  1860. // scale current renderer sites
  1861. CHXSimpleList::Iterator i = m_pSiteInfoList->Begin();
  1862. for(; i != m_pSiteInfoList->End(); ++i)
  1863. {
  1864.     SMIL1SiteInfo* pSiteInfo = (SMIL1SiteInfo*)(*i);
  1865. //            char szDbgStr[128];
  1866. //            DEBUGPRINTF(szDbgStr, "media in region %s resizing to ",
  1867. //                        (const char*) pSiteInfo->m_regionID);
  1868.             // See if we can look up a region
  1869.             CSmil1BasicRegion* pReg = getRegion((const char*) pSiteInfo->m_regionID);
  1870.             if (pReg)
  1871.             {
  1872.                 // Compute the media layout at original scale
  1873.                 HXxSize cOrigRegSize = {0, 0};
  1874.                 cOrigRegSize.cx      = HXxRECT_WIDTH(pReg->m_originalRect);
  1875.                 cOrigRegSize.cy      = HXxRECT_HEIGHT(pReg->m_originalRect);
  1876.                 HXxSize cFitSize     = pReg->m_originalMediaSize;
  1877.                 computeMediaFitSize(cOrigRegSize, pReg->m_originalMediaSize,
  1878.                                     pReg->m_fit, cFitSize);
  1879.                 // Now scale the original media size
  1880.                 HXxSize cScaledFitSize = {0, 0};
  1881.                 cScaledFitSize.cx = (INT32) ((double) cFitSize.cx * dXAbsScale + 0.5);
  1882.                 cScaledFitSize.cy = (INT32) ((double) cFitSize.cy * dYAbsScale + 0.5);
  1883.                 // Get the site watcher
  1884.                 CSmil1SiteWatcher* pSW = NULL;
  1885.                 if(m_pSiteWatcherMap)
  1886.                 {
  1887.                     void* pVoid = NULL;
  1888.                     if (m_pSiteWatcherMap->Lookup(pSiteInfo->m_pRendererSite, pVoid))
  1889.                     {
  1890.                         pSW = (CSmil1SiteWatcher*) pVoid;
  1891.                     }
  1892.                 }
  1893.                 // Set the "disable" flag in the site watcher
  1894.                 if (pSW) pSW->SiteChangingSize(TRUE);
  1895.                 // Set the size
  1896. //                DEBUGPRINTF(szDbgStr, "(%ld,%ld)n", cScaledFitSize.cx, cScaledFitSize.cy);
  1897.                 if(pSiteInfo && pSiteInfo->m_pRendererSite)
  1898.                       pSiteInfo->m_pRendererSite->SetSize(cScaledFitSize);
  1899.                 
  1900.                 // Clear the "disable" flag in the site watcher
  1901.                 if (pSW) pSW->SiteChangingSize(FALSE);
  1902.             }
  1903.             else
  1904.             {
  1905.                 // Do what we normally do
  1906.                 resizeSite(pSiteInfo->m_pRendererSite, dXScale, dYScale);
  1907.             }
  1908. }
  1909.     }
  1910. }
  1911. HX_RESULT
  1912. CSmil1DocumentRenderer::onTimeSync(UINT32 ulTimeValue)
  1913. {
  1914. //    char szDbgStr[128];
  1915. //    DEBUGPRINTF(szDbgStr, "onTimeSync(%lu)n", ulTimeValue);
  1916.     HX_RESULT rc = HXR_OK;
  1917.     m_ulCurrentTime = ulTimeValue;
  1918.     if(!m_bFirstTimeSync)
  1919.     {
  1920. // draw background and regions
  1921. m_bFirstTimeSync = TRUE;
  1922. // now I should force a background redraw...
  1923. if(m_pMISUSSite)
  1924. {
  1925.     HXxSize siteWinSize;
  1926.     m_pMISUSSite->GetSize(siteWinSize);
  1927.     CHXxRect updateRect(0, 0, siteWinSize.cx, siteWinSize.cy);
  1928.     m_pMISUSSite->DamageRect(updateRect);
  1929.     m_pMISUSSite->ForceRedraw();
  1930.     if(m_pRegionMap)
  1931.     {
  1932. CHXMapStringToOb::Iterator i = m_pRegionMap->Begin();
  1933. for(; i != m_pRegionMap->End(); ++i)
  1934. {
  1935.     CSmil1BasicRegion* pRegion = (CSmil1BasicRegion*)(*i);
  1936.     if(pRegion->m_pSite)
  1937.     {
  1938. pRegion->m_pSite->GetSize(siteWinSize);
  1939. CHXxRect siteRect(0, 0, siteWinSize.cx, siteWinSize.cy);
  1940. pRegion->m_pSite->DamageRect(siteRect);
  1941. pRegion->m_pSite->ForceRedraw();
  1942.     }
  1943. }
  1944.     }
  1945. }
  1946.     }
  1947.     rc = flushAllEvents( ulTimeValue, TRUE );
  1948.     return rc;
  1949. }
  1950. void
  1951. CSmil1DocumentRenderer::RemoveEvents(UINT32 ulGroupIndex, IHXSite* pSite)
  1952. {
  1953.     // handle all events up to time ulFlushToTime + ulGranularity
  1954.     HX_RESULT rc = HXR_OK;
  1955.     if(m_pEventList)
  1956.     {
  1957. LISTPOSITION lPos = m_pEventList->GetHeadPosition();
  1958. while(lPos && m_pEventList->GetCount())
  1959. {
  1960.     // handle all events at or before ulTimeValue
  1961.     CSmil1ShowSiteEvent* pEvent = (CSmil1ShowSiteEvent*)m_pEventList->GetAt(lPos);
  1962.     if(pEvent->m_uGroupIndex == ulGroupIndex &&
  1963.        pEvent->getRendererSite() == pSite)
  1964.     {
  1965. HX_DELETE(pEvent);
  1966. lPos = m_pEventList->RemoveAt(lPos);
  1967.     }
  1968.     else
  1969.     {
  1970. m_pEventList->GetNext(lPos);
  1971.     }
  1972. }
  1973. // set list position member
  1974. m_ulEventListPosition = m_pEventList->GetHeadPosition();
  1975.     }
  1976.     return;
  1977. }
  1978. HX_RESULT CSmil1DocumentRenderer::flushAllEvents( UINT32 ulFlushToTime, BOOL bBreak)
  1979. {
  1980.     // handle all events up to time ulFlushToTime + ulGranularity
  1981.     HX_RESULT rc = HXR_OK;
  1982.     if(m_pEventList && m_pEventList->GetCount() > 0)
  1983.     {
  1984. //LISTPOSITION lPos = m_pEventList->GetHeadPosition();
  1985. while(m_ulEventListPosition)
  1986. {
  1987.     // handle events which have eventTime<=ulFlushToTime+ulGranularity
  1988.     CSmil1LayoutEvent* pEvent
  1989. = (CSmil1LayoutEvent*) m_pEventList->GetAt(m_ulEventListPosition);
  1990. //{FILE* f1 = ::fopen("c:\temp\out.txt", "a+"); ::fprintf(f1, "Flush Events pEvent=%lun", pEvent);::fclose(f1);}
  1991.     
  1992. #ifdef _MACINTOSH
  1993.     // XXXBobClark:
  1994.     // On the Mac side, our site's ShowSite implementation
  1995.     // draws synchronously: right then. On Windows, it draws
  1996.     // asynchronously by setting up a callback. The upshot is
  1997.     // that on Windows you can get away with a ShowSite(TRUE)
  1998.     // followed immediately by a ShowSite(FALSE), because the
  1999.     // actual screen won't get updated while the site is
  2000.     // briefly visible. But on the Mac it will show a visible
  2001.     // flicker. So the interim workaround here is to check the
  2002.     // events we're flushing; if we're showing a site that will
  2003.     // be hidden by the time the flush is done (or vice versa),
  2004.     // we ignore that event.
  2005.     LISTPOSITION tempPos = m_ulEventListPosition;
  2006.     BOOL bCurrentEventCancelledOutByFutureEvent = FALSE;
  2007.     CSmil1ShowSiteEvent* pCurrentEvent = (CSmil1ShowSiteEvent*)pEvent;
  2008.     m_pEventList->GetNext(tempPos); // to start with the next position...
  2009.     while (tempPos)
  2010.     {
  2011. CSmil1ShowSiteEvent* pFutureEvent = (CSmil1ShowSiteEvent*)m_pEventList->GetAt(tempPos);
  2012. if ( !pFutureEvent
  2013.      || pFutureEvent->m_ulEventTime > ulFlushToTime)
  2014. {
  2015.     break;
  2016. }
  2017. if ( pFutureEvent && pCurrentEvent
  2018. && pCurrentEvent->m_pSite == pFutureEvent->m_pSite
  2019. && pCurrentEvent->m_pRegionSite == pFutureEvent->m_pRegionSite
  2020. && pCurrentEvent->m_bShowSite != pFutureEvent->m_bShowSite )
  2021. {
  2022.     bCurrentEventCancelledOutByFutureEvent = TRUE;
  2023.     break;
  2024. }
  2025. m_pEventList->GetNext(tempPos);
  2026.     }
  2027. #endif
  2028.     // no need of granularity since the core will
  2029.     // ensure we call OnTimeSync at the end of its duration
  2030.     if (pEvent &&
  2031. pEvent->m_ulEventTime <= ulFlushToTime)
  2032.     {
  2033. #ifdef _MACINTOSH
  2034.       if (!bCurrentEventCancelledOutByFutureEvent)
  2035. #endif
  2036. rc = pEvent->handleEvent();
  2037. //lPos = m_pEventList->RemoveAt(lPos);
  2038.     }
  2039.     else if( bBreak )
  2040.     {
  2041. break;
  2042.     }
  2043.     m_pEventList->GetNext(m_ulEventListPosition);
  2044. }
  2045.     }
  2046.     return rc;
  2047. }
  2048. BOOL
  2049. CSmil1DocumentRenderer::IsFullScreen()
  2050. {
  2051.     BOOL bRet = FALSE;
  2052.     if (m_pMISUSSite)
  2053.     {
  2054. IHXSiteFullScreen* pFull = NULL;
  2055. m_pMISUSSite->QueryInterface(IID_IHXSiteFullScreen, (void**) &pFull);
  2056. if (pFull)
  2057. {
  2058.     bRet = pFull->IsFullScreen();
  2059. }
  2060. HX_RELEASE(pFull);
  2061.     }
  2062.     return bRet;
  2063. }
  2064. void CSmil1DocumentRenderer::computeMediaFitSize(HXxSize      cRegSize,
  2065.                                                  HXxSize      cMedSize,
  2066.                                                  const char*  pszFitAttr,
  2067.                                                  REF(HXxSize) rcFitSize)
  2068. {
  2069.     UINT32 ulFit = 0; // 0=hidden, 1=fill, 2=meet, 3=slice, 4=scroll
  2070.     if (pszFitAttr)
  2071.     {
  2072.         if (!strcmp(pszFitAttr, "hidden"))
  2073.         {
  2074.             ulFit = 0;
  2075.         }
  2076.         else if (!strcmp(pszFitAttr, "fill"))
  2077.         {
  2078.             ulFit = 1;
  2079.         }
  2080.         else if (!strcmp(pszFitAttr, "meet"))
  2081.         {
  2082.             ulFit = 2;
  2083.         }
  2084.         else if (!strcmp(pszFitAttr, "slice"))
  2085.         {
  2086.             ulFit = 3;
  2087.         }
  2088.         else if (!strcmp(pszFitAttr, "scroll"))
  2089.         {
  2090.             ulFit = 4;
  2091.         }
  2092.     }
  2093.     switch (ulFit)
  2094.     {
  2095.         case 0:
  2096.             {
  2097.                 // fit="hidden"
  2098.                 rcFitSize = cMedSize;
  2099.             }
  2100.             break;
  2101.         case 1:
  2102.             {
  2103.                 // fit="fill"
  2104.                 rcFitSize = cRegSize;
  2105.             }
  2106.             break;
  2107.         case 2:
  2108.             {
  2109.                 // fit="meet"
  2110.                 double dMedAspectRatio = 1.0;
  2111.                 if(cMedSize.cx != 0 && cMedSize.cy != 0)
  2112.                 {
  2113.                     dMedAspectRatio = (double) cMedSize.cx / (double) cMedSize.cy;
  2114.                 }
  2115.                 INT32 lTryHeight = (INT32)((double) cRegSize.cx / dMedAspectRatio + 0.5);
  2116.                 if(lTryHeight > cRegSize.cy)
  2117.                 {
  2118.                     rcFitSize.cx = (INT32) ((double) cRegSize.cy * dMedAspectRatio + 0.5);
  2119.                     rcFitSize.cy = cRegSize.cy;
  2120.                 }
  2121.                 else
  2122.                 {
  2123.                     rcFitSize.cx = cRegSize.cx;
  2124.                     rcFitSize.cy = lTryHeight;
  2125.                 }
  2126.             }
  2127.             break;
  2128.         case 3:
  2129.             {
  2130.                 // fit="slice"
  2131.                 double dMedAspectRatio  = 1.0;
  2132.                 if(cMedSize.cx != 0 && cMedSize.cy != 0)
  2133.                 {
  2134.                     dMedAspectRatio = (double) cMedSize.cx / (double) cMedSize.cy;
  2135.                 }
  2136.                 double dRegAspectRatio = 1.0;
  2137.                 if (cRegSize.cx != 0 && cRegSize.cy != 0)
  2138.                 {
  2139.                     dRegAspectRatio = (double) cRegSize.cx / (double) cRegSize.cy;
  2140.                 }
  2141.                 // fit to greater of region height or width
  2142.                 if(dRegAspectRatio > dMedAspectRatio)
  2143.                 {
  2144.                     rcFitSize.cx = cRegSize.cx;
  2145.                     rcFitSize.cy = (INT32)((double) cRegSize.cx / dMedAspectRatio + 0.5);
  2146.                 }
  2147.                 else
  2148.                 {
  2149.                     rcFitSize.cx = (INT32)((double) cRegSize.cy * dMedAspectRatio + 0.5);
  2150.                     rcFitSize.cy = cRegSize.cy;
  2151.                 }
  2152.             }
  2153.             break;
  2154.         case 4:
  2155.             {
  2156.                 // fit="scroll"
  2157.                 rcFitSize = cMedSize;
  2158.             }
  2159.             break;
  2160.     }
  2161. }
  2162. HX_RESULT CSmil1DocumentRenderer::getPreference(IUnknown*        pContext,
  2163.                                                 const char*      pszKey,
  2164.                                                 REF(IHXBuffer*) rpValue)
  2165. {
  2166.     HX_RESULT retVal = HXR_FAIL;
  2167.     if (pContext && pszKey)
  2168.     {
  2169.         IHXPreferences* pPreferences = NULL;
  2170.         retVal = pContext->QueryInterface(IID_IHXPreferences,
  2171.                                           (void**) &pPreferences);
  2172.         if (SUCCEEDED(retVal))
  2173.         {
  2174.             IHXBuffer* pBuf = NULL;
  2175.             retVal = pPreferences->ReadPref(pszKey, pBuf);
  2176.             if (SUCCEEDED(retVal))
  2177.             {
  2178.                 HX_RELEASE(rpValue);
  2179.                 rpValue = pBuf;
  2180.                 rpValue->AddRef();
  2181.             }
  2182.             HX_RELEASE(pBuf);
  2183.         }
  2184.         HX_RELEASE(pPreferences);
  2185.     }
  2186.     return retVal;
  2187. }
  2188. HX_RESULT CSmil1DocumentRenderer::getBooleanPreference(IUnknown*   pContext,
  2189.                                                        const char* pszKey,
  2190.                                                        REF(BOOL)   rbValue)
  2191. {
  2192.     HX_RESULT retVal = HXR_FAIL;
  2193.     if (pContext && pszKey)
  2194.     {
  2195.         IHXBuffer* pBuf = NULL;
  2196.         retVal = getPreference(pContext, pszKey, pBuf);
  2197.         if (SUCCEEDED(retVal))
  2198.         {
  2199.             INT32 lValue = ::atoi((const char*) pBuf->GetBuffer());
  2200.             if (lValue == 1)
  2201.             {
  2202.                 rbValue = TRUE;
  2203.             }
  2204.         }
  2205.         HX_RELEASE(pBuf);
  2206.     }
  2207.     return retVal;
  2208. }
  2209. HX_RESULT
  2210. CSmil1DocumentRenderer::onPreSeek(UINT32 ulOldTime, UINT32 ulNewTime)
  2211. {
  2212.     HX_RESULT rc = HXR_OK;
  2213. //{FILE* f1 = ::fopen("c:\temp\out.txt", "a+"); ::fprintf(f1, "onPreSeekn");::fclose(f1);}
  2214.     if(m_pSiteInfoList)
  2215.     {
  2216. // hide all regions/sites in current group
  2217. CHXSimpleList::Iterator i = m_pSiteInfoList->Begin();
  2218. for(; i != m_pSiteInfoList->End(); ++i)
  2219. {
  2220.     SMIL1SiteInfo* pSiteInfo = (SMIL1SiteInfo*)(*i);
  2221.     if(pSiteInfo->m_uGroupIndex == m_uCurrentGroupIndex)
  2222.     {
  2223. IHXSite* pRegionSite = NULL;
  2224. CSmil1BasicRegion* pRegion = getRegion(pSiteInfo->m_regionID);
  2225. if(!pRegion->m_bBgColorSet)
  2226. {
  2227.     pRegionSite = pSiteInfo->m_pRegionSite;
  2228. }
  2229. showSite(pSiteInfo->m_pRendererSite, FALSE);
  2230. showSite(pRegionSite, FALSE);
  2231.     }
  2232. }
  2233. // show/hide sites up to ulNewTime
  2234. // events at the same time for the same region
  2235. // are ordererd 'hide' first, then 'show' so
  2236. // a hide doesn't override a show.
  2237. m_ulEventListPosition = m_pEventList->GetHeadPosition();
  2238. flushAllEvents( ulNewTime, TRUE );
  2239.     }
  2240.     return rc;
  2241. }
  2242. HX_RESULT
  2243. CSmil1DocumentRenderer::endStream()
  2244. {
  2245.     flushAllEvents();    // flush all remaining events
  2246.     if(m_pGroupMap)
  2247.     {
  2248. CHXMapLongToObj::Iterator i;
  2249. for(i=m_pGroupMap->Begin();i!=m_pGroupMap->End();++i)
  2250. {
  2251.     IHXGroup* pGroup = (IHXGroup*)(*i);
  2252.     pGroup->Release();
  2253. }
  2254. HX_DELETE(m_pGroupMap);
  2255.     }
  2256.     HX_RELEASE(m_pPersistentProperties);
  2257.     HX_RELEASE(m_pPersistentParentRenderer);
  2258.     return HXR_OK;
  2259. }
  2260. CSmil1BasicRegion*
  2261. CSmil1DocumentRenderer::getRegion(const char* pID)
  2262. {
  2263.     CSmil1BasicRegion* pRegion = 0;
  2264.     if(m_pRegionMap)
  2265.     {
  2266. m_pRegionMap->Lookup(pID, (void*&)pRegion);
  2267.     }
  2268.     return pRegion;
  2269. }
  2270. void
  2271. CSmil1DocumentRenderer::setTopLevelSiteSize()
  2272. {
  2273.     HXxRect outerRect;
  2274.     
  2275.     outerRect.left = 0;
  2276.     outerRect.right = 0;
  2277.     outerRect.bottom = 0;
  2278.     outerRect.top = 0;
  2279.     if(m_bRootLayoutWidthSet)
  2280.     {
  2281. outerRect.left = 0;
  2282. outerRect.right = m_ulRootLayoutWidth;
  2283.     }
  2284.     else
  2285.     {
  2286. outerRect.left = 0;
  2287. outerRect.right = m_ulNoRootLayoutWidth;
  2288.     }
  2289.     if(m_bRootLayoutHeightSet)
  2290.     {
  2291. outerRect.top = 0;
  2292. outerRect.bottom = m_ulRootLayoutHeight;
  2293.     }
  2294.     else
  2295.     {
  2296. outerRect.top = 0;
  2297. outerRect.bottom = m_ulNoRootLayoutHeight;
  2298.     }
  2299.     HXxSize size;
  2300.     size.cx = HXxRECT_WIDTH(outerRect);
  2301.     size.cy = HXxRECT_HEIGHT(outerRect);
  2302.     m_topSiteSize.cx = HXxRECT_WIDTH(outerRect);
  2303.     m_topSiteSize.cy = HXxRECT_HEIGHT(outerRect);
  2304.     m_topSiteOriginalSize.cx = m_topSiteSize.cx;
  2305.     m_topSiteOriginalSize.cy = m_topSiteSize.cy;
  2306.     if(m_topSiteSize.cx > 0 && m_topSiteSize.cy > 0)
  2307.     {
  2308. m_pMISUSSite->SetSize(m_topSiteSize);
  2309.         m_pMISUSSite->GetSize(m_topSiteSize);
  2310.     }
  2311. }
  2312. HX_RESULT
  2313. CSmil1DocumentRenderer::createRegionSites()
  2314. {
  2315.     // these sites and site users will be deleted
  2316.     // in the CSmil1BasicRegion destructor
  2317.     if(m_pMISUSSite && m_pRegionMap)
  2318.     {
  2319. CHXMapStringToOb::Iterator i = m_pRegionMap->Begin();
  2320. for(; i != m_pRegionMap->End(); ++i)
  2321. {
  2322.     CSmil1BasicRegion* pRegion = (CSmil1BasicRegion*)(*i);
  2323.     m_pMISUSSite->CreateChild(pRegion->m_pSite);
  2324.     // set region size and position
  2325.     HXxPoint point;
  2326.     HXxSize size;
  2327.     point.x = pRegion->m_rect.left;
  2328.     point.y = pRegion->m_rect.top;
  2329.     pRegion->m_pSite->SetPosition(point);
  2330.     size.cx = HXxRECT_WIDTH(pRegion->m_rect);
  2331.     size.cy = HXxRECT_HEIGHT(pRegion->m_rect);
  2332.     pRegion->m_pSite->SetSize(size);
  2333.     pRegion->m_pSiteUser = new CSmil1SiteUser(this, pRegion->m_ulBgColor);
  2334.     pRegion->m_pSiteUser->AddRef();
  2335.     pRegion->m_pSite->AttachUser(pRegion->m_pSiteUser);
  2336.     if(!pRegion->m_bBgColorSet)
  2337.     {
  2338. showSite(pRegion->m_pSite, FALSE);
  2339.     }
  2340. }
  2341.     }
  2342.     return HXR_OK;
  2343. }
  2344. /*
  2345.  * IHXSiteUser methods
  2346.  */
  2347. STDMETHODIMP
  2348. CSmil1DocumentRenderer::AttachSite(IHXSite* /*IN*/ pSite)
  2349. {
  2350.     HX_RESULT rc = HXR_OK;
  2351.     if (m_pMISUSSite)
  2352.     {
  2353. return rc;
  2354.     }
  2355.     m_pMISUSSite = pSite;
  2356.     m_pMISUSSite->AddRef();
  2357.     IHXCommonClassFactory* pFactory = m_pParent->getFactory();
  2358.     setTopLevelSiteSize();
  2359.     IHXSite2* pSite2 = NULL;
  2360.     if(HXR_OK == m_pMISUSSite->QueryInterface(IID_IHXSite2, (void**)&pSite2))
  2361.     {
  2362. pSite2->AddPassiveSiteWatcher(this);
  2363. pSite2->Release();
  2364.     }
  2365.     return rc;
  2366. }
  2367. STDMETHODIMP
  2368. CSmil1DocumentRenderer::DetachSite()
  2369. {
  2370.     // XXX HP keep the m_pSiteInfoByRendererMap object
  2371.     // which will be delete in close()
  2372.     if(m_pSiteInfoByRendererMap)
  2373.     {
  2374. CHXMapPtrToPtr::Iterator i = m_pSiteInfoByRendererMap->Begin();
  2375. for (;i!=m_pSiteInfoByRendererMap->End();++i)
  2376. {
  2377.     SMIL1SiteInfo* pSiteInfo = (SMIL1SiteInfo*)(*i);
  2378.     m_pSiteMgr->RemoveSite(pSiteInfo->m_pRendererSite);
  2379.     CSmil1BasicRegion* pRegion = getRegion(pSiteInfo->m_regionID);
  2380.     if(pRegion &&
  2381. pRegion->m_pSite)
  2382.     {
  2383. pRegion->m_pSite->DestroyChild(pSiteInfo->m_pRendererSite);
  2384.     }
  2385.     pSiteInfo->m_pRendererSite->DetachWatcher();
  2386.     HX_RELEASE(pSiteInfo->m_pRendererSite);
  2387. }
  2388. m_pSiteInfoByRendererMap->RemoveAll();
  2389.         if (m_bCloseCalled)
  2390.         {
  2391.             HX_DELETE(m_pSiteInfoByRendererMap);
  2392.         }
  2393.     }
  2394.     if(m_pRegionMap)
  2395.     {
  2396. CHXMapStringToOb::Iterator i = m_pRegionMap->Begin();
  2397. for(; i != m_pRegionMap->End(); ++i)
  2398. {
  2399.     CSmil1BasicRegion* pRegion = (CSmil1BasicRegion*)(*i);
  2400.     if(pRegion->m_pSite)
  2401.     {
  2402. m_pMISUSSite->DestroyChild(pRegion->m_pSite);
  2403.                 // Detach the site user
  2404.                 pRegion->m_pSite->DetachUser();
  2405.                 // Release our ref on the site user
  2406.                 HX_RELEASE(pRegion->m_pSiteUser);
  2407.     }
  2408.     HX_RELEASE(pRegion->m_pSite);
  2409.             if (m_bCloseCalled)
  2410.             {
  2411.                 HX_DELETE(pRegion);
  2412.             }
  2413. }
  2414.         if (m_bCloseCalled)
  2415.         {
  2416.             m_pRegionMap->RemoveAll();
  2417.             HX_DELETE(m_pRegionMap);
  2418.         }
  2419.     }
  2420.     if(m_pSiteWatcherMap)
  2421.     {
  2422. CHXMapPtrToPtr::Iterator i= m_pSiteWatcherMap->Begin();
  2423. for(; i != m_pSiteWatcherMap->End(); ++i)
  2424. {
  2425.     CSmil1SiteWatcher* pSiteWatcher = (CSmil1SiteWatcher*)(*i);
  2426.     pSiteWatcher->Release();
  2427. }
  2428. HX_DELETE(m_pSiteWatcherMap);
  2429.     }
  2430.     IHXSite2* pSite2 = NULL;
  2431.     if(m_pMISUSSite &&
  2432. HXR_OK == m_pMISUSSite->QueryInterface(IID_IHXSite2, (void**)&pSite2))
  2433.     {
  2434. pSite2->RemovePassiveSiteWatcher(this);
  2435. pSite2->Release();
  2436.     }
  2437.     HX_RELEASE(m_pMISUSSite);
  2438. #ifdef _MACINTOSH
  2439.     if (m_bResetCursor)
  2440.     {
  2441. m_bResetCursor = FALSE;
  2442. ::InitCursor();
  2443.     }
  2444. #endif
  2445.     m_bSitesDetached = TRUE;
  2446.     if (m_bCloseCalled)
  2447.     {
  2448.         if(m_pSiteInfoList)
  2449.         {
  2450.     CHXSimpleList::Iterator i = m_pSiteInfoList->Begin();
  2451.     for(; i != m_pSiteInfoList->End(); ++i)
  2452.     {
  2453.         SMIL1SiteInfo* pSiteInfo = (SMIL1SiteInfo*)(*i);
  2454.         delete pSiteInfo;
  2455.     }
  2456.         }
  2457.         HX_DELETE(m_pSiteInfoList);
  2458.     }
  2459.     return HXR_OK;
  2460. }
  2461. HX_RESULT
  2462. CSmil1DocumentRenderer::HandleSurfaceUpdate(HXxEvent* pEvent,
  2463.    IHXSite* pSite,
  2464.    HXxColor ulBGColor)
  2465. {
  2466.     HX_RESULT rc = HXR_OK;
  2467.     HXxColor ulInitialBGColor = 0;  // paint black until first timestamp is received
  2468.     if(pSite)
  2469.     {
  2470. draw(pEvent, pSite, 
  2471.     m_bFirstTimeSync ?
  2472. ulBGColor: ulInitialBGColor);
  2473.     }
  2474.     return rc;
  2475. }
  2476. STDMETHODIMP
  2477. CSmil1DocumentRenderer::HandleEvent(HXxEvent* /*IN*/ pEvent)
  2478. {
  2479.     pEvent->handled = FALSE;
  2480.     pEvent->result  = 0;
  2481.     switch (pEvent->event)
  2482.     {
  2483. case HX_SURFACE_UPDATE:
  2484. {
  2485.     if(HXR_OK == HandleSurfaceUpdate(pEvent, m_pMISUSSite,
  2486. (m_bRootLayoutWidthSet  ||  m_bRootLayoutHeightSet) ?
  2487.     m_ulRootLayoutBGColor: 0))
  2488.     {
  2489. pEvent->handled = TRUE;
  2490.     }
  2491. }
  2492. #if defined(_UNIX)  &&  (!defined(_BEOS))  &&  defined(USE_XWINDOWS)
  2493.     //
  2494.     // Create a "hand" cursor for hyperlinks
  2495.     //
  2496.     {
  2497. //
  2498. // free previously allocated cursor
  2499. //
  2500. if (m_pDisplay && m_hHyperlinkCursor)
  2501. {
  2502.     XFreeCursor(m_pDisplay, m_hHyperlinkCursor);
  2503.     m_hHyperlinkCursor = 0;
  2504. }
  2505. // 
  2506. // get new display/window parameters and 
  2507. // allocate a new cursor
  2508. //
  2509. HXxWindow *pWnd = (HXxWindow*)pEvent->param2;
  2510. m_pDisplay = (Display*)pWnd->display;
  2511. m_Window = (Window)pWnd->window;
  2512. if (m_pDisplay)
  2513.     m_hHyperlinkCursor = XCreateFontCursor(m_pDisplay, XC_hand2);
  2514.     }     
  2515. #endif
  2516. break;
  2517.     }
  2518.     return HXR_OK;
  2519. }
  2520. /*
  2521.  * IHXPassiveSiteWatcher methods
  2522.  */
  2523. STDMETHODIMP
  2524. CSmil1DocumentRenderer::PositionChanged (HXxPoint* /*IN*/ pPoint)
  2525. {
  2526.     return HXR_OK; // PNR_NOIMPL???
  2527. }
  2528. STDMETHODIMP
  2529. CSmil1DocumentRenderer::SizeChanged (HXxSize* /*IN*/ pSize)
  2530. {
  2531. //    char szDbgStr[128];
  2532. //    DEBUGPRINTF(szDbgStr, "SizeChanged(%ld,%ld) m_topSiteSize=(%ld,%ld) m_ulCurrentTime=%lu t=%lun",
  2533. //                pSize->cx, pSize->cy, m_topSiteSize.cx, m_topSiteSize.cy,
  2534. //                m_ulCurrentTime, HX_GET_BETTERTICKCOUNT());
  2535.     // check for resize of top level site, we must have
  2536.     // a "site" and not already be resizing!
  2537.     if(m_pMISUSSite && !m_bSiteChangingSize)
  2538.     {
  2539.         if (pSize->cx != m_topSiteSize.cx ||
  2540.             pSize->cy != m_topSiteSize.cy)
  2541.         {
  2542.     m_bSiteChangingSize = TRUE;
  2543.     resizeSite(*pSize);
  2544.     CHXxRect updateRect(0, 0, pSize->cx, pSize->cy);
  2545.     m_pMISUSSite->DamageRect(updateRect);
  2546. #ifndef  _WIN32
  2547.     m_pMISUSSite->ForceRedraw();
  2548. #endif
  2549.     m_bSiteChangingSize = FALSE;
  2550.         }
  2551.     }
  2552.     return HXR_OK;
  2553. }
  2554. #ifdef _MACINTOSH
  2555. UINT16 Convert8BitTo16Bit(UINT8 x)
  2556. {
  2557.     float factor=((float)x)/255;
  2558.     long returnValue=(factor*65535);
  2559.     
  2560.     return returnValue;
  2561. }
  2562. void ConvertCOLORTYPEtoRGBColor(RGBColor& rgbColor, HXxColor colorVal)
  2563. {
  2564.     char* x=(char*)&colorVal;
  2565.     
  2566.     rgbColor.red   =(short)Convert8BitTo16Bit(x[1]);
  2567.     rgbColor.green =(short)Convert8BitTo16Bit(x[2]);
  2568.     rgbColor.blue  =(short)Convert8BitTo16Bit(x[3]);
  2569.     
  2570. }
  2571. #endif
  2572. #if defined(_UNIX)  &&  (!defined(_BEOS))  &&  defined(USE_XWINDOWS)
  2573. void  CSmil1DocumentRenderer::ConvertPNxColorToXColor(HXxColor hxxColor, XColor& xcolor)
  2574. {
  2575.     // assume starting with a new XColor
  2576.     memset(&xcolor, 0, sizeof(XColor));
  2577.     // separate r,g and b
  2578.     UINT16 t;
  2579.     t = (hxxColor & 0x00ff0000) >> 16;
  2580.     xcolor.red   = t << 8;
  2581.     
  2582.     t = (hxxColor & 0x0000ff00) >> 8;
  2583.     xcolor.green = t << 8;
  2584.     
  2585.     t = (hxxColor & 0x000000ff);
  2586.     xcolor.blue  = t << 8;
  2587.     
  2588.     //color.pixel = n;
  2589.     xcolor.flags = DoRed | DoGreen | DoBlue;
  2590. }
  2591. #endif
  2592. BOOL
  2593. CSmil1DocumentRenderer::draw(HXxEvent* pEvent, IHXSite* pSite, 
  2594.     HXxColor ulBgColor)
  2595. {
  2596.     if(pEvent &&
  2597.        pEvent->event == HX_SURFACE_UPDATE && 
  2598.        pEvent->result == HXR_OK)
  2599.     {
  2600.         // Set up color
  2601.         UINT32 ulColor = ulBgColor;
  2602.         // Set up bitmap info header
  2603.         HXBitmapInfoHeader cHeader;
  2604.         cHeader.biSize          = 40;
  2605.         cHeader.biWidth         = 1;
  2606.         cHeader.biHeight        = 1;
  2607.         cHeader.biPlanes        = 1;
  2608.         cHeader.biBitCount      = 32;
  2609.         cHeader.biCompression   = (ulBgColor & 0xFF000000 ? HX_ARGB : HX_RGB);
  2610.         cHeader.biSizeImage     = 0;
  2611.         cHeader.biXPelsPerMeter = 0;
  2612.         cHeader.biYPelsPerMeter = 0;
  2613.         cHeader.biClrUsed       = 0;
  2614.         cHeader.biClrImportant  = 0;
  2615.         cHeader.rcolor          = 0;
  2616.         cHeader.gcolor          = 0;
  2617.         cHeader.bcolor          = 0;
  2618.         // Set up src rect
  2619.         HXxRect cSrcRect = {0, 0, 1, 1};
  2620.         // Set up dst rect
  2621.         HXxSize cSize = {0, 0};
  2622.         pSite->GetSize(cSize);
  2623.         HXxRect cDstRect = {0, 0, cSize.cx, cSize.cy};
  2624.         // Do the blt
  2625.         IHXVideoSurface* pSurf = (IHXVideoSurface*) pEvent->param1;
  2626.         if(pSurf)
  2627.         {
  2628.             pSurf->AddRef();
  2629.             pEvent->result = pSurf->Blt((BYTE*) &ulColor,
  2630.                                         &cHeader,
  2631.                                         cDstRect,
  2632.                                         cSrcRect);
  2633.             pSurf->Release();
  2634.         }
  2635.     }
  2636.     return TRUE;
  2637. }
  2638. STDMETHODIMP_(BOOL)
  2639. CSmil1DocumentRenderer::NeedsWindowedSites()
  2640. {
  2641.     return FALSE;
  2642. }
  2643. /*
  2644.  * IHXRendererAdviseSink methods
  2645.  */
  2646. STDMETHODIMP
  2647. CSmil1DocumentRenderer::TrackDurationSet(UINT32 ulGroupIndex,
  2648. UINT32 ulTrackIndex,
  2649. UINT32 ulDuration,
  2650. UINT32 ulDelay,
  2651. BOOL bLiveSource)
  2652. {
  2653.     HX_RESULT rc = HXR_FAILED;
  2654.     SMIL1PlayToAssoc* pPlayToAssoc = NULL;
  2655. #if defined(HELIX_FEATURE_SMIL2)
  2656.     if (m_pParent->isHigherVersionSmilStreamFromOldSMIL1FF())
  2657.     {
  2658. HX_ASSERT(m_pParent->m_pNextGenSmilRenderer);
  2659. if (m_pParent->m_pNextGenSmilRenderer)
  2660. {
  2661.     rc = m_pParent->m_pNextGenSmilRenderer->SmilDocTrackDurationSet(
  2662.     ulGroupIndex, ulTrackIndex, ulDuration, ulDelay,
  2663.     bLiveSource);
  2664.     goto cleanup;
  2665. }
  2666.     }
  2667. #endif /* defined(HELIX_FEATURE_SMIL2). */
  2668.     pPlayToAssoc = getPlayToAssoc((UINT16)ulGroupIndex,
  2669.    (UINT16)ulTrackIndex);
  2670.     if(pPlayToAssoc && !pPlayToAssoc->m_bDurationResolved)
  2671.     {
  2672. pPlayToAssoc->m_bDurationResolved = TRUE;
  2673. pPlayToAssoc->m_ulDelay = ulDelay;
  2674. pPlayToAssoc->m_ulDuration = ulDuration - ulDelay;
  2675. if(bLiveSource &&
  2676.     pPlayToAssoc->m_ulDuration == 0)
  2677. {
  2678.     // don't resolve duration
  2679. }
  2680. else
  2681. {
  2682.          m_pSmilParser->durationResolved(pPlayToAssoc->m_id,
  2683.     pPlayToAssoc->m_ulDuration);
  2684. }
  2685. handleElements();
  2686. SMIL1GroupInfo* pGroupInfo = 0;
  2687. if(m_pGroupInfoMap->Lookup(ulGroupIndex, (void*&)pGroupInfo))
  2688. {
  2689.     pGroupInfo->m_nTrackDurationsSet++;
  2690.     if (pGroupInfo->m_nTrackDurationsSet == pGroupInfo->m_nTracks)
  2691.     {
  2692. PersistentDurationSet(ulDuration,
  2693.       m_ulPersistentComponentDelay,
  2694.       bLiveSource);
  2695.     }
  2696. }
  2697. return HXR_OK;
  2698.     }
  2699. #if defined(HELIX_FEATURE_SMIL2)
  2700. cleanup:
  2701. #endif /* defined(HELIX_FEATURE_SMIL2). */
  2702.     return rc;
  2703. }
  2704. STDMETHODIMP
  2705. CSmil1DocumentRenderer::RepeatedTrackDurationSet(const char*  pID,
  2706. UINT32 ulDuration,
  2707. BOOL   bIsLive)
  2708. {
  2709.     HX_RESULT rc = HXR_OK;
  2710. #if defined(HELIX_FEATURE_SMIL2)
  2711.     if (m_pParent->isHigherVersionSmilStreamFromOldSMIL1FF())
  2712.     {
  2713. HX_ASSERT(m_pParent->m_pNextGenSmilRenderer);
  2714. if (m_pParent->m_pNextGenSmilRenderer)
  2715. {
  2716.     rc = m_pParent->m_pNextGenSmilRenderer->SmilDocRepeatedTrackDurationSet(
  2717.     pID, ulDuration, bIsLive);
  2718.     goto cleanup;
  2719. }
  2720.     }
  2721. #endif /* defined(HELIX_FEATURE_SMIL2). */
  2722.     if(!bIsLive)
  2723.     {
  2724. m_pSmilParser->durationResolved(pID,
  2725. ulDuration);
  2726. handleElements();
  2727.     }
  2728. #if defined(HELIX_FEATURE_SMIL2)
  2729. cleanup:
  2730. #endif /* defined(HELIX_FEATURE_SMIL2). */
  2731.     return rc;
  2732. }
  2733. // /For SHAZAM:
  2734. // /POST-RP8REV release IHXRendererAdviseSink method:
  2735. STDMETHODIMP
  2736. CSmil1DocumentRenderer::TrackUpdated(UINT32 ulGroupIndex,
  2737.     UINT32 ulTrackIndex,
  2738.     IHXValues* pValues)
  2739. {
  2740.     HX_RESULT rc = HXR_OK;
  2741.     UINT16 uNewTrackIndex = 0;
  2742.     SMIL1PlayToAssoc* pPlayToAssoc = NULL;
  2743. #if defined(HELIX_FEATURE_SMIL2)
  2744.     if (m_pParent->isHigherVersionSmilStreamFromOldSMIL1FF())
  2745.     {
  2746. HX_ASSERT(m_pParent->m_pNextGenSmilRenderer);
  2747. if (m_pParent->m_pNextGenSmilRenderer)
  2748. {
  2749.     rc = m_pParent->m_pNextGenSmilRenderer->SmilDocTrackUpdated(
  2750.     ulGroupIndex, ulTrackIndex, pValues);
  2751.     goto cleanup;
  2752. }
  2753.     }
  2754. #endif /* defined(HELIX_FEATURE_SMIL2). */
  2755.     pPlayToAssoc = getPlayToAssoc((UINT16)ulGroupIndex,
  2756.    (UINT16)ulTrackIndex);
  2757.     if (!pPlayToAssoc)
  2758.     {
  2759. rc = HXR_UNEXPECTED;
  2760. goto cleanup;
  2761.     }
  2762.     if (HXR_OK == pValues->GetPropertyULONG32("TrackIndex", (UINT32&)uNewTrackIndex))
  2763.     {
  2764. pPlayToAssoc->m_uTrackIndex = uNewTrackIndex;
  2765.     }
  2766. cleanup:
  2767.     return rc;
  2768. }
  2769. HX_RESULT
  2770. CSmil1DocumentRenderer::addShowEvents(const char* pRegionName,
  2771.      IHXSite* pSite)
  2772. {
  2773.     HX_RESULT rc = HXR_OK;
  2774.     SMIL1PlayToAssoc* pPlayToAssoc = getPlayToAssoc(pRegionName);
  2775.     if(pPlayToAssoc)
  2776.     {
  2777. showSite(pSite, FALSE);
  2778. // show site after m_ulDelay
  2779. CSmil1ShowSiteEvent* pShowEvent = 
  2780.     new CSmil1ShowSiteEvent(pPlayToAssoc->m_uGroupIndex,
  2781. pPlayToAssoc->m_ulDelay, pSite, 
  2782. NULL, TRUE);
  2783. insertEvent(pShowEvent);
  2784. // hide site after m_ulDuration if it isn't live
  2785. if(pPlayToAssoc->m_bRemoveSite &&
  2786.    !pPlayToAssoc->m_bLiveSource)
  2787. {
  2788.     CSmil1ShowSiteEvent* pHideEvent = 
  2789. new CSmil1ShowSiteEvent(pPlayToAssoc->m_uGroupIndex,
  2790. pPlayToAssoc->m_ulDuration + pPlayToAssoc->m_ulDelay, 
  2791. pSite, NULL, FALSE);
  2792.     insertEvent(pHideEvent);
  2793. }
  2794.     }
  2795.     return rc;
  2796. }
  2797. STDMETHODIMP
  2798. CSmil1DocumentRenderer::RendererInitialized(IHXRenderer* pRenderer, 
  2799.     IUnknown* pStream, IHXValues* pInfo)
  2800. {
  2801.     HX_RESULT rc = HXR_OK;
  2802.     BOOL bIsWindowed = FALSE;
  2803.     BOOL bHandleElement = FALSE;
  2804.     HX_DISPLAY_TYPE ulFlags;
  2805.     IHXBuffer* pBuf = 0;
  2806.     SMIL1PlayToAssoc* pPlayToAssoc = NULL;
  2807.     UINT32 ulGroupIndex = 0;
  2808.     UINT32 ulTrackIndex = 0;
  2809.     UINT32 ulDelay = 0;
  2810.     UINT32 ulDuration = 0;
  2811.     UINT32 ulLiveSource = 0;
  2812.     UINT16 uStreamNumber = 0;
  2813.     IHXStream* pStr = 0;
  2814. #if defined(HELIX_FEATURE_SMIL2)
  2815.     if (m_pParent->isHigherVersionSmilStreamFromOldSMIL1FF())
  2816.     {
  2817. HX_ASSERT(m_pParent->m_pNextGenSmilRenderer);
  2818. if (m_pParent->m_pNextGenSmilRenderer)
  2819. {
  2820.     rc = m_pParent->m_pNextGenSmilRenderer->SmilDocRendererInitialized(
  2821.     pRenderer, pStream, pInfo);
  2822.     goto cleanup;
  2823. }
  2824.     }
  2825. #endif /* defined(HELIX_FEATURE_SMIL2). */
  2826.     if(HXR_OK == pRenderer->GetDisplayType(ulFlags, pBuf))
  2827.     {
  2828.         if (HX_DISPLAY_WINDOW == (HX_DISPLAY_WINDOW & ulFlags))
  2829. {
  2830.     bIsWindowed = TRUE;
  2831. }
  2832. HX_RELEASE(pBuf);
  2833.     }
  2834.     pInfo->GetPropertyULONG32("GroupIndex", ulGroupIndex);
  2835.     pInfo->GetPropertyULONG32("TrackIndex", ulTrackIndex);
  2836.     pInfo->GetPropertyULONG32("Delay", ulDelay);
  2837.     // "duration" is really the end time in the current group
  2838.     pInfo->GetPropertyULONG32("Duration", ulDuration);  
  2839.     pInfo->GetPropertyULONG32("LiveSource", ulLiveSource);
  2840.     if(HXR_OK == pStream->QueryInterface(IID_IHXStream,
  2841.     (void**)&pStr))
  2842.     {
  2843. uStreamNumber = pStr->GetStreamNumber();
  2844. HX_RELEASE(pStr);
  2845.     }
  2846.     if(bIsWindowed)
  2847.     {
  2848. IHXLayoutStream* pLayoutStream = 0;
  2849. if(HXR_OK == pStream->QueryInterface(IID_IHXLayoutStream, 
  2850.     (void**)&pLayoutStream))
  2851. {
  2852.     BOOL bNoRegion = TRUE;
  2853.     pPlayToAssoc = getPlayToAssoc((UINT16)ulGroupIndex, 
  2854. (UINT16)ulTrackIndex);
  2855.     if(pPlayToAssoc)
  2856.     {
  2857. CHXSimpleList* pRendererList = NULL;
  2858. SMIL1SourceInfo* pSourceInfo = NULL;
  2859. const char* pPlayTo = pPlayToAssoc->m_playTo;
  2860. // re-create layout/region/renderer sites if
  2861. // sites have been detached upon playlist navigation
  2862. if (m_bSitesDetached)
  2863. {
  2864.     m_bSitesDetached = FALSE;
  2865.     HX_RESULT rc = setupRootLayout();
  2866.     HX_ASSERT(HXR_OK == rc);
  2867. }
  2868. // see if we need to layout this renderer...
  2869. CSmil1BasicRegion* pRegion = getRegion(pPlayTo);
  2870. if(pRegion)
  2871. {
  2872.     bNoRegion = FALSE;
  2873. }
  2874. else
  2875. {
  2876.     // phony one up
  2877.     HXxRect rect;
  2878.     rect.left = 0;
  2879.     rect.top = 0;
  2880.     rect.right = 0;
  2881.     rect.bottom = 0;
  2882.     
  2883.     pRegion = new CSmil1BasicRegion(pPlayTo, rect, 0, "hidden", 0, 
  2884. FALSE, TRUE,
  2885. //Default to TRUE for width unspecified and
  2886. // height unspecified:
  2887. TRUE, TRUE);
  2888.     (*m_pRegionMap)[pPlayTo] = pRegion;
  2889. }
  2890. pSourceInfo = new SMIL1SourceInfo;
  2891. pSourceInfo->m_pStream = pStream;
  2892. if(pSourceInfo->m_pStream)
  2893. {
  2894.     pSourceInfo->m_pStream->AddRef();
  2895. }
  2896. pSourceInfo->m_pRenderer = pRenderer;
  2897. if(pSourceInfo->m_pRenderer)
  2898. {
  2899.     pSourceInfo->m_pRenderer->AddRef();
  2900. }
  2901. pSourceInfo->m_ulDelay = ulDelay;
  2902. pSourceInfo->m_ulDuration = ulDuration - ulDelay;
  2903. char cTemp[20]; /* Flawfinder: ignore */
  2904. ::sprintf(cTemp,"%#010lx",(ULONG32)(void*)pSourceInfo); /* Flawfinder: ignore */
  2905. pSourceInfo->m_tunerName   = (const char*) cTemp;
  2906. ::sprintf(cTemp,"%#010lx",(ULONG32)(void*)pSourceInfo+1); /* Flawfinder: ignore */
  2907. pSourceInfo->m_childTunerName = (const char*)cTemp;
  2908. const char* pChildTuner = pSourceInfo->m_childTunerName;
  2909. // get to the site manager and set an event hook
  2910. IHXEventHookMgr* pHookMgr = NULL;
  2911. if(HXR_OK ==
  2912.     m_pSiteMgr->QueryInterface(IID_IHXEventHookMgr, 
  2913.     (void**)&pHookMgr))
  2914. {
  2915.     CSmil1EventHook* pChildEventHook = NULL;
  2916.     // create event hook for playto
  2917.     pChildEventHook = new CSmil1EventHook(
  2918. this, pPlayTo, pChildTuner, bNoRegion);
  2919.     pChildEventHook->AddRef();
  2920.     pHookMgr->AddHook(pChildEventHook,
  2921. pChildTuner, 0);
  2922.     pSourceInfo->m_pRendererEventHook = pChildEventHook;
  2923.     pHookMgr->Release();
  2924. }
  2925. else
  2926. {
  2927.     pSourceInfo->m_pRendererEventHook = NULL;
  2928. }
  2929. if (NULL == pPlayToAssoc->m_sourceMap[uStreamNumber])
  2930. {
  2931.     pPlayToAssoc->m_sourceMap[uStreamNumber] = new CHXSimpleList();
  2932.     pPlayToAssoc->m_tunerName = pSourceInfo->m_tunerName;
  2933.     pPlayToAssoc->m_childTunerName = pSourceInfo->m_childTunerName;
  2934.     pPlayToAssoc->m_ulDelay = pSourceInfo->m_ulDelay;
  2935.     pPlayToAssoc->m_ulDuration = pSourceInfo->m_ulDuration;
  2936.     pPlayToAssoc->m_bLiveSource = ulLiveSource ? TRUE : FALSE;
  2937.     pPlayToAssoc->m_pRendererEventHook = pSourceInfo->m_pRendererEventHook;
  2938.     // add hyperlinks
  2939.     CSmil1Element* pElement = m_pSmilParser->findElement(
  2940. pPlayToAssoc->m_id);
  2941.     if(pElement && pElement->m_pHyperlinks)
  2942.     {
  2943. CHXSimpleList::Iterator i = 
  2944. pElement->m_pHyperlinks->Begin();
  2945. for(; i != pElement->m_pHyperlinks->End(); ++i)
  2946. {
  2947.     CSmil1AAnchorElement* pAnchor = 
  2948. (CSmil1AAnchorElement*)(*i);