diff options
author | Noel Grandin <noel.grandin@collabora.co.uk> | 2023-05-08 12:30:36 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2023-05-09 12:31:56 +0200 |
commit | afccbe23cecc04a08281a91e02bb25dd7b0ffdcf (patch) | |
tree | e7865f837752349ecd4b9d5c50da56cadeda9783 /svx/source/gallery2/galleryfilestorageentry.cxx | |
parent | 3efb1714d7095898389f86258e805a62e7468a19 (diff) |
merge GalleryFileStorageEntry with GalleryBinaryEngineEntry
Change-Id: I21b3f49cdf04b021931ab9e1171bfffa5cd76e1f
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/151552
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'svx/source/gallery2/galleryfilestorageentry.cxx')
-rw-r--r-- | svx/source/gallery2/galleryfilestorageentry.cxx | 159 |
1 files changed, 158 insertions, 1 deletions
diff --git a/svx/source/gallery2/galleryfilestorageentry.cxx b/svx/source/gallery2/galleryfilestorageentry.cxx index c0642145b2d8..abbc6efcaea1 100644 --- a/svx/source/gallery2/galleryfilestorageentry.cxx +++ b/svx/source/gallery2/galleryfilestorageentry.cxx @@ -18,7 +18,164 @@ */ #include <galleryfilestorageentry.hxx> +#include <gallerystoragelocations.hxx> +#include <svx/galmisc.hxx> +#include <svx/gallery1.hxx> -GalleryFileStorageEntry::~GalleryFileStorageEntry(){}; +#include <unotools/ucbstreamhelper.hxx> +#include <tools/urlobj.hxx> +#include <tools/vcompat.hxx> + +#include <com/sun/star/ucb/ContentCreationException.hpp> + +static bool FileExists(const INetURLObject& rURL, std::u16string_view rExt) +{ + INetURLObject aURL(rURL); + aURL.setExtension(rExt); + return FileExists(aURL); +} + +GalleryFileStorageEntry::GalleryFileStorageEntry() +{ + mpGalleryStorageLocations = std::make_unique<GalleryStorageLocations>(); +} + +void GalleryFileStorageEntry::setStorageLocations(INetURLObject& rURL) +{ + mpGalleryStorageLocations->SetStorageLocations(rURL); +} + +std::unique_ptr<GalleryBinaryEngine> GalleryFileStorageEntry::createGalleryStorageEngine( + GalleryObjectCollection& mrGalleryObjectCollection, bool& bReadOnly) +{ + return std::make_unique<GalleryBinaryEngine>(*mpGalleryStorageLocations, + mrGalleryObjectCollection, bReadOnly); +} + +void GalleryFileStorageEntry::CreateUniqueURL(const INetURLObject& rBaseURL, INetURLObject& aURL) +{ + INetURLObject aBaseNoCase(GalleryStorageLocations::ImplGetURLIgnoreCase(rBaseURL)); + aURL = aBaseNoCase; + static sal_Int32 nIdx = 0; + while (FileExists(aURL, u"thm")) + { // create new URLs + nIdx++; + aURL = aBaseNoCase; + aURL.setName(Concat2View(aURL.getName() + OUString::number(nIdx))); + } +} + +GalleryThemeEntry* GalleryFileStorageEntry::CreateThemeEntry(const INetURLObject& rURL, + bool bReadOnly) +{ + DBG_ASSERT(rURL.GetProtocol() != INetProtocol::NotValid, "invalid URL"); + + GalleryThemeEntry* pRet = nullptr; + + if (FileExists(rURL)) + { + std::unique_ptr<SvStream> pIStm(::utl::UcbStreamHelper::CreateStream( + rURL.GetMainURL(INetURLObject::DecodeMechanism::NONE), StreamMode::READ)); + + if (pIStm) + { + sal_uInt16 nVersion; + + pIStm->ReadUInt16(nVersion); + + if (nVersion <= 0x00ff) + { + bool bThemeNameFromResource = false; + sal_uInt32 nThemeId = 0; + + OString aTmpStr = read_uInt16_lenPrefixed_uInt8s_ToOString(*pIStm); + OUString aThemeName = OStringToOUString(aTmpStr, RTL_TEXTENCODING_UTF8); + + // execute a character conversion + if (nVersion >= 0x0004) + { + sal_uInt32 nCount; + sal_uInt16 nTemp16; + + pIStm->ReadUInt32(nCount).ReadUInt16(nTemp16); + pIStm->Seek(STREAM_SEEK_TO_END); + + // check whether there is a newer version; + // therefore jump back by 520Bytes (8 bytes ID + 512Bytes reserve buffer) + // if this is at all possible. + if (pIStm->Tell() >= 520) + { + sal_uInt32 nId1, nId2; + + pIStm->SeekRel(-520); + pIStm->ReadUInt32(nId1).ReadUInt32(nId2); + + if (nId1 == COMPAT_FORMAT('G', 'A', 'L', 'R') + && nId2 == COMPAT_FORMAT('E', 'S', 'R', 'V')) + { + VersionCompatRead aCompat(*pIStm); + + pIStm->ReadUInt32(nThemeId); + + if (aCompat.GetVersion() >= 2) + { + pIStm->ReadCharAsBool(bThemeNameFromResource); + } + } + } + } + + pRet = new GalleryThemeEntry(false, rURL, aThemeName, bReadOnly, false, nThemeId, + bThemeNameFromResource); + } + } + } + + return pRet; +} + +void GalleryFileStorageEntry::removeTheme() +{ + INetURLObject aThmURL(GetThmURL()); + INetURLObject aSdgURL(GetSdgURL()); + INetURLObject aSdvURL(GetSdvURL()); + INetURLObject aStrURL(GetStrURL()); + + KillFile(aThmURL); + KillFile(aSdgURL); + KillFile(aSdvURL); + KillFile(aStrURL); +} + +std::unique_ptr<GalleryTheme>& +GalleryFileStorageEntry::getCachedTheme(std::unique_ptr<GalleryTheme>& pNewTheme) +{ + INetURLObject aURL = GetThmURL(); + + DBG_ASSERT(aURL.GetProtocol() != INetProtocol::NotValid, "invalid URL"); + + if (FileExists(aURL)) + { + std::unique_ptr<SvStream> pIStm(::utl::UcbStreamHelper::CreateStream( + aURL.GetMainURL(INetURLObject::DecodeMechanism::NONE), StreamMode::READ)); + + if (pIStm) + { + try + { + ReadGalleryTheme(*pIStm, *pNewTheme); + + if (pIStm->GetError()) + pNewTheme.reset(); + } + catch (const css::ucb::ContentCreationException&) + { + } + } + } + return pNewTheme; +} + +SvStream& ReadGalleryTheme(SvStream& rIn, GalleryTheme& rTheme) { return rTheme.ReadData(rIn); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |