Skip to content

Commit 37a5ce4

Browse files
Merge pull request 'fix bug #73433' (#251) from fix/bug73433 into hotfix/v8.3.2
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/251
2 parents 3723ba0 + 80ed031 commit 37a5ce4

File tree

6 files changed

+69
-26
lines changed

6 files changed

+69
-26
lines changed

MsBinaryFile/XlsFile/Format/Logic/Biff_records/FileSharing.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ class FileSharing: public BiffRecord
5656
static const ElementType type = typeFileSharing;
5757

5858
Boolean<unsigned short> fReadOnlyRec;
59-
unsigned short wResPassNum;
59+
unsigned short wResPassNum = 0;
6060
std::wstring wResPass;
6161
_UINT16 iNoResPass;
6262
XLUnicodeString stUNUsername;

OOXML/XlsxFormat/Workbook/Workbook.cpp

+12-2
Original file line numberDiff line numberDiff line change
@@ -427,8 +427,18 @@ namespace OOX
427427
workBookStream->m_FRTWORKBOOK = m_oExtLst->toBinWorkBook();
428428

429429
if (m_oFileSharing.IsInit())
430-
workBookStream->m_BrtFileSharing = m_oFileSharing->toBin();
431-
430+
{
431+
auto sharingVector = m_oFileSharing->toBin();
432+
if(sharingVector.size() == 2)
433+
{
434+
workBookStream->m_BrtFileSharingIso = sharingVector.at(0);
435+
workBookStream->m_BrtFileSharing = sharingVector.at(1);
436+
}
437+
else if(sharingVector.size() == 1)
438+
{
439+
workBookStream->m_BrtFileSharing = sharingVector.at(0);
440+
}
441+
}
432442
return workBookStream;
433443
}
434444
void CWorkbook::read(const CPath& oPath)

OOXML/XlsxFormat/Workbook/WorkbookPr.cpp

