95 sal_Int32 nFatStrmSize;
96 if (o3tl::checked_multiply<sal_Int32>(
m_aHdr.
GetFATSize(), nPhysPageSize, nFatStrmSize))
162 std::unique_ptr<sal_Int32[]> pFat;
163 std::unique_ptr<bool[]> pFree;
168 EasyFat(
StgIo & rIo,
StgStrm *pFatStream, sal_Int32 nPSize );
170 sal_Int32 GetPageSize()
const {
return nPageSize; }
172 FatError Mark( sal_Int32 nPage, sal_Int32 nCount, sal_Int32 nExpect );
173 bool HasUnrefChains()
const;
178EasyFat::EasyFat(
StgIo& rIo,
StgStrm* pFatStream, sal_Int32 nPSize )
179 : nPages(pFatStream->GetSize() >> 2), nPageSize(nPSize)
181 pFat.reset(
new sal_Int32[ nPages ] );
182 pFree.reset(
new bool[ nPages ] );
187 for( sal_Int32 nPage = 0; nPage < nPages; nPage++ )
189 if( ! (nPage % nFatPageSize) )
192 sal_Int32 nPhysPage = pFatStream->
GetPage();
193 pPage = rIo.
Get( nPhysPage,
true );
197 pFree[ nPage ] =
true;
201bool EasyFat::HasUnrefChains()
const
203 for( sal_Int32 nPage = 0; nPage < nPages; nPage++ )
205 if( pFree[ nPage ] && pFat[ nPage ] != -1 )
211FatError EasyFat::Mark( sal_Int32 nPage, sal_Int32 nCount, sal_Int32 nExpect )
220 sal_Int32 nCurPage = nPage;
223 if( nCurPage < 0 || nCurPage >= nPages )
225 pFree[ nCurPage ] =
false;
226 nCurPage = pFat[ nCurPage ];
228 if( nCurPage != nExpect && nCount == 1 )
231 if( nCurPage == nExpect && nCount != 1 && nCount != -1 )
234 if( nCurPage == nExpect && nCount == -1 )
254 FatError ValidateDirectoryEntries();
259 explicit Validator(
StgIo &rIo );
265Validator::Validator(
StgIo &rIoP )
266 : aSmallFat( rIoP, rIoP.m_pDataFAT, 1 << rIoP.m_aHdr.GetDataPageSize() ),
267 aFat( rIoP, rIoP.m_pFAT, 1 << rIoP.m_aHdr.GetPageSize() ),
274 else if( ( nErr = ValidateDirectoryEntries() ) !=
FatError::Ok )
276 else if( ( nErr = FindUnrefedChains()) !=
FatError::Ok )
280FatError Validator::ValidateMasterFATs()
287 for( sal_Int32 i = 0;
i <
nCount;
i++ )
306 for(
StgDirEntry* p = aIter.First(); p ; p = aIter.Next() )
316 sal_Int32 nSize =
p->m_aEntry.GetSize();
318 nErr = aSmallFat.Mark(
p->m_aEntry.GetStartPage(),nSize, -2 );
320 nErr = aFat.Mark(
p->m_aEntry.GetStartPage(),nSize, -2 );
328FatError Validator::ValidateDirectoryEntries()
354FatError Validator::FindUnrefedChains()
const
356 if( aSmallFat.HasUnrefChains() ||
357 aFat.HasUnrefChains() )
367 std::optional<Validator> pV( *
this );
368 bool bRet1 = !pV->IsError(), bRet2 = true ;
377 StreamMode::READ | StreamMode::SHARE_DENYNONE) &&
381 bRet2 = !pV->IsError();
bool Open(const OUString &rName, StreamMode)
static sal_Int32 GetFromPage(const rtl::Reference< StgPage > &rPage, short nOff)
ErrCode const & GetError() const
rtl::Reference< StgPage > Get(sal_Int32, bool)
void SetPhysPageSize(short)
void SetIncrement(short n)
sal_Int32 GetSize() const
sal_Int32 GetStartPage() const
sal_Int32 GetPage(sal_Int32, bool, sal_uInt16 *pnMasterAlloc=nullptr)
short GetDataPageSize() const
StgDataStrm * m_pDataStrm
void SetEntry(StgDirEntry &)
sal_Int32 GetStart() const
sal_Int32 GetPages() const
sal_Int32 GetPage() const
virtual bool Pos2Page(sal_Int32 nBytePos)
const OUString & GetFileName() const
#define SVSTREAM_WRITE_ERROR
#define SVSTREAM_FILEFORMAT_ERROR
#define SAL_WARN(area, stream)