-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathYaffsControl.h
96 lines (82 loc) · 2.78 KB
/
YaffsControl.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/*
* yaffey: Utility for reading, editing and writing YAFFS2 images
* Copyright (C) 2012 David Place <[email protected]>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*/
#ifndef YAFFSREADER_H
#define YAFFSREADER_H
#include "Yaffs2.h"
class YaffsControlObserver {
public:
virtual void newItem(int yaffsObjectId, const yaffs_obj_hdr* objectHeader, int fileOffset) = 0;
virtual void readComplete() = 0;
};
struct YaffsReadInfo {
bool result;
bool eofHasIncompletePage;
int numFiles;
int numDirs;
int numSymLinks;
int numHardLinks;
int numUnknowns;
int numSpecials;
int numErrorousObjects;
};
struct YaffsSaveInfo {
bool result;
int numFilesSaved;
int numFilesFailed;
int numDirsSaved;
int numDirsFailed;
int numSymLinksSaved;
int numSymLinksFailed;
};
class YaffsControl {
public:
enum OpenType {
OPEN_READ,
OPEN_MODIFY,
OPEN_NEW
};
YaffsControl(const char* imageFileName, YaffsControlObserver* observer);
~YaffsControl();
bool open(OpenType openType);
bool readImage();
YaffsReadInfo getReadInfo() { return mReadInfo; }
YaffsSaveInfo getSaveInfo() { return mSaveInfo; }
char* extractFile(int objectHeaderPos);
bool updateHeader(int objectHeaderPos, const yaffs_obj_hdr& objectHeader, int objectId);
int addRoot(const yaffs_obj_hdr& objectHeader, int& headerPos);
int addDirectory(const yaffs_obj_hdr& objectHeader, int& headerPos);
int addFile(const yaffs_obj_hdr& objectHeader, int& headerPos, const char* data, int fileSize);
int addSymLink(const yaffs_obj_hdr& objectHeader, int& headerPos);
private:
int readPage();
void processPage();
bool writePage(u32 objectId, u32 chunkId, u32 numBytes);
bool writeHeader(const yaffs_obj_hdr& objectHeader, u32 objectId);
private:
YaffsControlObserver* mObserver;
char* mImageFilename;
FILE* mImageFile;
YaffsReadInfo mReadInfo;
YaffsSaveInfo mSaveInfo;
static u8 mPageData[];
static u8* mChunkData;
static u8* mSpareData;
int mObjectId;
int mNumPages;
};
#endif //YAFFSREADER_H