sm1parse.h
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:17k
源码类别:

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. #ifndef _SM1PARSE_H_
  36. #define _SM1PARSE_H_
  37. #include "chxpckts.h"
  38. #include "smil1typ.h" /* renamed for SHAZAM; used to be smiltype.h */
  39. // forward declarations
  40. _INTERFACE   IHXSystemRequired;
  41. typedef enum
  42. {
  43.     SMILUnknown = 0,
  44.     SMILSmil,
  45.     SMILMeta,
  46.     SMILHead,
  47.     SMILBody,
  48.     SMILBasicLayout,
  49.     SMILRootLayout,
  50.     SMILRegion,
  51.     SMILSwitch,
  52.     SMILText,
  53.     SMILImg,
  54.     SMILRef,
  55.     SMILAudio,
  56.     SMILVideo,
  57.     SMILAnimation,
  58.     SMILTextstream,
  59.     SMILAnchor,
  60.     SMILAAnchor,
  61.     SMILEndAAnchor,
  62.     SMILPar,
  63.     SMILEndPar,
  64.     SMILSeq,
  65.     SMILEndSeq,
  66.     SMILRNRendererList,
  67.     SMILRendererPreFetch
  68. } SMIL1NodeTag;
  69. typedef enum
  70. {
  71.     SMILEventSourceNone,
  72.     SMILEventSourceBegin,
  73.     SMILEventSourceEnd,
  74.     SMILEventSourceFirst,
  75.     SMILEventSourceLast,
  76.     SMILEventSourceID,
  77.     SMILEventSourceClock
  78. } SMILEventSourceTag;
  79. typedef enum
  80. {
  81.     SMILSyncAttrNone,
  82.     SMILSyncAttrBegin,
  83.     SMILSyncAttrEnd,
  84.     SMILSyncAttrDur,
  85.     SMILSyncAttrEndsync,
  86.     SMILSyncAttrClipBegin,
  87.     SMILSyncAttrClipEnd
  88. } SMILSyncAttributeTag;
  89. typedef enum
  90. {
  91.     SMILErrorNone,
  92.     SMILErrorGeneralError,
  93.     SMILErrorBadXML,
  94.     SMILErrorNotSMIL,
  95.     SMILErrorDuplicateID,
  96.     SMILErrorNonexistentID,
  97.     SMILErrorNoBodyTag,
  98.     SMILErrorNoBodyElements,
  99.     SMILErrorUnrecognizedTag,
  100.     SMILErrorUnrecognizedAttribute,
  101.     SMILErrorUnexpectedTag,
  102.     SMILErrorBadDuration,
  103.     SMILErrorBadAttribute,
  104.     SMILErrorBadFragment,
  105.     SMILErrorRequiredAttributeMissing,
  106.     SMILErrorSyncAttributeMissing,
  107.     SMILErrorUnexpectedContent,
  108.     SMILErrorSMIL10Document,
  109.     SMILErrorIndefiniteNotSupported,
  110.     SMILErrorMetaDatatype,
  111.     SMILErrorRootLayoutHeightWidthRequired,
  112.     SMILErrorBadID,
  113.     SMILErrorNoSources,
  114.     SMILXMLUnknownError     = HXR_XML_GENERALERROR,
  115.     SMILXMLErrorNoClose     = HXR_XML_NOCLOSE,
  116.     SMILXMLErrorBadAttribute     = HXR_XML_BADATTRIBUTE,
  117.     SMILXMLErrorNoValue     = HXR_XML_NOVALUE,
  118.     SMILXMLErrorMissingQuote     = HXR_XML_MISSINGQUOTE,
  119.     SMILXMLErrorBadEndTag     = HXR_XML_BADENDTAG,
  120.     SMILXMLErrorNoTagType     = HXR_XML_NOTAGTYPE,
  121.     SMILXMLErrorIllegalID     = HXR_XML_ILLEGALID
  122. } SMILErrorTag;
  123. class SMIL1NodeList;
  124. class CSmil1Element;
  125. class SMIL1Namespace
  126. {
  127. public:
  128.     SMIL1Namespace(SMIL1Namespace* pNS)
  129.     {
  130. m_name = new_string(pNS->m_name);
  131. m_pValue = pNS->m_pValue;
  132. m_pValue->AddRef();
  133.     }
  134.     SMIL1Namespace(const char* name, IHXBuffer* pVal)
  135.     {
  136. m_name = new_string(name);
  137. m_pValue = pVal;
  138. m_pValue->AddRef();
  139.     }
  140.     ~SMIL1Namespace()
  141.     {
  142. HX_VECTOR_DELETE(m_name);
  143. HX_RELEASE(m_pValue);
  144.     }
  145.     char* m_name;
  146.     IHXBuffer* m_pValue;
  147. };
  148. class CSmil1Parser;
  149. class SMIL1Node
  150. {
  151. public:
  152.     SMIL1Node ();
  153.     ~SMIL1Node ();
  154.     SMIL1Node (const SMIL1Node&, BOOL bKeepId=FALSE, CSmil1Parser* pParser=NULL);
  155.     SMIL1Node* getFirstChild();
  156.     SMIL1Node* getNextChild();
  157.     CHXString m_repeatid;
  158.     CHXString m_id;
  159.     CHXString m_name;
  160.     UINT32 m_num;    
  161.     SMIL1NodeTag m_tag;
  162.     SMIL1Node* m_pParent;
  163.     SMIL1Node* m_pDependency;
  164.     SMIL1NodeList* m_pNodeList;
  165.     IHXValues* m_pValues;
  166.     CSmil1Element* m_pElement;
  167.     UINT16 m_nGroup;
  168.     BOOL  m_bLastInGroup;
  169.     BOOL m_bDelete;
  170.     BOOL m_bSkipContent;
  171.     BOOL m_bRepeatHandled;
  172.     RepeatTag m_repeatTag;
  173.     CHXString m_trackHint;
  174.     UINT32 m_ulTagStartLine;
  175.     UINT32 m_ulTagStartColumn;
  176.     CHXSimpleList* m_pNamespaceList;
  177. private:
  178.     LISTPOSITION m_curPosition;
  179. };
  180. class SMIL1NodeList: public CHXSimpleList
  181. {
  182. public:
  183.     SMIL1NodeList ();
  184.     ~SMIL1NodeList ();
  185.     SMIL1NodeList* copy (SMIL1Node* pParent, BOOL bKeepId=FALSE, CSmil1Parser* pParser = NULL);
  186.     SMIL1Node*  m_pParentNode;
  187. };
  188. //
  189. // Parser class
  190. //
  191. class CSmil1Region;
  192. class CSmil1RootLayout;
  193. class CSmil1Source;
  194. class CSmil1AAnchorElement;
  195. class CSmil1AnchorElement;
  196. class CSmil1SeqElement;
  197. class CSmil1ParElement;
  198. class CSmil1Meta;
  199. class CSmil1RendererPreFetch;
  200. class CSmil1MetaValues;
  201. class CSmil1EndLayout;
  202. class CSmil1ElementHandler;
  203. class CSmil1Parser;
  204. class XMLError;
  205. class CSmil1TimelineElementManager;
  206. class CSmil1ParserResponse: public IHXXMLParserResponse,
  207.    public ErrorNotifier
  208. {
  209. private:
  210.     CSmil1Parser* m_pParser;
  211.     INT32 m_lRefCount;
  212.     SMIL1Node* m_pCurrentNode;
  213. public:
  214.     CSmil1ParserResponse (CSmil1Parser* pParser);
  215.     ~CSmil1ParserResponse ();
  216.     STDMETHOD(QueryInterface) (REFIID riid,
  217. void** ppvObj);
  218.     STDMETHOD_(ULONG32,AddRef) ();
  219.     STDMETHOD_(ULONG32,Release) ();
  220.     STDMETHOD(HandleStartElement) (const char* /*IN*/ pName,
  221. IHXValues* /*IN*/ pAttributes,
  222. UINT32 /*IN*/ ulLineNumber,
  223. UINT32 /*IN*/ ulColumNumber);
  224.     STDMETHOD(HandleEndElement) (const char* /*IN*/ pName,
  225. UINT32 /*IN*/ ulLineNumber,
  226. UINT32 /*IN*/ ulColumNumber);
  227.     STDMETHOD(HandleCharacterData) (IHXBuffer* /*IN*/ pBuffer,
  228. UINT32 /*IN*/ ulLineNumber,
  229. UINT32 /*IN*/ ulColumNumber);
  230.     STDMETHOD(HandleProcessingInstruction)  (const char* /*IN*/  pTarget,
  231.     IHXValues* /*IN*/  pAttributes,
  232.     UINT32 /*IN*/ ulLineNumber,
  233.     UINT32 /*IN*/ ulColumNumber);
  234.     STDMETHOD(HandleUnparsedEntityDecl)     (const char* /*IN*/  pEntityName,
  235.     const char* /*IN*/  pSystemID,
  236.     const char* /*IN*/  pPublicID,
  237.     const char* /*IN*/  pNotationName,
  238.     UINT32 /*IN*/ ulLineNumber,
  239.     UINT32 /*IN*/ ulColumNumber);
  240.     STDMETHOD(HandleNotationDecl)     (const char* /*IN*/  pNotationName,
  241.     const char* /*IN*/  pSystemID,
  242.     const char* /*IN*/  pPublicID,
  243.     UINT32 /*IN*/ ulLineNumber,
  244.     UINT32 /*IN*/ ulColumNumber);
  245.     STDMETHOD(HandleComment)     (const char* /*IN*/  pComment,
  246.     UINT32  /*IN*/ ulLineNumber,
  247.     UINT32  /*IN*/ ulColumNumber);
  248.     STDMETHOD(HandleUnparsedDoctypeDecl)    (const char*  /*IN*/ pName, 
  249.     const char*  /*IN*/ pSystemID,
  250.     const char*  /*IN*/ pPublicID, 
  251.     UINT32  /*IN*/ ulLineNumber,
  252.     UINT32  /*IN*/ ulColumNumber);
  253.     STDMETHOD(HandleDefault)     (IHXBuffer* /*IN*/ pBuffer,
  254.     UINT32 /*IN*/ ulLineNumber,
  255.     UINT32 /*IN*/ ulColumNumber);
  256.     
  257.     HX_RESULT ErrorInLastTag     (HX_RESULT Error, 
  258.     const char* pErrorString,
  259.     const char* pFrameString, 
  260.     UINT32 ulLineNumber,
  261.     UINT32 ulLinePosition);
  262. };
  263. class CSmil1Parser
  264. {
  265. public:
  266.     CSmil1Parser (IUnknown* pContext);
  267.     ~CSmil1Parser ();
  268.     HX_RESULT init (BOOL bStoreErrors = FALSE);
  269.     HX_RESULT parse (IHXBuffer* pBuffer,
  270. BOOL bIsFinal);
  271.     HX_RESULT parse (const char* pSmilText);
  272.     HX_RESULT createElements ();
  273.     HX_RESULT durationResolved (const char* pID,
  274.      UINT32 ulDuration);
  275.     void insertTimelineElement (const char* pID, 
  276. UINT32 ulDelay);
  277.     void resetTimelineElementDuration (const char* pID,
  278. UINT32 ulDuration);
  279.     void resetTimeline ();
  280.     UINT16 getFragmentGroup (const char* pFragment);
  281.     UINT32 getFragmentOffset (const char* pFragment,
  282. BOOL& bFragFoundAndResolved);
  283.     HX_RESULT handleNextElement (CSmil1ElementHandler* pHandler);
  284.     SMIL1Node* findFirstNode (SMIL1NodeTag tag);
  285.     SMIL1Node* getFirstNodeChild (SMIL1Node* pNode);
  286.     CSmil1Element* findElement (const char* pID);
  287.     SMIL1Node* getNextNodeChild ();
  288.     void getPacketPending (UINT16 unStreamNumber);
  289.     
  290.     HX_RESULT addGlobalNamespace (const char* pNamespace,
  291. const char* pPrefix);
  292.     
  293.     HX_RESULT storeNamespaces (SMIL1Node* pNode);
  294.     
  295.     HX_RESULT addToNamespaceScope (SMIL1Node* pNode);
  296.     HX_RESULT removeFromNamespaceScope (SMIL1Node* pNode);
  297.     // note -- the pErr array returned has the same scope as the SMILParser 
  298.     // object
  299.     HX_RESULT getErrors (CHXPtrArray** pErrs);
  300.     BOOL IsSMIL10FullyCompliant () {return
  301. m_bSMIL10FullCompliance;}
  302.     UINT32 GetUniqueNumber()                    { return m_ulNextVar++; }
  303.     ElementWithinTag GetElementWithin(const char* pID);
  304.     void InitPersistent(UINT32 ulPersistentComponentID, ElementWithinTag elementWithinTag);
  305.     
  306.     CHXStack*  m_pNodeListStack;
  307.     SMIL1NodeList*  m_pNodeList;
  308.     BOOL  m_bTimestampsResolved;
  309.     UINT32 m_ulErrorLineNumber;
  310.     UINT32 m_ulErrorColumnNumber;
  311.     IHXBuffer* m_pErrorText;
  312.     CSmil1TimelineElementManager*               m_pTimelineElementManager;
  313.     friend class CSmil1ParserResponse;
  314. private:
  315.     void close ();
  316.     void initRequireTags ();
  317.     void getPreferences ();
  318.     HX_RESULT createHeadElements (SMIL1NodeList* pNodeList);
  319.     HX_RESULT createSeqWrapper (SMIL1NodeList* pNodeList);
  320.     HX_RESULT createBodyElements (SMIL1NodeList* pNodeList);
  321.     HX_RESULT assignGroupIndexes (SMIL1NodeList* pNodeList);
  322.     HX_RESULT assignGroupIndexOnPar (SMIL1Node* pNode,
  323.  UINT16 nGroup);
  324.     HX_RESULT assignGroupIndexOnSeq (SMIL1Node* pNode,
  325.  UINT16& nGroup);
  326.     HX_RESULT constructTimelineElements (SMIL1NodeList* pNodeList);
  327.     HX_RESULT setInitialDelays (SMIL1NodeList* pNodeList);
  328.     void setInitialDelay (SMIL1Node* pNode);
  329.     void setInitialDelayOnSeq (SMIL1Node* pNode);
  330.     HX_RESULT expandRepeatElements (SMIL1NodeList* pNodeList);
  331.     HX_RESULT printBodyElements (SMIL1NodeList* pNodeList);
  332.     HX_RESULT updateEventElements (SMIL1NodeList* pNodeList);
  333.     HX_RESULT insertElementByTimestamp (CSmil1Element* pElement);
  334.     HX_RESULT addGroup (SMIL1Node* pNode);
  335.     HX_RESULT insertGroups ();
  336.     HX_RESULT mapID (SMIL1Node* pNode, BOOL bOverWrite=FALSE);
  337.     HX_RESULT mapChildrenIDs (SMIL1NodeList* pNodeList, BOOL bOverWrite=FALSE);
  338.     HX_RESULT markRepeatReplica   (SMIL1NodeList* pNodeList, RepeatTag repeatTag);
  339.     BOOL testAttributeFailed (SMIL1Node* pNode);
  340.     BOOL systemComponentFailed (IHXBuffer* pRequiredValue);
  341.     HX_RESULT markTestAttributeNodes (SMIL1NodeList* pNodeList);
  342.     HX_RESULT selectSwitchNodes (SMIL1Node* pNode);
  343.     BOOL hasParParent (SMIL1Node* pNode);
  344.     BOOL inSeq (SMIL1Node* pNode);
  345.     HX_RESULT createParent (SMIL1Node* pChildNode, SMIL1NodeTag tag,
  346.  SMIL1Node*& pParent, SMIL1Node*& pParentEnd);
  347.     SMIL1Node* getSyncParent (SMIL1Node* pNode);
  348.     void resolveTimestamps ();
  349.     void resolveTimestamps (SMIL1NodeList* pNodeList);
  350.     UINT32 getStartTime (SMIL1Node* pNode);
  351.     CSmil1Region* makeRegion (SMIL1Node* pNode);
  352.     CSmil1RootLayout* makeRootLayout (SMIL1Node* pNode);
  353.     CSmil1Meta* makeMeta (SMIL1Node* pNode);
  354.     CSmil1RendererPreFetch* makeRendererPreFetch (SMIL1Node* pNode);
  355.     CSmil1Source* makeSource (SMIL1Node* pNode);
  356.     CSmil1AAnchorElement* makeAAnchorElement (SMIL1Node* pNode);
  357.     CSmil1AnchorElement* makeAnchorElement (SMIL1Node* pNode);
  358.     CSmil1SeqElement* makeSeqElement (SMIL1Node* pNode);
  359.     CSmil1ParElement* makeParElement (SMIL1Node* pNode);
  360.     BOOL firstDependentChild (SMIL1Node* pNode);
  361.     SMIL1Node* findFirstNode (SMIL1NodeList* pNodelist, 
  362.      SMIL1NodeTag tag);
  363.     SMIL1Node* getTimelineDescendent (SMIL1Node* pParentNode, 
  364. SMIL1Node* pSiblingNode);
  365.     SMIL1Node* getTimelineDescendent (SMIL1Node* pParentNode);
  366.     const char* assignID (const char* pPrefix);
  367.     HX_RESULT parseDuration (const char* pDuration,
  368.      CSmil1Element* pElement,
  369. SMILSyncAttributeTag nTag);
  370.     HX_RESULT adjustDuration (CSmil1Element* pElement);
  371.     HX_RESULT parseClockValue (const char* pValue,
  372. UINT32& ulClockValue);
  373.     HX_RESULT parseAnchorCoords (const char* pCoords, 
  374. CSmil1AnchorElement* pAnchor);
  375.     BOOL inLanguagePreference (const char* pLang);
  376.     BOOL isRelativeURL (const char* pURL);
  377.     UINT8 getColorElement (const char* pColorFragment,
  378.      int len);
  379.     HXxColor parseColor (const char* pColorString);
  380.     void handleXMLParserError (XMLError* pError);
  381.     void badAttributeError (SMIL1NodeTag tag,
  382. const char* pNodeName,
  383. UINT32 ulLineNumber,
  384. BOOL bJustStore);
  385.     void initTagAttributes ();
  386.     void deleteTagAttributes ();
  387.     BOOL isLegalAttribute (SMIL1NodeTag tag,
  388. const char* pAttrName);
  389.     SMIL1NodeTag getSyncTag (SMIL1Node* pNode);
  390.     HX_RESULT storeError (HX_RESULT errCode, 
  391.  const char* pErrorString, 
  392.  const char* pFrameString,
  393.  UINT32 ulLineNumber, 
  394.  UINT32 ulLinePosition,
  395.  BOOL bXml = TRUE);
  396.     BOOL isMediaObject (SMIL1Node* pNode);
  397.     IUnknown*      m_pContext;
  398.     IHXCommonClassFactory*  m_pClassFactory;
  399.     IHXSystemRequired*     m_pISystemRequired;
  400.     IHXXMLParser*     m_pParser;
  401.     CSmil1ParserResponse*    m_pResponse;
  402.     SMIL1Node*      m_pCurNode;
  403.     CHXStack*     m_pNodeDependencies;
  404.     SMIL1Node*     m_pCurrentDependentNode;
  405.     CHXStack*     m_pAnchorStack;
  406.     CSmil1AAnchorElement*    m_pCurrentAnchor;
  407.     UINT32      m_ulCurEndTime;
  408.     CSmil1EndLayout*     m_pEndLayout;
  409.     CHXSimpleList*      m_pPacketQueue;
  410.     CHXSimpleList*     m_pSourceUpdateList;
  411.     CHXMapLongToObj*     m_pAddGroupMap;
  412.     CHXMapLongToObj*     m_pTagAttributeMap;
  413.     CHXMapStringToOb*      m_pIDMap;
  414.     CHXMapStringToOb*     m_pRequireTagsMap;
  415.     
  416.     CHXMapStringToOb*     m_pActiveNamespaceMap;
  417.     CHXSimpleList*     m_pNSConflictList;
  418.     
  419.     char*     m_pBasePath;
  420.     CHXSimpleList*     m_pTrackHintList;
  421.     BOOL     m_bIgnoreUnrecognizedElements;
  422.     BOOL     m_bNoNamespaces;
  423.     BOOL     m_bRNNamespace;
  424.     BOOL     m_bSMILRootLayoutAlreadyFound;
  425.     //This flag is always FALSE until we enable it in a future
  426.     // release at which point we will initialize it to TRUE
  427.     // and only set it to FALSE when an author or server admin
  428.     // specifically specifies that he/she wants our old
  429.     // SMIL parser to handle the (presumably poorly-authored) file.
  430.     // NOTE: as of 1/20/2000, the code to allow authors to
  431.     // force the old parser to be used is not yet written.
  432.     // In addition, pncont/xmlparse.h/.cpp has a similar flag and
  433.     // the two need to be linked to the same value when that code
  434.     // gets written:
  435.     BOOL     m_bSMIL10FullCompliance;
  436.     UINT32      m_ulBandwidthPreference;
  437.     UINT32     m_ulScreenHeightPreference;
  438.     UINT32     m_ulScreenWidthPreference;
  439.     UINT32     m_ulScreenDepthPreference;
  440.     BOOL     m_bCaptionsPreference;
  441.     BOOL     m_bContainsSource;
  442.     char*     m_pOverdubOrCaptionPreference;
  443.     char*     m_pEncoding;
  444.     CHXSimpleList*     m_pLanguagePreferenceList;
  445.     BOOL     m_bStoreErrors;
  446.     CHXPtrArray*     m_pErrors;
  447.     UINT32     m_ulPersistentComponentID;
  448.     ElementWithinTag     m_elementWithinTag;
  449.     char*                   m_pVarName;
  450.     UINT32                  m_ulNextVar;
  451. };
  452. #endif /* _SM1PARSE_H_ */