kodi
CacheStrategy.h
1 /*
2  * Copyright (C) 2005-2018 Team Kodi
3  * This file is part of Kodi - https://kodi.tv
4  *
5  * SPDX-License-Identifier: GPL-2.0-or-later
6  * See LICENSES/README.md for more information.
7  */
8 
9 #pragma once
10 
11 #include "threads/Event.h"
12 
13 #include <stdint.h>
14 #include <string>
15 
16 namespace XFILE {
17 
18 #define CACHE_RC_OK 0
19 #define CACHE_RC_ERROR -1
20 #define CACHE_RC_WOULD_BLOCK -2
21 #define CACHE_RC_TIMEOUT -3
22 
23 class IFile; // forward declaration
24 
26 public:
27  virtual ~CCacheStrategy();
28 
29  virtual int Open() = 0;
30  virtual void Close() = 0;
31 
32  virtual size_t GetMaxWriteSize(const size_t& iRequestSize) = 0;
33  virtual int WriteToCache(const char *pBuffer, size_t iSize) = 0;
34  virtual int ReadFromCache(char *pBuffer, size_t iMaxSize) = 0;
35  virtual int64_t WaitForData(uint32_t iMinAvail, std::chrono::milliseconds timeout) = 0;
36 
37  virtual int64_t Seek(int64_t iFilePosition) = 0;
38 
45  virtual bool Reset(int64_t iSourcePosition) = 0;
46 
47  virtual void EndOfInput(); // mark the end of the input stream so that Read will know when to return EOF
48  virtual bool IsEndOfInput();
49  virtual void ClearEndOfInput();
50 
51  virtual int64_t CachedDataEndPosIfSeekTo(int64_t iFilePosition) = 0;
52  virtual int64_t CachedDataStartPos() = 0;
53  virtual int64_t CachedDataEndPos() = 0;
54  virtual bool IsCachedPosition(int64_t iFilePosition) = 0;
55 
56  virtual CCacheStrategy *CreateNew() = 0;
57 
58  CEvent m_space;
59 protected:
60  bool m_bEndOfInput = false;
61 };
62 
66 public:
68  ~CSimpleFileCache() override;
69 
70  int Open() override;
71  void Close() override;
72 
73  size_t GetMaxWriteSize(const size_t& iRequestSize) override;
74  int WriteToCache(const char *pBuffer, size_t iSize) override;
75  int ReadFromCache(char *pBuffer, size_t iMaxSize) override;
76  int64_t WaitForData(uint32_t iMinAvail, std::chrono::milliseconds timeout) override;
77 
78  int64_t Seek(int64_t iFilePosition) override;
79  bool Reset(int64_t iSourcePosition) override;
80  void EndOfInput() override;
81 
82  int64_t CachedDataEndPosIfSeekTo(int64_t iFilePosition) override;
83  int64_t CachedDataStartPos() override;
84  int64_t CachedDataEndPos() override;
85  bool IsCachedPosition(int64_t iFilePosition) override;
86 
87  CCacheStrategy *CreateNew() override;
88 
89  int64_t GetAvailableRead();
90 
91 protected:
92  std::string m_filename;
93  IFile* m_cacheFileRead;
94  IFile* m_cacheFileWrite;
95  CEvent* m_hDataAvailEvent;
96  volatile int64_t m_nStartPosition = 0;
97  volatile int64_t m_nWritePosition = 0;
98  volatile int64_t m_nReadPosition = 0;
99 };
100 
102 public:
103  explicit CDoubleCache(CCacheStrategy *impl);
104  ~CDoubleCache() override;
105 
106  int Open() override;
107  void Close() override;
108 
109  size_t GetMaxWriteSize(const size_t& iRequestSize) override;
110  int WriteToCache(const char *pBuffer, size_t iSize) override;
111  int ReadFromCache(char *pBuffer, size_t iMaxSize) override;
112  int64_t WaitForData(uint32_t iMinAvail, std::chrono::milliseconds timeout) override;
113 
114  int64_t Seek(int64_t iFilePosition) override;
115  bool Reset(int64_t iSourcePosition) override;
116  void EndOfInput() override;
117  bool IsEndOfInput() override;
118  void ClearEndOfInput() override;
119 
120  int64_t CachedDataEndPosIfSeekTo(int64_t iFilePosition) override;
121  int64_t CachedDataStartPos() override;
122  int64_t CachedDataEndPos() override;
123  bool IsCachedPosition(int64_t iFilePosition) override;
124 
125  CCacheStrategy *CreateNew() override;
126 
127 protected:
128  CCacheStrategy *m_pCache;
129  CCacheStrategy *m_pCacheOld;
130 };
131 
132 }
133 
This is an Event class built from a ConditionVariable.
Definition: Event.h:35
Definition: Scraper.h:41
virtual bool Reset(int64_t iSourcePosition)=0
Reset cache position.
Definition: IFile.h:42
Definition: CacheStrategy.h:25
Definition: CacheStrategy.h:65
Definition: CacheStrategy.h:101