tdf#120657 Pie chart saved as DOC doesn't preview in MSO

regression from

    commit 9ec8bf8f22fe74884185492ef2576ce79b41e4f1
    add SvStream::TellEnd

the problem is that in this stack trace

    sot/source/sdstor/stgelem.hxx:130
    sot/source/sdstor/stgdir.cxx:300
    sot/source/sdstor/stg.cxx:245
    sot/source/sdstor/storage.cxx:187
    tools/source/stream/stream.cxx:1908
    sw/source/filter/ww8/ww8scan.cxx:6267

The StgEntry returns a size of 0. If we do something else to the
SotStorageStream first, then it materialises a temporary stream, and
that stream returns a valid size.

Also implement suggestions from mike kaganski:

IMO, it would be more robust to implement this new function as virtual
(instead of the remainingSize()), and reimplement the latter as
non-virtual one using the new one and doing the necessary correction.

Change-Id: Id1462d918570a684ec67099c30181436a27d3c6a
Reviewed-on: https://gerrit.libreoffice.org/62984
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
diff --git a/include/sot/storage.hxx b/include/sot/storage.hxx
index 6a7e25a..cb1c0ba 100644
--- a/include/sot/storage.hxx
+++ b/include/sot/storage.hxx
@@ -56,7 +56,7 @@
    void                CopyTo( SotStorageStream * pDestStm );
    bool                Commit();
    bool                SetProperty( const OUString& rName, const css::uno::Any& rValue );
    virtual sal_uInt64 remainingSize() override;
    virtual sal_uInt64  TellEnd() override;
};

class  BaseStorage;
diff --git a/include/tools/stream.hxx b/include/tools/stream.hxx
index 4da1d2e..c627ed4 100644
--- a/include/tools/stream.hxx
+++ b/include/tools/stream.hxx
@@ -272,9 +272,9 @@
    sal_uInt64      Seek( sal_uInt64 nPos );
    sal_uInt64      SeekRel( sal_Int64 nPos );
    sal_uInt64      Tell() const { return m_nBufFilePos + m_nBufActualPos;  }
    sal_uInt64      TellEnd();
    virtual sal_uInt64 TellEnd();
    // length between current (Tell()) pos and end of stream
    virtual sal_uInt64 remainingSize();
    sal_uInt64      remainingSize();
    void            Flush();
    // next Tell() <= nSize
    bool            SetStreamSize( sal_uInt64 nSize );
@@ -669,7 +669,7 @@

    void            ObjectOwnsMemory( bool bOwn ) { bOwnsData = bOwn; }
    void            SetResizeOffset( std::size_t nNewResize ) { nResize = nNewResize; }
    virtual sal_uInt64 remainingSize() override { FlushBuffer(true); return GetEndOfData() - Tell(); }
    virtual sal_uInt64 TellEnd() override { FlushBuffer(true); return nEndOfData; }
};

#endif
diff --git a/sot/source/sdstor/storage.cxx b/sot/source/sdstor/storage.cxx
index cff3520..bc78bdd 100644
--- a/sot/source/sdstor/storage.cxx
+++ b/sot/source/sdstor/storage.cxx
@@ -181,12 +181,16 @@
    return nSize;
}

sal_uInt64 SotStorageStream::remainingSize()
sal_uInt64 SotStorageStream::TellEnd()
{
    if (pOwnStm)
        return pOwnStm->GetSize() - Tell();
    // Need to flush the buffer so we materialise the stream and return the correct answer
    // otherwise we return a 0 value from StgEntry::GetSize
    FlushBuffer(true);

    return SvStream::remainingSize();
    if (pOwnStm)
        return pOwnStm->GetSize();

    return SvStream::TellEnd();
}

void SotStorageStream::CopyTo( SotStorageStream * pDestStm )
diff --git a/tools/source/stream/stream.cxx b/tools/source/stream/stream.cxx
index 818726b..a016034 100644
--- a/tools/source/stream/stream.cxx
+++ b/tools/source/stream/stream.cxx
@@ -1425,12 +1425,21 @@
sal_uInt64 SvStream::remainingSize()
{
    sal_uInt64 const nCurr = Tell();
    sal_uInt64 const nEnd = Seek(STREAM_SEEK_TO_END);
    sal_uInt64 const nEnd = TellEnd();
    sal_uInt64 nMaxAvailable = nEnd > nCurr ? (nEnd-nCurr) : 0;
    Seek(nCurr);
    return nMaxAvailable;
}

sal_uInt64 SvStream::TellEnd()
{
    FlushBuffer(true);
    sal_uInt64 const nCurr = Tell();
    sal_uInt64 const nEnd = Seek(STREAM_SEEK_TO_END);
    Seek(nCurr);
    return nEnd;
}

void SvStream::Flush()
{
    FlushBuffer(m_isConsistent);
@@ -1903,11 +1912,6 @@
    ReAllocateMemory( nDiff );
}

sal_uInt64 SvStream::TellEnd()
{
    return Tell() + remainingSize();
}

//Create a OString of nLen bytes from rStream
OString read_uInt8s_ToOString(SvStream& rStrm, std::size_t nLen)
{