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

Symbian

开发平台:

Visual C++

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