| 
									
										
										
										
											2015-05-24 06:55:12 +02:00
										 |  |  | // Copyright 2008 Dolphin Emulator Project
 | 
					
						
							| 
									
										
										
										
											2015-05-18 01:08:10 +02:00
										 |  |  | // Licensed under GPLv2+
 | 
					
						
							| 
									
										
										
										
											2013-04-17 23:09:55 -04:00
										 |  |  | // Refer to the license.txt file included.
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-10 13:54:46 -05:00
										 |  |  | #pragma once
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-21 01:47:53 +01:00
										 |  |  | #include <cstddef>
 | 
					
						
							| 
									
										
										
										
											2015-08-09 13:41:41 +02:00
										 |  |  | #include <map>
 | 
					
						
							| 
									
										
										
										
											2015-08-08 19:59:33 +02:00
										 |  |  | #include <memory>
 | 
					
						
							| 
									
										
										
										
											2017-06-04 10:33:14 +02:00
										 |  |  | #include <optional>
 | 
					
						
							| 
									
										
										
										
											2014-02-21 01:47:53 +01:00
										 |  |  | #include <string>
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | #include <vector>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-21 01:47:53 +01:00
										 |  |  | #include "Common/CommonTypes.h"
 | 
					
						
							| 
									
										
										
										
											2014-02-17 05:18:15 -05:00
										 |  |  | #include "DiscIO/Filesystem.h"
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace DiscIO | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-06-06 11:49:01 +02:00
										 |  |  | class Volume; | 
					
						
							| 
									
										
										
										
											2015-06-13 12:51:24 +02:00
										 |  |  | struct Partition; | 
					
						
							| 
									
										
										
										
											2014-02-21 01:47:53 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-28 16:56:25 +02:00
										 |  |  | class FileInfoGCWii : public FileInfo | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2015-08-08 19:59:33 +02:00
										 |  |  |   // None of the constructors take ownership of FST pointers
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Set everything manually
 | 
					
						
							| 
									
										
										
										
											2015-08-02 17:39:03 +02:00
										 |  |  |   FileInfoGCWii(const u8* fst, u8 offset_shift, u32 index, u32 total_file_infos); | 
					
						
							| 
									
										
										
										
											2015-08-08 19:59:33 +02:00
										 |  |  |   // For the root object only
 | 
					
						
							|  |  |  |   FileInfoGCWii(const u8* fst, u8 offset_shift); | 
					
						
							|  |  |  |   // Copy another object
 | 
					
						
							|  |  |  |   FileInfoGCWii(const FileInfoGCWii& file_info) = default; | 
					
						
							|  |  |  |   // Copy data that is common to the whole file system
 | 
					
						
							|  |  |  |   FileInfoGCWii(const FileInfoGCWii& file_info, u32 index); | 
					
						
							| 
									
										
										
										
											2015-07-30 22:18:20 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-28 16:56:25 +02:00
										 |  |  |   ~FileInfoGCWii() override; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-08 19:59:33 +02:00
										 |  |  |   std::unique_ptr<FileInfo> clone() const override; | 
					
						
							|  |  |  |   const_iterator begin() const override; | 
					
						
							|  |  |  |   const_iterator end() const override; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-30 22:18:20 +02:00
										 |  |  |   u64 GetOffset() const override; | 
					
						
							|  |  |  |   u32 GetSize() const override; | 
					
						
							|  |  |  |   bool IsDirectory() const override; | 
					
						
							| 
									
										
										
										
											2015-08-08 19:59:33 +02:00
										 |  |  |   u32 GetTotalChildren() const override; | 
					
						
							| 
									
										
										
										
											2015-07-30 22:18:20 +02:00
										 |  |  |   std::string GetName() const override; | 
					
						
							| 
									
										
										
										
											2015-08-08 19:59:33 +02:00
										 |  |  |   std::string GetPath() const override; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-20 14:32:04 +02:00
										 |  |  |   bool IsValid(u64 fst_size, const FileInfoGCWii& parent_directory) const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-08 19:59:33 +02:00
										 |  |  | protected: | 
					
						
							|  |  |  |   uintptr_t GetAddress() const override; | 
					
						
							|  |  |  |   FileInfo& operator++() override; | 
					
						
							| 
									
										
										
										
											2015-07-28 16:56:25 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							| 
									
										
										
										
											2015-07-30 22:18:20 +02:00
										 |  |  |   enum class EntryProperty | 
					
						
							|  |  |  |   { | 
					
						
							| 
									
										
										
										
											2015-08-08 19:59:33 +02:00
										 |  |  |     // NAME_OFFSET's lower 3 bytes are the name's offset within the name table.
 | 
					
						
							|  |  |  |     // NAME_OFFSET's upper 1 byte is 1 for directories and 0 for files.
 | 
					
						
							| 
									
										
										
										
											2015-07-30 22:18:20 +02:00
										 |  |  |     NAME_OFFSET = 0, | 
					
						
							| 
									
										
										
										
											2015-08-08 19:59:33 +02:00
										 |  |  |     // For files, FILE_OFFSET is the file offset in the partition,
 | 
					
						
							|  |  |  |     // and for directories, it's the FST index of the parent directory.
 | 
					
						
							|  |  |  |     // The root directory has its parent directory index set to 0.
 | 
					
						
							| 
									
										
										
										
											2015-07-30 22:18:20 +02:00
										 |  |  |     FILE_OFFSET = 1, | 
					
						
							| 
									
										
										
										
											2015-08-08 19:59:33 +02:00
										 |  |  |     // For files, FILE_SIZE is the file size, and for directories,
 | 
					
						
							|  |  |  |     // it's the FST index of the next entry that isn't in the directory.
 | 
					
						
							| 
									
										
										
										
											2015-07-30 22:18:20 +02:00
										 |  |  |     FILE_SIZE = 2 | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-08 19:59:33 +02:00
										 |  |  |   // For files, returns the index of the next item. For directories,
 | 
					
						
							|  |  |  |   // returns the index of the next item that isn't inside it.
 | 
					
						
							|  |  |  |   u32 GetNextIndex() const; | 
					
						
							|  |  |  |   // Returns one of the three properties of this FST entry.
 | 
					
						
							|  |  |  |   // Read the comments in EntryProperty for details.
 | 
					
						
							| 
									
										
										
										
											2015-07-30 22:18:20 +02:00
										 |  |  |   u32 Get(EntryProperty entry_property) const; | 
					
						
							| 
									
										
										
										
											2015-10-20 14:32:04 +02:00
										 |  |  |   // Returns the name offset, excluding the directory identification byte
 | 
					
						
							|  |  |  |   u64 GetNameOffset() const; | 
					
						
							| 
									
										
										
										
											2015-07-30 22:18:20 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-08 19:59:33 +02:00
										 |  |  |   const u8* m_fst; | 
					
						
							|  |  |  |   u8 m_offset_shift; | 
					
						
							|  |  |  |   u32 m_index; | 
					
						
							|  |  |  |   u32 m_total_file_infos; | 
					
						
							| 
									
										
										
										
											2015-07-28 16:56:25 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-06 11:49:01 +02:00
										 |  |  | class FileSystemGCWii : public FileSystem | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2015-08-09 20:53:38 +02:00
										 |  |  |   FileSystemGCWii(const Volume* volume, const Partition& partition); | 
					
						
							| 
									
										
										
										
											2015-07-28 16:56:25 +02:00
										 |  |  |   ~FileSystemGCWii() override; | 
					
						
							| 
									
										
										
										
											2015-08-08 19:59:33 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-09 20:53:38 +02:00
										 |  |  |   bool IsValid() const override { return m_valid; } | 
					
						
							| 
									
										
										
										
											2015-08-08 19:59:33 +02:00
										 |  |  |   const FileInfo& GetRoot() const override; | 
					
						
							|  |  |  |   std::unique_ptr<FileInfo> FindFileInfo(const std::string& path) const override; | 
					
						
							|  |  |  |   std::unique_ptr<FileInfo> FindFileInfo(u64 disc_offset) const override; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-03 03:26:23 +00:00
										 |  |  | private: | 
					
						
							| 
									
										
										
										
											2015-08-09 20:53:38 +02:00
										 |  |  |   bool m_valid; | 
					
						
							| 
									
										
										
										
											2015-07-30 22:18:20 +02:00
										 |  |  |   std::vector<u8> m_file_system_table; | 
					
						
							| 
									
										
										
										
											2015-08-08 19:59:33 +02:00
										 |  |  |   FileInfoGCWii m_root; | 
					
						
							| 
									
										
										
										
											2015-08-09 13:41:41 +02:00
										 |  |  |   // Maps the end offset of files to FST indexes
 | 
					
						
							|  |  |  |   mutable std::map<u64, u32> m_offset_file_info_cache; | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-08 19:59:33 +02:00
										 |  |  |   std::unique_ptr<FileInfo> FindFileInfo(const std::string& path, const FileInfo& file_info) const; | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  | }  // namespace
 |