2425 lines
67 KiB
C++
2425 lines
67 KiB
C++
/*
|
|
* (c) Copyright Ascensio System SIA 2010-2023
|
|
*
|
|
* This program is a free software product. You can redistribute it and/or
|
|
* modify it under the terms of the GNU Affero General Public License (AGPL)
|
|
* version 3 as published by the Free Software Foundation. In accordance with
|
|
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
|
|
* that Ascensio System SIA expressly excludes the warranty of non-infringement
|
|
* of any third-party rights.
|
|
*
|
|
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
|
|
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
|
|
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
|
|
*
|
|
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
|
|
* street, Riga, Latvia, EU, LV-1050.
|
|
*
|
|
* The interactive user interfaces in modified source and object code versions
|
|
* of the Program must display Appropriate Legal Notices, as required under
|
|
* Section 5 of the GNU AGPL version 3.
|
|
*
|
|
* Pursuant to Section 7(b) of the License you must retain the original Product
|
|
* logo when distributing the program. Pursuant to Section 7(e) we decline to
|
|
* grant you any rights under trademark law for use of our trademarks.
|
|
*
|
|
* All the Product's GUI elements, including illustrations and icon sets, as
|
|
* well as technical writing content are licensed under the terms of the
|
|
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
|
|
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
|
|
*
|
|
*/
|
|
#include "Vsdx.h"
|
|
#include "VisioDocument.h"
|
|
#include "VisioPages.h"
|
|
#include "VisioConnections.h"
|
|
#include "VisioOthers.h"
|
|
#include "Shapes.h"
|
|
#include "../PPTXFormat/Theme.h"
|
|
#include "../../DesktopEditor/common/SystemUtils.h"
|
|
#include "../Binary/Presentation/BinaryFileReaderWriter.h"
|
|
#include "../Binary/Presentation/XmlWriter.h"
|
|
|
|
namespace OOX
|
|
{
|
|
namespace Draw
|
|
{
|
|
EElementType CPublishedPage::getType() const
|
|
{
|
|
return et_dr_PublishedPage;
|
|
}
|
|
void CPublishedPage::ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
|
|
{
|
|
WritingElement_ReadAttributes_StartChar_No_NS(oReader)
|
|
WritingElement_ReadAttributes_Read_ifChar(oReader, "ID", ID)
|
|
WritingElement_ReadAttributes_EndChar_No_NS(oReader)
|
|
}
|
|
void CPublishedPage::fromXML(XmlUtils::CXmlLiteReader& oReader)
|
|
{
|
|
ReadAttributes(oReader);
|
|
if (!oReader.IsEmptyNode())
|
|
oReader.ReadTillEnd();
|
|
}
|
|
void CPublishedPage::toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const
|
|
{
|
|
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeStart);
|
|
pWriter->WriteUInt2(0, ID);
|
|
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeEnd);
|
|
}
|
|
void CPublishedPage::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader)
|
|
{
|
|
LONG _end_rec = pReader->GetPos() + pReader->GetRecordSize() + 4;
|
|
pReader->Skip(1); // start attributes
|
|
while (true)
|
|
{
|
|
BYTE _at = pReader->GetUChar_TypeNode();
|
|
if (_at == NSBinPptxRW::g_nodeAttributeEnd)
|
|
break;
|
|
switch (_at)
|
|
{
|
|
case 0:
|
|
{
|
|
ID = pReader->GetULong();
|
|
}break;
|
|
}
|
|
}
|
|
pReader->Seek(_end_rec);
|
|
}
|
|
void CPublishedPage::toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const
|
|
{
|
|
pWriter->StartNode(L"PublishedPage");
|
|
pWriter->StartAttributes();
|
|
pWriter->WriteAttribute2(L"ID", ID);
|
|
pWriter->EndAttributes();
|
|
pWriter->WriteNodeEnd(L"PublishedPage");
|
|
}
|
|
EElementType CRefreshableData::getType() const
|
|
{
|
|
return et_dr_RefreshableData;
|
|
}
|
|
void CRefreshableData::ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
|
|
{
|
|
WritingElement_ReadAttributes_StartChar_No_NS(oReader)
|
|
WritingElement_ReadAttributes_Read_ifChar(oReader, "ID", ID)
|
|
WritingElement_ReadAttributes_EndChar_No_NS(oReader)
|
|
}
|
|
void CRefreshableData::fromXML(XmlUtils::CXmlLiteReader& oReader)
|
|
{
|
|
ReadAttributes(oReader);
|
|
if (!oReader.IsEmptyNode())
|
|
oReader.ReadTillEnd();
|
|
}
|
|
void CRefreshableData::toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const
|
|
{
|
|
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeStart);
|
|
pWriter->WriteUInt2(0, ID);
|
|
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeEnd);
|
|
}
|
|
void CRefreshableData::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader)
|
|
{
|
|
LONG _end_rec = pReader->GetPos() + pReader->GetRecordSize() + 4;
|
|
pReader->Skip(1); // start attributes
|
|
while (true)
|
|
{
|
|
BYTE _at = pReader->GetUChar_TypeNode();
|
|
if (_at == NSBinPptxRW::g_nodeAttributeEnd)
|
|
break;
|
|
switch (_at)
|
|
{
|
|
case 0:
|
|
{
|
|
ID = pReader->GetULong();
|
|
}break;
|
|
}
|
|
}
|
|
pReader->Seek(_end_rec);
|
|
}
|
|
void CRefreshableData::toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const
|
|
{
|
|
pWriter->StartNode(L"RefreshableData");
|
|
pWriter->StartAttributes();
|
|
pWriter->WriteAttribute2(L"ID", ID);
|
|
pWriter->EndAttributes();
|
|
pWriter->WriteNodeEnd(L"RefreshableData");
|
|
}
|
|
EElementType CPublishSettings::getType() const
|
|
{
|
|
return et_dr_PublishSettings;
|
|
}
|
|
void CPublishSettings::fromXML(XmlUtils::CXmlLiteReader& oReader)
|
|
{
|
|
if (oReader.IsEmptyNode())
|
|
return;
|
|
|
|
int nParentDepth = oReader.GetDepth();
|
|
while (oReader.ReadNextSiblingNode(nParentDepth))
|
|
{
|
|
std::wstring sName = oReader.GetName();
|
|
|
|
WritingElement* pItem = NULL;
|
|
if (L"PublishedPage" == sName)
|
|
{
|
|
pItem = new CPublishedPage();
|
|
}
|
|
else if (L"RefreshableData" == sName)
|
|
{
|
|
pItem = new CRefreshableData();
|
|
}
|
|
if (pItem)
|
|
{
|
|
pItem->fromXML(oReader);
|
|
m_arrItems.push_back(pItem);
|
|
}
|
|
}
|
|
}
|
|
void CPublishSettings::toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const
|
|
{
|
|
for (size_t i = 0; i < m_arrItems.size(); ++i)
|
|
{
|
|
int type = 0xff; //todooo predefine type for ???
|
|
switch (m_arrItems[i]->getType())
|
|
{
|
|
case et_dr_PublishedPage: type = 0; break;
|
|
case et_dr_RefreshableData: type = 1; break;
|
|
}
|
|
if (type != 0xff)
|
|
pWriter->WriteRecord2(type, dynamic_cast<OOX::WritingElement*>(m_arrItems[i]));
|
|
}
|
|
}
|
|
void CPublishSettings::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader)
|
|
{
|
|
LONG _end_rec = pReader->GetPos() + pReader->GetRecordSize() + 4;
|
|
while (pReader->GetPos() < _end_rec)
|
|
{
|
|
BYTE _rec = pReader->GetUChar();
|
|
switch (_rec)
|
|
{
|
|
case 0:
|
|
{
|
|
m_arrItems.push_back(new CPublishedPage());
|
|
m_arrItems.back()->fromPPTY(pReader);
|
|
}break;
|
|
case 1:
|
|
{
|
|
m_arrItems.push_back(new CRefreshableData());
|
|
m_arrItems.back()->fromPPTY(pReader);
|
|
}break;
|
|
default:
|
|
{
|
|
pReader->SkipRecord();
|
|
}break;
|
|
}
|
|
}
|
|
pReader->Seek(_end_rec);
|
|
}
|
|
void CPublishSettings::toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const
|
|
{
|
|
pWriter->StartNode(L"PublishSettings");
|
|
pWriter->EndAttributes();
|
|
|
|
for (size_t i = 0; i < m_arrItems.size(); ++i)
|
|
m_arrItems[i]->toXmlWriter(pWriter);
|
|
|
|
pWriter->WriteNodeEnd(L"PublishSettings");
|
|
}
|
|
//----------------------------------------------------------------------------------------------------------------
|
|
EElementType CHeaderFooter::getType() const
|
|
{
|
|
return et_dr_HeaderFooter;
|
|
}
|
|
void CHeaderFooter::ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
|
|
{
|
|
WritingElement_ReadAttributes_StartChar_No_NS(oReader)
|
|
WritingElement_ReadAttributes_Read_ifChar(oReader, "HeaderMargin", HeaderMargin)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "FooterMargin", FooterMargin)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "HeaderLeft", HeaderLeft)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "HeaderCenter", HeaderCenter)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "HeaderRight", HeaderRight)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "FooterLeft", FooterLeft)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "FooterCenter", FooterCenter)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "FooterRight", FooterRight)
|
|
WritingElement_ReadAttributes_EndChar_No_NS(oReader)
|
|
}
|
|
void CHeaderFooter::fromXML(XmlUtils::CXmlLiteReader& oReader)
|
|
{
|
|
ReadAttributes(oReader);
|
|
if (!oReader.IsEmptyNode())
|
|
oReader.ReadTillEnd();
|
|
}
|
|
void CHeaderFooter::toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const
|
|
{
|
|
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeStart);
|
|
pWriter->WriteString2(0, HeaderMargin);
|
|
pWriter->WriteString2(1, FooterMargin);
|
|
pWriter->WriteString2(2, HeaderLeft);
|
|
pWriter->WriteString2(3, HeaderCenter);
|
|
pWriter->WriteString2(4, HeaderRight);
|
|
pWriter->WriteString2(5, FooterLeft);
|
|
pWriter->WriteString2(6, FooterCenter);
|
|
pWriter->WriteString2(7, FooterRight);
|
|
pWriter->WriteString2(8, HeaderFooterColor);
|
|
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeEnd);
|
|
}
|
|
void CHeaderFooter::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader)
|
|
{
|
|
LONG _end_rec = pReader->GetPos() + pReader->GetRecordSize() + 4;
|
|
pReader->Skip(1); // start attributes
|
|
while (true)
|
|
{
|
|
BYTE _at = pReader->GetUChar_TypeNode();
|
|
if (_at == NSBinPptxRW::g_nodeAttributeEnd)
|
|
break;
|
|
switch (_at)
|
|
{
|
|
case 0:
|
|
{
|
|
HeaderMargin = pReader->GetString2();
|
|
}break;
|
|
case 1:
|
|
{
|
|
FooterMargin = pReader->GetString2();
|
|
}break;
|
|
case 2:
|
|
{
|
|
HeaderLeft = pReader->GetString2();
|
|
}break;
|
|
case 3:
|
|
{
|
|
HeaderCenter = pReader->GetString2();
|
|
}break;
|
|
case 4:
|
|
{
|
|
HeaderRight = pReader->GetString2();
|
|
}break;
|
|
case 5:
|
|
{
|
|
FooterLeft = pReader->GetString2();
|
|
}break;
|
|
case 6:
|
|
{
|
|
FooterCenter = pReader->GetString2();
|
|
}break;
|
|
case 7:
|
|
{
|
|
FooterRight = pReader->GetString2();
|
|
}break;
|
|
case 8:
|
|
{
|
|
HeaderFooterColor = pReader->GetString2();
|
|
}break;
|
|
}
|
|
}
|
|
pReader->Seek(_end_rec);
|
|
}
|
|
void CHeaderFooter::toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const
|
|
{
|
|
pWriter->StartNode(L"HeaderFooter");
|
|
pWriter->StartAttributes();
|
|
pWriter->WriteAttribute2(L"HeaderMargin", HeaderMargin);
|
|
pWriter->WriteAttribute2(L"FooterMargin", FooterMargin);
|
|
pWriter->WriteAttribute2(L"HeaderLeft", HeaderLeft);
|
|
pWriter->WriteAttribute2(L"HeaderCenter", HeaderCenter);
|
|
pWriter->WriteAttribute2(L"HeaderRight", HeaderRight);
|
|
pWriter->WriteAttribute2(L"FooterLeft", FooterLeft);
|
|
pWriter->WriteAttribute2(L"FooterCenter", FooterCenter);
|
|
pWriter->WriteAttribute2(L"FooterRight", FooterRight);
|
|
pWriter->WriteAttribute2(L"HeaderFooterColor", HeaderFooterColor);
|
|
pWriter->EndAttributes();
|
|
// todooo color, font
|
|
pWriter->WriteNodeEnd(L"HeaderFooter");
|
|
}
|
|
EElementType CDocumentSheet::getType() const
|
|
{
|
|
return et_dr_DocumentSheet;
|
|
}
|
|
void CDocumentSheet::ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
|
|
{
|
|
WritingElement_ReadAttributes_StartChar_No_NS(oReader)
|
|
WritingElement_ReadAttributes_Read_ifChar(oReader, "UniqueID", UniqueID)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "NameU", NameU)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "Name", Name)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "IsCustomName", IsCustomName)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "IsCustomNameU", IsCustomNameU)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "LineStyle", LineStyle)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "FillStyle", FillStyle)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "TextStyle", TextStyle)
|
|
WritingElement_ReadAttributes_EndChar_No_NS(oReader)
|
|
}
|
|
void CDocumentSheet::fromXML(XmlUtils::CXmlLiteReader& oReader)
|
|
{
|
|
ReadAttributes(oReader);
|
|
if (oReader.IsEmptyNode())
|
|
return;
|
|
|
|
int nParentDepth = oReader.GetDepth();
|
|
while (oReader.ReadNextSiblingNode(nParentDepth))
|
|
{
|
|
std::wstring sName = oReader.GetName();
|
|
|
|
WritingElement* pItem = NULL;
|
|
if (L"Cell" == sName)
|
|
{
|
|
pItem = new CCell();
|
|
}
|
|
else if (L"Trigger" == sName)
|
|
{
|
|
pItem = new CTrigger();
|
|
}
|
|
else if (L"Section" == sName)
|
|
{
|
|
pItem = new CSection();
|
|
}
|
|
if (pItem)
|
|
{
|
|
pItem->fromXML(oReader);
|
|
m_arrItems.push_back(pItem);
|
|
}
|
|
}
|
|
}
|
|
void CDocumentSheet::toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const
|
|
{
|
|
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeStart);
|
|
pWriter->WriteString2(0, UniqueID);
|
|
pWriter->WriteString2(1, NameU);
|
|
pWriter->WriteString2(2, Name);
|
|
pWriter->WriteBool2(3, IsCustomName);
|
|
pWriter->WriteBool2(4, IsCustomNameU);
|
|
pWriter->WriteUInt2(5, LineStyle);
|
|
pWriter->WriteUInt2(6, FillStyle);
|
|
pWriter->WriteUInt2(7, TextStyle);
|
|
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeEnd);
|
|
|
|
for (size_t i = 0; i < m_arrItems.size(); ++i)
|
|
{
|
|
int type = 0xff; //todooo predefine type for ???
|
|
switch (m_arrItems[i]->getType())
|
|
{
|
|
case et_dr_Cell: type = 0; break;
|
|
case et_dr_Trigger: type = 1; break;
|
|
case et_dr_Section: type = 2; break;
|
|
}
|
|
if (type != 0xff)
|
|
pWriter->WriteRecord2(type, dynamic_cast<OOX::WritingElement*>(m_arrItems[i]));
|
|
}
|
|
}
|
|
void CDocumentSheet::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader)
|
|
{
|
|
LONG _end_rec = pReader->GetPos() + pReader->GetRecordSize() + 4;
|
|
pReader->Skip(1); // start attributes
|
|
while (true)
|
|
{
|
|
BYTE _at = pReader->GetUChar_TypeNode();
|
|
if (_at == NSBinPptxRW::g_nodeAttributeEnd)
|
|
break;
|
|
switch (_at)
|
|
{
|
|
case 0:
|
|
{
|
|
UniqueID = pReader->GetString2();
|
|
}break;
|
|
case 1:
|
|
{
|
|
NameU = pReader->GetString2();
|
|
}break;
|
|
case 2:
|
|
{
|
|
Name = pReader->GetString2();
|
|
}break;
|
|
case 3:
|
|
{
|
|
IsCustomName = pReader->GetBool();
|
|
}break;
|
|
case 4:
|
|
{
|
|
IsCustomNameU = pReader->GetBool();
|
|
}break;
|
|
case 5:
|
|
{
|
|
LineStyle = pReader->GetULong();
|
|
}break;
|
|
case 6:
|
|
{
|
|
FillStyle = pReader->GetULong();
|
|
}break;
|
|
case 7:
|
|
{
|
|
TextStyle = pReader->GetULong();
|
|
}break;
|
|
}
|
|
}
|
|
while (pReader->GetPos() < _end_rec)
|
|
{
|
|
BYTE _rec = pReader->GetUChar();
|
|
switch (_rec)
|
|
{
|
|
case 0:
|
|
{
|
|
m_arrItems.push_back(new CCell());
|
|
m_arrItems.back()->fromPPTY(pReader);
|
|
}break;
|
|
case 1:
|
|
{
|
|
m_arrItems.push_back(new CTrigger());
|
|
m_arrItems.back()->fromPPTY(pReader);
|
|
}break;
|
|
case 2:
|
|
{
|
|
m_arrItems.push_back(new CSection());
|
|
m_arrItems.back()->fromPPTY(pReader);
|
|
}break;
|
|
default:
|
|
{
|
|
pReader->SkipRecord();
|
|
}break;
|
|
}
|
|
}
|
|
pReader->Seek(_end_rec);
|
|
}
|
|
void CDocumentSheet::toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const
|
|
{
|
|
pWriter->StartNode(L"DocumentSheet");
|
|
pWriter->StartAttributes();
|
|
pWriter->WriteAttribute2(L"NameU", NameU);
|
|
pWriter->WriteAttribute2(L"Name", Name);
|
|
pWriter->WriteAttribute(L"IsCustomName", IsCustomName);
|
|
pWriter->WriteAttribute(L"IsCustomNameU", IsCustomNameU);
|
|
pWriter->WriteAttribute2(L"UniqueID", UniqueID);
|
|
pWriter->WriteAttribute2(L"LineStyle", LineStyle);
|
|
pWriter->WriteAttribute2(L"FillStyle", FillStyle);
|
|
pWriter->WriteAttribute2(L"TextStyle", TextStyle);
|
|
pWriter->EndAttributes();
|
|
|
|
for (size_t i = 0; i < m_arrItems.size(); ++i)
|
|
m_arrItems[i]->toXmlWriter(pWriter);
|
|
|
|
pWriter->WriteNodeEnd(L"DocumentSheet");
|
|
}
|
|
EElementType CEventItem::getType() const
|
|
{
|
|
return et_dr_EventItem;
|
|
}
|
|
void CEventItem::ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
|
|
{
|
|
WritingElement_ReadAttributes_StartChar_No_NS(oReader)
|
|
WritingElement_ReadAttributes_Read_ifChar(oReader, "ID", ID)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "Action", Action)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "EventCode", EventCode)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "Enabled", Enabled)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "Target", Target)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "TargetArgs", TargetArgs)
|
|
WritingElement_ReadAttributes_EndChar_No_NS(oReader)
|
|
}
|
|
void CEventItem::fromXML(XmlUtils::CXmlLiteReader& oReader)
|
|
{
|
|
ReadAttributes(oReader);
|
|
if (!oReader.IsEmptyNode())
|
|
oReader.ReadTillEnd();
|
|
}
|
|
void CEventItem::toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const
|
|
{
|
|
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeStart);
|
|
pWriter->WriteUInt2(0, ID);
|
|
pWriter->WriteUInt2(1, Action);
|
|
pWriter->WriteUInt2(2, EventCode);
|
|
pWriter->WriteBool2(3, Enabled);
|
|
pWriter->WriteString2(4, Target);
|
|
pWriter->WriteString2(5, TargetArgs);
|
|
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeEnd);
|
|
}
|
|
void CEventItem::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader)
|
|
{
|
|
LONG _end_rec = pReader->GetPos() + pReader->GetRecordSize() + 4;
|
|
pReader->Skip(1); // start attributes
|
|
while (true)
|
|
{
|
|
BYTE _at = pReader->GetUChar_TypeNode();
|
|
if (_at == NSBinPptxRW::g_nodeAttributeEnd)
|
|
break;
|
|
switch (_at)
|
|
{
|
|
case 0:
|
|
{
|
|
ID = pReader->GetULong();
|
|
}break;
|
|
case 1:
|
|
{
|
|
Action = pReader->GetULong();
|
|
}break;
|
|
case 2:
|
|
{
|
|
EventCode = pReader->GetULong();
|
|
}break;
|
|
case 3:
|
|
{
|
|
Enabled = pReader->GetBool();
|
|
}break;
|
|
case 4:
|
|
{
|
|
Target = pReader->GetString2();
|
|
}break;
|
|
case 5:
|
|
{
|
|
TargetArgs = pReader->GetString2();
|
|
}break;
|
|
}
|
|
}
|
|
pReader->Seek(_end_rec);
|
|
}
|
|
void CEventItem::toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const
|
|
{
|
|
pWriter->StartNode(L"EventItem");
|
|
pWriter->StartAttributes();
|
|
pWriter->WriteAttribute2(L"ID", ID);
|
|
pWriter->WriteAttribute2(L"Action", Action);
|
|
pWriter->WriteAttribute2(L"EventCode", EventCode);
|
|
pWriter->WriteAttribute(L"Enabled", Enabled);
|
|
pWriter->WriteAttribute2(L"Target", Target);
|
|
pWriter->WriteAttribute2(L"TargetArgs", TargetArgs);
|
|
pWriter->EndAttributes();
|
|
pWriter->WriteNodeEnd(L"EventItem");
|
|
}
|
|
void CEventList::fromXML(XmlUtils::CXmlLiteReader& oReader)
|
|
{
|
|
if (oReader.IsEmptyNode())
|
|
return;
|
|
int nParentDepth = oReader.GetDepth();
|
|
while (oReader.ReadNextSiblingNode(nParentDepth))
|
|
{
|
|
std::wstring sName = oReader.GetName();
|
|
|
|
if (L"EventItem" == sName)
|
|
{
|
|
CEventItem* pItem = new CEventItem();
|
|
*pItem = oReader;
|
|
|
|
if (pItem)
|
|
m_arrItems.push_back(pItem);
|
|
}
|
|
}
|
|
}
|
|
EElementType CEventList::getType() const
|
|
{
|
|
return et_dr_EventList;
|
|
}
|
|
void CEventList::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader)
|
|
{
|
|
LONG end = pReader->GetPos() + pReader->GetRecordSize() + 4;
|
|
while (pReader->GetPos() < end)
|
|
{
|
|
BYTE _rec = pReader->GetUChar();
|
|
switch (_rec)
|
|
{
|
|
case 0:
|
|
{
|
|
m_arrItems.push_back(new CEventItem());
|
|
m_arrItems.back()->fromPPTY(pReader);
|
|
}break;
|
|
default:
|
|
{
|
|
pReader->SkipRecord();
|
|
}break;
|
|
}
|
|
}
|
|
pReader->Seek(end);
|
|
}
|
|
void CEventList::toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const
|
|
{
|
|
for (size_t i = 0; i < m_arrItems.size(); ++i)
|
|
pWriter->WriteRecord2(0, dynamic_cast<OOX::WritingElement*>(m_arrItems[i]));
|
|
}
|
|
void CEventList::toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const
|
|
{
|
|
pWriter->StartNode(L"EventList");
|
|
pWriter->EndAttributes();
|
|
|
|
for (size_t i = 0; i < m_arrItems.size(); ++i)
|
|
m_arrItems[i]->toXmlWriter(pWriter);
|
|
|
|
pWriter->WriteNodeEnd(L"EventList");
|
|
}
|
|
EElementType CStyleSheet::getType() const
|
|
{
|
|
return et_dr_StyleSheet;
|
|
}
|
|
void CStyleSheet::ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
|
|
{
|
|
WritingElement_ReadAttributes_StartChar_No_NS(oReader)
|
|
WritingElement_ReadAttributes_Read_ifChar(oReader, "ID", ID)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "NameU", NameU)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "Name", Name)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "IsCustomName", IsCustomName)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "IsCustomNameU", IsCustomNameU)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "LineStyle", LineStyle)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "FillStyle", FillStyle)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "TextStyle", TextStyle)
|
|
WritingElement_ReadAttributes_EndChar_No_NS(oReader)
|
|
}
|
|
void CStyleSheet::fromXML(XmlUtils::CXmlLiteReader& oReader)
|
|
{
|
|
ReadAttributes(oReader);
|
|
if (oReader.IsEmptyNode())
|
|
return;
|
|
|
|
int nParentDepth = oReader.GetDepth();
|
|
while (oReader.ReadNextSiblingNode(nParentDepth))
|
|
{
|
|
std::wstring sName = oReader.GetName();
|
|
|
|
WritingElement* pItem = NULL;
|
|
if (L"Cell" == sName)
|
|
{
|
|
pItem = new CCell();
|
|
}
|
|
else if (L"Trigger" == sName)
|
|
{
|
|
pItem = new CTrigger();
|
|
}
|
|
else if (L"Section" == sName)
|
|
{
|
|
pItem = new CSection();
|
|
}
|
|
if (pItem)
|
|
{
|
|
pItem->fromXML(oReader);
|
|
m_arrItems.push_back(pItem);
|
|
}
|
|
}
|
|
}
|
|
void CStyleSheet::toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const
|
|
{
|
|
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeStart);
|
|
pWriter->WriteUInt2(0, ID);
|
|
pWriter->WriteString2(1, NameU);
|
|
pWriter->WriteString2(2, Name);
|
|
pWriter->WriteBool2(3, IsCustomName);
|
|
pWriter->WriteBool2(4, IsCustomNameU);
|
|
pWriter->WriteUInt2(5, LineStyle);
|
|
pWriter->WriteUInt2(6, FillStyle);
|
|
pWriter->WriteUInt2(7, TextStyle);
|
|
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeEnd);
|
|
|
|
for (size_t i = 0; i < m_arrItems.size(); ++i)
|
|
{
|
|
int type = 0xff; //todooo predefine type for ???
|
|
switch (m_arrItems[i]->getType())
|
|
{
|
|
case et_dr_Cell: type = 0; break;
|
|
case et_dr_Trigger: type = 1; break;
|
|
case et_dr_Section: type = 2; break;
|
|
}
|
|
if (type != 0xff)
|
|
pWriter->WriteRecord2(type, dynamic_cast<OOX::WritingElement*>(m_arrItems[i]));
|
|
}
|
|
}
|
|
void CStyleSheet::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader)
|
|
{
|
|
LONG _end_rec = pReader->GetPos() + pReader->GetRecordSize() + 4;
|
|
pReader->Skip(1); // start attributes
|
|
while (true)
|
|
{
|
|
BYTE _at = pReader->GetUChar_TypeNode();
|
|
if (_at == NSBinPptxRW::g_nodeAttributeEnd)
|
|
break;
|
|
switch (_at)
|
|
{
|
|
case 0:
|
|
{
|
|
ID = pReader->GetULong();
|
|
}break;
|
|
case 1:
|
|
{
|
|
NameU = pReader->GetString2();
|
|
}break;
|
|
case 2:
|
|
{
|
|
Name = pReader->GetString2();
|
|
}break;
|
|
case 3:
|
|
{
|
|
IsCustomName = pReader->GetBool();
|
|
}break;
|
|
case 4:
|
|
{
|
|
IsCustomNameU = pReader->GetBool();
|
|
}break;
|
|
case 5:
|
|
{
|
|
LineStyle = pReader->GetULong();
|
|
}break;
|
|
case 6:
|
|
{
|
|
FillStyle = pReader->GetULong();
|
|
}break;
|
|
case 7:
|
|
{
|
|
TextStyle = pReader->GetULong();
|
|
}break;
|
|
}
|
|
}
|
|
while (pReader->GetPos() < _end_rec)
|
|
{
|
|
BYTE _rec = pReader->GetUChar();
|
|
switch (_rec)
|
|
{
|
|
case 0:
|
|
{
|
|
m_arrItems.push_back(new CCell());
|
|
m_arrItems.back()->fromPPTY(pReader);
|
|
}break;
|
|
case 1:
|
|
{
|
|
m_arrItems.push_back(new CTrigger());
|
|
m_arrItems.back()->fromPPTY(pReader);
|
|
}break;
|
|
case 2:
|
|
{
|
|
m_arrItems.push_back(new CSection());
|
|
m_arrItems.back()->fromPPTY(pReader);
|
|
}break;
|
|
default:
|
|
{
|
|
pReader->SkipRecord();
|
|
}break;
|
|
}
|
|
}
|
|
pReader->Seek(_end_rec);
|
|
}
|
|
void CStyleSheet::toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const
|
|
{
|
|
pWriter->StartNode(L"StyleSheet");
|
|
pWriter->StartAttributes();
|
|
pWriter->WriteAttribute2(L"ID", ID);
|
|
pWriter->WriteAttribute2(L"NameU", NameU);
|
|
pWriter->WriteAttribute2(L"Name", Name);
|
|
pWriter->WriteAttribute(L"IsCustomName", IsCustomName);
|
|
pWriter->WriteAttribute(L"IsCustomNameU", IsCustomNameU);
|
|
pWriter->WriteAttribute2(L"LineStyle", LineStyle);
|
|
pWriter->WriteAttribute2(L"FillStyle", FillStyle);
|
|
pWriter->WriteAttribute2(L"TextStyle", TextStyle);
|
|
pWriter->EndAttributes();
|
|
|
|
for (size_t i = 0; i < m_arrItems.size(); ++i)
|
|
m_arrItems[i]->toXmlWriter(pWriter);
|
|
|
|
pWriter->WriteNodeEnd(L"StyleSheet");
|
|
}
|
|
void CStyleSheets::fromXML(XmlUtils::CXmlLiteReader& oReader)
|
|
{
|
|
if (oReader.IsEmptyNode())
|
|
return;
|
|
int nParentDepth = oReader.GetDepth();
|
|
while (oReader.ReadNextSiblingNode(nParentDepth))
|
|
{
|
|
std::wstring sName = oReader.GetName();
|
|
|
|
if (L"StyleSheet" == sName)
|
|
{
|
|
CStyleSheet* pItem = new CStyleSheet();
|
|
*pItem = oReader;
|
|
|
|
if (pItem)
|
|
m_arrItems.push_back(pItem);
|
|
}
|
|
}
|
|
}
|
|
EElementType CStyleSheets::getType() const
|
|
{
|
|
return et_dr_StyleSheets;
|
|
}
|
|
void CStyleSheets::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader)
|
|
{
|
|
LONG end = pReader->GetPos() + pReader->GetRecordSize() + 4;
|
|
while (pReader->GetPos() < end)
|
|
{
|
|
BYTE _rec = pReader->GetUChar();
|
|
switch (_rec)
|
|
{
|
|
case 0:
|
|
{
|
|
m_arrItems.push_back(new CStyleSheet());
|
|
m_arrItems.back()->fromPPTY(pReader);
|
|
}break;
|
|
default:
|
|
{
|
|
pReader->SkipRecord();
|
|
}break;
|
|
}
|
|
}
|
|
pReader->Seek(end);
|
|
}
|
|
void CStyleSheets::toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const
|
|
{
|
|
for (size_t i = 0; i < m_arrItems.size(); ++i)
|
|
pWriter->WriteRecord2(0, dynamic_cast<OOX::WritingElement*>(m_arrItems[i]));
|
|
}
|
|
void CStyleSheets::toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const
|
|
{
|
|
pWriter->StartNode(L"StyleSheets");
|
|
pWriter->EndAttributes();
|
|
|
|
for (size_t i = 0; i < m_arrItems.size(); ++i)
|
|
m_arrItems[i]->toXmlWriter(pWriter);
|
|
|
|
pWriter->WriteNodeEnd(L"StyleSheets");
|
|
}
|
|
EElementType CColorEntry::getType() const
|
|
{
|
|
return et_dr_ColorEntry;
|
|
}
|
|
void CColorEntry::ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
|
|
{
|
|
WritingElement_ReadAttributes_StartChar_No_NS(oReader)
|
|
WritingElement_ReadAttributes_Read_ifChar(oReader, "IX", IX)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "RGB", RGB)
|
|
WritingElement_ReadAttributes_EndChar_No_NS(oReader)
|
|
}
|
|
void CColorEntry::fromXML(XmlUtils::CXmlLiteReader& oReader)
|
|
{
|
|
ReadAttributes(oReader);
|
|
if (!oReader.IsEmptyNode())
|
|
oReader.ReadTillEnd();
|
|
}
|
|
void CColorEntry::toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const
|
|
{
|
|
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeStart);
|
|
pWriter->WriteUInt2(0, IX);
|
|
pWriter->WriteString2(1, RGB);
|
|
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeEnd);
|
|
}
|
|
void CColorEntry::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader)
|
|
{
|
|
LONG _end_rec = pReader->GetPos() + pReader->GetRecordSize() + 4;
|
|
pReader->Skip(1); // start attributes
|
|
while (true)
|
|
{
|
|
BYTE _at = pReader->GetUChar_TypeNode();
|
|
if (_at == NSBinPptxRW::g_nodeAttributeEnd)
|
|
break;
|
|
switch (_at)
|
|
{
|
|
case 0:
|
|
{
|
|
IX = pReader->GetULong();
|
|
}break;
|
|
case 1:
|
|
{
|
|
RGB = pReader->GetString2();
|
|
}break;
|
|
}
|
|
}
|
|
pReader->Seek(_end_rec);
|
|
}
|
|
void CColorEntry::toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const
|
|
{
|
|
pWriter->StartNode(L"ColorEntry");
|
|
pWriter->StartAttributes();
|
|
pWriter->WriteAttribute2(L"IX", IX);
|
|
pWriter->WriteAttribute2(L"RGB", RGB);
|
|
pWriter->EndAttributes();
|
|
pWriter->WriteNodeEnd(L"ColorEntry");
|
|
}
|
|
void CColors::fromXML(XmlUtils::CXmlLiteReader& oReader)
|
|
{
|
|
if (oReader.IsEmptyNode())
|
|
return;
|
|
int nParentDepth = oReader.GetDepth();
|
|
while (oReader.ReadNextSiblingNode(nParentDepth))
|
|
{
|
|
std::wstring sName = oReader.GetName();
|
|
|
|
if (L"ColorEntry" == sName)
|
|
{
|
|
CColorEntry* pItem = new CColorEntry();
|
|
*pItem = oReader;
|
|
|
|
if (pItem)
|
|
m_arrItems.push_back(pItem);
|
|
}
|
|
}
|
|
}
|
|
EElementType CColors::getType() const
|
|
{
|
|
return et_dr_Colors;
|
|
}
|
|
void CColors::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader)
|
|
{
|
|
LONG end = pReader->GetPos() + pReader->GetRecordSize() + 4;
|
|
while (pReader->GetPos() < end)
|
|
{
|
|
BYTE _rec = pReader->GetUChar();
|
|
switch (_rec)
|
|
{
|
|
case 0:
|
|
{
|
|
m_arrItems.push_back(new CColorEntry());
|
|
m_arrItems.back()->fromPPTY(pReader);
|
|
}break;
|
|
default:
|
|
{
|
|
pReader->SkipRecord();
|
|
}break;
|
|
}
|
|
}
|
|
pReader->Seek(end);
|
|
}
|
|
void CColors::toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const
|
|
{
|
|
for (size_t i = 0; i < m_arrItems.size(); ++i)
|
|
pWriter->WriteRecord2(0, dynamic_cast<OOX::WritingElement*>(m_arrItems[i]));
|
|
}
|
|
void CColors::toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const
|
|
{
|
|
pWriter->StartNode(L"Colors");
|
|
pWriter->EndAttributes();
|
|
|
|
for (size_t i = 0; i < m_arrItems.size(); ++i)
|
|
m_arrItems[i]->toXmlWriter(pWriter);
|
|
|
|
pWriter->WriteNodeEnd(L"Colors");
|
|
}
|
|
EElementType CFaceName::getType() const
|
|
{
|
|
return et_dr_FaceName;
|
|
}
|
|
void CFaceName::ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
|
|
{
|
|
WritingElement_ReadAttributes_StartChar_No_NS(oReader)
|
|
WritingElement_ReadAttributes_Read_ifChar(oReader, "NameU", NameU)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "UnicodeRanges", UnicodeRanges)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "CharSets", CharSets)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "Panos", Panos)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "Panose", Panose)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "Flags", Flags)
|
|
WritingElement_ReadAttributes_EndChar_No_NS(oReader)
|
|
}
|
|
void CFaceName::fromXML(XmlUtils::CXmlLiteReader& oReader)
|
|
{
|
|
ReadAttributes(oReader);
|
|
if (!oReader.IsEmptyNode())
|
|
oReader.ReadTillEnd();
|
|
}
|
|
void CFaceName::toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const
|
|
{
|
|
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeStart);
|
|
pWriter->WriteString2(0, NameU);
|
|
pWriter->WriteString2(1, UnicodeRanges);
|
|
pWriter->WriteString2(2, CharSets);
|
|
pWriter->WriteString2(3, Panos);
|
|
pWriter->WriteString2(4, Panose);
|
|
pWriter->WriteUInt2(5, Flags);
|
|
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeEnd);
|
|
}
|
|
void CFaceName::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader)
|
|
{
|
|
LONG _end_rec = pReader->GetPos() + pReader->GetRecordSize() + 4;
|
|
pReader->Skip(1); // start attributes
|
|
while (true)
|
|
{
|
|
BYTE _at = pReader->GetUChar_TypeNode();
|
|
if (_at == NSBinPptxRW::g_nodeAttributeEnd)
|
|
break;
|
|
switch (_at)
|
|
{
|
|
case 0:
|
|
{
|
|
NameU = pReader->GetString2();
|
|
}break;
|
|
|
|
case 1:
|
|
{
|
|
UnicodeRanges = pReader->GetString2();
|
|
}break;
|
|
case 2:
|
|
{
|
|
CharSets = pReader->GetString2();
|
|
}break;
|
|
case 3:
|
|
{
|
|
Panos = pReader->GetString2();
|
|
}break;
|
|
case 4:
|
|
{
|
|
Panose = pReader->GetString2();
|
|
}break;
|
|
|
|
case 5:
|
|
{
|
|
Flags = pReader->GetULong();
|
|
}break;
|
|
}
|
|
}
|
|
pReader->Seek(_end_rec);
|
|
}
|
|
void CFaceName::toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const
|
|
{
|
|
pWriter->StartNode(L"FaceName");
|
|
pWriter->StartAttributes();
|
|
pWriter->WriteAttribute2(L"NameU", NameU);
|
|
pWriter->WriteAttribute2(L"UnicodeRanges", UnicodeRanges);
|
|
pWriter->WriteAttribute2(L"CharSets", CharSets);
|
|
pWriter->WriteAttribute2(L"Panos", Panos);
|
|
pWriter->WriteAttribute2(L"Panose", Panose);
|
|
pWriter->WriteAttribute2(L"Flags", Flags);
|
|
pWriter->EndAttributes();
|
|
pWriter->WriteNodeEnd(L"FaceName");
|
|
}
|
|
void CFaceNames::fromXML(XmlUtils::CXmlLiteReader& oReader)
|
|
{
|
|
if (oReader.IsEmptyNode())
|
|
return;
|
|
int nParentDepth = oReader.GetDepth();
|
|
while (oReader.ReadNextSiblingNode(nParentDepth))
|
|
{
|
|
std::wstring sName = oReader.GetName();
|
|
|
|
if (L"FaceName" == sName)
|
|
{
|
|
CFaceName* pItem = new CFaceName();
|
|
*pItem = oReader;
|
|
|
|
if (pItem)
|
|
m_arrItems.push_back(pItem);
|
|
}
|
|
}
|
|
}
|
|
EElementType CFaceNames::getType() const
|
|
{
|
|
return et_dr_FaceNames;
|
|
}
|
|
void CFaceNames::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader)
|
|
{
|
|
LONG end = pReader->GetPos() + pReader->GetRecordSize() + 4;
|
|
while (pReader->GetPos() < end)
|
|
{
|
|
BYTE _rec = pReader->GetUChar();
|
|
switch (_rec)
|
|
{
|
|
case 0:
|
|
{
|
|
m_arrItems.push_back(new CFaceName());
|
|
m_arrItems.back()->fromPPTY(pReader);
|
|
}break;
|
|
default:
|
|
{
|
|
pReader->SkipRecord();
|
|
}break;
|
|
}
|
|
}
|
|
pReader->Seek(end);
|
|
}
|
|
void CFaceNames::toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const
|
|
{
|
|
for (size_t i = 0; i < m_arrItems.size(); ++i)
|
|
pWriter->WriteRecord2(0, dynamic_cast<OOX::WritingElement*>(m_arrItems[i]));
|
|
}
|
|
void CFaceNames::toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const
|
|
{
|
|
pWriter->StartNode(L"FaceNames");
|
|
pWriter->EndAttributes();
|
|
|
|
for (size_t i = 0; i < m_arrItems.size(); ++i)
|
|
m_arrItems[i]->toXmlWriter(pWriter);
|
|
|
|
pWriter->WriteNodeEnd(L"FaceNames");
|
|
}
|
|
//-----------------------------------------------------------------------------------------------------------------------------
|
|
EElementType CDocumentSettings::getType() const
|
|
{
|
|
return et_dr_DocumentSettings;
|
|
}
|
|
void CDocumentSettings::ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
|
|
{
|
|
WritingElement_ReadAttributes_StartChar_No_NS(oReader)
|
|
WritingElement_ReadAttributes_Read_ifChar(oReader, "TopPage", TopPage)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "DefaultTextStyle", DefaultTextStyle)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "DefaultLineStyle", DefaultLineStyle)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "DefaultFillStyle", DefaultFillStyle)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "DefaultGuideStyle", DefaultGuideStyle)
|
|
WritingElement_ReadAttributes_EndChar_No_NS( oReader )
|
|
}
|
|
void CDocumentSettings::fromXML(XmlUtils::CXmlLiteReader& oReader)
|
|
{
|
|
ReadAttributes(oReader);
|
|
if (oReader.IsEmptyNode())
|
|
return;
|
|
int nCurDepth = oReader.GetDepth();
|
|
while (oReader.ReadNextSiblingNode(nCurDepth))
|
|
{
|
|
const char* sName = XmlUtils::GetNameNoNS(oReader.GetNameChar());
|
|
if (strcmp("GlueSettings", sName) == 0)
|
|
{
|
|
GlueSettings = oReader.GetText2();
|
|
}
|
|
else if (strcmp("SnapSettings", sName) == 0)
|
|
{
|
|
SnapSettings = oReader.GetText2();
|
|
}
|
|
else if (strcmp("SnapExtensions", sName) == 0)
|
|
{
|
|
SnapExtensions = oReader.GetText2();
|
|
}
|
|
else if (strcmp("SnapAngles", sName) == 0)
|
|
{
|
|
SnapAngles = oReader;
|
|
}
|
|
else if (strcmp("DynamicGridEnabled", sName) == 0)
|
|
{
|
|
DynamicGridEnabled = oReader.GetText2();
|
|
}
|
|
else if (strcmp("ProtectStyles", sName) == 0)
|
|
{
|
|
ProtectStyles = oReader.GetText2();
|
|
}
|
|
else if (strcmp("ProtectShapes", sName) == 0)
|
|
{
|
|
ProtectShapes = oReader.GetText2();
|
|
}
|
|
else if (strcmp("ProtectBkgnds", sName) == 0)
|
|
{
|
|
ProtectBkgnds = oReader.GetText2();
|
|
}
|
|
else if (strcmp("ProtectMasters", sName) == 0)
|
|
{
|
|
ProtectMasters = oReader.GetText2();
|
|
}
|
|
else if (strcmp("CustomMenusFile", sName) == 0)
|
|
{
|
|
CustomMenusFile = oReader.GetText2();
|
|
}
|
|
else if (strcmp("CustomToolbarsFile", sName) == 0)
|
|
{
|
|
CustomToolbarsFile = oReader.GetText2();
|
|
}
|
|
else if (strcmp("AttachedToolbars", sName) == 0)
|
|
{
|
|
AttachedToolbars = oReader.GetText2();
|
|
}
|
|
}
|
|
}
|
|
void CDocumentSettings::toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const
|
|
{
|
|
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeStart);
|
|
pWriter->WriteUInt2(0, TopPage);
|
|
pWriter->WriteUInt2(1, DefaultTextStyle);
|
|
pWriter->WriteUInt2(2, DefaultLineStyle);
|
|
pWriter->WriteUInt2(3, DefaultFillStyle);
|
|
pWriter->WriteUInt2(4, DefaultGuideStyle);
|
|
pWriter->WriteInt2(5, GlueSettings);
|
|
pWriter->WriteInt2(6, SnapSettings);
|
|
pWriter->WriteInt2(7, SnapExtensions);
|
|
pWriter->WriteBool2(9, DynamicGridEnabled);
|
|
pWriter->WriteBool2(10, ProtectStyles);
|
|
pWriter->WriteBool2(11, ProtectShapes);
|
|
pWriter->WriteBool2(12, ProtectBkgnds);
|
|
pWriter->WriteBool2(13, ProtectMasters);
|
|
pWriter->WriteString2(14, CustomMenusFile);
|
|
pWriter->WriteString2(15, CustomToolbarsFile);
|
|
pWriter->WriteString2(16, AttachedToolbars);
|
|
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeEnd);
|
|
|
|
pWriter->WriteRecord2(0, SnapAngles);
|
|
}
|
|
void CDocumentSettings::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader)
|
|
{
|
|
LONG _end_rec = pReader->GetPos() + pReader->GetRecordSize() + 4;
|
|
pReader->Skip(1); // start attributes
|
|
while (true)
|
|
{
|
|
BYTE _at = pReader->GetUChar_TypeNode();
|
|
if (_at == NSBinPptxRW::g_nodeAttributeEnd)
|
|
break;
|
|
switch (_at)
|
|
{
|
|
case 0:
|
|
{
|
|
TopPage = pReader->GetULong();
|
|
}break;
|
|
case 1:
|
|
{
|
|
DefaultTextStyle = pReader->GetULong();
|
|
}break;
|
|
case 2:
|
|
{
|
|
DefaultLineStyle = pReader->GetULong();
|
|
}break;
|
|
case 3:
|
|
{
|
|
DefaultFillStyle = pReader->GetULong();
|
|
}break;
|
|
case 4:
|
|
{
|
|
DefaultGuideStyle = pReader->GetULong();
|
|
}break;
|
|
case 5:
|
|
{
|
|
GlueSettings = pReader->GetLong();
|
|
}break;
|
|
case 6:
|
|
{
|
|
SnapSettings = pReader->GetLong();
|
|
}break;
|
|
case 7:
|
|
{
|
|
SnapExtensions = pReader->GetLong();
|
|
}break;
|
|
case 9:
|
|
{
|
|
DynamicGridEnabled = pReader->GetBool();
|
|
}break;
|
|
case 10:
|
|
{
|
|
ProtectStyles = pReader->GetBool();
|
|
}break;
|
|
case 11:
|
|
{
|
|
ProtectShapes = pReader->GetBool();
|
|
}break;
|
|
case 12:
|
|
{
|
|
ProtectBkgnds = pReader->GetBool();
|
|
}break;
|
|
case 13:
|
|
{
|
|
ProtectMasters = pReader->GetBool();
|
|
}break;
|
|
case 14:
|
|
{
|
|
CustomMenusFile = pReader->GetString2();
|
|
}break;
|
|
case 15:
|
|
{
|
|
CustomToolbarsFile = pReader->GetString2();
|
|
}break;
|
|
case 16:
|
|
{
|
|
AttachedToolbars = pReader->GetString2();
|
|
}break;
|
|
}
|
|
}
|
|
while (pReader->GetPos() < _end_rec)
|
|
{
|
|
BYTE _rec = pReader->GetUChar();
|
|
|
|
switch (_rec)
|
|
{
|
|
case 0:
|
|
{
|
|
SnapAngles.Init();
|
|
SnapAngles->fromPPTY(pReader);
|
|
}break;
|
|
default:
|
|
{
|
|
pReader->SkipRecord();
|
|
}break;
|
|
}
|
|
}
|
|
pReader->Seek(_end_rec);
|
|
}
|
|
void CDocumentSettings::toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const
|
|
{
|
|
pWriter->StartNode(L"DocumentSettings");
|
|
pWriter->StartAttributes();
|
|
pWriter->WriteAttribute2(L"TopPage", TopPage);
|
|
pWriter->WriteAttribute2(L"DefaultTextStyle", DefaultTextStyle);
|
|
pWriter->WriteAttribute2(L"DefaultLineStyle", DefaultLineStyle);
|
|
pWriter->WriteAttribute2(L"DefaultFillStyle", DefaultFillStyle);
|
|
pWriter->WriteAttribute2(L"DefaultGuideStyle", DefaultGuideStyle);
|
|
pWriter->EndAttributes();
|
|
|
|
pWriter->WriteNodeValue(L"GlueSettings", GlueSettings);
|
|
pWriter->WriteNodeValue(L"SnapSettings", SnapSettings);
|
|
pWriter->WriteNodeValue(L"SnapExtensions", SnapExtensions);
|
|
|
|
if (SnapAngles.IsInit())
|
|
SnapAngles->toXmlWriter(pWriter);
|
|
|
|
pWriter->WriteNodeValue(L"DynamicGridEnabled", DynamicGridEnabled);
|
|
pWriter->WriteNodeValue(L"ProtectStyles", ProtectStyles);
|
|
pWriter->WriteNodeValue(L"ProtectShapes", ProtectShapes);
|
|
pWriter->WriteNodeValue(L"ProtectMasters", ProtectMasters);
|
|
pWriter->WriteNodeValue(L"ProtectBkgnds", ProtectBkgnds);
|
|
pWriter->WriteNodeValue(L"CustomMenusFile", CustomMenusFile);
|
|
pWriter->WriteNodeValue(L"CustomToolbarsFile", CustomToolbarsFile);
|
|
pWriter->WriteNodeValue(L"AttachedToolbars", AttachedToolbars);
|
|
|
|
pWriter->WriteNodeEnd(L"DocumentSettings");
|
|
}
|
|
//-----------------------------------------------------------------------------------------------------------------------------
|
|
OOX::Draw::CDocumentFile::CDocumentFile(OOX::Document* pMain) : OOX::IFileContainer(pMain), OOX::File(pMain)
|
|
{
|
|
m_bMacroEnabled = false;
|
|
m_bVisioPages = true;
|
|
}
|
|
OOX::Draw::CDocumentFile::CDocumentFile(OOX::Document* pMain, const CPath& uri) : OOX::IFileContainer(pMain), OOX::File(pMain)
|
|
{
|
|
m_bMacroEnabled = false;
|
|
m_bVisioPages = true;
|
|
|
|
read(uri.GetDirectory(), uri);
|
|
}
|
|
OOX::Draw::CDocumentFile::CDocumentFile(OOX::Document* pMain, const CPath& oRootPath, const CPath& oPath) : OOX::IFileContainer(pMain), OOX::File(pMain)
|
|
{
|
|
m_bMacroEnabled = false;
|
|
m_bVisioPages = true;
|
|
|
|
read(oRootPath, oPath);
|
|
}
|
|
OOX::Draw::CDocumentFile::~CDocumentFile()
|
|
{
|
|
}
|
|
void OOX::Draw::CDocumentFile::read(const CPath& oFilePath)
|
|
{
|
|
CPath oRootPath;
|
|
read(oRootPath, oFilePath);
|
|
}
|
|
void OOX::Draw::CDocumentFile::read(const CPath& oRootPath, const CPath& oFilePath)
|
|
{
|
|
IFileContainer::Read(oRootPath, oFilePath);
|
|
|
|
smart_ptr<OOX::File> pFile = this->Find(OOX::FileTypes::VbaProject);
|
|
if (pFile.IsInit())
|
|
{
|
|
m_bMacroEnabled = true;
|
|
|
|
}
|
|
XmlUtils::CXmlLiteReader oReader;
|
|
|
|
if (!oReader.FromFile(oFilePath.GetPath()))
|
|
return;
|
|
|
|
if (!oReader.ReadNextNode())
|
|
return;
|
|
|
|
m_strFilename = oFilePath.GetPath();
|
|
|
|
std::wstring sName = oReader.GetName();
|
|
if (L"VisioDocument" == sName && !oReader.IsEmptyNode())
|
|
{
|
|
int nDepth = oReader.GetDepth();
|
|
while (oReader.ReadNextSiblingNode(nDepth))
|
|
{
|
|
sName = oReader.GetName();
|
|
|
|
if (L"DocumentSettings" == sName)
|
|
{
|
|
DocumentSettings = oReader;
|
|
}
|
|
else if (L"Colors" == sName)
|
|
{
|
|
Colors = oReader;
|
|
}
|
|
else if (L"FaceNames" == sName)
|
|
{
|
|
FaceNames = oReader;
|
|
}
|
|
else if (L"StyleSheets" == sName)
|
|
{
|
|
StyleSheets = oReader;
|
|
}
|
|
else if (L"DocumentSheet" == sName)
|
|
{
|
|
DocumentSheet = oReader;
|
|
}
|
|
else if (L"EventList" == sName)
|
|
{
|
|
EventList = oReader;
|
|
}
|
|
else if (L"HeaderFooter" == sName)
|
|
{
|
|
HeaderFooter = oReader;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
void OOX::Draw::CDocumentFile::write(const CPath& oFilePath, const CPath& oDirectory, CContentTypes& oContent) const
|
|
{
|
|
NSBinPptxRW::CXmlWriter oXmlWriter;
|
|
oXmlWriter.WriteString((L"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"));
|
|
|
|
oXmlWriter.m_lDocType = XMLWRITER_DOC_TYPE_VSDX;
|
|
toXmlWriter(&oXmlWriter);
|
|
|
|
NSFile::CFileBinary::SaveToFile(oFilePath.GetPath(), oXmlWriter.GetXmlString());
|
|
|
|
oContent.Registration(type().OverrideType(), oDirectory, oFilePath.GetFilename());
|
|
IFileContainer::Write(oFilePath, oDirectory, oContent);
|
|
}
|
|
const OOX::FileType OOX::Draw::CDocumentFile::type() const
|
|
{
|
|
if (m_bMacroEnabled) return OOX::Draw::FileTypes::DocumentMacro;
|
|
else return OOX::Draw::FileTypes::Document;
|
|
}
|
|
const OOX::CPath OOX::Draw::CDocumentFile::DefaultDirectory() const
|
|
{
|
|
return type().DefaultDirectory();
|
|
}
|
|
const OOX::CPath OOX::Draw::CDocumentFile::DefaultFileName() const
|
|
{
|
|
return type().DefaultFileName();
|
|
}
|
|
void OOX::Draw::CDocumentFile::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader)
|
|
{
|
|
pReader->Skip(1); // type
|
|
|
|
smart_ptr<OOX::IFileContainer> rels_old = pReader->GetRels();
|
|
pReader->SetRels(dynamic_cast<OOX::IFileContainer*>((CDocumentFile*)this));
|
|
|
|
LONG end = pReader->GetPos() + pReader->GetRecordSize() + 4;
|
|
|
|
while (pReader->GetPos() < end)
|
|
{
|
|
BYTE _rec = pReader->GetUChar();
|
|
|
|
switch (_rec)
|
|
{
|
|
case 0:
|
|
{
|
|
DocumentSettings.Init();
|
|
DocumentSettings->fromPPTY(pReader);
|
|
}break;
|
|
case 1:
|
|
{
|
|
Colors.Init();
|
|
Colors->fromPPTY(pReader);
|
|
}break;
|
|
case 2:
|
|
{
|
|
FaceNames.Init();
|
|
FaceNames->fromPPTY(pReader);
|
|
}break;
|
|
case 3:
|
|
{
|
|
StyleSheets.Init();
|
|
StyleSheets->fromPPTY(pReader);
|
|
}break;
|
|
case 4:
|
|
{
|
|
DocumentSheet.Init();
|
|
DocumentSheet->fromPPTY(pReader);
|
|
}break;
|
|
case 5:
|
|
{
|
|
EventList.Init();
|
|
EventList->fromPPTY(pReader);
|
|
}break;
|
|
case 6:
|
|
{
|
|
HeaderFooter.Init();
|
|
HeaderFooter->fromPPTY(pReader);
|
|
}break;
|
|
case 7:
|
|
{
|
|
CMastersFile* pMaster = new CMastersFile(((OOX::File*)this)->m_pMainDocument);
|
|
pMaster->fromPPTY(pReader);
|
|
smart_ptr<OOX::File> oFile(pMaster);
|
|
|
|
pReader->GetRels()->Add(oFile);
|
|
}break;
|
|
case 8:
|
|
{
|
|
CPagesFile* pPage = new CPagesFile(((OOX::File*)this)->m_pMainDocument);
|
|
pPage->fromPPTY(pReader);
|
|
smart_ptr<OOX::File> oFile(pPage);
|
|
|
|
pReader->GetRels()->Add(oFile);
|
|
}break;
|
|
case 9:
|
|
{
|
|
CConnectionsFile* pConnections = new CConnectionsFile(((OOX::File*)this)->m_pMainDocument);
|
|
pConnections->fromPPTY(pReader);
|
|
smart_ptr<OOX::File> oFile(pConnections);
|
|
|
|
pReader->GetRels()->Add(oFile);
|
|
}break;
|
|
case 10:
|
|
{
|
|
CRecordsetsFile* pRecordsets = new CRecordsetsFile(((OOX::File*)this)->m_pMainDocument);
|
|
pRecordsets->fromPPTY(pReader);
|
|
smart_ptr<OOX::File> oFile(pRecordsets);
|
|
|
|
pReader->GetRels()->Add(oFile);
|
|
}break;
|
|
case 11:
|
|
{
|
|
CSolutionsFile* pSolutions = new CSolutionsFile(((OOX::File*)this)->m_pMainDocument);
|
|
pSolutions->fromPPTY(pReader);
|
|
smart_ptr<OOX::File> oFile(pSolutions);
|
|
|
|
pReader->GetRels()->Add(oFile);
|
|
}break;
|
|
case 12:
|
|
{
|
|
CValidationFile* pValidation = new CValidationFile(((OOX::File*)this)->m_pMainDocument);
|
|
pValidation->fromPPTY(pReader);
|
|
smart_ptr<OOX::File> oFile(pValidation);
|
|
|
|
pReader->GetRels()->Add(oFile);
|
|
}break;
|
|
case 13:
|
|
{
|
|
CCommentsFile* pComments = new CCommentsFile(((OOX::File*)this)->m_pMainDocument);
|
|
pComments->fromPPTY(pReader);
|
|
smart_ptr<OOX::File> oFile(pComments);
|
|
|
|
pReader->GetRels()->Add(oFile);
|
|
}break;
|
|
case 14:
|
|
{
|
|
CWindowsFile* pWindows = new CWindowsFile(((OOX::File*)this)->m_pMainDocument);
|
|
pWindows->fromPPTY(pReader);
|
|
smart_ptr<OOX::File> oFile(pWindows);
|
|
|
|
pReader->GetRels()->Add(oFile);
|
|
}break;
|
|
case 15:
|
|
{
|
|
pReader->Skip(4); // len
|
|
|
|
PPTX::Theme* pTheme = new PPTX::Theme(((OOX::File*)this)->m_pMainDocument);
|
|
pTheme->fromPPTY(pReader);
|
|
smart_ptr<OOX::File> oFile(pTheme);
|
|
|
|
pReader->GetRels()->Add(oFile);
|
|
}break;
|
|
case 16:
|
|
{
|
|
if (m_bMacroEnabled)
|
|
{
|
|
OOX::VbaProject* pVbaProject = new OOX::VbaProject(((OOX::File*)this)->m_pMainDocument);
|
|
pVbaProject->fromPPTY(pReader);
|
|
smart_ptr<OOX::File> oFile(pVbaProject);
|
|
|
|
pReader->GetRels()->Add(oFile);
|
|
}
|
|
else
|
|
{
|
|
pReader->SkipRecord();
|
|
}
|
|
}break;
|
|
case 17:
|
|
{
|
|
_INT32 _len = pReader->GetRecordSize();
|
|
|
|
BYTE* pData = pReader->GetPointer(_len);
|
|
OOX::CPath oJsaProject = OOX::FileTypes::JsaProject.DefaultFileName();
|
|
std::wstring filePath = pReader->m_strFolder + FILE_SEPARATOR_STR + _T("visio") + FILE_SEPARATOR_STR + oJsaProject.GetPath();
|
|
|
|
NSFile::CFileBinary oBinaryFile;
|
|
oBinaryFile.CreateFileW(filePath);
|
|
oBinaryFile.WriteFile(pData, _len);
|
|
oBinaryFile.CloseFile();
|
|
|
|
smart_ptr<OOX::JsaProject> oFileJsaProject(new OOX::JsaProject(NULL));
|
|
smart_ptr<OOX::File> oFile = oFileJsaProject.smart_dynamic_cast<OOX::File>();
|
|
pReader->GetRels()->Add(oFile);
|
|
|
|
pReader->m_pRels->m_pManager->m_pContentTypes->AddDefault(oJsaProject.GetExtention(false));
|
|
}break;
|
|
default:
|
|
{
|
|
pReader->SkipRecord();
|
|
}break;
|
|
}
|
|
}
|
|
pReader->Seek(end);
|
|
pReader->SetRels(rels_old);
|
|
}
|
|
void OOX::Draw::CDocumentFile::toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const
|
|
{
|
|
pWriter->StartRecord(0);
|
|
|
|
pWriter->WriteRecord2(0, DocumentSettings);
|
|
pWriter->WriteRecord2(1, Colors);
|
|
pWriter->WriteRecord2(2, FaceNames);
|
|
pWriter->WriteRecord2(3, StyleSheets);
|
|
pWriter->WriteRecord2(4, DocumentSheet);
|
|
pWriter->WriteRecord2(5, EventList);
|
|
pWriter->WriteRecord2(6, HeaderFooter);
|
|
|
|
smart_ptr<OOX::File> pFile = this->Find(OOX::Draw::FileTypes::Masters);
|
|
CMastersFile* pMasters= dynamic_cast<CMastersFile*>(pFile.GetPointer());
|
|
if (pMasters)
|
|
{
|
|
pWriter->StartRecord(7);
|
|
pMasters->toPPTY(pWriter);
|
|
pWriter->EndRecord();
|
|
}
|
|
|
|
pFile = this->Find(OOX::Draw::FileTypes::Pages);
|
|
CPagesFile* pPages = dynamic_cast<CPagesFile*>(pFile.GetPointer());
|
|
if (pPages)
|
|
{
|
|
pWriter->StartRecord(8);
|
|
pPages->toPPTY(pWriter);
|
|
pWriter->EndRecord();
|
|
}
|
|
|
|
pFile = this->Find(OOX::Draw::FileTypes::Connections);
|
|
CConnectionsFile* pConnections = dynamic_cast<CConnectionsFile*>(pFile.GetPointer());
|
|
if (pConnections)
|
|
{
|
|
pWriter->StartRecord(9);
|
|
pConnections->toPPTY(pWriter);
|
|
pWriter->EndRecord();
|
|
}
|
|
|
|
pFile = this->Find(OOX::Draw::FileTypes::Recordsets);
|
|
CRecordsetsFile* pRecordsets = dynamic_cast<CRecordsetsFile*>(pFile.GetPointer());
|
|
if (pRecordsets)
|
|
{
|
|
pWriter->StartRecord(10);
|
|
pRecordsets->toPPTY(pWriter);
|
|
pWriter->EndRecord();
|
|
}
|
|
|
|
pFile = this->Find(OOX::Draw::FileTypes::Solutions);
|
|
CSolutionsFile* pSolutions = dynamic_cast<CSolutionsFile*>(pFile.GetPointer());
|
|
if (pSolutions)
|
|
{
|
|
pWriter->StartRecord(11);
|
|
pSolutions->toPPTY(pWriter);
|
|
pWriter->EndRecord();
|
|
}
|
|
|
|
pFile = this->Find(OOX::Draw::FileTypes::Validation);
|
|
CValidationFile* pValidation = dynamic_cast<CValidationFile*>(pFile.GetPointer());
|
|
if (pValidation)
|
|
{
|
|
pWriter->StartRecord(12);
|
|
pValidation->toPPTY(pWriter);
|
|
pWriter->EndRecord();
|
|
}
|
|
|
|
pFile = this->Find(OOX::Draw::FileTypes::Comments);
|
|
CCommentsFile* pComments = dynamic_cast<CCommentsFile*>(pFile.GetPointer());
|
|
if (pComments)
|
|
{
|
|
pWriter->StartRecord(13);
|
|
pComments->toPPTY(pWriter);
|
|
pWriter->EndRecord();
|
|
}
|
|
|
|
pFile = this->Find(OOX::Draw::FileTypes::Windows);
|
|
CWindowsFile* pWindows = dynamic_cast<CWindowsFile*>(pFile.GetPointer());
|
|
if (pPages)
|
|
{
|
|
pWriter->StartRecord(14);
|
|
pWindows->toPPTY(pWriter);
|
|
pWriter->EndRecord();
|
|
}
|
|
bool bThemes = false;
|
|
std::vector<smart_ptr<OOX::File>>& container = ((OOX::IFileContainer*)(this))->GetContainer();
|
|
for (size_t k = 0; k < container.size(); ++k)
|
|
{
|
|
if (OOX::FileTypes::Theme == container[k]->type())
|
|
{
|
|
PPTX::Theme* pTheme = dynamic_cast<PPTX::Theme*>(container[k].GetPointer());
|
|
|
|
pWriter->StartRecord(15);
|
|
pTheme->toPPTY(pWriter);
|
|
pWriter->EndRecord();
|
|
|
|
bThemes = true;
|
|
}
|
|
}
|
|
if (false == bThemes)
|
|
{//некорректный контейнер ???
|
|
OOX::Draw::CVsdx *vsdx = dynamic_cast<OOX::Draw::CVsdx*>(((OOX::File*)this)->m_pMainDocument);
|
|
|
|
if (vsdx && vsdx->m_pContentTypes.IsInit())
|
|
{
|
|
typedef std::multimap<std::wstring, smart_ptr<ContentTypes::COverride>> _mapContentTypes;
|
|
std::pair<_mapContentTypes::iterator, _mapContentTypes::iterator> oFind;
|
|
|
|
oFind = vsdx->m_pContentTypes->m_mapOverridesByType.equal_range(L"application/vnd.openxmlformats-officedocument.theme+xml");
|
|
|
|
for (_mapContentTypes::iterator it = oFind.first; it != oFind.second; ++it)
|
|
{
|
|
if (it->second.IsInit())
|
|
{
|
|
PPTX::Theme oTheme(vsdx, vsdx->m_sDocumentPath + FILE_SEPARATOR_STR + it->second->filename());
|
|
|
|
pWriter->StartRecord(15);
|
|
oTheme.toPPTY(pWriter);
|
|
pWriter->EndRecord();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
pFile = this->Find(OOX::FileTypes::VbaProject);
|
|
OOX::VbaProject *pVbaProject = dynamic_cast<OOX::VbaProject*>(pFile.GetPointer());
|
|
if (pVbaProject)
|
|
{
|
|
pWriter->StartRecord(16);
|
|
pVbaProject->toPPTY(pWriter);
|
|
pWriter->EndRecord();
|
|
}
|
|
pFile = this->Find(OOX::FileTypes::JsaProject);
|
|
OOX::JsaProject* pJsaProject = dynamic_cast<OOX::JsaProject*>(pFile.GetPointer());
|
|
if (pJsaProject)
|
|
{
|
|
if (pJsaProject->IsExist() && !pJsaProject->IsExternal())
|
|
{
|
|
std::wstring pathJsa = pJsaProject->filename().GetPath();
|
|
//if (std::wstring::npos != pathJsa.find(pWriter->m_strMainFolder)) //out path
|
|
{
|
|
BYTE* pData = NULL;
|
|
DWORD nBytesCount;
|
|
if (NSFile::CFileBinary::ReadAllBytes(pJsaProject->filename().GetPath(), &pData, nBytesCount))
|
|
{
|
|
pWriter->StartRecord(17);
|
|
pWriter->WriteBYTEArray(pData, nBytesCount);
|
|
pWriter->EndRecord();
|
|
|
|
RELEASEARRAYOBJECTS(pData);
|
|
}
|
|
}
|
|
}
|
|
if (pJsaProject->IsExternal())
|
|
{
|
|
//pWriter->StartRecord(18);
|
|
//m_oBcw.m_oStream.WriteStringW3(pJsaProject->filename().GetPath());
|
|
//pWriter->EndRecord();
|
|
}
|
|
}
|
|
pWriter->EndRecord();
|
|
}
|
|
void CDocumentFile::toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const
|
|
{
|
|
pWriter->StartNode(L"VisioDocument");
|
|
pWriter->StartAttributes();
|
|
pWriter->WriteAttribute2(L"xmlns", L"http://schemas.microsoft.com/office/visio/2012/main");
|
|
pWriter->WriteAttribute2(L"xmlns:r", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships");
|
|
pWriter->WriteAttribute2(L"xml:space", L"preserve");
|
|
pWriter->EndAttributes();
|
|
|
|
if (DocumentSettings.IsInit())
|
|
DocumentSettings->toXmlWriter(pWriter);
|
|
if (Colors.IsInit())
|
|
Colors->toXmlWriter(pWriter);
|
|
if (FaceNames.IsInit())
|
|
FaceNames->toXmlWriter(pWriter);
|
|
if (StyleSheets.IsInit())
|
|
StyleSheets->toXmlWriter(pWriter);
|
|
if (DocumentSheet.IsInit())
|
|
DocumentSheet->toXmlWriter(pWriter);
|
|
if (EventList.IsInit())
|
|
EventList->toXmlWriter(pWriter);
|
|
if (HeaderFooter.IsInit())
|
|
HeaderFooter->toXmlWriter(pWriter);
|
|
|
|
pWriter->WriteNodeEnd(L"VisioDocument");
|
|
}
|
|
//-----------------------------------------------------------------------------------------------------------------------------
|
|
EElementType CSnapAngle::getType() const
|
|
{
|
|
return et_dr_SnapAngle;
|
|
}
|
|
void CSnapAngle::fromXML(XmlUtils::CXmlLiteReader& oReader)
|
|
{
|
|
if (oReader.IsEmptyNode())
|
|
return;
|
|
|
|
content = oReader.GetText2();
|
|
}
|
|
void CSnapAngle::toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const
|
|
{
|
|
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeStart);
|
|
pWriter->WriteDoubleReal2(0, content);
|
|
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeEnd);
|
|
}
|
|
void CSnapAngle::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader)
|
|
{
|
|
LONG _end_rec = pReader->GetPos() + pReader->GetRecordSize() + 4;
|
|
pReader->Skip(1); // start attributes
|
|
while (true)
|
|
{
|
|
BYTE _at = pReader->GetUChar_TypeNode();
|
|
if (_at == NSBinPptxRW::g_nodeAttributeEnd)
|
|
break;
|
|
switch (_at)
|
|
{
|
|
case 0:
|
|
{
|
|
content = pReader->GetDoubleReal();
|
|
}break;
|
|
}
|
|
}
|
|
pReader->Seek(_end_rec);
|
|
}
|
|
void CSnapAngle::toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const
|
|
{
|
|
pWriter->WriteNodeValue(L"SnapAngle", content);
|
|
}
|
|
//-----------------------------------------------------------------------------------------------------------------------------
|
|
void CSnapAngles::fromXML(XmlUtils::CXmlLiteReader& oReader)
|
|
{
|
|
if (oReader.IsEmptyNode())
|
|
return;
|
|
int nParentDepth = oReader.GetDepth();
|
|
while (oReader.ReadNextSiblingNode(nParentDepth))
|
|
{
|
|
std::wstring sName = oReader.GetName();
|
|
|
|
if (L"SnapAngle" == sName)
|
|
{
|
|
CSnapAngle* pItem = new CSnapAngle();
|
|
*pItem = oReader;
|
|
|
|
if (pItem)
|
|
m_arrItems.push_back(pItem);
|
|
}
|
|
}
|
|
}
|
|
EElementType CSnapAngles::getType() const
|
|
{
|
|
return et_dr_SnapAngles;
|
|
}
|
|
void CSnapAngles::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader)
|
|
{
|
|
LONG end = pReader->GetPos() + pReader->GetRecordSize() + 4;
|
|
while (pReader->GetPos() < end)
|
|
{
|
|
BYTE _rec = pReader->GetUChar();
|
|
switch (_rec)
|
|
{
|
|
case 0:
|
|
{
|
|
m_arrItems.push_back(new CSnapAngle());
|
|
m_arrItems.back()->fromPPTY(pReader);
|
|
}break;
|
|
default:
|
|
{
|
|
pReader->SkipRecord();
|
|
}break;
|
|
}
|
|
}
|
|
pReader->Seek(end);
|
|
}
|
|
void CSnapAngles::toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const
|
|
{
|
|
for (size_t i = 0; i < m_arrItems.size(); ++i)
|
|
pWriter->WriteRecord2(0, dynamic_cast<OOX::WritingElement*>(m_arrItems[i]));
|
|
}
|
|
void CSnapAngles::toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const
|
|
{
|
|
pWriter->StartNode(L"SnapAngles");
|
|
pWriter->EndAttributes();
|
|
|
|
for (size_t i = 0; i < m_arrItems.size(); ++i)
|
|
m_arrItems[i]->toXmlWriter(pWriter);
|
|
|
|
pWriter->WriteNodeEnd(L"SnapAngles");
|
|
}
|
|
//-----------------------------------------------------------------------------------------------------------------------------
|
|
EElementType CWindow::getType() const
|
|
{
|
|
return et_dr_Window;
|
|
}
|
|
void CWindow::ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
|
|
{
|
|
WritingElement_ReadAttributes_StartChar_No_NS(oReader)
|
|
WritingElement_ReadAttributes_Read_ifChar(oReader, "ID", ID)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "WindowType", WindowType)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "WindowState", WindowState)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "WindowLeft", WindowLeft)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "WindowTop", WindowTop)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "WindowWidth", WindowWidth)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "WindowHeight", WindowHeight)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "ContainerType", ContainerType)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "Container", Container)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "Page", Page)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "Sheet", Sheet)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "ViewScale", ViewScale)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "ViewCenterX", ViewCenterX)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "ViewCenterY", ViewCenterY)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "Document", Document)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "ParentWindow", ParentWindow)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "ReadOnly", ReadOnly)
|
|
WritingElement_ReadAttributes_EndChar_No_NS(oReader)
|
|
}
|
|
void CWindow::fromXML(XmlUtils::CXmlLiteReader& oReader)
|
|
{
|
|
ReadAttributes(oReader);
|
|
|
|
if (oReader.IsEmptyNode())
|
|
return;
|
|
int nParentDepth = oReader.GetDepth();
|
|
while (oReader.ReadNextSiblingNode(nParentDepth))
|
|
{
|
|
std::wstring sName = oReader.GetName();
|
|
|
|
if (L"ShowRulers" == sName)
|
|
{
|
|
ShowRulers = oReader.GetText2();
|
|
}
|
|
else if (L"ShowGrid" == sName)
|
|
{
|
|
ShowGrid = oReader.GetText2();
|
|
}
|
|
else if (L"ShowPageBreaks" == sName)
|
|
{
|
|
ShowPageBreaks = oReader.GetText2();
|
|
}
|
|
else if (L"GlueSettings" == sName)
|
|
{
|
|
GlueSettings = oReader.GetText2();
|
|
}
|
|
else if (L"ShowGuides" == sName)
|
|
{
|
|
ShowGuides = oReader.GetText2();
|
|
}
|
|
else if (L"ShowConnectionPoints" == sName)
|
|
{
|
|
ShowConnectionPoints = oReader.GetText2();
|
|
}
|
|
else if (L"SnapSettings" == sName)
|
|
{
|
|
SnapSettings = oReader.GetText2();
|
|
}
|
|
else if (L"SnapExtensions" == sName)
|
|
{
|
|
SnapExtensions = oReader.GetText2();
|
|
}
|
|
else if (L"SnapAngles" == sName)
|
|
{
|
|
SnapAngles = oReader;
|
|
}
|
|
else if (L"DynamicGridEnabled" == sName)
|
|
{
|
|
DynamicGridEnabled = oReader.GetText2();
|
|
}
|
|
else if (L"TabSplitterPos" == sName)
|
|
{
|
|
TabSplitterPos = oReader.GetText2();
|
|
}
|
|
else if (L"StencilGroup" == sName)
|
|
{
|
|
StencilGroup = oReader.GetText2();
|
|
}
|
|
else if (L"StencilGroupPos" == sName)
|
|
{
|
|
StencilGroupPos = oReader.GetText2();
|
|
}
|
|
}
|
|
|
|
}
|
|
void CWindow::toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const
|
|
{
|
|
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeStart);
|
|
pWriter->WriteUInt2(0, ID);
|
|
if (WindowType.IsInit()) pWriter->WriteByte1(1, WindowType->GetValue());
|
|
pWriter->WriteUInt2(2, WindowState);
|
|
pWriter->WriteInt2(3, WindowLeft);
|
|
pWriter->WriteInt2(4, WindowTop);
|
|
pWriter->WriteUInt2(5, WindowWidth);
|
|
pWriter->WriteUInt2(6, WindowHeight);
|
|
if (ContainerType.IsInit()) pWriter->WriteByte1(7, ContainerType->GetValue());
|
|
pWriter->WriteUInt2(8, Container);
|
|
pWriter->WriteUInt2(9, Page);
|
|
pWriter->WriteUInt2(10, Sheet);
|
|
pWriter->WriteDoubleReal2(11, ViewScale);
|
|
pWriter->WriteDoubleReal2(12, ViewCenterX);
|
|
pWriter->WriteDoubleReal2(13, ViewCenterY);
|
|
pWriter->WriteString2(14, Document);
|
|
pWriter->WriteUInt2(15, ParentWindow);
|
|
pWriter->WriteBool2(16, ReadOnly);
|
|
pWriter->WriteBool2(17, ShowRulers);
|
|
pWriter->WriteBool2(18, ShowGrid);
|
|
pWriter->WriteBool2(19, ShowPageBreaks);
|
|
pWriter->WriteBool2(20, ShowGuides);
|
|
pWriter->WriteBool2(21, ShowConnectionPoints);
|
|
pWriter->WriteUInt2(22, GlueSettings);
|
|
pWriter->WriteUInt2(23, SnapSettings);
|
|
pWriter->WriteUInt2(24, SnapExtensions);
|
|
pWriter->WriteBool2(26, DynamicGridEnabled);
|
|
pWriter->WriteDoubleReal2(27, TabSplitterPos);
|
|
pWriter->WriteUInt2(28, StencilGroup);
|
|
pWriter->WriteUInt2(29, StencilGroupPos);
|
|
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeEnd);
|
|
|
|
pWriter->WriteRecord2(0, SnapAngles);
|
|
}
|
|
|
|
void CWindow::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader)
|
|
{
|
|
LONG _end_rec = pReader->GetPos() + pReader->GetRecordSize() + 4;
|
|
pReader->Skip(1); // start attributes
|
|
while (true)
|
|
{
|
|
BYTE _at = pReader->GetUChar_TypeNode();
|
|
if (_at == NSBinPptxRW::g_nodeAttributeEnd)
|
|
break;
|
|
switch (_at)
|
|
{
|
|
case 0:
|
|
{
|
|
ID = pReader->GetULong();
|
|
}break;
|
|
case 1:
|
|
{
|
|
WindowType.Init(); WindowType->SetValueFromByte(pReader->GetUChar());
|
|
}break;
|
|
case 2:
|
|
{
|
|
WindowState = pReader->GetULong();
|
|
}break;
|
|
case 3:
|
|
{
|
|
WindowLeft = pReader->GetLong();
|
|
}break;
|
|
case 4:
|
|
{
|
|
WindowTop = pReader->GetLong();
|
|
}break;
|
|
case 5:
|
|
{
|
|
WindowWidth = pReader->GetULong();
|
|
}break;
|
|
case 6:
|
|
{
|
|
WindowHeight = pReader->GetULong();
|
|
}break;
|
|
case 7:
|
|
{
|
|
ContainerType.Init(); ContainerType->SetValueFromByte(pReader->GetUChar());
|
|
}break;
|
|
case 8:
|
|
{
|
|
Container = pReader->GetULong();
|
|
}break;
|
|
case 9:
|
|
{
|
|
Page = pReader->GetULong();
|
|
}break;
|
|
case 10:
|
|
{
|
|
Sheet = pReader->GetULong();
|
|
}break;
|
|
case 11:
|
|
{
|
|
ViewScale = pReader->GetDoubleReal();
|
|
}break;
|
|
case 12:
|
|
{
|
|
ViewCenterX = pReader->GetDoubleReal();
|
|
}break;
|
|
case 13:
|
|
{
|
|
ViewCenterY = pReader->GetDoubleReal();
|
|
}break;
|
|
case 14:
|
|
{
|
|
Document = pReader->GetString2();
|
|
}break;
|
|
case 15:
|
|
{
|
|
ParentWindow = pReader->GetULong();
|
|
}break;
|
|
case 16:
|
|
{
|
|
ReadOnly = pReader->GetBool();
|
|
}break;
|
|
case 17:
|
|
{
|
|
ShowRulers = pReader->GetBool();
|
|
}break;
|
|
case 18:
|
|
{
|
|
ShowGrid = pReader->GetBool();
|
|
}break;
|
|
case 19:
|
|
{
|
|
ShowPageBreaks = pReader->GetBool();
|
|
}break;
|
|
case 20:
|
|
{
|
|
ShowGuides = pReader->GetBool();
|
|
}break;
|
|
case 21:
|
|
{
|
|
ShowConnectionPoints = pReader->GetBool();
|
|
}break;
|
|
case 22:
|
|
{
|
|
GlueSettings = pReader->GetULong();
|
|
}break;
|
|
case 23:
|
|
{
|
|
SnapSettings = pReader->GetULong();
|
|
}break;
|
|
case 24:
|
|
{
|
|
SnapExtensions = pReader->GetULong();
|
|
}break;
|
|
case 26:
|
|
{
|
|
DynamicGridEnabled = pReader->GetBool();
|
|
}break;
|
|
case 27:
|
|
{
|
|
TabSplitterPos = pReader->GetDoubleReal();
|
|
}break;
|
|
case 28:
|
|
{
|
|
StencilGroup = pReader->GetULong();
|
|
}break;
|
|
case 29:
|
|
{
|
|
StencilGroupPos = pReader->GetULong();
|
|
}break;
|
|
}
|
|
}
|
|
while (pReader->GetPos() < _end_rec)
|
|
{
|
|
BYTE _rec = pReader->GetUChar();
|
|
|
|
switch (_rec)
|
|
{
|
|
case 0:
|
|
{
|
|
SnapAngles.Init();
|
|
SnapAngles->fromPPTY(pReader);
|
|
}break;
|
|
default:
|
|
{
|
|
pReader->SkipRecord();
|
|
}break;
|
|
}
|
|
}
|
|
pReader->Seek(_end_rec);
|
|
}
|
|
void CWindow::toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const
|
|
{
|
|
pWriter->StartNode(L"Window");
|
|
pWriter->StartAttributes();
|
|
pWriter->WriteAttribute2(L"ID", ID);
|
|
if (WindowType.IsInit())
|
|
pWriter->WriteAttribute2(L"WindowType", WindowType->ToString());
|
|
pWriter->WriteAttribute2(L"WindowState", WindowState);
|
|
pWriter->WriteAttribute(L"WindowLeft", WindowLeft);
|
|
pWriter->WriteAttribute(L"WindowTop", WindowTop);
|
|
pWriter->WriteAttribute2(L"WindowWidth", WindowWidth);
|
|
pWriter->WriteAttribute2(L"WindowHeight", WindowHeight);
|
|
if (ContainerType.IsInit())
|
|
pWriter->WriteAttribute2(L"ContainerType", ContainerType->ToString());
|
|
pWriter->WriteAttribute2(L"Container", Container);
|
|
pWriter->WriteAttribute2(L"Page", Page);
|
|
pWriter->WriteAttribute2(L"Sheet", Sheet);
|
|
pWriter->WriteAttribute(L"ViewScale", ViewScale);
|
|
pWriter->WriteAttribute(L"ViewCenterX", ViewCenterX);
|
|
pWriter->WriteAttribute(L"ViewCenterY", ViewCenterY);
|
|
pWriter->WriteAttribute2(L"Document", Document);
|
|
pWriter->WriteAttribute2(L"ParentWindow", ParentWindow);
|
|
pWriter->WriteAttribute(L"ReadOnly", ReadOnly);
|
|
pWriter->EndAttributes();
|
|
|
|
pWriter->WriteNodeValue(L"ShowRulers", ShowRulers);
|
|
pWriter->WriteNodeValue(L"ShowGrid", ShowGrid);
|
|
pWriter->WriteNodeValue(L"ShowPageBreaks", ShowPageBreaks);
|
|
pWriter->WriteNodeValue(L"ShowGuides", ShowGuides);
|
|
pWriter->WriteNodeValue(L"ShowConnectionPoints", ShowConnectionPoints);
|
|
pWriter->WriteNodeValue(L"GlueSettings", GlueSettings);
|
|
pWriter->WriteNodeValue(L"SnapSettings", SnapSettings);
|
|
pWriter->WriteNodeValue(L"SnapExtensions", SnapExtensions);
|
|
pWriter->WriteNodeValue(L"DynamicGridEnabled", DynamicGridEnabled);
|
|
pWriter->WriteNodeValue(L"TabSplitterPos", TabSplitterPos);
|
|
pWriter->WriteNodeValue(L"StencilGroup", StencilGroup);
|
|
pWriter->WriteNodeValue(L"StencilGroupPos", StencilGroupPos);
|
|
|
|
if (SnapAngles.IsInit())
|
|
SnapAngles->toXmlWriter(pWriter);
|
|
|
|
pWriter->WriteNodeEnd(L"Window");
|
|
}
|
|
//-----------------------------------------------------------------------------------------------------------------------------
|
|
void CWindows::fromXML(XmlUtils::CXmlLiteReader& oReader)
|
|
{
|
|
ReadAttributes(oReader);
|
|
|
|
if (oReader.IsEmptyNode())
|
|
return;
|
|
|
|
int nParentDepth = oReader.GetDepth();
|
|
while (oReader.ReadNextSiblingNode(nParentDepth))
|
|
{
|
|
std::wstring sName = oReader.GetName();
|
|
|
|
if (L"Window" == sName)
|
|
{
|
|
CWindow* pItem = new CWindow();
|
|
*pItem = oReader;
|
|
|
|
if (pItem)
|
|
m_arrItems.push_back(pItem);
|
|
}
|
|
}
|
|
}
|
|
void CWindows::ReadAttributes(XmlUtils::CXmlLiteReader& oReader)
|
|
{
|
|
WritingElement_ReadAttributes_StartChar_No_NS(oReader)
|
|
WritingElement_ReadAttributes_Read_ifChar(oReader, "ClientWidth", ClientWidth)
|
|
WritingElement_ReadAttributes_Read_else_ifChar(oReader, "ClientHeight", ClientHeight)
|
|
WritingElement_ReadAttributes_EndChar_No_NS(oReader)
|
|
}
|
|
EElementType CWindows::getType() const
|
|
{
|
|
return et_dr_Windows;
|
|
}
|
|
void CWindows::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader)
|
|
{
|
|
LONG end = pReader->GetPos() + pReader->GetRecordSize() + 4;
|
|
pReader->Skip(1); // start attributes
|
|
while (true)
|
|
{
|
|
BYTE _at = pReader->GetUChar_TypeNode();
|
|
if (_at == NSBinPptxRW::g_nodeAttributeEnd)
|
|
break;
|
|
switch (_at)
|
|
{
|
|
case 0:
|
|
{
|
|
ClientWidth = pReader->GetULong();
|
|
}break;
|
|
case 1:
|
|
{
|
|
ClientHeight = pReader->GetULong();
|
|
}break;
|
|
}
|
|
}
|
|
while (pReader->GetPos() < end)
|
|
{
|
|
BYTE _rec = pReader->GetUChar();
|
|
switch (_rec)
|
|
{
|
|
case 0:
|
|
{
|
|
m_arrItems.push_back(new CWindow());
|
|
m_arrItems.back()->fromPPTY(pReader);
|
|
}break;
|
|
default:
|
|
{
|
|
pReader->SkipRecord();
|
|
}break;
|
|
}
|
|
}
|
|
pReader->Seek(end);
|
|
}
|
|
void CWindows::toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const
|
|
{
|
|
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeStart);
|
|
pWriter->WriteUInt2(0, ClientWidth);
|
|
pWriter->WriteUInt2(1, ClientHeight);
|
|
pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeEnd);
|
|
|
|
for (size_t i = 0; i < m_arrItems.size(); ++i)
|
|
pWriter->WriteRecord2(0, dynamic_cast<OOX::WritingElement*>(m_arrItems[i]));
|
|
}
|
|
void CWindows::toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const
|
|
{
|
|
pWriter->StartNode(L"Windows");
|
|
pWriter->StartAttributes();
|
|
pWriter->WriteAttribute2(L"xmlns", L"http://schemas.microsoft.com/office/visio/2012/main");
|
|
pWriter->WriteAttribute2(L"xmlns:r", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships");
|
|
pWriter->WriteAttribute2(L"xml:space", L"preserve");
|
|
pWriter->WriteAttribute2(L"ClientWidth", ClientWidth);
|
|
pWriter->WriteAttribute2(L"ClientHeight", ClientHeight);
|
|
pWriter->EndAttributes();
|
|
|
|
for (size_t i = 0; i < m_arrItems.size(); ++i)
|
|
m_arrItems[i]->toXmlWriter(pWriter);
|
|
|
|
pWriter->WriteNodeEnd(L"Windows");
|
|
}
|
|
//-----------------------------------------------------------------------------------------------------------------------------
|
|
OOX::Draw::CWindowsFile::CWindowsFile(OOX::Document* pMain) : OOX::File(pMain)
|
|
{
|
|
}
|
|
OOX::Draw::CWindowsFile::CWindowsFile(OOX::Document* pMain, const CPath& uri) : OOX::File(pMain)
|
|
{
|
|
read(uri.GetDirectory(), uri);
|
|
}
|
|
OOX::Draw::CWindowsFile::CWindowsFile(OOX::Document* pMain, const CPath& oRootPath, const CPath& oPath) : OOX::File(pMain)
|
|
{
|
|
read(oRootPath, oPath);
|
|
}
|
|
OOX::Draw::CWindowsFile::~CWindowsFile()
|
|
{
|
|
}
|
|
void OOX::Draw::CWindowsFile::read(const CPath& oFilePath)
|
|
{
|
|
CPath oRootPath;
|
|
read(oRootPath, oFilePath);
|
|
}
|
|
void OOX::Draw::CWindowsFile::read(const CPath& oRootPath, const CPath& oFilePath)
|
|
{
|
|
XmlUtils::CXmlLiteReader oReader;
|
|
|
|
if (!oReader.FromFile(oFilePath.GetPath()))
|
|
return;
|
|
|
|
if (!oReader.ReadNextNode())
|
|
return;
|
|
|
|
m_strFilename = oFilePath.GetPath();
|
|
|
|
Windows = oReader;
|
|
}
|
|
void OOX::Draw::CWindowsFile::write(const CPath& oFilePath, const CPath& oDirectory, CContentTypes& oContent) const
|
|
{
|
|
NSBinPptxRW::CXmlWriter oXmlWriter;
|
|
oXmlWriter.WriteString((L"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"));
|
|
|
|
oXmlWriter.m_lDocType = XMLWRITER_DOC_TYPE_VSDX;
|
|
toXmlWriter(&oXmlWriter);
|
|
|
|
NSFile::CFileBinary::SaveToFile(oFilePath.GetPath(), oXmlWriter.GetXmlString());
|
|
|
|
oContent.Registration(type().OverrideType(), oDirectory, oFilePath.GetFilename());
|
|
}
|
|
const OOX::FileType OOX::Draw::CWindowsFile::type() const
|
|
{
|
|
return FileTypes::Windows;
|
|
}
|
|
const OOX::CPath OOX::Draw::CWindowsFile::DefaultDirectory() const
|
|
{
|
|
return type().DefaultDirectory();
|
|
}
|
|
const OOX::CPath OOX::Draw::CWindowsFile::DefaultFileName() const
|
|
{
|
|
return type().DefaultFileName();
|
|
}
|
|
void OOX::Draw::CWindowsFile::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader)
|
|
{
|
|
LONG end = pReader->GetPos() + pReader->GetRecordSize() + 4;
|
|
while (pReader->GetPos() < end)
|
|
{
|
|
BYTE _rec = pReader->GetUChar();
|
|
|
|
switch (_rec)
|
|
{
|
|
case 0:
|
|
{
|
|
Windows.Init();
|
|
Windows->fromPPTY(pReader);
|
|
}break;
|
|
default:
|
|
{
|
|
pReader->SkipRecord();
|
|
}break;
|
|
}
|
|
}
|
|
pReader->Seek(end);
|
|
}
|
|
void OOX::Draw::CWindowsFile::toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const
|
|
{
|
|
pWriter->WriteRecord2(0, Windows);
|
|
}
|
|
void OOX::Draw::CWindowsFile::toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const
|
|
{
|
|
if (Windows.IsInit())
|
|
Windows->toXmlWriter(pWriter);
|
|
}
|
|
}
|
|
} // namespace OOX
|