diff --git a/OOXML/DocxFormat/Drawing/DrawingExt.cpp b/OOXML/DocxFormat/Drawing/DrawingExt.cpp index 53a3e5e7ac..6b93549a6c 100644 --- a/OOXML/DocxFormat/Drawing/DrawingExt.cpp +++ b/OOXML/DocxFormat/Drawing/DrawingExt.cpp @@ -177,7 +177,8 @@ namespace OOX { ReadAttributes( oReader ); - if ((m_sUri.IsInit()) && (*m_sUri == L"{63B3BB69-23CF-44E3-9099-C40C66FF867C}" || + if ((m_sUri.IsInit()) && (*m_sUri == L"{C3750BE0-5CA9-4D1C-82C7-79D762991C26}" || + *m_sUri == L"{63B3BB69-23CF-44E3-9099-C40C66FF867C}" || *m_sUri == L"{05C60535-1F16-4fd2-B633-F4F36F0B64E0}" || *m_sUri == L"{504A1905-F514-4f6f-8877-14C23A59335A}" || *m_sUri == L"{78C0D931-6437-407d-A8EE-F0AAD7539E65}" || @@ -198,7 +199,7 @@ namespace OOX *m_sUri == L"http://schemas.microsoft.com/office/drawing/2008/diagram")) { int nCurDepth = oReader.GetDepth(); - while( oReader.ReadNextSiblingNode( nCurDepth ) ) + while (oReader.ReadNextSiblingNode(nCurDepth)) { std::wstring sName = XmlUtils::GetNameNoNS(oReader.GetName()); if (sName == L"compatExt")//2.3.1.2 compatExt @@ -219,12 +220,12 @@ namespace OOX } else if (sName == L"conditionalFormattings") { - if ( oReader.IsEmptyNode() ) + if (oReader.IsEmptyNode()) continue; int nCurDepth1 = oReader.GetDepth(); - while( oReader.ReadNextSiblingNode( nCurDepth1 ) ) - { + while (oReader.ReadNextSiblingNode(nCurDepth1)) + { m_arrConditionalFormatting.push_back(new OOX::Spreadsheet::CConditionalFormatting(oReader)); } } @@ -268,11 +269,11 @@ namespace OOX } else if (sName == L"slicerCachePivotTables") { - if ( oReader.IsEmptyNode() ) + if (oReader.IsEmptyNode()) continue; int nCurDepth1 = oReader.GetDepth(); - while( oReader.ReadNextSiblingNode( nCurDepth1 ) ) + while (oReader.ReadNextSiblingNode(nCurDepth1)) { m_oSlicerCachePivotTables.push_back(new OOX::Spreadsheet::CSlicerCachePivotTable(oReader)); } @@ -293,10 +294,17 @@ namespace OOX { m_oPresenceInfo = oReader; } - else if (sName == L"pivotCacheDefinition") - { - m_oPivotCacheDefinitionExt = oReader; - } + else if (sName == L"pivotCacheDefinition") + { + m_oPivotCacheDefinitionExt = oReader; + } + else if (sName == L"externalReference") + { + WritingElement_ReadAttributes_Start_No_NS(oReader) + WritingElement_ReadAttributes_Read_if(oReader, L"fileId", m_oFileId) + WritingElement_ReadAttributes_Read_else_if(oReader, L"portalName", m_oPortalName) + WritingElement_ReadAttributes_End_No_NS(oReader) + } } } else @@ -443,6 +451,19 @@ namespace OOX m_oPivotCacheDefinitionExt->toXML(writer, L"x14:pivotCacheDefinition"); sResult += writer.GetData().c_str(); } + if (m_oFileId.IsInit() || m_oPortalName.IsInit()) + { + NSStringUtils::CStringBuilder writer; + writer.StartNode(L"externalReference"); + writer.StartAttributes(); + + if (m_oFileId.IsInit()) writer.WriteAttribute(L"fileId", *m_oFileId); + if (m_oPortalName.IsInit()) writer.WriteAttribute(L"portalName", *m_oPortalName); + + writer.EndAttributes(); + writer.EndNode(L"externalReference"); + sResult += writer.GetData().c_str(); + } if (m_oId.IsInit()) { sResult += L"<" + sNamespace + L"id>" + m_oId.get2() + L""; @@ -482,12 +503,12 @@ namespace OOX int nCurDepth = oReader.GetDepth(); while( oReader.ReadNextSiblingNode( nCurDepth ) ) { - std::wstring sName = XmlUtils::GetNameNoNS(oReader.GetName()); - if ( _T("ext") == sName ) + std::wstring sName = XmlUtils::GetNameNoNS(oReader.GetName()); + if ( _T("ext") == sName ) { - OOX::Drawing::COfficeArtExtension *oExt = new OOX::Drawing::COfficeArtExtension(oReader); - if (oExt) - m_arrExt.push_back( oExt ); + OOX::Drawing::COfficeArtExtension *oExt = new OOX::Drawing::COfficeArtExtension(oReader); + if (oExt) + m_arrExt.push_back( oExt ); } } } diff --git a/OOXML/DocxFormat/Drawing/DrawingExt.h b/OOXML/DocxFormat/Drawing/DrawingExt.h index a11f0d91ad..93db08e846 100644 --- a/OOXML/DocxFormat/Drawing/DrawingExt.h +++ b/OOXML/DocxFormat/Drawing/DrawingExt.h @@ -149,7 +149,10 @@ namespace OOX std::vector m_arrConditionalFormatting; - nullable m_oPresenceInfo; + nullable m_oPresenceInfo; + + nullable_string m_oFileId; + nullable_string m_oPortalName; }; //-------------------------------------------------------------------------------- diff --git a/OOXML/Projects/Linux/DocxFormatLib/DocxFormatLib.pro b/OOXML/Projects/Linux/DocxFormatLib/DocxFormatLib.pro index 0a12399aa6..8da19257b4 100644 --- a/OOXML/Projects/Linux/DocxFormatLib/DocxFormatLib.pro +++ b/OOXML/Projects/Linux/DocxFormatLib/DocxFormatLib.pro @@ -110,7 +110,8 @@ SOURCES += \ ../../../XlsxFormat/Slicer/SlicerCache.cpp \ ../../../XlsxFormat/Slicer/SlicerCacheExt.cpp \ ../../../XlsxFormat/Slicer/Slicer.cpp \ - ../../../XlsxFormat/NamedSheetViews/NamedSheetViews.cpp \ + ../../../XlsxFormat/ExternalLinks/ExternalLinks.cpp \ + ../../../XlsxFormat/NamedSheetViews/NamedSheetViews.cpp \ ../../../XlsxFormat/Pivot/PivotCacheDefinitionExt.cpp \ ../../../XlsxFormat/Workbook/Workbook.cpp } diff --git a/OOXML/Projects/Linux/DocxFormatLib/xlsx_format_logic.cpp b/OOXML/Projects/Linux/DocxFormatLib/xlsx_format_logic.cpp index d368c5cc13..c74a73f9e3 100644 --- a/OOXML/Projects/Linux/DocxFormatLib/xlsx_format_logic.cpp +++ b/OOXML/Projects/Linux/DocxFormatLib/xlsx_format_logic.cpp @@ -30,27 +30,28 @@ * */ -#include "../../../XlsxFormat//Chart/ChartSerialize.cpp" -#include "../../../XlsxFormat//Chart/ChartSerializeEx.cpp" -#include "../../../XlsxFormat//Common.cpp" -#include "../../../XlsxFormat//FileFactory_Spreadsheet.cpp" -#include "../../../XlsxFormat//Xlsx.cpp" -#include "../../../XlsxFormat//XlsxFlat.cpp" -#include "../../../XlsxFormat//FileTypes_Spreadsheet.cpp" -#include "../../../XlsxFormat//Worksheets/SheetData.cpp" -#include "../../../XlsxFormat//Worksheets/Worksheet.cpp" -#include "../../../XlsxFormat//Worksheets/ConditionalFormatting.cpp" -#include "../../../XlsxFormat//Worksheets/DataValidation.cpp" -#include "../../../XlsxFormat//Table/Tables.cpp" -#include "../../../XlsxFormat//Controls/Controls.cpp" -#include "../../../XlsxFormat//Styles/rPr.cpp" -#include "../../../XlsxFormat//Styles/Styles.cpp" -#include "../../../XlsxFormat//SharedStrings/Si.cpp" -#include "../../../XlsxFormat//SharedStrings/Text.cpp" -#include "../../../XlsxFormat//Pivot/Pivots.cpp" -#include "../../../XlsxFormat//Slicer/SlicerCache.cpp" -#include "../../../XlsxFormat//Slicer/SlicerCacheExt.cpp" -#include "../../../XlsxFormat//Slicer/Slicer.cpp" -#include "../../../XlsxFormat//NamedSheetViews/NamedSheetViews.cpp" -#include "../../../XlsxFormat//Pivot/PivotCacheDefinitionExt.cpp" -#include "../../../XlsxFormat//Workbook/Workbook.cpp" +#include "../../../XlsxFormat/Chart/ChartSerialize.cpp" +#include "../../../XlsxFormat/Chart/ChartSerializeEx.cpp" +#include "../../../XlsxFormat/Common.cpp" +#include "../../../XlsxFormat/FileFactory_Spreadsheet.cpp" +#include "../../../XlsxFormat/Xlsx.cpp" +#include "../../../XlsxFormat/XlsxFlat.cpp" +#include "../../../XlsxFormat/FileTypes_Spreadsheet.cpp" +#include "../../../XlsxFormat/Worksheets/SheetData.cpp" +#include "../../../XlsxFormat/Worksheets/Worksheet.cpp" +#include "../../../XlsxFormat/Worksheets/ConditionalFormatting.cpp" +#include "../../../XlsxFormat/Worksheets/DataValidation.cpp" +#include "../../../XlsxFormat/Table/Tables.cpp" +#include "../../../XlsxFormat/Controls/Controls.cpp" +#include "../../../XlsxFormat/Styles/rPr.cpp" +#include "../../../XlsxFormat/Styles/Styles.cpp" +#include "../../../XlsxFormat/SharedStrings/Si.cpp" +#include "../../../XlsxFormat/SharedStrings/Text.cpp" +#include "../../../XlsxFormat/Pivot/Pivots.cpp" +#include "../../../XlsxFormat/Slicer/SlicerCache.cpp" +#include "../../../XlsxFormat/Slicer/SlicerCacheExt.cpp" +#include "../../../XlsxFormat/Slicer/Slicer.cpp" +#include "../../../XlsxFormat/ExternalLinks/ExternalLinks.cpp" +#include "../../../XlsxFormat/NamedSheetViews/NamedSheetViews.cpp" +#include "../../../XlsxFormat/Pivot/PivotCacheDefinitionExt.cpp" +#include "../../../XlsxFormat/Workbook/Workbook.cpp" diff --git a/OOXML/Projects/Windows/DocxFormatLib/DocxFormatLib.vcxproj b/OOXML/Projects/Windows/DocxFormatLib/DocxFormatLib.vcxproj index e8aa514296..f54bc6f2d5 100644 --- a/OOXML/Projects/Windows/DocxFormatLib/DocxFormatLib.vcxproj +++ b/OOXML/Projects/Windows/DocxFormatLib/DocxFormatLib.vcxproj @@ -468,6 +468,7 @@ + diff --git a/OOXML/Projects/Windows/DocxFormatLib/DocxFormatLib.vcxproj.filters b/OOXML/Projects/Windows/DocxFormatLib/DocxFormatLib.vcxproj.filters index 2aed5d9866..72d139c607 100644 --- a/OOXML/Projects/Windows/DocxFormatLib/DocxFormatLib.vcxproj.filters +++ b/OOXML/Projects/Windows/DocxFormatLib/DocxFormatLib.vcxproj.filters @@ -773,5 +773,8 @@ + + XlsxFormat\ExternalLinks + \ No newline at end of file diff --git a/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.cpp b/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.cpp new file mode 100644 index 0000000000..b2869b25e0 --- /dev/null +++ b/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.cpp @@ -0,0 +1,1327 @@ +/* + * (c) Copyright Ascensio System SIA 2010-2019 + * + * 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-12 Ernesta Birznieka-Upisha + * 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 "ExternalLinks.h" + +#include "../../DocxFormat/Drawing/DrawingExt.h" + +#include "../../XlsbFormat/Xlsb.h" +#include "../../XlsbFormat/ExternalLinkStream.h" + +#include "../../XlsbFormat/Biff12_unions/EXTERNALLINK.h" +#include "../../XlsbFormat/Biff12_records/BeginSupBook.h" +#include "../../XlsbFormat/Biff12_unions/EXTERNALBOOK.h" +#include "../../XlsbFormat/Biff12_unions/DDEOLELINK.h" +#include "../../XlsbFormat/Biff12_records/SupTabs.h" +#include "../../XlsbFormat/Biff12_unions/EXTERNNAME.h" +#include "../../XlsbFormat/Biff12_records/SupNameStart.h" +#include "../../XlsbFormat/Biff12_records/SupNameFmla.h" +#include "../../XlsbFormat/Biff12_records/SupNameBits.h" +#include "../../XlsbFormat/Biff12_unions/EXTERNTABLE.h" +#include "../../XlsbFormat/Biff12_records/ExternTableStart.h" +#include "../../XlsbFormat/Biff12_unions/EXTERNROW.h" +#include "../../XlsbFormat/Biff12_records/ExternRowHdr.h" +#include "../../XlsbFormat/Biff12_unions/EXTERNVALUE.h" +#include "../../XlsbFormat/Biff12_records/ExternValueMeta.h" +#include "../../XlsbFormat/Biff12_unions/EXTERNVALUEDATA.h" +#include "../../XlsbFormat/Biff12_records/ExternCell.h" +#include "../../XlsbFormat/Biff12_unions/DDEOLEITEM.h" +#include "../../XlsbFormat/Biff12_unions/DDEOLEITEMVALUES.h" +#include "../../XlsbFormat/Biff12_unions/DDEOLEITEMVALUE.h" +#include "../../XlsbFormat/Biff12_records/SupNameValueStart.h" +#include "../../XlsbFormat/Biff12_records/SupName.h" + +namespace OOX +{ +namespace Spreadsheet +{ + void CExternalSheetNames::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + if (oReader.IsEmptyNode()) + return; + + int nCurDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nCurDepth)) + { + std::wstring sName = oReader.GetName(); + if (L"sheetName" == sName) + { + m_arrItems.push_back(new ComplexTypes::Spreadsheet::String(oReader)); + } + } + } + void CExternalSheetNames::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L""); + for (size_t i = 0; i < m_arrItems.size(); ++i) + { + if (m_arrItems[i]) + { + writer.WriteString(L"ToString2()); + writer.WriteString(L"/>"); + } + } + writer.WriteString(L""); + } + std::wstring CExternalSheetNames::toXML() const + { + NSStringUtils::CStringBuilder writer; + toXML(writer); + return writer.GetData().c_str(); + } + void CExternalSheetNames::fromBin(XLS::BaseObjectPtr& obj) + { + auto ptr = static_cast(obj.get()); + if (ptr != nullptr) + { + for (auto &item : ptr->sheetNames) + { + auto str = new ComplexTypes::Spreadsheet::String; + str->m_sVal = item.value(); + m_arrItems.push_back(str); + } + } + } + + + void CExternalDefinedName::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes(oReader); + + if (!oReader.IsEmptyNode()) + oReader.ReadTillEnd(); + } + void CExternalDefinedName::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L"GetValue()); + writer.WriteString(L"/>"); + } + std::wstring CExternalDefinedName::toXML() const + { + NSStringUtils::CStringBuilder writer; + toXML(writer); + return writer.GetData().c_str(); + } + void CExternalDefinedName::fromBin(XLS::BaseObjectPtr& obj) + { + ReadAttributes(obj); + } + void CExternalDefinedName::ReadAttributes(XLS::BaseObjectPtr& obj) + { + auto ptr = static_cast(obj.get()); + if (ptr != nullptr) + { + auto ptrSupNameStart = static_cast(ptr->m_BrtSupNameStart.get()); + if (ptrSupNameStart != nullptr) + { + if (!ptrSupNameStart->name.value().empty()) + m_oName = ptrSupNameStart->name.value(); + } + + auto ptrSupNameFmla = static_cast(ptr->m_BrtSupNameFmla.get()); + if (ptrSupNameFmla != nullptr) + { + auto ref = ptrSupNameFmla->fmla.getAssembledFormula(); + if (!ref.empty()) + m_oRefersTo = ref; + } + + auto ptrSupNameBits = static_cast(ptr->m_BrtSupNameBits.get()); + if (ptrSupNameBits != nullptr) + { + m_oSheetId = ptrSupNameBits->contentsExtName.iSheet; + } + + } + } + void CExternalDefinedName::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_Read_if(oReader, (L"name"), m_oName) + WritingElement_ReadAttributes_Read_else_if(oReader, (L"refersTo"), m_oRefersTo) + WritingElement_ReadAttributes_Read_else_if(oReader, (L"sheetId"), m_oSheetId) + WritingElement_ReadAttributes_End(oReader) + } + + + void CExternalDefinedNames::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + if (oReader.IsEmptyNode()) + return; + + int nCurDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nCurDepth)) + { + std::wstring sName = oReader.GetName(); + if (L"definedName" == sName) + { + m_arrItems.push_back(new CExternalDefinedName(oReader)); + } + } + } + void CExternalDefinedNames::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L""); + for (size_t i = 0; i < m_arrItems.size(); ++i) + { + if (m_arrItems[i]) + { + m_arrItems[i]->toXML(writer); + } + } + writer.WriteString(L""); + } + std::wstring CExternalDefinedNames::toXML() const + { + NSStringUtils::CStringBuilder writer; + toXML(writer); + return writer.GetData().c_str(); + } + void CExternalDefinedNames::fromBin(std::vector& obj) + { + for (auto &item : obj) + { + m_arrItems.push_back(new CExternalDefinedName(item)); + } + } + + void CExternalCell::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes(oReader); + + if (oReader.IsEmptyNode()) + return; + + int nCurDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nCurDepth)) + { + std::wstring sName = oReader.GetName(); + if (L"v" == sName) + { + m_oValue = oReader; + } + } + } + void CExternalCell::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L"ToString()); + WritingStringNullableAttrInt(L"vm", m_oValueMetadata, m_oValueMetadata->GetValue()); + writer.WriteString(L">"); + if (m_oValue.IsInit()) + m_oValue->toXML2(writer, (L"v")); + writer.WriteString(L""); + } + std::wstring CExternalCell::toXML() const + { + NSStringUtils::CStringBuilder writer; + toXML(writer); + return writer.GetData().c_str(); + } + void CExternalCell::fromBin(XLS::BaseObjectPtr& obj) + { + ReadAttributes(obj); + } + void CExternalCell::ReadAttributes(XLS::BaseObjectPtr& obj) + { + auto ptr = static_cast(obj.get()); + if (ptr != nullptr) + { + auto ptrExternValueMeta = static_cast(ptr->m_BrtExternValueMeta.get()); + if (ptrExternValueMeta != nullptr) + { + m_oValueMetadata = ptrExternValueMeta->ivmb; + } + + auto ptrEXTERNVALUEDATA = static_cast(ptr->m_EXTERNVALUEDATA.get()); + if (ptrEXTERNVALUEDATA != nullptr) + { + if (!ptrEXTERNVALUEDATA->m_Ref.empty()) + m_oRef = ptrEXTERNVALUEDATA->m_Ref; + + if (ptrEXTERNVALUEDATA->m_source != nullptr) + { + auto pSource = static_cast(ptrEXTERNVALUEDATA->m_source.get()); + auto nType = pSource->getTypeId(); + switch (nType) + { + case XLSB::rt_ExternCellBlank: + break; + case XLSB::rt_ExternCellReal: + { + auto pRealNum = reinterpret_cast(pSource)->value.data.value; + m_oType.Init(); + m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeDate); + m_oValue.Init(); + m_oValue->m_sText = OOX::Spreadsheet::SpreadsheetCommon::WriteDouble(pRealNum); + } + break; + case XLSB::rt_ExternCellBool: + { + auto pBool = reinterpret_cast(pSource)->value; + m_oType.Init(); + m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeBool); + m_oValue.Init(); + m_oValue->m_sText = pBool ? L"1" : L"0"; + } + break; + case XLSB::rt_ExternCellError: + { + auto pError = reinterpret_cast(pSource)->value; + m_oType.Init(); + m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeError); + m_oValue.Init(); + switch (pError) + { + case 0x00: m_oValue->m_sText = L"#NULL!"; break; + case 0x07: m_oValue->m_sText = L"#DIV/0!"; break; + case 0x0F: m_oValue->m_sText = L"#VALUE!"; break; + case 0x17: m_oValue->m_sText = L"#REF!"; break; + case 0x1D: m_oValue->m_sText = L"#NAME?"; break; + case 0x24: m_oValue->m_sText = L"#NUM!"; break; + case 0x2A: m_oValue->m_sText = L"#N/A"; break; + case 0x2B: m_oValue->m_sText = L"#GETTING_DATA"; break; + } + } + break; + case XLSB::rt_ExternCellString: + { + auto pSt = reinterpret_cast(pSource)->value.value(); + m_oType.Init(); + m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeInlineStr); + m_oValue.Init(); + m_oValue->m_sText = pSt; + } + break; + } + } + + } + + } + } + void CExternalCell::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_Read_if(oReader, (L"r"), m_oRef) + WritingElement_ReadAttributes_Read_else_if(oReader, (L"t"), m_oType) + WritingElement_ReadAttributes_Read_else_if(oReader, (L"vm"), m_oValueMetadata) + WritingElement_ReadAttributes_End(oReader) + } + + void CExternalRow::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes(oReader); + + if (oReader.IsEmptyNode()) + return; + + int nCurDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nCurDepth)) + { + std::wstring sName = oReader.GetName(); + if (L"cell" == sName) + { + m_arrItems.push_back(new CExternalCell(oReader)); + } + } + } + void CExternalRow::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L"GetValue()); + writer.WriteString(L">"); + + for (size_t i = 0; i < m_arrItems.size(); ++i) + { + if (m_arrItems[i]) + { + m_arrItems[i]->toXML(writer); + } + } + + writer.WriteString(L""); + } + std::wstring CExternalRow::toXML() const + { + NSStringUtils::CStringBuilder writer; + toXML(writer); + return writer.GetData().c_str(); + } + void CExternalRow::fromBin(XLS::BaseObjectPtr& obj) + { + ReadAttributes(obj); + } + void CExternalRow::ReadAttributes(XLS::BaseObjectPtr& obj) + { + auto ptr = static_cast(obj.get()); + if (ptr != nullptr) + { + auto ptrExternRowHdr = static_cast(ptr->m_BrtExternRowHdr.get()); + if (ptrExternRowHdr != nullptr) + { + m_oR = ptrExternRowHdr->rw; + } + + for (auto &item : ptr->m_arEXTERNVALUE) + m_arrItems.push_back(new CExternalCell(item)); + } + } + void CExternalRow::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_ReadSingle(oReader, (L"r"), m_oR) + WritingElement_ReadAttributes_End(oReader) + } + + void CExternalSheetData::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes(oReader); + + if (oReader.IsEmptyNode()) + return; + + int nCurDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nCurDepth)) + { + std::wstring sName = oReader.GetName(); + if (L"row" == sName) + { + m_arrItems.push_back(new CExternalRow(oReader)); + } + } + } + void CExternalSheetData::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L"GetValue()); + WritingStringNullableAttrBool(L"refreshError", m_oRefreshError); + writer.WriteString(L">"); + + for (size_t i = 0; i < m_arrItems.size(); ++i) + { + if (m_arrItems[i]) + { + m_arrItems[i]->toXML(writer); + } + } + + writer.WriteString(L""); + } + std::wstring CExternalSheetData::toXML() const + { + NSStringUtils::CStringBuilder writer; + toXML(writer); + return writer.GetData().c_str(); + } + void CExternalSheetData::fromBin(XLS::BaseObjectPtr& obj) + { + ReadAttributes(obj); + } + void CExternalSheetData::ReadAttributes(XLS::BaseObjectPtr& obj) + { + auto ptr = static_cast(obj.get()); + if (ptr != nullptr) + { + auto ptrExternTableStart = static_cast(ptr->m_BrtExternTableStart.get()); + if (ptrExternTableStart != nullptr) + { + m_oSheetId = ptrExternTableStart->iTab; + m_oRefreshError = ptrExternTableStart->fRefreshError; + } + + for (auto &item : ptr->m_arEXTERNROW) + m_arrItems.push_back(new CExternalRow(item)); + } + } + void CExternalSheetData::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_Read_if(oReader, (L"sheetId"), m_oSheetId) + WritingElement_ReadAttributes_Read_else_if(oReader, (L"refreshError"), m_oRefreshError) + WritingElement_ReadAttributes_End(oReader) + } + + + void CExternalSheetDataSet::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + if (oReader.IsEmptyNode()) + return; + + int nCurDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nCurDepth)) + { + std::wstring sName = oReader.GetName(); + if (L"sheetData" == sName) + { + m_arrItems.push_back(new CExternalSheetData(oReader)); + } + } + } + void CExternalSheetDataSet::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L""); + for (size_t i = 0; i < m_arrItems.size(); ++i) + { + if (m_arrItems[i]) + { + m_arrItems[i]->toXML(writer); + } + } + writer.WriteString(L""); + } + std::wstring CExternalSheetDataSet::toXML() const + { + NSStringUtils::CStringBuilder writer; + toXML(writer); + return writer.GetData().c_str(); + } + void CExternalSheetDataSet::fromBin(std::vector& obj) + { + for (auto &item : obj) + { + m_arrItems.push_back(new CExternalSheetData(item)); + } + } + + void CExternalBook::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes(oReader); + + if (oReader.IsEmptyNode()) + return; + + int nCurDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nCurDepth)) + { + std::wstring sName = oReader.GetName(); + + if (L"sheetNames" == sName) + { + m_oSheetNames = oReader; + } + else if (L"definedNames" == sName) + { + m_oDefinedNames = oReader; + } + else if (L"sheetDataSet" == sName) + { + m_oSheetDataSet = oReader; + } + } + } + void CExternalBook::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L"ToString()); + writer.WriteString(L"\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\""); + } + writer.WriteString(L">"); + if (m_oSheetNames.IsInit()) + { + m_oSheetNames->toXML(writer); + } + if (m_oDefinedNames.IsInit()) + { + m_oDefinedNames->toXML(writer); + } + if (m_oSheetDataSet.IsInit()) + { + m_oSheetDataSet->toXML(writer); + } + writer.WriteString(L""); + } + std::wstring CExternalBook::toXML() const + { + NSStringUtils::CStringBuilder writer; + toXML(writer); + return writer.GetData().c_str(); + } + void CExternalBook::fromBin(XLS::BaseObjectPtr& obj) + { + auto ptr = static_cast(obj.get()); + if (ptr != nullptr) + { + ReadAttributes(ptr->m_BrtBeginSupBook); + + auto ptr1 = static_cast(ptr->m_EXTERNALBOOK.get()); + if (ptr1 != nullptr) + { + if (ptr1->m_BrtSupTabs != nullptr) + m_oSheetNames = ptr1->m_BrtSupTabs; + if (!ptr1->m_arEXTERNNAME.empty()) + m_oDefinedNames = ptr1->m_arEXTERNNAME; + if (!ptr1->m_arEXTERNTABLE.empty()) + m_oSheetDataSet = ptr1->m_arEXTERNTABLE; + } + } + } + + void CExternalBook::ReadAttributes(XLS::BaseObjectPtr& obj) + { + auto ptr = static_cast(obj.get()); + if (ptr != nullptr) + { + if (!ptr->string1.empty()) + m_oRid = ptr->string1; + } + } + void CExternalBook::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start_No_NS(oReader) + WritingElement_ReadAttributes_ReadSingle(oReader, L"id", m_oRid) + WritingElement_ReadAttributes_End_No_NS(oReader) + } + + void CDdeValue::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes(oReader); + + if (oReader.IsEmptyNode()) + return; + + int nCurDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nCurDepth)) + { + std::wstring sName = oReader.GetName(); + + if (L"val" == sName) + { + m_arrItems.push_back(new CText(oReader)); + } + } + } + void CDdeValue::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L"ToString()); + writer.WriteString(L">"); + + for (size_t i = 0; i < m_arrItems.size(); ++i) + { + if (m_arrItems[i]) + { + m_arrItems[i]->toXML2(writer, L"val"); + } + } + writer.WriteString(L""); + } + std::wstring CDdeValue::toXML() const + { + NSStringUtils::CStringBuilder writer; + toXML(writer); + return writer.GetData().c_str(); + } + void CDdeValue::fromBin(XLS::BaseObjectPtr& obj) + { + ReadAttributes(obj); + } + void CDdeValue::ReadAttributes(XLS::BaseObjectPtr& obj) + { + auto ptr = static_cast(obj.get()); + if (ptr != nullptr) + { + + if (ptr->m_source != nullptr) + { + auto pSource = static_cast(ptr->m_source.get()); + auto nType = pSource->getTypeId(); + switch (nType) + { + case XLSB::rt_SupNameNum: + { + auto pRealNum = reinterpret_cast(pSource)->value.data.value; + m_oType.Init(); + m_oType->SetValue(SimpleTypes::Spreadsheet::EDdeValueType::ddevaluetypeN); + + auto text = new CText(); + std::wstring val = OOX::Spreadsheet::SpreadsheetCommon::WriteDouble(pRealNum); + text->fromBin(val); + m_arrItems.push_back(text); + } + break; + case XLSB::rt_SupNameBool: + { + auto pBool = reinterpret_cast(pSource)->value; + m_oType.Init(); + m_oType->SetValue(SimpleTypes::Spreadsheet::EDdeValueType::ddevaluetypeB); + + auto text = new CText(); + std::wstring val = pBool ? L"1" : L"0"; + text->fromBin(val); + m_arrItems.push_back(text); + } + break; + case XLSB::rt_SupNameErr: + { + auto pError = reinterpret_cast(pSource)->value; + m_oType.Init(); + m_oType->SetValue(SimpleTypes::Spreadsheet::EDdeValueType::ddevaluetypeE); + + auto text = new CText(); + std::wstring val; + switch (pError) + { + case 0x00: val = L"#NULL!"; break; + case 0x07: val = L"#DIV/0!"; break; + case 0x0F: val = L"#VALUE!"; break; + case 0x17: val = L"#REF!"; break; + case 0x1D: val = L"#NAME?"; break; + case 0x24: val = L"#NUM!"; break; + case 0x2A: val = L"#N/A"; break; + case 0x2B: val = L"#GETTING_DATA"; break; + } + text->fromBin(val); + m_arrItems.push_back(text); + } + break; + case XLSB::rt_SupNameSt: + { + auto pSt = reinterpret_cast(pSource)->value.value(); + m_oType.Init(); + m_oType->SetValue(SimpleTypes::Spreadsheet::EDdeValueType::ddevaluetypeStr); + + auto text = new CText(); + text->fromBin(pSt); + m_arrItems.push_back(text); + } + break; + case XLSB::rt_SupNameNil: + { + m_oType.Init(); + m_oType->SetValue(SimpleTypes::Spreadsheet::EDdeValueType::ddevaluetypeNil);; + } + break; + } + } + } + } + void CDdeValue::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_ReadSingle(oReader, (L"t"), m_oType) + WritingElement_ReadAttributes_End(oReader) + } + + void CDdeValues::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes(oReader); + + if (oReader.IsEmptyNode()) + return; + + int nCurDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nCurDepth)) + { + std::wstring sName = oReader.GetName(); + + if (L"value" == sName) + { + m_arrItems.push_back(new CDdeValue(oReader)); + } + } + } + void CDdeValues::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L"GetValue()); + WritingStringNullableAttrInt(L"cols", m_oCols, m_oCols->GetValue()); + writer.WriteString(L">"); + + for (size_t i = 0; i < m_arrItems.size(); ++i) + { + if (m_arrItems[i]) + { + m_arrItems[i]->toXML(writer); + } + } + writer.WriteString(L""); + } + std::wstring CDdeValues::toXML() const + { + NSStringUtils::CStringBuilder writer; + toXML(writer); + return writer.GetData().c_str(); + } + void CDdeValues::fromBin(XLS::BaseObjectPtr& obj) + { + auto ptr = static_cast(obj.get()); + if (ptr != nullptr) + { + ReadAttributes(ptr->m_BrtSupNameValueStart); + + for (auto &item : ptr->m_arDDEOLEITEMVALUE) + m_arrItems.push_back(new CDdeValue(item)); + } + } + void CDdeValues::ReadAttributes(XLS::BaseObjectPtr& obj) + { + auto ptr = static_cast(obj.get()); + if (ptr != nullptr) + { + m_oRows = ptr->cRw; + m_oCols = ptr->cCol; + } + } + void CDdeValues::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_Read_if(oReader, (L"rows"), m_oRows) + WritingElement_ReadAttributes_Read_else_if(oReader, (L"cols"), m_oCols) + WritingElement_ReadAttributes_End(oReader) + } + + void CDdeItem::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes(oReader); + + if (oReader.IsEmptyNode()) + return; + + int nCurDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nCurDepth)) + { + std::wstring sName = oReader.GetName(); + + if (L"values" == sName) + { + m_oDdeValues = oReader; + } + } + } + void CDdeItem::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L""); + if (m_oDdeValues.IsInit()) + { + m_oDdeValues->toXML(writer); + } + writer.WriteString(L""); + } + std::wstring CDdeItem::toXML() const + { + NSStringUtils::CStringBuilder writer; + toXML(writer); + return writer.GetData().c_str(); + } + void CDdeItem::fromBin(XLS::BaseObjectPtr& obj) + { + ReadAttributes(obj); + } + void CDdeItem::ReadAttributes(XLS::BaseObjectPtr& obj) + { + auto ptr = static_cast(obj.get()); + if (ptr != nullptr) + { + if (ptr->m_DDEOLEITEMVALUES != nullptr) + m_oDdeValues = ptr->m_DDEOLEITEMVALUES; + + auto ptrSupNameStart = static_cast(ptr->m_BrtSupNameStart.get()); + if (ptrSupNameStart != nullptr) + { + if (!ptrSupNameStart->name.value().empty()) + m_oName = ptrSupNameStart->name.value(); + } + + auto ptrSupNameBits = static_cast(ptr->m_BrtSupNameBits.get()); + if (ptrSupNameBits != nullptr) + { + m_oOle = ptrSupNameBits->contentsDDE.fOLE; + m_oAdvise = ptrSupNameBits->contentsDDE.fWantAdvise; + m_oPreferPic = ptrSupNameBits->contentsDDE.fWantPict; + } + } + } + void CDdeItem::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_Read_if(oReader, (L"name"), m_oName) + WritingElement_ReadAttributes_Read_else_if(oReader, (L"ole"), m_oOle) + WritingElement_ReadAttributes_Read_else_if(oReader, (L"advise"), m_oAdvise) + WritingElement_ReadAttributes_Read_else_if(oReader, (L"preferPic"), m_oPreferPic) + WritingElement_ReadAttributes_End(oReader) + } + + void CDdeItems::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + if (oReader.IsEmptyNode()) + return; + + int nCurDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nCurDepth)) + { + std::wstring sName = oReader.GetName(); + + if (L"ddeItem" == sName) + { + m_arrItems.push_back(new CDdeItem(oReader)); + } + } + } + void CDdeItems::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L""); + for (size_t i = 0; i < m_arrItems.size(); ++i) + { + if (m_arrItems[i]) + { + m_arrItems[i]->toXML(writer); + } + } + writer.WriteString(L""); + } + std::wstring CDdeItems::toXML() const + { + NSStringUtils::CStringBuilder writer; + toXML(writer); + return writer.GetData().c_str(); + } + void CDdeItems::fromBin(XLS::BaseObjectPtr& obj) + { + auto ptr = static_cast(obj.get()); + if (ptr != nullptr) + { + for (auto &item : ptr->m_arDDEOLEITEM) + m_arrItems.push_back(new CDdeItem(item)); + } + } + + void CDdeLink::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes(oReader); + + if (oReader.IsEmptyNode()) + return; + + int nCurDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nCurDepth)) + { + std::wstring sName = oReader.GetName(); + + if (L"ddeItems" == sName) + { + m_oDdeItems = oReader; + } + } + } + void CDdeLink::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L""); + if (m_oDdeItems.IsInit()) + { + m_oDdeItems->toXML(writer); + } + writer.WriteString(L""); + } + std::wstring CDdeLink::toXML() const + { + NSStringUtils::CStringBuilder writer; + toXML(writer); + return writer.GetData().c_str(); + } + void CDdeLink::fromBin(XLS::BaseObjectPtr& obj) + { + auto ptr = static_cast(obj.get()); + if (ptr != nullptr) + { + ReadAttributes(ptr->m_BrtBeginSupBook); + + if (ptr->m_DDEOLELINK != nullptr) + m_oDdeItems = ptr->m_DDEOLELINK; + } + } + + void CDdeLink::ReadAttributes(XLS::BaseObjectPtr& obj) + { + auto ptr = static_cast(obj.get()); + if (ptr != nullptr) + { + if (!ptr->string1.empty()) + m_oDdeService = ptr->string1; + if (!ptr->string2.empty()) + m_oDdeTopic = ptr->string2; + } + } + void CDdeLink::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_Read_if(oReader, (L"ddeService"), m_oDdeService) + WritingElement_ReadAttributes_Read_else_if(oReader, (L"ddeTopic"), m_oDdeTopic) + WritingElement_ReadAttributes_End(oReader) + } + + void COleItem::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes(oReader); + + if (!oReader.IsEmptyNode()) + oReader.ReadTillEnd(); + } + void COleItem::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L""); + } + std::wstring COleItem::toXML() const + { + NSStringUtils::CStringBuilder writer; + toXML(writer); + return writer.GetData().c_str(); + } + void COleItem::fromBin(XLS::BaseObjectPtr& obj) + { + ReadAttributes(obj); + } + void COleItem::ReadAttributes(XLS::BaseObjectPtr& obj) + { + auto ptr = static_cast(obj.get()); + if (ptr != nullptr) + { + auto ptrSupNameStart = static_cast(ptr->m_BrtSupNameStart.get()); + if (ptrSupNameStart != nullptr) + { + if (!ptrSupNameStart->name.value().empty()) + m_oName = ptrSupNameStart->name.value(); + } + + auto ptrSupNameBits = static_cast(ptr->m_BrtSupNameBits.get()); + if (ptrSupNameBits != nullptr) + { + m_oIcon = ptrSupNameBits->contentsOLE.fIcon; + m_oAdvise = ptrSupNameBits->contentsOLE.fWantAdvise; + m_oPreferPic = ptrSupNameBits->contentsOLE.fWantPict; + } + } + } + void COleItem::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_Read_if(oReader, (L"name"), m_oName) + WritingElement_ReadAttributes_Read_else_if(oReader, (L"icon"), m_oIcon) + WritingElement_ReadAttributes_Read_else_if(oReader, (L"advise"), m_oAdvise) + WritingElement_ReadAttributes_Read_else_if(oReader, (L"preferPic"), m_oPreferPic) + WritingElement_ReadAttributes_End(oReader) + } + + void COleItems::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + if (oReader.IsEmptyNode()) + return; + + int nCurDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nCurDepth)) + { + std::wstring sName = oReader.GetName(); + + if (L"oleItem" == sName) + { + m_arrItems.push_back(new COleItem(oReader)); + } + } + } + void COleItems::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L""); + for (size_t i = 0; i < m_arrItems.size(); ++i) + { + if (m_arrItems[i]) + { + m_arrItems[i]->toXML(writer); + } + } + writer.WriteString(L""); + } + std::wstring COleItems::toXML() const + { + NSStringUtils::CStringBuilder writer; + toXML(writer); + return writer.GetData().c_str(); + } + void COleItems::fromBin(XLS::BaseObjectPtr& obj) + { + auto ptr = static_cast(obj.get()); + if (ptr != nullptr) + { + for (auto &item : ptr->m_arDDEOLEITEM) + m_arrItems.push_back(new COleItem(item)); + } + } + + void COleLink::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes(oReader); + + if (oReader.IsEmptyNode()) + return; + + int nCurDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nCurDepth)) + { + std::wstring sName = oReader.GetName(); + + if (L"oleItems" == sName) + { + m_oOleItems = oReader; + } + } + } + void COleLink::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L"ToString()); + WritingStringNullableAttrEncodeXmlString(L"progId", m_oProgId, m_oProgId.get()); + writer.WriteString(L">"); + if (m_oOleItems.IsInit()) + { + m_oOleItems->toXML(writer); + } + writer.WriteString(L""); + } + std::wstring COleLink::toXML() const + { + NSStringUtils::CStringBuilder writer; + toXML(writer); + return writer.GetData().c_str(); + } + void COleLink::fromBin(XLS::BaseObjectPtr& obj) + { + auto ptr = static_cast(obj.get()); + if (ptr != nullptr) + { + ReadAttributes(ptr->m_BrtBeginSupBook); + + if (ptr->m_DDEOLELINK != nullptr) + m_oOleItems = ptr->m_DDEOLELINK; + } + } + void COleLink::ReadAttributes(XLS::BaseObjectPtr& obj) + { + auto ptr = static_cast(obj.get()); + if (ptr != nullptr) + { + if (!ptr->string1.empty()) + m_oRid = ptr->string1; + if (!ptr->string2.empty()) + m_oProgId = ptr->string2; + } + } + void COleLink::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_Read_if(oReader, (L"r:id"), m_oRid) + WritingElement_ReadAttributes_Read_else_if(oReader, (L"relationships:id"), m_oRid) + WritingElement_ReadAttributes_Read_else_if(oReader, (L"progId"), m_oProgId) + WritingElement_ReadAttributes_End(oReader) + } + + CExternalLink::CExternalLink(OOX::Document* pMain) : OOX::FileGlobalEnumerated(pMain), OOX::IFileContainer(pMain) + { + m_bSpreadsheets = true; + } + CExternalLink::CExternalLink(OOX::Document* pMain, const CPath& oRootPath, const CPath& oPath, const std::wstring & rId) : OOX::FileGlobalEnumerated(pMain), OOX::IFileContainer(pMain) + { + m_bSpreadsheets = true; + m_rId = rId; + read(oRootPath, oPath); + } + CExternalLink::~CExternalLink() + { + } + void CExternalLink::readBin(const CPath& oPath) + { + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if (xlsb) + { + XLSB::ExternalLinkStreamPtr externalLinkStreamStream(new XLSB::ExternalLinkStream); + + xlsb->ReadBin(oPath, externalLinkStreamStream.get()); + + externalLinkStreamStream->UpdateXti(xlsb->GetGlobalinfo(), m_rId); + + if (externalLinkStreamStream != nullptr) + { + if (externalLinkStreamStream->m_EXTERNALLINK != nullptr) + { + auto ptr = static_cast(externalLinkStreamStream->m_EXTERNALLINK.get()); + if (ptr != nullptr) + { + auto ptr1 = static_cast(ptr->m_BrtBeginSupBook.get()); + if (ptr1 != nullptr) + { + switch (ptr1->sbt.value().get()) + { + case XLSB::ExternalReferenceType::WORKBOOK: + m_oExternalBook = externalLinkStreamStream->m_EXTERNALLINK; + break; + case XLSB::ExternalReferenceType::DDE: + m_oDdeLink = externalLinkStreamStream->m_EXTERNALLINK; + break; + case XLSB::ExternalReferenceType::OLE: + m_oOleLink = externalLinkStreamStream->m_EXTERNALLINK; + break; + } + } + } + } + } + + //externalLinkStreamStream.reset(); + } + } + void CExternalLink::read(const CPath& oPath) + { + //don't use this. use read(const CPath& oRootPath, const CPath& oFilePath) + CPath oRootPath; + read(oRootPath, oPath); + } + void CExternalLink::read(const CPath& oRootPath, const CPath& oPath) + { + m_oReadPath = oPath; + IFileContainer::Read(oRootPath, oPath); + + if (m_oReadPath.GetExtention() == _T(".bin")) + { + readBin(m_oReadPath); + return; + } + + XmlUtils::CXmlLiteReader oReader; + + if (!oReader.FromFile(oPath.GetPath())) + return; + + if (!oReader.ReadNextNode()) + return; + + std::wstring sName = XmlUtils::GetNameNoNS(oReader.GetName()); + if (L"externalLink" == sName) + { + ReadAttributes(oReader); + + if (!oReader.IsEmptyNode()) + { + int nStylesDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nStylesDepth)) + { + sName = XmlUtils::GetNameNoNS(oReader.GetName()); + + if (L"externalBook" == sName) + { + m_oExternalBook = oReader; + } + else if (L"oleLink" == sName) + { + m_oOleLink = oReader; + } + else if (L"ddeLink" == sName) + { + m_oDdeLink = oReader; + } + else if (L"extLst" == sName) + { + nullable oExtLst; + oExtLst = oReader; + + for (size_t i = 0; (oExtLst.IsInit()) && (i < oExtLst->m_arrExt.size()); i++) + { + if (oExtLst->m_arrExt[i]->m_oFileId.IsInit() || + oExtLst->m_arrExt[i]->m_oPortalName.IsInit()) + { + m_oFileId = oExtLst->m_arrExt[i]->m_oFileId; + m_oPortalName = oExtLst->m_arrExt[i]->m_oPortalName; + break; + } + } + } + } + } + } + + } + void CExternalLink::write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const + { + NSStringUtils::CStringBuilder sXml; + sXml.WriteString(L""); + sXml.WriteString(L""); + + if (m_oExternalBook.IsInit()) + { + m_oExternalBook->toXML(sXml); + } + if (m_oOleLink.IsInit()) + { + m_oOleLink->toXML(sXml); + } + if (m_oDdeLink.IsInit()) + { + m_oDdeLink->toXML(sXml); + } + if (m_oFileId.IsInit() || m_oPortalName.IsInit()) + { + OOX::Drawing::COfficeArtExtension oExt; + oExt.m_oFileId = m_oFileId; + oExt.m_oPortalName = m_oPortalName; + + oExt.m_sUri = L"{C3750BE0-5CA9-4D1C-82C7-79D762991C26}"; + + sXml.WriteString(L"" + oExt.toXMLWithNS(L"") + L""); + } + sXml.WriteString(L""); + + std::wstring sPath = oPath.GetPath(); + NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); + + oContent.Registration(type().OverrideType(), oDirectory, oPath.GetFilename()); + IFileContainer::Write(oPath, oDirectory, oContent); + } + +} +} \ No newline at end of file diff --git a/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.h b/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.h index d3f68fdc86..205ffb7191 100644 --- a/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.h +++ b/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.h @@ -30,37 +30,10 @@ * */ #pragma once -#ifndef OOX_EXTERNALLINKS_FILE_INCLUDE_H_ -#define OOX_EXTERNALLINKS_FILE_INCLUDE_H_ #include "../CommonInclude.h" -#include "../../XlsbFormat/Xlsb.h" -#include "../../XlsbFormat/ExternalLinkStream.h" #include "../SharedStrings/Text.h" -#include "../../XlsbFormat/Biff12_unions/EXTERNALLINK.h" -#include "../../XlsbFormat/Biff12_records/BeginSupBook.h" -#include "../../XlsbFormat/Biff12_unions/EXTERNALBOOK.h" -#include "../../XlsbFormat/Biff12_unions/DDEOLELINK.h" -#include "../../XlsbFormat/Biff12_records/SupTabs.h" -#include "../../XlsbFormat/Biff12_unions/EXTERNNAME.h" -#include "../../XlsbFormat/Biff12_records/SupNameStart.h" -#include "../../XlsbFormat/Biff12_records/SupNameFmla.h" -#include "../../XlsbFormat/Biff12_records/SupNameBits.h" -#include "../../XlsbFormat/Biff12_unions/EXTERNTABLE.h" -#include "../../XlsbFormat/Biff12_records/ExternTableStart.h" -#include "../../XlsbFormat/Biff12_unions/EXTERNROW.h" -#include "../../XlsbFormat/Biff12_records/ExternRowHdr.h" -#include "../../XlsbFormat/Biff12_unions/EXTERNVALUE.h" -#include "../../XlsbFormat/Biff12_records/ExternValueMeta.h" -#include "../../XlsbFormat/Biff12_unions/EXTERNVALUEDATA.h" -#include "../../XlsbFormat/Biff12_records/ExternCell.h" -#include "../../XlsbFormat/Biff12_unions/DDEOLEITEM.h" -#include "../../XlsbFormat/Biff12_unions/DDEOLEITEMVALUES.h" -#include "../../XlsbFormat/Biff12_unions/DDEOLEITEMVALUE.h" -#include "../../XlsbFormat/Biff12_records/SupNameValueStart.h" -#include "../../XlsbFormat/Biff12_records/SupName.h" - namespace OOX { namespace Spreadsheet @@ -76,61 +49,16 @@ namespace OOX virtual ~CExternalSheetNames() { } - - public: - virtual void fromXML(XmlUtils::CXmlNode& oNode) { - // TO DO: Реализовать } - virtual void fromXML(XmlUtils::CXmlLiteReader& oReader) - { - if ( oReader.IsEmptyNode() ) - return; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual std::wstring toXML() const; - int nCurDepth = oReader.GetDepth(); - while( oReader.ReadNextSiblingNode( nCurDepth ) ) - { - std::wstring sName = oReader.GetName(); - if (L"sheetName" == sName) - { - m_arrItems.push_back(new ComplexTypes::Spreadsheet::String(oReader)); - } - } - } - virtual void toXML(NSStringUtils::CStringBuilder& writer) const - { - writer.WriteString(L""); - for (size_t i = 0; i < m_arrItems.size(); ++i) - { - if (m_arrItems[i]) - { - writer.WriteString(L"ToString2()); - writer.WriteString(L"/>"); - } - } - writer.WriteString(L""); - } - virtual std::wstring toXML() const - { - NSStringUtils::CStringBuilder writer; - toXML(writer); - return writer.GetData().c_str(); - } - void fromBin(XLS::BaseObjectPtr& obj) - { - auto ptr = static_cast(obj.get()); - if(ptr != nullptr) - { - for(auto &item : ptr->sheetNames) - { - auto str = new ComplexTypes::Spreadsheet::String; - str->m_sVal = item.value(); - m_arrItems.push_back(str); - } - } - } + void fromBin(XLS::BaseObjectPtr& obj); + virtual EElementType getType() const { return et_x_ExternalSheetNames; @@ -148,79 +76,23 @@ namespace OOX virtual ~CExternalDefinedName() { } - - public: - virtual void fromXML(XmlUtils::CXmlNode& oNode) { - // TO DO: Реализовать } - virtual void fromXML(XmlUtils::CXmlLiteReader& oReader) - { - ReadAttributes( oReader ); + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual std::wstring toXML() const; + + void fromBin(XLS::BaseObjectPtr& obj); - if ( !oReader.IsEmptyNode() ) - oReader.ReadTillEnd(); - } - virtual void toXML(NSStringUtils::CStringBuilder& writer) const - { - writer.WriteString(L"GetValue()); - writer.WriteString(L"/>"); - } - virtual std::wstring toXML() const - { - NSStringUtils::CStringBuilder writer; - toXML(writer); - return writer.GetData().c_str(); - } - void fromBin(XLS::BaseObjectPtr& obj) - { - ReadAttributes(obj); - } virtual EElementType getType() const { return et_x_ExternalDefinedName; } - void ReadAttributes(XLS::BaseObjectPtr& obj) - { - auto ptr = static_cast(obj.get()); - if(ptr != nullptr) - { - auto ptrSupNameStart = static_cast(ptr->m_BrtSupNameStart.get()); - if(ptrSupNameStart != nullptr) - { - if(!ptrSupNameStart->name.value().empty()) - m_oName = ptrSupNameStart->name.value(); - } + void ReadAttributes(XLS::BaseObjectPtr& obj); + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); - auto ptrSupNameFmla = static_cast(ptr->m_BrtSupNameFmla.get()); - if(ptrSupNameFmla != nullptr) - { - auto ref = ptrSupNameFmla->fmla.getAssembledFormula(); - if(!ref.empty()) - m_oRefersTo = ref; - } - - auto ptrSupNameBits = static_cast(ptr->m_BrtSupNameBits.get()); - if(ptrSupNameBits != nullptr) - { - m_oSheetId = ptrSupNameBits->contentsExtName.iSheet; - } - - } - } - void ReadAttributes(XmlUtils::CXmlLiteReader& oReader) - { - WritingElement_ReadAttributes_Start( oReader ) - WritingElement_ReadAttributes_Read_if( oReader, (L"name"), m_oName ) - WritingElement_ReadAttributes_Read_else_if( oReader, (L"refersTo"), m_oRefersTo ) - WritingElement_ReadAttributes_Read_else_if( oReader, (L"sheetId"), m_oSheetId ) - WritingElement_ReadAttributes_End( oReader ) - } - public: nullable m_oName; nullable m_oRefersTo; nullable m_oSheetId; @@ -237,53 +109,13 @@ namespace OOX virtual ~CExternalDefinedNames() { } - - public: - virtual void fromXML(XmlUtils::CXmlNode& oNode) { - // TO DO: Реализовать } - virtual void fromXML(XmlUtils::CXmlLiteReader& oReader) - { - if ( oReader.IsEmptyNode() ) - return; - - int nCurDepth = oReader.GetDepth(); - while( oReader.ReadNextSiblingNode( nCurDepth ) ) - { - std::wstring sName = oReader.GetName(); - if (L"definedName" == sName) - { - m_arrItems.push_back(new CExternalDefinedName(oReader)); - } - } - } - virtual void toXML(NSStringUtils::CStringBuilder& writer) const - { - writer.WriteString(L""); - for ( size_t i = 0; i < m_arrItems.size(); ++i) - { - if ( m_arrItems[i] ) - { - m_arrItems[i]->toXML(writer); - } - } - writer.WriteString(L""); - } - virtual std::wstring toXML() const - { - NSStringUtils::CStringBuilder writer; - toXML(writer); - return writer.GetData().c_str(); - } - void fromBin(std::vector& obj) - { - for(auto &item : obj) - { - m_arrItems.push_back(new CExternalDefinedName(item)); - } - } + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual std::wstring toXML() const; + void fromBin(std::vector& obj); virtual EElementType getType() const { return et_x_ExternalDefinedNames; @@ -301,142 +133,22 @@ namespace OOX virtual ~CExternalCell() { } - - public: - virtual void fromXML(XmlUtils::CXmlNode& oNode) { - // TO DO: Реализовать } - virtual void fromXML(XmlUtils::CXmlLiteReader& oReader) - { - ReadAttributes(oReader); + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual std::wstring toXML() const; - if ( oReader.IsEmptyNode() ) - return; + void fromBin(XLS::BaseObjectPtr& obj); - int nCurDepth = oReader.GetDepth(); - while( oReader.ReadNextSiblingNode( nCurDepth ) ) - { - std::wstring sName = oReader.GetName(); - if (L"v" == sName) - { - m_oValue = oReader; - } - } - } - virtual void toXML(NSStringUtils::CStringBuilder& writer) const - { - writer.WriteString(L"ToString()); - WritingStringNullableAttrInt(L"vm", m_oValueMetadata, m_oValueMetadata->GetValue()); - writer.WriteString(L">"); - if(m_oValue.IsInit()) - m_oValue->toXML2(writer, (L"v")); - writer.WriteString(L""); - } - virtual std::wstring toXML() const - { - NSStringUtils::CStringBuilder writer; - toXML(writer); - return writer.GetData().c_str(); - } - void fromBin(XLS::BaseObjectPtr& obj) - { - ReadAttributes(obj); - } virtual EElementType getType() const { return et_x_ExternalCell; } - void ReadAttributes(XLS::BaseObjectPtr& obj) - { - auto ptr = static_cast(obj.get()); - if(ptr != nullptr) - { - auto ptrExternValueMeta = static_cast(ptr->m_BrtExternValueMeta.get()); - if(ptrExternValueMeta != nullptr) - { - m_oValueMetadata = ptrExternValueMeta->ivmb; - } - - auto ptrEXTERNVALUEDATA = static_cast(ptr->m_EXTERNVALUEDATA.get()); - if(ptrEXTERNVALUEDATA != nullptr) - { - if(!ptrEXTERNVALUEDATA->m_Ref.empty()) - m_oRef = ptrEXTERNVALUEDATA->m_Ref; - - if(ptrEXTERNVALUEDATA->m_source != nullptr) - { - auto pSource = static_cast(ptrEXTERNVALUEDATA->m_source.get()); - auto nType = pSource->getTypeId(); - switch (nType) - { - case XLSB::rt_ExternCellBlank: - break; - case XLSB::rt_ExternCellReal: - { - auto pRealNum = reinterpret_cast(pSource)->value.data.value; - m_oType.Init(); - m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeDate); - m_oValue.Init(); - m_oValue->m_sText = OOX::Spreadsheet::SpreadsheetCommon::WriteDouble(pRealNum); - } - break; - case XLSB::rt_ExternCellBool: - { - auto pBool = reinterpret_cast(pSource)->value; - m_oType.Init(); - m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeBool); - m_oValue.Init(); - m_oValue->m_sText = pBool ? L"1" : L"0"; - } - break; - case XLSB::rt_ExternCellError: - { - auto pError = reinterpret_cast(pSource)->value; - m_oType.Init(); - m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeError); - m_oValue.Init(); - switch(pError) - { - case 0x00: m_oValue->m_sText = L"#NULL!"; break; - case 0x07: m_oValue->m_sText = L"#DIV/0!"; break; - case 0x0F: m_oValue->m_sText = L"#VALUE!"; break; - case 0x17: m_oValue->m_sText = L"#REF!"; break; - case 0x1D: m_oValue->m_sText = L"#NAME?"; break; - case 0x24: m_oValue->m_sText = L"#NUM!"; break; - case 0x2A: m_oValue->m_sText = L"#N/A"; break; - case 0x2B: m_oValue->m_sText = L"#GETTING_DATA"; break; - } - } - break; - case XLSB::rt_ExternCellString: - { - auto pSt = reinterpret_cast(pSource)->value.value(); - m_oType.Init(); - m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeInlineStr); - m_oValue.Init(); - m_oValue->m_sText = pSt; - } - break; - } - } - - } - - } - } - void ReadAttributes(XmlUtils::CXmlLiteReader& oReader) - { - WritingElement_ReadAttributes_Start( oReader ) - WritingElement_ReadAttributes_Read_if( oReader, (L"r"), m_oRef ) - WritingElement_ReadAttributes_Read_else_if( oReader, (L"t"), m_oType ) - WritingElement_ReadAttributes_Read_else_if( oReader, (L"vm"), m_oValueMetadata ) - WritingElement_ReadAttributes_End( oReader ) - } - public: + void ReadAttributes(XLS::BaseObjectPtr& obj); + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + nullable m_oRef; nullable m_oType; nullable m_oValueMetadata; @@ -455,82 +167,22 @@ namespace OOX virtual ~CExternalRow() { } - - public: - virtual void fromXML(XmlUtils::CXmlNode& oNode) { - // TO DO: Реализовать } - virtual void fromXML(XmlUtils::CXmlLiteReader& oReader) - { - ReadAttributes(oReader); + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual std::wstring toXML() const; - if ( oReader.IsEmptyNode() ) - return; + void fromBin(XLS::BaseObjectPtr& obj); - int nCurDepth = oReader.GetDepth(); - while( oReader.ReadNextSiblingNode( nCurDepth ) ) - { - std::wstring sName = oReader.GetName(); - if (L"cell" == sName) - { - m_arrItems.push_back(new CExternalCell(oReader)); - } - } - } - virtual void toXML(NSStringUtils::CStringBuilder& writer) const - { - writer.WriteString(L"GetValue()); - writer.WriteString(L">"); - - for ( size_t i = 0; i < m_arrItems.size(); ++i) - { - if ( m_arrItems[i] ) - { - m_arrItems[i]->toXML(writer); - } - } - - writer.WriteString(L""); - } - virtual std::wstring toXML() const - { - NSStringUtils::CStringBuilder writer; - toXML(writer); - return writer.GetData().c_str(); - } - void fromBin(XLS::BaseObjectPtr& obj) - { - ReadAttributes(obj); - } virtual EElementType getType() const { return et_x_ExternalRow; } - void ReadAttributes(XLS::BaseObjectPtr& obj) - { - auto ptr = static_cast(obj.get()); - if(ptr != nullptr) - { - auto ptrExternRowHdr = static_cast(ptr->m_BrtExternRowHdr.get()); - if(ptrExternRowHdr != nullptr) - { - m_oR = ptrExternRowHdr->rw; - } + void ReadAttributes(XLS::BaseObjectPtr& obj); + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); - for(auto &item : ptr->m_arEXTERNVALUE) - m_arrItems.push_back(new CExternalCell(item)); - } - } - void ReadAttributes(XmlUtils::CXmlLiteReader& oReader) - { - WritingElement_ReadAttributes_Start( oReader ) - WritingElement_ReadAttributes_ReadSingle( oReader, (L"r"), m_oR ) - WritingElement_ReadAttributes_End( oReader ) - } - public: nullable m_oR; }; @@ -545,86 +197,22 @@ namespace OOX virtual ~CExternalSheetData() { } - - public: - virtual void fromXML(XmlUtils::CXmlNode& oNode) { - // TO DO: Реализовать } - virtual void fromXML(XmlUtils::CXmlLiteReader& oReader) - { - ReadAttributes(oReader); + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual std::wstring toXML() const; - if ( oReader.IsEmptyNode() ) - return; + void fromBin(XLS::BaseObjectPtr& obj); - int nCurDepth = oReader.GetDepth(); - while( oReader.ReadNextSiblingNode( nCurDepth ) ) - { - std::wstring sName = oReader.GetName(); - if (L"row" == sName) - { - m_arrItems.push_back(new CExternalRow(oReader)); - } - } - } - virtual void toXML(NSStringUtils::CStringBuilder& writer) const - { - writer.WriteString(L"GetValue()); - WritingStringNullableAttrBool(L"refreshError", m_oRefreshError); - writer.WriteString(L">"); - - for ( size_t i = 0; i < m_arrItems.size(); ++i) - { - if ( m_arrItems[i] ) - { - m_arrItems[i]->toXML(writer); - } - } - - writer.WriteString(L""); - } - virtual std::wstring toXML() const - { - NSStringUtils::CStringBuilder writer; - toXML(writer); - return writer.GetData().c_str(); - } - void fromBin(XLS::BaseObjectPtr& obj) - { - ReadAttributes(obj); - } virtual EElementType getType() const { return et_x_ExternalSheetData; } - void ReadAttributes(XLS::BaseObjectPtr& obj) - { - auto ptr = static_cast(obj.get()); - if(ptr != nullptr) - { - auto ptrExternTableStart = static_cast(ptr->m_BrtExternTableStart.get()); - if(ptrExternTableStart != nullptr) - { - m_oSheetId = ptrExternTableStart->iTab; - m_oRefreshError = ptrExternTableStart->fRefreshError; - } + void ReadAttributes(XLS::BaseObjectPtr& obj); + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); - for(auto &item : ptr->m_arEXTERNROW) - m_arrItems.push_back(new CExternalRow(item)); - } - } - void ReadAttributes(XmlUtils::CXmlLiteReader& oReader) - { - WritingElement_ReadAttributes_Start( oReader ) - WritingElement_ReadAttributes_Read_if( oReader, (L"sheetId"), m_oSheetId ) - WritingElement_ReadAttributes_Read_else_if( oReader, (L"refreshError"), m_oRefreshError ) - WritingElement_ReadAttributes_End( oReader ) - } - - public: nullable m_oSheetId; nullable m_oRefreshError; }; @@ -640,53 +228,15 @@ namespace OOX virtual ~CExternalSheetDataSet() { } - - public: - virtual void fromXML(XmlUtils::CXmlNode& oNode) { - // TO DO: Реализовать } - virtual void fromXML(XmlUtils::CXmlLiteReader& oReader) - { - if ( oReader.IsEmptyNode() ) - return; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual std::wstring toXML() const; + + void fromBin(std::vector& obj); - int nCurDepth = oReader.GetDepth(); - while( oReader.ReadNextSiblingNode( nCurDepth ) ) - { - std::wstring sName = oReader.GetName(); - if (L"sheetData" == sName) - { - m_arrItems.push_back(new CExternalSheetData(oReader)); - } - } - } - virtual void toXML(NSStringUtils::CStringBuilder& writer) const - { - writer.WriteString(L""); - for ( size_t i = 0; i < m_arrItems.size(); ++i) - { - if ( m_arrItems[i] ) - { - m_arrItems[i]->toXML(writer); - } - } - writer.WriteString(L""); - } - virtual std::wstring toXML() const - { - NSStringUtils::CStringBuilder writer; - toXML(writer); - return writer.GetData().c_str(); - } - void fromBin(std::vector& obj) - { - for(auto &item : obj) - { - m_arrItems.push_back(new CExternalSheetData(item)); - } - } virtual EElementType getType() const { return et_x_ExternalSheetDataSet; @@ -704,108 +254,21 @@ namespace OOX virtual ~CExternalBook() { } - - public: - virtual void fromXML(XmlUtils::CXmlNode& oNode) { - // TO DO: Реализовать } - virtual void fromXML(XmlUtils::CXmlLiteReader& oReader) - { - ReadAttributes(oReader); - - if ( oReader.IsEmptyNode() ) - return; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual std::wstring toXML() const; - int nCurDepth = oReader.GetDepth(); - while( oReader.ReadNextSiblingNode( nCurDepth ) ) - { - std::wstring sName = oReader.GetName(); + void fromBin(XLS::BaseObjectPtr& obj); - if (L"sheetNames" == sName) - { - m_oSheetNames = oReader; - } - else if (L"definedNames" == sName) - { - m_oDefinedNames = oReader; - } - else if (L"sheetDataSet" == sName) - { - m_oSheetDataSet = oReader; - } - } - } - virtual void toXML(NSStringUtils::CStringBuilder& writer) const - { - writer.WriteString(L"ToString()); - writer.WriteString(L"\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\""); - } - writer.WriteString(L">"); - if (m_oSheetNames.IsInit()) - { - m_oSheetNames->toXML(writer); - } - if (m_oDefinedNames.IsInit()) - { - m_oDefinedNames->toXML(writer); - } - if (m_oSheetDataSet.IsInit()) - { - m_oSheetDataSet->toXML(writer); - } - writer.WriteString(L""); - } - virtual std::wstring toXML() const - { - NSStringUtils::CStringBuilder writer; - toXML(writer); - return writer.GetData().c_str(); - } - void fromBin(XLS::BaseObjectPtr& obj) - { - auto ptr = static_cast(obj.get()); - if(ptr != nullptr) - { - ReadAttributes(ptr->m_BrtBeginSupBook); - - auto ptr1 = static_cast(ptr->m_EXTERNALBOOK.get()); - if(ptr1 != nullptr) - { - if(ptr1->m_BrtSupTabs != nullptr) - m_oSheetNames = ptr1->m_BrtSupTabs; - if(!ptr1->m_arEXTERNNAME.empty()) - m_oDefinedNames = ptr1->m_arEXTERNNAME; - if(!ptr1->m_arEXTERNTABLE.empty()) - m_oSheetDataSet = ptr1->m_arEXTERNTABLE; - } - } - } virtual EElementType getType() const { return et_x_ExternalBook; } - void ReadAttributes(XLS::BaseObjectPtr& obj) - { - auto ptr = static_cast(obj.get()); - if(ptr != nullptr) - { - if(!ptr->string1.empty()) - m_oRid = ptr->string1; - } - } - void ReadAttributes(XmlUtils::CXmlLiteReader& oReader) - { - WritingElement_ReadAttributes_Start_No_NS( oReader ) - WritingElement_ReadAttributes_ReadSingle( oReader, L"id", m_oRid ) - WritingElement_ReadAttributes_End_No_NS( oReader ) - } - public: + void ReadAttributes(XLS::BaseObjectPtr& obj); + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); nullable m_oRid; @@ -827,142 +290,20 @@ namespace OOX } virtual void fromXML(XmlUtils::CXmlNode& oNode) { - // TO DO: Реализовать } - virtual void fromXML(XmlUtils::CXmlLiteReader& oReader) - { - ReadAttributes(oReader); + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual std::wstring toXML() const; - if ( oReader.IsEmptyNode() ) - return; + void fromBin(XLS::BaseObjectPtr& obj); - int nCurDepth = oReader.GetDepth(); - while( oReader.ReadNextSiblingNode( nCurDepth ) ) - { - std::wstring sName = oReader.GetName(); - - if (L"val" == sName) - { - m_arrItems.push_back(new CText(oReader)); - } - } - } - virtual void toXML(NSStringUtils::CStringBuilder& writer) const - { - writer.WriteString(L"ToString()); - writer.WriteString(L">"); - - for ( size_t i = 0; i < m_arrItems.size(); ++i) - { - if ( m_arrItems[i] ) - { - m_arrItems[i]->toXML2(writer, L"val"); - } - } - writer.WriteString(L""); - } - virtual std::wstring toXML() const - { - NSStringUtils::CStringBuilder writer; - toXML(writer); - return writer.GetData().c_str(); - } - void fromBin(XLS::BaseObjectPtr& obj) - { - ReadAttributes(obj); - } virtual EElementType getType() const { return et_x_DdeValue; } - void ReadAttributes(XLS::BaseObjectPtr& obj) - { - auto ptr = static_cast(obj.get()); - if(ptr != nullptr) - { + void ReadAttributes(XLS::BaseObjectPtr& obj); - if(ptr->m_source != nullptr) - { - auto pSource = static_cast(ptr->m_source.get()); - auto nType = pSource->getTypeId(); - switch (nType) - { - case XLSB::rt_SupNameNum: - { - auto pRealNum = reinterpret_cast(pSource)->value.data.value; - m_oType.Init(); - m_oType->SetValue(SimpleTypes::Spreadsheet::EDdeValueType::ddevaluetypeN); - - auto text = new CText(); - std::wstring val = OOX::Spreadsheet::SpreadsheetCommon::WriteDouble(pRealNum); - text->fromBin(val); - m_arrItems.push_back(text); - } - break; - case XLSB::rt_SupNameBool: - { - auto pBool = reinterpret_cast(pSource)->value; - m_oType.Init(); - m_oType->SetValue(SimpleTypes::Spreadsheet::EDdeValueType::ddevaluetypeB); - - auto text = new CText(); - std::wstring val = pBool ? L"1" : L"0"; - text->fromBin(val); - m_arrItems.push_back(text); - } - break; - case XLSB::rt_SupNameErr: - { - auto pError = reinterpret_cast(pSource)->value; - m_oType.Init(); - m_oType->SetValue(SimpleTypes::Spreadsheet::EDdeValueType::ddevaluetypeE); - - auto text = new CText(); - std::wstring val; - switch(pError) - { - case 0x00: val = L"#NULL!"; break; - case 0x07: val = L"#DIV/0!"; break; - case 0x0F: val = L"#VALUE!"; break; - case 0x17: val = L"#REF!"; break; - case 0x1D: val = L"#NAME?"; break; - case 0x24: val = L"#NUM!"; break; - case 0x2A: val = L"#N/A"; break; - case 0x2B: val = L"#GETTING_DATA"; break; - } - text->fromBin(val); - m_arrItems.push_back(text); - } - break; - case XLSB::rt_SupNameSt: - { - auto pSt = reinterpret_cast(pSource)->value.value(); - m_oType.Init(); - m_oType->SetValue(SimpleTypes::Spreadsheet::EDdeValueType::ddevaluetypeStr); - - auto text = new CText(); - text->fromBin(pSt); - m_arrItems.push_back(text); - } - break; - case XLSB::rt_SupNameNil: - { - m_oType.Init(); - m_oType->SetValue(SimpleTypes::Spreadsheet::EDdeValueType::ddevaluetypeNil);; - } - break; - } - } - } - } - void ReadAttributes(XmlUtils::CXmlLiteReader& oReader) - { - WritingElement_ReadAttributes_Start( oReader ) - WritingElement_ReadAttributes_ReadSingle( oReader, (L"t"), m_oType ) - WritingElement_ReadAttributes_End( oReader ) - } - public: + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); nullable m_oType; }; @@ -977,85 +318,22 @@ namespace OOX virtual ~CDdeValues() { } - - public: - virtual void fromXML(XmlUtils::CXmlNode& oNode) { - // TO DO: Реализовать } - virtual void fromXML(XmlUtils::CXmlLiteReader& oReader) - { - ReadAttributes(oReader); + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; - if ( oReader.IsEmptyNode() ) - return; + virtual std::wstring toXML() const; - int nCurDepth = oReader.GetDepth(); - while( oReader.ReadNextSiblingNode( nCurDepth ) ) - { - std::wstring sName = oReader.GetName(); - - if (L"value" == sName) - { - m_arrItems.push_back(new CDdeValue(oReader)); - } - } - } - virtual void toXML(NSStringUtils::CStringBuilder& writer) const - { - writer.WriteString(L"GetValue()); - WritingStringNullableAttrInt(L"cols", m_oCols, m_oCols->GetValue()); - writer.WriteString(L">"); - - for ( size_t i = 0; i < m_arrItems.size(); ++i) - { - if ( m_arrItems[i] ) - { - m_arrItems[i]->toXML(writer); - } - } - writer.WriteString(L""); - } - virtual std::wstring toXML() const - { - NSStringUtils::CStringBuilder writer; - toXML(writer); - return writer.GetData().c_str(); - } - void fromBin(XLS::BaseObjectPtr& obj) - { - auto ptr = static_cast(obj.get()); - if(ptr != nullptr) - { - ReadAttributes(ptr->m_BrtSupNameValueStart); - - for(auto &item : ptr->m_arDDEOLEITEMVALUE) - m_arrItems.push_back(new CDdeValue(item)); - } - } + void fromBin(XLS::BaseObjectPtr& obj); virtual EElementType getType() const { return et_x_DdeValues; } - void ReadAttributes(XLS::BaseObjectPtr& obj) - { - auto ptr = static_cast(obj.get()); - if(ptr != nullptr) - { - m_oRows = ptr->cRw; - m_oCols = ptr->cCol; - } - } - void ReadAttributes(XmlUtils::CXmlLiteReader& oReader) - { - WritingElement_ReadAttributes_Start( oReader ) - WritingElement_ReadAttributes_Read_if( oReader, (L"rows"), m_oRows ) - WritingElement_ReadAttributes_Read_else_if( oReader, (L"cols"), m_oCols ) - WritingElement_ReadAttributes_End( oReader ) - } - public: + void ReadAttributes(XLS::BaseObjectPtr& obj); + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + nullable m_oRows; nullable m_oCols; }; @@ -1071,94 +349,23 @@ namespace OOX virtual ~CDdeItem() { } - - public: - virtual void fromXML(XmlUtils::CXmlNode& oNode) { - // TO DO: Реализовать } - virtual void fromXML(XmlUtils::CXmlLiteReader& oReader) - { - ReadAttributes(oReader); + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual std::wstring toXML() const; - if ( oReader.IsEmptyNode() ) - return; + void fromBin(XLS::BaseObjectPtr& obj); - int nCurDepth = oReader.GetDepth(); - while( oReader.ReadNextSiblingNode( nCurDepth ) ) - { - std::wstring sName = oReader.GetName(); - - if (L"values" == sName) - { - m_oDdeValues = oReader; - } - } - } - virtual void toXML(NSStringUtils::CStringBuilder& writer) const - { - writer.WriteString(L""); - if (m_oDdeValues.IsInit()) - { - m_oDdeValues->toXML(writer); - } - writer.WriteString(L""); - } - virtual std::wstring toXML() const - { - NSStringUtils::CStringBuilder writer; - toXML(writer); - return writer.GetData().c_str(); - } - void fromBin(XLS::BaseObjectPtr& obj) - { - ReadAttributes(obj); - } virtual EElementType getType() const { return et_x_OleItem; } - void ReadAttributes(XLS::BaseObjectPtr& obj) - { - auto ptr = static_cast(obj.get()); - if(ptr != nullptr) - { - if(ptr->m_DDEOLEITEMVALUES != nullptr) - m_oDdeValues = ptr->m_DDEOLEITEMVALUES; + void ReadAttributes(XLS::BaseObjectPtr& obj); - auto ptrSupNameStart = static_cast(ptr->m_BrtSupNameStart.get()); - if(ptrSupNameStart != nullptr) - { - if(!ptrSupNameStart->name.value().empty()) - m_oName = ptrSupNameStart->name.value(); - } + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); - auto ptrSupNameBits = static_cast(ptr->m_BrtSupNameBits.get()); - if(ptrSupNameBits != nullptr) - { - m_oOle = ptrSupNameBits->contentsDDE.fOLE; - m_oAdvise = ptrSupNameBits->contentsDDE.fWantAdvise; - m_oPreferPic = ptrSupNameBits->contentsDDE.fWantPict; - } - } - } - void ReadAttributes(XmlUtils::CXmlLiteReader& oReader) - { - WritingElement_ReadAttributes_Start( oReader ) - WritingElement_ReadAttributes_Read_if( oReader, (L"name"), m_oName ) - WritingElement_ReadAttributes_Read_else_if( oReader, (L"ole"), m_oOle ) - WritingElement_ReadAttributes_Read_else_if( oReader, (L"advise"), m_oAdvise ) - WritingElement_ReadAttributes_Read_else_if( oReader, (L"preferPic"), m_oPreferPic ) - WritingElement_ReadAttributes_End( oReader ) - } - - public: nullable m_oName; nullable m_oOle; nullable m_oAdvise; @@ -1180,51 +387,13 @@ namespace OOX } virtual void fromXML(XmlUtils::CXmlNode& oNode) { - // TO DO: Реализовать } - virtual void fromXML(XmlUtils::CXmlLiteReader& oReader) - { - if ( oReader.IsEmptyNode() ) - return; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); - int nCurDepth = oReader.GetDepth(); - while( oReader.ReadNextSiblingNode( nCurDepth ) ) - { - std::wstring sName = oReader.GetName(); + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual std::wstring toXML() const; - if (L"ddeItem" == sName) - { - m_arrItems.push_back(new CDdeItem(oReader)); - } - } - } - virtual void toXML(NSStringUtils::CStringBuilder& writer) const - { - writer.WriteString(L""); - for ( size_t i = 0; i < m_arrItems.size(); ++i) - { - if ( m_arrItems[i] ) - { - m_arrItems[i]->toXML(writer); - } - } - writer.WriteString(L""); - } - virtual std::wstring toXML() const - { - NSStringUtils::CStringBuilder writer; - toXML(writer); - return writer.GetData().c_str(); - } - void fromBin(XLS::BaseObjectPtr& obj) - { - auto ptr = static_cast(obj.get()); - if(ptr != nullptr) - { - for(auto &item : ptr->m_arDDEOLEITEM) - m_arrItems.push_back(new CDdeItem(item)); - } - } + void fromBin(XLS::BaseObjectPtr& obj); virtual EElementType getType() const { return et_x_DdeItems; @@ -1242,83 +411,23 @@ namespace OOX virtual ~CDdeLink() { } - - public: - virtual void fromXML(XmlUtils::CXmlNode& oNode) { - // TO DO: Реализовать } - virtual void fromXML(XmlUtils::CXmlLiteReader& oReader) - { - ReadAttributes(oReader); + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); - if ( oReader.IsEmptyNode() ) - return; + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; - int nCurDepth = oReader.GetDepth(); - while( oReader.ReadNextSiblingNode( nCurDepth ) ) - { - std::wstring sName = oReader.GetName(); + virtual std::wstring toXML() const; - if (L"ddeItems" == sName) - { - m_oDdeItems = oReader; - } - } - } - virtual void toXML(NSStringUtils::CStringBuilder& writer) const - { - writer.WriteString(L""); - if (m_oDdeItems.IsInit()) - { - m_oDdeItems->toXML(writer); - } - writer.WriteString(L""); - } - virtual std::wstring toXML() const - { - NSStringUtils::CStringBuilder writer; - toXML(writer); - return writer.GetData().c_str(); - } - void fromBin(XLS::BaseObjectPtr& obj) - { - auto ptr = static_cast(obj.get()); - if(ptr != nullptr) - { - ReadAttributes(ptr->m_BrtBeginSupBook); + void fromBin(XLS::BaseObjectPtr& obj); - if(ptr->m_DDEOLELINK != nullptr) - m_oDdeItems = ptr->m_DDEOLELINK; - } - } virtual EElementType getType() const { return et_x_DdeLink; } - void ReadAttributes(XLS::BaseObjectPtr& obj) - { - auto ptr = static_cast(obj.get()); - if(ptr != nullptr) - { - if(!ptr->string1.empty()) - m_oDdeService = ptr->string1; - if(!ptr->string2.empty()) - m_oDdeTopic = ptr->string2; - } - } - void ReadAttributes(XmlUtils::CXmlLiteReader& oReader) - { - WritingElement_ReadAttributes_Start( oReader ) - WritingElement_ReadAttributes_Read_if( oReader, (L"ddeService"), m_oDdeService ) - WritingElement_ReadAttributes_Read_else_if( oReader, (L"ddeTopic"), m_oDdeTopic ) - WritingElement_ReadAttributes_End( oReader ) - } - public: + void ReadAttributes(XLS::BaseObjectPtr& obj); + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); nullable m_oDdeService; nullable m_oDdeTopic; @@ -1337,75 +446,22 @@ namespace OOX virtual ~COleItem() { } - - public: - virtual void fromXML(XmlUtils::CXmlNode& oNode) { - // TO DO: Реализовать } - virtual void fromXML(XmlUtils::CXmlLiteReader& oReader) - { - ReadAttributes(oReader); + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual std::wstring toXML() const; + void fromBin(XLS::BaseObjectPtr& obj); - if ( !oReader.IsEmptyNode() ) - oReader.ReadTillEnd(); - } - virtual void toXML(NSStringUtils::CStringBuilder& writer) const - { - writer.WriteString(L""); - } - virtual std::wstring toXML() const - { - NSStringUtils::CStringBuilder writer; - toXML(writer); - return writer.GetData().c_str(); - } - void fromBin(XLS::BaseObjectPtr& obj) - { - ReadAttributes(obj); - } virtual EElementType getType() const { return et_x_OleItem; } - void ReadAttributes(XLS::BaseObjectPtr& obj) - { - auto ptr = static_cast(obj.get()); - if(ptr != nullptr) - { - auto ptrSupNameStart = static_cast(ptr->m_BrtSupNameStart.get()); - if(ptrSupNameStart != nullptr) - { - if(!ptrSupNameStart->name.value().empty()) - m_oName = ptrSupNameStart->name.value(); - } + void ReadAttributes(XLS::BaseObjectPtr& obj); + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); - auto ptrSupNameBits = static_cast(ptr->m_BrtSupNameBits.get()); - if(ptrSupNameBits != nullptr) - { - m_oIcon = ptrSupNameBits->contentsOLE.fIcon; - m_oAdvise = ptrSupNameBits->contentsOLE.fWantAdvise; - m_oPreferPic = ptrSupNameBits->contentsOLE.fWantPict; - } - } - } - void ReadAttributes(XmlUtils::CXmlLiteReader& oReader) - { - WritingElement_ReadAttributes_Start( oReader ) - WritingElement_ReadAttributes_Read_if( oReader, (L"name"), m_oName ) - WritingElement_ReadAttributes_Read_else_if( oReader, (L"icon"), m_oIcon ) - WritingElement_ReadAttributes_Read_else_if( oReader, (L"advise"), m_oAdvise ) - WritingElement_ReadAttributes_Read_else_if( oReader, (L"preferPic"), m_oPreferPic ) - WritingElement_ReadAttributes_End( oReader ) - } - - public: nullable m_oName; nullable m_oIcon; nullable m_oAdvise; @@ -1423,56 +479,13 @@ namespace OOX virtual ~COleItems() { } - - public: - virtual void fromXML(XmlUtils::CXmlNode& oNode) { - // TO DO: Реализовать } - virtual void fromXML(XmlUtils::CXmlLiteReader& oReader) - { - if ( oReader.IsEmptyNode() ) - return; - - int nCurDepth = oReader.GetDepth(); - while( oReader.ReadNextSiblingNode( nCurDepth ) ) - { - std::wstring sName = oReader.GetName(); - - if (L"oleItem" == sName) - { - m_arrItems.push_back(new COleItem(oReader)); - } - } - } - virtual void toXML(NSStringUtils::CStringBuilder& writer) const - { - writer.WriteString(L""); - for ( size_t i = 0; i < m_arrItems.size(); ++i) - { - if ( m_arrItems[i] ) - { - m_arrItems[i]->toXML(writer); - } - } - writer.WriteString(L""); - } - virtual std::wstring toXML() const - { - NSStringUtils::CStringBuilder writer; - toXML(writer); - return writer.GetData().c_str(); - } - void fromBin(XLS::BaseObjectPtr& obj) - { - auto ptr = static_cast(obj.get()); - if(ptr != nullptr) - { - for(auto &item : ptr->m_arDDEOLEITEM) - m_arrItems.push_back(new COleItem(item)); - } - } + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual std::wstring toXML() const; + void fromBin(XLS::BaseObjectPtr& obj); virtual EElementType getType() const { return et_x_OleItems; @@ -1490,83 +503,20 @@ namespace OOX virtual ~COleLink() { } - - public: - virtual void fromXML(XmlUtils::CXmlNode& oNode) { - // TO DO: Реализовать } - virtual void fromXML(XmlUtils::CXmlLiteReader& oReader) - { - ReadAttributes(oReader); + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual std::wstring toXML() const; - if ( oReader.IsEmptyNode() ) - return; - - int nCurDepth = oReader.GetDepth(); - while( oReader.ReadNextSiblingNode( nCurDepth ) ) - { - std::wstring sName = oReader.GetName(); - - if (L"oleItems" == sName) - { - m_oOleItems = oReader; - } - } - } - virtual void toXML(NSStringUtils::CStringBuilder& writer) const - { - writer.WriteString(L"ToString()); - WritingStringNullableAttrEncodeXmlString(L"progId", m_oProgId, m_oProgId.get()); - writer.WriteString(L">"); - if (m_oOleItems.IsInit()) - { - m_oOleItems->toXML(writer); - } - writer.WriteString(L""); - } - virtual std::wstring toXML() const - { - NSStringUtils::CStringBuilder writer; - toXML(writer); - return writer.GetData().c_str(); - } - void fromBin(XLS::BaseObjectPtr& obj) - { - auto ptr = static_cast(obj.get()); - if(ptr != nullptr) - { - ReadAttributes(ptr->m_BrtBeginSupBook); - - if(ptr->m_DDEOLELINK != nullptr) - m_oOleItems = ptr->m_DDEOLELINK; - } - } + void fromBin(XLS::BaseObjectPtr& obj); virtual EElementType getType() const { return et_x_OleLink; } - void ReadAttributes(XLS::BaseObjectPtr& obj) - { - auto ptr = static_cast(obj.get()); - if(ptr != nullptr) - { - if(!ptr->string1.empty()) - m_oRid = ptr->string1; - if(!ptr->string2.empty()) - m_oProgId = ptr->string2; - } - } - void ReadAttributes(XmlUtils::CXmlLiteReader& oReader) - { - WritingElement_ReadAttributes_Start( oReader ) - WritingElement_ReadAttributes_Read_if( oReader, (L"r:id"), m_oRid ) - WritingElement_ReadAttributes_Read_else_if( oReader, (L"relationships:id"), m_oRid ) - WritingElement_ReadAttributes_Read_else_if( oReader, (L"progId"), m_oProgId ) - WritingElement_ReadAttributes_End( oReader ) - } + void ReadAttributes(XLS::BaseObjectPtr& obj); + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); nullable m_oRid; nullable m_oProgId; @@ -1577,141 +527,14 @@ namespace OOX class CExternalLink : public OOX::FileGlobalEnumerated, public OOX::IFileContainer { public: - CExternalLink(OOX::Document* pMain) : OOX::FileGlobalEnumerated(pMain), OOX::IFileContainer(pMain) - { - m_bSpreadsheets = true; - } - CExternalLink(OOX::Document* pMain, const CPath& oRootPath, const CPath& oPath, const std::wstring & rId) : OOX::FileGlobalEnumerated(pMain), OOX::IFileContainer(pMain) - { - m_bSpreadsheets = true; - m_rId = rId; - read( oRootPath, oPath ); - } - virtual ~CExternalLink() - { - } - void readBin(const CPath& oPath) - { - CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); - if (xlsb) - { - XLSB::ExternalLinkStreamPtr externalLinkStreamStream(new XLSB::ExternalLinkStream); + CExternalLink(OOX::Document* pMain); + CExternalLink(OOX::Document* pMain, const CPath& oRootPath, const CPath& oPath, const std::wstring & rId); + virtual ~CExternalLink(); - xlsb->ReadBin(oPath, externalLinkStreamStream.get()); - - externalLinkStreamStream->UpdateXti(xlsb->GetGlobalinfo(), m_rId); - - if (externalLinkStreamStream != nullptr) - { - if (externalLinkStreamStream->m_EXTERNALLINK != nullptr) - { - auto ptr = static_cast(externalLinkStreamStream->m_EXTERNALLINK.get()); - if(ptr != nullptr) - { - auto ptr1 = static_cast(ptr->m_BrtBeginSupBook.get()); - if(ptr1 != nullptr) - { - switch (ptr1->sbt.value().get()) - { - case XLSB::ExternalReferenceType::WORKBOOK: - m_oExternalBook = externalLinkStreamStream->m_EXTERNALLINK; - break; - case XLSB::ExternalReferenceType::DDE: - m_oDdeLink = externalLinkStreamStream->m_EXTERNALLINK; - break; - case XLSB::ExternalReferenceType::OLE: - m_oOleLink = externalLinkStreamStream->m_EXTERNALLINK; - break; - } - } - } - } - } - - //externalLinkStreamStream.reset(); - } - } - virtual void read(const CPath& oPath) - { - //don't use this. use read(const CPath& oRootPath, const CPath& oFilePath) - CPath oRootPath; - read(oRootPath, oPath); - } - virtual void read(const CPath& oRootPath, const CPath& oPath) - { - m_oReadPath = oPath; - IFileContainer::Read( oRootPath, oPath ); - - if( m_oReadPath.GetExtention() == _T(".bin")) - { - readBin(m_oReadPath); - return; - } - - XmlUtils::CXmlLiteReader oReader; - - if ( !oReader.FromFile( oPath.GetPath() ) ) - return; - - if ( !oReader.ReadNextNode() ) - return; - - std::wstring sName = XmlUtils::GetNameNoNS(oReader.GetName()); - if ( (L"externalLink") == sName ) - { - ReadAttributes( oReader ); - - if ( !oReader.IsEmptyNode() ) - { - int nStylesDepth = oReader.GetDepth(); - while ( oReader.ReadNextSiblingNode( nStylesDepth ) ) - { - sName = XmlUtils::GetNameNoNS(oReader.GetName()); - - if ( (L"externalBook") == sName ) - { - m_oExternalBook = oReader; - } - else if ( (L"oleLink") == sName ) - { - m_oOleLink = oReader; - } - else if ( (L"ddeLink") == sName ) - { - m_oDdeLink = oReader; - } - } - } - } - - } - virtual void write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const - { - NSStringUtils::CStringBuilder sXml; - sXml.WriteString((L"")); - sXml.WriteString((L"")); - - if (m_oExternalBook.IsInit()) - { - m_oExternalBook->toXML(sXml); - } - if (m_oOleLink.IsInit()) - { - m_oOleLink->toXML(sXml); - } - if (m_oDdeLink.IsInit()) - { - m_oDdeLink->toXML(sXml); - } - - sXml.WriteString((L"")); - - std::wstring sPath = oPath.GetPath(); - NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); - - oContent.Registration( type().OverrideType(), oDirectory, oPath.GetFilename() ); - IFileContainer::Write(oPath, oDirectory, oContent); - } + void readBin(const CPath& oPath); + virtual void read(const CPath& oPath); + virtual void read(const CPath& oRootPath, const CPath& oPath); + virtual void write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const; bool isValid() const { @@ -1737,6 +560,9 @@ namespace OOX nullable m_oExternalBook; nullable m_oOleLink; nullable m_oDdeLink; + + nullable_string m_oFileId; + nullable_string m_oPortalName; private: CPath m_oReadPath; std::wstring m_rId; @@ -1746,5 +572,3 @@ namespace OOX }; } //ExternalLink } // namespace OOX - -#endif // OOX_EXTERNALLINKS_FILE_INCLUDE_H_