[Test] Added tests for CUtil::SplitParams
[xbmc.git] / xbmc / filesystem / CacheStrategy.h
blob76c66bb454d6adda0b1fa142ae103e0a07cc86a1
1 /*
2 * Copyright (C) 2005-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
7 */
9 #pragma once
11 #include "threads/Event.h"
13 #include <stdint.h>
14 #include <string>
16 namespace XFILE {
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
23 class IFile; // forward declaration
25 class CCacheStrategy{
26 public:
27 virtual ~CCacheStrategy();
29 virtual int Open() = 0;
30 virtual void Close() = 0;
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;
37 virtual int64_t Seek(int64_t iFilePosition) = 0;
39 /*!
40 \brief Reset cache position
41 \param iSourcePosition position to reset to
42 \return Whether a full reset was performed, or not (e.g. only cache swap)
43 \sa CCacheStrategy
45 virtual bool Reset(int64_t iSourcePosition) = 0;
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();
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;
56 virtual CCacheStrategy *CreateNew() = 0;
58 CEvent m_space;
59 protected:
60 bool m_bEndOfInput = false;
63 /**
65 class CSimpleFileCache : public CCacheStrategy {
66 public:
67 CSimpleFileCache();
68 ~CSimpleFileCache() override;
70 int Open() override;
71 void Close() override;
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;
78 int64_t Seek(int64_t iFilePosition) override;
79 bool Reset(int64_t iSourcePosition) override;
80 void EndOfInput() override;
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;
87 CCacheStrategy *CreateNew() override;
89 int64_t GetAvailableRead();
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;
101 class CDoubleCache : public CCacheStrategy{
102 public:
103 explicit CDoubleCache(CCacheStrategy *impl);
104 ~CDoubleCache() override;
106 int Open() override;
107 void Close() override;
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;
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;
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;
125 CCacheStrategy *CreateNew() override;
127 protected:
128 CCacheStrategy *m_pCache;
129 CCacheStrategy *m_pCacheOld;