2 * Copyright (c) 2002 Frodo
3 * Portions Copyright (c) by the authors of ffmpeg and xvid
4 * Copyright (C) 2002-2018 Team Kodi
5 * This file is part of Kodi - https://kodi.tv
7 * SPDX-License-Identifier: GPL-2.0-or-later
8 * See LICENSES/README.md for more information.
13 // IFile.h: interface for the IFile class.
15 //////////////////////////////////////////////////////////////////////
17 #include "PlatformDefs.h" // for __stat64, ssize_t
25 #if !defined(SIZE_MAX) || !defined(SSIZE_MAX)
28 #define SIZE_MAX UINTPTR_MAX
31 #define SSIZE_MAX INTPTR_MAX
33 #endif // ! SIZE_MAX || ! SSIZE_MAX
35 #include "IFileTypes.h"
48 virtual bool Open(const CURL
& url
) = 0;
49 virtual bool OpenForWrite(const CURL
& url
, bool bOverWrite
= false) { return false; }
50 virtual bool ReOpen(const CURL
& url
) { return false; }
51 virtual bool Exists(const CURL
& url
) = 0;
53 * Fills struct __stat64 with information about file specified by url.
54 * For st_mode function will set correctly _S_IFDIR (directory) flag and may set
55 * _S_IREAD (read permission), _S_IWRITE (write permission) flags if such
56 * information is available. Function may set st_size (file size), st_atime,
57 * st_mtime, st_ctime (access, modification, creation times).
58 * Any other flags and members of __stat64 that didn't updated with actual file
59 * information will be set to zero (st_nlink can be set ether to 1 or zero).
60 * @param url specifies requested file
61 * @param buffer pointer to __stat64 buffer to receive information about file
62 * @return zero of success, -1 otherwise.
64 virtual int Stat(const CURL
& url
, struct __stat64
* buffer
) = 0;
66 * Fills struct __stat64 with information about currently open file
67 * For st_mode function will set correctly _S_IFDIR (directory) flag and may set
68 * _S_IREAD (read permission), _S_IWRITE (write permission) flags if such
69 * information is available. Function may set st_size (file size), st_atime,
70 * st_mtime, st_ctime (access, modification, creation times).
71 * Any other flags and members of __stat64 that didn't updated with actual file
72 * information will be set to zero (st_nlink can be set ether to 1 or zero).
73 * @param buffer pointer to __stat64 buffer to receive information about file
74 * @return zero of success, -1 otherwise.
76 virtual int Stat(struct __stat64
* buffer
);
78 * Attempt to read bufSize bytes from currently opened file into buffer bufPtr.
79 * @param bufPtr pointer to buffer
80 * @param bufSize size of the buffer
81 * @return number of successfully read bytes if any bytes were read and stored in
82 * buffer, zero if no bytes are available to read (end of file was reached)
83 * or undetectable error occur, -1 in case of any explicit error
85 virtual ssize_t
Read(void* bufPtr
, size_t bufSize
) = 0;
87 * Attempt to write bufSize bytes from buffer bufPtr into currently opened file.
88 * @param bufPtr pointer to buffer
89 * @param bufSize size of the buffer
90 * @return number of successfully written bytes if any bytes were written,
91 * zero if no bytes were written and no detectable error occur,
92 * -1 in case of any explicit error
94 virtual ssize_t
Write(const void* bufPtr
, size_t bufSize
) { return -1;}
95 virtual bool ReadString(char *szLine
, int iLineLength
);
96 virtual int64_t Seek(int64_t iFilePosition
, int iWhence
= SEEK_SET
) = 0;
97 virtual void Close() = 0;
98 virtual int64_t GetPosition() = 0;
99 virtual int64_t GetLength() = 0;
100 virtual void Flush() { }
101 virtual int Truncate(int64_t size
) { return -1; }
103 /* Returns the minimum size that can be read from input stream. *
104 * For example cdrom access where access could be sector based. *
105 * This will cause file system to buffer read requests, to *
106 * to meet the requirement of CFile. *
107 * It can also be used to indicate a file system is non buffered *
108 * but accepts any read size, have it return the value 1 */
109 virtual int GetChunkSize() {return 0;}
110 virtual double GetDownloadSpeed() { return 0.0; }
112 virtual bool Delete(const CURL
& url
) { return false; }
113 virtual bool Rename(const CURL
& url
, const CURL
& urlnew
) { return false; }
114 virtual bool SetHidden(const CURL
& url
, bool hidden
) { return false; }
116 virtual int IoControl(EIoControl request
, void* param
) { return -1; }
118 virtual const std::string
GetProperty(XFILE::FileProperty type
, const std::string
&name
= "") const
120 return type
== XFILE::FILE_PROPERTY_CONTENT_TYPE
? "application/octet-stream" : "";
123 virtual const std::vector
<std::string
> GetPropertyValues(XFILE::FileProperty type
, const std::string
&name
= "") const
125 std::vector
<std::string
> values
;
126 std::string value
= GetProperty(type
, name
);
129 values
.emplace_back(value
);
135 class CRedirectException
138 IFile
*m_pNewFileImp
;
141 CRedirectException();
143 CRedirectException(IFile
*pNewFileImp
, CURL
*pNewUrl
=NULL
);