diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 18:07:22 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 18:07:22 +0000 |
commit | c04dcc2e7d834218ef2d4194331e383402495ae1 (patch) | |
tree | 7333e38d10d75386e60f336b80c2443c1166031d /xbmc/filesystem/File.h | |
parent | Initial commit. (diff) | |
download | kodi-c04dcc2e7d834218ef2d4194331e383402495ae1.tar.xz kodi-c04dcc2e7d834218ef2d4194331e383402495ae1.zip |
Adding upstream version 2:20.4+dfsg.upstream/2%20.4+dfsg
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'xbmc/filesystem/File.h')
-rw-r--r-- | xbmc/filesystem/File.h | 206 |
1 files changed, 206 insertions, 0 deletions
diff --git a/xbmc/filesystem/File.h b/xbmc/filesystem/File.h new file mode 100644 index 0000000..a5f991a --- /dev/null +++ b/xbmc/filesystem/File.h @@ -0,0 +1,206 @@ +/* + * Copyright (c) 2002 Frodo + * Portions Copyright (c) by the authors of ffmpeg and xvid + * Copyright (C) 2002-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. + */ + +#pragma once + +// File.h: interface for the CFile class. +// +////////////////////////////////////////////////////////////////////// + +#include "IFileTypes.h" +#include "URL.h" + +#include <iostream> +#include <memory> +#include <stdio.h> +#include <string> +#include <vector> + +#include "PlatformDefs.h" + +class BitstreamStats; + +namespace XFILE +{ + +class IFile; + +class CFileStreamBuffer; + +class CFile +{ +public: + CFile(); + ~CFile(); + + bool CURLCreate(const std::string &url); + bool CURLAddOption(XFILE::CURLOPTIONTYPE type, const char* name, const char * value); + bool CURLOpen(unsigned int flags); + + /** + * Attempt to open an IFile instance. + * @param file reference to CCurl file description + * @param flags see IFileTypes.h + * @return true on success, false otherwise + * + * Remarks: Open can only be called once. Calling + * Open() on an already opened file will fail + * except if flag READ_REOPEN is set and the underlying + * file has an implementation of ReOpen(). + */ + bool Open(const CURL& file, const unsigned int flags = 0); + bool Open(const std::string& strFileName, const unsigned int flags = 0); + + bool OpenForWrite(const CURL& file, bool bOverWrite = false); + bool OpenForWrite(const std::string& strFileName, bool bOverWrite = false); + + ssize_t LoadFile(const CURL& file, std::vector<uint8_t>& outputBuffer); + + /** + * Attempt to read bufSize bytes from currently opened file into buffer bufPtr. + * @param bufPtr pointer to buffer + * @param bufSize size of the buffer + * @return number of successfully read bytes if any bytes were read and stored in + * buffer, zero if no bytes are available to read (end of file was reached) + * or undetectable error occur, -1 in case of any explicit error + */ + ssize_t Read(void* bufPtr, size_t bufSize); + bool ReadString(char *szLine, int iLineLength); + /** + * Attempt to write bufSize bytes from buffer bufPtr into currently opened file. + * @param bufPtr pointer to buffer + * @param bufSize size of the buffer + * @return number of successfully written bytes if any bytes were written, + * zero if no bytes were written and no detectable error occur, + * -1 in case of any explicit error + */ + ssize_t Write(const void* bufPtr, size_t bufSize); + void Flush(); + int64_t Seek(int64_t iFilePosition, int iWhence = SEEK_SET); + int Truncate(int64_t iSize); + int64_t GetPosition() const; + int64_t GetLength(); + void Close(); + int GetChunkSize(); + const std::string GetProperty(XFILE::FileProperty type, const std::string &name = "") const; + const std::vector<std::string> GetPropertyValues(XFILE::FileProperty type, const std::string &name = "") const; + ssize_t LoadFile(const std::string& filename, std::vector<uint8_t>& outputBuffer); + + static int DetermineChunkSize(const int srcChunkSize, const int reqChunkSize); + + const std::unique_ptr<BitstreamStats>& GetBitstreamStats() const { return m_bitStreamStats; } + + int IoControl(EIoControl request, void* param); + + IFile* GetImplementation() const { return m_pFile.get(); } + + // CURL interface + static bool Exists(const CURL& file, bool bUseCache = true); + static bool Delete(const CURL& file); + /** + * Fills struct __stat64 with information about file specified by filename + * For st_mode function will set correctly _S_IFDIR (directory) flag and may set + * _S_IREAD (read permission), _S_IWRITE (write permission) flags if such + * information is available. Function may set st_size (file size), st_atime, + * st_mtime, st_ctime (access, modification, creation times). + * Any other flags and members of __stat64 that didn't updated with actual file + * information will be set to zero (st_nlink can be set ether to 1 or zero). + * @param file specifies requested file + * @param buffer pointer to __stat64 buffer to receive information about file + * @return zero of success, -1 otherwise. + */ + static int Stat(const CURL& file, struct __stat64* buffer); + static bool Rename(const CURL& file, const CURL& urlNew); + static bool Copy(const CURL& file, const CURL& dest, XFILE::IFileCallback* pCallback = NULL, void* pContext = NULL); + static bool SetHidden(const CURL& file, bool hidden); + + // string interface + static bool Exists(const std::string& strFileName, bool bUseCache = true); + /** + * Fills struct __stat64 with information about file specified by filename + * For st_mode function will set correctly _S_IFDIR (directory) flag and may set + * _S_IREAD (read permission), _S_IWRITE (write permission) flags if such + * information is available. Function may set st_size (file size), st_atime, + * st_mtime, st_ctime (access, modification, creation times). + * Any other flags and members of __stat64 that didn't updated with actual file + * information will be set to zero (st_nlink can be set ether to 1 or zero). + * @param strFileName specifies requested file + * @param buffer pointer to __stat64 buffer to receive information about file + * @return zero of success, -1 otherwise. + */ + static int Stat(const std::string& strFileName, struct __stat64* buffer); + /** + * Fills struct __stat64 with information about currently open file + * For st_mode function will set correctly _S_IFDIR (directory) flag and may set + * _S_IREAD (read permission), _S_IWRITE (write permission) flags if such + * information is available. Function may set st_size (file size), st_atime, + * st_mtime, st_ctime (access, modification, creation times). + * Any other flags and members of __stat64 that didn't updated with actual file + * information will be set to zero (st_nlink can be set ether to 1 or zero). + * @param buffer pointer to __stat64 buffer to receive information about file + * @return zero of success, -1 otherwise. + */ + int Stat(struct __stat64 *buffer); + static bool Delete(const std::string& strFileName); + static bool Rename(const std::string& strFileName, const std::string& strNewFileName); + static bool Copy(const std::string& strFileName, const std::string& strDest, XFILE::IFileCallback* pCallback = NULL, void* pContext = NULL); + static bool SetHidden(const std::string& fileName, bool hidden); + double GetDownloadSpeed(); + +private: + unsigned int m_flags = 0; + CURL m_curl; + std::unique_ptr<IFile> m_pFile; + std::unique_ptr<CFileStreamBuffer> m_pBuffer; + std::unique_ptr<BitstreamStats> m_bitStreamStats; +}; + +// streambuf for file io, only supports buffered input currently +class CFileStreamBuffer + : public std::streambuf +{ +public: + ~CFileStreamBuffer() override; + explicit CFileStreamBuffer(int backsize = 0); + + void Attach(IFile *file); + void Detach(); + +private: + int_type underflow() override; + std::streamsize showmanyc() override; + pos_type seekoff(off_type, std::ios_base::seekdir,std::ios_base::openmode = std::ios_base::in | std::ios_base::out) override; + pos_type seekpos(pos_type, std::ios_base::openmode = std::ios_base::in | std::ios_base::out) override; + + IFile* m_file; + char* m_buffer; + int m_backsize; + int m_frontsize = 0; +}; + +// very basic file input stream +class CFileStream + : public std::istream +{ +public: + explicit CFileStream(int backsize = 0); + ~CFileStream() override; + + bool Open(const std::string& filename); + bool Open(const CURL& filename); + void Close(); + + int64_t GetLength(); +private: + CFileStreamBuffer m_buffer; + std::unique_ptr<IFile> m_file; +}; + +} |