blob: e602c3d9e2230afb6a3b819e27ca373e70620f04 [file] [log] [blame]
// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
#ifndef XFA_FDE_XML_CFX_SAXREADER_H_
#define XFA_FDE_XML_CFX_SAXREADER_H_
#include "core/fxcrt/include/fx_basic.h"
class CXFA_SAXContext;
class CFX_SAXItem {
public:
enum class Type {
Unknown = 0,
Instruction,
Declaration,
Comment,
Tag,
Text,
CharData,
};
CFX_SAXItem()
: m_pNode(nullptr),
m_eNode(Type::Unknown),
m_dwID(0),
m_bSkip(FALSE),
m_pPrev(nullptr),
m_pNext(nullptr) {}
CXFA_SAXContext* m_pNode;
Type m_eNode;
uint32_t m_dwID;
FX_BOOL m_bSkip;
CFX_SAXItem* m_pPrev;
CFX_SAXItem* m_pNext;
};
class CFX_SAXFile {
public:
CFX_SAXFile();
FX_BOOL StartFile(IFX_FileRead* pFile, uint32_t dwStart, uint32_t dwLen);
FX_BOOL ReadNextBlock();
void Reset();
IFX_FileRead* m_pFile;
uint32_t m_dwStart;
uint32_t m_dwEnd;
uint32_t m_dwCur;
uint8_t* m_pBuf;
uint32_t m_dwBufSize;
uint32_t m_dwBufIndex;
};
class CFX_SAXCommentContext;
enum class CFX_SaxMode;
enum CFX_SaxParseMode {
CFX_SaxParseMode_NotConvert_amp = 1 << 0,
CFX_SaxParseMode_NotConvert_lt = 1 << 1,
CFX_SaxParseMode_NotConvert_gt = 1 << 2,
CFX_SaxParseMode_NotConvert_apos = 1 << 3,
CFX_SaxParseMode_NotConvert_quot = 1 << 4,
CFX_SaxParseMode_NotConvert_sharp = 1 << 5,
CFX_SaxParseMode_NotSkipSpace = 1 << 6
};
class CXFA_SAXReaderHandler;
class CFX_SAXReader {
public:
CFX_SAXReader();
~CFX_SAXReader();
int32_t StartParse(IFX_FileRead* pFile,
uint32_t dwStart = 0,
uint32_t dwLen = -1,
uint32_t dwParseMode = 0);
int32_t ContinueParse(IFX_Pause* pPause = nullptr);
void SkipCurrentNode();
void SetHandler(CXFA_SAXReaderHandler* pHandler);
void AppendData(uint8_t ch);
void AppendName(uint8_t ch);
void ParseText();
void ParseNodeStart();
void ParseInstruction();
void ParseDeclOrComment();
void ParseDeclNode();
void ParseComment();
void ParseCommentContent();
void ParseTagName();
void ParseTagAttributeName();
void ParseTagAttributeEqual();
void ParseTagAttributeValue();
void ParseMaybeClose();
void ParseTagClose();
void ParseTagEnd();
void ParseTargetData();
private:
void Reset();
void Push();
void Pop();
FX_BOOL SkipSpace(uint8_t ch);
void SkipNode();
void NotifyData();
void NotifyEnter();
void NotifyAttribute();
void NotifyBreak();
void NotifyClose();
void NotifyEnd();
void NotifyTargetData();
void ReallocDataBuffer();
void ReallocNameBuffer();
void ParseChar(uint8_t ch);
CFX_SAXFile m_File;
CXFA_SAXReaderHandler* m_pHandler;
int32_t m_iState;
CFX_SAXItem* m_pRoot;
CFX_SAXItem* m_pCurItem;
uint32_t m_dwItemID;
CFX_SaxMode m_eMode;
CFX_SaxMode m_ePrevMode;
FX_BOOL m_bCharData;
uint8_t m_CurByte;
uint32_t m_dwDataOffset;
CFX_ByteArray m_SkipStack;
uint8_t m_SkipChar;
uint32_t m_dwNodePos;
uint8_t* m_pszData;
int32_t m_iDataSize;
int32_t m_iDataLength;
int32_t m_iEntityStart;
int32_t m_iDataPos;
uint8_t* m_pszName;
int32_t m_iNameSize;
int32_t m_iNameLength;
uint32_t m_dwParseMode;
CFX_SAXCommentContext* m_pCommentContext;
};
#endif // XFA_FDE_XML_CFX_SAXREADER_H_