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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: smlparse.h,v 1.6.12.1 2004/07/09 01:57:56 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. #ifndef _SMLPARSE_H_
  50. #define _SMLPARSE_H_
  51. #define MAX_PENDING_CHECK_CALLDEPTH 20
  52. /* <body dur="20s">[no sources]</body> is valid; we need to handle it: */
  53. #define DEFAULT_DUR_IF_NO_SOURCES_SCHEDULED   SMILTIME_INVALID
  54. // forward declarations
  55. typedef _INTERFACE IHXSystemRequired     IHXSystemRequired;
  56. typedef _INTERFACE IHXBuffer             IHXBuffer;
  57. typedef _INTERFACE IHXValues             IHXValues;
  58. typedef _INTERFACE IHXXMLParserResponse  IHXXMLParserResponse;
  59. typedef _INTERFACE IHXCommonClassFactory IHXCommonClassFactory;
  60. typedef _INTERFACE IHXXMLParser          IHXXMLParser;
  61. typedef void*                             LISTPOSITION;
  62. class CHXString;
  63. class SMILNodeList;
  64. class CSmilElement;
  65. class CHXSimpleList;
  66. class ErrorNotifier;
  67. class CSmilParser;
  68. class CSmilElementHandler;
  69. class SmilTimeValue;
  70. class CHXPtrArray;
  71. class CSmilAnchorElement;
  72. class CHXStack;
  73. class CSmilRegion;
  74. class CSmilRegPoint;
  75. #if defined(HELIX_FEATURE_SMIL2_MULTIWINDOWLAYOUT)
  76. class CSmilViewport;
  77. #endif /* #if defined(HELIX_FEATURE_SMIL2_MULTIWINDOWLAYOUT) */
  78. class CSmilTransition;
  79. class CSmilRootLayout;
  80. class CSmilMeta;
  81. class CSmilMetadata;
  82. class CSmilRendererPreFetch;
  83. class CSmilSource;
  84. class CSmilPriorityClassElement;
  85. class CSmilAAnchorElement;
  86. class CSmilSeqElement;
  87. class CSmilParElement;
  88. class CSmilExclElement;
  89. class CSmilAnimateElement;
  90. class CSmilParamElement;
  91. class CSmilCustomTest;
  92. class XMLError;
  93. class CHXMapLongToObj;
  94. class CHXMapStringToOb;
  95. #if defined(HELIX_FEATURE_SMIL2_VALIDATION)
  96. class CRNBinaryMap;
  97. #endif /* #if defined(HELIX_FEATURE_SMIL2_VALIDATION) */
  98. class CNamespaceInfo;
  99. class CSmilBodyElement;
  100. class CSmilTimelineElementManager;
  101. /* // /XXXEH- we can't do the following until the core starts notifying
  102. // us every time a repeated track begins:
  103. //#define XXXEH_REPEAT_VALUE_TIMING_SHOULD_BE_EVENT_BASED
  104. */
  105. #define NUM_SUPPORTED_SMIL_2_0_MODULE_NAMESPACES   55
  106. class SMILNamespace
  107. {
  108. public:
  109.     SMILNamespace(SMILNamespace* pNS);
  110.     SMILNamespace(const char* name, IHXBuffer* pVal);
  111.     virtual ~SMILNamespace();
  112.     char*       m_name;
  113.     IHXBuffer* m_pValue;
  114. };
  115. class SMILNode
  116. {
  117. public:
  118.     SMILNode();
  119.     virtual ~SMILNode();
  120. #if defined(XXXEH_REPEAT_VALUE_TIMING_SHOULD_BE_EVENT_BASED)
  121.     SMILNode(const SMILNode&, BOOL bKeepId=FALSE, CSmilParser* pParser = NULL);
  122. #else
  123.     SMILNode(const SMILNode&, BOOL bKeepId=FALSE, CSmilParser* pParser = NULL,
  124.              UINT32 ulRepeatNum=0);
  125. #endif
  126.     SMILNode* getFirstChild();
  127.     SMILNode* getNextChild();
  128.     CHXString      m_repeatid;
  129.     CHXString      m_id;
  130.     CHXString      m_name;
  131.     UINT32         m_num;    
  132.     SMILNodeTag    m_tag;
  133.     SMILNode*      m_pParent;
  134.     SMILNode*      m_pDependency;
  135.     SMILNodeList*  m_pNodeList;
  136.     IHXValues*    m_pValues;
  137.     CSmilElement*  m_pElement;
  138.     UINT16         m_nGroup;
  139.     RepeatTag      m_repeatTag;
  140.     CHXString      m_trackHint;
  141.     UINT32         m_ulTagStartLine;
  142.     UINT32         m_ulTagStartColumn;
  143.     UINT16         m_nPrefetchTrackNum;
  144.     double         m_fPartialPlayFactor;
  145.     UINT32         m_ulRepeatDur;
  146.     CHXSimpleList* m_pNamespaceList;
  147.     SMIL2Element   m_eElement;
  148.     // ONLY HX_BITFIELD MEMBERS SHOULD GO BELOW THIS LINE!
  149.     // ALL OTHER MEMBER TYPES SHOULD GO ABOVE THIS LINE!
  150.     HX_BITFIELD    m_bLastInGroup : 1;
  151.     HX_BITFIELD    m_bDelete : 1;
  152.     HX_BITFIELD    m_bSkipContent : 1;
  153.     HX_BITFIELD    m_bRepeatHandled : 1;
  154.     HX_BITFIELD    m_bIsSeqWrapperForRepeatElement : 1;
  155.     HX_BITFIELD    m_bIsOuterWrapperTimeContainer : 1;
  156.     HX_BITFIELD    m_bBeginHandledByWrapperParent : 1;
  157.     HX_BITFIELD    m_bEndHandledByWrapperParent : 1;
  158.     HX_BITFIELD    m_bMinHandledByWrapperParent : 1;
  159.     HX_BITFIELD    m_bMaxHandledByWrapperParent : 1;
  160.     HX_BITFIELD    m_bNeedToResolveRepeatDurVSRepeatCount : 1;
  161.     HX_BITFIELD    m_bCloseNode : 1;
  162.     HX_BITFIELD    m_bNamespacedElement : 1;
  163. private:
  164.     LISTPOSITION   m_curPosition;
  165. };
  166. class SMILNodeList: public CHXSimpleList
  167. {
  168. public:
  169.     SMILNodeList();
  170.     virtual ~SMILNodeList();
  171.     SMILNodeList* copy(SMILNode* pParent, BOOL bKeepId = FALSE, CSmilParser* pParser = NULL);
  172.     SMILNode* m_pParentNode;
  173. };
  174. class CNamespaceInfo
  175. {
  176. public:
  177.     CNamespaceInfo();
  178.     ~CNamespaceInfo();
  179.     char*              m_pszPrefix;
  180.     char*              m_pszURL;
  181.     SupportedNamespace m_eNamespace;
  182.     // ONLY HX_BITFIELD MEMBERS SHOULD GO BELOW THIS LINE!
  183.     // ALL OTHER MEMBER TYPES SHOULD GO ABOVE THIS LINE!
  184.     HX_BITFIELD        m_bImplemented : 1;
  185. };
  186. class CSmilParserResponse : public IHXXMLParserResponse,
  187.                             public ErrorNotifier
  188. {
  189. public:
  190.     CSmilParserResponse(CSmilParser* pParser);
  191.     virtual ~CSmilParserResponse();
  192.     // IUnknown methods
  193.     STDMETHOD(QueryInterface)    (THIS_ REFIID riid, void** ppvObj);
  194.     STDMETHOD_(ULONG32, AddRef)  (THIS);
  195.     STDMETHOD_(ULONG32, Release) (THIS);
  196.     // IHXXMLParserResponse methods
  197.     STDMETHOD(HandleStartElement)          (THIS_ const char* pName,
  198.                                                   IHXValues* pAttributes,
  199.                                                   UINT32      ulLineNumber,
  200.                                                   UINT32      ulColumNumber);
  201.     STDMETHOD(HandleEndElement)            (THIS_ const char* pName,
  202.                                                   UINT32      ulLineNumber,
  203.                                                   UINT32      ulColumNumber);
  204.     STDMETHOD(HandleCharacterData)         (THIS_ IHXBuffer* pBuffer,
  205.                                                   UINT32      ulLineNumber,
  206.                                                   UINT32      ulColumNumber);
  207.     STDMETHOD(HandleProcessingInstruction) (THIS_ const char* pTarget,
  208.                                                   IHXValues* pAttributes,
  209.                                                   UINT32      ulLineNumber,
  210.                                                   UINT32      ulColumNumber);
  211.     STDMETHOD(HandleUnparsedEntityDecl)    (THIS_ const char* pEntityName,
  212.                                                   const char* pSystemID,
  213.                                                   const char* pPublicID,
  214.                                                   const char* pNotationName,
  215.                                                   UINT32      ulLineNumber,
  216.                                                   UINT32      ulColumNumber);
  217.     STDMETHOD(HandleNotationDecl)          (THIS_ const char* pNotationName,
  218.                                                   const char* pSystemID,
  219.                                                   const char* pPublicID,
  220.                                                   UINT32      ulLineNumber,
  221.                                                   UINT32      ulColumNumber);
  222.     STDMETHOD(HandleComment)               (THIS_ const char* pComment,
  223.                                                   UINT32      ulLineNumber,
  224.                                                   UINT32      ulColumNumber);
  225.     STDMETHOD(HandleUnparsedDoctypeDecl)   (THIS_ const char* pName, 
  226.                                                   const char* pSystemID,
  227.                                                   const char* pPublicID, 
  228.                                                   UINT32      ulLineNumber,
  229.                                                   UINT32      ulColumNumber);
  230.     STDMETHOD(HandleDefault)               (THIS_ IHXBuffer* pBuffer,
  231.                                                   UINT32      ulLineNumber,
  232.                                                   UINT32      ulColumNumber);
  233.     // ErrorNotifer methods
  234.     HX_RESULT ErrorInLastTag(HX_RESULT   Error,
  235.                              const char* pErrorString,
  236.                              const char* pFrameString,
  237.                              UINT32      ulLineNumber,
  238.                              UINT32      ulLinePosition);
  239. private:
  240.     CSmilParser* m_pParser;
  241.     INT32        m_lRefCount;
  242.     SMILNode*    m_pCurrentNode;
  243. };
  244. struct ExternalEventInfo
  245. {
  246.     CHXString       m_EventBaseID;
  247.     CHXString       m_PrefixedEventName;
  248.     CHXString       m_EventName;
  249.     CNamespaceInfo* m_pInfo;
  250. };
  251. class CSmilParser
  252. {
  253. public:
  254.     CSmilParser(IUnknown* pContext);
  255.     virtual ~CSmilParser();
  256.     HX_RESULT            init(BOOL bStoreErrors = FALSE);
  257.     HX_RESULT            parse(IHXBuffer* pBuffer, BOOL bIsFinal);
  258.     HX_RESULT            parse(const char* pSmilText);
  259. #if defined(HELIX_FEATURE_SMIL2_VALIDATION)
  260.     HX_RESULT            validateContentModel(UINT32 ulElement, SMILNodeList* pChildren);
  261.     HX_RESULT            validateNode(SMILNode* pNode);
  262.     HX_RESULT            validateCDATA(const char* pszStr) const;
  263.     HX_RESULT            validateIDREF(const char* pszStr) const;
  264.     HX_RESULT            validateNMTOKEN(const char* pszStr) const;
  265.     HX_RESULT            validateEnumerated(UINT32 ulElem, UINT32 ulAttr, const char* pszStr);
  266.     BOOL                 isXMLLetter(char c) const;
  267.     BOOL                 isXMLDigit(char c) const;
  268.     BOOL                 isXMLNameChar(char c) const;
  269.     BOOL                 isNamespacePrefixed(const char* pszStr);
  270.     HX_RESULT            normalizeAttribute(const char* pszStr,
  271.                                             BOOL        bIsCDATA,
  272.                                             REF(char*)  rpszNormal);
  273.     HX_RESULT            validateAttribute(UINT32 ulElement, UINT32 ulAttrib,
  274.                                            const char* pszStr, REF(char*) rpszNormStr);
  275.     HX_RESULT            validateElementName(SMILNode* pNode);
  276.     HX_RESULT            setupValidationNamespaces(SMILNode* pNode);
  277.     HX_RESULT            validateAgainstDTD();
  278.     HX_RESULT            checkExtensionElementNamespace(SMIL2Element eElem,
  279.                                                         SupportedNamespace eNS);
  280.     HX_RESULT            checkExtensionAttributeNamespace(SMIL2Attribute eAttr,
  281.                                                           SupportedNamespace eNS);
  282. #endif /* #if defined(HELIX_FEATURE_SMIL2_VALIDATION) */
  283.     CNamespaceInfo*      getNamespaceInfo(const char* pszStr, REF(const char*) rpszAttr);
  284.     HX_RESULT            createElements();
  285.     HX_RESULT            durationResolved(const char* pID, UINT32 ulDuration,
  286.                                           BOOL bSetByParent=FALSE,
  287.                                           BOOL bDurationExtendingDueToPause=FALSE);
  288.     HX_RESULT            trackRemoved(const char* pID, UINT32 ulDuration);
  289.     HX_RESULT            adjustForNegativeOffset(const char* pID);
  290.     void                 insertTimelineElement(const char* pID, UINT32 ulDelay);
  291.     void                 resetTimelineElementDuration(const char* pID,
  292.                                                       UINT32 ulDuration,
  293.                                                       UINT32 ulPriorDuration);
  294.     void                 resetTimelineElementDelay(const char* pID, UINT32 ulDelay,
  295.                                                    UINT32 ulPriorDelay);
  296.     void                 resetTimeline();
  297.     HX_RESULT  prepForSeek(UINT32 ulOldTime, UINT32 ulNewTime);
  298.     HX_RESULT            handlePrefetchFinished(const char* pID, UINT32 ulTimeFinished);
  299.     UINT16               getFragmentGroup(const char* pFragment);
  300.     UINT32               getFragmentOffset(const char* pFragment,
  301.                                            BOOL& bFragFoundAndResolved,
  302.                                            BOOL bResolveBeginOfFragmentTarget=FALSE,
  303.                                            ULONG32 ulCurTime=0);
  304.     HX_RESULT            handleNextElement(CSmilElementHandler* pHandler);
  305.     HX_RESULT            setAllElementHandlers(CSmilElementHandler* pHandler);
  306.     SMILNode*            findFirstNode(SMILNodeTag tag);
  307.     SMILNode*            getFirstNodeChild(SMILNode* pNode);
  308.     SMILNode*            getPrevNode(SMILNode* pCurrentNode);
  309.     CSmilElement*        findElement(const char* pID);
  310.     SMILNode*            getNextNodeChild();
  311.     SMILNodeTag          getSyncTag(SMILNode* pNode);
  312.     void                 getPacketPending(UINT16 unStreamNumber);
  313.     HX_RESULT            addGlobalNamespace(const char* pNamespace, const char* pPrefix);
  314.     HX_RESULT            storeNamespaces(SMILNode* pNode);
  315.     HX_RESULT            addToNamespaceScope(SMILNode* pNode);
  316.     HX_RESULT            removeFromNamespaceScope(SMILNode* pNode);
  317.     BOOL                 isSupportedNonRNNamespace(const char* pNamespace);
  318.     HX_RESULT            addBeginTimeSyncElement(CSmilElement* pElement);
  319.     HX_RESULT            addEndTimeSyncElement(CSmilElement* pElement);
  320.     HX_RESULT            resolveSyncBaseElements();
  321.     HX_RESULT            handleExclDescendants();
  322.     HX_RESULT            addBeginEventElement(SmilTimeValue* pTimeVal);
  323.     HX_RESULT            tryToResolveBeginEndEvents(const char* pEventName,
  324.                                                     const char* pEventElementId,
  325.                                                     ULONG32     ulEventTime);
  326.     HX_RESULT            addEndEventElement(SmilTimeValue* pTimeVal);
  327.     HX_RESULT            addBeginMediaMarkerSyncElement(SmilTimeValue* pTmpVal);
  328.     HX_RESULT            addEndMediaMarkerSyncElement(SmilTimeValue* pTmpVal);
  329.     HX_RESULT            resolveMediaMarkerTime(const char* pszID,
  330.                                                 const char* pszMarkerName,
  331.                                                 UINT32      ulMarkerTime,
  332.                                                 REF(BOOL)   rbNeedHandleElements);
  333.     HX_RESULT            handlePendingScheduling(INT32 lCurTime,
  334.                                                  INT16 iCurrentGroupIndex,
  335.                                                  REF(BOOL) bSomeScheduleWasChanged,
  336.                                                  /*OUT*/ CHXSimpleList* pPauseDisplayElementHideList,
  337.                                                  /*OUT*/ CHXSimpleList* pPauseDisplayDisableElementList);
  338.     HX_RESULT            checkPendingBeginAndEndTimes(INT32     lCurTime,
  339.                                                       INT16 iCurrentGroupIndex,
  340.                                                       REF(BOOL) bREFSomeScheduleWasChanged,
  341.                                                       INT32     lRecursionCount,
  342.                                                       /*OUT*/ CHXSimpleList* pPauseDisplayElementHideList,
  343.                                                       /*OUT*/ CHXSimpleList* pPauseDisplayDisableElementList,
  344.                                                       BOOL bDoHandleExclBeforePlaybackStarts);
  345.     HX_RESULT            insertElementWithPendingBeginOrEnd(CSmilElement*      pElement,
  346.                                                             INT32              lCurTime,
  347.                                                             SmilTimingListType listType);
  348.     void                 handleAllXMMFReferences();
  349.     CHXMapStringToOb*    findNextPendingOnLoadURL(UINT32 lCurTime);
  350.     BOOL                 hasActivateEventListener(const char* pMediaID,
  351.                                                   INT16 iCurrentGroupIndex);
  352.     const char*          getDefaultNamespace();
  353.     // note -- the pErr array returned has the same scope as the SMILParser 
  354.     // object
  355.     HX_RESULT            getErrors(CHXPtrArray** pErrs);
  356.     SMILNode*            getSyncAncestor(SMILNode* pNode);
  357.     // /NOTE: sync base is not always begin of sync ancestor; in a seq, it's
  358.     // end of prior sibling (if any), so this calculates all that:
  359.     virtual ULONG32      getSyncBaseTimeInGroupTimeCoords(SMILNode* pNode);
  360.     // /Tells whether any node all the way up to the root has specified
  361.     // ancestor tag:
  362.     BOOL                 hasAncestor(SMILNodeTag ancestor, SMILNode* pNode);
  363.     // Added to be able to quickly lookup <anchor> or <area> tags
  364.     // by id and not by the region they map to.
  365.     CSmilAnchorElement*  getAnchorOrAreaElement(const char* pID);
  366.     // XXXMEH - moved this from private to public so that we 
  367.     // could animate the coords attribute. This method is needed
  368.     // to parse the coords attribute.
  369.     HX_RESULT            parseAnchorCoords(const char*         pCoords,
  370.                                            CSmilAnchorElement* pAnchor);
  371.     BOOL                 presentationContainsASource() {return m_bContainsSource; }
  372.     BOOL                 presentationContainsInitiallyScheduledTrack() {
  373.                     return m_bContainsInitiallyScheduledTrack; }
  374.     ULONG32              presentationDurIfNoInitialTracksScheduled() {
  375.                             return m_ulDurIfNoInitialTracksScheduled; }
  376.     BOOL                 EstablishBeginTimeList();
  377.     BOOL                 EstablishEndTimeList();
  378.     BOOL                 EstablishBeginEventList();
  379.     BOOL                 EstablishEndEventList();
  380.     CHXSimpleList*       GetPendingBeginTimeList() {return m_pPendingBeginTimeList;}
  381.     CHXSimpleList*       GetPendingEndTimeList() {return m_pPendingEndTimeList;}
  382.     CHXSimpleList*       GetBeginEventList() {return m_pBeginEventList;}
  383.     CHXSimpleList*       GetEndEventList()   {return m_pEndEventList;}
  384.     BOOL                 isDuplicateEntry(CHXSimpleList* pList,
  385.                                           SmilTimeValue* pTimeValue);
  386.     HX_RESULT            addResumeEvent(SmilTimeValue* pTimeValue,
  387.                                         REF(BOOL) bOldResumeEventWasRemoved);
  388.     HX_RESULT            addUndeferEvent(SmilTimeValue* pTimeValue,
  389.                                         REF(BOOL) bOldUndeferEventWasRemoved);
  390.     HX_RESULT            addResumeOrUndeferEvent(SmilTimeValue* pTimeValue,
  391.                                         REF(BOOL) bOldSuchEventWasRemoved,
  392. BOOL bIsResumeEvent);
  393.     HX_RESULT            computeRemoveTime(const char* pszID,
  394.                                            REF(UINT32) rulRemoveTime);
  395.     void                 InitPersistent(UINT32 ulPersistentComponentID, IHXValues* pProperties);
  396.     BOOL                 isTimelineObject(SMILNode* pNode);
  397.     static BOOL          isMediaObject(SMILNode* pNode);
  398.     BOOL                 isNonMediaPlayableObject(SMILNode* pNode);
  399.     BOOL                 isTimeContainerObject(SMILNode* pNode);
  400.     UINT16               getNumGroups() const { return m_usNumGroups; }
  401.     const char*          getEnumAttrString(SMIL2Attribute eAttr, BYTE ucVal);
  402.     void                 setParseError(HX_RESULT rv) { m_lParseError = rv;   }
  403.     HX_RESULT            getParseError() const       { return m_lParseError; }
  404.     BOOL                 isAttributeAnimated(const char* pszElementID,
  405.                                              UINT32      ulAttrName);
  406.     SMIL2Element         getSMIL2Element(const char* pszStr);
  407.     SMIL2Attribute       getSMIL2Attribute(const char* pszStr);
  408.     void                 checkForExternalEvents();
  409.     BOOL                 anyExternalEvents(const char* pszID);
  410.     ExternalEventInfo*   getFirstExternalEvent(const char* pszID);
  411.     ExternalEventInfo*   getNextExternalEvent(const char* pszID);
  412.     void                 checkForEventHandlers();
  413.     AccessErrorBehavior  getAccessErrorBehavior(SMILNode* pNode);
  414.     UINT32               GetUniqueNumber() { return m_ulNextVar++; }
  415.     // CSmilParser static public member methods
  416.     static HX_RESULT     parseRegionDimension(const char*   pszStr,
  417.                                               REF(double)   rdValue,
  418.                                               REF(CSS2Type) reType);
  419.     static HX_RESULT     parseZIndex(const char*   pszStr,
  420.                                      REF(INT32)    rlValue,
  421.                                      REF(CSS2Type) reType);
  422.     static HX_RESULT     parseColor(const char*   pszStr,
  423.                                     REF(UINT32)   rulColor,
  424.                                     REF(CSS2Type) reType);
  425.     static HX_RESULT     parseFit(const char*   pszStr,
  426.                                   REF(Fit)      reValue);
  427.     static HX_RESULT     parseRegAlign(const char*   pszStr,
  428.                                        REF(RegAlign) reValue);
  429.     static HX_RESULT     parseOpacity(const char* pszStr, REF(UINT32) rulOpacity);
  430.     static HX_RESULT     parseFill(const char* pszStr, REF(FillType) reFill);
  431.     static HX_RESULT     getFillString(FillType eFill, REF(CHXString) rcFill);
  432.     static HX_RESULT     getEraseString(EraseType eErase, REF(CHXString) rcErase);
  433.     static HX_RESULT     parseFillDefault(const char* pszStr, REF(FillDefaultType) reFillDefault);
  434.     static HX_RESULT     parseAccelDecel(const char* pszStr, REF(double) rdVal);
  435. #if defined(HELIX_FEATURE_SMIL2_TRANSITIONS)
  436.     static HX_RESULT     getDefaultTransitionSubType(const char* pszType, REF(CHXString) rcSubType);
  437.     static BOOL          isLegalTransitionType(const char* pszType);
  438.     static BOOL          isLegalTransitionSubType(const char* pszType, const char* pszSubType);
  439. #endif /* #if defined(HELIX_FEATURE_SMIL2_TRANSITIONS) */
  440.     static HX_RESULT     parseMarkerURI(const char*    pszStr,
  441.                                         REF(CHXString) rcMarker,
  442.                                         REF(BOOL)      rbExternal,
  443.                                         REF(CHXString) rcExternalFileName);
  444.     static HX_RESULT     parseHandlerForID(const char*    pszStr,
  445.                                            REF(CHXString) rcHandlerID);
  446.     static HX_RESULT     parseAccessErrorBehavior(const char* pszStr,
  447.                                                   REF(AccessErrorBehavior) reErr);
  448. #if defined(XXXMEH_SPLINE_ANIMATION)
  449.     static HX_RESULT     parseKeyTimes(const char* pszVal, CSmilAnimateElement* pAnim);
  450.     static HX_RESULT     parseKeySplines(const char* pszVal, CSmilAnimateElement* pAnim);
  451.     static HX_RESULT     parseSVGPath(const char* pszVal, CSmilAnimateElement* pAnim);
  452. #endif
  453.     static BOOL          isDataURL(const char* pszURL);
  454.     static HX_RESULT     validateDataURL(const char* pszURL);
  455.     static void          addStringProperty(IHXValues* pValues,
  456.                                            IUnknown*   pContext,
  457.                                            const char* pszName,
  458.                                            const char* pszValue);
  459.     BOOL                 allTracksNeedReflushHint() { return m_bAllTracksNeedReflushHint; }
  460.     // CSmilParser public members    
  461.     CHXStack*     m_pNodeListStack;
  462.     SMILNodeList* m_pNodeList;
  463.     UINT32        m_ulErrorLineNumber;
  464.     UINT32        m_ulErrorColumnNumber;
  465.     IHXBuffer*   m_pErrorText;
  466.     IHXBuffer*   m_pDefaultNamespace;
  467.     UINT32        m_ulPersistentComponentDelay;
  468.     UINT32        m_ulPersistentComponentDuration;
  469.     CSmilTimelineElementManager* m_pTimelineElementManager;
  470.     friend class CSmilParserResponse;
  471. private:
  472.     void                   close();
  473.     void                   initRequireTags();
  474.     void    GetSystemScreenInfo(REF(UINT32) rulScreenHeight,
  475.        REF(UINT32) rulScreenWidth,
  476.        REF(UINT32) rulScreenBitDepth);
  477.     void                   getPreferences();
  478.     HX_RESULT              createHeadElements(SMILNodeList* pNodeList);
  479.     HX_RESULT              createSeqWrapper(SMILNodeList* pNodeList, BOOL bMakeInnerPar);
  480.     HX_RESULT              createBodyElements(SMILNodeList* pNodeList);
  481.     HX_RESULT              createElementForAnchorTarget(CSmilAAnchorElement* pAnchor,
  482.                                                        SMILNodeList* pNodeList);
  483. #if 0  /*XXXEH- I wrote this and then didn't need it but it may come in
  484.          handy later so #if(0) it out: */
  485.     BOOL                   hasNoSourceChildren(SMILNode* pNode);
  486. #endif
  487.     HX_RESULT              assignGroupIndexes(SMILNodeList* pNodeList);
  488.     HX_RESULT              assignGroupIndexOnPar(SMILNode* pNode, UINT16 nGroup);
  489.     HX_RESULT              assignGroupIndexOnSeq(SMILNode* pNode, UINT16& nGroup);
  490.     HX_RESULT              constructTimelineElements(SMILNodeList* pNodeList);
  491.     HX_RESULT              setInitialDelays(SMILNodeList* pNodeList);
  492.     void                   setInitialDelay(SMILNode* pNode);
  493.     void                   setInitialDelayOnSeq(SMILNode* pNode);
  494.     HX_RESULT              expandRepeatElements(SMILNodeList* pNodeList);
  495.     HX_RESULT              printBodyElements(SMILNodeList* pNodeList);
  496.     HX_RESULT              updateEventElements(SMILNodeList* pNodeList);
  497.     HX_RESULT              insertElementByTimestamp(CSmilElement* pElement);
  498.     HX_RESULT              addGroup(SMILNode* pNode);
  499.     HX_RESULT              insertGroups();
  500.     HX_RESULT              mapID(SMILNode* pNode, BOOL bOverWrite = FALSE);
  501.     HX_RESULT              mapChildrenIDs(SMILNodeList* pNodeList, BOOL bOverWrite = FALSE);
  502.     HX_RESULT              markRepeatReplica(SMILNodeList* pNodeList, RepeatTag repeatTag);
  503.     BOOL                   testAttributeFailed(SMILNode* pNode);
  504.     BOOL                   customTestFailed(SMILNode* pNode);
  505.     BOOL                   systemComponentFailed(IHXBuffer* pRequiredValue);
  506.     HX_RESULT              markTestAttributeNodes(SMILNodeList* pNodeList);
  507.     HX_RESULT              selectSwitchNodes(SMILNode* pNode);
  508.     BOOL                   inSeq(SMILNode* pNode);
  509.     HX_RESULT              createParent(SMILNode* pChildNode, SMILNodeTag tag,
  510.                                         SMILNode*& pParent, SMILNode*& pParentEnd);
  511.     void                   resolveTimestamps();
  512.     void                   resolveTimestamps(SMILNodeList* pNodeList);
  513.     UINT32                 getStartTime(SMILNode* pNode);
  514.     CSmilRegion*           makeRegion(SMILNode* pNode);
  515.     CSmilRegPoint*         makeRegPoint(SMILNode* pNode);
  516. #if defined(HELIX_FEATURE_SMIL2_MULTIWINDOWLAYOUT)
  517.     CSmilViewport*         makeViewport(SMILNode* pNode);
  518. #endif /* #if defined(HELIX_FEATURE_SMIL2_MULTIWINDOWLAYOUT) */
  519.     CSmilTransition*       makeTransition(SMILNode* pNode, REF(HX_RESULT) retVal);
  520.     CSmilRootLayout*       makeRootLayout(SMILNode* pNode);
  521.     CSmilMeta*             makeMeta(SMILNode* pNode);
  522.     CSmilMetadata*         makeMetadata(SMILNode* pNode);
  523.     CSmilCustomTest*       makeCustomTest(SMILNode* pNode,
  524.                                     REF(HX_RESULT) retVal);
  525.     CSmilRendererPreFetch* makeRendererPreFetch(SMILNode* pNode);
  526.     CSmilSource*           makeSource(SMILNode* pNode);
  527.     CSmilPriorityClassElement* makePriorityClassElement(SMILNode* pNode);
  528.     CSmilAAnchorElement*   makeAAnchorElement(SMILNode* pNode);
  529.     CSmilAnchorElement*    makeAnchorElement(SMILNode* pNode);
  530.     CSmilSeqElement*       makeSeqElement(SMILNode* pNode);
  531.     CSmilParElement*       makeParElement(SMILNode* pNode);
  532.     CSmilExclElement*      makeExclElement(SMILNode* pNode);
  533.     CSmilParamElement*     makeParamElement(SMILNode* pNode);
  534.     CSmilBodyElement*      makeBodyElement(SMILNode* pNode);
  535. #if defined(HELIX_FEATURE_SMIL2_ANIMATION)
  536.     CSmilAnimateElement*   makeAnimateElement(SMILNode* pNode);
  537.     HX_RESULT              animSetupElement(CSmilAnimateElement* pAnim);
  538. #if defined(XXXMEH_SPLINE_ANIMATION)
  539.     HX_RESULT              checkSplineAnimation(CSmilAnimateElement* pAnim);
  540.     HX_RESULT              makeSVGPathExplicit(CSmilAnimateElement* pAnim);
  541. #endif
  542.     HX_RESULT              animCountValues(const char* pszStr, REF(char*)  rpStr,
  543.                                            REF(UINT32) rulNumValues, REF(char**) rppStr);
  544.     HX_RESULT              animParseValue(CSmilAnimateElement* pAnim,
  545.                                           const char*          pszVal,
  546.                                           UINT32               i);
  547. #endif /* #if defined(HELIX_FEATURE_SMIL2_ANIMATION) */
  548.     SMILNode*              getSpecificAncestor(SMILNodeTag ancestor, SMILNode* pNode);
  549.     SMILNode*              findAnyActiveDescendant(SMILNode* pNode,
  550.                                LONG32 lCurTime, SMILNode* pButNotThisNode);
  551.     SMILNode*              findActiveChildOfAncestorExcl(SMILNode* pNode, LONG32 lCurTime);
  552.     SMILNode*              findLastDeferredChildOfAncestorExcl(
  553.                                    SMILNode* pInterruptingNode, LONG32 lCurTime);
  554.     SMILNode*              findLastDeferredDescendant(SMILNode* pNode,
  555.                                      LONG32 lCurTime,
  556.                                      SMILNode* pButNotThisNode,
  557.                                      SMILNode* pLastDeferredChild);
  558.     BOOL                   firstDependentChild(SMILNode* pNode);
  559.     SMILNode*              findFirstNode(SMILNodeList* pNodelist, SMILNodeTag tag);
  560.     // /Finds parent's next child; doesn't have to be a timeline element:
  561.     SMILNode*              findNextSibling(SMILNode* pNode);
  562.     SMILNode*              getTimelineDescendent(SMILNode* pParentNode, SMILNode* pSiblingNode);
  563.     SMILNode*              getTimelineDescendent(SMILNode* pParentNode);
  564.     const char*            assignID(const char* pPrefix);
  565.     HX_RESULT              parseDuration(const char*          pDuration,
  566.                                          CSmilElement*        pElement,
  567.                                          SMILSyncAttributeTag nTag);
  568.     HX_RESULT              parseMarkerClipBeginEnd(const char* pszStr,
  569.                                                    REF(char*)  rpszMarkerName,
  570.                                                    REF(char*)  rpszExtFileName);
  571.     HX_RESULT              adjustDuration(CSmilElement* pElement);
  572.     HX_RESULT              parseClockValue(const char* pValue, UINT32& ulClockValue);
  573.     HX_RESULT              parseSyncBehaviorVal(const char*          pSyncBhvrBuf,
  574.                                                 CSmilElement*        pElement,
  575.                                                 SMILSyncAttributeTag nTag);
  576.     HX_RESULT              parsePeersHigherLower(const char* pBuf,
  577.                                 CSmilPriorityClassElement* pPCElement,
  578.                                 SMILPriorityClassPeersHigherLowerAttrib nAttrib);
  579.     HX_RESULT              parsePauseDisplay(const char* pBuf,
  580.                                 CSmilPriorityClassElement* pPCElement);
  581.     BOOL                   inLanguagePreference(const char* pLang);
  582.     BOOL                   isRelativeURL(const char* pURL);
  583.     UINT8                  getColorElement(const char* pColorFragment, int len);
  584.     void                   handleXMLParserError(XMLError* pError);
  585.     void                   badAttributeError(SMILNodeTag tag,
  586.                                              const char* pNodeName,
  587.                                              UINT32      ulLineNumber,
  588.                                              BOOL        bJustStore);
  589.     void                   initTagAttributes();
  590.     void                   deleteTagAttributes();
  591.     BOOL                   isLegalAttribute(SMILNodeTag tag, const char* pAttrName);
  592.     HX_RESULT              storeError(HX_RESULT   errCode, 
  593.                                       const char* pErrorString, 
  594.                                       const char* pFrameString,
  595.                                       UINT32      ulLineNumber, 
  596.                                       UINT32      ulLinePosition,
  597.                                       BOOL        bXml = TRUE);
  598.     BOOL                   isEndTagObject(SMILNode* pNode);
  599.     const char*            removeSurroundingWhitespace(const char* pValue);
  600.     HX_RESULT              parseBeginEnd(const char*          pBuffer, 
  601.                                          CSmilElement*        pElement,
  602.                                          SMILSyncAttributeTag nTag);
  603.     HX_RESULT              parseSmil1SyncbaseValue(const char*          pCh, 
  604.                                                    CSmilElement*        pElement,
  605.                                                    SMILSyncAttributeTag nTag);
  606.     HX_RESULT              parseCoord(IHXBuffer* pBuf, REF(float) f);
  607.     HX_RESULT              parseDigit(IHXBuffer* pBuf, REF(UINT32) ul);
  608.     HX_RESULT              parseRestart(const char* pBuffer, CSmilElement* pElement);
  609.     HX_RESULT              parseRestartDefault(const char* pBuffer, CSmilElement* pElement);
  610.     HX_RESULT              parseSensitivity(const char* pszValue, CSmilElement* pSource);
  611.     FillDefaultType        getFillDefault(CSmilElement* pElement);
  612.     void                   resolveFillValue(CSmilElement* pElement);
  613.     BOOL                   isAttributeSpecified(CSmilElement* pElement, const char* pszAttr);
  614. #if defined(HELIX_FEATURE_SMIL2_TRANSITIONS)
  615.     HX_RESULT              getNextTransitionEnd(CSmilElement* pElement, REF(UINT32) rulTime);
  616. #endif /* #if defined(HELIX_FEATURE_SMIL2_TRANSITIONS) */
  617.     void                   initParsingMaps();
  618. #if defined(HELIX_FEATURE_SMIL2_VALIDATION)
  619.     void                   processCollection(CRNBinaryMap* pMap,
  620.                                              UINT32        ulElement,
  621.                                              UINT32        ulCollection);
  622.     void                   deleteEnumAttrMaps();
  623.     void                   deleteReqAttrLists();
  624. #endif /* #if defined(HELIX_FEATURE_SMIL2_VALIDATION) */
  625.     void                   deleteValidationNamespaceList();
  626.     void                   checkForXMMFDependency(CSmilElement* pElement);
  627.     void                   handleBeginEndListXMMFReferences(CSmilElement*  pElement,
  628.                                                             CHXSimpleList* pList);
  629.     void                   handleClipBeginEndXMMFReference(CSmilElement*  pElement,
  630.                                                            BOOL           bIsClipBegin);
  631.     HX_RESULT              setElementHandler(SMILNode* pNode, CSmilElementHandler* pHandler);
  632.     void                   addToBeginOrEndTimeMap(SmilTimeValue*     pValue,
  633.                                                   SmilTimingListType eType);
  634.     void                   removeFromBeginOrEndTimeMap(SmilTimeValue*     pValue,
  635.                                                        SmilTimingListType eType);
  636.     BOOL                   isTimeValueListPresent(const char*         pszEventName,
  637.                                                   const char*         pszElementID,
  638.                                                   SmilTimingListType  eType,
  639.                                                   REF(CHXSimpleList*) rpList);
  640.     void                   clearTimeValueMap(SmilTimingListType eType);
  641.     void                   checkNodeForExternalEvents(SMILNode* pNode);
  642.     void                   checkNodeTimeListForExternalEvents(CHXSimpleList* pList);
  643.     void                   addExternalEventToList(const char*     pszID,
  644.                                                   const char*     pszFullName,
  645.                                                   const char*     pszName,
  646.                                                   CNamespaceInfo* pInfo);
  647.     void                   clearExternalEventList();
  648.     IUnknown*               m_pContext;
  649.     IHXCommonClassFactory* m_pClassFactory;
  650.     IHXSystemRequired*     m_pISystemRequired;
  651.     IHXXMLParser*          m_pParser;
  652.     CSmilParserResponse*    m_pResponse;
  653.     SMILNode*               m_pCurNode;
  654.     CHXStack*               m_pNodeDependencies;
  655.     SMILNode*               m_pCurrentDependentNode;
  656.     CHXStack*               m_pAnchorStack;
  657.     CSmilAAnchorElement*    m_pCurrentAnchor;
  658.     INT32                   m_lLastCheckPendingTime;
  659.     CHXSimpleList*          m_pPacketQueue;
  660.     CHXSimpleList*          m_pSourceUpdateList;
  661.     CHXMapLongToObj*        m_pAddGroupMap;
  662.     CHXMapLongToObj*        m_pTagAttributeMap;
  663.     CHXMapStringToOb*       m_pIDMap;
  664.     CHXMapStringToOb*       m_pRequireTagsMap;
  665. #if defined(HELIX_FEATURE_SMIL2_TRANSITIONS)
  666.     CHXMapStringToOb*       m_pTransitionMap;
  667. #endif /* #if defined(HELIX_FEATURE_SMIL2_TRANSITIONS) */
  668.     CHXMapStringToOb*       m_pActiveNamespaceMap;
  669.     CHXMapStringToOb*       m_pCustomTestMap;
  670.     CHXSimpleList*          m_pNSConflictList;
  671.     CHXSimpleList*          m_pBeginTimeSyncList;
  672.     CHXSimpleList*          m_pEndTimeSyncList;
  673.     CHXSimpleList*          m_pBeginEventList;
  674.     CHXSimpleList*          m_pEndEventList;
  675.     CHXSimpleList*          m_pBeginMediaMarkerList;
  676.     CHXSimpleList*          m_pEndMediaMarkerList;
  677.     CHXSimpleList*          m_pClipBeginMarkerList;
  678.     CHXSimpleList*          m_pClipEndMarkerList;
  679.     CHXSimpleList*          m_pPendingBeginTimeList;
  680.     CHXSimpleList*          m_pPendingEndTimeList;
  681.     CHXSimpleList*          m_pOnLoadURLList;
  682.     CHXSimpleList*          m_pOnLoadURLListCopyForPostSeek; 
  683.     BOOL                    m_bHandlePostSeekOnLoadURLs;
  684.     char*                   m_pBasePath;
  685.     CHXSimpleList*          m_pTrackHintList;
  686.     UINT32                  m_ulBandwidthPreference;
  687.     UINT32                  m_ulScreenHeightPreference;
  688.     UINT32                  m_ulScreenWidthPreference;
  689.     UINT32                  m_ulScreenDepthPreference;
  690.     UINT32                  m_ulDurIfNoInitialTracksScheduled;
  691.     char*                   m_pOverdubOrCaptionPreference;
  692.     char*                   m_pEncoding;
  693.     CHXSimpleList*          m_pLanguagePreferenceList;
  694.     CHXPtrArray*            m_pErrors;
  695.     time_t                  m_tRefTime;
  696.     HXVERSIONINFO           m_versionInfo;
  697.     ULONG32                 m_ulPlatformVer; // /Ret val of HXGetWinVer().
  698.     CHXMapStringToOb*       m_pElementMap;
  699.     CHXMapStringToOb*       m_pAttributeMap;
  700. #if defined(HELIX_FEATURE_SMIL2_VALIDATION)
  701.     CHXMapStringToOb*       m_pExtElementMap;
  702.     CHXMapStringToOb*       m_pExtAttributeMap;
  703.     CHXMapStringToOb*       m_pNamespaceMap;
  704.     CRNBinaryMap*           m_pLegalAttrMap;
  705.     CRNBinaryMap*           m_pContentModelMap;
  706.     XMLAttributeType*       m_pAttrType;
  707.     CHXMapStringToOb**      m_ppEnumAttrMap;
  708.     CHXSimpleList**         m_ppReqAttrList;
  709. #endif /* #if defined(HELIX_FEATURE_SMIL2_VALIDATION) */
  710.     CHXSimpleList*          m_pValNSList;
  711.     CHXSimpleList*          m_pXMMFElementList;
  712.     UINT32                  m_ulPersistentComponentID;
  713.     ElementWithinTag        m_elementWithinTag;
  714.     UINT16                  m_usNumGroups;
  715.     HX_RESULT               m_lParseError;
  716.     CHXSimpleList*          m_pAnimateElementList;
  717.     CHXMapStringToOb*       m_pBeginTimeMap;
  718.     CHXMapStringToOb*       m_pEndTimeMap;
  719.     CHXSimpleList*          m_pExternalEventList;
  720.     LISTPOSITION            m_pExternalEventListPos;
  721.     CHXSimpleList*          m_pElementsWithHandlerList;
  722.     char*                   m_pVarName;
  723.     UINT32                  m_ulNextVar;
  724.     static const char* const zm_pSupportedSMIL2ModuleNamespaces[
  725.                                NUM_SUPPORTED_SMIL_2_0_MODULE_NAMESPACES + 1];
  726.     // ONLY HX_BITFIELD MEMBERS SHOULD GO BELOW THIS LINE!
  727.     // ALL OTHER MEMBER TYPES SHOULD GO ABOVE THIS LINE!
  728.     HX_BITFIELD             m_bIgnoreUnrecognizedElements : 1;
  729.     HX_BITFIELD             m_bNoNamespaces : 1;
  730.     HX_BITFIELD             m_bRNNamespace : 1;
  731.     HX_BITFIELD             m_bSMILRootLayoutAlreadyFound : 1;
  732.     HX_BITFIELD             m_bCaptionsPreference : 1;
  733.     HX_BITFIELD             m_bSystemAudioDescPreference : 1;
  734.     HX_BITFIELD             m_bUseSystemCPU : 1;
  735.     HX_BITFIELD             m_bUseSystemOS : 1;
  736.     HX_BITFIELD             m_bContainsSource : 1;
  737.     HX_BITFIELD             m_bContainsInitiallyScheduledTrack: 1;
  738.     HX_BITFIELD             m_bStoreErrors : 1;
  739.     HX_BITFIELD             m_bFirstPacket : 1;
  740.     HX_BITFIELD             m_bTimestampsResolved : 1;
  741.     HX_BITFIELD             m_bAllowPlaylistBehavior : 1;
  742.     HX_BITFIELD             m_bAllTracksNeedReflushHint : 1;
  743. };
  744. #if defined(HELIX_FEATURE_SMIL2_VALIDATION)
  745. inline BOOL CSmilParser::isXMLLetter(char ch) const
  746. {
  747.     BOOL bRet = FALSE;
  748.     // /Fixes some gcc compiler warnings that might actually be bugs in our
  749.     // UNIX player; need to compare unsigneds with the 0x..'s which are unsigned:
  750.     const unsigned char c = (unsigned char)ch;
  751.     if ((c >= 0x41 && c <= 0x5A) ||
  752.         (c >= 0x61 && c <= 0x7A) ||
  753.         (c >= 0xC0 && c <= 0xD6) ||
  754.         (c >= 0xD8 && c <= 0xF6) ||
  755.         (c >= 0xF8 && c <= 0xFF))
  756.     {
  757.         bRet = TRUE;
  758.     }
  759.     return bRet;
  760. }
  761. inline BOOL CSmilParser::isXMLDigit(char c) const
  762. {
  763.     return ((c >= 0x30 && c <= 0x39) ? TRUE : FALSE);
  764. }
  765. inline BOOL CSmilParser::isXMLNameChar(char ch) const
  766. {
  767.     BOOL bRet = FALSE;
  768.     // /Fixes some gcc compiler warnings that might actually be bugs in our
  769.     // UNIX player; need to compare unsigneds with the 0x..'s which are unsigned:
  770.     const unsigned char c = (unsigned char)ch;
  771.     if (isXMLLetter(c) ||
  772.         isXMLDigit(c)  ||
  773.         c == '.'       ||
  774.         c == '-'       ||
  775.         c == '_'       ||
  776.         c == ':'       ||
  777.         c == 0xB7)
  778.     {
  779.         bRet = TRUE;
  780.     }
  781.     return bRet;
  782. }
  783. #endif /* #if defined(HELIX_FEATURE_SMIL2_VALIDATION) */
  784. #endif  /* _SMLPARSE_H_ */