1 // Copyright (c) 2013- PPSSPP Project.
2 
3 // This program is free software: you can redistribute it and/or modify
4 // it under the terms of the GNU General Public License as published by
5 // the Free Software Foundation, version 2.0 or later versions.
6 
7 // This program is distributed in the hope that it will be useful,
8 // but WITHOUT ANY WARRANTY; without even the implied warranty of
9 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10 // GNU General Public License 2.0 for more details.
11 
12 // A copy of the GPL 2.0 should have been included with the program.
13 // If not, see http://www.gnu.org/licenses/
14 
15 // Official git repository and contact information can be found at
16 // https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
17 
18 
19 #pragma once
20 
21 #include "Common/Common.h"
22 #include "Common/Swap.h"
23 
24 enum PBPSubFile {
25 	PBP_PARAM_SFO,
26 	PBP_ICON0_PNG,
27 	PBP_ICON1_PMF,
28 	PBP_PIC0_PNG,
29 	PBP_PIC1_PNG,
30 	PBP_SND0_AT3,
31 	PBP_EXECUTABLE_PSP,
32 	PBP_UNKNOWN_PSAR,
33 };
34 
35 struct PBPHeader {
36 	char magic[4];
37 	u32_le version;
38 	u32_le offsets[8];
39 };
40 
41 class FileLoader;
42 
43 class PBPReader {
44 public:
45 	PBPReader(FileLoader *fileLoader);
46 	~PBPReader();
47 
IsValid()48 	bool IsValid() const { return file_ != nullptr; }
IsELF()49 	bool IsELF() const { return file_ == nullptr && isELF_; }
50 
51 	bool GetSubFile(PBPSubFile file, std::vector<u8> *out);
52 	void GetSubFileAsString(PBPSubFile file, std::string *out);
53 
GetSubFileSize(PBPSubFile file)54 	size_t GetSubFileSize(PBPSubFile file) {
55 		int num = (int)file;
56 		if (num < 7) {
57 			return header_.offsets[file + 1] - header_.offsets[file];
58 		} else {
59 			return fileSize_ - header_.offsets[file];
60 		}
61 	}
62 
63 private:
64 	FileLoader *file_;
65 	size_t fileSize_;
66 	const PBPHeader header_;
67 	bool isELF_;
68 };
69