| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-11 23:27:02 +00:00
										 |  |  | #include <string>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-12 15:33:41 -04:00
										 |  |  | bool IsCompressedBlob(const std::string& filename); | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | const u32 kBlobCookie = 0xB10BC001; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // A blob file structure:
 | 
					
						
							|  |  |  | // 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.
 | 
					
						
							|  |  |  | struct CompressedBlobHeader // 32 bytes
 | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	u32 magic_cookie; //0xB10BB10B
 | 
					
						
							| 
									
										
										
										
											2014-11-13 21:28:27 -05:00
										 |  |  | 	u32 sub_type; // GC image, whatever
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 	u64 compressed_data_size; | 
					
						
							|  |  |  | 	u64 data_size; | 
					
						
							|  |  |  | 	u32 block_size; | 
					
						
							|  |  |  | 	u32 num_blocks; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class CompressedBlobReader : public SectorReader | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-01-11 23:27:02 +00:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2014-03-12 15:33:41 -04:00
										 |  |  | 	static CompressedBlobReader* Create(const std::string& filename); | 
					
						
							| 
									
										
										
										
											2010-01-11 23:27:02 +00:00
										 |  |  | 	~CompressedBlobReader(); | 
					
						
							| 
									
										
										
										
											2014-09-01 15:48:02 -04:00
										 |  |  | 	const CompressedBlobHeader &GetHeader() const { return m_header; } | 
					
						
							|  |  |  | 	u64 GetDataSize() const override { return m_header.data_size; } | 
					
						
							|  |  |  | 	u64 GetRawSize() const override { return m_file_size; } | 
					
						
							| 
									
										
										
										
											2010-01-11 23:27:02 +00:00
										 |  |  | 	u64 GetBlockCompressedSize(u64 block_num) const; | 
					
						
							| 
									
										
										
										
											2014-03-12 15:33:41 -04:00
										 |  |  | 	void GetBlock(u64 block_num, u8* out_ptr) override; | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | private: | 
					
						
							| 
									
										
										
										
											2014-03-12 15:33:41 -04:00
										 |  |  | 	CompressedBlobReader(const std::string& filename); | 
					
						
							| 
									
										
										
										
											2010-01-11 23:27:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-01 15:48:02 -04:00
										 |  |  | 	CompressedBlobHeader m_header; | 
					
						
							|  |  |  | 	u64* m_block_pointers; | 
					
						
							|  |  |  | 	u32* m_hashes; | 
					
						
							|  |  |  | 	int m_data_offset; | 
					
						
							| 
									
										
										
										
											2011-03-11 10:21:46 +00:00
										 |  |  | 	File::IOFile m_file; | 
					
						
							| 
									
										
										
										
											2014-09-01 15:48:02 -04:00
										 |  |  | 	u64 m_file_size; | 
					
						
							|  |  |  | 	u8* m_zlib_buffer; | 
					
						
							|  |  |  | 	int m_zlib_buffer_size; | 
					
						
							|  |  |  | 	std::string m_file_name; | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }  // namespace
 |