Files
core/HwpFile/HwpDoc/HWPSection.cpp
2024-12-10 22:19:37 +03:00

316 lines
7.9 KiB
C++

#include "HWPSection.h"
#include "HWPElements/HWPTag.h"
#include "Paragraph/CtrlTalbe.h"
#include "Paragraph/CtrlSectionDef.h"
#include "Paragraph/CtrlGeneralShape.h"
#include "Paragraph/CtrlCommon.h"
#include "Paragraph/CtrlCharacter.h"
#include "Paragraph/CharShape.h"
#include "Paragraph/CtrlHeadFoot.h"
#include "Paragraph/CtrlTalbe.h"
#include "Paragraph/CellParagraph.h"
#include "Paragraph/CapParagraph.h"
#include "HWPElements/HWPRecordParaText.h"
#include "HWPElements/HWPRecordParaRangeTag.h"
#include "HWPElements/HWPRecordCtrlHeader.h"
namespace HWP
{
CHWPSection::CHWPSection()
{}
CHWPSection::~CHWPSection()
{
CLEAR_ARRAY(CHWPPargraph, m_arParas);
}
bool CHWPSection::Parse(CHWPStream& oBuffer, int nVersion)
{
int nHeader, nTagNum, nLevel, nSize;
while (oBuffer.CanRead())
{
oBuffer.ReadInt(nHeader);
nTagNum = nHeader & 0x3FF; // 10 bits (0 - 9 bit)
nLevel = (nHeader & 0xFFC00) >> 10; // 10 bits (10-19 bit)
nSize = (nHeader & 0xFFF00000) >> 20; // 12 bits (20-31 bit)
if (nLevel > 0)
{
return true;
}
if (0xFFF == nSize)
{
//TODO:: buf[off+7]<<24&0xFF000000 | buf[off+6]<<16&0xFF0000 | buf[off+5]<<8&0xFF00 | buf[off+4]&0xFF;
oBuffer.Skip(4);
oBuffer.ReadInt(nSize);
}
else
oBuffer.Skip(4);
EHWPTag eTag = GetTagFromNum(nTagNum);
if (0 == nLevel && EHWPTag::HWPTAG_PARA_HEADER == eTag)
{
CHWPPargraph *pCurrPara = CHWPPargraph::Parse(nTagNum, nLevel, nSize, oBuffer, 0, nVersion);
if (nullptr != pCurrPara)
m_arParas.push_back(pCurrPara);
}
}
}
int CHWPSection::ParseRecurse(CHWPPargraph& oCurrPara, int nRunLevel, CHWPStream& oBuffer, int nOff, int nVersion)
{
oBuffer.SavePosition();
int nHeader, nTagNum, nLevel, nSize, nHeaderSize;
while (oBuffer.CanRead())
{
oBuffer.ReadInt(nHeader);
nTagNum = nHeader & 0x3FF; // 10 bits (0 - 9 bit)
nLevel = (nHeader & 0xFFC00) >> 10; // 10 bits (10-19 bit)
nSize = (nHeader & 0xFFF00000) >> 20; // 12 bits (20-31 bit)
if (0xFFF == nSize)
{
nHeaderSize = 8;
//TODO:: buf[off+7]<<24&0xFF000000 | buf[off+6]<<16&0xFF0000 | buf[off+5]<<8&0xFF00 | buf[off+4]&0xFF;
oBuffer.Skip(4);
oBuffer.ReadInt(nSize);
oBuffer.Skip(-8);
}
else
{
nHeaderSize = 4;
oBuffer.Skip(4);
}
if (nLevel < nRunLevel)
break;
EHWPTag eTag = GetTagFromNum(nTagNum);
if (nLevel > nRunLevel)
{
switch(eTag)
{
case HWPTAG_PARA_HEADER:
case HWPTAG_PARA_TEXT:
case HWPTAG_PARA_CHAR_SHAPE:
case HWPTAG_PARA_LINE_SEG:
case HWPTAG_PARA_RANGE_TAG:
case HWPTAG_CTRL_HEADER:
{
ParseRecurse(oCurrPara, nLevel, oBuffer, 0, nVersion);
break;
}
case HWPTAG_TABLE:
{
CCtrlTalbe *pTable = oCurrPara.FindLastElement<CCtrlTalbe>();
if (nullptr != pTable)
ParseCtrlRecurse(*pTable, nLevel, oBuffer, 0, nVersion);
break;
}
case HWPTAG_LIST_HEADER:
{
oBuffer.Skip(nHeaderSize);
oBuffer.Skip(nSize);
break;
}
case HWPTAG_PAGE_DEF:
case HWPTAG_FOOTNOTE_SHAPE:
case HWPTAG_PAGE_BORDER_FILL:
{
CCtrlSectionDef *pCtrlSecDef = dynamic_cast<CCtrlSectionDef*>(oCurrPara.FindLastElement("dces"));
if (nullptr != pCtrlSecDef)
ParseCtrlRecurse(*pCtrlSecDef, nLevel, oBuffer, 0, nVersion);
break;
}
case HWPTAG_SHAPE_COMPONENT:
case HWPTAG_SHAPE_COMPONENT_PICTURE:
case HWPTAG_SHAPE_COMPONENT_LINE:
case HWPTAG_SHAPE_COMPONENT_RECTANGLE:
case HWPTAG_SHAPE_COMPONENT_ELLIPSE:
case HWPTAG_SHAPE_COMPONENT_ARC:
case HWPTAG_SHAPE_COMPONENT_POLYGON:
case HWPTAG_SHAPE_COMPONENT_CURVE:
case HWPTAG_SHAPE_COMPONENT_OLE:
case HWPTAG_EQEDIT:
case HWPTAG_SHAPE_COMPONENT_TEXTART:
case HWPTAG_SHAPE_COMPONENT_UNKNOWN:
{
CCtrlGeneralShape *pCtrlGeneral = dynamic_cast<CCtrlGeneralShape*>(oCurrPara.FindLastElement(" osg"));
if (nullptr != pCtrlGeneral)
ParseCtrlRecurse(*pCtrlGeneral, nLevel, oBuffer, 0, nVersion);
break;
}
case HWPTAG_CTRL_DATA:
case HWPTAG_FORM_OBJECT:
case HWPTAG_MEMO_SHAPE:
case HWPTAG_MEMO_LIST:
case HWPTAG_CHART_DATA:
case HWPTAG_VIDEO_DATA:
default:
{
CCtrlCommon *pCtrlCommon = oCurrPara.FindLastElement<CCtrlCommon>();
if (nullptr != pCtrlCommon)
ParseCtrlRecurse(*pCtrlCommon, nLevel, oBuffer, 0, nVersion);
break;
}
}
}
else if (nLevel == nRunLevel)
{
oBuffer.Skip(nHeaderSize);
switch (eTag)
{
case HWPTAG_PARA_HEADER:
{
if (nullptr != dynamic_cast<CCellParagraph*>(&oCurrPara))
{
oBuffer.Skip(-nHeaderSize);
return oBuffer.GetDistanceToLastPos();
}
else if (nullptr != dynamic_cast<CCapParagraph*>(&oCurrPara))
{
CHWPPargraph::Parse(oCurrPara, nSize, oBuffer, 0, nVersion);
break;
}
else
{
if (1 == nRunLevel) //TODO:: проверить
{
oBuffer.Skip(nSize);
return oBuffer.GetDistanceToLastPos();
}
oBuffer.Skip(-nHeaderSize);
return oBuffer.GetDistanceToLastPos();
}
}
case HWPTAG_PARA_TEXT:
{
oCurrPara.AddCtrls(CHWPRecordParaText::Parse(nTagNum, nLevel, nSize, oBuffer, 0, nVersion));
break;
}
case HWPTAG_PARA_CHAR_SHAPE:
{
if (0 == oCurrPara.GetCountCtrls())
oCurrPara.AddCtrl(new CCtrlCharacter(" _", ECtrlCharType::PARAGRAPH_BREAK));
CCharShape::FillCharShape(nTagNum, nLevel, nSize, oBuffer, 0, nVersion, oCurrPara.GetCtrls());
}
case HWPTAG_PARA_LINE_SEG:
{
oCurrPara.SetLineSeg(new CLineSeg(nTagNum, nLevel, nSize, oBuffer, 0, nVersion));
break;
}
case HWPTAG_PARA_RANGE_TAG:
{
CHWPRecordParaRangeTag::Parse(oCurrPara, nTagNum, nLevel, nSize, oBuffer, 0, nVersion);
break;
}
case HWPTAG_CTRL_HEADER:
{
CCtrl *pCtrl = CHWPRecordCtrlHeader::Parse(nTagNum, nLevel, nSize, oBuffer, 0, nVersion);
if (nullptr != dynamic_cast<CCtrlGeneralShape*>(pCtrl))
((CCtrlGeneralShape*)pCtrl)->SetParent(&oCurrPara);
unsigned int nIndex;
CCtrl* pCtrlOrigOp = oCurrPara.FindFirstElement(pCtrl->GetID(), pCtrl->FullFilled(), nIndex);
if (nullptr != pCtrlOrigOp)
oCurrPara.SetCtrl(pCtrl, nIndex);
if (nullptr != dynamic_cast<CCtrlHeadFoot*>(pCtrl))
{
CCtrlSectionDef* pSecD = dynamic_cast<CCtrlSectionDef*>(oCurrPara.FindLastElement("dces"));
if (nullptr != pSecD)
pSecD->AddHeadFoot((CCtrlHeadFoot*)pCtrl);
}
if (nullptr != dynamic_cast<CCtrlTable*>(pCtrl))
{
oBuffer.Skip(nSize);
ParseCtrlRecurse(*pCtrl, nLevel, oBuffer, 0, nVersion);
}
else
{
oBuffer.Skip(nSize);
ParseCtrlRecurse(*pCtrl, nLevel, oBuffer, 0, nVersion);
}
break;
}
case HWPTAG_TABLE:
{
oBuffer.Skip(-nHeaderSize);
return oBuffer.GetDistanceToLastPos();
}
case HWPTAG_LIST_HEADER:
{
if (1 == nRunLevel)
{
oBuffer.Skip(nSize);
return oBuffer.GetDistanceToLastPos();
}
oBuffer.Skip(-nHeaderSize);
return oBuffer.GetDistanceToLastPos();
}
case HWPTAG_SHAPE_COMPONENT:
case HWPTAG_SHAPE_COMPONENT_PICTURE:
case HWPTAG_SHAPE_COMPONENT_LINE:
case HWPTAG_SHAPE_COMPONENT_RECTANGLE:
case HWPTAG_SHAPE_COMPONENT_ELLIPSE:
case HWPTAG_SHAPE_COMPONENT_ARC:
case HWPTAG_SHAPE_COMPONENT_POLYGON:
case HWPTAG_SHAPE_COMPONENT_CURVE:
case HWPTAG_SHAPE_COMPONENT_OLE:
case HWPTAG_EQEDIT:
case HWPTAG_SHAPE_COMPONENT_TEXTART:
{
oBuffer.Skip(-nHeaderSize);
return oBuffer.GetDistanceToLastPos();
}
case HWPTAG_CTRL_DATA:
case HWPTAG_FORM_OBJECT:
case HWPTAG_MEMO_SHAPE:
case HWPTAG_MEMO_LIST:
case HWPTAG_CHART_DATA:
case HWPTAG_VIDEO_DATA:
case HWPTAG_SHAPE_COMPONENT_UNKNOWN:
default:
{
oBuffer.Skip(nSize);
break;
}
}
}
}
return oBuffer.GetDistanceToLastPos();
}
int CHWPSection::ParseCtrlRecurse(CCtrl& oCurrCtrl, int nRunLevel, CHWPStream& oBuffer, int nOff, int nVersion)
{
return 0;
}
}