From 3780922610abfa529db1124609e4f701d21adbaf Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 22 May 2024 21:42:33 +0600 Subject: [PATCH] Fix bug #68111 --- .../Biff12_records/BeginSupBook.cpp | 2 +- .../Biff12_structures/ECTxtWizData.cpp | 1 + .../ExternalLinks/ExternalLinks.cpp | 198 +++++++++++++++++- .../XlsxFormat/ExternalLinks/ExternalLinks.h | 9 +- OOXML/XlsxFormat/Ole/OleObjects.cpp | 11 +- OOXML/XlsxFormat/SharedStrings/Si.cpp | 1 + OOXML/XlsxFormat/Table/Connections.cpp | 43 +++- .../Worksheets/ConditionalFormatting.cpp | 6 +- .../Worksheets/WorksheetChildOther.cpp | 2 +- 9 files changed, 256 insertions(+), 17 deletions(-) diff --git a/OOXML/XlsbFormat/Biff12_records/BeginSupBook.cpp b/OOXML/XlsbFormat/Biff12_records/BeginSupBook.cpp index 25e7d9dc88..632c250549 100644 --- a/OOXML/XlsbFormat/Biff12_records/BeginSupBook.cpp +++ b/OOXML/XlsbFormat/Biff12_records/BeginSupBook.cpp @@ -97,7 +97,7 @@ namespace XLSB RelID relID; XLNullableWideString str; relID.value = string1; - str = string2; + str.setSize(0xFFFFFFFF); record << relID << str; break; } diff --git a/OOXML/XlsbFormat/Biff12_structures/ECTxtWizData.cpp b/OOXML/XlsbFormat/Biff12_structures/ECTxtWizData.cpp index f2fed5fd5e..a41231ccd4 100644 --- a/OOXML/XlsbFormat/Biff12_structures/ECTxtWizData.cpp +++ b/OOXML/XlsbFormat/Biff12_structures/ECTxtWizData.cpp @@ -88,6 +88,7 @@ namespace XLSB SETBIT(flags, 16, fSemiColon) SETBIT(flags, 17, fConsecutive) SETBITS(flags, 18, 19, fTextDelim) + SETBIT(flags, 20, 1) SETBIT(flags, 21, fPromptForFile) SETBIT(flags, 22, fCustom) diff --git a/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.cpp b/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.cpp index 81927d690c..b17e9e43ad 100644 --- a/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.cpp +++ b/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.cpp @@ -65,6 +65,7 @@ #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 @@ -182,6 +183,34 @@ namespace Spreadsheet { 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->contentsExtName.iSheet = m_oSheetId->GetValue(); + supBits->contentsExtName.fBuiltIn = false; + } + return objectPtr; + } void CExternalDefinedName::ReadAttributes(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -274,7 +303,15 @@ namespace Spreadsheet 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() { } @@ -322,6 +359,98 @@ namespace Spreadsheet 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); @@ -467,6 +596,27 @@ namespace Spreadsheet 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); @@ -548,6 +698,29 @@ namespace Spreadsheet 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); @@ -631,7 +804,15 @@ namespace Spreadsheet 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() { } @@ -712,8 +893,15 @@ namespace Spreadsheet 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; @@ -721,6 +909,10 @@ namespace Spreadsheet { 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; } diff --git a/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.h b/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.h index b9d635bf51..8099f9989c 100644 --- a/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.h +++ b/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.h @@ -123,6 +123,7 @@ namespace OOX virtual std::wstring toXML() const; void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; void ReadAttributes(XLS::BaseObjectPtr& obj); @@ -146,6 +147,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual std::wstring toXML() const; void fromBin(std::vector& obj); + std::vector toBin(); virtual EElementType getType() const; }; @@ -163,7 +165,8 @@ namespace OOX virtual std::wstring toXML() const; void fromBin(XLS::BaseObjectPtr& obj); - + XLS::BaseObjectPtr toBin(); + virtual EElementType getType() const; void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); @@ -189,6 +192,7 @@ namespace OOX virtual std::wstring toXML() const; void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; void ReadAttributes(XLS::BaseObjectPtr& obj); @@ -211,6 +215,7 @@ namespace OOX virtual std::wstring toXML() const; void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; void ReadAttributes(XLS::BaseObjectPtr& obj); @@ -234,7 +239,7 @@ namespace OOX virtual std::wstring toXML() const; void fromBin(std::vector& obj); - + std::vector toBin(); virtual EElementType getType() const; }; diff --git a/OOXML/XlsxFormat/Ole/OleObjects.cpp b/OOXML/XlsxFormat/Ole/OleObjects.cpp index 0db040495e..9406977c9b 100644 --- a/OOXML/XlsxFormat/Ole/OleObjects.cpp +++ b/OOXML/XlsxFormat/Ole/OleObjects.cpp @@ -314,14 +314,19 @@ namespace OOX if(m_oShapeId.IsInit()) ptr->shapeId = m_oShapeId->GetValue(); - - ptr->fAutoLoad = m_oAutoLoad->GetValue(); + if(m_oAutoLoad.IsInit()) + ptr->fAutoLoad = m_oAutoLoad->GetValue(); + else + ptr->fAutoLoad = false; if(m_oProgId.IsInit()) - ptr->strProgID.value() = m_oProgId.get(); + ptr->strProgID = m_oProgId.get(); if(m_oLink.IsInit()) ptr->link = m_oLink.get(); + else + ptr->fLinked = false; + if(m_oRid.IsInit()) ptr->strRelID.value = m_oRid->GetValue(); diff --git a/OOXML/XlsxFormat/SharedStrings/Si.cpp b/OOXML/XlsxFormat/SharedStrings/Si.cpp index e008680be1..cfb2f424d7 100644 --- a/OOXML/XlsxFormat/SharedStrings/Si.cpp +++ b/OOXML/XlsxFormat/SharedStrings/Si.cpp @@ -164,6 +164,7 @@ namespace OOX if(phonPtr) { ptr->fExtStr = true; + ptr->phoneticStr = L""; XLSB::PhRun phRun; phonPtr->toBin(&phRun); if(i < m_arrItems.size() - 1) diff --git a/OOXML/XlsxFormat/Table/Connections.cpp b/OOXML/XlsxFormat/Table/Connections.cpp index fe144fc348..1e3d32d8a9 100644 --- a/OOXML/XlsxFormat/Table/Connections.cpp +++ b/OOXML/XlsxFormat/Table/Connections.cpp @@ -92,8 +92,12 @@ namespace OOX auto ptr(new XLSB::BeginECTwFldInfo); if(m_oPosition.IsInit()) ptr->data.fieldStart = m_oPosition.get(); + else + ptr->data.fieldStart = 0; if(m_oType.IsInit()) ptr->data.fieldType = m_oType->GetValue(); + else + ptr->data.fieldType = 0; return XLS::BaseObjectPtr{ptr}; } EElementType CTextField::getType() const @@ -788,41 +792,72 @@ namespace OOX { auto ptr1(new XLSB::ECTXTWIZ); auto ptr(new XLSB::BeginECTxtWiz); + ptr1->m_BrtBeginECTxtWiz = XLS::BaseObjectPtr{ptr}; if(m_oSourceFile.IsInit()) ptr->stFile = m_oSourceFile.get(); + else + ptr->stFile.setSize(0); if(m_oFileType.IsInit()) { ptr->data.iCpid = m_oFileType->m_eValue; ptr->data.iCpidNew = m_oFileType->m_eValue; } + else + { + ptr->data.iCpid = 1; + ptr->data.iCpidNew = 0; + } if(m_oDecimal.IsInit()) - ptr->data.chDecimal = std::stoi(m_oDecimal.get()); + ptr->data.chDecimal = m_oDecimal.get()[0]; + else + ptr->data.chDecimal = '.'; if(m_oDelimiter.IsInit()) - ptr->data.chCustom = std::stoi(m_oDelimiter.get()); + ptr->data.chCustom = m_oDelimiter.get()[0]; + else + { + ptr->data.chCustom = 0; + ptr->data.fCustom = false; + } if(m_oThousands.IsInit()) - ptr->data.chThousSep = std::stoi(m_oThousands.get()); + ptr->data.chThousSep = m_oThousands.get()[0]; + else + ptr->data.chThousSep = ' '; if(m_oFirstRow.IsInit()) ptr->data.rowStartAt = m_oFirstRow.get(); if(m_oQualifier.IsInit()) ptr->data.fTextDelim = m_oQualifier->GetValue(); + else + ptr->data.fTextDelim = 0; if(m_oPrompt.IsInit()) ptr->data.fPromptForFile = m_oPrompt.get(); if(m_oDelimited.IsInit()) ptr->data.fDelimited = m_oDelimited.get(); + else + ptr->data.fDelimited = false; if(m_oTab.IsInit()) ptr->data.fTab = m_oTab.get(); + else + ptr->data.fTab = false; if(m_oSpace.IsInit()) ptr->data.fSpace = m_oSpace.get(); + else + ptr->data.fSpace = false; if(m_oComma.IsInit()) ptr->data.fComma = m_oComma.get(); + else + ptr->data.fComma = false; if(m_oSemicolon.IsInit()) ptr->data.fSemiColon = m_oSemicolon.get(); + else + ptr->data.fSemiColon = false; if(m_oConsecutive.IsInit()) ptr->data.fConsecutive = m_oConsecutive.get(); + else + ptr->data.fConsecutive = false; if(m_oTextFields.IsInit()) - ptr1->m_ECTWFLDINFOLST = m_oTextFields->toBin(); + ptr1->m_ECTWFLDINFOLST = m_oTextFields->toBin(); return XLS::BaseObjectPtr{ptr1}; } EElementType CTextPr::getType() const diff --git a/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp b/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp index 3fc6ffa912..70f2e68c21 100644 --- a/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp +++ b/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp @@ -267,9 +267,9 @@ XLS::BaseObjectPtr CConditionalFormatValueObject::toBin(bool isIcon) else ptr1->iType = XLSB::CFVOtype::CFVONUM; - if(m_oVal.IsInit() && ptr1->iType != XLSB::CFVOtype::CFVOFMLA) - ptr1->numParam.data.value = std::stod(m_oVal.get()); - else if(ptr1->iType.get_type() == XLSB::CFVOtype::CFVOMIN) + //if(m_oVal.IsInit() && ptr1->iType != XLSB::CFVOtype::CFVOFMLA) + //ptr1->numParam.data.value = std::stod(m_oVal.get()); + if(ptr1->iType.get_type() == XLSB::CFVOtype::CFVOMIN) ptr1->numParam.data.value = 0; else if(ptr1->iType.get_type() == XLSB::CFVOtype::CFVOMAX) ptr1->numParam.data.value = 0; diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp index e5c54f10d4..5618cb42d4 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp @@ -2659,7 +2659,7 @@ namespace OOX XLS::BaseObjectPtr castedPtr(ptr); if (m_oPassword.IsInit()) - ptr->protpwd = std::stoul(m_oPassword.get()); + ptr->protpwd = std::stoul(m_oPassword.get(),nullptr, 16); else ptr->protpwd = 0;