sw: read both platform dependent binary table autoformats
The WriterSpecificAutoFormatBlock class actually writes a length into the file that covers the offending SwFormatVertOrient item. Put in a gross hack to read either 32-bit or 64-bit in SwFormatVertOrient::Store depending on that length. The length also covers another item, so we'll just hope nobody ever changes this stuff ever again! Change-Id: Idf2f05cc00c098571508adb849f60940966c3328 Reviewed-on: https://gerrit.libreoffice.org/44254 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Michael Stahl <mstahl@redhat.com>
This commit is contained in:
@@ -149,13 +149,13 @@ namespace
|
|||||||
};
|
};
|
||||||
|
|
||||||
/// Checks whether a writer-specific block exists (i.e. size is not zero)
|
/// Checks whether a writer-specific block exists (i.e. size is not zero)
|
||||||
bool WriterSpecificBlockExists(SvStream &stream)
|
sal_Int64 WriterSpecificBlockExists(SvStream &stream)
|
||||||
{
|
{
|
||||||
sal_uInt64 endOfSwBlock = 0;
|
sal_uInt64 endOfSwBlock = 0;
|
||||||
stream.ReadUInt64( endOfSwBlock );
|
stream.ReadUInt64( endOfSwBlock );
|
||||||
|
|
||||||
// end-of-block pointing to itself indicates a zero-size block.
|
// end-of-block pointing to itself indicates a zero-size block.
|
||||||
return endOfSwBlock != stream.Tell();
|
return endOfSwBlock - stream.Tell();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -452,10 +452,15 @@ bool SwBoxAutoFormat::Load( SvStream& rStream, const SwAfVersions& rVersions, sa
|
|||||||
SetAdjust( *static_cast<SvxAdjustItem*>(pNew) );
|
SetAdjust( *static_cast<SvxAdjustItem*>(pNew) );
|
||||||
delete pNew;
|
delete pNew;
|
||||||
|
|
||||||
if (nVer >= AUTOFORMAT_DATA_ID_31005 && WriterSpecificBlockExists(rStream))
|
if (nVer >= AUTOFORMAT_DATA_ID_31005)
|
||||||
{
|
{
|
||||||
READ(m_aTextOrientation, SvxFrameDirectionItem, rVersions.m_nTextOrientationVersion);
|
sal_Int64 const nSize(WriterSpecificBlockExists(rStream));
|
||||||
READ(m_aVerticalAlignment, SwFormatVertOrient, rVersions.m_nVerticalAlignmentVersion);
|
if (0 < nSize && nSize < std::numeric_limits<sal_uInt16>::max())
|
||||||
|
{
|
||||||
|
READ(m_aTextOrientation, SvxFrameDirectionItem, rVersions.m_nTextOrientationVersion);
|
||||||
|
// HORRIBLE HACK to read both 32-bit and 64-bit "long": abuse nSize
|
||||||
|
READ(m_aVerticalAlignment, SwFormatVertOrient, /*rVersions.m_nVerticalAlignmentVersion*/ nSize);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
READ( m_aHorJustify, SvxHorJustifyItem , rVersions.nHorJustifyVersion)
|
READ( m_aHorJustify, SvxHorJustifyItem , rVersions.nHorJustifyVersion)
|
||||||
|
@@ -1265,20 +1265,32 @@ SvStream& SwFormatVertOrient::Store(SvStream &rStream, sal_uInt16 /*version*/) c
|
|||||||
return rStream;
|
return rStream;
|
||||||
}
|
}
|
||||||
|
|
||||||
SfxPoolItem* SwFormatVertOrient::Create(SvStream &rStream, sal_uInt16 /*itemVersion*/) const
|
SfxPoolItem* SwFormatVertOrient::Create(SvStream &rStream, sal_uInt16 nVersionAbusedAsSize) const
|
||||||
{
|
{
|
||||||
SwTwips yPos(0);
|
SwTwips yPos(0);
|
||||||
sal_Int16 orient(0);
|
sal_Int16 orient(0);
|
||||||
sal_Int16 relation(0);
|
sal_Int16 relation(0);
|
||||||
// compatibility hack for Table Auto Format: SwTwips is "long" :(
|
switch (nVersionAbusedAsSize)
|
||||||
// (this means that the file format is platform dependent)
|
{
|
||||||
#if SAL_TYPES_SIZEOFLONG == 8
|
// compatibility hack for Table Auto Format: SwTwips is "long" :(
|
||||||
rStream.ReadInt64(yPos);
|
// (this means that the file format is platform dependent)
|
||||||
#else
|
case 14:
|
||||||
sal_Int32 n;
|
{
|
||||||
rStream.ReadInt32(n);
|
sal_Int64 n(0);
|
||||||
yPos = n;
|
rStream.ReadInt64(n);
|
||||||
#endif
|
yPos = n;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 10:
|
||||||
|
{
|
||||||
|
sal_Int32 n(0);
|
||||||
|
rStream.ReadInt32(n);
|
||||||
|
yPos = n;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
SAL_WARN("sw.core", "SwFormatVertOrient::Create: unknown size");
|
||||||
|
}
|
||||||
rStream.ReadInt16( orient ).ReadInt16( relation );
|
rStream.ReadInt16( orient ).ReadInt16( relation );
|
||||||
|
|
||||||
return new SwFormatVertOrient(yPos, orient, relation);
|
return new SwFormatVertOrient(yPos, orient, relation);
|
||||||
|
Reference in New Issue
Block a user