Skip to content

Commit dcc89b1

Browse files
committed
Implement requirements for extension.
1 parent fc5f6b9 commit dcc89b1

14 files changed

Lines changed: 372 additions & 125 deletions

include/uibase/exceptions.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ namespace MOBase
2020
class QDLLEXPORT Exception : public std::exception
2121
{
2222
public:
23+
Exception(const char* text) : m_Message(text) {}
24+
Exception(const std::string& text) : m_Message(QByteArray::fromStdString(text)) {}
2325
Exception(const QString& text) : m_Message(text.toUtf8()) {}
2426

2527
virtual const char* what() const noexcept override { return m_Message.constData(); }

include/uibase/extensions/extension.h

Lines changed: 37 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,25 @@
88
#include <QJsonObject>
99
#include <QTranslator>
1010

11-
#include "dllimport.h"
12-
#include "iplugingame.h"
11+
#include "../dllimport.h"
12+
#include "../iplugingame.h"
13+
#include "../versioning.h"
1314
#include "requirements.h"
1415
#include "theme.h"
1516
#include "translation.h"
16-
#include "versioninfo.h"
1717

1818
namespace MOBase
1919
{
2020
class IExtension;
2121

22+
class InvalidExtensionMetaDataException : public Exception
23+
{
24+
public:
25+
using Exception::Exception;
26+
};
27+
2228
enum class ExtensionType
2329
{
24-
INVALID,
2530
THEME,
2631
TRANSLATION,
2732
PLUGIN,
@@ -48,10 +53,6 @@ class QDLLEXPORT ExtensionContributor
4853
class QDLLEXPORT ExtensionMetaData
4954
{
5055
public:
51-
// check if that metadata object is valid
52-
//
53-
bool isValid() const;
54-
5556
// retrieve the identifier of the extension
5657
//
5758
const auto& identifier() const { return m_Identifier; }
@@ -72,18 +73,22 @@ class QDLLEXPORT ExtensionMetaData
7273
//
7374
auto type() const { return m_Type; }
7475

75-
// retrieve the description of the extension.
76+
// retrieve the description of the extension
7677
//
7778
auto description() const { return localized(m_Description); }
7879

7980
// retrieve the icon for the extension (might be an empty icon)
8081
//
8182
const auto& icon() const { return m_Icon; }
8283

83-
// retrieve the version of the extension.
84+
// retrieve the version of the extension
8485
//
8586
const auto& version() const { return m_Version; }
8687

88+
// retrieve the requirements of the extension
89+
//
90+
const auto& requirements() const { return m_Requirements; }
91+
8792
// retrieve the raw JSON metadata, this is mostly useful for specific extension type
8893
// to extract custom parts
8994
//
@@ -92,18 +97,16 @@ class QDLLEXPORT ExtensionMetaData
9297
// retrieve the content objects of the extension
9398
QJsonObject content() const;
9499

95-
private:
96-
QString localized(QString const& value) const;
100+
protected:
101+
ExtensionMetaData(std::filesystem::path const& path, const QJsonObject& jsonData);
97102

98103
private:
99104
friend class ExtensionFactory;
100105

101106
constexpr static const char* DEFAULT_TRANSLATIONS_FOLDER = "translations";
102107
constexpr static const char* DEFAULT_STYLESHEET_PATH = "stylesheets";
103108

104-
ExtensionType parseType(QString const& value) const;
105-
106-
ExtensionMetaData(std::filesystem::path const& path, const QJsonObject& jsonData);
109+
std::optional<ExtensionType> parseType(QString const& value) const;
107110

108111
private:
109112
QJsonObject m_JsonData;
@@ -116,10 +119,13 @@ class QDLLEXPORT ExtensionMetaData
116119
ExtensionType m_Type;
117120
QString m_Description;
118121
QIcon m_Icon;
119-
VersionInfo m_Version;
122+
Version m_Version;
123+
std::vector<ExtensionRequirement> m_Requirements;
120124

121125
std::filesystem::path m_TranslationFilesPrefix;
122126
std::filesystem::path m_StyleSheetFilePath;
127+
128+
QString localized(QString const& value) const;
123129
};
124130

125131
class QDLLEXPORT IExtension
@@ -133,24 +139,19 @@ class QDLLEXPORT IExtension
133139
//
134140
const auto& metadata() const { return m_MetaData; }
135141

136-
// retrieve the requirements of the extension
137-
//
138-
const auto& requirements() const { return m_Requirements; }
139-
140142
public:
141143
virtual ~IExtension() {}
142144
IExtension& operator=(const IExtension&) = delete;
143145

144146
protected:
145-
IExtension(std::filesystem::path path, ExtensionMetaData metadata);
147+
IExtension(std::filesystem::path const& path, ExtensionMetaData&& metadata);
146148

147149
public:
148150
IExtension(const IExtension&) = default;
149151

150152
private:
151153
std::filesystem::path m_Path;
152154
ExtensionMetaData m_MetaData;
153-
std::vector<ExtensionRequirement> m_Requirements;
154155
};
155156

156157
// factory for extensions
@@ -161,13 +162,14 @@ class QDLLEXPORT ExtensionFactory
161162
// load an extension from the given directory, return a null-pointer if the extension
162163
// could not be load
163164
//
164-
static std::unique_ptr<IExtension> loadExtension(std::filesystem::path directory);
165+
static std::unique_ptr<IExtension>
166+
loadExtension(std::filesystem::path const& directory);
165167

166168
private:
167169
// load an extension from the given directory
168170
//
169-
static std::unique_ptr<IExtension> loadExtension(std::filesystem::path directory,
170-
ExtensionMetaData metadata);
171+
static std::unique_ptr<IExtension>
172+
loadExtension(std::filesystem::path const& directory, ExtensionMetaData&& metadata);
171173
};
172174

173175
// theme extension that provides one or more base themes for MO2
@@ -180,12 +182,12 @@ class QDLLEXPORT ThemeExtension : public IExtension
180182
const auto& themes() const { return m_Themes; }
181183

182184
private:
183-
ThemeExtension(std::filesystem::path path, ExtensionMetaData metadata,
185+
ThemeExtension(std::filesystem::path const& path, ExtensionMetaData&& metadata,
184186
std::vector<std::shared_ptr<const Theme>> themes);
185187

186188
friend class ExtensionFactory;
187-
static std::unique_ptr<ThemeExtension> loadExtension(std::filesystem::path path,
188-
ExtensionMetaData metadata);
189+
static std::unique_ptr<ThemeExtension>
190+
loadExtension(std::filesystem::path const& path, ExtensionMetaData&& metadata);
189191

190192
static std::shared_ptr<const Theme>
191193
parseTheme(std::filesystem::path const& extensionFolder, const QString& identifier,
@@ -205,12 +207,12 @@ class QDLLEXPORT TranslationExtension : public IExtension
205207
const auto& translations() const { return m_Translations; }
206208

207209
private:
208-
TranslationExtension(std::filesystem::path path, ExtensionMetaData metadata,
210+
TranslationExtension(std::filesystem::path const& path, ExtensionMetaData&& metadata,
209211
std::vector<std::shared_ptr<const Translation>> translations);
210212

211213
friend class ExtensionFactory;
212214
static std::unique_ptr<TranslationExtension>
213-
loadExtension(std::filesystem::path path, ExtensionMetaData metadata);
215+
loadExtension(std::filesystem::path const& path, ExtensionMetaData&& metadata);
214216

215217
static std::shared_ptr<const Translation>
216218
parseTranslation(std::filesystem::path const& extensionFolder,
@@ -241,14 +243,14 @@ class QDLLEXPORT PluginExtension : public IExtension
241243

242244
protected:
243245
PluginExtension(
244-
std::filesystem::path path, ExtensionMetaData metadata, bool autodetect,
246+
std::filesystem::path const& path, ExtensionMetaData&& metadata, bool autodetect,
245247
std::map<std::string, std::filesystem::path> plugins,
246248
std::vector<std::shared_ptr<const ThemeAddition>> themeAdditions,
247249
std::vector<std::shared_ptr<const TranslationAddition>> translationAdditions);
248250

249251
friend class ExtensionFactory;
250-
static std::unique_ptr<PluginExtension> loadExtension(std::filesystem::path path,
251-
ExtensionMetaData metadata);
252+
static std::unique_ptr<PluginExtension>
253+
loadExtension(std::filesystem::path const& path, ExtensionMetaData&& metadata);
252254

253255
private:
254256
// auto-detect plugins
@@ -271,8 +273,8 @@ class QDLLEXPORT GameExtension : public PluginExtension
271273
GameExtension(PluginExtension&& pluginExtension);
272274

273275
friend class ExtensionFactory;
274-
static std::unique_ptr<GameExtension> loadExtension(std::filesystem::path path,
275-
ExtensionMetaData metadata);
276+
static std::unique_ptr<GameExtension> loadExtension(std::filesystem::path const& path,
277+
ExtensionMetaData&& metadata);
276278
};
277279

278280
} // namespace MOBase

include/uibase/extensions/requirements.h

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,26 @@
66
#include <QJsonValue>
77
#include <QString>
88

9-
#include "dllimport.h"
9+
#include "../dllimport.h"
10+
#include "../exceptions.h"
1011

1112
namespace MOBase
1213
{
1314
class IOrganizer;
1415
class ExtensionMetaData;
1516

17+
class InvalidRequirementException : public Exception
18+
{
19+
public:
20+
using Exception::Exception;
21+
};
22+
23+
class InvalidRequirementsException : public Exception
24+
{
25+
public:
26+
using Exception::Exception;
27+
};
28+
1629
class ExtensionRequirementImpl;
1730

1831
// extension requirements
@@ -44,13 +57,22 @@ class QDLLEXPORT ExtensionRequirement
4457
//
4558
bool check(IOrganizer* organizer) const;
4659

60+
// retrieve the type of this extension
61+
//
62+
Type type() const;
63+
64+
// retrieve a textual representation of this requirement, e.g. "ModOrganizer 2.5.4"
65+
// for a requirement that requires MO2 2.5.4
66+
//
67+
QString string() const;
68+
69+
public:
4770
~ExtensionRequirement();
4871

4972
private:
5073
friend class ExtensionRequirementFactory;
5174

5275
ExtensionRequirement(std::shared_ptr<ExtensionRequirementImpl> impl);
53-
5476
std::shared_ptr<ExtensionRequirementImpl> m_Impl;
5577
};
5678

@@ -62,7 +84,7 @@ class QDLLEXPORT ExtensionRequirementFactory
6284
// extract requirements from the given metadata
6385
//
6486
static std::vector<ExtensionRequirement>
65-
parseRequirements(const ExtensionMetaData& metadata);
87+
parseRequirements(const QJsonValue& json_requirements);
6688

6789
private:
6890
};

include/uibase/extensions/theme.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
#include <QRegularExpression>
88

9-
#include "dllimport.h"
9+
#include "../dllimport.h"
1010

1111
namespace MOBase
1212
{

include/uibase/extensions/translation.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
#include <filesystem>
55
#include <string>
66

7-
#include "dllimport.h"
7+
#include "../dllimport.h"
88

99
namespace MOBase
1010
{

include/uibase/extensions/versionconstraints.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,18 @@ class QDLLEXPORT VersionConstraints
5757
public:
5858
// construct a set of constraints
5959
//
60-
VersionConstraints(std::vector<VersionConstraint> constraints);
60+
VersionConstraints(QString const& repr, std::vector<VersionConstraint> constraints);
6161

6262
// check if the given version matches the set of constraints
6363
//
6464
bool matches(Version const& version) const;
6565

66+
// retrieve a string representation of this set of constraints
67+
//
68+
auto string() const { return m_Repr; }
69+
6670
private:
71+
QString m_Repr;
6772
std::vector<VersionConstraint> m_Constraints;
6873
};
6974

include/uibase/versioning.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,8 @@ class QDLLEXPORT Version
7676

7777
// do not add metadata even if present
7878
//
79-
NoMetadata = 0b1000
79+
NoMetadata = 0b1000,
80+
8081
};
8182
Q_DECLARE_FLAGS(FormatModes, FormatMode);
8283

src/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,6 @@ mo2_target_sources(uibase
117117
errorcodes.cpp
118118
eventfilter.cpp
119119
executableinfo.cpp
120-
extension.cpp
121120
filesystemutilities.cpp
122121
guessedvalue.cpp
123122
json.cpp

0 commit comments

Comments
 (0)