/* * (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 "ExternalLinks.h" #include "../Common.h" #include "../SharedStrings/Text.h" #include "../ComplexTypes_Spreadsheet.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" #include "../../../MsBinaryFile/XlsFile/Format/Logic/GlobalWorkbookInfo.h" #include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BIFF12/CellRef.h" #include "../../Binary/XlsbFormat/FileTypes_SpreadsheetBin.h" #include namespace OOX { namespace Spreadsheet { CExternalSheetNames::CExternalSheetNames() { } CExternalSheetNames::~CExternalSheetNames() { } void CExternalSheetNames::fromXML(XmlUtils::CXmlNode& oNode) { } EElementType CExternalSheetNames::getType() const { return et_x_ExternalSheetNames; } 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(PPTX::CreatePtrXmlContent(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(); } XLS::BaseObjectPtr CExternalSheetNames::toBin() { XLSB::SupTabsPtr supTabs(new XLSB::SupTabs); for (auto& item : m_arrItems) { XLSB::XLWideString str = *item->m_sVal; supTabs->sheetNames.push_back(str); } return supTabs; } 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); } } } CExternalDefinedName::CExternalDefinedName() { } CExternalDefinedName::~CExternalDefinedName() { } void CExternalDefinedName::fromXML(XmlUtils::CXmlNode& oNode) { } EElementType CExternalDefinedName::getType() const { return et_x_ExternalDefinedName; } 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); } XLS::BaseObjectPtr CExternalDefinedName::toBin() { XLSB::ExternalReferenceType type; type = XLSB::ExternalReferenceType::WORKBOOK; auto ptr(new XLSB::EXTERNNAME(type)); XLS::BaseObjectPtr objectPtr(ptr); if(m_oName.IsInit()) { auto nameStart(new XLSB::SupNameStart); nameStart->name = m_oName.get(); ptr->m_BrtSupNameStart = XLS::BaseObjectPtr{nameStart}; } if(m_oRefersTo.IsInit()) { auto nameFmla(new XLSB::SupNameFmla); ptr->m_BrtSupNameFmla = XLS::BaseObjectPtr{nameFmla}; nameFmla->fmla = m_oRefersTo.get(); } if(m_oSheetId.IsInit()) { auto supBits(new XLSB::SupNameBits(type)); ptr->m_BrtSupNameBits = XLS::BaseObjectPtr{supBits}; supBits->sbt = 0x0000; supBits->contentsExtName.iSheet = m_oSheetId->GetValue(); supBits->contentsExtName.fBuiltIn = false; } return objectPtr; } 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) } CExternalDefinedNames::CExternalDefinedNames() { } CExternalDefinedNames::~CExternalDefinedNames() { } void CExternalDefinedNames::fromXML(XmlUtils::CXmlNode& oNode) { } EElementType CExternalDefinedNames::getType() const { return et_x_ExternalDefinedNames; } 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) { CExternalDefinedName* pExternalDefinedName = new CExternalDefinedName(); *pExternalDefinedName = oReader; m_arrItems.push_back(pExternalDefinedName); } } } 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)); } } std::vector CExternalDefinedNames::toBin() { std::vector objectVector; for(auto i:m_arrItems) { objectVector.push_back(i->toBin()); } return objectVector; } CExternalCell::CExternalCell() { } CExternalCell::~CExternalCell() { } void CExternalCell::fromXML(XmlUtils::CXmlNode& oNode) { } EElementType CExternalCell::getType() const { return et_x_ExternalCell; } 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()); WritingStringNullableAttrInt2(L"vm", m_oValueMetadata); 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(); } XLS::BaseObjectPtr CExternalCell::toBin() { auto ptr(new XLSB::EXTERNVALUE(0)); XLS::BaseObjectPtr objectPtr(ptr); if(m_oValueMetadata.IsInit()) { auto metaPtr(new XLSB::ExternValueMeta); ptr->m_BrtExternValueMeta = XLS::BaseObjectPtr{metaPtr}; metaPtr->ivmb = m_oValueMetadata.get(); } auto valuePtr(new XLSB::EXTERNVALUEDATA(0)); ptr->m_EXTERNVALUEDATA = XLS::BaseObjectPtr{valuePtr}; XLSB::RgceLoc loc; if(m_oRef.IsInit()) loc = XLSB::RgceLoc(m_oRef.get()); else loc = XLSB::RgceLoc(L"A1"); valuePtr->m_Col = loc.getColumn(); if(!m_oValue.IsInit()) { auto blanc(new XLSB::ExternCellBlank); blanc->col = valuePtr->m_Col; valuePtr->m_source = XLS::BaseObjectPtr{blanc}; return objectPtr; } if(!m_oType.IsInit()) { m_oType.Init(); m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeStr); } switch(m_oType->GetValue()) { case SimpleTypes::Spreadsheet::celltypeStr: { auto str(new XLSB::ExternCellString); str->col = valuePtr->m_Col; str->value = m_oValue->m_sText; valuePtr->m_source = XLS::BaseObjectPtr{str}; break; } case SimpleTypes::Spreadsheet::celltypeBool: { auto boolVal(new XLSB::ExternCellBool); boolVal->col = valuePtr->m_Col; boolVal->value = m_oValue->m_sText == L"1" ? true : false; valuePtr->m_source = XLS::BaseObjectPtr{boolVal}; break; } case SimpleTypes::Spreadsheet::celltypeNumber: { auto doubleVal(new XLSB::ExternCellReal); doubleVal->col = valuePtr->m_Col; doubleVal->value.data.value = std::stod(m_oValue->m_sText); valuePtr->m_source = XLS::BaseObjectPtr{doubleVal}; break; } case SimpleTypes::Spreadsheet::celltypeError: { auto errVal(new XLSB::ExternCellError); errVal->col = valuePtr->m_Col; if(m_oValue->m_sText == L"#NULL!") errVal->value = 0; else if(m_oValue->m_sText == L"#DIV/0!") errVal->value = 0x7; else if(m_oValue->m_sText == L"#VALUE!") errVal->value = 0xF; else if(m_oValue->m_sText == L"#REF!") errVal->value = 0x17; else if(m_oValue->m_sText == L"#NAME?") errVal->value = 0x1D; else if(m_oValue->m_sText == L"#NUM!") errVal->value = 0x24; else if(m_oValue->m_sText == L"#N/A") errVal->value = 0x2A; else if(m_oValue->m_sText == L"#GETTING_DATA") errVal->value = 0x2B; else errVal->value = 0x2A; valuePtr->m_source = XLS::BaseObjectPtr{errVal}; break; } default: { auto blanc(new XLSB::ExternCellBlank); blanc->col = valuePtr->m_Col; valuePtr->m_source = XLS::BaseObjectPtr{blanc}; } }; return objectPtr; } 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::celltypeNumber); 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::celltypeStr); 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) } CExternalRow::CExternalRow() { } CExternalRow::~CExternalRow() { } void CExternalRow::fromXML(XmlUtils::CXmlNode& oNode) { } EElementType CExternalRow::getType() const { return et_x_ExternalRow; } 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) { CExternalCell* pExternalCell = new CExternalCell(); *pExternalCell = oReader; m_arrItems.push_back(pExternalCell); } } } 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(); } XLS::BaseObjectPtr CExternalRow::toBin() { auto ptr(new XLSB::EXTERNROW); XLS::BaseObjectPtr objectPtr(ptr); auto ptr1(new XLSB::ExternRowHdr); ptr->m_BrtExternRowHdr = XLS::BaseObjectPtr{ptr1}; if(m_oR.IsInit() && m_oR->GetValue() > 0) { ptr1->rw = m_oR->GetValue() - 1; } else ptr1->rw = 0; for(auto i:m_arrItems) { ptr->m_arEXTERNVALUE.push_back(i->toBin()); } return objectPtr; } 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 + 1; } 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) } CExternalSheetData::CExternalSheetData() { } CExternalSheetData::~CExternalSheetData() { } void CExternalSheetData::fromXML(XmlUtils::CXmlNode& oNode) { } EElementType CExternalSheetData::getType() const { return et_x_ExternalSheetData; } 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) { CExternalRow* pExternalRow = new CExternalRow(); *pExternalRow = oReader; m_arrItems.push_back(pExternalRow); } } } 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(); } XLS::BaseObjectPtr CExternalSheetData::toBin() { auto ptr(new XLSB::EXTERNTABLE); XLS::BaseObjectPtr objectPtr(ptr); auto ptr1(new XLSB::ExternTableStart); ptr->m_BrtExternTableStart = XLS::BaseObjectPtr{ptr1}; if(m_oSheetId.IsInit()) ptr1->iTab = m_oSheetId->GetValue(); else ptr1->iTab = 0; if(m_oRefreshError.IsInit()) ptr1->fRefreshError = m_oRefreshError->GetValue(); else ptr1->fRefreshError = false; for(auto i:m_arrItems) { ptr->m_arEXTERNROW.push_back(i->toBin()); } return objectPtr; } 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) } CExternalSheetDataSet::CExternalSheetDataSet() { } CExternalSheetDataSet::~CExternalSheetDataSet() { } void CExternalSheetDataSet::fromXML(XmlUtils::CXmlNode& oNode) { } EElementType CExternalSheetDataSet::getType() const { return et_x_ExternalSheetDataSet; } 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) { CExternalSheetData* pExternalSheetData = new CExternalSheetData(); *pExternalSheetData = oReader; m_arrItems.push_back(pExternalSheetData); } } } 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)); } } std::vector CExternalSheetDataSet::toBin() { std::vector objectVector; for(auto i:m_arrItems) { objectVector.push_back(i->toBin()); } return objectVector; } CExternalBook::CExternalBook() { } CExternalBook::~CExternalBook() { } void CExternalBook::fromXML(XmlUtils::CXmlNode& oNode) { } EElementType CExternalBook::getType() const { return et_x_ExternalBook; } void CExternalBook::fromXML(XmlUtils::CXmlLiteReader& oReader) { ReadAttributes(oReader); if (oReader.IsEmptyNode()) return; int nCurDepth = oReader.GetDepth(); while (oReader.ReadNextSiblingNode(nCurDepth)) { std::wstring sName = oReader.GetNameNoNS(); if (L"sheetNames" == sName) { m_oSheetNames = oReader; } else if (L"definedNames" == sName) { m_oDefinedNames = oReader; } else if (L"sheetDataSet" == sName) { m_oSheetDataSet = oReader; } else if (L"alternateUrls" == sName) { m_oAlternateUrls = 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_oAlternateUrls.IsInit()) { m_oAlternateUrls ->toXML(writer); } 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(); } XLS::BaseObjectPtr CExternalBook::toBin() { XLSB::EXTERNALLINKPtr externalLINK(new XLSB::EXTERNALLINK()); auto beginSupbook(new XLSB::BeginSupBook); if(m_oRid.IsInit()) beginSupbook->string1 = m_oRid->GetValue(); else beginSupbook->string1 = L" "; beginSupbook->sbt = 0; externalLINK->m_BrtBeginSupBook = XLS::BaseObjectPtr{beginSupbook}; XLSB::ExternalReferenceType type; type = XLSB::ExternalReferenceType::WORKBOOK; XLSB::EXTERNALBOOKPtr externalBOOK(new XLSB::EXTERNALBOOK(type)); externalLINK->m_EXTERNALBOOK = externalBOOK; if (externalBOOK != nullptr) { if (m_oSheetNames.IsInit()) externalBOOK->m_BrtSupTabs = m_oSheetNames->toBin(); if(m_oDefinedNames.IsInit()) externalBOOK->m_arEXTERNNAME = m_oDefinedNames->toBin(); if(m_oSheetDataSet.IsInit()) externalBOOK->m_arEXTERNTABLE = m_oSheetDataSet->toBin(); } return externalLINK; } 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) } CDdeValue::CDdeValue() { } CDdeValue::~CDdeValue() { } void CDdeValue::fromXML(XmlUtils::CXmlNode& oNode) { } EElementType CDdeValue::getType() const { return et_x_DdeValue; } 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) { CText* pText = new CText(); *pText = oReader; m_arrItems.push_back(pText); } } } 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(); } XLS::BaseObjectPtr CDdeValue::toBin() { XLSB::DDEOLEITEMVALUEPtr ptr(new XLSB::DDEOLEITEMVALUE); if(!m_oType.IsInit()) return ptr; auto type = m_oType->GetValue(); switch(type) { case XLSB::rt_SupNameNum: { ptr->m_source = XLS::BaseObjectPtr{new XLSB::SupNameNum}; if(!m_arrItems.empty()) { auto castedSource = reinterpret_cast(ptr->m_source.get()); castedSource->value.data.value = std::stod(m_arrItems.back()->m_sText); m_arrItems.pop_back(); } } break; case XLSB::rt_SupNameBool: { ptr->m_source = XLS::BaseObjectPtr{new XLSB::SupNameBool}; if(!m_arrItems.empty()) { auto castedSource = reinterpret_cast(ptr->m_source.get()); castedSource->value = std::stoi(m_arrItems.back()->m_sText); m_arrItems.pop_back(); } } break; case XLSB::rt_SupNameErr: { ptr->m_source = XLS::BaseObjectPtr{new XLSB::SupNameErr}; if(!m_arrItems.empty()) { auto castedSource = reinterpret_cast(ptr->m_source.get()); auto error = m_arrItems.back()->m_sText.c_str(); if(error == L"#NULL!"){ castedSource->value = 0x00;} else if(error == L"#DIV/0!"){castedSource->value = 0x07;} else if(error == L"#VALUE!"){ castedSource->value = 0x0F;} else if(error == L"#REF!"){ castedSource->value = 0x17;} else if(error == L"#NAME?"){ castedSource->value = 0x1D;} else if(error == L"#NUM!"){castedSource->value = 0x24;} else if(error == L"#N/A"){castedSource->value = 0x2A;} else if(error == L"#GETTING_DATA"){castedSource->value = 0x2B;} m_arrItems.pop_back(); } } break; case XLSB::rt_SupNameSt: { ptr->m_source = XLS::BaseObjectPtr{new XLSB::SupNameSt}; if(!m_arrItems.empty()) { auto castedSource = reinterpret_cast(ptr->m_source.get()); castedSource->value = m_arrItems.back()->m_sText; m_arrItems.pop_back(); } } break; case XLSB::rt_SupNameNil: { ptr->m_source = XLS::BaseObjectPtr{new XLSB::SupNameNil}; } break; } return ptr; } 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) } CDdeValues::CDdeValues() { } CDdeValues::~CDdeValues() { } void CDdeValues::fromXML(XmlUtils::CXmlNode& oNode) { } EElementType CDdeValues::getType() const { return et_x_DdeValues; } 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) { CDdeValue* pDdeValue = new CDdeValue(); *pDdeValue = oReader; m_arrItems.push_back(pDdeValue); } } } 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)); } } XLS::BaseObjectPtr CDdeValues::toBin() { XLSB::DDEOLEITEMVALUESPtr ptr(new XLSB::DDEOLEITEMVALUES); auto castedPtr = static_cast(ptr->m_BrtSupNameValueStart.get()); if(m_oRows.IsInit()) castedPtr->cRw = m_oRows->GetValue(); if(m_oCols.IsInit()) castedPtr->cCol = m_oCols->GetValue(); for (auto &item : m_arrItems) ptr->m_arDDEOLEITEMVALUE.push_back(item->toBin()); return ptr; } 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) } CDdeItem::CDdeItem() { } CDdeItem::~CDdeItem() { } void CDdeItem::fromXML(XmlUtils::CXmlNode& oNode) { } EElementType CDdeItem::getType() const { return et_x_OleItem; } 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(); } XLS::BaseObjectPtr CDdeItem::toBin() { XLSB::ExternalReferenceType type; XLSB::DDEOLEITEMPtr ptr(new XLSB::DDEOLEITEM(type)); if (m_oDdeValues.IsInit()) ptr->m_DDEOLEITEMVALUES = m_oDdeValues->toBin(); if(m_oName.IsInit()) { ptr->m_BrtSupNameStart = XLS::BaseObjectPtr{new XLSB::SupNameStart}; auto ptrSupNameStart = static_cast(ptr->m_BrtSupNameStart.get()); ptrSupNameStart->name = m_oName.get(); } if(m_oOle.IsInit() || m_oAdvise.IsInit() || m_oPreferPic.IsInit()) { ptr->m_BrtSupNameBits = XLS::BaseObjectPtr{new XLSB::SupNameBits(type)}; auto ptrSupNameBits = static_cast(ptr->m_BrtSupNameBits.get()); ptrSupNameBits->sbt = 0x0001; if(m_oOle.IsInit()) { ptrSupNameBits->contentsDDE.fOLE = m_oOle->ToBool(); } if(m_oAdvise.IsInit()) { ptrSupNameBits->contentsDDE.fWantAdvise = m_oAdvise->ToBool(); } if(m_oPreferPic.IsInit()) { ptrSupNameBits->contentsDDE.fWantPict = m_oPreferPic->ToBool(); } } return ptr; } 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) } CDdeItems::CDdeItems() { } CDdeItems::~CDdeItems() { } void CDdeItems::fromXML(XmlUtils::CXmlNode& oNode) { } EElementType CDdeItems::getType() const { return et_x_DdeItems; } 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) { CDdeItem* pDdeItem = new CDdeItem(); *pDdeItem = oReader; m_arrItems.push_back(pDdeItem); } } } 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)); } } XLS::BaseObjectPtr CDdeItems::toBin() { XLSB::ExternalReferenceType type; XLSB::DDEOLELINKPtr ptr(new XLSB::DDEOLELINK(type)); for (auto item : m_arrItems) ptr->m_arDDEOLEITEM.push_back(item->toBin()); return ptr; } 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; } } XLS::BaseObjectPtr CDdeLink::toBin() { XLSB::EXTERNALLINKPtr ptr(new XLSB::EXTERNALLINK); ptr->m_BrtBeginSupBook = XLS::BaseObjectPtr{new XLSB::BeginSupBook}; auto castedBook = static_cast(ptr->m_BrtBeginSupBook.get()); if (m_oDdeService.IsInit()) castedBook->string1 = m_oDdeService.get(); else castedBook->string1 = L""; if (m_oDdeTopic.IsInit()) castedBook->string2 = m_oDdeTopic.get(); else castedBook->string2 = L""; if(m_oDdeItems.IsInit()) ptr->m_DDEOLELINK = m_oDdeItems->toBin(); castedBook->sbt = 0x0001; return ptr; } CDdeLink::CDdeLink() { } CDdeLink::~CDdeLink() { } void CDdeLink::fromXML(XmlUtils::CXmlNode& oNode) { } EElementType CDdeLink::getType() const { return et_x_DdeLink; } 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) } COleItem::COleItem() { } COleItem::~COleItem() { } void COleItem::fromXML(XmlUtils::CXmlNode& oNode) { } EElementType COleItem::getType() const { return et_x_OleItem; } 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(); } XLS::BaseObjectPtr COleItem::toBin() { XLSB::ExternalReferenceType type; XLSB::DDEOLEITEMPtr coleItem(new XLSB::DDEOLEITEM(type)); if(m_oName.IsInit()) { coleItem->m_BrtSupNameStart = XLS::BaseObjectPtr{new XLSB::SupNameStart}; auto castedName = static_cast(coleItem->m_BrtSupNameStart.get()); castedName->name = m_oName.get(); } if(m_oIcon.IsInit() || m_oAdvise.IsInit() || m_oPreferPic.IsInit()) { coleItem->m_BrtSupNameBits = XLS::BaseObjectPtr{new XLSB::SupNameBits(type)}; auto ptrSupNameBits = static_cast(coleItem->m_BrtSupNameBits.get()); ptrSupNameBits->sbt = 0x0002; if(m_oIcon.IsInit()) ptrSupNameBits->contentsOLE.fIcon = m_oIcon->ToBool(); if(m_oAdvise.IsInit()) ptrSupNameBits->contentsOLE.fWantAdvise = m_oAdvise->ToBool(); if(m_oPreferPic.IsInit()) ptrSupNameBits->contentsOLE.fWantPict = m_oPreferPic->ToBool(); } return coleItem; } 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) } COleItems::COleItems() { } COleItems::~COleItems() { } void COleItems::fromXML(XmlUtils::CXmlNode& oNode) { } EElementType COleItems::getType() const { return et_x_OleItems; } 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) { COleItem* pOleItem = new COleItem(); *pOleItem = oReader; m_arrItems.push_back(pOleItem); } } } 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)); } } XLS::BaseObjectPtr COleItems::toBin() { XLSB::ExternalReferenceType type; XLSB::DDEOLELINKPtr ptr(new XLSB::DDEOLELINK(type)); for(auto i: m_arrItems) { ptr->m_arDDEOLEITEM.push_back(i->toBin()); } return ptr; } COleLink::COleLink() { } COleLink::~COleLink() { } void COleLink::fromXML(XmlUtils::CXmlNode& oNode) { } EElementType COleLink::getType() const { return et_x_OleLink; } 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; } } XLS::BaseObjectPtr COleLink::toBin() { XLSB::EXTERNALLINKPtr COleLink(new XLSB::EXTERNALLINK); COleLink->m_BrtBeginSupBook = XLS::BaseObjectPtr{new XLSB::BeginSupBook}; auto castedBook = static_cast(COleLink->m_BrtBeginSupBook.get()); castedBook->sbt = 0x0002; if(m_oRid.IsInit()) castedBook->string1 = m_oRid->ToString(); else castedBook->string1 = L""; if(m_oProgId.IsInit()) castedBook->string2 = m_oProgId.get(); else castedBook->string2 = L""; if(m_oOleItems.IsInit()) COleLink->m_DDEOLELINK = m_oOleItems->toBin(); return COleLink; } 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) } CAlternateUrls::CAlternateUrls() { } CAlternateUrls::~CAlternateUrls() { } void CAlternateUrls::fromXML(XmlUtils::CXmlNode& oNode) { } EElementType CAlternateUrls::getType() const { return et_x_ExternalDefinedName; } void CAlternateUrls::fromXML(XmlUtils::CXmlLiteReader& oReader) { ReadAttributes(oReader); if (oReader.IsEmptyNode()) return; int nCurDepth = oReader.GetDepth(); while (oReader.ReadNextSiblingNode(nCurDepth)) { std::wstring sName = oReader.GetNameNoNS(); if (L"absoluteUrl" == sName) { ReadAttributes(oReader, m_oAbsoluteUrlRid); } else if (L"relativeUrl" == sName) { ReadAttributes(oReader, m_oRelativeUrlRid); } } } void CAlternateUrls::ReadAttributes(XmlUtils::CXmlLiteReader& oReader, nullable& rid) { WritingElement_ReadAttributes_Start(oReader) WritingElement_ReadAttributes_ReadSingle(oReader, (L"r:id"), rid) WritingElement_ReadAttributes_End(oReader) } void CAlternateUrls::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start(oReader) WritingElement_ReadAttributes_Read_if(oReader, (L"driveId"), m_oDriveId) WritingElement_ReadAttributes_Read_else_if(oReader, (L"itemId"), m_oItemId) WritingElement_ReadAttributes_End(oReader) } void CAlternateUrls::toXML(NSStringUtils::CStringBuilder& writer) const { writer.WriteString(L""); if (m_oAbsoluteUrlRid.IsInit()) { writer.WriteString(L"ToString() + L"\"/>"); } else if (m_oRelativeUrlRid.IsInit()) { writer.WriteString(L"ToString() + L"\"/>"); } writer.WriteString(L""); } std::wstring CAlternateUrls::toXML() const { NSStringUtils::CStringBuilder writer; toXML(writer); return writer.GetData().c_str(); } //--------------------------------------------------------------------------------------------------------------------------------- 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() { } XLS::BaseObjectPtr CExternalLink::writeBin() const { XLSB::ExternalLinkStreamPtr externalLinkStreamStream(new XLSB::ExternalLinkStream); if (externalLinkStreamStream != nullptr) { if (m_oExternalBook.IsInit()) externalLinkStreamStream->m_EXTERNALLINK = m_oExternalBook->toBin(); else if (m_oDdeLink.IsInit()) externalLinkStreamStream->m_EXTERNALLINK = m_oDdeLink->toBin(); else if (m_oOleLink.IsInit()) externalLinkStreamStream->m_EXTERNALLINK = m_oOleLink->toBin(); } return externalLinkStreamStream; } 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_oFileKey.IsInit() || oExtLst->m_arrExt[i]->m_oInstanceId.IsInit()) { m_oFileKey = oExtLst->m_arrExt[i]->m_oFileKey; m_oInstanceId = oExtLst->m_arrExt[i]->m_oInstanceId; break; } } } } } } } void CExternalLink::write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const { CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); if ((xlsb) && (xlsb->m_bWriteToXlsb)) { XLS::BaseObjectPtr object = writeBin(); xlsb->WriteBin(oPath, object.get()); } else { 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_oFileKey.IsInit() || m_oInstanceId.IsInit()) { OOX::Drawing::COfficeArtExtension oExt; oExt.m_oFileKey = m_oFileKey; oExt.m_oInstanceId = m_oInstanceId; 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); } bool CExternalLink::isValid() const { return true; } const OOX::FileType CExternalLink::type() const { CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); if ((xlsb) && (xlsb->m_bWriteToXlsb)) { return OOX::SpreadsheetBin::FileTypes::ExternalLinksBin; } return OOX::Spreadsheet::FileTypes::ExternalLinks; } const CPath CExternalLink::DefaultDirectory() const { return type().DefaultDirectory(); } const CPath CExternalLink::DefaultFileName() const { return type().DefaultFileName(); } const CPath& CExternalLink::GetReadPath() { return m_oReadPath; } void CExternalLink::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { } } }