summaryrefslogtreecommitdiff
path: root/src/organizercore.h
diff options
context:
space:
mode:
authorMikaël Capelle <capelle.mikael@gmail.com>2022-05-17 11:47:01 +0200
committerMikaël Capelle <capelle.mikael@gmail.com>2023-07-09 17:20:40 +0200
commitd13f6bb870cdda71257f665367be8ef9fca86255 (patch)
tree52e214718478f1e52856572f5aa1a2ac58537f9f /src/organizercore.h
parent86bb01ba9eac879d3685c439ac9da0028bc4bc80 (diff)
Apply clang-format.
Diffstat (limited to 'src/organizercore.h')
-rw-r--r--src/organizercore.h315
1 files changed, 177 insertions, 138 deletions
diff --git a/src/organizercore.h b/src/organizercore.h
index dc287b1f..daeb7a7f 100644
--- a/src/organizercore.h
+++ b/src/organizercore.h
@@ -1,29 +1,29 @@
#ifndef ORGANIZERCORE_H
#define ORGANIZERCORE_H
-#include "selfupdater.h"
-#include "settings.h"
-#include "modlist.h"
-#include "modinfo.h"
-#include "pluginlist.h"
-#include "installationmanager.h"
#include "downloadmanager.h"
+#include "envdump.h"
+#include "executableinfo.h"
#include "executableslist.h"
-#include "usvfsconnector.h"
#include "guessedvalue.h"
-#include "moshortcut.h"
+#include "installationmanager.h"
#include "memoizedlock.h"
+#include "moddatacontent.h"
+#include "modinfo.h"
+#include "modlist.h"
+#include "moshortcut.h"
+#include "pluginlist.h"
#include "processrunner.h"
+#include "selfupdater.h"
+#include "settings.h"
#include "uilocker.h"
-#include "envdump.h"
+#include "usvfsconnector.h"
+#include <boost/signals2.hpp>
+#include <delayedfilewriter.h>
#include <imoinfo.h>
#include <iplugindiagnose.h>
-#include <versioninfo.h>
-#include <delayedfilewriter.h>
-#include <boost/signals2.hpp>
-#include "executableinfo.h"
-#include "moddatacontent.h"
#include <log.h>
+#include <versioninfo.h>
#include <QDir>
#include <QFileInfo>
@@ -44,17 +44,17 @@ class DirectoryRefresher;
namespace MOBase
{
- template <typename T> class GuessedValue;
- class IModInterface;
- class IPluginGame;
-}
+template <typename T>
+class GuessedValue;
+class IModInterface;
+class IPluginGame;
+} // namespace MOBase
namespace MOShared
{
- class DirectoryEntry;
+class DirectoryEntry;
}
-
class OrganizerCore : public QObject, public MOBase::IPluginDiagnose
{
@@ -62,14 +62,13 @@ class OrganizerCore : public QObject, public MOBase::IPluginDiagnose
Q_INTERFACES(MOBase::IPluginDiagnose)
private:
-
friend class OrganizerProxy;
struct SignalCombinerAnd
{
using result_type = bool;
- template<typename InputIterator>
+ template <typename InputIterator>
bool operator()(InputIterator first, InputIterator last) const
{
while (first != last) {
@@ -83,24 +82,28 @@ private:
};
private:
-
- using SignalAboutToRunApplication = boost::signals2::signal<bool(const QString&), SignalCombinerAnd>;
- using SignalFinishedRunApplication = boost::signals2::signal<void(const QString&, unsigned int)>;
+ using SignalAboutToRunApplication =
+ boost::signals2::signal<bool(const QString&), SignalCombinerAnd>;
+ using SignalFinishedRunApplication =
+ boost::signals2::signal<void(const QString&, unsigned int)>;
using SignalUserInterfaceInitialized = boost::signals2::signal<void(QMainWindow*)>;
using SignalProfileCreated = boost::signals2::signal<void(MOBase::IProfile*)>;
- using SignalProfileRenamed = boost::signals2::signal<void(MOBase::IProfile*, QString const&, QString const&)>;
+ using SignalProfileRenamed =
+ boost::signals2::signal<void(MOBase::IProfile*, QString const&, QString const&)>;
using SignalProfileRemoved = boost::signals2::signal<void(QString const&)>;
- using SignalProfileChanged = boost::signals2::signal<void(MOBase::IProfile *, MOBase::IProfile *)>;
- using SignalPluginSettingChanged = boost::signals2::signal<void(QString const&, const QString& key, const QVariant&, const QVariant&)>;
+ using SignalProfileChanged =
+ boost::signals2::signal<void(MOBase::IProfile*, MOBase::IProfile*)>;
+ using SignalPluginSettingChanged = boost::signals2::signal<void(
+ QString const&, const QString& key, const QVariant&, const QVariant&)>;
using SignalPluginEnabled = boost::signals2::signal<void(const MOBase::IPlugin*)>;
public:
-
/**
* Small holder for the game content returned by the ModDataContent feature (the
* list of all possible contents, not the per-mod content).
*/
- struct ModDataContentHolder {
+ struct ModDataContentHolder
+ {
using Content = ModDataContent::Content;
@@ -114,8 +117,12 @@ public:
*
* @return the content with the given ID, or a null pointer if it is not found.
*/
- const Content* findById(int id) const {
- auto it = std::find_if(std::begin(m_Contents), std::end(m_Contents), [&id](auto const& content) { return content.id() == id; });
+ const Content* findById(int id) const
+ {
+ auto it = std::find_if(std::begin(m_Contents), std::end(m_Contents),
+ [&id](auto const& content) {
+ return content.id() == id;
+ });
return it == std::end(m_Contents) ? nullptr : &(*it);
}
@@ -124,35 +131,41 @@ public:
*
* @param ids The set of content IDs.
* @param fn The function to apply.
- * @param includeFilter true to also apply the function to filter-only contents, false otherwise.
+ * @param includeFilter true to also apply the function to filter-only contents,
+ * false otherwise.
*/
template <class Fn>
- void forEachContentIn(std::set<int> const& ids, Fn const& fn, bool includeFilter = false) const {
+ void forEachContentIn(std::set<int> const& ids, Fn const& fn,
+ bool includeFilter = false) const
+ {
for (const auto& content : m_Contents) {
- if ((includeFilter || !content.isOnlyForFilter())
- && ids.find(content.id()) != ids.end()) {
+ if ((includeFilter || !content.isOnlyForFilter()) &&
+ ids.find(content.id()) != ids.end()) {
fn(content);
}
}
}
/**
- * @brief Apply fnIn to each content whose ID is in the given set, and fnOut to each content not in the
- * given set, excluding filter-only content (from both cases) unless includeFilter is true.
+ * @brief Apply fnIn to each content whose ID is in the given set, and fnOut to each
+ * content not in the given set, excluding filter-only content (from both cases)
+ * unless includeFilter is true.
*
* @param ids The set of content IDs.
* @param fnIn Function to apply to content whose IDs are in ids.
* @param fnOut Function to apply to content whose IDs are not in ids.
- * @param includeFilter true to also apply the function to filter-only contents, false otherwise.
+ * @param includeFilter true to also apply the function to filter-only contents,
+ * false otherwise.
*/
template <class FnIn, class FnOut>
- void forEachContentInOrOut(std::set<int> const& ids, FnIn const& fnIn, FnOut const& fnOut, bool includeFilter = false) const {
+ void forEachContentInOrOut(std::set<int> const& ids, FnIn const& fnIn,
+ FnOut const& fnOut, bool includeFilter = false) const
+ {
for (const auto& content : m_Contents) {
if ((includeFilter || !content.isOnlyForFilter())) {
if (ids.find(content.id()) != ids.end()) {
fnIn(content);
- }
- else {
+ } else {
fnOut(content);
}
}
@@ -163,10 +176,12 @@ public:
* Apply the given function to each content.
*
* @param fn The function to apply.
- * @param includeFilter true to also apply the function to filter-only contents, false otherwise.
+ * @param includeFilter true to also apply the function to filter-only contents,
+ * false otherwise.
*/
template <class Fn>
- void forEachContent(Fn const& fn, bool includeFilter = false) const {
+ void forEachContent(Fn const& fn, bool includeFilter = false) const
+ {
for (const auto& content : m_Contents) {
if (includeFilter || !content.isOnlyForFilter()) {
fn(content);
@@ -174,38 +189,37 @@ public:
}
}
-
ModDataContentHolder& operator=(ModDataContentHolder const&) = delete;
- ModDataContentHolder& operator=(ModDataContentHolder&&) = default;
+ ModDataContentHolder& operator=(ModDataContentHolder&&) = default;
private:
-
std::vector<Content> m_Contents;
/**
- * @brief Construct a ModDataContentHolder without any contents (e.g., if the feature is
- * missing).
+ * @brief Construct a ModDataContentHolder without any contents (e.g., if the
+ * feature is missing).
*/
- ModDataContentHolder() { }
+ ModDataContentHolder() {}
/**
* @brief Construct a ModDataContentHold holding the given list of contents.
*/
- ModDataContentHolder(std::vector<ModDataContent::Content> contents) :
- m_Contents(std::move(contents)) { }
+ ModDataContentHolder(std::vector<ModDataContent::Content> contents)
+ : m_Contents(std::move(contents))
+ {}
friend class OrganizerCore;
};
public:
- OrganizerCore(Settings &settings);
+ OrganizerCore(Settings& settings);
~OrganizerCore();
void setUserInterface(IUserInterface* ui);
- void connectPlugins(PluginContainer *container);
+ void connectPlugins(PluginContainer* container);
- void setManagedGame(MOBase::IPluginGame *game);
+ void setManagedGame(MOBase::IPluginGame* game);
void updateExecutablesList();
void updateModInfoFromDisc();
@@ -213,18 +227,19 @@ public:
void checkForUpdates();
void startMOUpdate();
- Settings &settings();
- SelfUpdater *updater() { return &m_Updater; }
- InstallationManager *installationManager();
- MOShared::DirectoryEntry *directoryStructure() { return m_DirectoryStructure; }
- DirectoryRefresher *directoryRefresher() { return m_DirectoryRefresher.get(); }
- ExecutablesList *executablesList() { return &m_ExecutablesList; }
- void setExecutablesList(const ExecutablesList &executablesList) {
+ Settings& settings();
+ SelfUpdater* updater() { return &m_Updater; }
+ InstallationManager* installationManager();
+ MOShared::DirectoryEntry* directoryStructure() { return m_DirectoryStructure; }
+ DirectoryRefresher* directoryRefresher() { return m_DirectoryRefresher.get(); }
+ ExecutablesList* executablesList() { return &m_ExecutablesList; }
+ void setExecutablesList(const ExecutablesList& executablesList)
+ {
m_ExecutablesList = executablesList;
}
- Profile *currentProfile() const { return m_CurrentProfile.get(); }
- void setCurrentProfile(const QString &profileName);
+ Profile* currentProfile() const { return m_CurrentProfile.get(); }
+ void setCurrentProfile(const QString& profileName);
std::vector<QString> enabledArchives();
@@ -234,7 +249,7 @@ public:
//
PluginContainer& pluginContainer() const;
- MOBase::IPluginGame const *managedGame() const;
+ MOBase::IPluginGame const* managedGame() const;
/**
* @brief Retrieve the organizer proxy of the currently managed game.
@@ -242,7 +257,6 @@ public:
*/
MOBase::IOrganizer const* managedGameOrganizer() const;
-
/**
* @return the list of contents for the currently managed game, or an empty vector
* if the game plugin does not implement the ModDataContent feature.
@@ -255,15 +269,14 @@ public:
ProcessRunner processRunner();
- bool beforeRun(
- const QFileInfo& binary, const QString& profileName,
- const QString& customOverwrite,
- const QList<MOBase::ExecutableForcedLoadSetting>& forcedLibraries);
+ bool beforeRun(const QFileInfo& binary, const QString& profileName,
+ const QString& customOverwrite,
+ const QList<MOBase::ExecutableForcedLoadSetting>& forcedLibraries);
void afterRun(const QFileInfo& binary, DWORD exitCode);
- ProcessRunner::Results waitForAllUSVFSProcesses(
- UILocker::Reasons reason=UILocker::PreventExit);
+ ProcessRunner::Results
+ waitForAllUSVFSProcesses(UILocker::Reasons reason = UILocker::PreventExit);
void refreshESPList(bool force = false);
void refreshBSAList();
@@ -272,28 +285,31 @@ public:
void updateModInDirectoryStructure(unsigned int index, ModInfo::Ptr modInfo);
void updateModsInDirectoryStructure(QMap<unsigned int, ModInfo::Ptr> modInfos);
- void doAfterLogin(const std::function<void()> &function) { m_PostLoginTasks.append(function); }
- void loggedInAction(QWidget* parent, std::function<void ()> f);
+ void doAfterLogin(const std::function<void()>& function)
+ {
+ m_PostLoginTasks.append(function);
+ }
+ void loggedInAction(QWidget* parent, std::function<void()> f);
- bool previewFileWithAlternatives(QWidget* parent, QString filename, int selectedOrigin=-1);
+ bool previewFileWithAlternatives(QWidget* parent, QString filename,
+ int selectedOrigin = -1);
bool previewFile(QWidget* parent, const QString& originName, const QString& path);
void loginSuccessfulUpdate(bool necessary);
- void loginFailedUpdate(const QString &message);
+ void loginFailedUpdate(const QString& message);
- static bool createAndMakeWritable(const QString &path);
+ static bool createAndMakeWritable(const QString& path);
bool checkPathSymlinks();
bool bootstrap();
void createDefaultProfile();
- MOBase::DelayedFileWriter &pluginsWriter() { return m_PluginListsWriter; }
+ MOBase::DelayedFileWriter& pluginsWriter() { return m_PluginListsWriter; }
void prepareVFS();
- void updateVFSParams(
- MOBase::log::Levels logLevel, env::CoreDumpTypes coreDumpType,
- const QString& coreDumpsPath, std::chrono::seconds spawnDelay,
- QString executableBlacklist);
+ void updateVFSParams(MOBase::log::Levels logLevel, env::CoreDumpTypes coreDumpType,
+ const QString& coreDumpsPath, std::chrono::seconds spawnDelay,
+ QString executableBlacklist);
void setLogLevel(MOBase::log::Levels level);
@@ -304,7 +320,7 @@ public:
static std::wstring getGlobalCoreDumpPath();
public:
- MOBase::IModRepositoryBridge *createNexusBridge() const;
+ MOBase::IModRepositoryBridge* createNexusBridge() const;
QString profileName() const;
QString profilePath() const;
QString downloadsPath() const;
@@ -312,38 +328,58 @@ public:
QString basePath() const;
QString modsPath() const;
MOBase::VersionInfo appVersion() const;
- MOBase::IPluginGame *getGame(const QString &gameName) const;
- MOBase::IModInterface *createMod(MOBase::GuessedValue<QString> &name);
- void modDataChanged(MOBase::IModInterface *mod);
- QVariant pluginSetting(const QString &pluginName, const QString &key) const;
- void setPluginSetting(const QString &pluginName, const QString &key, const QVariant &value);
- QVariant persistent(const QString &pluginName, const QString &key, const QVariant &def) const;
- void setPersistent(const QString &pluginName, const QString &key, const QVariant &value, bool sync);
+ MOBase::IPluginGame* getGame(const QString& gameName) const;
+ MOBase::IModInterface* createMod(MOBase::GuessedValue<QString>& name);
+ void modDataChanged(MOBase::IModInterface* mod);
+ QVariant pluginSetting(const QString& pluginName, const QString& key) const;
+ void setPluginSetting(const QString& pluginName, const QString& key,
+ const QVariant& value);
+ QVariant persistent(const QString& pluginName, const QString& key,
+ const QVariant& def) const;
+ void setPersistent(const QString& pluginName, const QString& key,
+ const QVariant& value, bool sync);
static QString pluginDataPath();
- virtual MOBase::IModInterface *installMod(const QString &fileName, int priority, bool reinstallation, ModInfo::Ptr currentMod, const QString &initModName);
- QString resolvePath(const QString &fileName) const;
- QStringList listDirectories(const QString &directoryName) const;
- QStringList findFiles(const QString &path, const std::function<bool (const QString &)> &filter) const;
- QStringList getFileOrigins(const QString &fileName) const;
- QList<MOBase::IOrganizer::FileInfo> findFileInfos(const QString &path, const std::function<bool (const MOBase::IOrganizer::FileInfo &)> &filter) const;
- DownloadManager *downloadManager();
- PluginList *pluginList();
- ModList *modList();
+ virtual MOBase::IModInterface* installMod(const QString& fileName, int priority,
+ bool reinstallation,
+ ModInfo::Ptr currentMod,
+ const QString& initModName);
+ QString resolvePath(const QString& fileName) const;
+ QStringList listDirectories(const QString& directoryName) const;
+ QStringList findFiles(const QString& path,
+ const std::function<bool(const QString&)>& filter) const;
+ QStringList getFileOrigins(const QString& fileName) const;
+ QList<MOBase::IOrganizer::FileInfo> findFileInfos(
+ const QString& path,
+ const std::function<bool(const MOBase::IOrganizer::FileInfo&)>& filter) const;
+ DownloadManager* downloadManager();
+ PluginList* pluginList();
+ ModList* modList();
void refresh(bool saveChanges = true);
- boost::signals2::connection onAboutToRun(const std::function<bool(const QString&)>& func);
- boost::signals2::connection onFinishedRun(const std::function<void(const QString&, unsigned int)>& func);
- boost::signals2::connection onUserInterfaceInitialized(std::function<void(QMainWindow*)> const& func);
- boost::signals2::connection onProfileCreated(std::function<void(MOBase::IProfile*)> const& func);
- boost::signals2::connection onProfileRenamed(std::function<void(MOBase::IProfile*, QString const&, QString const&)> const& func);
- boost::signals2::connection onProfileRemoved(std::function<void(QString const&)> const& func);
- boost::signals2::connection onProfileChanged(std::function<void(MOBase::IProfile*, MOBase::IProfile*)> const& func);
- boost::signals2::connection onPluginSettingChanged(std::function<void(QString const&, const QString& key, const QVariant&, const QVariant&)> const& func);
- boost::signals2::connection onPluginEnabled(std::function<void(const MOBase::IPlugin*)> const& func);
- boost::signals2::connection onPluginDisabled(std::function<void(const MOBase::IPlugin*)> const& func);
-
-public: // IPluginDiagnose interface
+ boost::signals2::connection
+ onAboutToRun(const std::function<bool(const QString&)>& func);
+ boost::signals2::connection
+ onFinishedRun(const std::function<void(const QString&, unsigned int)>& func);
+ boost::signals2::connection
+ onUserInterfaceInitialized(std::function<void(QMainWindow*)> const& func);
+ boost::signals2::connection
+ onProfileCreated(std::function<void(MOBase::IProfile*)> const& func);
+ boost::signals2::connection onProfileRenamed(
+ std::function<void(MOBase::IProfile*, QString const&, QString const&)> const&
+ func);
+ boost::signals2::connection
+ onProfileRemoved(std::function<void(QString const&)> const& func);
+ boost::signals2::connection onProfileChanged(
+ std::function<void(MOBase::IProfile*, MOBase::IProfile*)> const& func);
+ boost::signals2::connection onPluginSettingChanged(
+ std::function<void(QString const&, const QString& key, const QVariant&,
+ const QVariant&)> const& func);
+ boost::signals2::connection
+ onPluginEnabled(std::function<void(const MOBase::IPlugin*)> const& func);
+ boost::signals2::connection
+ onPluginDisabled(std::function<void(const MOBase::IPlugin*)> const& func);
+public: // IPluginDiagnose interface
virtual std::vector<unsigned int> activeProblems() const;
virtual QString shortDescription(unsigned int key) const;
virtual QString fullDescription(unsigned int key) const;
@@ -361,19 +397,22 @@ public slots:
void refreshLists();
ModInfo::Ptr installDownload(int downloadIndex, int priority = -1);
- ModInfo::Ptr installArchive(const QString& archivePath, int priority = -1, bool reinstallation = false,
- ModInfo::Ptr currentMod = nullptr, const QString& modName = QString());
+ ModInfo::Ptr installArchive(const QString& archivePath, int priority = -1,
+ bool reinstallation = false,
+ ModInfo::Ptr currentMod = nullptr,
+ const QString& modName = QString());
void modPrioritiesChanged(QModelIndexList const& indexes);
void modStatusChanged(unsigned int index);
void modStatusChanged(QList<unsigned int> index);
- void requestDownload(const QUrl &url, QNetworkReply *reply);
- void downloadRequestedNXM(const QString &url);
+ void requestDownload(const QUrl& url, QNetworkReply* reply);
+ void downloadRequestedNXM(const QString& url);
void userInterfaceInitialized();
void profileCreated(MOBase::IProfile* profile);
- void profileRenamed(MOBase::IProfile* profile, QString const& oldName, QString const& newName);
+ void profileRenamed(MOBase::IProfile* profile, QString const& oldName,
+ QString const& newName);
void profileRemoved(QString const& profileName);
bool nexusApi(bool retry = false);
@@ -382,11 +421,11 @@ signals:
// emitted after a mod has been installed
//
- void modInstalled(const QString &modName);
+ void modInstalled(const QString& modName);
// emitted when the managed game changes
//
- void managedGameChanged(MOBase::IPluginGame const *gamePlugin);
+ void managedGameChanged(MOBase::IPluginGame const* gamePlugin);
// emitted when the profile is changed, before notifying plugins
//
@@ -400,54 +439,55 @@ signals:
void directoryStructureReady();
private:
-
std::pair<unsigned int, ModInfo::Ptr> doInstall(const QString& archivePath,
- MOBase::GuessedValue<QString> modName, ModInfo::Ptr currentMod, int priority, bool reinstallation);
+ MOBase::GuessedValue<QString> modName,
+ ModInfo::Ptr currentMod, int priority,
+ bool reinstallation);
void saveCurrentProfile();
void storeSettings();
void updateModActiveState(int index, bool active);
- void updateModsActiveState(const QList<unsigned int> &modIndices, bool active);
+ void updateModsActiveState(const QList<unsigned int>& modIndices, bool active);
// clear the conflict caches of all the given mods, and the mods in conflict
// with the given mods
//
void clearCaches(std::vector<unsigned int> const& indices) const;
- bool createDirectory(const QString &path);
+ bool createDirectory(const QString& path);
QString oldMO1HookDll() const;
/**
* @brief return a descriptor of the mappings real file->virtual file
*/
- std::vector<Mapping> fileMapping(const QString &profile,
- const QString &customOverwrite);
+ std::vector<Mapping> fileMapping(const QString& profile,
+ const QString& customOverwrite);
- std::vector<Mapping>
- fileMapping(const QString &dataPath, const QString &relPath,
- const MOShared::DirectoryEntry *base,
- const MOShared::DirectoryEntry *directoryEntry,
- int createDestination);
+ std::vector<Mapping> fileMapping(const QString& dataPath, const QString& relPath,
+ const MOShared::DirectoryEntry* base,
+ const MOShared::DirectoryEntry* directoryEntry,
+ int createDestination);
private slots:
void directory_refreshed();
- void downloadRequested(QNetworkReply *reply, QString gameName, int modID, const QString &fileName);
- void removeOrigin(const QString &name);
- void downloadSpeed(const QString &serverName, int bytesPerSecond);
+ void downloadRequested(QNetworkReply* reply, QString gameName, int modID,
+ const QString& fileName);
+ void removeOrigin(const QString& name);
+ void downloadSpeed(const QString& serverName, int bytesPerSecond);
void loginSuccessful(bool necessary);
- void loginFailed(const QString &message);
+ void loginFailed(const QString& message);
private:
static const unsigned int PROBLEM_MO1SCRIPTEXTENDERWORKAROUND = 1;
private:
IUserInterface* m_UserInterface;
- PluginContainer *m_PluginContainer;
+ PluginContainer* m_PluginContainer;
QString m_GameName;
- MOBase::IPluginGame *m_GamePlugin;
+ MOBase::IPluginGame* m_GamePlugin;
ModDataContentHolder m_Contents;
std::unique_ptr<Profile> m_CurrentProfile;
@@ -470,7 +510,6 @@ private:
ModList m_ModList;
PluginList m_PluginList;
-
QList<std::function<void()>> m_PostLoginTasks;
QList<std::function<void()>> m_PostRefreshTasks;
@@ -480,7 +519,7 @@ private:
QStringList m_ActiveArchives;
std::unique_ptr<DirectoryRefresher> m_DirectoryRefresher;
- MOShared::DirectoryEntry *m_DirectoryStructure;
+ MOShared::DirectoryEntry* m_DirectoryStructure;
MOBase::MemoizedLocked<std::shared_ptr<const MOBase::IFileTree>> m_VirtualFileTree;
DownloadManager m_DownloadManager;
@@ -499,4 +538,4 @@ private:
UILocker m_UILocker;
};
-#endif // ORGANIZERCORE_H
+#endif // ORGANIZERCORE_H