diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CImage.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CImage.cpp index 3c9908fc8f..2581432e59 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CImage.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CImage.cpp @@ -55,7 +55,10 @@ namespace SVG std::wstring wsImageData = m_wsHref.substr(unType + 8, m_wsHref.length() - unType - 8); ulSize = NSBase64::Base64DecodeGetRequiredLength(wsImageData.length()); - pBuffer = new BYTE[ulSize]; + pBuffer = new(std::nothrow) BYTE[ulSize]; + + if (NULL == pBuffer) + return false; NSBase64::Base64Decode(wsImageData.c_str(), wsImageData.length(), pBuffer, &(int&)ulSize); } diff --git a/HwpFile/HWPFile.pro b/HwpFile/HWPFile.pro index 318b85f9eb..a1d210a014 100644 --- a/HwpFile/HWPFile.pro +++ b/HwpFile/HWPFile.pro @@ -131,7 +131,6 @@ HEADERS += \ HwpDoc/HWPElements/HWPRecordParaText.h \ HwpDoc/HWPElements/HWPRecordStyle.h \ HwpDoc/HWPElements/HWPTag.h \ - HwpDoc/HWPElements/HWPType.h \ HwpDoc/HWPElements/HwpRecordTabDef.h \ HwpDoc/HWPElements/HwpRecordTypes.h \ HwpDoc/HWPFile.h \ diff --git a/HwpFile/HwpDoc/Common/Common.h b/HwpFile/HwpDoc/Common/Common.h index efb142dcca..39a4ef42f7 100644 --- a/HwpFile/HwpDoc/Common/Common.h +++ b/HwpFile/HwpDoc/Common/Common.h @@ -32,6 +32,7 @@ typedef char HWP_BYTE; #define WSTR(value) MAKE_WSTR(#value) #define IF_STRING_IN_ENUM(checked_value, value, enum_type)\ + TO_UPPER(value);\ if (WSTR(checked_value) == value)\ return enum_type::checked_value #define ELSE_IF_STRING_IN_ENUM(checked_value, value, enum_type)\ diff --git a/HwpFile/HwpDoc/Common/NodeNames.h b/HwpFile/HwpDoc/Common/NodeNames.h index b300a7d35e..0a47433ba9 100644 --- a/HwpFile/HwpDoc/Common/NodeNames.h +++ b/HwpFile/HwpDoc/Common/NodeNames.h @@ -90,7 +90,7 @@ enum class ENode InSideMargin, Caption, TransformMatrix, - ScaleMatrix, + ScaleMatrix, //80 RotationMatrix, LineShape, ShadowEffect, @@ -98,9 +98,16 @@ enum class ENode SoftEdgeEffect, ReflectionEffect, EffectsColor, - + DrawText, + TextMargin, + Header, //90 + Footer, + CellZoneList, + CellZone, + Row, + Cell, + //Only hwpx - Ctrl, Lineseg, LinesegArray, Video, @@ -112,7 +119,7 @@ enum class ENode }; #define MAX_TYPES 2 -#define MAX_NODES 100 +#define MAX_NODES 110 static constexpr const char* NODE_NAMES[MAX_TYPES][MAX_NODES] = { @@ -209,14 +216,23 @@ static constexpr const char* NODE_NAMES[MAX_TYPES][MAX_NODES] = "hp:softEdge", "hp:reflection", "hp:effectsColor", + "hp:drawText", + "hp:textMargin", + "hp:header", + "hp:footer", + "hp:cellzoneList", + "hp:cellzone", + "hp:tr", + "hp:tc", - "hp:ctrl", "hp:lineseg", "hp:linesegarray", "hp:video", "hp:switch", "hp:case", - "hp:default" + "hp:default", + "hh:slash", + "hh:backSlash" }, // HWPML { @@ -310,6 +326,14 @@ static constexpr const char* NODE_NAMES[MAX_TYPES][MAX_NODES] = "SOFTEDGE", "REFLECTION", "EFFECTSCOLOR", + "DRAWTEXT", + "TEXTMARGIN", + "HEADER", + "FOOTER", + "CELLZONELIST", + "CELLZONE", + "ROW", + "CELL", "", "", @@ -317,6 +341,7 @@ static constexpr const char* NODE_NAMES[MAX_TYPES][MAX_NODES] = "", "", "", + "", "" } }; @@ -331,6 +356,16 @@ inline const char* GetNodeName(ENode eNode, EHanType eType) } } +inline bool Equals(ENode eNode, EHanType eType, std::string sNodeName) +{ + switch (eType) + { + case EHanType::HWPX: return NODE_NAMES[0][static_cast(eNode)] == sNodeName; + case EHanType::HWPML: return NODE_NAMES[1][static_cast(eNode)] == sNodeName; + default: return false; + } +} + enum class EAttribute { ParaShape, @@ -462,7 +497,7 @@ enum class EAttribute MatrixElement1_2, MatrixElement2_1, MatrixElement2_2, - MatrixElementOffsetX, + MatrixElementOffsetX, // 130 MatrixElementOffsetY, HeadStyle, HeadSize, @@ -472,13 +507,22 @@ enum class EAttribute Direction, Distance, RotationStyle, - FadeDirection, + FadeDirection, //140 + BinData, + RepeatHeader, + RowCount, + ColCount, + CellSpacing, + StartRowAddr, + StartColAddr, + EndRowAddr, + EndColAddr, PageBreak, ColumnBreak, }; -#define MAX_ATTRIBUTES 150 +#define MAX_ATTRIBUTES 160 //TODO:: добавить все аргументы static constexpr const char* ATTRUBUTE_NAMES[MAX_TYPES][MAX_ATTRIBUTES] = @@ -569,10 +613,10 @@ static constexpr const char* ATTRUBUTE_NAMES[MAX_TYPES][MAX_ATTRIBUTES] = "eAsianEng", "eAsianNum", "indent", - "top", - "bottom", - "", - "", + "left", + "right", + "prev", + "next", "", "", //90 "borderFillIDRef", @@ -585,7 +629,7 @@ static constexpr const char* ATTRUBUTE_NAMES[MAX_TYPES][MAX_ATTRIBUTES] = "engName", "nextStyleIDRef", "langID", //100 - "id" + "id", "lockForm", "name", "textFlow", @@ -625,6 +669,15 @@ static constexpr const char* ATTRUBUTE_NAMES[MAX_TYPES][MAX_ATTRIBUTES] = "distance", "rotationStyle", "fadeDirection", + "id", + "repeatHeader", + "rowCnt", + "colCnt", + "cellSpacing", + "startRowAddr", + "startColAddr", + "endRowAddr", + "endColAddr", "pageBreak", "columnBreak", @@ -771,6 +824,15 @@ static constexpr const char* ATTRUBUTE_NAMES[MAX_TYPES][MAX_ATTRIBUTES] = "Distance", "RotationStyle", "FadeDirection", + "BinData", + "RepeatHeader", + "RowCount", + "ColCount", + "CellSpacing", + "StartRowAddr", + "StartColAddr", + "EndRowAddr", + "EndColAddr", "PageBreak", "ColumnBreak" @@ -787,6 +849,16 @@ inline const char* GetAttributeName(EAttribute eNode, EHanType eType) } } +inline bool Equals(EAttribute eAttribute, EHanType eType, std::string sAttributeName) +{ + switch (eType) + { + case EHanType::HWPX: return ATTRUBUTE_NAMES[0][static_cast(eAttribute)] == sAttributeName; + case EHanType::HWPML: return ATTRUBUTE_NAMES[1][static_cast(eAttribute)] == sAttributeName; + default: return false; + } +} + #define MAX_VALUES 60 // TODO:: пока всё в одном месте. Возможно стоит лучше разделить по соответствующим классам @@ -896,7 +968,14 @@ static constexpr const char* VALUE_NAMES[MAX_TYPES][MAX_VALUES] = "MEDIUM_LARGE", "LARGE_SMALL", "LARGE_MEDIUM", - "LARGE_LARGE" + "LARGE_LARGE", + "NORMAL", + "ARROW", + "SPEAR", + "CONCAVE_ARROW", + "EMPTY_DIAMOND", + "EMPTY_CIRCLE", + "EMPTY_BOX" }, //HWPML { @@ -945,7 +1024,14 @@ static constexpr const char* VALUE_NAMES[MAX_TYPES][MAX_VALUES] = "MediumLarge", "LargeSmall", "LargeMedium", - "LargeLarge" + "LargeLarge", + "Normal", + "Arrow", + "Spear", + "ConcaveArrow", + "EmptyDiamond", + "EmptyCircle", + "EmptyBox" } }; diff --git a/HwpFile/HwpDoc/Common/WriterContext.cpp b/HwpFile/HwpDoc/Common/WriterContext.cpp index 7ba7f35480..2524c3895c 100644 --- a/HwpFile/HwpDoc/Common/WriterContext.cpp +++ b/HwpFile/HwpDoc/Common/WriterContext.cpp @@ -336,6 +336,11 @@ bool CWriterContext::GetBinBytes(const HWP_STRING& sId, CHWPStream& oBuffer, HWP sFileName = NSFile::GetFileName(pBinData->GetPath()); return m_pHWPXFile->GetChildStream(pBinData->GetPath(), oBuffer); } + case EHanType::HWPML: + { + sFileName = pBinData->GetItemID() + L'.' + pBinData->GetFormat(); + return m_pHWPMLFile->GetBinData(pBinData->GetItemID(), oBuffer); + } default: break; } diff --git a/HwpFile/HwpDoc/Conversion/Converter2OOXML.cpp b/HwpFile/HwpDoc/Conversion/Converter2OOXML.cpp index 87ee054b01..d300368ac6 100644 --- a/HwpFile/HwpDoc/Conversion/Converter2OOXML.cpp +++ b/HwpFile/HwpDoc/Conversion/Converter2OOXML.cpp @@ -596,7 +596,8 @@ void CConverter2OOXML::WriteParagraph(const CHWPPargraph* pParagraph, NSStringUt } case ECtrlObjectType::HeadFoot: { - if (EHanType::HWPX == m_pContext->GetType()) + if (EHanType::HWPX == m_pContext->GetType() || + EHanType::HWPML == m_pContext->GetType()) oState.m_arCtrlsHeadFoot.push_back((const CCtrlHeadFoot*)pCtrl); break; } @@ -1245,12 +1246,22 @@ void CConverter2OOXML::WriteSectionSettings(TConversionState& oState) { std::vector arCtrlsHeadFoot; - if (EHanType::HWP == m_pContext->GetType()) - arCtrlsHeadFoot = oState.m_pSectionDef->GetHeaderFooters(); - else if (EHanType::HWPX == m_pContext->GetType()) + switch (m_pContext->GetType()) { - arCtrlsHeadFoot = oState.m_arCtrlsHeadFoot; - oState.m_arCtrlsHeadFoot.clear(); + case EHanType::HWP: + { + arCtrlsHeadFoot = oState.m_pSectionDef->GetHeaderFooters(); + break; + } + case EHanType::HWPX: + case EHanType::HWPML: + { + arCtrlsHeadFoot = oState.m_arCtrlsHeadFoot; + oState.m_arCtrlsHeadFoot.clear(); + break; + } + default: + return; } #define WRITE_ID(id)\ @@ -2000,7 +2011,8 @@ void CConverter2OOXML::WriteBorderSettings(const CCtrlShapePic* pCtrlPic, NSStri if (EHanType::HWP == m_pContext->GetType()) WriteLineSettings(pCtrlPic->GetBorderLineStyle(), pCtrlPic->GetBorderColor(), pCtrlPic->GetBorderThick(), pCtrlPic->GetBorderCompoundLineType(), oBuilder); - else if (EHanType::HWPX == m_pContext->GetType()) + else if (EHanType::HWPX == m_pContext->GetType() || + EHanType::HWPML == m_pContext->GetType()) WriteLineSettings(pCtrlPic->GetLineStyle(), pCtrlPic->GetLineColor(), pCtrlPic->GetLineThick(), 1, oBuilder); } diff --git a/HwpFile/HwpDoc/Conversion/Transform.h b/HwpFile/HwpDoc/Conversion/Transform.h index 7c01cb8d22..3ff58a2257 100644 --- a/HwpFile/HwpDoc/Conversion/Transform.h +++ b/HwpFile/HwpDoc/Conversion/Transform.h @@ -24,11 +24,9 @@ namespace Transform inline std::wstring IntColorToHEX(int nColor) { - std::wstringstream oSStream; - - oSStream << std::uppercase << std::hex << std::setw(6) << std::setfill(L'0') << nColor; - - return oSStream.str(); + wchar_t buffer[7]; + std::swprintf(buffer, L"%02X%02X%02X", nColor & 0xFF, (nColor >> 8) & 0xFF, (nColor >> 16) & 0xFF); + return std::wstring(buffer); } inline short LineWidth2Pt(short shHWPThick) diff --git a/HwpFile/HwpDoc/Conversion/Types.h b/HwpFile/HwpDoc/Conversion/Types.h index 4eb2ae3bed..f5464b057b 100644 --- a/HwpFile/HwpDoc/Conversion/Types.h +++ b/HwpFile/HwpDoc/Conversion/Types.h @@ -45,9 +45,9 @@ namespace HWP const int tempLen = 7; wchar_t arTemp[tempLen]; - swprintf(arTemp, tempLen, L"%02X%02X%02X", m_uchRed, m_uchGreen, m_uchBlue); + swprintf(arTemp, tempLen, L"%02X%02X%02X", m_uchBlue, m_uchGreen, m_uchRed); - return std::wstring(arTemp, 6); + return std::wstring(arTemp); } }; diff --git a/HwpFile/HwpDoc/HWPDocInfo.cpp b/HwpFile/HwpDoc/HWPDocInfo.cpp index ed631b2300..3c8be3dab4 100644 --- a/HwpFile/HwpDoc/HWPDocInfo.cpp +++ b/HwpFile/HwpDoc/HWPDocInfo.cpp @@ -376,6 +376,7 @@ const CHWPRecord* CHWPDocInfo::GetBinData(const HWP_STRING& sID) const { case EHanType::HWP: case EHanType::HWPX: + case EHanType::HWPML: { std::map::const_iterator itFound = m_mBinDatas.find(sID); diff --git a/HwpFile/HwpDoc/HWPElements/HWPRecordBinData.cpp b/HwpFile/HwpDoc/HWPElements/HWPRecordBinData.cpp index c4ff19cd88..d062a20a57 100644 --- a/HwpFile/HwpDoc/HWPElements/HWPRecordBinData.cpp +++ b/HwpFile/HwpDoc/HWPElements/HWPRecordBinData.cpp @@ -81,7 +81,7 @@ CHWPRecordBinData::CHWPRecordBinData(CXMLReader& oReader, int nVersion, EHanType START_READ_ATTRIBUTES(oReader) { - if ("id" == sAttributeName) + if (GetAttributeName(EAttribute::BinData, eType) == sAttributeName) m_sItemID = oReader.GetText(); else if (EHanType::HWPX == eType && "isEmbeded" == sAttributeName) { @@ -119,7 +119,7 @@ CHWPRecordBinData::CHWPRecordBinData(CXMLReader& oReader, int nVersion, EHanType if (EType::LINK != m_eType || sSubPath.empty()) return; - + m_sAPath = sSubPath; } diff --git a/HwpFile/HwpDoc/HWPElements/HWPRecordBorderFill.cpp b/HwpFile/HwpDoc/HWPElements/HWPRecordBorderFill.cpp index a8b2340d59..d461b69676 100644 --- a/HwpFile/HwpDoc/HWPElements/HWPRecordBorderFill.cpp +++ b/HwpFile/HwpDoc/HWPElements/HWPRecordBorderFill.cpp @@ -405,7 +405,7 @@ CHWPRecordBorderFill::CHWPRecordBorderFill(CHWPDocInfo& oDocInfo, CXMLReader& oR m_oDiagonal.Read(oReader, eType); else if (GetNodeName(ENode::FillBrush, eType) == sNodeName) m_pFill = new CFill(oReader, eType); - else if (GetNodeName(ENode::Slash, eType) == sNodeName) + else if (Equals(ENode::Slash, eType, sNodeName)) { START_READ_ATTRIBUTES(oReader) { diff --git a/HwpFile/HwpDoc/HWPElements/HWPRecordCharShape.cpp b/HwpFile/HwpDoc/HWPElements/HWPRecordCharShape.cpp index 677696b555..f75a2dfc70 100644 --- a/HwpFile/HwpDoc/HWPElements/HWPRecordCharShape.cpp +++ b/HwpFile/HwpDoc/HWPElements/HWPRecordCharShape.cpp @@ -19,7 +19,7 @@ EAccent GetAccent(int nValue) } } -EAccent GetAccent(const HWP_STRING& sValue) +EAccent GetAccent(HWP_STRING sValue) { IF_STRING_IN_ENUM(DOT, sValue, EAccent); ELSE_IF_STRING_IN_ENUM(RING, sValue, EAccent); @@ -59,7 +59,7 @@ EUnderline GetUnderline(int nValue) } } -EUnderline GetUnderline(const HWP_STRING& sValue) +EUnderline GetUnderline(HWP_STRING sValue) { IF_STRING_IN_ENUM(BOTTOM, sValue, EUnderline); ELSE_IF_STRING_IN_ENUM(CENTER, sValue, EUnderline); @@ -81,7 +81,7 @@ EOutline GetOutline(int nValue) } } -EOutline GetOutline(const HWP_STRING& sValue) +EOutline GetOutline(HWP_STRING sValue) { IF_STRING_IN_ENUM(SOLID, sValue, EOutline); ELSE_IF_STRING_IN_ENUM(DOTTED, sValue, EOutline); @@ -102,7 +102,7 @@ EShadow GetShadow(int nValue) } } -EShadow GetShadow(const HWP_STRING& sValue) +EShadow GetShadow(HWP_STRING sValue) { IF_STRING_IN_ENUM(DISCRETE, sValue, EShadow); ELSE_IF_STRING_IN_ENUM(CONTINUOUS, sValue, EShadow); diff --git a/HwpFile/HwpDoc/HWPElements/HWPRecordCharShape.h b/HwpFile/HwpDoc/HWPElements/HWPRecordCharShape.h index 55e7e28659..3dcd0b2a7f 100644 --- a/HwpFile/HwpDoc/HWPElements/HWPRecordCharShape.h +++ b/HwpFile/HwpDoc/HWPElements/HWPRecordCharShape.h @@ -60,7 +60,7 @@ enum class EAccent }; EAccent GetAccent(int nValue); -EAccent GetAccent(const HWP_STRING& sValue); +EAccent GetAccent(HWP_STRING sValue); #define MAX_ELEMENTS (int)ELang::MAX diff --git a/HwpFile/HwpDoc/HWPElements/HWPRecordParaShape.cpp b/HwpFile/HwpDoc/HWPElements/HWPRecordParaShape.cpp index ce6c4ebfa1..ef2897bbb4 100644 --- a/HwpFile/HwpDoc/HWPElements/HWPRecordParaShape.cpp +++ b/HwpFile/HwpDoc/HWPElements/HWPRecordParaShape.cpp @@ -15,7 +15,7 @@ EHeadingType GetHeadingType(int nValue) } } -EHeadingType GetHeadingType(const HWP_STRING& sValue) +EHeadingType GetHeadingType(HWP_STRING sValue) { IF_STRING_IN_ENUM(OUTLINE, sValue, EHeadingType); ELSE_IF_STRING_IN_ENUM(NUMBER, sValue, EHeadingType); @@ -36,7 +36,7 @@ EHorizontalAlign GetHorizontalAlign(int nValue) } } -EHorizontalAlign GetHorizontalAlign(const HWP_STRING& sValue) +EHorizontalAlign GetHorizontalAlign(HWP_STRING sValue) { IF_STRING_IN_ENUM(RIGHT, sValue, EHorizontalAlign); ELSE_IF_STRING_IN_ENUM(CENTER, sValue, EHorizontalAlign); @@ -57,7 +57,7 @@ EVerticalAlign GetVerticalAlign(int nValue) } } -EVerticalAlign GetVerticalAlign(const HWP_STRING& sValue) +EVerticalAlign GetVerticalAlign(HWP_STRING sValue) { IF_STRING_IN_ENUM(CENTER, sValue, EVerticalAlign); ELSE_IF_STRING_IN_ENUM(BOTTOM, sValue, EVerticalAlign); diff --git a/HwpFile/HwpDoc/HWPElements/HWPType.h b/HwpFile/HwpDoc/HWPElements/HWPType.h deleted file mode 100644 index 34bbe90976..0000000000 --- a/HwpFile/HwpDoc/HWPElements/HWPType.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef HWPTYPE_H -#define HWPTYPE_H - -#include "HWPTag.h" - -namespace HWP -{ -class CHWPType -{ -public: - CHWPType(){}; - - EHWPTag m_eTag; -}; -} - -#endif // HWPTYPE_H diff --git a/HwpFile/HwpDoc/HWPElements/HwpRecordTypes.h b/HwpFile/HwpDoc/HWPElements/HwpRecordTypes.h index 70d078811b..48ad0d92ce 100644 --- a/HwpFile/HwpDoc/HWPElements/HwpRecordTypes.h +++ b/HwpFile/HwpDoc/HWPElements/HwpRecordTypes.h @@ -50,7 +50,7 @@ inline ELineStyle1 GetLineStyle1(int nValue) } } -inline ELineStyle1 GetLineStyle1(const HWP_STRING& sValue) +inline ELineStyle1 GetLineStyle1(HWP_STRING sValue) { IF_STRING_IN_ENUM(SOLID, sValue, ELineStyle1); ELSE_IF_STRING_IN_ENUM(DASH, sValue, ELineStyle1); @@ -107,7 +107,7 @@ inline ELineStyle2 GetLineStyle2(int nValue) } } -inline ELineStyle2 GetLineStyle2(const HWP_STRING& sValue) +inline ELineStyle2 GetLineStyle2(HWP_STRING sValue) { IF_STRING_IN_ENUM(NONE, sValue, ELineStyle2); ELSE_IF_STRING_IN_ENUM(SOLID, sValue, ELineStyle2); @@ -165,7 +165,7 @@ inline ENumberShape1 GetNumberShape1(int nValue) } } -inline ENumberShape1 GetNumberShape1(const HWP_STRING& sValue) +inline ENumberShape1 GetNumberShape1(HWP_STRING sValue) { IF_STRING_IN_ENUM(DIGIT, sValue, ENumberShape1); ELSE_IF_STRING_IN_ENUM(CIRCLE_DIGIT, sValue, ENumberShape1); @@ -234,7 +234,7 @@ inline ENumberShape2 GetNumberShape2(int nValue) } } -inline ENumberShape2 GetNumberShape2(const HWP_STRING& sValue) +inline ENumberShape2 GetNumberShape2(HWP_STRING sValue) { IF_STRING_IN_ENUM(DIGIT, sValue, ENumberShape2); ELSE_IF_STRING_IN_ENUM(CIRCLE_DIGIT, sValue, ENumberShape2); @@ -290,7 +290,7 @@ inline ELineArrowStyle GetLineArrowStyle(int nNum, bool bFill) } } -inline ELineArrowStyle GetLineArrowStyle(const HWP_STRING& sValue) +inline ELineArrowStyle GetLineArrowStyle(HWP_STRING sValue) { IF_STRING_IN_ENUM(NORMAL, sValue, ELineArrowStyle); ELSE_IF_STRING_IN_ENUM(ARROW, sValue, ELineArrowStyle); @@ -334,7 +334,7 @@ inline ELineArrowSize GetLineArrowSize(int nValue) } } -inline ELineArrowSize GetLineArrowSize(const HWP_STRING& sValue) +inline ELineArrowSize GetLineArrowSize(HWP_STRING sValue) { IF_STRING_IN_ENUM(SMALL_SMALL, sValue, ELineArrowSize); ELSE_IF_STRING_IN_ENUM(SMALL_MEDIUM, sValue, ELineArrowSize); diff --git a/HwpFile/HwpDoc/HWPMLFile.cpp b/HwpFile/HwpDoc/HWPMLFile.cpp index 25401f2034..55c606b00e 100644 --- a/HwpFile/HwpDoc/HWPMLFile.cpp +++ b/HwpFile/HwpDoc/HWPMLFile.cpp @@ -14,9 +14,9 @@ CHWPMLFile::~CHWPMLFile() { CLEAR_ARRAY(CHWPSection, m_arSections); - for (std::pair oValue : m_mBinDates) - if (nullptr != oValue.second) - delete[] oValue.second; + for (BinMap::iterator itBegin = m_mBinDates.begin(); itBegin != m_mBinDates.end(); ++itBegin) + if (nullptr != itBegin->second) + delete itBegin->second; } bool CHWPMLFile::Open() @@ -107,7 +107,7 @@ void CHWPMLFile::ReadBinData(CXMLReader &oReader) { size_t unSize = 0; std::string sEncoding; - unsigned int unID = 0; + HWP_STRING sId; bool bCompress = true; START_READ_ATTRIBUTES(oReader) @@ -117,42 +117,39 @@ void CHWPMLFile::ReadBinData(CXMLReader &oReader) else if ("Encoding" == sAttributeName) sEncoding = oReader.GetTextA(); else if ("Id" == sAttributeName) - unID = oReader.GetInt(); + sId = oReader.GetText(); else if ("Compress" == sAttributeName) bCompress = oReader.GetBool(); } END_READ_ATTRIBUTES(oReader) + if (sId.empty()) + return; + const std::wstring wsImageData{oReader.GetText()}; - if (0 == unSize) - unSize = wsImageData.length(); + int nImageSize = NSBase64::Base64DecodeGetRequiredLength(wsImageData.length()); - int nImageSize = NSBase64::Base64DecodeGetRequiredLength(unSize); - - BYTE* pBuffer = new BYTE[nImageSize]; + BYTE* pBuffer = new(std::nothrow) BYTE[nImageSize]; if (nullptr == pBuffer) return; - if (FALSE == NSBase64::Base64Decode(wsImageData.c_str(), unSize, pBuffer, &nImageSize)) + if (FALSE == NSBase64::Base64Decode(wsImageData.c_str(), wsImageData.length(), pBuffer, &nImageSize)) { delete[] pBuffer; return; } - std::map::iterator itFound = m_mBinDates.find(unID); + BinMap::iterator itFound = m_mBinDates.find(sId); if (m_mBinDates.end() != itFound) { - if (nullptr != itFound->second) - delete[] itFound->second; - - itFound->second = pBuffer; - return; + ((CHWPStream*)itFound->second)->Clear(); + ((CHWPStream*)itFound->second)->SetStream((HWP_BYTE*)pBuffer, nImageSize, false); } - - m_mBinDates.insert(std::make_pair(unID, pBuffer)); + else + m_mBinDates.insert(std::make_pair(sId, new CHWPStream((HWP_BYTE*)pBuffer, nImageSize, false))); } VECTOR CHWPMLFile::GetSections() const @@ -160,13 +157,15 @@ VECTOR CHWPMLFile::GetSections() const RETURN_VECTOR_CONST_PTR(CHWPSection, m_arSections); } -const BYTE *HWP::CHWPMLFile::GetBinData(unsigned int unID) const +bool CHWPMLFile::GetBinData(const HWP_STRING &sId, CHWPStream &oBuffer) const { - std::map::const_iterator itFound = m_mBinDates.find(unID); + BinMap::const_iterator itFound = m_mBinDates.find(sId); - if (m_mBinDates.end() == itFound) - return nullptr; + if (m_mBinDates.cend() == itFound || nullptr == itFound->second) + return false; - return itFound->second; + oBuffer.SetStream(((CHWPStream*)(itFound->second))->GetCurPtr(), ((CHWPStream*)(itFound->second))->SizeToEnd()); + + return true; } } diff --git a/HwpFile/HwpDoc/HWPMLFile.h b/HwpFile/HwpDoc/HWPMLFile.h index 71aaa45286..7bb9b9b13a 100644 --- a/HwpFile/HwpDoc/HWPMLFile.h +++ b/HwpFile/HwpDoc/HWPMLFile.h @@ -8,11 +8,13 @@ namespace HWP { class CHWPMLFile { + using BinMap = std::map ; + HWP_STRING m_wsFilePath; CHWPDocInfo m_oDocInfo; VECTOR m_arSections; - std::map m_mBinDates; - + BinMap m_mBinDates; + void ReadHead(CXMLReader& oReader); void ReadBody(CXMLReader& oReader); void ReadTail(CXMLReader& oReader); @@ -29,7 +31,7 @@ public: const CHWPDocInfo* GetDocInfo() const; VECTOR GetSections() const; - const BYTE* GetBinData(unsigned int unID) const; + bool GetBinData(const HWP_STRING& sId, CHWPStream& oBuffer) const; }; } diff --git a/HwpFile/HwpDoc/HWPStream.cpp b/HwpFile/HwpDoc/HWPStream.cpp index fec0d4b31a..faeec092dd 100644 --- a/HwpFile/HwpDoc/HWPStream.cpp +++ b/HwpFile/HwpDoc/HWPStream.cpp @@ -55,6 +55,11 @@ HWP_BYTE* CHWPStream::GetCurPtr() return m_pCur; } +const HWP_BYTE *CHWPStream::GetCurPtr() const +{ + return m_pCur; +} + unsigned long CHWPStream::Tell() const { return (!IsValid()) ? 0 : m_pCur - m_pBegin; diff --git a/HwpFile/HwpDoc/HWPStream.h b/HwpFile/HwpDoc/HWPStream.h index 3ca6d63db4..db3adbf29c 100644 --- a/HwpFile/HwpDoc/HWPStream.h +++ b/HwpFile/HwpDoc/HWPStream.h @@ -33,6 +33,7 @@ public: void SetStream(HWP_BYTE* pBuffer, unsigned long ulSize, bool bExternalBuffer = true); HWP_BYTE* GetCurPtr(); + const HWP_BYTE* GetCurPtr() const; unsigned long Tell() const; unsigned long SizeToEnd() const; diff --git a/HwpFile/HwpDoc/Paragraph/CellParagraph.cpp b/HwpFile/HwpDoc/Paragraph/CellParagraph.cpp index 72cf86d1d6..a10237d557 100644 --- a/HwpFile/HwpDoc/Paragraph/CellParagraph.cpp +++ b/HwpFile/HwpDoc/Paragraph/CellParagraph.cpp @@ -4,11 +4,10 @@ namespace HWP { CCellParagraph::CCellParagraph() : CHWPPargraph() -{ -} +{} -CCellParagraph::CCellParagraph(CXMLReader& oReader, int nVersion) - : CHWPPargraph(oReader, nVersion, EHanType::HWPX) +CCellParagraph::CCellParagraph(CXMLReader& oReader, int nVersion, EHanType eType) + : CHWPPargraph(oReader, nVersion, eType) {} EParagraphType CCellParagraph::GetType() const diff --git a/HwpFile/HwpDoc/Paragraph/CellParagraph.h b/HwpFile/HwpDoc/Paragraph/CellParagraph.h index 267f6b539d..12d9b299a1 100644 --- a/HwpFile/HwpDoc/Paragraph/CellParagraph.h +++ b/HwpFile/HwpDoc/Paragraph/CellParagraph.h @@ -9,7 +9,7 @@ class CCellParagraph : public CHWPPargraph { public: CCellParagraph(); - CCellParagraph(CXMLReader& oReader, int nVersion); + CCellParagraph(CXMLReader& oReader, int nVersion, EHanType eType); EParagraphType GetType() const override; }; diff --git a/HwpFile/HwpDoc/Paragraph/Ctrl.cpp b/HwpFile/HwpDoc/Paragraph/Ctrl.cpp index 39a8dd3fd2..64e6db8931 100644 --- a/HwpFile/HwpDoc/Paragraph/Ctrl.cpp +++ b/HwpFile/HwpDoc/Paragraph/Ctrl.cpp @@ -8,6 +8,8 @@ #include "CtrlPageNumPos.h" #include "CtrlField.h" +#include "../Common/NodeNames.h" + namespace HWP { CCtrl::CCtrl() @@ -50,16 +52,16 @@ bool CCtrl::Equals(CCtrl* pFirstCtrl, CCtrl* pSecondCtrl) pFirstCtrl->m_bFullFilled == pSecondCtrl->m_bFullFilled; } -CCtrl* CCtrl::GetCtrl(CXMLReader& oReader, int nVersion) +CCtrl* CCtrl::GetCtrl(CXMLReader& oReader, int nVersion, EHanType eType) { const std::string sNodeName{oReader.GetName()}; if ("hp:colPr" == sNodeName) return new CCtrlColumnDef(L"dloc", oReader, nVersion); - else if ("hp:header" == sNodeName) - return new CCtrlHeadFoot(L"daeh", oReader, nVersion); - else if ("hp:footer" == sNodeName) - return new CCtrlHeadFoot(L"toof", oReader, nVersion); + else if (GetNodeName(ENode::Header, eType) == sNodeName) + return new CCtrlHeadFoot(L"daeh", oReader, nVersion, eType); + else if (GetNodeName(ENode::Footer, eType) == sNodeName) + return new CCtrlHeadFoot(L"toof", oReader, nVersion, eType); else if ("hp:footNote" == sNodeName) return new CCtrlNote(L" nf", oReader, nVersion); else if ("hp:endNote" == sNodeName) diff --git a/HwpFile/HwpDoc/Paragraph/Ctrl.h b/HwpFile/HwpDoc/Paragraph/Ctrl.h index 3f61ef7970..1d5828f7ed 100644 --- a/HwpFile/HwpDoc/Paragraph/Ctrl.h +++ b/HwpFile/HwpDoc/Paragraph/Ctrl.h @@ -1,6 +1,8 @@ #ifndef CTRL_H #define CTRL_H +#include "../HanType.h" + #include "../Common/Common.h" #include "../Common/XMLReader.h" @@ -46,7 +48,7 @@ public: void SetFullFilled(); static bool Equals(CCtrl* pFirstCtrl, CCtrl* pSecondCtrl); - static CCtrl* GetCtrl(CXMLReader& oReader, int nVersion); + static CCtrl* GetCtrl(CXMLReader& oReader, int nVersion, EHanType eType); }; } diff --git a/HwpFile/HwpDoc/Paragraph/CtrlAutoNumber.cpp b/HwpFile/HwpDoc/Paragraph/CtrlAutoNumber.cpp index c61e1a9cdc..bb2ccf1512 100644 --- a/HwpFile/HwpDoc/Paragraph/CtrlAutoNumber.cpp +++ b/HwpFile/HwpDoc/Paragraph/CtrlAutoNumber.cpp @@ -16,7 +16,7 @@ ENumType GetNumType(int nValue) } } -ENumType GetNumType(const HWP_STRING& sValue) +ENumType GetNumType(HWP_STRING sValue) { IF_STRING_IN_ENUM(FOOTNOTE, sValue, ENumType); ELSE_IF_STRING_IN_ENUM(ENDNOTE, sValue, ENumType); diff --git a/HwpFile/HwpDoc/Paragraph/CtrlAutoNumber.h b/HwpFile/HwpDoc/Paragraph/CtrlAutoNumber.h index 29cd53f1c7..d9057d9339 100644 --- a/HwpFile/HwpDoc/Paragraph/CtrlAutoNumber.h +++ b/HwpFile/HwpDoc/Paragraph/CtrlAutoNumber.h @@ -21,7 +21,7 @@ enum class ENumType }; ENumType GetNumType(int nValue); -ENumType GetNumType(const HWP_STRING& sValue); +ENumType GetNumType(HWP_STRING sValue); class CCtrlAutoNumber : public CCtrl { diff --git a/HwpFile/HwpDoc/Paragraph/CtrlCommon.cpp b/HwpFile/HwpDoc/Paragraph/CtrlCommon.cpp index b2bd8b56d1..3eed463784 100644 --- a/HwpFile/HwpDoc/Paragraph/CtrlCommon.cpp +++ b/HwpFile/HwpDoc/Paragraph/CtrlCommon.cpp @@ -23,8 +23,6 @@ namespace HWP EVertAlign GetVertAlign(HWP_STRING sValue) { - TO_UPPER(sValue); - IF_STRING_IN_ENUM(CENTER, sValue, EVertAlign); ELSE_IF_STRING_IN_ENUM(BOTTOM, sValue, EVertAlign); ELSE_IF_STRING_IN_ENUM(INSIDE, sValue, EVertAlign); @@ -44,8 +42,6 @@ namespace HWP EVRelTo GetVRelTo(HWP_STRING sValue) { - TO_UPPER(sValue); - IF_STRING_IN_ENUM(PARA, sValue, EVRelTo); ELSE_IF_STRING_IN_ENUM(PAGE, sValue, EVRelTo); ELSE_IF_STRING_IN_ENUM(PAPER, sValue, EVRelTo); @@ -65,8 +61,6 @@ namespace HWP EHRelTo GetHRelTo(HWP_STRING sValue) { - TO_UPPER(sValue); - IF_STRING_IN_ENUM(PAGE, sValue, EHRelTo); ELSE_IF_STRING_IN_ENUM(PARA, sValue, EHRelTo); ELSE_IF_STRING_IN_ENUM(COLUMN, sValue, EHRelTo); @@ -87,8 +81,6 @@ namespace HWP EWidthRelTo GetWidthRelTo(HWP_STRING sValue) { - TO_UPPER(sValue); - IF_STRING_IN_ENUM(PAGE, sValue, EWidthRelTo); ELSE_IF_STRING_IN_ENUM(PARA, sValue, EWidthRelTo); ELSE_IF_STRING_IN_ENUM(COLUMN, sValue, EWidthRelTo); @@ -108,8 +100,6 @@ namespace HWP EHeightRelTo GetHeightRelTo(HWP_STRING sValue) { - TO_UPPER(sValue); - IF_STRING_IN_ENUM(PAGE, sValue, EHeightRelTo); ELSE_IF_STRING_IN_ENUM(ABSOLUTE, sValue, EHeightRelTo); ELSE_STRING_IN_ENUM(PAPER, EHeightRelTo); @@ -129,8 +119,6 @@ namespace HWP EHorzAlign GetHorzAlign(HWP_STRING sValue) { - TO_UPPER(sValue); - IF_STRING_IN_ENUM(CENTER, sValue, EHorzAlign); ELSE_IF_STRING_IN_ENUM(RIGHT, sValue, EHorzAlign); ELSE_IF_STRING_IN_ENUM(INSIDE, sValue, EHorzAlign); @@ -151,8 +139,6 @@ namespace HWP ETextWrap GetTextWrap(HWP_STRING sValue) { - TO_UPPER(sValue); - IF_STRING_IN_ENUM(TOP_AND_BOTTOM, sValue, ETextWrap); ELSE_IF_STRING_IN_ENUM(BEHIND_TEXT, sValue, ETextWrap); ELSE_IF_STRING_IN_ENUM(IN_FRONT_OF_TEXT, sValue, ETextWrap); @@ -268,7 +254,30 @@ namespace HWP } CCtrlCommon::CCtrlCommon(const HWP_STRING& sCtrlID, CXMLReader& oReader, int nVersion, EHanType eType) - : CCtrl(sCtrlID), m_bTreatAsChar(false), m_eVertRelTo(EVRelTo::PARA), m_eHorzRelTo(EHRelTo::PARA), m_nVertOffset(0), m_nHorzOffset(0), m_nWidth(0), m_nHeight(0), m_arOutMargin{0, 0, 0, 0}, m_arInMargin{0, 0, 0, 0}, m_eTextVerAlign(EVertAlign::TOP) + : CCtrl(sCtrlID), m_bTreatAsChar(false), m_eVertRelTo(EVRelTo::PARA), m_eHorzRelTo(EHRelTo::PARA), + m_nVertOffset(0), m_nHorzOffset(0), m_nWidth(0), m_nHeight(0), m_arOutMargin{0, 0, 0, 0}, + m_arInMargin{0, 0, 0, 0}, m_eTextVerAlign(EVertAlign::TOP), m_nZOrder(0) + { + if (EHanType::HWPX == eType) + ReadAttributes(oReader, eType); + } + + CCtrlCommon::~CCtrlCommon() + { + for (CHWPPargraph* pParagraph : m_arParas) + { + if (0 == pParagraph->Release()) + pParagraph = nullptr; + } + + for (CCapParagraph* pCapParagraph : m_arCaption) + { + if (0 == pCapParagraph->Release()) + pCapParagraph = nullptr; + } + } + + void CCtrlCommon::ReadAttributes(CXMLReader &oReader, EHanType eType) { std::string sType; @@ -321,21 +330,6 @@ namespace HWP END_READ_ATTRIBUTES(oReader) } - CCtrlCommon::~CCtrlCommon() - { - for (CHWPPargraph* pParagraph : m_arParas) - { - if (0 == pParagraph->Release()) - pParagraph = nullptr; - } - - for (CCapParagraph* pCapParagraph : m_arCaption) - { - if (0 == pCapParagraph->Release()) - pCapParagraph = nullptr; - } - } - ECtrlObjectType CCtrlCommon::GetCtrlType() const { return ECtrlObjectType::Common; @@ -350,6 +344,17 @@ namespace HWP { const std::string sNodeName{oReader.GetName()}; + if (EHanType::HWPML == eType && "SHAPEOBJECT" == sNodeName) + { + ReadAttributes(oReader, eType); + + WHILE_READ_NEXT_NODE(oReader) + ParseChildren(oReader, nVersion, EHanType::HWPML); + END_WHILE + + return; + } + if (GetNodeName(ENode::Size, eType) == sNodeName) { START_READ_ATTRIBUTES(oReader) diff --git a/HwpFile/HwpDoc/Paragraph/CtrlCommon.h b/HwpFile/HwpDoc/Paragraph/CtrlCommon.h index 215653000c..dcacf431a1 100644 --- a/HwpFile/HwpDoc/Paragraph/CtrlCommon.h +++ b/HwpFile/HwpDoc/Paragraph/CtrlCommon.h @@ -109,6 +109,8 @@ class CCtrlCommon : public CCtrl friend class CCtrlShapeVideo; friend class CCtrlEqEdit; friend class CCtrlTable; + + void ReadAttributes(CXMLReader& oReader, EHanType eType); public: CCtrlCommon(); CCtrlCommon(const HWP_STRING& sCtrlID); diff --git a/HwpFile/HwpDoc/Paragraph/CtrlGeneralShape.cpp b/HwpFile/HwpDoc/Paragraph/CtrlGeneralShape.cpp index ffa3846ea8..5e54038fde 100644 --- a/HwpFile/HwpDoc/Paragraph/CtrlGeneralShape.cpp +++ b/HwpFile/HwpDoc/Paragraph/CtrlGeneralShape.cpp @@ -88,6 +88,9 @@ EShapeType CCtrlGeneralShape::GetShapeType() const ELineArrowSize CheckLineSize(const std::string& sLineSzType, EHanType eType) { + if (sLineSzType.empty()) + return ELineArrowSize::MEDIUM_MEDIUM; + if (GetValueName(EValue::SmallSmall, eType) == sLineSzType) return ELineArrowSize::SMALL_SMALL; else if (GetValueName(EValue::SmallMedium, eType) == sLineSzType) @@ -112,6 +115,9 @@ ELineArrowSize CheckLineSize(const std::string& sLineSzType, EHanType eType) ELineArrowStyle CheckLineArrowStyle(const std::string& sLineArrowStyle, bool bHeadFill, EHanType eType) { + if (sLineArrowStyle.empty()) + return ELineArrowStyle::NORMAL; + if (GetValueName(EValue::Arrow, eType) == sLineArrowStyle) return ELineArrowStyle::ARROW; else if (GetValueName(EValue::Spear, eType) == sLineArrowStyle) @@ -136,7 +142,7 @@ ELineArrowStyle CheckLineArrowStyle(const std::string& sLineArrowStyle, bool bHe { if (EHanType::HWPX == eType) return bHeadFill ? ELineArrowStyle::BOX : ELineArrowStyle::EMPTY_BOX; - + return ELineArrowStyle::EMPTY_BOX; } @@ -179,30 +185,30 @@ void CCtrlGeneralShape::ParseChildren(CXMLReader& oReader, int nVersion, EHanTyp m_eLineHead = CheckLineArrowStyle(sHeadStyle, bHeadFill, eType); m_eLineTail = CheckLineArrowStyle(sTailStyle, bTailFill, eType); } - else if ("hc:fillBrush" == sNodeName) + else if (GetNodeName(ENode::FillBrush, eType) == sNodeName) m_pFill = new CFill(oReader, eType); - else if ("hp:drawText" == sNodeName) + else if (GetNodeName(ENode::DrawText, eType) == sNodeName) { - m_nMaxTxtWidth = oReader.GetAttributeInt("lastWidth"); + m_nMaxTxtWidth = oReader.GetAttributeInt(GetAttributeName(EAttribute::LastWidth, eType)); WHILE_READ_NEXT_NODE_WITH_DEPTH_AND_NAME(oReader, Child) { - if ("hp:textMargin" == sNodeChildName) + if (GetNodeName(ENode::TextMargin, eType) == sNodeChildName) { START_READ_ATTRIBUTES(oReader) { - if ("left" == sAttributeName) + if (GetAttributeName(EAttribute::Left, eType) == sAttributeName) m_shLeftSpace = oReader.GetInt(); - else if ("right" == sAttributeName) + else if (GetAttributeName(EAttribute::Right, eType) == sAttributeName) m_shRightSpace = oReader.GetInt(); - else if ("top" == sAttributeName) + else if (GetAttributeName(EAttribute::Top, eType) == sAttributeName) m_shTopSpace = oReader.GetInt(); - else if ("bottom" == sAttributeName) + else if (GetAttributeName(EAttribute::Bottom, eType) == sAttributeName) m_shBottomSpace = oReader.GetInt(); } END_READ_ATTRIBUTES(oReader) } - else if ("hp:subList" == sNodeChildName) + else if (EHanType::HWPX == eType && "hp:subList" == sNodeChildName) ReadSubList(oReader, nVersion); } END_WHILE diff --git a/HwpFile/HwpDoc/Paragraph/CtrlHeadFoot.cpp b/HwpFile/HwpDoc/Paragraph/CtrlHeadFoot.cpp index 9d2e122787..dc32998ed6 100644 --- a/HwpFile/HwpDoc/Paragraph/CtrlHeadFoot.cpp +++ b/HwpFile/HwpDoc/Paragraph/CtrlHeadFoot.cpp @@ -24,11 +24,22 @@ CCtrlHeadFoot::CCtrlHeadFoot(const HWP_STRING& sCtrlID, int nSize, CHWPStream& o oBuffer.ReadInt(m_nSerialInSec); } -CCtrlHeadFoot::CCtrlHeadFoot(const HWP_STRING& sCtrlID, CXMLReader& oReader, int nVersion) +CCtrlHeadFoot::CCtrlHeadFoot(const HWP_STRING& sCtrlID, CXMLReader& oReader, int nVersion, EHanType eType) : CCtrl(sCtrlID) { m_bIsHeader = L"daeh" == sCtrlID; + switch (eType) + { + case EHanType::HWPX: ReadFromHWPX(oReader, nVersion); break; + case EHanType::HWPML:ReadFromHWPML(oReader); break; + } + + m_bFullFilled = true; +} + +void CCtrlHeadFoot::ReadFromHWPX(CXMLReader &oReader, int nVersion) +{ m_eWhichPage = GetPageRange(oReader.GetAttributeInt("applyPageType")); WHILE_READ_NEXT_NODE_WITH_ONE_NAME(oReader, "hp:subList") @@ -51,8 +62,36 @@ CCtrlHeadFoot::CCtrlHeadFoot(const HWP_STRING& sCtrlID, CXMLReader& oReader, int END_WHILE } END_WHILE +} - m_bFullFilled = true; +void CCtrlHeadFoot::ReadFromHWPML(CXMLReader &oReader) +{ + START_READ_ATTRIBUTES(oReader) + { + if ("ApplyPageType" == sAttributeName) + { + const std::string sValue{oReader.GetTextA()}; + + if ("Both" == sValue) + m_eWhichPage = EPageRange::BOTH; + else if ("Even" == sValue) + m_eWhichPage = EPageRange::EVEN; + else if ("Odd" == sValue) + m_eWhichPage = EPageRange::ODD; + } + else if ("TextHeight" == sAttributeName) + m_nTextHeight = oReader.GetInt(); + else if ("TextWidth" == sAttributeName) + m_nTextWidth = oReader.GetInt(); + //TODO:: Реализовать HasTextRef и HasTextRef + } + END_READ_ATTRIBUTES(oReader) + + WHILE_READ_NEXT_NODE_WITH_ONE_NAME(oReader, "PARALIST") + WHILE_READ_NEXT_NODE_WITH_DEPTH_ONE_NAME(oReader, Child, "P") + m_arParas.push_back(new CHWPPargraph(oReader, 0, EHanType::HWPML)); + END_WHILE + END_WHILE } ECtrlObjectType CCtrlHeadFoot::GetCtrlType() const diff --git a/HwpFile/HwpDoc/Paragraph/CtrlHeadFoot.h b/HwpFile/HwpDoc/Paragraph/CtrlHeadFoot.h index 926fbf70ed..043a75533b 100644 --- a/HwpFile/HwpDoc/Paragraph/CtrlHeadFoot.h +++ b/HwpFile/HwpDoc/Paragraph/CtrlHeadFoot.h @@ -28,10 +28,13 @@ class CCtrlHeadFoot : public CCtrl HWP_BYTE m_chRefLevelNum; VECTOR m_arParas; + + void ReadFromHWPX(CXMLReader& oReader, int nVersion); + void ReadFromHWPML(CXMLReader& oReader); public: CCtrlHeadFoot(const HWP_STRING& sCtrlID); CCtrlHeadFoot(const HWP_STRING& sCtrlID, int nSize, CHWPStream& oBuffer, int nOff, int nVersion, bool bIsHeader); - CCtrlHeadFoot(const HWP_STRING& sCtrlID, CXMLReader& oReader, int nVersion); + CCtrlHeadFoot(const HWP_STRING& sCtrlID, CXMLReader& oReader, int nVersion, EHanType eType); ECtrlObjectType GetCtrlType() const override; diff --git a/HwpFile/HwpDoc/Paragraph/CtrlObjElement.cpp b/HwpFile/HwpDoc/Paragraph/CtrlObjElement.cpp index 27da16e45d..e708a53696 100644 --- a/HwpFile/HwpDoc/Paragraph/CtrlObjElement.cpp +++ b/HwpFile/HwpDoc/Paragraph/CtrlObjElement.cpp @@ -74,7 +74,7 @@ TMatrix ReadMatrix(CXMLReader& oReader, EHanType eType) } CCtrlObjElement::CCtrlObjElement(const HWP_STRING& sCtrlID, CXMLReader& oReader, int nVersion, EHanType eType) - : CCtrlCommon(sCtrlID, oReader, nVersion, eType) + : CCtrlCommon(sCtrlID, oReader, nVersion, eType), m_nCurWidth(0), m_nCurHeight(0) { if (EHanType::HWPX == eType) m_shNGrp = oReader.GetAttributeInt("groupLevel"); diff --git a/HwpFile/HwpDoc/Paragraph/CtrlPageNumPos.cpp b/HwpFile/HwpDoc/Paragraph/CtrlPageNumPos.cpp index 3b077236d1..4ee82f444a 100644 --- a/HwpFile/HwpDoc/Paragraph/CtrlPageNumPos.cpp +++ b/HwpFile/HwpDoc/Paragraph/CtrlPageNumPos.cpp @@ -20,7 +20,7 @@ ENumPos GetNumPos(int nValue) } } -ENumPos GetNumPos(const HWP_STRING& sValue) +ENumPos GetNumPos(HWP_STRING sValue) { IF_STRING_IN_ENUM(TOP_LEFT, sValue, ENumPos); ELSE_IF_STRING_IN_ENUM(TOP_CENTER, sValue, ENumPos); diff --git a/HwpFile/HwpDoc/Paragraph/CtrlShapeEllipse.cpp b/HwpFile/HwpDoc/Paragraph/CtrlShapeEllipse.cpp index 3a32da76ff..5a27779b09 100644 --- a/HwpFile/HwpDoc/Paragraph/CtrlShapeEllipse.cpp +++ b/HwpFile/HwpDoc/Paragraph/CtrlShapeEllipse.cpp @@ -12,7 +12,7 @@ EArcType GetArcType(int nValue) } } -EArcType GetArcType(const HWP_STRING& sValue) +EArcType GetArcType(HWP_STRING sValue) { IF_STRING_IN_ENUM(PIE, sValue, EArcType); ELSE_IF_STRING_IN_ENUM(CHORD, sValue, EArcType); diff --git a/HwpFile/HwpDoc/Paragraph/CtrlShapeEllipse.h b/HwpFile/HwpDoc/Paragraph/CtrlShapeEllipse.h index c767b6f14d..6568e674c7 100644 --- a/HwpFile/HwpDoc/Paragraph/CtrlShapeEllipse.h +++ b/HwpFile/HwpDoc/Paragraph/CtrlShapeEllipse.h @@ -13,7 +13,7 @@ enum class EArcType }; EArcType GetArcType(int nValue); -EArcType GetArcType(const HWP_STRING& sValue); +EArcType GetArcType(HWP_STRING sValue); class CCtrlShapeEllipse : public CCtrlGeneralShape { diff --git a/HwpFile/HwpDoc/Paragraph/CtrlShapePic.cpp b/HwpFile/HwpDoc/Paragraph/CtrlShapePic.cpp index 4353105d9a..d5a650375a 100644 --- a/HwpFile/HwpDoc/Paragraph/CtrlShapePic.cpp +++ b/HwpFile/HwpDoc/Paragraph/CtrlShapePic.cpp @@ -354,29 +354,7 @@ void CCtrlShapePic::ReadFromHWPX(CXMLReader &oReader, int nVersion) else if ("hp:effects" == sNodeName) ReadEffects(oReader, EHanType::HWPX); else if ("hc:img" == sNodeName) - { - START_READ_ATTRIBUTES(oReader) - { - if ("bright" == sAttributeName) - m_chBright = (HWP_BYTE)oReader.GetInt(); - else if ("contrast" == sAttributeName) - m_chContrast = (HWP_BYTE)oReader.GetInt(); - else if ("effect" == sAttributeName) - { - const std::string sType{oReader.GetTextA()}; - - if ("REAL_PIC" == sType) - m_chEffect = 0; - else if ("GRAY_SCALE" == sType) - m_chEffect = 1; - else if ("BLACK_WHITE" == sType) - m_chEffect = 2; - } - else if ("binaryItemIDRef" == sAttributeName) - m_sBinDataID = oReader.GetText(); - } - END_READ_ATTRIBUTES(oReader) - } + ReadImage(oReader, EHanType::HWPX); else if ("hp:imgDim" == sNodeName) { START_READ_ATTRIBUTES(oReader) @@ -419,6 +397,10 @@ void CCtrlShapePic::ReadFromHWPML(CXMLReader &oReader) ReadImageClip(oReader, EHanType::HWPML); else if ("EFFECTS" == sNodeName) ReadEffects(oReader, EHanType::HWPML); + else if ("IMAGE" == sNodeName) + ReadImage(oReader, EHanType::HWPML); + else + CCtrlGeneralShape::ParseChildren(oReader, 0, EHanType::HWPML); } END_WHILE } @@ -455,6 +437,31 @@ void CCtrlShapePic::ReadEffects(CXMLReader &oReader, EHanType eType) END_WHILE } +void CCtrlShapePic::ReadImage(CXMLReader &oReader, EHanType eType) +{ + START_READ_ATTRIBUTES(oReader) + { + if (GetAttributeName(EAttribute::Bright, eType) == sAttributeName) + m_chBright = (HWP_BYTE)oReader.GetInt(); + else if (GetAttributeName(EAttribute::Contrast, eType) == sAttributeName) + m_chContrast = (HWP_BYTE)oReader.GetInt(); + else if (GetAttributeName(EAttribute::Effect, eType) == sAttributeName) + { + const std::string sType{oReader.GetTextA()}; + + if (GetValueName(EValue::RealPic, eType) == sType) + m_chEffect = 0; + else if (GetValueName(EValue::GrayScale, eType) == sType) + m_chEffect = 1; + else if (GetValueName(EValue::BlackWhite, eType) == sType) + m_chEffect = 2; + } + else if (GetAttributeName(EAttribute::BinItem, eType) == sAttributeName) + m_sBinDataID = oReader.GetText(); + } + END_READ_ATTRIBUTES(oReader) +} + EShapeType CCtrlShapePic::GetShapeType() const { return EShapeType::Pic; diff --git a/HwpFile/HwpDoc/Paragraph/CtrlShapePic.h b/HwpFile/HwpDoc/Paragraph/CtrlShapePic.h index 39e865571c..8cb71cec7a 100644 --- a/HwpFile/HwpDoc/Paragraph/CtrlShapePic.h +++ b/HwpFile/HwpDoc/Paragraph/CtrlShapePic.h @@ -135,6 +135,7 @@ class CCtrlShapePic : public CCtrlGeneralShape void ReadImageClip(CXMLReader& oReader, EHanType eType); void ReadEffects(CXMLReader& oReader, EHanType eType); + void ReadImage(CXMLReader& oReader, EHanType eType); public: CCtrlShapePic(); CCtrlShapePic(const HWP_STRING& sCtrlID); diff --git a/HwpFile/HwpDoc/Paragraph/CtrlTable.cpp b/HwpFile/HwpDoc/Paragraph/CtrlTable.cpp index 755737a714..af20844347 100644 --- a/HwpFile/HwpDoc/Paragraph/CtrlTable.cpp +++ b/HwpFile/HwpDoc/Paragraph/CtrlTable.cpp @@ -1,5 +1,7 @@ #include "CtrlTable.h" +#include "../Common/NodeNames.h" + namespace HWP { CCtrlTable::CCtrlTable(const HWP_STRING& sCtrlID) @@ -15,51 +17,51 @@ CCtrlTable::CCtrlTable(const HWP_STRING& sCtrlID, CXMLReader& oReader, int nVers { START_READ_ATTRIBUTES(oReader) { - if ("rowCnt" == sAttributeName) + if (GetAttributeName(EAttribute::RowCount, eType) == sAttributeName) m_shNRows = oReader.GetInt(); - else if ("colCnt" == sAttributeName) + else if (GetAttributeName(EAttribute::ColCount, eType) == sAttributeName) m_shNCols = oReader.GetInt(); - else if ("cellSpacing" == sAttributeName) + else if (GetAttributeName(EAttribute::CellSpacing, eType) == sAttributeName) m_shCellSpacing = oReader.GetInt(); - else if ("borderFillIDRef" == sAttributeName) + else if (GetAttributeName(EAttribute::BorderFill, eType) == sAttributeName) m_shBorderFillID = oReader.GetInt(); } END_READ_ATTRIBUTES(oReader) WHILE_READ_NEXT_NODE_WITH_NAME(oReader) { - if ("hp:inMargin" == sNodeName) + if (GetNodeName(ENode::InSideMargin, eType) == sNodeName) { START_READ_ATTRIBUTES(oReader) { - if ("left" == sAttributeName) + if (GetAttributeName(EAttribute::Left, eType) == sAttributeName) m_shInLSpace = oReader.GetInt(); - else if ("right" == sAttributeName) + else if (GetAttributeName(EAttribute::Right, eType) == sAttributeName) m_shInRSpace = oReader.GetInt(); - else if ("top" == sAttributeName) + else if (GetAttributeName(EAttribute::Top, eType) == sAttributeName) m_shInTSpace = oReader.GetInt(); - else if ("bottom" == sAttributeName) + else if (GetAttributeName(EAttribute::Bottom, eType) == sAttributeName) m_shInBSpace = oReader.GetInt(); } END_READ_ATTRIBUTES(oReader) } - else if ("hp:cellzoneList" == sNodeName) + else if (GetNodeName(ENode::CellZoneList, eType) == sNodeName) { - WHILE_READ_NEXT_NODE_WITH_DEPTH_ONE_NAME(oReader, Child, "hp:cellzone") + WHILE_READ_NEXT_NODE_WITH_DEPTH_ONE_NAME(oReader, Child, GetNodeName(ENode::CellZone, eType)) { TCellZone* pCellZone = new TCellZone(); START_READ_ATTRIBUTES(oReader) { - if ("startRowAddr" == sAttributeName) + if (GetAttributeName(EAttribute::StartRowAddr, eType) == sAttributeName) pCellZone->m_shStartRowAddr = oReader.GetInt(); - else if ("startColAddr" == sAttributeName) + else if (GetAttributeName(EAttribute::StartColAddr, eType) == sAttributeName) pCellZone->m_shStartColAddr = oReader.GetInt(); - else if ("endRowAddr" == sAttributeName) + else if (GetAttributeName(EAttribute::EndRowAddr, eType) == sAttributeName) pCellZone->m_shEndRowAddr = oReader.GetInt(); - else if ("endColAddr" == sAttributeName) + else if (GetAttributeName(EAttribute::EndColAddr, eType) == sAttributeName) pCellZone->m_shEndColAddr = oReader.GetInt(); - else if ("borderFillIDRef" == sAttributeName) + else if (GetAttributeName(EAttribute::BorderFill, eType) == sAttributeName) pCellZone->m_shBorderFillIDRef = oReader.GetInt(); } END_READ_ATTRIBUTES(oReader) @@ -68,10 +70,10 @@ CCtrlTable::CCtrlTable(const HWP_STRING& sCtrlID, CXMLReader& oReader, int nVers } END_WHILE } - else if ("hp:tr" == sNodeName) + else if (GetNodeName(ENode::Row, eType) == sNodeName) { - WHILE_READ_NEXT_NODE_WITH_DEPTH_ONE_NAME(oReader, Child, "hp:tc") - m_arCells.push_back(new CTblCell(oReader, nVersion)); + WHILE_READ_NEXT_NODE_WITH_DEPTH_ONE_NAME(oReader, Child, GetNodeName(ENode::Cell, eType)) + m_arCells.push_back(new CTblCell(oReader, nVersion, eType)); END_WHILE } else diff --git a/HwpFile/HwpDoc/Paragraph/CtrlTable.h b/HwpFile/HwpDoc/Paragraph/CtrlTable.h index 42dbd922d8..189d2944a3 100644 --- a/HwpFile/HwpDoc/Paragraph/CtrlTable.h +++ b/HwpFile/HwpDoc/Paragraph/CtrlTable.h @@ -8,7 +8,7 @@ namespace HWP struct TCellZone { short m_shStartRowAddr; - short m_shStartColAddr;; + short m_shStartColAddr; short m_shEndRowAddr; short m_shEndColAddr; short m_shBorderFillIDRef; diff --git a/HwpFile/HwpDoc/Paragraph/HWPPargraph.cpp b/HwpFile/HwpDoc/Paragraph/HWPPargraph.cpp index 38eab2d844..ab34e108fe 100644 --- a/HwpFile/HwpDoc/Paragraph/HWPPargraph.cpp +++ b/HwpFile/HwpDoc/Paragraph/HWPPargraph.cpp @@ -45,7 +45,7 @@ CHWPPargraph::CHWPPargraph(CXMLReader& oReader, int nVersion, EHanType eType) else m_chBreakType &= 0b11111011; } - else if (GetAttributeName(EAttribute::ColumnBreak, eType) == sAttributeName) + else if (Equals(EAttribute::ColumnBreak, eType, sAttributeName)) { if (oReader.GetBool()) m_chBreakType |= 0b00001000; @@ -97,12 +97,6 @@ bool CHWPPargraph::ParseHWPParagraph(CXMLReader& oReader, int nCharShapeID, int if (GetNodeName(ENode::SectionDef, eType) == sNodeName) m_arP.push_back(new CCtrlSectionDef(L"dces", oReader, nVersion)); - else if (GetNodeName(ENode::Ctrl, eType) == sNodeName) - { - WHILE_READ_NEXT_NODE(oReader) - AddCtrl(CCtrl::GetCtrl(oReader, nVersion)); - END_WHILE - } else if (GetNodeName(ENode::Char, eType) == sNodeName) { if (oReader.IsEmptyNode()) @@ -170,6 +164,14 @@ bool CHWPPargraph::ParseHWPParagraph(CXMLReader& oReader, int nCharShapeID, int m_arP.push_back(new CCtrlShapeTextArt(L"tat$", oReader, nVersion, eType)); else if (GetNodeName(ENode::Video, eType) == sNodeName) m_arP.push_back(new CCtrlShapeVideo(L"div$", oReader, nVersion, eType)); + else if (EHanType::HWPX == eType && "hp:ctrl" == sNodeName) + { + WHILE_READ_NEXT_NODE(oReader) + AddCtrl(CCtrl::GetCtrl(oReader, nVersion, EHanType::HWPX)); + END_WHILE + } + else if (EHanType::HWPML == eType) + AddCtrl(CCtrl::GetCtrl(oReader, nVersion, EHanType::HWPML)); if (unCurrentParaCount != m_arP.size()) return true; diff --git a/HwpFile/HwpDoc/Paragraph/TblCell.cpp b/HwpFile/HwpDoc/Paragraph/TblCell.cpp index 63669f6eaf..4808783d06 100644 --- a/HwpFile/HwpDoc/Paragraph/TblCell.cpp +++ b/HwpFile/HwpDoc/Paragraph/TblCell.cpp @@ -1,6 +1,8 @@ #include "TblCell.h" #include "CtrlCharacter.h" +#include "../Common/NodeNames.h" + namespace HWP { CTblCell::CTblCell(int nSize, CHWPStream& oBuffer, int nOff, int nVersion) @@ -25,7 +27,16 @@ CTblCell::CTblCell(int nSize, CHWPStream& oBuffer, int nOff, int nVersion) oBuffer.Skip(nSize - oBuffer.GetDistanceToLastPos(true)); } -CTblCell::CTblCell(CXMLReader& oReader, int nVersion) +CTblCell::CTblCell(CXMLReader& oReader, int nVersion, EHanType eType) +{ + switch (eType) + { + case EHanType::HWPX: ReadFromHWPX(oReader, nVersion); return; + case EHanType::HWPML: ReadFromHWPML(oReader); return; + } +} + +void CTblCell::ReadFromHWPX(CXMLReader &oReader, int nVersion) { m_shBorderFill = oReader.GetAttributeInt("borderFillIDRef"); @@ -65,42 +76,87 @@ CTblCell::CTblCell(CXMLReader& oReader, int nVersion) END_READ_ATTRIBUTES(oReader) } else if ("hp:cellSz" == sNodeName) - { - START_READ_ATTRIBUTES(oReader) - { - if ("left" == sAttributeName) - m_arMargin[0] = oReader.GetInt(); - else if ("right" == sAttributeName) - m_arMargin[1] = oReader.GetInt(); - else if ("top" == sAttributeName) - m_arMargin[2] = oReader.GetInt(); - else if ("bottom" == sAttributeName) - m_arMargin[3] = oReader.GetInt(); - } - END_READ_ATTRIBUTES(oReader) - } + ReadCellMargin(oReader, EHanType::HWPX); else if ("hp:subList" == sNodeName) { m_eVertAlign = ::HWP::GetVertAlign(oReader.GetAttribute("vertAlign")); WHILE_READ_NEXT_NODE_WITH_ONE_NAME(oReader, "hp:p") - { - CCellParagraph *pCellParagraphs = new CCellParagraph(oReader, nVersion); - - if (nullptr == pCellParagraphs) - continue; - - if (ECtrlObjectType::Character != pCellParagraphs->GetCtrls().back()->GetCtrlType()) - pCellParagraphs->AddCtrl(new CCtrlCharacter(L" _", ECtrlCharType::PARAGRAPH_BREAK)); - - m_arParas.push_back(pCellParagraphs); - } + ReadCell(oReader, nVersion, EHanType::HWPX); END_WHILE } } END_WHILE } +void CTblCell::ReadFromHWPML(CXMLReader &oReader) +{ + START_READ_ATTRIBUTES(oReader) + { + if ("Name" == sAttributeName) + m_sMergedColName = oReader.GetText(); + else if ("ColAddr" == sAttributeName) + m_shColAddr = oReader.GetInt(); + else if ("RowAddr" == sAttributeName) + m_shRowAddr = oReader.GetInt(); + else if ("ColSpan" == sAttributeName) + m_shColSpan = oReader.GetInt(); + else if ("RowSpan" == sAttributeName) + m_shRowSpan = oReader.GetInt(); + else if ("Width" == sAttributeName) + m_nWidth = oReader.GetInt(); + else if ("Height" == sAttributeName) + m_nHeight = oReader.GetInt(); + else if ("BorderFill" == sAttributeName) + m_shBorderFill = oReader.GetInt(); + } + END_READ_ATTRIBUTES(oReader) + + WHILE_READ_NEXT_NODE_WITH_NAME(oReader) + { + if ("CELLMARGIN" == sNodeName) + ReadCellMargin(oReader, EHanType::HWPML); + else if ("PARALIST" == sNodeName) + { + m_eVertAlign = ::HWP::GetVertAlign(oReader.GetAttribute("VertAlign")); + + WHILE_READ_NEXT_NODE_WITH_ONE_NAME(oReader, "P") + ReadCell(oReader, 0, EHanType::HWPML); + END_WHILE + } + } + END_WHILE +} + +void CTblCell::ReadCellMargin(CXMLReader &oReader, EHanType eType) +{ + START_READ_ATTRIBUTES(oReader) + { + if (GetAttributeName(EAttribute::Left, eType) == sAttributeName) + m_arMargin[0] = oReader.GetInt(); + else if (GetAttributeName(EAttribute::Right, eType) == sAttributeName) + m_arMargin[1] = oReader.GetInt(); + else if (GetAttributeName(EAttribute::Top, eType) == sAttributeName) + m_arMargin[2] = oReader.GetInt(); + else if (GetAttributeName(EAttribute::Bottom, eType) == sAttributeName) + m_arMargin[3] = oReader.GetInt(); + } + END_READ_ATTRIBUTES(oReader) +} + +void HWP::CTblCell::ReadCell(CXMLReader &oReader, int nVersion, EHanType eType) +{ + CCellParagraph *pCellParagraphs = new CCellParagraph(oReader, nVersion, eType); + + if (nullptr == pCellParagraphs) + return; + + if (ECtrlObjectType::Character != pCellParagraphs->GetCtrls().back()->GetCtrlType()) + pCellParagraphs->AddCtrl(new CCtrlCharacter(L" _", ECtrlCharType::PARAGRAPH_BREAK)); + + m_arParas.push_back(pCellParagraphs); +} + void CTblCell::SetVertAlign(EVertAlign eVertAlign) { m_eVertAlign = eVertAlign; diff --git a/HwpFile/HwpDoc/Paragraph/TblCell.h b/HwpFile/HwpDoc/Paragraph/TblCell.h index f5cf3e9777..dfc3d15a1c 100644 --- a/HwpFile/HwpDoc/Paragraph/TblCell.h +++ b/HwpFile/HwpDoc/Paragraph/TblCell.h @@ -22,9 +22,14 @@ class CTblCell EVertAlign m_eVertAlign; HWP_STRING m_sMergedColName; + + void ReadFromHWPX(CXMLReader& oReader, int nVersion); + void ReadFromHWPML(CXMLReader& oReader); + void ReadCellMargin(CXMLReader& oReader, EHanType eType); + void ReadCell(CXMLReader& oReader, int nVersion, EHanType eType); public: CTblCell(int nSize, CHWPStream& oBuffer, int nOff, int nVersion); - CTblCell(CXMLReader& oReader, int nVersion); + CTblCell(CXMLReader& oReader, int nVersion, EHanType eType); void SetVertAlign(EVertAlign eVertAlign);