summaryrefslogtreecommitdiffstats
path: root/xbmc/addons/VFSEntry.h
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/addons/VFSEntry.h')
-rw-r--r--xbmc/addons/VFSEntry.h311
1 files changed, 311 insertions, 0 deletions
diff --git a/xbmc/addons/VFSEntry.h b/xbmc/addons/VFSEntry.h
new file mode 100644
index 0000000..f600ac1
--- /dev/null
+++ b/xbmc/addons/VFSEntry.h
@@ -0,0 +1,311 @@
+/*
+ * Copyright (C) 2013 Arne Morten Kvarving
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#pragma once
+
+#include "FileItem.h"
+#include "addons/binary-addons/AddonDll.h"
+#include "addons/binary-addons/AddonInstanceHandler.h"
+#include "addons/kodi-dev-kit/include/kodi/addon-instance/VFS.h"
+#include "filesystem/IDirectory.h"
+#include "filesystem/IFile.h"
+#include "filesystem/IFileDirectory.h"
+
+#include <utility>
+
+namespace ADDON
+{
+struct AddonEvent;
+
+class CVFSEntry;
+typedef std::shared_ptr<CVFSEntry> VFSEntryPtr;
+
+class CVFSAddonCache : public CAddonDllInformer
+{
+public:
+ virtual ~CVFSAddonCache();
+ void Init();
+ void Deinit();
+ const std::vector<VFSEntryPtr> GetAddonInstances();
+ VFSEntryPtr GetAddonInstance(const std::string& strId);
+
+protected:
+ void Update(const std::string& id);
+ void OnEvent(const AddonEvent& event);
+ bool IsInUse(const std::string& id) override;
+
+ CCriticalSection m_critSection;
+ std::vector<VFSEntryPtr> m_addonsInstances;
+};
+
+ //! \brief A virtual filesystem entry add-on.
+ class CVFSEntry : public IAddonInstanceHandler
+ {
+ public:
+ //! \brief A structure encapsulating properties of supplied protocol.
+ struct ProtocolInfo
+ {
+ bool supportPath; //!< Protocol has path in addition to server name
+ bool supportUsername; //!< Protocol uses logins
+ bool supportPassword; //!< Protocol supports passwords
+ bool supportPort; //!< Protocol supports port customization
+ bool supportBrowsing; //!< Protocol supports server browsing
+ bool supportWrite; //!< Protocol supports write operations
+ int defaultPort; //!< Default port to use for protocol
+ std::string type; //!< URL type for protocol
+ int label; //!< String ID to use as label in dialog
+
+ //! \brief The constructor reads the info from an add-on info structure.
+ ProtocolInfo(const AddonInfoPtr& addonInfo);
+ };
+
+ //! \brief Construct from add-on properties.
+ //! \param addonInfo General addon properties
+ explicit CVFSEntry(const AddonInfoPtr& addonInfo);
+ ~CVFSEntry() override;
+
+ // Things that MUST be supplied by the child classes
+ void* Open(const CURL& url);
+ void* OpenForWrite(const CURL& url, bool bOverWrite);
+ bool Exists(const CURL& url);
+ int Stat(const CURL& url, struct __stat64* buffer);
+ ssize_t Read(void* ctx, void* lpBuf, size_t uiBufSize);
+ ssize_t Write(void* ctx, const void* lpBuf, size_t uiBufSize);
+ int64_t Seek(void* ctx, int64_t iFilePosition, int iWhence = SEEK_SET);
+ int Truncate(void* ctx, int64_t size);
+ void Close(void* ctx);
+ int64_t GetPosition(void* ctx);
+ int64_t GetLength(void* ctx);
+ int GetChunkSize(void* ctx);
+ int IoControl(void* ctx, XFILE::EIoControl request, void* param);
+ bool Delete(const CURL& url);
+ bool Rename(const CURL& url, const CURL& url2);
+
+ bool GetDirectory(const CURL& url, CFileItemList& items, void* ctx);
+ bool DirectoryExists(const CURL& url);
+ bool RemoveDirectory(const CURL& url);
+ bool CreateDirectory(const CURL& url);
+ void ClearOutIdle();
+ void DisconnectAll();
+
+ bool ContainsFiles(const CURL& url, CFileItemList& items);
+
+ const std::string& GetProtocols() const { return m_protocols; }
+ const std::string& GetExtensions() const { return m_extensions; }
+ bool HasFiles() const { return m_files; }
+ bool HasDirectories() const { return m_directories; }
+ bool HasFileDirectories() const { return m_filedirectories; }
+ const std::string& GetZeroconfType() const { return m_zeroconf; }
+ const ProtocolInfo& GetProtocolInfo() const { return m_protocolInfo; }
+ protected:
+ std::string m_protocols; //!< Protocols for VFS entry.
+ std::string m_extensions; //!< Extensions for VFS entry.
+ std::string m_zeroconf; //!< Zero conf announce string for VFS protocol.
+ bool m_files; //!< Vfs entry can read files.
+ bool m_directories; //!< VFS entry can list directories.
+ bool m_filedirectories; //!< VFS entry contains file directories.
+ ProtocolInfo m_protocolInfo; //!< Info about protocol for network dialog.
+ };
+
+ //! \brief Wrapper equipping a CVFSEntry with an IFile interface.
+ //! \details Needed as CVFSEntry implements several VFS interfaces
+ //! with overlapping methods.
+ class CVFSEntryIFileWrapper : public XFILE::IFile
+ {
+ public:
+ //! \brief The constructor initializes the reference to the wrapped CVFSEntry.
+ //! \param ptr The CVFSEntry to wrap.
+ explicit CVFSEntryIFileWrapper(VFSEntryPtr ptr);
+
+ //! \brief Empty destructor.
+ ~CVFSEntryIFileWrapper() override;
+
+ //! \brief Open a file.
+ //! \param[in] url URL to open.
+ //! \returns True if file was opened, false otherwise.
+ bool Open(const CURL& url) override;
+
+ //! \brief Open a file for writing.
+ //! \param[in] url URL to open.
+ //! \param[in] bOverWrite If true, overwrite an existing file.
+ //! \returns True if file was opened, false otherwise.
+ bool OpenForWrite(const CURL& url, bool bOverWrite) override;
+
+ //! \brief Check for file existence.
+ //! \param[in] url URL of file.
+ bool Exists(const CURL& url) override;
+
+ //! \brief Stat a file.
+ //! \param[in] url URL of file.
+ //! \param[out] buffer The stat info.
+ //! \details Returns 0 on success, non-zero otherwise (see fstat() return values).
+ int Stat(const CURL& url, struct __stat64* buffer) override;
+
+ //! \brief Read data from file:
+ //! \param lpBuf Buffer to read data into.
+ //! \param[in] uiBufSize Number of bytes to read.
+ //! \returns Number of bytes read.
+ ssize_t Read(void* lpBuf, size_t uiBufSize) override;
+
+ //! \brief Write data to file.
+ //! \param[in] lpBuf Data to write.
+ //! \param[in] uiBufSize Number of bytes to write.
+ //! \returns Number of bytes written.
+ ssize_t Write(const void* lpBuf, size_t uiBufSize) override;
+
+ //! \brief Seek in file.
+ //! \param[in] iFilePosition Position to seek to.
+ //! \param[in] whence Origin for position.
+ //! \returns New file position.
+ int64_t Seek(int64_t iFilePosition, int whence = SEEK_SET) override;
+
+ //! \brief Truncate a file.
+ //! \param[in] size Size of new file.
+ int Truncate(int64_t size) override;
+
+ //! \brief Close file.
+ void Close() override;
+
+ //! \brief Obtain current file position.
+ int64_t GetPosition() override;
+
+ //! \brief Obtain file size.
+ int64_t GetLength() override;
+
+ //! \brief Obtain chunksize of file.
+ int GetChunkSize() override;
+
+ //! \brief Perform I/O controls for file.
+ int IoControl(XFILE::EIoControl request, void* param) override;
+
+ //! \brief Delete a file.
+ //! \param[in] url URL of file to delete.
+ bool Delete(const CURL& url) override;
+
+ //! \brief Rename a file.
+ //! \param[in] url URL of file to rename.
+ //! \param[in] url2 New URL of file.
+ bool Rename(const CURL& url, const CURL& url2) override;
+ protected:
+ void* m_context; //!< Opaque add-on specific context for opened file.
+ VFSEntryPtr m_addon; //!< Pointer to wrapped CVFSEntry.
+ };
+
+ //! \brief Wrapper equpping a CVFSEntry with an IDirectory interface.
+ //! \details Needed as CVFSEntry implements several VFS interfaces
+ //! with overlapping methods.
+ class CVFSEntryIDirectoryWrapper : public XFILE::IDirectory
+ {
+ public:
+ //! \brief The constructor initializes the reference to the wrapped CVFSEntry.
+ //! \param ptr The CVFSEntry to wrap.
+ explicit CVFSEntryIDirectoryWrapper(VFSEntryPtr ptr);
+
+ //! \brief Empty destructor.
+ ~CVFSEntryIDirectoryWrapper() override = default;
+
+ //! \brief Return directory listing.
+ //! \param[in] url URL to file to list.
+ //! \param items List of items in file.
+ //! \return True if listing succeeded, false otherwise.
+ bool GetDirectory(const CURL& url, CFileItemList& items) override;
+
+ //! \brief Check if directory exists.
+ //! \param[in] url URL to check.
+ bool Exists(const CURL& url) override;
+
+ //! \brief Delete directory.
+ //! \param[in] url URL to delete.
+ bool Remove(const CURL& url) override;
+
+ //! \brief Create directory.
+ //! \param[in] url URL to delete.
+ bool Create(const CURL& url) override;
+
+ //! \brief Static helper for doing a keyboard callback.
+ static bool DoGetKeyboardInput(void* context, const char* heading,
+ char** input, bool hidden_input);
+
+ //! \brief Get keyboard input.
+ bool GetKeyboardInput2(const char* heading, char** input, bool hidden_input);
+
+ //! \brief Static helper for displaying an error dialog.
+ static void DoSetErrorDialog(void* ctx, const char* heading,
+ const char* line1, const char* line2,
+ const char* line3);
+
+ //! \brief Show an error dialog.
+ void SetErrorDialog2(const char* heading, const char* line1,
+ const char* line2, const char* line3);
+
+ //! \brief Static helper for requiring authentication.
+ static void DoRequireAuthentication(void* ctx, const char* url);
+
+ //! \brief Require authentication.
+ void RequireAuthentication2(const CURL& url);
+ protected:
+ VFSEntryPtr m_addon; //!< Pointer to wrapper CVFSEntry.
+ };
+
+ //! \brief Wrapper equpping a CVFSEntry with an IFileDirectory interface.
+ //! \details Needed as CVFSEntry implements several VFS interfaces
+ //! with overlapping methods.
+ class CVFSEntryIFileDirectoryWrapper : public XFILE::IFileDirectory,
+ public CVFSEntryIDirectoryWrapper
+ {
+ public:
+ //! \brief The constructor initializes the reference to the wrapped CVFSEntry.
+ //! \param ptr The CVFSEntry to wrap.
+ explicit CVFSEntryIFileDirectoryWrapper(VFSEntryPtr ptr)
+ : CVFSEntryIDirectoryWrapper(std::move(ptr))
+ {
+ }
+
+ //! \brief Empty destructor.
+ ~CVFSEntryIFileDirectoryWrapper() override = default;
+
+ //! \brief Check if the given file should be treated as a directory.
+ //! \param[in] url URL for file to probe.
+ bool ContainsFiles(const CURL& url) override
+ {
+ return m_addon->ContainsFiles(url, m_items);
+ }
+
+ //! \brief Return directory listing.
+ //! \param[in] url URL to file to list.
+ //! \param items List of items in file.
+ //! \return True if listing succeeded, false otherwise.
+ bool GetDirectory(const CURL& url, CFileItemList& items) override
+ {
+ return CVFSEntryIDirectoryWrapper::GetDirectory(url, items);
+ }
+
+ //! \brief Check if directory exists.
+ //! \param[in] url URL to check.
+ bool Exists(const CURL& url) override
+ {
+ return CVFSEntryIDirectoryWrapper::Exists(url);
+ }
+
+ //! \brief Delete directory.
+ //! \param[in] url URL to delete.
+ bool Remove(const CURL& url) override
+ {
+ return CVFSEntryIDirectoryWrapper::Remove(url);
+ }
+
+ //! \brief Create directory.
+ //! \param[in] url URL to delete.
+ bool Create(const CURL& url) override
+ {
+ return CVFSEntryIDirectoryWrapper::Create(url);
+ }
+
+ CFileItemList m_items; //!< Internal list of items, used for cache purposes.
+ };
+
+} /*namespace ADDON*/