22#include "ff7tkformats_export.h"
24#define MAX_ISO_READ 10000
25#define MAX_FILENAME_LENGTH 207
26#define SEPARATOR_1 '\x2E'
27#define SEPARATOR_2 '\x3B'
28#define SECTOR_SIZE 2352
29#define SECTOR_SIZE_HEADER 24
30#define SECTOR_SIZE_DATA 2048
31#define SECTOR_SIZE_FOOTER 280
116 quint8 volume_set_id[128];
117 quint8 publisher_id[128];
118 quint8 preparer_id[128];
119 quint8 application_id[128];
120 quint8 copyright_file_id[37];
121 quint8 abstract_file_id[37];
122 quint8 bibliographic_file_id[37];
129 quint8 application_data[512];
143 const QString &name()
const;
144 quint32 location()
const;
145 quint32 locationAfter()
const;
146 quint32 size()
const;
147 quint32 sectorCount()
const;
148 quint32 newLocation()
const;
149 quint32 newSize()
const;
150 quint32 newSectorCount()
const;
151 void setName(
const QString &name);
152 void setLocation(quint32 location);
155 virtual bool isModified()
const;
156 virtual void applyModifications();
157 bool isSpecial()
const;
159 void setPaddingAfter(quint8 after);
160 quint8 paddingAfter()
const;
163 IsoFileOrDirectory(
const QString &name, quint32 location, quint32 size, qint64 structPosition);
173 IsoFile(
const QString &name, quint32 location, quint32 size, qint64 structPosition,
IsoArchiveIO *io);
175 bool isDirectory()
const override;
176 QByteArray data(quint32 maxSize = 0)
const;
177 QByteArray modifiedData(quint32 maxSize = 0)
const;
178 bool extract(
const QString &destination, quint32 maxSize = 0)
const;
179 QIODevice *file()
const;
180 QIODevice *modifiedFile()
const;
181 bool setModifiedFile(QIODevice *io);
182 bool setModifiedFile(
const QByteArray &data);
183 bool isModified()
const override;
184 void applyModifications()
override;
187 void setFile(QIODevice *io);
189 QIODevice *_io, *_newIO;
190 bool dataChanged, _newIOMustBeRemoved;
196 IsoDirectory(
const QString &name, quint32 location, quint32 size, qint64 structPosition);
198 bool isDirectory()
const override;
199 const QMap<QString, IsoFileOrDirectory *> &filesAndDirectories()
const;
200 QList<IsoFile *> files()
const;
201 QList<IsoDirectory *> directories()
const;
203 IsoFile *file(
const QString &path)
const;
208 QMap<QString, IsoFileOrDirectory *> _filesAndDirectories;
219 bool open(QIODevice::OpenMode mode)
override;
220 qint64 posIso()
const;
221 bool seekIso(qint64 off);
222 qint64 sizeIso()
const;
224 qint64 readIso(
char *data, qint64 maxSize);
225 QByteArray readIso(qint64 maxSize);
227 qint64 writeIso(
const char *data, qint64 maxSize);
228 qint64 writeIso(
const QByteArray &byteArray);
236 h2 = dec2Hex(quint8(
id / 75 + 2));
237 h3 = dec2Hex(quint8(
id - 75 * (hex2Dec(h2) - 2)));
239 h1 = dec2Hex(quint8((
id + 150) / 4500));
240 h2 = dec2Hex(quint8((
id + 150 - hex2Dec(h1)*4500) / 75));
241 h3 = dec2Hex(quint8(
id + 150 - hex2Dec(h1)*4500 - hex2Dec(h2)*75));
244 return QByteArray().append(
char(h1)).append(
char(h2)).append(
char(h3));
246 static inline QByteArray
buildHeader(quint32 sector, quint8 type, quint8 mode = 2)
248 return QByteArray(
"\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00", 12)
249 .append(int2Header(sector)).append(
char(mode))
250 .append(
"\x00\x00", 2).append(
char(type)).append(
'\x00')
251 .append(
"\x00\x00", 2).append(
char(type)).append(
'\x00');
259 static inline void headerInfos(
const QByteArray &header, quint8 *type, quint8 *mode =
nullptr)
263 *type = quint8(header.at(18));
266 *mode = quint8(header.at(15));
271 QByteArray sectorHeader(quint32 num);
272 QByteArray sectorFooter(quint32 num);
273 quint32 currentSector()
const;
274 quint32 sectorCount()
const;
275 static quint32 sectorCountData(quint32 dataSize);
276 bool seekToSector(quint32 num);
277 bool writeSector(
const QByteArray &data, quint8 type, quint8 mode = 2);
280 static qint64 isoPos(qint64 pos);
281 static qint64 filePos(qint64 pos);
283 static inline quint8 hex2Dec(quint8 hex)
285 return 10 * (hex / 16) + hex % 16;
287 static inline quint8 dec2Hex(quint8 dec)
289 return 16 * (dec / 10) + dec % 10;
297 bool open(OpenMode mode)
override;
298 qint64 size()
const override;
299 bool canReadLine()
const override;
301 qint64 readData(
char *data, qint64 maxSize)
override;
302 qint64 writeData(
const char *data, qint64 maxSize)
override;
316 virtual bool open(QIODevice::OpenMode mode);
319 return _io.isOpen() && _rootDirectory;
321 virtual void close();
324 return _io.fileName();
328 _io.setFileName(fileName);
332 return _io.errorString();
342 QByteArray file(
const QString &path, quint32 maxSize = 0)
const;
343 QIODevice *fileDevice(
const QString &path)
const;
344 QByteArray modifiedFile(
const QString &path, quint32 maxSize = 0)
const;
345 QIODevice *modifiedFileDevice(
const QString &path)
const;
346 bool extract(
const QString &path,
const QString &destination, quint32 maxSize = 0)
const;
347 bool extractDir(
const QString &path,
const QString &destination)
const;
348 void extractAll(
const QString &destination)
const;
349 qint32 diffCountSectors(
const QString &path, quint32 newSize)
const;
358 virtual bool reorganizeModifiedFilesAfter(QMap<quint32, const IsoFile *> &writeToTheMain, QList<const IsoFile *> &writeToTheEnd);
362 bool openVolumeDescriptor(quint8 num = 0);
363 bool openRootDirectory(quint32 sector, quint32 dataSize =
SECTOR_SIZE_DATA);
368 static int findPadding(
const QList<IsoFileOrDirectory *> &filesWithPadding, quint32 minSectorCount);
370 QList<IsoFileOrDirectory *> getIntegrity();
373 void _extractAll(
const QString &destination,
IsoDirectory *directories, QString currentInternalDir = QString())
const;
374 void _getIntegrity(QMap<quint32, IsoFileOrDirectory *> &files,
IsoDirectory *directory)
const;
375 QMap<quint32, IsoFile *> getModifiedFiles(
IsoDirectory *directory)
const;
376 void getModifiedFiles(QMap<quint32, IsoFile *> &files,
IsoDirectory *directory)
const;
379 bool writeFile(QIODevice *in, quint32 sectorCount = 0,
ArchiveObserver *control =
nullptr);
390#ifdef ISOARCHIVE_DEBUG
391 static QString isoTimeToString(
const IsoTime &time);
394 static QString pathTableToString(
const PathTable &pathTable,
bool bigEndian =
false);
#define SECTOR_SIZE_HEADER
Definition: IsoArchive.h:29
#define SECTOR_SIZE_FOOTER
Definition: IsoArchive.h:31
#define SECTOR_SIZE_DATA
Definition: IsoArchive.h:30
ArchiveError
Definition: Archive.h:37
Definition: IsoArchive.h:212
static QByteArray buildFooter(quint32 sector)
Definition: IsoArchive.h:253
static QByteArray buildHeader(quint32 sector, quint8 type, quint8 mode=2)
Definition: IsoArchive.h:246
static QByteArray int2Header(quint32 id)
Definition: IsoArchive.h:230
static void headerInfos(const QByteArray &header, quint8 *type, quint8 *mode=nullptr)
Definition: IsoArchive.h:259
Definition: IsoArchive.h:310
QString fileName() const
Definition: IsoArchive.h:322
virtual bool isOpen() const
Definition: IsoArchive.h:317
QString errorString() const
Definition: IsoArchive.h:330
void setFileName(const QString &fileName)
Definition: IsoArchive.h:326
const IsoArchiveIO & io() const
Definition: IsoArchive.h:334
virtual bool open(QIODevice::OpenMode mode)
Definition: IsoArchive.cpp:588
Definition: IsoArchive.h:194
Definition: IsoArchive.h:294
Definition: IsoArchive.h:140
quint32 _newLocation
Definition: IsoArchive.h:166
quint32 _location
Definition: IsoArchive.h:165
QString _name
Definition: IsoArchive.h:164
quint8 _paddingAfter
Definition: IsoArchive.h:167
virtual bool isDirectory() const =0
qint64 structPosition
Definition: IsoArchive.h:158
Definition: IsoArchive.h:171
Definition: IsoArchive.h:61
quint8 length_fi
Definition: IsoArchive.h:78
quint8 year
Definition: IsoArchive.h:66
quint32 data_length2
Definition: IsoArchive.h:65
quint8 hour
Definition: IsoArchive.h:69
quint32 location_extent
Definition: IsoArchive.h:62
quint16 volume_sequence_number
Definition: IsoArchive.h:76
quint8 second
Definition: IsoArchive.h:71
qint8 GMT
Definition: IsoArchive.h:72
quint8 interleave_grap_size
Definition: IsoArchive.h:75
quint8 month
Definition: IsoArchive.h:67
quint8 minute
Definition: IsoArchive.h:70
quint32 location_extent2
Definition: IsoArchive.h:63
quint8 file_unit_size
Definition: IsoArchive.h:74
quint8 day
Definition: IsoArchive.h:68
quint32 data_length
Definition: IsoArchive.h:64
quint16 volume_sequence_number2
Definition: IsoArchive.h:77
quint8 file_flags
Definition: IsoArchive.h:73
Definition: IsoArchive.h:81
DirectoryRecordHead drh
Definition: IsoArchive.h:84
QString version
Definition: IsoArchive.h:86
quint8 extended_attr_record_length
Definition: IsoArchive.h:83
QString name
Definition: IsoArchive.h:85
quint8 length_dr
Definition: IsoArchive.h:82
Definition: IsoArchive.h:41
qint8 GMT
Definition: IsoArchive.h:49
Definition: IsoArchive.h:52
QString name
Definition: IsoArchive.h:57
quint8 length_di
Definition: IsoArchive.h:53
quint32 location_extent
Definition: IsoArchive.h:55
quint16 parent_directory_number
Definition: IsoArchive.h:56
quint8 extended_attr_record_length
Definition: IsoArchive.h:54
quint32 position
Definition: IsoArchive.h:58
Definition: IsoArchive.h:90
quint8 type
Definition: IsoArchive.h:91
quint16 volume_set_size2
Definition: IsoArchive.h:102
quint32 opt_type_path_table2
Definition: IsoArchive.h:112
quint32 path_table_size
Definition: IsoArchive.h:107
quint32 path_table_size2
Definition: IsoArchive.h:108
quint32 type_path_table2
Definition: IsoArchive.h:111
quint16 volume_sequence_number
Definition: IsoArchive.h:103
quint16 volume_sequence_number2
Definition: IsoArchive.h:104
quint8 unused1
Definition: IsoArchive.h:94
quint32 type_path_table
Definition: IsoArchive.h:109
quint8 version
Definition: IsoArchive.h:93
quint32 opt_type_path_table
Definition: IsoArchive.h:110
quint16 volume_set_size
Definition: IsoArchive.h:101
quint32 volume_space_size
Definition: IsoArchive.h:98
quint16 logical_block_size
Definition: IsoArchive.h:105
quint32 volume_space_size2
Definition: IsoArchive.h:99
quint16 logical_block_size2
Definition: IsoArchive.h:106
Definition: IsoArchive.h:115
IsoTime modification_date
Definition: IsoArchive.h:124
quint8 unused4
Definition: IsoArchive.h:128
IsoTime creation_date
Definition: IsoArchive.h:123
quint8 file_structure_version
Definition: IsoArchive.h:127
IsoTime effective_date
Definition: IsoArchive.h:126
IsoTime expiration_date
Definition: IsoArchive.h:125
Definition: IsoArchive.h:133
VolumeDescriptor1 vd1
Definition: IsoArchive.h:134
DirectoryRecord dr
Definition: IsoArchive.h:135
VolumeDescriptor2 vd2
Definition: IsoArchive.h:136