kodi
File.h
1 /*
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
6  *
7  * SPDX-License-Identifier: GPL-2.0-or-later
8  * See LICENSES/README.md for more information.
9  */
10 
11 #pragma once
12 
13 // File.h: interface for the CFile class.
14 //
16 
17 #include "IFileTypes.h"
18 #include "URL.h"
19 
20 #include <iostream>
21 #include <memory>
22 #include <stdio.h>
23 #include <string>
24 #include <vector>
25 
26 #include "PlatformDefs.h"
27 
28 class BitstreamStats;
29 
30 namespace XFILE
31 {
32 
33 class IFile;
34 
35 class CFileStreamBuffer;
36 
37 class CFile
38 {
39 public:
40  CFile();
41  ~CFile();
42 
43  bool CURLCreate(const std::string &url);
44  bool CURLAddOption(XFILE::CURLOPTIONTYPE type, const char* name, const char * value);
45  bool CURLOpen(unsigned int flags);
46 
58  bool Open(const CURL& file, const unsigned int flags = 0);
59  bool Open(const std::string& strFileName, const unsigned int flags = 0);
60 
61  bool OpenForWrite(const CURL& file, bool bOverWrite = false);
62  bool OpenForWrite(const std::string& strFileName, bool bOverWrite = false);
63 
64  ssize_t LoadFile(const CURL& file, std::vector<uint8_t>& outputBuffer);
65 
74  ssize_t Read(void* bufPtr, size_t bufSize);
75  bool ReadString(char *szLine, int iLineLength);
84  ssize_t Write(const void* bufPtr, size_t bufSize);
85  void Flush();
86  int64_t Seek(int64_t iFilePosition, int iWhence = SEEK_SET);
87  int Truncate(int64_t iSize);
88  int64_t GetPosition() const;
89  int64_t GetLength();
90  void Close();
91  int GetChunkSize();
92  const std::string GetProperty(XFILE::FileProperty type, const std::string &name = "") const;
93  const std::vector<std::string> GetPropertyValues(XFILE::FileProperty type, const std::string &name = "") const;
94  ssize_t LoadFile(const std::string& filename, std::vector<uint8_t>& outputBuffer);
95 
96  static int DetermineChunkSize(const int srcChunkSize, const int reqChunkSize);
97 
98  const std::unique_ptr<BitstreamStats>& GetBitstreamStats() const { return m_bitStreamStats; }
99 
100  int IoControl(EIoControl request, void* param);
101 
102  IFile* GetImplementation() const { return m_pFile.get(); }
103 
104  // CURL interface
105  static bool Exists(const CURL& file, bool bUseCache = true);
106  static bool Delete(const CURL& file);
119  static int Stat(const CURL& file, struct __stat64* buffer);
120  static bool Rename(const CURL& file, const CURL& urlNew);
121  static bool Copy(const CURL& file, const CURL& dest, XFILE::IFileCallback* pCallback = NULL, void* pContext = NULL);
122  static bool SetHidden(const CURL& file, bool hidden);
123 
124  // string interface
125  static bool Exists(const std::string& strFileName, bool bUseCache = true);
138  static int Stat(const std::string& strFileName, struct __stat64* buffer);
150  int Stat(struct __stat64 *buffer);
151  static bool Delete(const std::string& strFileName);
152  static bool Rename(const std::string& strFileName, const std::string& strNewFileName);
153  static bool Copy(const std::string& strFileName, const std::string& strDest, XFILE::IFileCallback* pCallback = NULL, void* pContext = NULL);
154  static bool SetHidden(const std::string& fileName, bool hidden);
155  double GetDownloadSpeed();
156 
157 private:
173  bool ShouldUseStreamBuffer(const CURL& url);
174 
175  unsigned int m_flags = 0;
176  CURL m_curl;
177  std::unique_ptr<IFile> m_pFile;
178  std::unique_ptr<CFileStreamBuffer> m_pBuffer;
179  std::unique_ptr<BitstreamStats> m_bitStreamStats;
180 };
181 
182 // streambuf for file io, only supports buffered input currently
184  : public std::streambuf
185 {
186 public:
187  ~CFileStreamBuffer() override;
188  explicit CFileStreamBuffer(int backsize = 0);
189 
190  void Attach(IFile *file);
191  void Detach();
192 
193 private:
194  int_type underflow() override;
195  std::streamsize showmanyc() override;
196  pos_type seekoff(off_type, std::ios_base::seekdir,std::ios_base::openmode = std::ios_base::in | std::ios_base::out) override;
197  pos_type seekpos(pos_type, std::ios_base::openmode = std::ios_base::in | std::ios_base::out) override;
198 
199  IFile* m_file;
200  char* m_buffer;
201  int m_backsize;
202  int m_frontsize = 0;
203 };
204 
205 // very basic file input stream
207  : public std::istream
208 {
209 public:
210  explicit CFileStream(int backsize = 0);
211  ~CFileStream() override;
212 
213  bool Open(const std::string& filename);
214  bool Open(const CURL& filename);
215  void Close();
216 
217  int64_t GetLength();
218 private:
219  CFileStreamBuffer m_buffer;
220  std::unique_ptr<IFile> m_file;
221 };
222 
223 }
Definition: File.h:183
Definition: Scraper.h:41
ssize_t Write(const void *bufPtr, size_t bufSize)
Attempt to write bufSize bytes from buffer bufPtr into currently opened file.
Definition: File.cpp:824
static int Stat(const CURL &file, struct __stat64 *buffer)
Fills struct __stat64 with information about file specified by filename For st_mode function will set...
Definition: File.cpp:533
Definition: URL.h:21
Definition: File.h:37
Definition: BitstreamStats.h:13
Definition: IFile.h:42
ssize_t Read(void *bufPtr, size_t bufSize)
Attempt to read bufSize bytes from currently opened file into buffer bufPtr.
Definition: File.cpp:590
bool Open(const CURL &file, const unsigned int flags=0)
Attempt to open an IFile instance.
Definition: File.cpp:245
Definition: File.h:206
Definition: IFileTypes.h:112