sc/source/filter/excel/xecontent.cxx | 19 ++++++++++++++----- sc/source/filter/excel/xeescher.cxx | 8 +++++++- sc/source/filter/inc/xecontent.hxx | 3 ++- sc/source/filter/inc/xestream.hxx | 4 ++-- sc/source/filter/xcl97/xcl97rec.cxx | 21 ++++++++++++++++++++- 5 files changed, 45 insertions(+), 10 deletions(-)
New commits: commit 7ceda09f6780c954fedc49764d5457aa2616b39a Author: Tor Lillqvist <[email protected]> Date: Tue Mar 7 22:40:55 2017 +0200 A 'CondFmt' record can have a maximum of three CF records following (eek) What an odd restriction. Oh well. Don't export the conditional formats for the cell(s) in that case then. See https://msdn.microsoft.com/en-us/library/03AE6098-BDC2-475B-BA2C-B8AEF7882174 Change-Id: I4eeec8d33f9fbc572a02f727f38564d6c43b4f10 diff --git a/sc/source/filter/excel/xecontent.cxx b/sc/source/filter/excel/xecontent.cxx index 126e139..ce70978 100644 --- a/sc/source/filter/excel/xecontent.cxx +++ b/sc/source/filter/excel/xecontent.cxx @@ -1278,14 +1278,24 @@ XclExpCondfmt::~XclExpCondfmt() { } -bool XclExpCondfmt::IsValid() const +bool XclExpCondfmt::IsValidForBinary() const +{ + // ccf (2 bytes): An unsigned integer that specifies the count of CF records that follow this + // record. MUST be greater than or equal to 0x0001, and less than or equal to 0x0003. + + SAL_WARN_IF( maCFList.GetSize() > 3, "sc.filter", "More than 3 conditional filters for cell(s), won't export"); + + return !maCFList.IsEmpty() && maCFList.GetSize() <= 3 && !maXclRanges.empty(); +} + +bool XclExpCondfmt::IsValidForXml() const { return !maCFList.IsEmpty() && !maXclRanges.empty(); } void XclExpCondfmt::Save( XclExpStream& rStrm ) { - if( IsValid() ) + if( IsValidForBinary() ) { XclExpRecord::Save( rStrm ); maCFList.Save( rStrm ); @@ -1305,7 +1315,7 @@ void XclExpCondfmt::WriteBody( XclExpStream& rStrm ) void XclExpCondfmt::SaveXml( XclExpXmlStream& rStrm ) { - if( !IsValid() ) + if( !IsValidForXml() ) return; sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream(); @@ -1476,8 +1486,7 @@ XclExpCondFormatBuffer::XclExpCondFormatBuffer( const XclExpRoot& rRoot, XclExtL itr != pCondFmtList->end(); ++itr) { XclExpCondfmtList::RecordRefType xCondfmtRec( new XclExpCondfmt( GetRoot(), **itr, xExtLst, nIndex )); - if( xCondfmtRec->IsValid() ) - maCondfmtList.AppendRecord( xCondfmtRec ); + maCondfmtList.AppendRecord( xCondfmtRec ); } } } diff --git a/sc/source/filter/inc/xecontent.hxx b/sc/source/filter/inc/xecontent.hxx index 1b8d002..78eec28 100644 --- a/sc/source/filter/inc/xecontent.hxx +++ b/sc/source/filter/inc/xecontent.hxx @@ -230,7 +230,8 @@ public: virtual ~XclExpCondfmt() override; /** Returns true, if this conditional format contains at least one cell range and CF record. */ - bool IsValid() const; + bool IsValidForBinary() const; + bool IsValidForXml() const; /** Writes the CONDFMT record with following CF records, if there is valid data. */ virtual void Save( XclExpStream& rStrm ) override; commit 27e34a7dbb9aa2ce52ca529ec835d54c6a5508fc Author: Tor Lillqvist <[email protected]> Date: Tue Mar 7 21:53:34 2017 +0200 Make sure that the 'stAuthor' field of a 'NoteSh' structure filfills the spec Its length must be greater than or equal to 1 and less than or equal to 54, so if the author is empty, use a single space, and otherwise truncate to max 54 characters. See https://msdn.microsoft.com/en-us/library/dd945371 Change-Id: I7604ae9e1d8eea336b42116ea7d305e183e6ca51 diff --git a/sc/source/filter/excel/xeescher.cxx b/sc/source/filter/excel/xeescher.cxx index 3447acb..6571adc 100644 --- a/sc/source/filter/excel/xeescher.cxx +++ b/sc/source/filter/excel/xeescher.cxx @@ -1210,7 +1210,13 @@ XclExpNote::XclExpNote(const XclExpRoot& rRoot, const ScAddress& rScPos, mbRowHidden = (rRoot.GetDoc().RowHidden(maScPos.Row(),maScPos.Tab())); mbColHidden = (rRoot.GetDoc().ColHidden(maScPos.Col(),maScPos.Tab())); } - maAuthor = XclExpString( pScNote->GetAuthor() ); + // stAuthor (variable): An XLUnicodeString that specifies the name of the comment + // author. String length MUST be greater than or equal to 1 and less than or equal + // to 54. + if( pScNote->GetAuthor().isEmpty() ) + maAuthor = XclExpString( " " ); + else + maAuthor = XclExpString( pScNote->GetAuthor(), EXC_STR_DEFAULT, 54 ); } SetRecSize( 9 + maAuthor.GetSize() ); commit 20a7d4b16d600101f4073ad4ce669a7566bf14c1 Author: Tor Lillqvist <[email protected]> Date: Tue Mar 7 20:38:34 2017 +0200 Write the 'FtNts' subrecord of 'Obj' when necessary See https://msdn.microsoft.com/en-us/library/dd952807 : nts (26 bytes): An optional FtNts structure that specifies the properties of this comment object. This field MUST exist if and only if cmo.ot is equal to 0x19. Change-Id: Ib4a007940c29a4f8eac1087601cfc7d242cfebd3 diff --git a/sc/source/filter/xcl97/xcl97rec.cxx b/sc/source/filter/xcl97/xcl97rec.cxx index 1a7f1f9..0af2465 100644 --- a/sc/source/filter/xcl97/xcl97rec.cxx +++ b/sc/source/filter/xcl97/xcl97rec.cxx @@ -33,6 +33,7 @@ #include <tools/urlobj.hxx> #include <rtl/math.hxx> +#include <rtl/uuid.h> #include <svl/zformat.hxx> #include "formulacell.hxx" #include "drwlayer.hxx" @@ -458,8 +459,26 @@ void XclObj::Save( XclExpStream& rStrm ) SaveTextRecs( rStrm ); } -void XclObj::WriteSubRecs( XclExpStream& /*rStrm*/ ) +void XclObj::WriteSubRecs( XclExpStream& rStrm ) { + if( mnObjType == EXC_OBJTYPE_NOTE ) + { + // FtNts subrecord + AddRecSize( 26 ); + // ft, cb + rStrm << EXC_ID_OBJNTS << sal_uInt16(0x0016); + sal_uInt8 aGUID[16]; + rtl_createUuid( aGUID, nullptr, false ); + // guid + rStrm.SetSliceSize( 16 ); + for( int i = 0; i < 16; i++ ) + rStrm << aGUID[i]; + rStrm.SetSliceSize( 0 ); + // fSharedNote + rStrm << sal_uInt16(0); + // unused + rStrm.WriteZeroBytes( 4 ); + } } void XclObj::SaveTextRecs( XclExpStream& rStrm ) commit 93a53e0ebba62873c768d887c6aa1125967aa9e4 Author: Tor Lillqvist <[email protected]> Date: Tue Mar 7 18:20:55 2017 +0200 It's SetSliceSize, not SetSliceLen Change-Id: Ife4449f5afa7321c18e8eb963878d9c037f6d623 diff --git a/sc/source/filter/inc/xestream.hxx b/sc/source/filter/inc/xestream.hxx index 8c8808a..0778398 100644 --- a/sc/source/filter/inc/xestream.hxx +++ b/sc/source/filter/inc/xestream.hxx @@ -61,9 +61,9 @@ typedef std::shared_ptr< XclExpBiff8Encrypter > XclExpEncrypterRef; If some data exceeds the record size limit, a CONTINUE record is started automatically and the new data will be written to this record. - If specific data pieces must not be splitted, use SetSliceLen(). For instance: + If specific data pieces must not be splitted, use SetSliceSize(). For instance: To write a sequence of 16-bit values, where 4 values form a unit and cannot be - split, call SetSliceLen( 8 ) first (4*2 bytes == 8). + split, call SetSliceSize( 8 ) first (4*2 bytes == 8). To write unicode character arrays, call WriteUnicodeBuffer(). It creates CONTINUE records and repeats the unicode string flag byte automatically. This function is used _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
