23#include <com/sun/star/embed/XStorage.hpp>
24#include <com/sun/star/embed/ElementModes.hpp>
25#include <com/sun/star/beans/XPropertySet.hpp>
27#include <osl/file.hxx>
39#include <com/sun/star/uno/Reference.h>
48 if( !rName.isEmpty() )
64 if( nMode & StreamMode::WRITE )
83 constexpr int BUFSIZE = 64 * 1024;
88 if (nRead !=
static_cast<sal_Int32
>(pDestStm->
WriteBytes(pMem.get(), nRead)))
105 if( StreamMode::WRITE & pStm->
GetMode() )
159 if( nNewSize <
nPos )
196 OSL_FAIL(
"Not implemented!");
217#define INIT_SotStorage() \
218 : m_pOwnStg( nullptr ) \
219 , m_pStorStm( nullptr ) \
220 , m_nError( ERRCODE_NONE ) \
221 , m_bIsRoot( false ) \
222 , m_bDelStm( false ) \
223 , m_nVersion( SOFFICE_FILEFORMAT_CURRENT )
225#define ERASEMASK ( StreamMode::TRUNC | StreamMode::WRITE | StreamMode::SHARE_DENYALL )
231 CreateStorage(
true, nMode );
232 if ( IsOLEStorage() )
243 ::utl::UCBContentHelper::Kill(
m_aName );
246 if ( aObj.
GetProtocol() == INetProtocol::NotValid )
249 osl::FileBase::getFileURLFromSystemPath(
m_aName,
aURL );
266 if ( !bIsUCBStorage && bForceUCBStorage )
268 bIsUCBStorage = !Storage::IsStorageFile(
m_pStorStm );
284 else if ( bForceUCBStorage )
298 if ( bForceUCBStorage )
314 CreateStorage( bUCBStorage, nMode );
315 if ( IsOLEStorage() )
325 SignAsRoot( pStor->IsRoot() );
332 if ( IsOLEStorage() )
345 m_pOwnStg =
new Storage( rStm,
false );
349 if ( IsOLEStorage() )
352 SignAsRoot( m_pOwnStg->IsRoot() );
364 m_pOwnStg =
new Storage( rStm,
false );
368 if ( IsOLEStorage() )
371 SignAsRoot( m_pOwnStg->IsRoot() );
383 m_pOwnStg =
new Storage( *pStm,
false );
389 if ( IsOLEStorage() )
392 SignAsRoot( m_pOwnStg->IsRoot() );
404 std::unique_ptr<SvMemoryStream> pStm(
new SvMemoryStream( 0x8000, 0x8000 ));
420 OUString
aName( rFileName );
422 if ( aObj.
GetProtocol() == INetProtocol::NotValid )
425 osl::FileBase::getFileURLFromSystemPath(
aName,
aURL );
443 bRet = Storage::IsStorageFile( pStream );
460 const OUString & rUserTypeName )
540 nMode |= StreamMode::SHARE_DENYALL;
547 if( nMode & StreamMode::TRUNC )
562 nMode |= StreamMode::SHARE_DENYALL;
621 SotStorage * pNewSt,
const OUString & rNewName )
652 return Storage::IsStorageFile( rFileName );
657 return Storage::IsStorageFile( pStream );
663 sal_Int32 nEleMode = embed::ElementModes::SEEKABLEREAD;
664 if ( nMode & StreamMode::WRITE )
665 nEleMode |= embed::ElementModes::WRITE;
666 if ( nMode & StreamMode::TRUNC )
667 nEleMode |= embed::ElementModes::TRUNCATE;
668 if ( nMode & StreamMode::NOCREATE )
669 nEleMode |= embed::ElementModes::NOCREATE;
671 std::unique_ptr<SvStream> pStream;
674 uno::Reference < io::XStream >
xStream = xStorage->openStreamElement( rEleName, nEleMode );
677 if ( nMode & StreamMode::WRITE )
679 uno::Reference < beans::XPropertySet > xStreamProps(
xStream, uno::UNO_QUERY_THROW );
680 xStreamProps->setPropertyValue(
"MediaType",
681 uno::Any( OUString(
"application/vnd.sun.star.oleobject" ) ) );
686 catch ( uno::Exception& )
693 return new SotStorage( pStream.release(),
true );
698 uno::Reference< beans::XPropertySet > xProps( xStorage, uno::UNO_QUERY );
705 xProps->getPropertyValue(
"MediaType") >>= aMediaType;
707 catch (uno::Exception
const&)
712 if ( !aMediaType.isEmpty() )
714 css::datatransfer::DataFlavor aDataFlavor;
715 aDataFlavor.MimeType = aMediaType;
725 switch( nSotFormatID )
764 rStorage->FillInfoList(&infos);
766 for (
const auto& info: infos)
772 const size_t nSize =
xStream->GetSize();
773 const size_t nRead =
xStream->ReadBytes(rBuf.data(), nSize);
774 SAL_INFO(
"sot",
"Read " << nRead <<
"bytes");
776 else if (info.IsStorage())
781 traverse(xStorage, rBuf);
793 std::vector<unsigned char> aTmpBuf(nSize);
794 traverse(xRootStorage, aTmpBuf);
virtual sal_uInt64 Seek(sal_uInt64 nPos)=0
virtual sal_Int32 Read(void *pData, sal_Int32 nSize)=0
virtual sal_Int32 Write(const void *pData, sal_Int32 nSize)=0
virtual sal_uInt64 GetSize() const =0
virtual bool SetSize(sal_uInt64 nNewSize)=0
virtual void Remove(const OUString &rEleName)=0
virtual void FillInfoList(SvStorageInfoList *) const =0
virtual bool IsStream(const OUString &rEleName) const =0
virtual bool IsRoot() const =0
virtual void SetClass(const SvGlobalName &rClass, SotClipboardFormatId nOriginalClipFormat, const OUString &rUserTypeName)=0
virtual BaseStorage * OpenStorage(const OUString &rEleName, StreamMode=StreamMode::STD_READWRITE, bool bDirect=false)=0
virtual BaseStorageStream * OpenStream(const OUString &rEleName, StreamMode=StreamMode::STD_READWRITE, bool bDirect=true)=0
virtual bool ValidateFAT()=0
virtual OUString GetUserName()=0
virtual bool IsContained(const OUString &rEleName) const =0
virtual const OUString & GetName() const =0
virtual bool IsStorage(const OUString &rEleName) const =0
virtual SvGlobalName GetClassName()=0
virtual bool CopyTo(BaseStorage *pDestStg) const =0
virtual SotClipboardFormatId GetFormat()=0
OUString GetMainURL(DecodeMechanism eMechanism, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const
INetProtocol GetProtocol() const
bool SetURL(std::u16string_view rTheAbsURIRef, EncodeMechanism eMechanism=EncodeMechanism::WasEncoded, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8)
static SotClipboardFormatId GetFormat(const css::datatransfer::DataFlavor &rFlavor)
BaseStorageStream * pOwnStm
sal_uInt32 GetSize() const
virtual void ResetError() override
virtual void SetSize(sal_uInt64 nNewSize) override
SotStorageStream(BaseStorageStream *pBaseStream)
virtual void FlushData() override
virtual std::size_t PutData(const void *pData, std::size_t nSize) override
virtual sal_uInt64 SeekPos(sal_uInt64 nPos) override
virtual std::size_t GetData(void *pData, std::size_t nSize) override
virtual ~SotStorageStream() override
virtual sal_uInt64 TellEnd() override
bool SetProperty(OUString const &rName, css::uno::Any const &rValue)
std::unique_ptr< SvMemoryStream > CreateMemoryStream()
bool IsContained(const OUString &rEleName) const
bool Remove(const OUString &rEleName)
sal_Int32 GetVersion() const
bool IsStream(const OUString &rEleName) const
bool CopyTo(SotStorage *pDestStg)
void CreateStorage(bool bUCBStorage, StreamMode)
bool IsStorage(const OUString &rEleName) const
static SotClipboardFormatId GetFormatID(css::uno::Reference< css::embed::XStorage > const &xStorage)
void FillInfoList(SvStorageInfoList *) const
const OUString & GetName() const
virtual ~SotStorage() override
tools::SvRef< SotStorageStream > OpenSotStream(const OUString &rEleName, StreamMode=StreamMode::STD_READWRITE)
static bool IsStorageFile(OUString const &rFileName)
SotStorage(OUString const &rString, StreamMode eMode=StreamMode::STD_READWRITE)
SotClipboardFormatId GetFormat()
bool IsOLEStorage() const
SvGlobalName GetClassName()
void SetClass(const SvGlobalName &rClass, SotClipboardFormatId bOriginalClipFormat, const OUString &rUserTypeName)
void SignAsRoot(bool bRoot)
void SetError(ErrCode nErrorCode)
static SotStorage * OpenOLEStorage(css::uno::Reference< css::embed::XStorage > const &xStorage, OUString const &rEleName, StreamMode=StreamMode::STD_READWRITE)
SotStorage * OpenSotStorage(const OUString &rEleName, StreamMode=StreamMode::STD_READWRITE, bool transacted=true)
friend class SotStorageStream
void CopyTo(SotTempStream *pDestStm)
SotTempStream(OUString const &rString, StreamMode=StreamMode::STD_READWRITE)
virtual ~SotTempStream() override
StreamMode GetMode() const
virtual void ResetError()
virtual void SetSize(sal_uInt64 nSize)
std::size_t WriteBytes(const void *pData, std::size_t nSize)
void SetError(ErrCode nErrorCode)
sal_uInt64 Seek(sal_uInt64 nPos)
std::size_t ReadBytes(void *pData, std::size_t nSize)
sal_uInt64 remainingSize()
bool SetProperty(const OUString &rName, const css::uno::Any &rValue)
static bool IsStorageFile(SvStream *)
static std::unique_ptr< SvStream > CreateStream(const OUString &rFileName, StreamMode eOpenMode, css::uno::Reference< css::awt::XWindow > xParentWin=nullptr)
#define DBG_ASSERT(sCon, aError)
#define TOOLS_INFO_EXCEPTION(area, stream)
#define ERRCODE_IO_GENERAL
#define SVSTREAM_GENERALERROR
#define ERRCODE_IO_NOTSUPPORTED
#define SVSTREAM_CANNOT_MAKE
#define SAL_INFO(area, stream)
std::unique_ptr< sal_Int32[]> pData
css::uno::Reference< css::linguistic2::XProofreadingIterator > get(css::uno::Reference< css::uno::XComponentContext > const &context)
static SvLockBytesRef MakeLockBytes_Impl(const OUString &rName, StreamMode nMode)
#define INIT_SotStorage()
SotStorage::SotStorage()
SAL_DLLPUBLIC_EXPORT bool TestImportOLE2(SvStream &rStream)
std::vector< SvStorageInfo > SvStorageInfoList