25#include <osl/file.hxx>
90 sal_Int32 nMinStart =
STG_EOF, nMinLen = 0;
91 sal_Int32 nMaxStart =
STG_EOF, nMaxLen = 0x7FFFFFFFL;
92 sal_Int32 nTmpStart =
STG_EOF, nTmpLen = 0;
97 for( sal_Int32
i = 0;
i < nPages;
i++, nEntry++ )
120 || ( bFound && ( nEntry >=
m_nLimit ) ) )
125 if( nTmpLen > nPgs && nTmpLen < nMaxLen )
129 nMaxStart = nTmpStart;
132 else if( nTmpLen >= nMinLen )
136 nMinStart = nTmpStart;
138 if( nTmpLen == nPgs )
148 if( nTmpLen > nPgs && nTmpLen < nMaxLen )
152 nMaxStart = nTmpStart;
154 else if( nTmpLen >= nMinLen )
158 nMinStart = nTmpStart;
164 sal_Int32 nMinDiff = nPgs - nMinLen;
165 sal_Int32 nMaxDiff = nMaxLen - nPgs;
166 if( nMinDiff > nMaxDiff )
171 nPgs = nMinLen;
return nMinStart;
183 sal_Int32
nPos = nStart << 2;
185 if( !pPg.is() || !nPgs )
214 sal_Int32 nOrig = nBgn;
215 sal_Int32 nLast = nBgn;
245 nLast = nBegin + nAlloc - 1;
248 if( nPgs && !nPasses )
264 if( nBegin ==
STG_EOF || nPgs )
324 m_bBytePosValid(true),
365 sal_Int32 nOptSize = 0;
369 while( nBgn >= 0 && !bError )
372 nBgn =
m_pFat->GetNextPage( nBgn );
377 SAL_WARN (
"sot",
"Error: page number " << nBgn <<
" already in chain for stream");
385 SAL_WARN(
"sot",
"returning wrong format error");
402 if( nBytePos < 0 || nBytePos >=
m_nSize )
407 sal_Int32 nOld =
m_nPos & nMask;
408 sal_Int32 nNew = nBytePos & nMask;
409 m_nOffset =
static_cast<short>( nBytePos & ~nMask );
423 size_t nToAdd = nIdx + 1;
437 while (nToAdd > 0 && nBgn >= 0)
439 sal_Int32 nOldBgn = nBgn;
440 nBgn =
m_pFat->GetNextPage(nOldBgn);
446 SAL_WARN (
"sot",
"Error: page number " << nBgn <<
" already in chain for stream");
459 SAL_WARN(
"sot",
"seek to index " << nIdx <<
516 nFrom =
m_pFat->GetNextPage( nFrom );
523 nTo =
m_pFat->GetNextPage( nTo );
530 if ( nBytes < 0 || !
m_pFat )
549 else if( nNew < nOld )
551 bool bAll = ( nBytes == 0 );
588 if( nBytePos < 0 || nBytePos >=
m_nSize )
602 OSL_ENSURE( nOff >= 0,
"The offset may not be negative!" );
603 if( pnMasterAlloc ) *pnMasterAlloc = 0;
606 sal_Int32 nMaxPage =
m_nSize >> 2;
609 sal_uInt16 nMasterCount = (
m_nPageSize >> 2 ) - 1;
610 sal_uInt16 nBlocks = nOff / nMasterCount;
612 nOff = nOff % nMasterCount;
631 for(
short k = 0; k < static_cast<short>(
m_nPageSize >> 2 ); k++ )
680 OSL_ENSURE( nOff >= 0,
"The offset may not be negative!" );
691 sal_uInt16 nMasterCount = (
m_nPageSize >> 2 ) - 1;
692 sal_uInt16 nBlocks = nOff / nMasterCount;
694 nOff = nOff % nMasterCount;
741 short nNew =
static_cast<short>(
746 for(
short i = nNew;
i < nOld;
i++ )
756 sal_uInt16 nMasterAlloc = 0;
757 nPg =
GetPage( nOld,
true, &nMasterAlloc );
761 nBytes += nMasterAlloc << 2;
765 OSL_ENSURE(
m_pFat,
"The pointer is always initializer here!" );
766 sal_Int32 nNewPage =
m_pFat->FindBlock(
n );
775 nNewPage += nMasterAlloc;
785 for(
short j = 0; j < static_cast<short>(
m_nPageSize >> 2 ); j++ )
802 if( nMax -
nCount <= nMasterAlloc )
810 if( !pPage.is() )
return false;
817 nNew =
static_cast<short>(
842 p.m_aEntry.GetSize() );
850 OSL_ENSURE(
m_pFat,
"The pointer should not be empty!" );
873 if( nOldSz != nBytes )
877 sal_Int32 nMaxPage =
m_pFat->GetMaxPage();
903 if (pPg.is() && m_nOffset < pPg->
GetSize())
930 if(
static_cast<sal_Int32
>(nBytes) >
n )
931 nBytes =
static_cast<short>(
n);
935 void *
p =
static_cast<sal_uInt8 *
>(pBuf) + nDone;
942 memcpy(
p, pPg->GetData(), nBytes );
980 sal_Int32 nOld =
GetPos();
989 if(
static_cast<sal_Int32
>(nBytes) >
n )
990 nBytes =
static_cast<short>(
n);
994 const void *
p =
static_cast<const sal_uInt8 *
>(pBuf) + nDone;
1001 memcpy( pPg->GetData(),
p, nBytes );
1023 if( nRes != nBytes )
1049 p.m_aEntry.GetSize() );
1057 OSL_ENSURE(
m_pFat &&
m_pData,
"The pointers should not be empty!" );
1073 sal_Int32 nBytePos =
GetPos();
1076 sal_Int32 nDone = 0;
1080 if(
static_cast<sal_Int32
>(nBytes) >
n )
1081 nBytes =
static_cast<short>(
n);
1092 short nRes =
static_cast<short>(
m_pData->
Read(
static_cast<sal_uInt8*
>(pBuf) + nDone, nBytes ));
1098 if( nRes != nBytes )
1112 sal_Int32 nDone = 0;
1113 sal_Int32 nOldPos =
GetPos();
1123 if(
static_cast<sal_Int32
>(nBytes) >
n )
1124 nBytes =
static_cast<short>(
n);
1135 short nRes =
static_cast<short>(
m_pData->
Write(
static_cast<sal_uInt8 const *
>(pBuf) + nDone, nBytes ));
1141 if( nRes != nBytes )
1156#define THRESHOLD 32768L
1161 : ( nInitSize ? nInitSize : 16 ), 4096 )
1173 const sal_uInt64 nCur = rSrc.
Tell();
1177 std::unique_ptr<sal_uInt8[]>
p(
new sal_uInt8[ 4096 ]);
1182 const sal_uInt64 nn = std::min<sal_uInt64>(
n, 4096);
1230 const sal_uInt64 nCur =
Tell();
1232 std::unique_ptr<sal_uInt8[]>
p(
new sal_uInt8[ 4096 ]);
1238 const sal_uInt64 nb = std::min<sal_uInt64>(
i, 4096);
1240 && s->WriteBytes(
p.get(), nb) == nb)
1252 memset(
p.get(), 0x00, 4096);
1256 const sal_uInt64 nb = std::min<sal_uInt64>(
i, 4096);
1257 if (s->WriteBytes(
p.get(), nb) == nb)
1303 sal_uInt32 nCur =
Tell();
1304 sal_uInt32 nNew = nCur +
n;
static sal_Int32 GetFromPage(const rtl::Reference< StgPage > &rPage, short nOff)
rtl::Reference< StgPage > Get(sal_Int32, bool)
rtl::Reference< StgPage > Copy(sal_Int32, sal_Int32=STG_FREE)
bool Write(sal_Int32 nPage, void const *pBuf)
short GetPhysPageSize() const
rtl::Reference< StgPage > Find(sal_Int32)
bool SetSize(sal_Int32 nPages)
void SetToPage(const rtl::Reference< StgPage > &rPage, short nOff, sal_Int32 nVal)
sal_Int32 GetPhysPages() const
void SetDirty(const rtl::Reference< StgPage > &rPage)
bool Read(sal_Int32 nPage, void *pBuf)
virtual sal_Int32 Read(void *, sal_Int32) override
virtual bool SetSize(sal_Int32) override
void Init(sal_Int32 nBgn, sal_Int32 nLen)
StgDataStrm(StgIo &, sal_Int32 nBgn, sal_Int32 nLen=-1)
virtual sal_Int32 Write(const void *, sal_Int32) override
void * GetPtr(sal_Int32 nPos, bool bDirty)
void SetLeaf(StgEntryRef, sal_Int32)
void SetSize(sal_Int32 n)
bool SetPage(short, sal_Int32)
virtual bool Pos2Page(sal_Int32 nBytePos) override
sal_Int32 GetPage() const
StgFATStrm(StgIo &, sal_Int32 nFatStrmSize)
virtual bool SetSize(sal_Int32) override
rtl::Reference< StgPage > GetPhysPage(sal_Int32 nPage)
bool InitNew(sal_Int32 nPage1)
sal_Int32 AllocPages(sal_Int32 nStart, sal_Int32 nPages)
sal_Int32 GetNextPage(sal_Int32 nPg)
bool FreePages(sal_Int32 nStart, bool bAll)
sal_Int32 FindBlock(sal_Int32 &nPages)
StgFAT(StgStrm &rStrm, bool bMark)
bool MakeChain(sal_Int32 nStart, sal_Int32 nPages)
short GetDataPageSize() const
StgDataStrm * m_pDataStrm
StgSmallStrm(StgIo &, sal_Int32 nBgn)
virtual sal_Int32 Write(const void *, sal_Int32) override
virtual sal_Int32 Read(void *, sal_Int32) override
void Init(sal_Int32 nBgn, sal_Int32 nLen)
void SetEntry(StgDirEntry &)
virtual sal_Int32 Read(void *, sal_Int32)
o3tl::sorted_vector< sal_Int32 > m_aUsedPageNumbers
virtual sal_Int32 Write(const void *, sal_Int32)
void SetPos(sal_Int32 nPos, bool bValid)
virtual bool SetSize(sal_Int32)
sal_Int32 scanBuildPageChainCache()
sal_Int32 GetPages() const
sal_Int32 GetSize() const
std::vector< sal_Int32 > m_aPagesCache
sal_Int32 GetPage() const
std::unique_ptr< StgFAT > m_pFat
bool Copy(sal_Int32 nFrom, sal_Int32 nBytes)
virtual bool Pos2Page(sal_Int32 nBytePos)
StgTmpStrm(sal_uInt64=16)
virtual void SetSize(sal_uInt64) override
virtual ~StgTmpStrm() override
virtual std::size_t PutData(const void *pData, std::size_t nSize) override
virtual void FlushData() override
virtual sal_uInt64 SeekPos(sal_uInt64 nPos) override
sal_uInt64 GetSize() const
virtual sal_uInt64 SeekPos(sal_uInt64 nPos) override
virtual std::size_t PutData(const void *pData, std::size_t nSize) override
bool ReAllocateMemory(tools::Long nDiff)
virtual void SetSize(sal_uInt64 nSize) override
virtual void FlushData() override
virtual sal_uInt64 TellEnd()
void SetBufferSize(sal_uInt16 m_nBufSize)
std::size_t WriteBytes(const void *pData, std::size_t nSize)
bool SetStreamSize(sal_uInt64 nSize)
void SetError(ErrCode nErrorCode)
sal_uInt64 Seek(sal_uInt64 nPos)
std::size_t ReadBytes(void *pData, std::size_t nSize)
void reserve(size_type amount)
std::pair< const_iterator, bool > insert(Value &&x)
#define SVSTREAM_FILEFORMAT_ERROR
#define ERRCODE_IO_WRONGFORMAT
#define SVSTREAM_GENERALERROR
#define SAL_WARN(area, stream)
std::unique_ptr< sal_Int32[]> pData
OUString CreateTempURL(const OUString *pParent, bool bDirectory)
#define STREAM_SEEK_TO_END