xbmc
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:
158  unsigned int m_flags = 0;
159  CURL m_curl;
160  std::unique_ptr<IFile> m_pFile;
161  std::unique_ptr<CFileStreamBuffer> m_pBuffer;
162  std::unique_ptr<BitstreamStats> m_bitStreamStats;
163 };
164 
165 // streambuf for file io, only supports buffered input currently
167  : public std::streambuf
168 {
169 public:
170  ~CFileStreamBuffer() override;
171  explicit CFileStreamBuffer(int backsize = 0);
172 
173  void Attach(IFile *file);
174  void Detach();
175 
176 private:
177  int_type underflow() override;
178  std::streamsize showmanyc() override;
179  pos_type seekoff(off_type, std::ios_base::seekdir,std::ios_base::openmode = std::ios_base::in | std::ios_base::out) override;
180  pos_type seekpos(pos_type, std::ios_base::openmode = std::ios_base::in | std::ios_base::out) override;
181 
182  IFile* m_file;
183  char* m_buffer;
184  int m_backsize;
185  int m_frontsize = 0;
186 };
187 
188 // very basic file input stream
190  : public std::istream
191 {
192 public:
193  explicit CFileStream(int backsize = 0);
194  ~CFileStream() override;
195 
196  bool Open(const std::string& filename);
197  bool Open(const CURL& filename);
198  void Close();
199 
200  int64_t GetLength();
201 private:
202  CFileStreamBuffer m_buffer;
203  std::unique_ptr<IFile> m_file;
204 };
205 
206 }
Definition: File.h:166
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:808
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:517
Definition: URL.h:20
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:574
bool Open(const CURL &file, const unsigned int flags=0)
Attempt to open an IFile instance.
Definition: File.cpp:245
Definition: File.h:189
Definition: IFileTypes.h:102