ff7tk  1.0.0.16
Work with Final Fantasy 7 game data
Lgp_p.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: 2009 - 2021 Arzel Jérôme <myst6re@gmail.com>
2 // SPDX-FileCopyrightText: 2019 Chris Rizzitello <sithlord48@gmail.com>
3 // SPDX-License-Identifier: LGPL-3.0-or-later
4 /*
5  * This file may contains some code (especially the conflict part)
6  * inspired from LGP/UnLGP tool written by Aali.
7  * http://forums.qhimm.com/index.php?topic=8641.0
8 */
9 #pragma once
10 
11 #include <QIODevice>
12 #include <QString>
13 #include <QMultiHash>
14 
15 #include <ff7tkformats_export.h>
16 
17 #define LGP_COMPANY_NAME_SIZE 12
18 #define LGP_PRODUCT_NAME_SIZE 14
19 
20 #define LOOKUP_VALUE_MAX 30
21 #define LOOKUP_TABLE_ENTRIES LOOKUP_VALUE_MAX * LOOKUP_VALUE_MAX
22 
23 #define MAX_CONFLICTS 4096
24 
25 #ifdef _MSC_VER
26 # define PACK(structure) \
27  __pragma(pack(push, 1)) \
28  structure \
29  __pragma(pack(pop))
30 #else
31 # define PACK(structure) structure Q_PACKED
32 #endif
33 
34 PACK(
35 struct FF7TKFORMATS_EXPORT LgpLookupTableEntry {
36  quint16 tocOffset;
37  quint16 fileCount;
38 });
39 
40 struct FF7TKFORMATS_EXPORT LgpConflictEntry {
41  LgpConflictEntry() : fileDir(QString()), tocIndex(0) {}
42  LgpConflictEntry(const QString &fileDir, quint16 tocIndex = 0) :
43  fileDir(fileDir), tocIndex(tocIndex) {}
44  QString fileDir;
45  quint16 tocIndex;
46 };
47 
48 struct FF7TKFORMATS_EXPORT LgpTocEntry {
49  LgpTocEntry() : conflict(0), tocIndex(0) {}
50  LgpTocEntry(quint16 tocIndex, quint16 conflict = 0) :
51  conflict(conflict), tocIndex(tocIndex) {}
52  quint16 conflict;
53  quint16 tocIndex;
54 };
55 
56 class FF7TKFORMATS_EXPORT LgpHeaderEntry
57 {
58 public:
59  LgpHeaderEntry(const QString &fileName, quint32 filePosition);
60  virtual ~LgpHeaderEntry();
61  const QString &fileName() const;
62  const QString &fileDir() const;
63  QString filePath() const;
64  quint32 filePosition() const;
65  qint64 fileSize() const;
66  void setFileName(const QString &fileName);
67  void setFileDir(const QString &fileDir);
68  void setFilePath(const QString &filePath);
69  void setFilePosition(quint32 filePosition);
70  void setFileSize(quint32 fileSize);
71  QIODevice *file(QIODevice *lgp);
72  QIODevice *modifiedFile(QIODevice *lgp);
73  void setFile(QIODevice *io);
74  void setModifiedFile(QIODevice *io);
75 private:
76  QIODevice *createFile(QIODevice *lgp);
77  QString _fileName;
78  QString _fileDir;
79  quint32 _filePosition;
80  quint32 _fileSize;
81  bool _hasFileSize;
82  QIODevice *_io;
83  QIODevice *_newIO;
84 };
85 
86 class FF7TKFORMATS_EXPORT LgpIO : public QIODevice
87 {
88 public:
89  LgpIO(QIODevice *lgp, const LgpHeaderEntry *header, QObject *parent = nullptr);
90  bool open(OpenMode mode) override;
91  qint64 size() const override;
92  bool canReadLine() const override;
93 protected:
94  qint64 readData(char *data, qint64 maxSize) override;
95  qint64 writeData(const char *data, qint64 maxSize) override;
96 private:
97  QIODevice *_lgp;
98  const LgpHeaderEntry *_header;
99 };
100 
101 class LgpIterator;
102 
103 class FF7TKFORMATS_EXPORT LgpToc
104 {
105 public:
106  LgpToc();
107  LgpToc(const LgpToc &other);
108  virtual ~LgpToc();
109  bool addEntry(LgpHeaderEntry *entry);
110  LgpHeaderEntry *entry(const QString &filePath) const;
111  QList<LgpHeaderEntry *> entries(quint16 id) const;
112  const QMultiHash<quint16, LgpHeaderEntry *> &table() const;
113  bool hasEntries(quint16 id) const;
114  bool removeEntry(const QString &filePath);
115  static bool isNameValid(const QString &filePath);
116  bool renameEntry(const QString &filePath, const QString &newFilePath);
117  bool contains(const QString &filePath) const;
118  void clear();
119  bool isEmpty() const;
120  int size() const;
121  QList<const LgpHeaderEntry *> filesSortedByPosition() const;
122  LgpToc &operator=(const LgpToc &other);
123 private:
124  LgpHeaderEntry *entry(const QString &filePath, quint16 id) const;
125  static qint16 lookupValue(const QString &filePath);
126  static qint8 lookupValue(const QChar &qc);
127  QMultiHash<quint16, LgpHeaderEntry *> _header;
128 };
LgpIterator
Definition: Lgp.h:18
LgpConflictEntry::LgpConflictEntry
LgpConflictEntry()
Definition: Lgp_p.h:41
PACK
#define PACK(structure)
Definition: Lgp_p.h:31
LgpConflictEntry::LgpConflictEntry
LgpConflictEntry(const QString &fileDir, quint16 tocIndex=0)
Definition: Lgp_p.h:42
LgpHeaderEntry
Definition: Lgp_p.h:56
LgpIO
Definition: Lgp_p.h:86
LgpTocEntry::tocIndex
quint16 tocIndex
Definition: Lgp_p.h:53
LgpConflictEntry
Definition: Lgp_p.h:40
LgpTocEntry::LgpTocEntry
LgpTocEntry()
Definition: Lgp_p.h:49
LgpConflictEntry::tocIndex
quint16 tocIndex
Definition: Lgp_p.h:45
LgpTocEntry::LgpTocEntry
LgpTocEntry(quint16 tocIndex, quint16 conflict=0)
Definition: Lgp_p.h:50
LgpToc
Definition: Lgp_p.h:103
LgpTocEntry
Definition: Lgp_p.h:48
LgpConflictEntry::fileDir
QString fileDir
Definition: Lgp_p.h:44
LgpTocEntry::conflict
quint16 conflict
Definition: Lgp_p.h:52