| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							|  |  |  | // WARNING Code not big-endian safe.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // To create new compressed BLOBs, use CompressFileToBlob.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // File format
 | 
					
						
							|  |  |  | // * Header
 | 
					
						
							|  |  |  | // * [Block Pointers interleaved with block hashes (hash of decompressed data)]
 | 
					
						
							|  |  |  | // * [Data]
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-10 13:54:46 -05:00
										 |  |  | #pragma once
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-06 23:15:51 -05:00
										 |  |  | #include <memory>
 | 
					
						
							| 
									
										
										
										
											2010-01-11 23:27:02 +00:00
										 |  |  | #include <string>
 | 
					
						
							| 
									
										
										
										
											2015-12-07 19:53:42 -05:00
										 |  |  | #include <vector>
 | 
					
						
							| 
									
										
										
										
											2010-01-11 23:27:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-21 01:47:53 +01:00
										 |  |  | #include "Common/CommonTypes.h"
 | 
					
						
							| 
									
										
										
										
											2014-02-17 05:18:15 -05:00
										 |  |  | #include "Common/FileUtil.h"
 | 
					
						
							|  |  |  | #include "DiscIO/Blob.h"
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace DiscIO | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2015-09-26 14:46:53 +02:00
										 |  |  | bool IsGCZBlob(const std::string& filename); | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | const u32 kBlobCookie = 0xB10BC001; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-26 14:46:53 +02:00
										 |  |  | // GCZ file structure:
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | // BlobHeader
 | 
					
						
							|  |  |  | // u64 offsetsToBlocks[n], top bit specifies whether the block is compressed, or not.
 | 
					
						
							|  |  |  | // compressed data
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Blocks that won't compress to less than 97% of the original size are stored as-is.
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  | struct CompressedBlobHeader  // 32 bytes
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   u32 magic_cookie;  // 0xB10BB10B
 | 
					
						
							|  |  |  |   u32 sub_type;      // GC image, whatever
 | 
					
						
							|  |  |  |   u64 compressed_data_size; | 
					
						
							|  |  |  |   u64 data_size; | 
					
						
							|  |  |  |   u32 block_size; | 
					
						
							|  |  |  |   u32 num_blocks; | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class CompressedBlobReader : public SectorReader | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-01-11 23:27:02 +00:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   static std::unique_ptr<CompressedBlobReader> Create(const std::string& filename); | 
					
						
							|  |  |  |   ~CompressedBlobReader(); | 
					
						
							|  |  |  |   const CompressedBlobHeader& GetHeader() const { return m_header; } | 
					
						
							|  |  |  |   BlobType GetBlobType() const override { return BlobType::GCZ; } | 
					
						
							|  |  |  |   u64 GetDataSize() const override { return m_header.data_size; } | 
					
						
							|  |  |  |   u64 GetRawSize() const override { return m_file_size; } | 
					
						
							|  |  |  |   u64 GetBlockCompressedSize(u64 block_num) const; | 
					
						
							|  |  |  |   bool GetBlock(u64 block_num, u8* out_ptr) override; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | private: | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   CompressedBlobReader(const std::string& filename); | 
					
						
							| 
									
										
										
										
											2010-01-11 23:27:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   CompressedBlobHeader m_header; | 
					
						
							|  |  |  |   std::vector<u64> m_block_pointers; | 
					
						
							|  |  |  |   std::vector<u32> m_hashes; | 
					
						
							|  |  |  |   int m_data_offset; | 
					
						
							|  |  |  |   File::IOFile m_file; | 
					
						
							|  |  |  |   u64 m_file_size; | 
					
						
							|  |  |  |   std::vector<u8> m_zlib_buffer; | 
					
						
							|  |  |  |   std::string m_file_name; | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }  // namespace
 |