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

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #include <stdlib.h>
  36. #include <stdio.h>
  37. #include <ctype.h>
  38. #include "hxtypes.h"
  39. #include "hxresult.h"
  40. #include "hxcom.h"
  41. #include "hxcomm.h"
  42. #include "ihxpckts.h"
  43. #include "hxfiles.h"
  44. #include "hxformt.h"
  45. #include "hxengin.h"
  46. #include "hxplugn.h"
  47. #include "hxpends.h"
  48. #include "hxasm.h"
  49. #include "hxprefs.h"
  50. #include "hxassert.h"
  51. #include "chxpckts.h"
  52. #include "nptime.h"
  53. #include "smpte.h"
  54. #include "debug.h"
  55. #include "hxstrutl.h"
  56. #include "hxstring.h"
  57. #include "cbqueue.h"
  58. #include "hxslist.h"
  59. #include "hxmap.h"
  60. #include "hxstack.h"
  61. #include "hxwintyp.h"
  62. #include "chxxtype.h"
  63. #include "hxxml.h"
  64. #include "hxxmlprs.h"
  65. #include "xmlreslt.h"
  66. #include "looseprs.h"
  67. #include "sm1elem.h"
  68. #include "sm1parse.h"
  69. #include "sm1time.h"
  70. /*
  71.  * CSmil1TimelineElementManager methods
  72.  */
  73. CSmil1TimelineElementManager::CSmil1TimelineElementManager():
  74.     m_pElementMap(NULL),
  75.     m_pNotifierMap(NULL)
  76. {
  77. }
  78. CSmil1TimelineElementManager::~CSmil1TimelineElementManager()
  79. {
  80.     HX_DELETE(m_pElementMap);
  81.     if(m_pNotifierMap)
  82.     {
  83. CHXMapStringToOb::Iterator i = m_pNotifierMap->Begin();
  84. for(; i != m_pNotifierMap->End(); ++i)
  85. {
  86.     CHXSimpleList* pList = (CHXSimpleList*)(*i);
  87.     delete pList;
  88. }
  89. HX_DELETE(m_pNotifierMap);
  90.     }
  91. }
  92. void
  93. CSmil1TimelineElementManager::addTimelineElement(CSmil1TimelineElement* pElement)
  94. {
  95.     if(!m_pElementMap)
  96.     {
  97. m_pElementMap = new CHXMapStringToOb;
  98.     }
  99.     (*m_pElementMap)[pElement->m_pID] = pElement;
  100. }
  101. CSmil1TimelineElement*
  102. CSmil1TimelineElementManager::getTimelineElement(const char* pID)
  103. {
  104.     CSmil1TimelineElement* pElement = NULL;
  105.     if(m_pElementMap)
  106.     {
  107. m_pElementMap->Lookup(pID, (void*&)pElement);
  108.     }
  109.     return pElement;
  110. }
  111. void
  112. CSmil1TimelineElementManager::addNotification(const char* pID,
  113.      CSmil1TimelineElement* pElement)
  114. {
  115.     if(!m_pNotifierMap)
  116.     {
  117. m_pNotifierMap = new CHXMapStringToOb;
  118.     }
  119.     CHXSimpleList* pNotifyList = NULL;
  120.     if(!m_pNotifierMap->Lookup(pID, (void*&)pNotifyList))
  121.     {
  122. pNotifyList = new CHXSimpleList;
  123. (*m_pNotifierMap)[pID] = pNotifyList;
  124.     }
  125.     pNotifyList->AddTail(pElement);
  126. }
  127. void
  128. CSmil1TimelineElementManager::notify(const char* pID)
  129. {
  130.     CHXSimpleList* pNotifyList = NULL;
  131.     if(m_pNotifierMap)
  132.     {
  133. if(m_pNotifierMap->Lookup(pID, (void*&)pNotifyList))
  134. {
  135.     CSmil1TimelineElement* pDependentElement = NULL;
  136.     if(m_pElementMap->Lookup(pID, (void*&)pDependentElement))
  137.     {
  138. CHXSimpleList::Iterator i = pNotifyList->Begin();
  139. for(; i != pNotifyList->End(); ++i)
  140. {
  141.     CSmil1TimelineElement* pElement = 
  142. (CSmil1TimelineElement*)(*i);
  143.     pElement->elementResolved(pDependentElement);
  144. }
  145.     }
  146. }
  147.     }
  148. }
  149. void
  150. CSmil1TimelineElementManager::resetTimeline()
  151. {
  152.     if(m_pElementMap)
  153.     {
  154. CHXMapStringToOb::Iterator i = m_pElementMap->Begin();
  155. for(; i != m_pElementMap->End(); ++i)
  156. {
  157.     CSmil1TimelineElement* pElement = 
  158. (CSmil1TimelineElement*)(*i);
  159.     pElement->reset();
  160. }
  161.     }
  162. }
  163. /*
  164.  * CSmil1TimelineElement methods
  165.  */
  166. CSmil1TimelineElement::CSmil1TimelineElement(CSmil1Element* pSourceElement,
  167.    CSmil1Parser* pParser):
  168.     m_pSourceElement(pSourceElement),
  169.     m_pParser(pParser),
  170.     m_bDurationSet(FALSE),
  171.     m_bMaxDurationSet(FALSE),
  172.     m_bDelaySet(FALSE),
  173.     m_bDontResetDuration(FALSE),
  174.     m_bNonEventDelaySet(FALSE),
  175.     m_bDelayEvent(FALSE),
  176.     m_bDurationEvent(FALSE),
  177.     m_pParent(NULL),
  178.     m_pChildren(NULL),
  179.     m_pDependent(NULL)
  180. {
  181.     m_pID = new char[pSourceElement->m_pNode->m_id.GetLength() + 1];
  182.     strcpy(m_pID, (const char*)m_pSourceElement->m_pNode->m_id); /* Flawfinder: ignore */
  183.     if (m_pParser && m_pParser->m_pTimelineElementManager)
  184.     {
  185.         m_pParser->m_pTimelineElementManager->addTimelineElement(this);
  186.         if(pSourceElement->m_nBeginEventSourceTag == SMILEventSourceBegin ||
  187.     pSourceElement->m_nBeginEventSourceTag == SMILEventSourceEnd ||
  188.     pSourceElement->m_nBeginEventSourceTag == SMILEventSourceClock)
  189.         {
  190.     m_pParser->m_pTimelineElementManager->addNotification(pSourceElement->m_BeginEventSourceID,
  191.         this);
  192.     m_bDelayEvent = TRUE;
  193.         }
  194.         if(pSourceElement->m_nEndEventSourceTag == SMILEventSourceBegin ||
  195.     pSourceElement->m_nEndEventSourceTag == SMILEventSourceEnd ||
  196.     pSourceElement->m_nEndEventSourceTag == SMILEventSourceClock)
  197.         {
  198.     m_pParser->m_pTimelineElementManager->addNotification(pSourceElement->m_EndEventSourceID,
  199.         this);
  200.     m_bDurationEvent = TRUE;
  201.         }
  202.         if(pSourceElement->m_nEndsyncEventSourceTag == SMILEventSourceID)
  203.         {
  204.     m_pParser->m_pTimelineElementManager->addNotification(pSourceElement->m_EndsyncEventSourceID,
  205.         this);
  206.     m_bDurationEvent = TRUE;
  207.         }
  208.     }
  209. }
  210. CSmil1TimelineElement::~CSmil1TimelineElement()
  211. {
  212.     delete m_pChildren;
  213.     delete[] m_pID;
  214. }
  215. void
  216. CSmil1TimelineElement::reset()
  217. {
  218.     m_bDelaySet = FALSE;
  219.     m_bNonEventDelaySet = FALSE;
  220.     m_bDurationSet = FALSE;
  221.     m_bMaxDurationSet = FALSE;
  222. }
  223. void 
  224. CSmil1TimelineElement::setDelay(UINT32 ulDelay)
  225. {
  226.     if(!m_bDelaySet)
  227.     {
  228. if(!m_bDelayEvent)
  229. {
  230.     if(m_pSourceElement->m_ulBeginOffset != (UINT32)-1)
  231.     {
  232. m_pSourceElement->m_ulDelay = ulDelay + 
  233.     m_pSourceElement->m_ulBeginOffset;
  234.     }
  235.     else
  236.     {
  237. m_pSourceElement->m_ulDelay = ulDelay;
  238.     }
  239.     m_bDelaySet = TRUE;
  240.     m_pParser->insertTimelineElement(m_pID, 
  241. m_pSourceElement->m_ulDelay);
  242. }
  243.     }
  244.     else
  245.     {
  246. if(m_pSourceElement->m_ulBeginOffset != (UINT32)-1)
  247. {
  248.     m_pSourceElement->m_ulDelay = ulDelay + 
  249. m_pSourceElement->m_ulBeginOffset;
  250. }
  251. else
  252. {
  253.     m_pSourceElement->m_ulDelay = ulDelay;
  254. }
  255.     }
  256. }
  257. void 
  258. CSmil1TimelineElement::setDuration(UINT32 ulDuration, BOOL bSetFromParent)
  259. {
  260.     if(bSetFromParent)
  261.     {
  262. m_pSourceElement->m_ulDuration = ulDuration;
  263. m_bDurationSet = m_bDontResetDuration = TRUE;
  264. m_pParser->resetTimelineElementDuration(m_pID,
  265.     m_pSourceElement->m_ulDuration);
  266.     }
  267.     else
  268.     {
  269. if(!m_bDurationSet)
  270. {
  271.     if(m_pSourceElement->m_ulBeginOffset != (UINT32)-1)
  272.     {
  273. m_pSourceElement->m_ulDuration = ulDuration + 
  274.     m_pSourceElement->m_ulBeginOffset;
  275.     }
  276.     else
  277.     {
  278. m_pSourceElement->m_ulDuration = ulDuration;
  279.     }
  280.     m_bDurationSet = TRUE;
  281.     if(m_pParent)
  282.     {
  283. m_pParent->addDuration(m_pSourceElement->m_ulDuration, 
  284.     m_pSourceElement->m_ulDelay, m_pID);
  285.     }
  286. }
  287. else if(!m_bDontResetDuration)
  288. {
  289.     m_pSourceElement->m_ulDuration = ulDuration;
  290.     m_pParser->resetTimelineElementDuration(m_pID,
  291. m_pSourceElement->m_ulDuration);
  292. }
  293.     }
  294.     if(m_pDependent)
  295.     {
  296. //Removed the addition of m_pSourceElement->m_ulDelay from the
  297. // source's duration because the source's duration already includes
  298. // its delay; we don't want to count the delay twice. Fixes PR 13983:
  299. // /*XXXEH- UNFIXES 13983 by adding back in the ...m_ulDelay addition;
  300. // the full fix for 13983 requires keeping track of begin=... delay
  301. // (as opposed to seq-related delay) and then subtracting that begin
  302. // delay from the m_ulDelay below:
  303. adjustDependentDuration(m_pDependent);
  304. m_pDependent->setDelay(m_pSourceElement->m_ulDelay + m_pSourceElement->m_ulDuration);
  305.     }
  306.     if (m_pParser && m_pParser->m_pTimelineElementManager)
  307.     {
  308.         m_pParser->m_pTimelineElementManager->notify(m_pID);
  309.     }
  310. }
  311. void
  312. CSmil1TimelineElement::setMaxDuration(UINT32 ulMaxDuration)
  313. {
  314.     m_bMaxDurationSet = TRUE;
  315.     m_pSourceElement->m_ulMaxDuration = ulMaxDuration;
  316. }
  317. void 
  318. CSmil1TimelineElement::adjustDependentDuration(CSmil1TimelineElement* pDependent)
  319. {
  320.     if (m_pParent)
  321.     {
  322. m_pParent->adjustDependentDuration(m_pDependent);
  323.     }
  324. }
  325. void
  326. CSmil1TimelineElement::elementResolved(CSmil1TimelineElement* pEventElement)
  327. {
  328.     //First, let's see if we have a begin event to resolve:
  329.     if(m_pSourceElement->m_nBeginEventSourceTag == SMILEventSourceBegin)
  330.     {
  331. if(pEventElement->m_bDelaySet)
  332. {
  333.     m_bDelaySet = TRUE;
  334.     m_pSourceElement->m_ulDelay = 
  335. pEventElement->m_pSourceElement->m_ulDelay;
  336.     m_pParser->insertTimelineElement(m_pID, 
  337. m_pSourceElement->m_ulDelay);
  338. }
  339.     }
  340.     else if(m_pSourceElement->m_nBeginEventSourceTag == SMILEventSourceEnd)
  341.     {
  342. if(pEventElement->m_bDurationSet)
  343. {
  344.     m_bDelaySet = TRUE;
  345.     m_pSourceElement->m_ulDelay = 
  346. pEventElement->m_pSourceElement->m_ulDuration +
  347.     pEventElement->m_pSourceElement->m_ulDelay;
  348.     m_pParser->insertTimelineElement(m_pID, 
  349. m_pSourceElement->m_ulDelay);
  350. }
  351.     }
  352.     else if(m_pSourceElement->m_nBeginEventSourceTag == SMILEventSourceClock)
  353.     {
  354. //We want event *BEGIN* plus clock therefor check for m_bDelaySet not
  355. // m_bDurationSet; after all, it's the eventElement's m_ulDelay
  356. // that's used, below:
  357. if(pEventElement->m_bDelaySet)
  358. {
  359.     m_bDelaySet = TRUE;
  360.     m_pSourceElement->m_ulDelay = 
  361.     pEventElement->m_pSourceElement->m_ulDelay;
  362.     //[SMIL 1.0 compliance] helps fix 23025:
  363.     // Rather than putting all the offset into m_ulDelay,
  364.     // we want to put the event element's delay into our
  365.     // delay and then put the event clock value into our
  366.     // m_ulBeginOffset so that we can properly adjust
  367.     // for any timing imposed on us later by our container
  368.     // (parent):
  369.     HX_ASSERT(m_pSourceElement->m_ulBeginOffset == UINT32(-1));
  370.     m_pSourceElement->m_ulBeginOffset =
  371.     m_pSourceElement->m_ulBeginEventClockValue;
  372.             m_pParser->insertTimelineElement(m_pID, 
  373. m_pSourceElement->m_ulDelay +
  374. //Allows SYMM 3/13/2000 test case 1.13 to work again
  375. // while allowing 23025 to keep working:
  376. m_pSourceElement->m_ulBeginOffset);
  377. }
  378.     }
  379.     //[SMIL 1.0 compliance] Fixes PR 16629:
  380.     //Next, let's see if we have an end event to resolve:
  381.     if(m_pSourceElement->m_nEndEventSourceTag == SMILEventSourceBegin)
  382.     {
  383. if(pEventElement->m_bDelaySet)
  384. {
  385.     m_bDurationSet = TRUE;
  386.     m_pSourceElement->m_ulDuration = 
  387. pEventElement->m_pSourceElement->m_ulDelay;
  388.     m_pParser->insertTimelineElement(m_pID, 
  389. m_pSourceElement->m_ulDelay);
  390. }
  391.     }
  392.     else if(m_pSourceElement->m_nEndEventSourceTag == SMILEventSourceEnd)
  393.     {
  394. if(pEventElement->m_bDurationSet)
  395. {
  396.     m_bDurationSet = TRUE;
  397.     m_pSourceElement->m_ulDuration = 
  398. pEventElement->m_pSourceElement->m_ulDuration +
  399.     pEventElement->m_pSourceElement->m_ulDelay;
  400.     m_pParser->insertTimelineElement(m_pID, 
  401. m_pSourceElement->m_ulDelay);
  402. }
  403.     }
  404.     //[SMIL 1.0 compliance] Fixes PR 16629; we need to set our duration
  405.     // to the event element's end time plus the clock offset:
  406.     else if(m_pSourceElement->m_nEndEventSourceTag == SMILEventSourceClock)
  407.     {
  408. if(pEventElement->m_bDelaySet)
  409. {
  410.     m_bDurationSet = TRUE;
  411.     m_pSourceElement->m_ulDuration = 
  412.     pEventElement->m_pSourceElement->m_ulDelay +
  413.     m_pSourceElement->m_ulEndEventClockValue;
  414.     m_pParser->insertTimelineElement(m_pID, 
  415. m_pSourceElement->m_ulDelay);
  416. }
  417.     }
  418. }
  419. #if 0
  420. void
  421. CSmil1TimelineElement::setEvent(SMILEventSourceTag eTag,
  422. SMILSyncAttributeTag aTag,
  423. const char* pEventSourceID,
  424. UINT32 ulEventClockValue)
  425. {
  426.     m_eEventSourceTag = eTag;
  427.     m_eSyncAttributeTag = aTag;
  428.     if(pEventSourceID)
  429.     {
  430. m_pEventSourceID = new char[strlen(pEventSourceID)+1];
  431. strcpy(m_pEventSourceID, pEventSourceID); /* Flawfinder: ignore */
  432.         if (m_pParser && m_pParser->m_pTimelineElementManager)
  433.         {
  434.             m_pParser->m_pTimelineElementManager->addNotification(pEventSourceID, this);
  435.         }
  436.     }
  437.     m_ulEventClockValue = ulEventClockValue;
  438. }
  439. #endif
  440. void 
  441. CSmil1TimelineElement::addChild(CSmil1TimelineElement* pChild)
  442. {
  443.     if(!m_pChildren)
  444.     {
  445. m_pChildren = new CHXSimpleList;
  446.     }
  447.     m_pChildren->AddTail(pChild);
  448.     pChild->setParent(this);
  449. }
  450. UINT32
  451. CSmil1TimelineElement::getDuration()
  452. {
  453.     return m_pSourceElement->m_ulDuration;
  454. }
  455. UINT32
  456. CSmil1TimelineElement::getDelay()
  457. {
  458.     return m_pSourceElement->m_ulDelay;
  459. }
  460. void 
  461. CSmil1TimelineElement::dump()
  462. {
  463. }
  464. /*
  465.  * CSmil1TimelinePar methods
  466.  */
  467. CSmil1TimelinePar::CSmil1TimelinePar(CSmil1Element* pSourceElement,
  468.    CSmil1Parser* pParser):
  469.     CSmil1TimelineElement(pSourceElement, pParser),
  470.     m_nDurationAdded(0),
  471.     m_ulFirstDuration(0),
  472.     m_ulLastDuration(0)
  473. {
  474. }
  475. CSmil1TimelinePar::~CSmil1TimelinePar()
  476. {
  477. }
  478. void 
  479. CSmil1TimelinePar::setDelay(UINT32 ulDelay)
  480. {
  481.     if(m_pSourceElement->m_ulBeginOffset != (UINT32)-1)
  482.     {
  483. m_pSourceElement->m_ulDelay = ulDelay + 
  484.     m_pSourceElement->m_ulBeginOffset;
  485.     }
  486.     else
  487.     {
  488. m_pSourceElement->m_ulDelay = ulDelay;
  489.     }
  490.     if (!m_bDelayEvent) //[SMIL 1.0 compliance] helps fix PR 14420.
  491.     {
  492. m_bDelaySet = TRUE;
  493. if(m_pChildren)
  494. {
  495.     CHXSimpleList::Iterator i = m_pChildren->Begin();
  496.     for(; i != m_pChildren->End(); ++i)
  497.     {
  498. CSmil1TimelineElement* pElement = (CSmil1TimelineElement*)(*i);
  499. pElement->setDelay(m_pSourceElement->m_ulDelay);
  500.     }
  501. }
  502. if (m_pSourceElement->m_ulDuration != (UINT32)-1)
  503. {
  504.     setDuration(m_pSourceElement->m_ulDuration);
  505. }
  506.     }
  507.     else //[SMIL 1.0 compliance] for PR 14420:
  508. // let's not claim that the delay is set when we still
  509. // are awaiting a delay (begin) event; we *do* need to
  510. // add the delay of this to the event's begin offset.
  511. // This is done by setting the new "m_bNonEventDelaySet"
  512. // variable to TRUE and leaving m_bDelaySet to FALSE
  513. // until the ElementResolved() call sets it to true:
  514.     {
  515. //Parent calls setDelay before we get to ElementResolved,
  516. // thus m_bDelaySet should never be TRUE if we have a
  517. // delay event:
  518. HX_ASSERT(!m_bDelaySet);
  519. m_bNonEventDelaySet = TRUE; //ElementResolved will look at this.
  520.     }
  521. }
  522. void
  523. CSmil1TimelinePar::setDuration(UINT32 ulDuration, BOOL bSetFromParent)
  524. {
  525.     m_pSourceElement->m_ulDuration = ulDuration;
  526.     m_bDurationSet = TRUE;
  527.     if(m_pChildren)
  528.     {
  529. CHXSimpleList::Iterator i = m_pChildren->Begin();
  530. for(; i != m_pChildren->End(); ++i)
  531. {
  532.     CSmil1TimelineElement* pElement = (CSmil1TimelineElement*)(*i);
  533.     pElement->setDuration(m_pSourceElement->m_ulDuration, TRUE);
  534.         }
  535.     }
  536.     
  537.     if(m_pDependent)
  538.     {
  539. adjustDependentDuration(m_pDependent);
  540. m_pDependent->setDelay(m_pSourceElement->m_ulDelay + m_pSourceElement->m_ulDuration);
  541.     }
  542.     //[SMIL 1.0 comliance] Helps fix PR 14420 and 23025:
  543.     if (m_pParser && m_pParser->m_pTimelineElementManager)
  544.     {
  545.         m_pParser->m_pTimelineElementManager->notify(m_pID);
  546.     }
  547. }
  548. void
  549. CSmil1TimelinePar::setMaxDuration(UINT32 ulMaxDuration)
  550. {
  551.     HX_ASSERT(m_pChildren);
  552.     m_bMaxDurationSet = TRUE;
  553.     m_pSourceElement->m_ulMaxDuration = ulMaxDuration;
  554.     if (m_pChildren)
  555.     {
  556. CHXSimpleList::Iterator i = m_pChildren->Begin();
  557. for(; i != m_pChildren->End(); ++i)
  558. {
  559.     CSmil1TimelineElement* pElement = (CSmil1TimelineElement*)(*i);
  560.     pElement->setMaxDuration(ulMaxDuration);
  561. }
  562.     }
  563. }
  564. void 
  565. CSmil1TimelinePar::adjustDependentDuration(CSmil1TimelineElement* pDependent)
  566. {
  567.     if (m_pParent)
  568.     {
  569. m_pParent->adjustDependentDuration(pDependent);
  570.     }
  571.     return;
  572. }
  573. void 
  574. CSmil1TimelinePar::addDuration(UINT32 ulDuration,
  575.       UINT32 ulDelay,
  576.       const char* pElementID)
  577. {
  578.     if(m_pSourceElement->m_ulDuration == (UINT32)-1)
  579.     {
  580. m_pSourceElement->m_ulDuration = ulDuration;
  581. m_ulFirstDuration = ulDuration;
  582. m_ulLastDuration = ulDuration;
  583.     }
  584.     else
  585.     {
  586. m_pSourceElement->m_ulDuration = 
  587.     (ulDuration > m_pSourceElement->m_ulDuration) ?
  588.     ulDuration : m_pSourceElement->m_ulDuration;
  589. if(ulDuration < m_ulFirstDuration)
  590. {
  591.     m_ulFirstDuration = ulDuration;
  592. }
  593. if(ulDuration > m_ulLastDuration)
  594. {
  595.     m_ulLastDuration = ulDuration;
  596. }
  597.     }
  598.     m_nDurationAdded++;
  599.     if(m_nDurationAdded == m_pChildren->GetCount() &&
  600. !m_bDurationEvent)
  601.     {
  602. if(m_pSourceElement->m_nEndsyncEventSourceTag == 
  603.     SMILEventSourceFirst)
  604. {
  605.     durationResolved(m_ulFirstDuration, TRUE);
  606. }
  607. else if(m_pSourceElement->m_nEndsyncEventSourceTag == 
  608.     SMILEventSourceLast)
  609. {
  610.     durationResolved(m_ulLastDuration, TRUE);
  611. }
  612. else
  613. {
  614.     durationResolved(m_pSourceElement->m_ulDuration, FALSE);
  615. }
  616.     }
  617. }
  618. void
  619. CSmil1TimelinePar::elementResolved(CSmil1TimelineElement* pEventElement)
  620. {
  621. //XXXEH: do we really want to check m_bDurationSet and m_bDelaySet...etc.
  622. // first???? (as in old version)
  623. //XXXEH: also, shouldn't we be making sure the pEventElement's id
  624. // matches the m_[XXX]EventSourceID?  Otherwise, a begin event on one id
  625. // and an end event on another may cause problems...
  626.     //First, let's see if we have a begin event to resolve:
  627.     if(m_pSourceElement->m_nBeginEventSourceTag == SMILEventSourceBegin)
  628.     {
  629. if(pEventElement->m_bDelaySet)
  630. {
  631.     //[SMIL 1.0 Compliance] Helps fix 14420:
  632.     if (m_bNonEventDelaySet)
  633.     {
  634. //Add non-event delay to begin event delay:
  635. m_pSourceElement->m_ulDelay += 
  636.     pEventElement->m_pSourceElement->m_ulDelay;
  637.     }
  638.     else
  639.     {
  640. //Just set delay to event delay:
  641. m_pSourceElement->m_ulDelay = 
  642.     pEventElement->m_pSourceElement->m_ulDelay;
  643.     }
  644.     m_bNonEventDelaySet = m_bDelaySet = TRUE;
  645.     if(m_pChildren)
  646.     {
  647. CHXSimpleList::Iterator i = m_pChildren->Begin();
  648. for(; i != m_pChildren->End(); ++i)
  649. {
  650.     CSmil1TimelineElement* pElement =
  651.     (CSmil1TimelineElement*)(*i);
  652.     pElement->setDelay(m_pSourceElement->m_ulDelay);
  653. }
  654.     }
  655. }
  656.     }
  657.     else if(m_pSourceElement->m_nBeginEventSourceTag == SMILEventSourceEnd)
  658.     {
  659. if(pEventElement->m_bDurationSet)
  660. {
  661.     //[SMIL 1.0 Compliance] Helps fix 14420:
  662.     if (m_bNonEventDelaySet)
  663.     {
  664. //Add non-event delay to begin event delay:
  665. m_pSourceElement->m_ulDelay += 
  666.     pEventElement->m_pSourceElement->m_ulDuration +
  667.     pEventElement->m_pSourceElement->m_ulDelay;
  668.     }
  669.     else
  670.     {
  671. //Just set delay to event delay:
  672. m_pSourceElement->m_ulDelay = 
  673.     pEventElement->m_pSourceElement->m_ulDuration +
  674.     pEventElement->m_pSourceElement->m_ulDelay;
  675.     }
  676.     m_bNonEventDelaySet = m_bDelaySet = TRUE;
  677.     if(m_pChildren)
  678.     {
  679. CHXSimpleList::Iterator i = m_pChildren->Begin();
  680. for(; i != m_pChildren->End(); ++i)
  681. {
  682.     CSmil1TimelineElement* pElement =
  683.     (CSmil1TimelineElement*)(*i);
  684.     pElement->setDelay(m_pSourceElement->m_ulDelay);
  685. }
  686.     }
  687. }
  688.     }
  689.     else if(m_pSourceElement->m_nBeginEventSourceTag == SMILEventSourceClock)
  690.     {
  691. //We want event *BEGIN* plus clock therefor check for m_bDelaySet not
  692. // m_bDurationSet; after all, it's the eventElement's m_ulDelay
  693. // that's used, below:
  694. if(pEventElement->m_bDelaySet)
  695. {
  696.     if (m_bNonEventDelaySet)
  697.     {
  698. //Add non-event delay to begin event delay + clock val:
  699. m_pSourceElement->m_ulDelay += 
  700.     pEventElement->m_pSourceElement->m_ulDelay +
  701.     m_pSourceElement->m_ulBeginEventClockValue;
  702.     }
  703.     else
  704.     {
  705. //Just set delay to event delay:
  706. m_pSourceElement->m_ulDelay = 
  707.     pEventElement->m_pSourceElement->m_ulDelay +
  708.     m_pSourceElement->m_ulBeginEventClockValue;
  709.     }
  710.     m_bNonEventDelaySet = m_bDelaySet = TRUE;
  711.     if(m_pChildren)
  712.     {
  713. CHXSimpleList::Iterator i = m_pChildren->Begin();
  714. for(; i != m_pChildren->End(); ++i)
  715. {
  716.     CSmil1TimelineElement* pElement =
  717.     (CSmil1TimelineElement*)(*i);
  718.     pElement->setDelay(m_pSourceElement->m_ulDelay);
  719. }
  720.     }
  721. }
  722.     }
  723.     
  724. //XXXEH: shouldn't we be making sure the pEventElement's id
  725. // matches the m_[XXX]EventSourceID, otherwise a begin event on one id
  726. // and an end event on another will cause problems.
  727. #if defined(XXXEH_UNTESTED_AND_NOT_EXAMINED_WELL)
  728.     if(m_pSourceElement->m_nEndEventSourceTag == SMILEventSourceBegin)
  729.     {
  730. if(pEventElement->m_bDelaySet)
  731. {
  732.     durationResolved(pEventElement->m_pSourceElement->m_ulDelay,
  733.     TRUE);
  734. }
  735.     }
  736.     else if(m_pSourceElement->m_nEndEventSourceTag == SMILEventSourceEnd)
  737.     {
  738. if(pEventElement->m_bDurationSet)
  739. {
  740.     durationResolved(pEventElement->getDuration(), TRUE);
  741. }
  742.     }
  743.     else if(m_pSourceElement->m_nEndEventSourceTag == SMILEventSourceClock)
  744.     {
  745. if(pEventElement->m_bDelaySet)
  746. {
  747.     durationResolved(pEventElement->m_pSourceElement->m_ulDelay +
  748.     m_pSourceElement->m_ulEndEventClockValue, TRUE);
  749. }
  750.     }
  751. #endif // defined(XXXEH_UNTESTED_AND_NOT_EXAMINED_WELL).
  752.     //[SMIL 1.0 compliance] Helps fix PR 32578:
  753.     if (m_pSourceElement->m_nEndsyncEventSourceTag == SMILEventSourceID)
  754.     {
  755. if(pEventElement->m_bDurationSet)
  756. {
  757.     durationResolved(pEventElement->getDuration(), TRUE);
  758. }
  759.     }
  760. }
  761. void
  762. CSmil1TimelinePar::durationResolved(UINT32 ulDuration, BOOL bUpdateChildren)
  763. {
  764.     if(!m_bDurationSet)
  765.     {
  766. m_bDurationSet = TRUE;
  767. m_pSourceElement->m_ulDuration = ulDuration;
  768. if(m_pParent)
  769. {
  770.     m_pParent->addDuration(ulDuration, 
  771. m_pSourceElement->m_ulDelay, m_pID);
  772. }
  773. if(m_pDependent)
  774. {
  775.     //XXXEH- should "m_pSourceElement->m_ulDelay +" be removed, too?
  776.     // I can't get any content to hit this line so I'm not going to
  777.     // change it.  See fix for PR SMIL/13983:
  778.     adjustDependentDuration(m_pDependent);
  779.     m_pDependent->setDelay(m_pSourceElement->m_ulDelay +
  780. m_pSourceElement->m_ulDuration);     
  781. }
  782. if(bUpdateChildren)
  783. {
  784.     CHXSimpleList::Iterator i = m_pChildren->Begin();
  785.     for(; i != m_pChildren->End(); ++i)
  786.     {
  787. CSmil1TimelineElement* pElement = (CSmil1TimelineElement*)(*i);
  788. pElement->setDuration(m_pSourceElement->m_ulDuration, TRUE);
  789.     }
  790. }
  791.     }
  792. }
  793. #if 0
  794. void 
  795. CSmil1TimelinePar::setEndsync(EndsyncType eType, 
  796.      const char* pEndsyncID,
  797.      UINT32 ulEndsyncClockValue)
  798. {
  799.     m_eEndsyncType = eType;
  800.     m_ulEndsyncClockValue = ulEndsyncClockValue;
  801.     if(pEndsyncID)
  802.     {
  803. m_pEndsyncID = new char[strlen(pEndsyncID)+1];
  804. strcpy(m_pEndsyncID, pEndsyncID); /* Flawfinder: ignore */
  805.     }
  806. }
  807. #endif
  808. /*
  809.  * CSmil1TimelineSeq methods
  810.  */
  811. CSmil1TimelineSeq::CSmil1TimelineSeq(CSmil1Element* pSourceElement,
  812.    CSmil1Parser* pParser):
  813.     CSmil1TimelineElement(pSourceElement, pParser),
  814.     m_nDurationAdded(0)
  815. {
  816. }
  817. void 
  818. CSmil1TimelineSeq::addDuration(UINT32 ulDuration, 
  819.       UINT32 ulDelay,
  820.       const char* pID)
  821. {
  822.     ASSERT(m_pChildren);
  823.     if(!m_bDurationSet)
  824.     {
  825. if(m_pSourceElement->m_ulDuration == (UINT32)-1)
  826. {
  827.     m_pSourceElement->m_ulDuration = ulDuration;
  828. }
  829. else
  830. {
  831.     m_pSourceElement->m_ulDuration += ulDuration;
  832. }
  833.     }
  834.     m_nDurationAdded++;
  835.     if(m_nDurationAdded == m_pChildren->GetCount())
  836.     {
  837. m_bDurationSet = TRUE;
  838. if(m_pParent)
  839. {
  840.     m_pParent->addDuration(
  841. m_pSourceElement->m_ulDuration, 
  842. m_pSourceElement->m_ulDelay, m_pID);
  843. }
  844. if(m_pDependent)
  845. {
  846.     //XXXEH- should "m_pSourceElement->m_ulDelay +" be removed, too?
  847.     // I can't get any content to hit this line so I'm not going to
  848.     // change it.  See fix for PR SMIL/13983:
  849.     adjustDependentDuration(m_pDependent);
  850.     m_pDependent->setDelay(m_pSourceElement->m_ulDelay +
  851. m_pSourceElement->m_ulDuration);     
  852. }
  853. // /[SMIL 1.0 Compliance] Fixes PR 23779:
  854. // if a source has event-based timing based on this seq's
  855. // duration, then we need to notify that source that we've
  856. // resolved this value:
  857.         if (m_pParser && m_pParser->m_pTimelineElementManager)
  858.         {
  859.             m_pParser->m_pTimelineElementManager->notify(m_pID);
  860.         }
  861.     }
  862. }
  863. void 
  864. CSmil1TimelineSeq::setDelay(UINT32 ulDelay)
  865. {
  866.     if(m_pSourceElement->m_ulBeginOffset != (UINT32)-1)
  867.     {
  868. m_pSourceElement->m_ulDelay = ulDelay + 
  869.     m_pSourceElement->m_ulBeginOffset;
  870.     }
  871.     else
  872.     {
  873. m_pSourceElement->m_ulDelay = ulDelay;
  874.     }
  875.     //XXXJHUG - we need to prevent overwriting the delay when
  876.     // setInitalDelay is called on THIS element, changing this
  877.     // bool causes initialDelaySet to return TRUE.
  878.     m_bDelaySet = TRUE;
  879.     if(m_pChildren && m_pChildren->GetCount() > 0)
  880.     {
  881. // set delay on first child of seq
  882. CSmil1TimelineElement* pElement = 
  883.     (CSmil1TimelineElement*)m_pChildren->GetHead();
  884. pElement->setDelay(m_pSourceElement->m_ulDelay);
  885.     }
  886.     if (m_pSourceElement->m_ulDuration != (UINT32)-1)
  887.     {
  888. setDuration(m_pSourceElement->m_ulDuration);
  889.     }
  890.     //[SMIL 1.0 Compliance] Helps fix PR 14420 and 23025:
  891.     // if a source has event-based timing based on this seq's
  892.     // begin time (delay) then we need to notify that source
  893.     // that we've resolved this value:
  894.     if (m_pParser && m_pParser->m_pTimelineElementManager)
  895.     {
  896.         m_pParser->m_pTimelineElementManager->notify(m_pID);
  897.     }
  898. }
  899. void
  900. CSmil1TimelineSeq::setDuration(UINT32 ulDuration, BOOL bSetFromParent)
  901. {
  902.     ASSERT(m_pChildren);
  903.     if(!m_bDurationSet)
  904.     {
  905. m_pSourceElement->m_ulDuration = ulDuration;
  906. m_bDurationSet = TRUE;
  907.     }
  908.     UINT32 ulDurationLeft = m_pSourceElement->m_ulDuration;
  909.     RepeatTag repeatTag = RepeatUnknown;
  910.     CHXSimpleList::Iterator i = m_pChildren->Begin();
  911.     for(; i != m_pChildren->End(); ++i)
  912.     {
  913. CSmil1TimelineElement* pElement = (CSmil1TimelineElement*)(*i);
  914. if (!setElementDuration(ulDurationLeft, pElement))
  915. {
  916.     break;
  917. }
  918.     }
  919.     if(m_pDependent)
  920.     {
  921. adjustDependentDuration(m_pDependent);
  922. m_pDependent->setDelay(m_pSourceElement->m_ulDelay + m_pSourceElement->m_ulDuration);
  923.     }
  924.     //[SMIL 1.0 comliance] Helps fix PR 14420 and 23025:
  925.     if (m_pParser && m_pParser->m_pTimelineElementManager)
  926.     {
  927.         m_pParser->m_pTimelineElementManager->notify(m_pID);
  928.     }
  929. }
  930. void
  931. CSmil1TimelineSeq::setMaxDuration(UINT32 ulMaxDuration)
  932. {
  933.     HX_ASSERT(m_pChildren);
  934.     m_bMaxDurationSet = TRUE;
  935.     m_pSourceElement->m_ulMaxDuration = ulMaxDuration;
  936.     if (m_pChildren)
  937.     {
  938. CSmil1TimelineElement* pElement = (CSmil1TimelineElement*)m_pChildren->GetHead();
  939. pElement->setMaxDuration(ulMaxDuration);
  940.     }
  941. }
  942. void 
  943. CSmil1TimelineSeq::adjustDependentDuration(CSmil1TimelineElement* pDependent)
  944. {
  945.     if(m_bDurationSet || m_bMaxDurationSet)
  946.     {
  947. UINT32     ulDurationLeft = m_bDurationSet?m_pSourceElement->m_ulDuration:
  948.     m_pSourceElement->m_ulMaxDuration;
  949. BOOL     bAdjusted = FALSE;
  950. RepeatTag   repeatTag = RepeatUnknown;
  951. CHXSimpleList::Iterator i = m_pChildren->Begin();
  952. for(; i != m_pChildren->End(); ++i)
  953. {
  954.     CSmil1TimelineElement* pElement = (CSmil1TimelineElement*)(*i);
  955.     UINT32 ulChildDuration = pElement->getDuration();
  956.     if (pElement == pDependent)
  957.     {
  958. bAdjusted = TRUE;
  959.     }
  960.     if (bAdjusted)
  961.     {
  962. if (!setElementDuration(ulDurationLeft, pElement))
  963. {
  964.     break;
  965. }
  966.     }
  967.     else
  968.     {
  969. if(ulDurationLeft >= ulChildDuration)
  970. {
  971.     ulDurationLeft -= ulChildDuration;
  972. }
  973. else
  974. {
  975.     ulDurationLeft = 0;
  976. }     
  977.     }
  978. }
  979. if (!bAdjusted && m_pParent)
  980. {
  981.     m_pParent->adjustDependentDuration(pDependent);
  982. }
  983.     }
  984. }
  985. BOOL
  986. CSmil1TimelineSeq::setElementDuration(UINT32& ulDurationLeft, CSmil1TimelineElement* pElement)
  987. {
  988.     BOOL bContinue = TRUE;
  989.     UINT32 ulChildDuration = pElement->getDuration();
  990.     RepeatTag   repeatTag = pElement->m_pSourceElement->m_pNode->m_repeatTag;
  991.     if (repeatTag == RepeatIndefiniteOnMe)
  992.     {
  993. pElement->setMaxDuration(ulDurationLeft);
  994. ulDurationLeft = 0;
  995. goto cleanup;
  996.     }
  997.     else if (repeatTag == RepeatIndefiniteOnGroup)
  998.     {
  999. pElement->setMaxDuration(ulDurationLeft);
  1000. bContinue = FALSE;
  1001. goto cleanup;
  1002.     }
  1003.     // no more duration left, take care of the duration of the rest of 
  1004.     // the elements
  1005.     if (0 == ulDurationLeft)
  1006.     {
  1007. pElement->setDuration(ulDurationLeft, TRUE);
  1008.     }
  1009.     // if this is the last child, then enforce the duration whatever
  1010.     // left
  1011.     else if (pElement == m_pChildren->GetTail())
  1012.     {
  1013. pElement->setDuration(ulDurationLeft, TRUE);
  1014. bContinue = FALSE;
  1015.     }
  1016.     // unknown duration, so we apply max. duration here
  1017.     else if (ulChildDuration == (UINT32)-1)
  1018.     {
  1019. pElement->setMaxDuration(ulDurationLeft);
  1020. bContinue = FALSE;
  1021.     }
  1022.     else
  1023.     {
  1024. if(ulDurationLeft >= ulChildDuration)
  1025. {
  1026.     ulDurationLeft -= ulChildDuration;
  1027. }
  1028. else
  1029. {
  1030.     pElement->setDuration(ulDurationLeft, TRUE);
  1031.     ulDurationLeft = 0;
  1032. }
  1033.     }
  1034. cleanup:
  1035.     return bContinue;
  1036. }
  1037. /*
  1038.  * CSmil1TimelineAnchor methods
  1039.  */
  1040. CSmil1TimelineAnchor::CSmil1TimelineAnchor(CSmil1Element* pSourceElement,
  1041.    CSmil1Parser* pParser):
  1042.     CSmil1TimelineElement(pSourceElement, pParser)
  1043.     , m_nDurationAdded(0)
  1044. {
  1045. }
  1046. CSmil1TimelineAnchor::~CSmil1TimelineAnchor()
  1047. {
  1048. }
  1049. void
  1050. CSmil1TimelineAnchor::elementResolved(CSmil1TimelineElement* pEventElement)
  1051. {
  1052. //XXXEH: shouldn't we be making sure the pEventElement's id
  1053. // matches the m_[XXX]EventSourceID?  Otherwise, a begin event on one id
  1054. // and an end event on another may cause problems...
  1055.     //First, let's see if we have a begin event to resolve:
  1056.     if(m_pSourceElement->m_nBeginEventSourceTag == SMILEventSourceBegin)
  1057.     {
  1058. if(pEventElement->m_bDelaySet)
  1059. {
  1060.     //[SMIL 1.0 Compliance] Helps fix 14420:
  1061.     if (m_bNonEventDelaySet)
  1062.     {
  1063. //Add non-event delay to begin event delay:
  1064. m_pSourceElement->m_ulDelay += 
  1065.     pEventElement->m_pSourceElement->m_ulDelay;
  1066.     }
  1067.     else
  1068.     {
  1069. //Just set delay to event delay:
  1070. m_pSourceElement->m_ulDelay = 
  1071.     pEventElement->m_pSourceElement->m_ulDelay;
  1072.     }
  1073.     m_bNonEventDelaySet = m_bDelaySet = TRUE;
  1074.     if(m_pChildren)
  1075.     {
  1076. CHXSimpleList::Iterator i = m_pChildren->Begin();
  1077. for(; i != m_pChildren->End(); ++i)
  1078. {
  1079.     CSmil1TimelineElement* pElement =
  1080.     (CSmil1TimelineElement*)(*i);
  1081.     pElement->setDelay(m_pSourceElement->m_ulDelay);
  1082. }
  1083.     }
  1084. }
  1085.     }
  1086.     else if(m_pSourceElement->m_nBeginEventSourceTag == SMILEventSourceEnd)
  1087.     {
  1088. if(pEventElement->m_bDurationSet)
  1089. {
  1090.     //[SMIL 1.0 Compliance] Helps fix 14420:
  1091.     if (m_bNonEventDelaySet)
  1092.     {
  1093. //Add non-event delay to begin event delay:
  1094. m_pSourceElement->m_ulDelay += 
  1095.     pEventElement->m_pSourceElement->m_ulDuration +
  1096.     pEventElement->m_pSourceElement->m_ulDelay;
  1097.     }
  1098.     else
  1099.     {
  1100. //Just set delay to event delay:
  1101. m_pSourceElement->m_ulDelay = 
  1102.     pEventElement->m_pSourceElement->m_ulDuration +
  1103.     pEventElement->m_pSourceElement->m_ulDelay;
  1104.     }
  1105.     m_bNonEventDelaySet = m_bDelaySet = TRUE;
  1106.     if(m_pChildren)
  1107.     {
  1108. CHXSimpleList::Iterator i = m_pChildren->Begin();
  1109. for(; i != m_pChildren->End(); ++i)
  1110. {
  1111.     CSmil1TimelineElement* pElement =
  1112.     (CSmil1TimelineElement*)(*i);
  1113.     pElement->setDelay(m_pSourceElement->m_ulDelay);
  1114. }
  1115.     }
  1116. }
  1117.     }
  1118.     else if(m_pSourceElement->m_nBeginEventSourceTag == SMILEventSourceClock)
  1119.     {
  1120. //We want event *BEGIN* plus clock therefor check for m_bDelaySet not
  1121. // m_bDurationSet; after all, it's the eventElement's m_ulDelay
  1122. // that's used, below:
  1123. if(pEventElement->m_bDelaySet)
  1124. {
  1125.     if (m_bNonEventDelaySet)
  1126.     {
  1127. //Add non-event delay to begin event delay + clock val:
  1128. m_pSourceElement->m_ulDelay += 
  1129.     pEventElement->m_pSourceElement->m_ulDelay +
  1130.     m_pSourceElement->m_ulBeginEventClockValue;
  1131.     }
  1132.     else
  1133.     {
  1134. //Just set delay to event delay:
  1135. m_pSourceElement->m_ulDelay = 
  1136.     pEventElement->m_pSourceElement->m_ulDelay +
  1137.     m_pSourceElement->m_ulBeginEventClockValue;
  1138.     }
  1139.     m_bNonEventDelaySet = m_bDelaySet = TRUE;
  1140.     if(m_pChildren)
  1141.     {
  1142. CHXSimpleList::Iterator i = m_pChildren->Begin();
  1143. for(; i != m_pChildren->End(); ++i)
  1144. {
  1145.     CSmil1TimelineElement* pElement =
  1146.     (CSmil1TimelineElement*)(*i);
  1147.     pElement->setDelay(m_pSourceElement->m_ulDelay);
  1148. }
  1149.     }
  1150. }
  1151.     }
  1152.     
  1153. //XXXEH: shouldn't we be making sure the pEventElement's id
  1154. // matches the m_[XXX]EventSourceID, otherwise a begin event on one id
  1155. // and an end event on another will cause problems.
  1156. #if defined(XXXEH_UNTESTED_AND_NOT_EXAMINED_WELL)
  1157.     if(m_pSourceElement->m_nEndEventSourceTag == SMILEventSourceBegin)
  1158.     {
  1159. if(pEventElement->m_bDelaySet)
  1160. {
  1161.     durationResolved(pEventElement->m_pSourceElement->m_ulDelay);
  1162. }
  1163.     }
  1164.     else if(m_pSourceElement->m_nEndEventSourceTag == SMILEventSourceEnd)
  1165.     {
  1166. if(pEventElement->m_bDurationSet)
  1167. {
  1168.     durationResolved(pEventElement->getDuration());
  1169. }
  1170.     }
  1171.     else if(m_pSourceElement->m_nEndEventSourceTag == SMILEventSourceClock)
  1172.     {
  1173. if(pEventElement->m_bDelaySet)
  1174. {
  1175.     durationResolved(pEventElement->m_pSourceElement->m_ulDelay +
  1176.     m_pSourceElement->m_ulEndEventClockValue);
  1177. }
  1178.     }
  1179. #endif // defined(XXXEH_UNTESTED_AND_NOT_EXAMINED_WELL).
  1180. }
  1181. void
  1182. CSmil1TimelineAnchor::durationResolved(UINT32 ulDuration)
  1183. {
  1184.     if(!m_bDurationSet)
  1185.     {
  1186. m_bDurationSet = TRUE;
  1187. m_pSourceElement->m_ulDuration = ulDuration;
  1188.     }
  1189. }