summaryrefslogtreecommitdiffstats
path: root/xbmc/filesystem/ImageFile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/filesystem/ImageFile.cpp')
-rw-r--r--xbmc/filesystem/ImageFile.cpp106
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();
+}