| 
									
										
										
										
											2016-12-17 14:48:49 +01:00
										 |  |  | // Copyright 2016 Dolphin Emulator Project
 | 
					
						
							|  |  |  | // Licensed under GPLv2+
 | 
					
						
							|  |  |  | // Refer to the license.txt file included.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <array>
 | 
					
						
							|  |  |  | #include <memory>
 | 
					
						
							|  |  |  | #include <utility>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "Common/CommonTypes.h"
 | 
					
						
							| 
									
										
										
										
											2017-01-15 21:46:32 +01:00
										 |  |  | #include "Common/File.h"
 | 
					
						
							| 
									
										
										
										
											2016-12-17 14:48:49 +01:00
										 |  |  | #include "DiscIO/Blob.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace DiscIO | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-12-21 11:30:12 +01:00
										 |  |  | static constexpr u32 TGC_MAGIC = 0xA2380FAE; | 
					
						
							| 
									
										
										
										
											2016-12-17 14:48:49 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | struct TGCHeader | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   u32 magic; | 
					
						
							|  |  |  |   u32 unknown_1; | 
					
						
							| 
									
										
										
										
											2017-10-08 11:43:48 +02:00
										 |  |  |   u32 tgc_header_size; | 
					
						
							|  |  |  |   u32 disc_header_area_size; | 
					
						
							| 
									
										
										
										
											2016-12-17 14:48:49 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-08 11:43:48 +02:00
										 |  |  |   u32 fst_real_offset; | 
					
						
							| 
									
										
										
										
											2016-12-17 14:48:49 +01:00
										 |  |  |   u32 fst_size; | 
					
						
							|  |  |  |   u32 fst_max_size; | 
					
						
							| 
									
										
										
										
											2017-10-08 11:43:48 +02:00
										 |  |  |   u32 dol_real_offset; | 
					
						
							| 
									
										
										
										
											2016-12-17 14:48:49 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   u32 dol_size; | 
					
						
							| 
									
										
										
										
											2017-10-08 11:43:48 +02:00
										 |  |  |   u32 file_area_real_offset; | 
					
						
							|  |  |  |   u32 unknown_2; | 
					
						
							| 
									
										
										
										
											2016-12-17 14:48:49 +01:00
										 |  |  |   u32 unknown_3; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-08 11:43:48 +02:00
										 |  |  |   u32 unknown_4; | 
					
						
							|  |  |  |   u32 file_area_virtual_offset; | 
					
						
							| 
									
										
										
										
											2016-12-17 14:48:49 +01:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-06 11:49:01 +02:00
										 |  |  | class TGCFileReader final : public BlobReader | 
					
						
							| 
									
										
										
										
											2016-12-17 14:48:49 +01:00
										 |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2016-12-21 12:50:15 +01:00
										 |  |  |   static std::unique_ptr<TGCFileReader> Create(File::IOFile file); | 
					
						
							| 
									
										
										
										
											2016-12-17 14:48:49 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   BlobType GetBlobType() const override { return BlobType::TGC; } | 
					
						
							|  |  |  |   u64 GetDataSize() const override; | 
					
						
							|  |  |  |   u64 GetRawSize() const override { return m_size; } | 
					
						
							|  |  |  |   bool Read(u64 offset, u64 nbytes, u8* out_ptr) override; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							| 
									
										
										
										
											2016-12-21 12:50:15 +01:00
										 |  |  |   TGCFileReader(File::IOFile file); | 
					
						
							| 
									
										
										
										
											2016-12-17 14:48:49 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   bool InternalRead(u64 offset, u64 nbytes, u8* out_ptr); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   File::IOFile m_file; | 
					
						
							|  |  |  |   u64 m_size; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-08 12:30:53 +02:00
										 |  |  |   s64 m_file_area_shift; | 
					
						
							| 
									
										
										
										
											2016-12-17 14:48:49 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Stored as big endian in memory, regardless of the host endianness
 | 
					
						
							|  |  |  |   TGCHeader m_header = {}; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }  // namespace DiscIO
 |