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

Symbian

开发平台:

Visual C++

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