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);
153 virtual bool isDirectory()
const=0;
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);
165 quint32 _location, _size;
166 quint32 _newLocation, _newSize;
167 quint8 _paddingAfter;
173 IsoFile(
const QString &name, quint32 location, quint32 size, qint64 structPosition,
IsoArchiveIO *io);
175 bool isDirectory()
const;
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;
184 void applyModifications();
187 void setFile(QIODevice *io);
196 IsoDirectory(
const QString &name, quint32 location, quint32 size, qint64 structPosition);
198 bool isDirectory()
const;
199 const QMap<QString, IsoFileOrDirectory *> &filesAndDirectories()
const;
200 QList<IsoFile *> files()
const;
201 QList<IsoDirectory *> directories()
const;
203 IsoFile *file(
const QString &path)
const;
219 bool open(QIODevice::OpenMode mode);
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);
235 h2 = dec2Hex(
id/75 + 2);
236 h3 = dec2Hex(
id - 75*(hex2Dec(h2) - 2));
238 h1 = dec2Hex((
id + 150) / 4500);
239 h2 = dec2Hex((
id + 150 - hex2Dec(h1)*4500) / 75);
240 h3 = dec2Hex(
id + 150 - hex2Dec(h1)*4500 - hex2Dec(h2)*75);
243 return QByteArray().append((
char)h1).append((
char)h2).append((
char)h3);
245 static inline QByteArray
buildHeader(quint32 sector, quint8 type, quint8 mode=2) {
246 return QByteArray(
"\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00", 12)
247 .append(int2Header(sector)).append((
char)mode)
248 .append(
"\x00\x00", 2).append((
char)type).append(
'\x00')
249 .append(
"\x00\x00", 2).append((
char)type).append(
'\x00');
256 static inline void headerInfos(
const QByteArray &header, quint8 *type, quint8 *mode = NULL) {
259 *type = header.at(18);
262 *mode = header.at(15);
267 QByteArray sectorHeader(quint32 num);
268 QByteArray sectorFooter(quint32 num);
269 quint32 currentSector()
const;
270 quint32 sectorCount()
const;
271 static quint32 sectorCountData(quint32 dataSize);
272 bool seekToSector(quint32 num);
273 bool writeSector(
const QByteArray &data, quint8 type, quint8 mode=2);
276 static qint64 isoPos(qint64 pos);
277 static qint64 filePos(qint64 pos);
280 return 10*(hex/16) + hex%16;
283 return 16*(dec/10) + dec%10;
291 bool open(OpenMode mode);
293 bool canReadLine()
const;
295 qint64 readData(
char *data, qint64 maxSize);
296 qint64 writeData(
const char *data, qint64 maxSize);
307 explicit IsoArchive(
const QString &name);
308 virtual ~IsoArchive();
310 virtual bool open(QIODevice::OpenMode mode);
312 return _io.isOpen() && _rootDirectory;
314 virtual void close();
316 return _io.fileName();
319 _io.setFileName(fileName);
322 return _io.errorString();
331 QByteArray file(
const QString &path, quint32 maxSize=0)
const;
332 QIODevice *fileDevice(
const QString &path)
const;
333 QByteArray modifiedFile(
const QString &path, quint32 maxSize=0)
const;
334 QIODevice *modifiedFileDevice(
const QString &path)
const;
335 bool extract(
const QString &path,
const QString &destination, quint32 maxSize=0)
const;
336 bool extractDir(
const QString &path,
const QString &destination)
const;
337 void extractAll(
const QString &destination)
const;
338 qint32 diffCountSectors(
const QString &path, quint32 newSize)
const;
347 virtual bool reorganizeModifiedFilesAfter(QMap<quint32, const IsoFile *> &writeToTheMain, QList<const IsoFile *> &writeToTheEnd);
350 Q_DISABLE_COPY(IsoArchive)
351 bool openVolumeDescriptor(quint8 num=0);
357 static int findPadding(
const QList<IsoFileOrDirectory *> &filesWithPadding, quint32 minSectorCount);
359 QList<IsoFileOrDirectory *> getIntegrity();
362 void _extractAll(
const QString &destination,
IsoDirectory *directories, QString currentInternalDir=QString())
const;
363 void _getIntegrity(QMap<quint32, IsoFileOrDirectory *> &files,
IsoDirectory *directory)
const;
364 QMap<quint32, IsoFile *> getModifiedFiles(
IsoDirectory *directory)
const;
365 void getModifiedFiles(QMap<quint32, IsoFile *> &files,
IsoDirectory *directory)
const;
366 static void repairLocationSectors(
IsoDirectory *directory, IsoArchive *newIso);
368 bool writeFile(QIODevice *in, quint32 sectorCount = 0,
ArchiveObserver *control = NULL);
379 #ifdef ISOARCHIVE_DEBUG 380 static QString isoTimeToString(
const IsoTime &time);
383 static QString pathTableToString(
const PathTable &pathTable,
bool bigEndian=
false);
387 #endif // ISOARCHIVE_H
Archive::ArchiveError _error
quint16 volume_sequence_number2
static QByteArray int2Header(quint32 id)
#define SECTOR_SIZE_FOOTER
quint8 file_structure_version
quint16 volume_sequence_number
quint8 extended_attr_record_length
QString errorString() const
static QByteArray buildFooter(quint32 sector)
quint16 logical_block_size
quint16 volume_sequence_number2
quint16 volume_sequence_number
IsoTime modification_date
virtual bool open(QIODevice::OpenMode mode)
quint8 extended_attr_record_length
quint32 volume_space_size2
IsoDirectory * _rootDirectory
quint16 parent_directory_number
quint32 opt_type_path_table
quint16 logical_block_size2
void setFileName(const QString &fileName)
quint32 opt_type_path_table2
quint8 interleave_grap_size
const IsoArchiveIO & io() const
#define SECTOR_SIZE_HEADER
static void headerInfos(const QByteArray &header, quint8 *type, quint8 *mode=NULL)
quint32 volume_space_size
static QByteArray buildHeader(quint32 sector, quint8 type, quint8 mode=2)
static quint8 dec2Hex(quint8 dec)
static quint8 hex2Dec(quint8 hex)
virtual bool isOpen() const