+13-6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/*
1+
/*
22
* (c) Copyright Ascensio System SIA 2010-2023
33
*
44
* This program is a free software product. You can redistribute it and/or
@@ -428,13 +428,13 @@ namespace OOX
428428
if (!oReader.IsEmptyNode())
429429
oReader.ReadTillEnd();
430430
}
431-
XLS::BaseObjectPtr CFileSharing::toBin()
431+
std::vector<XLS::BaseObjectPtr> CFileSharing::toBin()
432432
{
433-
XLS::BaseObjectPtr objectPtr;
433+
std::vector<XLS::BaseObjectPtr> objectVector;
434434
if(m_oSpinCount.IsInit() || m_oAlgorithmName.IsInit() || m_oHashValue.IsInit())
435435
{
436436
auto ptr(new XLSB::FileSharingIso);
437-
objectPtr = XLS::BaseObjectPtr{ptr};
437+
XLS::BaseObjectPtr objectPtr = XLS::BaseObjectPtr{ptr};
438438

439439
if (m_oReadOnlyRecommended.IsInit())
440440
ptr->fReadOnlyRec = m_oReadOnlyRecommended.get();
@@ -472,12 +472,18 @@ namespace OOX
472472
bytes1, len1);
473473
}
474474
ptr->ipdPasswordData.rgbSalt.cbLength = len1;
475+
auto ptr1(new XLSB::FileSharing);
476+
ptr1->wResPass = L"";
477+
ptr1->fReadOnlyRec = ptr->fReadOnlyRec;
478+
ptr1->stUserName = ptr->stUserName;
479+
objectVector.push_back(objectPtr);
480+
objectVector.push_back(XLS::BaseObjectPtr{ptr1});
475481

476482
}
477483
else
478484
{
479485
auto ptr(new XLSB::FileSharing);
480-
objectPtr = XLS::BaseObjectPtr{ptr};
486+
XLS::BaseObjectPtr objectPtr = XLS::BaseObjectPtr{ptr};
481487
if (m_oReadOnlyRecommended.IsInit())
482488
ptr->fReadOnlyRec = m_oReadOnlyRecommended.get();
483489
else
@@ -490,8 +496,9 @@ namespace OOX
490496
ptr->wResPass = m_oPassword.get();
491497
else
492498
ptr->wResPass = L"";
499+
objectVector.push_back(objectPtr);
493500
}
494-
return objectPtr;
501+
return objectVector;
495502
}
496503
void CFileSharing::fromBin(XLS::BaseObjectPtr& obj)
497504
{

OOXML/XlsxFormat/Workbook/WorkbookPr.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ namespace OOX
148148
virtual void fromXML(XmlUtils::CXmlLiteReader& oReader);
149149

150150
void fromBin(XLS::BaseObjectPtr& obj);
151-
XLS::BaseObjectPtr toBin();
151+
std::vector<XLS::BaseObjectPtr> toBin();
152152
virtual EElementType getType() const;
153153

154154
void ReadAttributes(XmlUtils::CXmlLiteReader& oReader);

OOXML/XlsxFormat/Worksheets/SheetData.cpp

+18-9
Original file line numberDiff line numberDiff line change
@@ -1130,7 +1130,7 @@ namespace OOX
11301130
}
11311131
namespace SharedFormulasRef
11321132
{
1133-
std::unique_ptr<std::vector<XLS::CellRef>> sharedRefsLocations;
1133+
std::unique_ptr<std::map<_UINT32,XLS::CellRef>> sharedRefsLocations;
11341134
std::unique_ptr<std::vector<std::pair<XLS::CellRangeRef, XLS::CellRef>>> ArrayRefsLocations;
11351135
}
11361136
void CFormula::fromBin(XLS::StreamCacheReaderPtr& reader, XLS::CFRecordPtr& record)
@@ -1157,9 +1157,10 @@ namespace OOX
11571157
rowRef = static_cast<XLS::PtgExp*>(BinFmla.rgce.sequence.begin()->get())->rowXlsb;
11581158
ColumnRef = static_cast<XLS::PtgExtraCol*>(BinFmla.rgcb.getPtgs().back().get())->col;
11591159
if(!SharedFormulasRef::sharedRefsLocations)
1160-
SharedFormulasRef::sharedRefsLocations = std::unique_ptr<std::vector<XLS::CellRef>>(new std::vector<XLS::CellRef>);
1161-
SharedFormulasRef::sharedRefsLocations->push_back(XLS::CellRef(rowRef, ColumnRef, true, true));
1160+
SharedFormulasRef::sharedRefsLocations = std::unique_ptr<std::map<_UINT32, XLS::CellRef>>(new std::map<_UINT32, XLS::CellRef>);
11621161
m_oSi = (unsigned int)SharedFormulasRef::sharedRefsLocations->size() - 1;
1162+
SharedFormulasRef::sharedRefsLocations->emplace(m_oSi->GetValue(), XLS::CellRef(rowRef, ColumnRef, true, true));
1163+
11631164
}
11641165
}
11651166
auto fmlaRecord = reader->getNextRecord(XLSB::rt_ShrFmla);
@@ -2926,7 +2927,7 @@ namespace OOX
29262927
case SimpleTypes::Spreadsheet::celltypeInlineStr:
29272928
case SimpleTypes::Spreadsheet::celltypeStr:
29282929
{
2929-
if(m_oValue.IsInit() || m_oRichText.IsInit())
2930+
if(m_oValue.IsInit() || m_oRichText.IsInit() || m_oFormula.IsInit())
29302931
{
29312932
if(!m_oFormula.IsInit())
29322933
CellRecord = writer->getNextRecord(XLSB::rt_CellSt);
@@ -2936,8 +2937,10 @@ namespace OOX
29362937
XLSB::XLWideString str;
29372938
if(m_oValue.IsInit())
29382939
str = m_oValue->m_sText;
2939-
else
2940+
else if(m_oRichText.IsInit())
29402941
str = m_oRichText->ToString();
2942+
else
2943+
str = L"";
29412944
*CellRecord << str;
29422945
}
29432946
else
@@ -2958,15 +2961,19 @@ namespace OOX
29582961
else if(m_oFormula->m_oT.get() == SimpleTypes::Spreadsheet::ECellFormulaType::cellformulatypeShared)
29592962
{
29602963
if(!SharedFormulasRef::sharedRefsLocations)
2961-
SharedFormulasRef::sharedRefsLocations = std::unique_ptr<std::vector<XLS::CellRef>>(new std::vector<XLS::CellRef>);
2964+
SharedFormulasRef::sharedRefsLocations = std::unique_ptr<std::map<_UINT32, XLS::CellRef>>(new std::map<_UINT32, XLS::CellRef>);
29622965
if(!m_oFormula->m_sText.empty())
29632966
{
29642967
ExtraRecord = writer->getNextRecord(XLSB::rt_ShrFmla);
2965-
SharedFormulasRef::sharedRefsLocations->push_back(CellReference);
2968+
if(!m_oFormula->m_oSi.IsInit())
2969+
m_oFormula->m_oSi = (_UINT32)SharedFormulasRef::sharedRefsLocations->size();
2970+
SharedFormulasRef::sharedRefsLocations->emplace(m_oFormula->m_oSi->GetValue(), CellReference);
2971+
SharedFmlaRef = &CellReference;
29662972
}
2967-
if(m_oFormula->m_oSi.IsInit() && m_oFormula->m_oSi->GetValue() < SharedFormulasRef::sharedRefsLocations->size())
2973+
if(m_oFormula->m_oSi.IsInit() && SharedFormulasRef::sharedRefsLocations->find(m_oFormula->m_oSi->GetValue()) != SharedFormulasRef::sharedRefsLocations->end())
29682974
{
2969-
SharedFmlaRef = &SharedFormulasRef::sharedRefsLocations->at(m_oFormula->m_oSi->GetValue());
2975+
if(m_oFormula->m_sText.empty())
2976+
SharedFmlaRef = &SharedFormulasRef::sharedRefsLocations->at(m_oFormula->m_oSi->GetValue());
29702977
XLS::CellParsedFormula BinFmla(false);
29712978

29722979
//пишем флаги для формулы
@@ -4727,6 +4734,8 @@ namespace OOX
47274734
}
47284735
if(SharedFormulasRef::sharedRefsLocations)
47294736
SharedFormulasRef::sharedRefsLocations.reset();
4737+
if(SharedFormulasRef::ArrayRefsLocations)
4738+
SharedFormulasRef::ArrayRefsLocations.reset();
47304739
}
47314740
XLS::BaseObjectPtr CSheetData::toBin()
47324741
{

OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp

+24-7
Original file line numberDiff line numberDiff line change
@@ -2812,32 +2812,49 @@ namespace OOX
28122812
if(m_oOddHeader.IsInit())
28132813
dataString = m_oOddHeader->m_sText;
28142814
else
2815-
dataString = L"";
2815+
dataString.setSize(0xFFFFFFFF);
28162816
*begin << dataString;
2817+
}
2818+
{
2819+
XLSB::XLNullableWideString dataString;
28172820
if(m_oOddFooter.IsInit())
28182821
dataString = m_oOddFooter->m_sText;
28192822
else
2820-
dataString = L"";
2823+
dataString.setSize(0xFFFFFFFF);
28212824
*begin << dataString;
2825+
}
2826+
{
2827+
XLSB::XLNullableWideString dataString;
2828+
28222829
if(m_oEvenHeader.IsInit())
28232830
dataString = m_oEvenHeader->m_sText;
28242831
else
2825-
dataString = L"";
2832+
dataString.setSize(0xFFFFFFFF);
28262833
*begin << dataString;
2834+
}
2835+
{
2836+
XLSB::XLNullableWideString dataString;
28272837
if(m_oEvenFooter.IsInit())
28282838
dataString = m_oEvenFooter->m_sText;
28292839
else
2830-
dataString = L"";
2831-
*begin << dataString;
2840+
dataString.setSize(0xFFFFFFFF);
2841+
*begin << dataString;
2842+
}
2843+
{
2844+
XLSB::XLNullableWideString dataString;
2845+
28322846
if(m_oFirstHeader.IsInit())
28332847
dataString = m_oFirstHeader->m_sText;
28342848
else
2835-
dataString = L"";
2849+
dataString.setSize(0xFFFFFFFF);
28362850
*begin << dataString;
2851+
}
2852+
{
2853+
XLSB::XLNullableWideString dataString;
28372854
if(m_oFirstFooter.IsInit())
28382855
dataString = m_oFirstFooter->m_sText;
28392856
else
2840-
dataString = L"";
2857+
dataString.setSize(0xFFFFFFFF);
28412858
*begin << dataString;
28422859
}
28432860
writer->storeNextRecord(begin);

0 commit comments

Comments
 (0)