diff options
Diffstat (limited to '')
-rw-r--r-- | xbmc/filesystem/ImageFile.cpp | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/xbmc/filesystem/ImageFile.cpp b/xbmc/filesystem/ImageFile.cpp new file mode 100644 index 0000000..bb1e23a --- /dev/null +++ b/xbmc/filesystem/ImageFile.cpp @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2012-2018 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#include "ImageFile.h" + +#include "ServiceBroker.h" +#include "TextureCache.h" +#include "URL.h" + +using namespace XFILE; + +CImageFile::CImageFile(void) = default; + +CImageFile::~CImageFile(void) +{ + Close(); +} + +bool CImageFile::Open(const CURL& url) +{ + std::string file = url.Get(); + bool needsRecaching = false; + std::string cachedFile = + CServiceBroker::GetTextureCache()->CheckCachedImage(file, needsRecaching); + if (cachedFile.empty()) + { // not in the cache, so cache it + cachedFile = CServiceBroker::GetTextureCache()->CacheImage(file); + } + if (!cachedFile.empty()) + { // in the cache, return what we have + if (m_file.Open(cachedFile)) + return true; + } + return false; +} + +bool CImageFile::Exists(const CURL& url) +{ + bool needsRecaching = false; + std::string cachedFile = + CServiceBroker::GetTextureCache()->CheckCachedImage(url.Get(), needsRecaching); + if (!cachedFile.empty()) + { + if (CFile::Exists(cachedFile, false)) + return true; + else + // Remove from cache so it gets cached again on next Open() + CServiceBroker::GetTextureCache()->ClearCachedImage(url.Get()); + } + + // need to check if the original can be cached on demand and that the file exists + if (!CTextureCache::CanCacheImageURL(url)) + return false; + + return CFile::Exists(url.GetHostName()); +} + +int CImageFile::Stat(const CURL& url, struct __stat64* buffer) +{ + bool needsRecaching = false; + std::string cachedFile = + CServiceBroker::GetTextureCache()->CheckCachedImage(url.Get(), needsRecaching); + if (!cachedFile.empty()) + return CFile::Stat(cachedFile, buffer); + + /* + Doesn't exist in the cache yet. We have 3 options here: + 1. Cache the file and do the Stat() on the cached file. + 2. Do the Stat() on the original file. + 3. Return -1; + Only 1 will return valid results, at the cost of being time consuming. ATM we do 3 under + the theory that the only user of this is the webinterface currently, where Stat() is not + required. + */ + return -1; +} + +ssize_t CImageFile::Read(void* lpBuf, size_t uiBufSize) +{ + return m_file.Read(lpBuf, uiBufSize); +} + +int64_t CImageFile::Seek(int64_t iFilePosition, int iWhence /*=SEEK_SET*/) +{ + return m_file.Seek(iFilePosition, iWhence); +} + +void CImageFile::Close() +{ + m_file.Close(); +} + +int64_t CImageFile::GetPosition() +{ + return m_file.GetPosition(); +} + +int64_t CImageFile::GetLength() +{ + return m_file.GetLength(); +} |