| 
									
										
										
										
											2018-07-18 21:07:11 -04:00
										 |  |  | // Copyright 2018 yuzu emulator team
 | 
					
						
							|  |  |  | // Licensed under GPLv2 or any later version
 | 
					
						
							|  |  |  | // Refer to the license.txt file included.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-22 01:23:29 -04:00
										 |  |  | #include <memory>
 | 
					
						
							|  |  |  | #include <string_view>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-18 21:07:11 -04:00
										 |  |  | #include "core/file_sys/vfs.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace FileSys { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // An implementation of VfsFile that wraps around another VfsFile at a certain offset.
 | 
					
						
							|  |  |  | // Similar to seeking to an offset.
 | 
					
						
							|  |  |  | // If the file is writable, operations that would write past the end of the offset file will expand
 | 
					
						
							|  |  |  | // the size of this wrapper.
 | 
					
						
							| 
									
										
										
										
											2018-08-12 16:37:38 -04:00
										 |  |  | class OffsetVfsFile : public VfsFile { | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2018-09-15 15:21:06 +02:00
										 |  |  |     OffsetVfsFile(std::shared_ptr<VfsFile> file, std::size_t size, std::size_t offset = 0, | 
					
						
							| 
									
										
										
										
											2018-07-27 18:14:03 -04:00
										 |  |  |                   std::string new_name = "", VirtualDir new_parent = nullptr); | 
					
						
							| 
									
										
										
										
											2018-09-19 19:19:05 -04:00
										 |  |  |     ~OffsetVfsFile() override; | 
					
						
							| 
									
										
										
										
											2018-07-18 21:07:11 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     std::string GetName() const override; | 
					
						
							| 
									
										
										
										
											2018-09-15 15:21:06 +02:00
										 |  |  |     std::size_t GetSize() const override; | 
					
						
							|  |  |  |     bool Resize(std::size_t new_size) override; | 
					
						
							| 
									
										
										
										
											2018-07-18 21:07:11 -04:00
										 |  |  |     std::shared_ptr<VfsDirectory> GetContainingDirectory() const override; | 
					
						
							|  |  |  |     bool IsWritable() const override; | 
					
						
							|  |  |  |     bool IsReadable() const override; | 
					
						
							| 
									
										
										
										
											2018-09-15 15:21:06 +02:00
										 |  |  |     std::size_t Read(u8* data, std::size_t length, std::size_t offset) const override; | 
					
						
							|  |  |  |     std::size_t Write(const u8* data, std::size_t length, std::size_t offset) override; | 
					
						
							| 
									
										
										
										
											2018-10-30 05:03:25 +01:00
										 |  |  |     std::optional<u8> ReadByte(std::size_t offset) const override; | 
					
						
							| 
									
										
										
										
											2018-09-15 15:21:06 +02:00
										 |  |  |     std::vector<u8> ReadBytes(std::size_t size, std::size_t offset) const override; | 
					
						
							| 
									
										
										
										
											2018-07-18 21:07:11 -04:00
										 |  |  |     std::vector<u8> ReadAllBytes() const override; | 
					
						
							| 
									
										
										
										
											2018-09-15 15:21:06 +02:00
										 |  |  |     bool WriteByte(u8 data, std::size_t offset) override; | 
					
						
							|  |  |  |     std::size_t WriteBytes(const std::vector<u8>& data, std::size_t offset) override; | 
					
						
							| 
									
										
										
										
											2018-07-18 21:07:11 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-22 01:23:29 -04:00
										 |  |  |     bool Rename(std::string_view name) override; | 
					
						
							| 
									
										
										
										
											2018-07-18 21:07:11 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-15 15:21:06 +02:00
										 |  |  |     std::size_t GetOffset() const; | 
					
						
							| 
									
										
										
										
											2018-07-18 21:07:11 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							| 
									
										
										
										
											2018-09-15 15:21:06 +02:00
										 |  |  |     std::size_t TrimToFit(std::size_t r_size, std::size_t r_offset) const; | 
					
						
							| 
									
										
										
										
											2018-07-18 21:07:11 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     std::shared_ptr<VfsFile> file; | 
					
						
							| 
									
										
										
										
											2018-09-15 15:21:06 +02:00
										 |  |  |     std::size_t offset; | 
					
						
							|  |  |  |     std::size_t size; | 
					
						
							| 
									
										
										
										
											2018-07-18 21:07:11 -04:00
										 |  |  |     std::string name; | 
					
						
							| 
									
										
										
										
											2018-07-27 18:14:03 -04:00
										 |  |  |     VirtualDir parent; | 
					
						
							| 
									
										
										
										
											2018-07-18 21:07:11 -04:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace FileSys
 |