22#include <osl/file.hxx>
41#define INTERNAL_MODE ( StreamMode::READ | StreamMode::TRUNC )
47 : m_bAutoCommit( false )
79 : nStreamMode( nMode ), pIo(
p ), pEntry( pe )
126 StreamMode nCurMode = (
p &&
p->m_nRefCnt ) ?
p->m_nMode : StreamMode::SHARE_DENYALL;
127 if( (
m & StreamMode::READWRITE ) == StreamMode::READ )
130 if( ( (
m & StreamMode::SHARE_DENYWRITE )
131 && ( nCurMode & StreamMode::SHARE_DENYWRITE ) )
132 || ( (
m & StreamMode::SHARE_DENYALL )
133 && ( nCurMode & StreamMode::SHARE_DENYALL ) ) )
141 if( (
m & StreamMode::SHARE_DENYALL )
142 && ( nCurMode & StreamMode::SHARE_DENYALL ) )
252 if( !(
m_nMode & StreamMode::WRITE ) )
303bool Storage::IsStorageFile(
const OUString & rFileName )
306 if( aIo.
Open( rFileName, StreamMode::STD_READ ) )
311bool Storage::IsStorageFile(
SvStream* pStream )
319 bRet = ( aHdr.
Load( *pStream ) && aHdr.
Check() );
324 pStream->
Seek( nPos );
334Storage::Storage( OUString aFile,
StreamMode m,
bool bDirect )
336 ,
aName(
std::move( aFile )), bIsRoot( false )
339 if(
aName.isEmpty() )
347 if( pIo->Open(
aName, m ) )
349 Init( ( m & ( StreamMode::TRUNC | StreamMode::NOCREATE ) ) == StreamMode::TRUNC );
352 pEntry->m_bDirect = bDirect;
354 pEntry->m_bTemp = bTemp;
359 pIo->MoveError( *
this );
366Storage::Storage(
SvStream& r,
bool bDirect )
370 m_nMode = StreamMode::READ;
372 m_nMode = StreamMode::READ | StreamMode::WRITE;
375 pIo->SetStrm( &r,
false );
382 pEntry->m_bDirect = bDirect;
383 pEntry->m_nMode = m_nMode;
385 pIo->MoveError( *
this );
398 m_nMode = StreamMode::READ;
410 OSL_FAIL(
"UCBStorageStream can not provide SvStream implementation!" );
417 m_nMode = StreamMode::READ | StreamMode::WRITE;
419 pIo->SetStrm( &rStrm );
427 pEntry->m_bDirect = bDirect;
428 pEntry->m_nMode = m_nMode;
431 pIo->MoveError( *
this );
437void Storage::Init(
bool bCreate )
440 bool bHdrLoaded =
false;
443 OSL_ENSURE( pIo,
"The pointer may not be empty at this point!" );
444 if( pIo->Good() && pIo->GetStrm() )
446 sal_uInt64 nSize = pIo->GetStrm()->TellEnd();
447 pIo->GetStrm()->Seek( 0 );
450 bHdrLoaded = pIo->Load();
451 if( !bHdrLoaded && !bCreate )
454 SetError( SVSTREAM_FILEFORMAT_ERROR );
465 if( pIo->Good() && pIo->m_pTOC )
467 pEntry = pIo->m_pTOC->GetRoot();
494 if( pEntry->m_nRefCnt && pEntry->m_bDirect && (m_nMode & StreamMode::WRITE) )
496 if( pEntry->m_nRefCnt == 1 )
497 pEntry->Invalidate(
false);
503 if( bIsRoot && pEntry && pEntry->m_bTemp )
505 osl::File::remove(
GetName() );
509const OUString& Storage::GetName()
const
512 pEntry->m_aEntry.GetName(
const_cast<Storage*
>(
this)->aName );
530 pList->push_back( aInfo );
540 OSL_FAIL(
"Not supported!");
541 return OpenStorage( rName, m, bDirect );
546 return OpenStorage( rName, m, bDirect );
551 if( !
Validate() || !ValidateMode( m ) )
552 return new Storage( pIo,
nullptr, m );
553 if( bDirect && !pEntry->m_bDirect )
559 if( !( m & StreamMode::NOCREATE ) )
563 OUString aNewName = rName;
564 if( aNewName.isEmpty() )
566 aNewName =
"Temp Stg " + OUString::number( ++
nTmpCount );
569 p = pIo->m_pTOC->Create( *pEntry, aNewName,
STG_STORAGE );
574 pIo->SetError( ( m & StreamMode::WRITE )
575 ? SVSTREAM_CANNOT_MAKE : SVSTREAM_FILE_NOT_FOUND );
577 else if( !ValidateMode( m, p ) )
581 pIo->SetError( SVSTREAM_FILE_NOT_FOUND );
587 if( p && pEntry->m_nRefCnt == 1 )
588 p->m_bDirect = bDirect;
591 if( p && (m & StreamMode::WRITE ))
593 if(
p->m_bDirect != bDirect )
597 pIo->MoveError( *pStg );
598 if( m & StreamMode::WRITE ) pStg->m_bAutoCommit =
true;
606 if( !
Validate() || !ValidateMode( m ) )
612 if( !( m & StreamMode::NOCREATE ) )
616 OUString aNewName( rName );
617 if( aNewName.isEmpty() )
619 aNewName =
"Temp Strm " + OUString::number( ++
nTmpCount );
622 p = pIo->m_pTOC->Create( *pEntry, aNewName,
STG_STREAM );
625 pIo->SetError( ( m & StreamMode::WRITE )
626 ? SVSTREAM_CANNOT_MAKE : SVSTREAM_FILE_NOT_FOUND );
628 else if( !ValidateMode( m, p ) )
634 pIo->SetError( SVSTREAM_FILE_NOT_FOUND );
640 p->m_bDirect = pEntry->m_bDirect;
643 if( p && !
p->m_bDirect )
645 pIo->MoveError( *pStm );
651void Storage::Remove(
const OUString& rName )
658 p->Invalidate(
true );
662 SetError( SVSTREAM_FILE_NOT_FOUND );
668bool Storage::CopyTo(
const OUString& rElem,
BaseStorage* pDest,
const OUString& rNew )
683 ErrCode nTmpErr = p2->GetError();
686 p2->SetClassId( p1->GetClassId() );
687 p1->CopyTo( p2.
get() );
690 nTmpErr = p2->GetError();
700 return Good() && pDest->
Good();
710 ErrCode nTmpErr = p2->GetError();
713 p1->CopyTo( p2.
get() );
716 nTmpErr = p2->GetError();
726 return Good() && pDest->
Good();
729 SetError( SVSTREAM_FILE_NOT_FOUND );
744 FillInfoList( &aList );
746 for(
size_t i = 0;
i < aList.size() && bRes;
i++ )
753 return Good() && pDest->
Good();
756bool Storage::IsStorage(
const OUString& rName )
const
767bool Storage::IsStream(
const OUString& rName )
const
778bool Storage::IsContained(
const OUString& rName )
const
789bool Storage::Commit()
794 if( !( m_nMode & StreamMode::WRITE ) )
803 for(
StgDirEntry* p = aIter.First(); p && bRes; p = aIter.Next() )
805 if( bRes && bIsRoot )
807 bRes = pEntry->Commit();
809 bRes = pIo->CommitAll();
811 pIo->MoveError( *
this );
816bool Storage::Revert()
827 const OUString & rUserTypeName )
832 pEntry->m_aEntry.SetClassId( rClass.
GetCLSID() );
836 aCompObj.GetClsId() = rClass.
GetCLSID();
837 aCompObj.GetCbFormat() = nOriginalClipFormat;
838 aCompObj.GetUserName() = rUserTypeName;
839 if( !aCompObj.Store() )
855 if( aCompObj.Load() )
868 if( aCompObj.Load() )
869 return aCompObj.GetCbFormat();
874OUString Storage::GetUserName()
877 if( aCompObj.Load() )
878 return aCompObj.GetUserName();
883bool Storage::ValidateFAT()
885 FatError nErr = pIo->ValidateFATs();
889void Storage::SetDirty()
895void Storage::SetClassId(
const ClsId& rId )
898 pEntry->m_aEntry.SetClassId( rId );
901const ClsId& Storage::GetClassId()
const
904 return pEntry->m_aEntry.GetClassId();
906 static const ClsId aDummyId = {0,0,0,{0,0,0,0,0,0,0,0}};
910bool Storage::Validate(
bool bValidate )
const
912 bool bRet = Validate_Impl( bValidate );
918bool Storage::ValidateMode(
StreamMode nMode )
const
920 bool bRet = ValidateMode_Impl( nMode );
928 bool bRet = ValidateMode_Impl( nMode, p );
934bool Storage::Equals(
const BaseStorage& rStorage )
const
936 const Storage* pOther =
dynamic_cast<const Storage*
>( &rStorage );
937 return pOther && ( pOther->pEntry == pEntry );
virtual BaseStorageStream * OpenStream(const OUString &rEleName, StreamMode=StreamMode::STD_READWRITE, bool bDirect=true)=0
virtual BaseStorage * OpenOLEStorage(const OUString &rEleName, StreamMode=StreamMode::STD_READWRITE, bool bDirect=false)=0
virtual void SetDirty()=0
virtual void SetClassId(const ClsId &)=0
OLEStorageBase(StgIo *, StgDirEntry *, StreamMode &)
bool Validate_Impl(bool) const
static bool ValidateMode_Impl(StreamMode, StgDirEntry const *p=nullptr)
bool Open(const OUString &rName, StreamMode)
void MoveError(StorageBase const &)
void Copy(BaseStorageStream &)
sal_Int32 Write(const void *, sal_Int32)
sal_Int32 Read(void *, sal_Int32)
sal_Int32 GetSize() const
sal_Int32 Seek(sal_Int32)
static StgDirEntry * Find(StgDirEntry &, const OUString &)
sal_Int32 GetSize() const
void GetName(OUString &rName) const
StgEntryType GetType() const
void SetError(ErrCode) const
virtual bool Validate(bool=false) const =0
virtual ~StorageBase() override
void SetAutoCommit(bool bSet)
virtual void Flush() override
virtual bool ValidateMode(StreamMode) const override
virtual bool Commit() final override
virtual sal_uInt64 GetSize() const override
virtual sal_Int32 Read(void *pData, sal_Int32 nSize) override
virtual ~StorageStream() override
virtual bool Equals(const BaseStorageStream &rStream) const override
virtual void CopyTo(BaseStorageStream *pDestStm) override
virtual bool Validate(bool=false) const override
StorageStream(StgIo *, StgDirEntry *, StreamMode)
virtual sal_Int32 Write(const void *pData, sal_Int32 nSize) override
virtual bool SetSize(sal_uInt64 nNewSize) override
virtual sal_uInt64 Seek(sal_uInt64 nPos) override
const SvGUID & GetCLSID() const
const OUString & GetName() const
SvStorageInfo(const StgDirEntry &)
virtual void ResetError()
virtual sal_uInt64 TellEnd()
sal_uInt64 Seek(sal_uInt64 nPos)
ErrCode const & GetErrorCode() const
#define DBG_ASSERT(sCon, aError)
virtual OUString GetName() const override
#define SVSTREAM_ACCESS_DENIED
#define ERRCODE_IO_CANTSEEK
std::unique_ptr< sal_Int32[]> pData
OUString CreateTempName()
static tools::Long nTmpCount
std::vector< SvStorageInfo > SvStorageInfoList