7
7
#include < vector>
8
8
9
9
namespace xdvdfs {
10
- bool VolumeDescriptor::validate () {
10
+ void VolumeDescriptor::readFromFile (Stream &file) {
11
+ std::vector<char > buffer (SECTOR_SIZE);
12
+
13
+ {
14
+ std::lock_guard<std::mutex> lock (file.m_fileMutex );
15
+
16
+ file.m_file .seekg (VOLUME_DESCRIPTOR_SECTOR * SECTOR_SIZE + file.m_offset ,
17
+ std::ifstream::beg);
18
+ file.m_file .read (buffer.data (), buffer.size ());
19
+ }
20
+
21
+ std::copy (buffer.begin (), buffer.begin () + 0x14 , m_id1);
22
+ std::copy (buffer.begin () + 0x14 , buffer.begin () + 0x18 ,
23
+ reinterpret_cast <char *>(&m_rootDirTableSector));
24
+ std::copy (buffer.begin () + 0x18 , buffer.begin () + 0x1C ,
25
+ reinterpret_cast <char *>(&m_rootDirTableSize));
26
+ std::copy (buffer.begin () + 0x1C , buffer.begin () + 0x24 ,
27
+ reinterpret_cast <char *>(&m_filetime));
28
+ std::copy (buffer.begin () + 0x7EC , buffer.end (), m_id2);
29
+ }
30
+
31
+ bool VolumeDescriptor::validate () const {
11
32
if (std::memcmp (m_id1, MAGIC_ID, std::size (m_id1)) != 0 ) {
12
33
return false ;
13
34
}
@@ -23,48 +44,26 @@ bool VolumeDescriptor::validate() {
23
44
return true ;
24
45
}
25
46
26
- FileEntry::FileEntry (const FileEntry &other)
27
- : m_leftSubTree(other.m_leftSubTree), m_rightSubTree(other.m_rightSubTree),
28
- m_startSector (other.m_startSector), m_fileSize(other.m_fileSize),
29
- m_attributes(other.m_attributes), m_filename(other.m_filename),
30
- m_sectorNumber(other.m_sectorNumber) {}
31
-
32
- FileEntry::FileEntry (const std::string &name)
33
- : m_leftSubTree(0 ), m_rightSubTree(0 ), m_startSector(0 ), m_fileSize(0 ),
34
- m_attributes(FileEntry::FILE_DIRECTORY), m_filename(name),
35
- m_sectorNumber(0 ) {}
36
-
37
- FileEntry VolumeDescriptor::getRootDirEntry (Stream &file) {
47
+ FileEntry VolumeDescriptor::getRootDirEntry (Stream &file) const {
38
48
FileEntry dirent;
39
49
40
50
dirent.readFromFile (file, m_rootDirTableSector, 0 );
41
51
42
52
return dirent;
43
53
}
54
+ } // namespace xdvdfs
44
55
45
- void VolumeDescriptor::readFromFile (Stream &file) {
46
- std::vector<char > buffer (SECTOR_SIZE);
47
-
48
- {
49
- std::lock_guard<std::mutex> lock (file.m_fileMutex );
56
+ namespace xdvdfs {
50
57
51
- file.m_file .seekg (VOLUME_DESCRIPTOR_SECTOR * SECTOR_SIZE + file.m_offset ,
52
- std::ifstream::beg);
53
- file.m_file .read (buffer.data (), buffer.size ());
54
- }
58
+ FileEntry::FileEntry (const FileEntry &other)
59
+ : m_leftSubTree(other.m_leftSubTree), m_rightSubTree(other.m_rightSubTree),
60
+ m_startSector (other.m_startSector), m_fileSize(other.m_fileSize),
61
+ m_attributes(other.m_attributes), m_filename(other.m_filename),
62
+ m_sectorNumber(other.m_sectorNumber) {}
55
63
56
- std::copy (buffer.begin (), buffer.begin () + 0x14 , m_id1);
57
- std::copy (buffer.begin () + 0x14 , buffer.begin () + 0x18 ,
58
- reinterpret_cast <char *>(&m_rootDirTableSector));
59
- std::copy (buffer.begin () + 0x18 , buffer.begin () + 0x1C ,
60
- reinterpret_cast <char *>(&m_rootDirTableSize));
61
- std::copy (buffer.begin () + 0x1C , buffer.begin () + 0x24 ,
62
- reinterpret_cast <char *>(&m_filetime));
63
- std::copy (buffer.begin () + 0x7EC , buffer.end (), m_id2);
64
- }
65
- } // namespace xdvdfs
64
+ FileEntry::FileEntry (const std::string &name)
65
+ : m_attributes(FileEntry::FILE_DIRECTORY), m_filename(name) {}
66
66
67
- namespace xdvdfs {
68
67
void FileEntry::readFromFile (Stream &file, std::streampos sector,
69
68
std::streamoff offset) {
70
69
std::vector<char > buffer (SECTOR_SIZE);
@@ -77,6 +76,8 @@ void FileEntry::readFromFile(Stream &file, std::streampos sector,
77
76
file.m_file .read (buffer.data (), buffer.size ());
78
77
}
79
78
79
+ m_sectorNumber = sector;
80
+
80
81
std::copy (buffer.begin (), buffer.begin () + 0x02 ,
81
82
reinterpret_cast <char *>(&m_leftSubTree));
82
83
std::copy (buffer.begin () + 0x02 , buffer.begin () + 0x04 ,
@@ -88,10 +89,11 @@ void FileEntry::readFromFile(Stream &file, std::streampos sector,
88
89
std::copy (buffer.begin () + 0x0C , buffer.begin () + 0x0D ,
89
90
reinterpret_cast <char *>(&m_attributes));
90
91
91
- size_t filenameLength = buffer[ 0x0D ];
92
- m_filename = std::string (& buffer[0x0E ], filenameLength) ;
92
+ if ( validate ()) {
93
+ size_t filenameLength{ static_cast < uint8_t >( buffer[0x0D ])} ;
93
94
94
- m_sectorNumber = sector;
95
+ m_filename = std::string (&buffer[0x0E ], filenameLength);
96
+ }
95
97
}
96
98
97
99
const std::string &FileEntry::getFilename () const { return m_filename; }
@@ -128,6 +130,22 @@ uint32_t FileEntry::read(Stream &file, void *buffer, uint32_t bufferlength,
128
130
return 0 ;
129
131
}
130
132
133
+ bool FileEntry::validate () const {
134
+ if (m_leftSubTree == static_cast <uint16_t >(-1 )) {
135
+ return false ;
136
+ }
137
+
138
+ if (m_rightSubTree == static_cast <uint16_t >(-1 )) {
139
+ return false ;
140
+ }
141
+
142
+ if (m_startSector == static_cast <uint32_t >(-1 )) {
143
+ return false ;
144
+ }
145
+
146
+ return true ;
147
+ }
148
+
131
149
bool FileEntry::isDirectory () const {
132
150
return ((m_attributes & FileEntry::FILE_DIRECTORY) != 0 );
133
151
}
0 commit comments