From dd2e836b4cf4cfa043f9ea2911f58f1d22d4e282 Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 20 Feb 2013 19:10:09 -0600 Subject: Split MultiMC up into a few separate libraries. Fixed plugin system. Tons of other stuff... --- CMakeLists.txt | 113 +++++---- data/appsettings.cpp | 40 ---- data/appsettings.h | 116 ---------- data/inifile.cpp | 86 ------- data/inifile.h | 36 --- data/inst/instance.cpp | 110 --------- data/inst/instance.h | 340 --------------------------- data/inst/instancelist.cpp | 78 ------- data/inst/instancelist.h | 57 ----- data/inst/instanceloader.cpp | 106 --------- data/inst/instanceloader.h | 133 ----------- data/inst/instancetype.cpp | 21 -- data/inst/instancetype.h | 83 ------- data/plugin/instancetypeplugin.h | 41 ---- data/plugin/pluginmanager.cpp | 81 ++++--- data/plugin/pluginmanager.h | 17 +- data/siglist.h | 130 ----------- data/siglist_impl.h | 156 ------------- data/version/instversion.cpp | 32 --- data/version/instversion.h | 51 ----- data/version/instversionlist.cpp | 21 -- data/version/instversionlist.h | 43 ---- gui/mainwindow.cpp | 16 +- gui/mainwindow.h | 2 +- gui/settingsdialog.cpp | 2 +- libinstance/CMakeLists.txt | 50 ++-- libinstance/include/instance.h | 342 ++++++++++++++++++++++++++++ libinstance/include/instancelist.h | 59 +++++ libinstance/include/instanceloader.h | 137 +++++++++++ libinstance/include/instancetypeinterface.h | 86 +++++++ libinstance/include/instversion.h | 53 +++++ libinstance/include/instversionlist.h | 45 ++++ libinstance/include/libinstance_config.h | 27 +++ libinstance/src/instance.cpp | 110 +++++++++ libinstance/src/instancelist.cpp | 84 +++++++ libinstance/src/instanceloader.cpp | 109 +++++++++ libinstance/src/instversion.cpp | 32 +++ libinstance/src/instversionlist.cpp | 21 ++ libsettings/CMakeLists.txt | 30 +++ libsettings/include/appsettings.h | 119 ++++++++++ libsettings/include/libsettings_config.h | 27 +++ libsettings/src/appsettings.cpp | 40 ++++ libutil/CMakeLists.txt | 38 ++++ libutil/include/apputils.h | 21 ++ libutil/include/inifile.h | 38 ++++ libutil/include/libutil_config.h | 27 +++ libutil/include/osutils.h | 29 +++ libutil/include/pathutils.h | 28 +++ libutil/include/siglist.h | 130 +++++++++++ libutil/include/siglist_impl.h | 156 +++++++++++++ libutil/src/inifile.cpp | 86 +++++++ libutil/src/osutils.cpp | 19 ++ libutil/src/pathutils.cpp | 37 +++ main.cpp | 4 +- plugins/stdinstance/CMakeLists.txt | 28 ++- plugins/stdinstance/stdinstance.cpp | 5 +- plugins/stdinstance/stdinstance.h | 2 +- plugins/stdinstance/stdinstance.json | 9 +- plugins/stdinstance/stdinstancetype.cpp | 2 +- plugins/stdinstance/stdinstancetype.h | 8 +- plugins/stdinstance/stdinstplugin.cpp | 27 --- plugins/stdinstance/stdinstplugin.h | 33 --- util/apputils.h | 21 -- util/osutils.cpp | 25 -- util/osutils.h | 32 --- util/pathutils.cpp | 37 --- util/pathutils.h | 26 --- 67 files changed, 2127 insertions(+), 2023 deletions(-) delete mode 100644 data/appsettings.cpp delete mode 100644 data/appsettings.h delete mode 100644 data/inifile.cpp delete mode 100644 data/inifile.h delete mode 100644 data/inst/instance.cpp delete mode 100644 data/inst/instance.h delete mode 100644 data/inst/instancelist.cpp delete mode 100644 data/inst/instancelist.h delete mode 100644 data/inst/instanceloader.cpp delete mode 100644 data/inst/instanceloader.h delete mode 100644 data/inst/instancetype.cpp delete mode 100644 data/inst/instancetype.h delete mode 100644 data/plugin/instancetypeplugin.h delete mode 100644 data/siglist.h delete mode 100644 data/siglist_impl.h delete mode 100644 data/version/instversion.cpp delete mode 100644 data/version/instversion.h delete mode 100644 data/version/instversionlist.cpp delete mode 100644 data/version/instversionlist.h create mode 100644 libinstance/include/instance.h create mode 100644 libinstance/include/instancelist.h create mode 100644 libinstance/include/instanceloader.h create mode 100644 libinstance/include/instancetypeinterface.h create mode 100644 libinstance/include/instversion.h create mode 100644 libinstance/include/instversionlist.h create mode 100644 libinstance/include/libinstance_config.h create mode 100644 libinstance/src/instance.cpp create mode 100644 libinstance/src/instancelist.cpp create mode 100644 libinstance/src/instanceloader.cpp create mode 100644 libinstance/src/instversion.cpp create mode 100644 libinstance/src/instversionlist.cpp create mode 100644 libsettings/CMakeLists.txt create mode 100644 libsettings/include/appsettings.h create mode 100644 libsettings/include/libsettings_config.h create mode 100644 libsettings/src/appsettings.cpp create mode 100644 libutil/CMakeLists.txt create mode 100644 libutil/include/apputils.h create mode 100644 libutil/include/inifile.h create mode 100644 libutil/include/libutil_config.h create mode 100644 libutil/include/osutils.h create mode 100644 libutil/include/pathutils.h create mode 100644 libutil/include/siglist.h create mode 100644 libutil/include/siglist_impl.h create mode 100644 libutil/src/inifile.cpp create mode 100644 libutil/src/osutils.cpp create mode 100644 libutil/src/pathutils.cpp delete mode 100644 plugins/stdinstance/stdinstplugin.cpp delete mode 100644 plugins/stdinstance/stdinstplugin.h delete mode 100644 util/apputils.h delete mode 100644 util/osutils.cpp delete mode 100644 util/osutils.h delete mode 100644 util/pathutils.cpp delete mode 100644 util/pathutils.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 5e8f7a90..eea4ded5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,6 +4,7 @@ project(MultiMC) set(CMAKE_AUTOMOC ON) set(CMAKE_INCLUDE_CURRENT_DIR ON) +SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}) #### Check for machine endianness #### INCLUDE(TestBigEndian) @@ -32,9 +33,22 @@ add_subdirectory(quazip) add_subdirectory(patchlib) include_directories(patchlib) -# add the java launcher +# Add the java launcher add_subdirectory(launcher) + +# Add the util library. +add_subdirectory(libutil) +include_directories(${LIBMMCUTIL_INCLUDE_DIR}) + +# Add the settings library. +add_subdirectory(libsettings) +include_directories(${LIBMMCSETTINGS_INCLUDE_DIR}) + +# Add the instance library. +add_subdirectory(libinstance) +include_directories(${LIBMMCINST_INCLUDE_DIR}) + # Add the stdinstance plugin. add_subdirectory(plugins/stdinstance) @@ -97,43 +111,6 @@ message(STATUS "Job URL: ${MultiMC_JOB_URL}") configure_file("${PROJECT_SOURCE_DIR}/config.h.in" "${PROJECT_BINARY_DIR}/config.h") - -SET(MULTIMC_SOURCES -main.cpp - -data/appsettings.cpp -data/inifile.cpp -data/version.cpp -data/userinfo.cpp -data/loginresponse.cpp - -data/inst/instanceloader.cpp -data/inst/instancetype.cpp -data/inst/instance.cpp -data/inst/instancelist.cpp - -data/plugin/pluginmanager.cpp - -data/version/instversion.cpp -data/version/instversionlist.cpp - -gui/mainwindow.cpp -gui/modeditwindow.cpp -gui/settingsdialog.cpp -gui/newinstancedialog.cpp -gui/logindialog.cpp -gui/taskdialog.cpp - -util/pathutils.cpp -util/osutils.cpp - -java/javautils.cpp -java/annotations.cpp - -tasks/task.cpp -tasks/logintask.cpp -) - SET(MULTIMC_HEADERS gui/mainwindow.h gui/modeditwindow.h @@ -142,28 +119,11 @@ gui/newinstancedialog.h gui/logindialog.h gui/taskdialog.h -data/appsettings.h -data/inifile.h data/version.h data/userinfo.h data/loginresponse.h -data/siglist.h -data/siglist_impl.h - -data/inst/instanceloader.h -data/inst/instancetype.h -data/inst/instance.h -data/inst/instancelist.h data/plugin/pluginmanager.h -data/plugin/instancetypeplugin.h - -data/version/instversion.h -data/version/instversionlist.h - -util/apputils.h -util/pathutils.h -util/osutils.h multimc_pragma.h @@ -179,6 +139,29 @@ tasks/task.h tasks/logintask.h ) +SET(MULTIMC_SOURCES +main.cpp + +data/version.cpp +data/userinfo.cpp +data/loginresponse.cpp + +data/plugin/pluginmanager.cpp + +gui/mainwindow.cpp +gui/modeditwindow.cpp +gui/settingsdialog.cpp +gui/newinstancedialog.cpp +gui/logindialog.cpp +gui/taskdialog.cpp + +java/javautils.cpp +java/annotations.cpp + +tasks/task.cpp +tasks/logintask.cpp +) + SET(MULTIMC5_UIS gui/mainwindow.ui gui/modeditwindow.ui @@ -214,8 +197,10 @@ QT5_ADD_RESOURCES(MULTIMC_QRC multimc.qrc) add_executable(MultiMC MACOSX_BUNDLE WIN32 ${MULTIMC_SOURCES} ${MULTIMC_HEADERS} ${MULTIMC_UI} ${MULTIMC_QRC}) qt5_use_modules(MultiMC Widgets Network) -target_link_libraries(MultiMC quazip patchlib stdinstance ${MultiMC_LINK_ADDITIONAL_LIBS}) -add_dependencies(MultiMC MultiMCLauncher) +target_link_libraries(MultiMC quazip patchlib +libmmcutil libmmcsettings libmmcinst +${MultiMC_LINK_ADDITIONAL_LIBS}) +add_dependencies(MultiMC MultiMCLauncher libmmcutil libmmcsettings libmmcinst) ################ Dirs ################ @@ -225,9 +210,9 @@ SET(QTCONF_DEST_DIR bin) SET(APPS "\${CMAKE_INSTALL_PREFIX}/bin/MultiMC") IF(WIN32) - #SET(PLUGIN_DEST_DIR .) - #SET(QTCONF_DEST_DIR .) - SET(APPS "\${CMAKE_INSTALL_PREFIX}/bin/MultiMC.exe") + SET(PLUGIN_DEST_DIR .) + SET(QTCONF_DEST_DIR .) + SET(APPS "\${CMAKE_INSTALL_PREFIX}/MultiMC.exe") ENDIF() IF(APPLE) SET(PLUGIN_DEST_DIR MultiMC.app/Contents/MacOS) @@ -255,7 +240,7 @@ ENDIF(APPLE) IF(WIN32) INSTALL(TARGETS MultiMC BUNDLE DESTINATION . COMPONENT Runtime - RUNTIME DESTINATION bin COMPONENT Runtime + RUNTIME DESTINATION . COMPONENT Runtime ) ENDIF() IF(UNIX) @@ -287,7 +272,11 @@ INSTALL(CODE " # Dirs to look for dependencies. -SET(DIRS ${QT_LIBRARY_DIRS}) +SET(DIRS "${QT_LIBRARY_DIRS} +${CMAKE_BINARY_DIR}/libutil +${CMAKE_BINARY_DIR}/libsettings +${CMAKE_BINARY_DIR}/libinstance") +message(STATUS "${DIRS}") INSTALL(CODE " file(GLOB_RECURSE QTPLUGINS diff --git a/data/appsettings.cpp b/data/appsettings.cpp deleted file mode 100644 index 1d9c4312..00000000 --- a/data/appsettings.cpp +++ /dev/null @@ -1,40 +0,0 @@ -/* Copyright 2013 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "appsettings.h" - -AppSettings* settings; - -SettingsBase::SettingsBase(QObject *parent) : - QObject(parent) -{ - -} - -AppSettings::AppSettings(QObject *parent) : - SettingsBase(parent) -{ - -} - -QVariant AppSettings::getValue(const QString& name, QVariant defVal) const -{ - return config.value(name, defVal); -} - -void AppSettings::setValue(const QString& name, QVariant val) -{ - config.setValue(name, val); -} diff --git a/data/appsettings.h b/data/appsettings.h deleted file mode 100644 index 8a786db0..00000000 --- a/data/appsettings.h +++ /dev/null @@ -1,116 +0,0 @@ -/* Copyright 2013 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef APPSETTINGS_H -#define APPSETTINGS_H - -#include -#include -#include -#include - -#include "util/apputils.h" -#include "util/osutils.h" - -#if WINDOWS -#define JPATHKEY "JavaPathWindows" -#elif OSX -#define JPATHKEY "JavaPathOSX" -#else -#define JPATHKEY "JavaPathLinux" -#endif - -#define DEFINE_SETTING_ADVANCED(funcName, name, valType, defVal) \ - virtual valType get ## funcName() const { return getValue(name, defVal).value(); } \ - virtual void set ## funcName(valType value) { setValue(name, value); } - -#define DEFINE_SETTING(name, valType, defVal) \ - DEFINE_SETTING_ADVANCED(name, STR_VAL(name), valType, defVal) - - -class SettingsBase : public QObject -{ - Q_OBJECT -public: - explicit SettingsBase(QObject *parent = 0); - - // Updates - DEFINE_SETTING(UseDevBuilds, bool, false) - DEFINE_SETTING(AutoUpdate, bool, true) - - // Folders - DEFINE_SETTING(InstanceDir, QString, "instances") - DEFINE_SETTING(CentralModsDir, QString, "mods") - DEFINE_SETTING(LWJGLDir, QString, "lwjgl") - - // Console - DEFINE_SETTING(ShowConsole, bool, true) - DEFINE_SETTING(AutoCloseConsole, bool, true) - - // Toolbar settings - DEFINE_SETTING(InstanceToolbarVisible, bool, true) - DEFINE_SETTING(InstanceToolbarPosition, QPoint, QPoint()) - - // Console Colors - DEFINE_SETTING(SysMessageColor, QColor, QColor(Qt::blue)) - DEFINE_SETTING(StdOutColor, QColor, QColor(Qt::black)) - DEFINE_SETTING(StdErrColor, QColor, QColor(Qt::red)) - - // Window Size - DEFINE_SETTING(LaunchCompatMode, bool, false) - DEFINE_SETTING(LaunchMaximized, bool, false) - DEFINE_SETTING(MinecraftWinWidth, int, 854) - DEFINE_SETTING(MinecraftWinHeight, int, 480) - - // Auto login - DEFINE_SETTING(AutoLogin, bool, false) - - // Memory - DEFINE_SETTING(MinMemAlloc, int, 512) - DEFINE_SETTING(MaxMemAlloc, int, 1024) - - // Java Settings - DEFINE_SETTING_ADVANCED(JavaPath, JPATHKEY, QString, "java") - DEFINE_SETTING(JvmArgs, QString, "") - - // Custom Commands - DEFINE_SETTING(PreLaunchCommand, QString, "") - DEFINE_SETTING(PostExitCommand, QString, "") - - virtual QVariant getValue(const QString& name, QVariant defVal = QVariant()) const = 0; - virtual void setValue(const QString& name, QVariant val) = 0; -}; - -class AppSettings : public SettingsBase -{ - Q_OBJECT -public: - explicit AppSettings(QObject *parent = 0); - - QSettings& getConfig() { return config; } - - virtual QVariant getValue(const QString &name, QVariant defVal = QVariant()) const; - virtual void setValue(const QString& name, QVariant val); - -protected: - QSettings config; -}; - -#undef DEFINE_SETTING_ADVANCED -#undef DEFINE_SETTING - -extern AppSettings* settings; - -#endif // APPSETTINGS_H diff --git a/data/inifile.cpp b/data/inifile.cpp deleted file mode 100644 index 2d68caf6..00000000 --- a/data/inifile.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/* Copyright 2013 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "inifile.h" - -#include -#include -#include - -INIFile::INIFile() -{ - -} - -bool INIFile::saveFile(QString fileName) -{ - // TODO Handle errors. - QFile file(fileName); - file.open(QIODevice::WriteOnly); - QTextStream out(&file); - - for (Iterator iter = begin(); iter != end(); iter++) - { - out << iter.key() << "=" << iter.value().toString() << "\n"; - } - - return true; -} - -bool INIFile::loadFile(QString fileName) -{ - // TODO Handle errors. - QFile file(fileName); - file.open(QIODevice::ReadOnly); - QTextStream in(&file); - - QStringList lines = in.readAll().split('\n'); - for (int i = 0; i < lines.count(); i++) - { - QString & lineRaw = lines[i]; - // Ignore comments. - QString line = lineRaw.left(lineRaw.indexOf('#')).trimmed(); - - int eqPos = line.indexOf('='); - if(eqPos == -1) - continue; - QString key = line.left(eqPos).trimmed(); - QString valueStr = line.right(line.length() - eqPos - 1).trimmed(); - - QVariant value(valueStr); - /* - QString dbg = key; - dbg += " = "; - dbg += valueStr; - qDebug(dbg.toLocal8Bit()); - */ - this->operator [](key) = value; - } - - return true; -} - -QVariant INIFile::get(QString key, QVariant def) const -{ - if (!this->contains(key)) - return def; - else - return this->operator [](key); -} - -void INIFile::set(QString key, QVariant val) -{ - this->operator [](key) = val; -} diff --git a/data/inifile.h b/data/inifile.h deleted file mode 100644 index 75783859..00000000 --- a/data/inifile.h +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright 2013 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef INIFILE_H -#define INIFILE_H - -#include -#include -#include - -// Sectionless INI parser (for instance config files) -class INIFile : public QMap -{ -public: - explicit INIFile(); - - bool loadFile(QString fileName); - bool saveFile(QString fileName); - - QVariant get(QString key, QVariant def) const; - void set(QString key, QVariant val); -}; - -#endif // INIFILE_H diff --git a/data/inst/instance.cpp b/data/inst/instance.cpp deleted file mode 100644 index 5db0be20..00000000 --- a/data/inst/instance.cpp +++ /dev/null @@ -1,110 +0,0 @@ -/* Copyright 2013 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "instance.h" - -#include - -#include "util/pathutils.h" - -Instance::Instance(const QString &rootDir, QObject *parent) : - SettingsBase(parent) -{ - m_rootDir = rootDir; - config.loadFile(PathCombine(rootDir, "instance.cfg")); -} - -QString Instance::id() -{ - return QFileInfo(rootDir()).baseName(); -} - -QString Instance::rootDir() -{ - return m_rootDir; -} - -InstanceList *Instance::instList() -{ - if (parent()->inherits("InstanceList")) - return (InstanceList *)parent(); - else - return NULL; -} - -QString Instance::minecraftDir() const -{ - QFileInfo mcDir(PathCombine(rootDir(), "minecraft")); - QFileInfo dotMCDir(PathCombine(rootDir(), ".minecraft")); - - if (dotMCDir.exists() && !mcDir.exists()) - { - return dotMCDir.path(); - } - else - { - return mcDir.path(); - } -} - -QString Instance::binDir() const -{ - return PathCombine(minecraftDir(), "bin"); -} - -QString Instance::savesDir() const -{ - return PathCombine(minecraftDir(), "saves"); -} - -QString Instance::mlModsDir() const -{ - return PathCombine(minecraftDir(), "mods"); -} - -QString Instance::coreModsDir() const -{ - return PathCombine(minecraftDir(), "coremods"); -} - -QString Instance::resourceDir() const -{ - return PathCombine(minecraftDir(), "resources"); -} - -QString Instance::screenshotsDir() const -{ - return PathCombine(minecraftDir(), "screenshots"); -} - -QString Instance::texturePacksDir() const -{ - return PathCombine(minecraftDir(), "texturepacks"); -} - -QString Instance::mcJar() const -{ - return PathCombine(binDir(), "minecraft.jar"); -} - -QVariant Instance::getField(const QString &name, QVariant defVal) const -{ - return config.get(name, defVal); -} - -void Instance::setField(const QString &name, QVariant val) -{ - config.set(name, val); -} diff --git a/data/inst/instance.h b/data/inst/instance.h deleted file mode 100644 index 035704b9..00000000 --- a/data/inst/instance.h +++ /dev/null @@ -1,340 +0,0 @@ -/* Copyright 2013 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef INSTANCE_H -#define INSTANCE_H - -#include -#include - -#include "data/appsettings.h" -#include "data/inifile.h" - -#define DEFINE_OVERRIDDEN_SETTING_ADVANCED(funcName, cfgEntryName, typeName) \ - typeName get ## funcName() const { return getField(cfgEntryName, settings->get ## funcName()).value(); } - -#define DEFINE_OVERRIDDEN_SETTING(funcName, typeName) \ - DEFINE_OVERRIDDEN_SETTING_ADVANCED(funcName, STR_VAL(funcName), typeName) - -class InstanceList; - -/*! - * \brief Base class for instances. - * This class implements many functions that are common between instances and - * provides a standard interface for all instances. - * - * To create a new instance type, create a new class inheriting from this class - * and implement the pure virtual functions. - */ -class Instance : public SettingsBase -{ - Q_OBJECT -public: - explicit Instance(const QString &rootDir, QObject *parent = 0); - - // Please, for the sake of my (and everyone else's) sanity, at least keep this shit - // *somewhat* organized. Also, documentation is semi-important here. Please don't - // leave undocumented stuff behind. - - - //////// STUFF //////// - - /*! - * \brief Get the instance's ID. - * This is a unique identifier string that is, by default, set to the - * instance's folder name. It's not always the instance's folder name, - * however, as any class deriving from Instance can override the id() - * method and change how the ID is determined. The instance's ID - * should always remain constant. Undefined behavior results if an - * already loaded instance's ID changes. - * - * \return The instance's ID. - */ - virtual QString id(); - - /*! - * \brief Gets the path to the instance's root directory. - * \return The path to the instance's root directory. - */ - virtual QString rootDir(); - - /*! - * \brief Gets the instance list that this instance is a part of. - * Returns NULL if this instance is not in a list - * (the parent is not an InstanceList). - * \return A pointer to the InstanceList containing this instance. - */ - virtual InstanceList *instList(); - - - //////// FIELDS AND SETTINGS //////// - // Fields are options stored in the instance's config file that are specific - // to instances (not a part of SettingsBase). Settings are things overridden - // from SettingsBase. - - - ////// Fields ////// - - //// General Info //// - - /*! - * \brief Gets this instance's name. - * This is the name that will be displayed to the user. - * \return The instance's name. - * \sa setName - */ - virtual QString name() { return getField("name", "Unnamed Instance").value(); } - - /*! - * \brief Sets the instance's name - * \param val The instance's new name. - */ - virtual void setName(QString val) { setField("name", val); } - - /*! - * \brief Gets the instance's icon key. - * \return The instance's icon key. - * \sa setIconKey() - */ - virtual QString iconKey() const { return getField("iconKey", "default").value(); } - - /*! - * \brief Sets the instance's icon key. - * \param val The new icon key. - */ - virtual void setIconKey(QString val) { setField("iconKey", val); } - - - /*! - * \brief Gets the instance's notes. - * \return The instances notes. - */ - virtual QString notes() const { return getField("notes", "").value(); } - - /*! - * \brief Sets the instance's notes. - * \param val The instance's new notes. - */ - virtual void setNotes(QString val) { setField("notes", val); } - - - /*! - * \brief Checks if the instance's minecraft.jar needs to be rebuilt. - * If this is true, the instance's mods will be reinstalled to its - * minecraft.jar file. This value is automatically set to true when - * the jar mod list changes. - * \return Whether or not the instance's jar file should be rebuilt. - */ - virtual bool shouldRebuild() const { return getField("NeedsRebuild", false).value(); } - - /*! - * \brief Sets whether or not the instance's minecraft.jar needs to be rebuilt. - * \param val Whether the instance's minecraft needs to be rebuilt or not. - */ - virtual void setShouldRebuild(bool val) { setField("NeedsRebuild", val); } - - - //// Version Stuff //// - - /*! - * \brief Sets the instance's current version. - * This value represents the instance's current version. If this value - * is different from intendedVersion(), the instance should be updated. - * This value is updated by the updateCurrentVersion() function. - * \return A string representing the instance's current version. - */ - virtual QString currentVersion() { return getField("JarVersion", "Unknown").value(); } - - /*! - * \brief Sets the instance's current version. - * This is used to keep track of the instance's current version. Don't - * mess with this unless you know what you're doing. - * \param val The new value. - */ - virtual void setCurrentVersion(QString val) { setField("JarVersion", val); } - - - /*! - * \brief Gets the version of LWJGL that this instance should use. - * If no LWJGL version is specified in the instance's config file, - * defaults to "Mojang" - * \return The instance's LWJGL version. - */ - virtual QString lwjglVersion() { return getField("LwjglVersion", "Mojang").value(); } - - /*! - * \brief Sets the version of LWJGL that this instance should use. - * \param val The LWJGL version to use - */ - virtual void setLWJGLVersion(QString val) { setField("LwjglVersion", val); } - - - /*! - * \brief Gets the version that this instance should try to update to. - * If this value differs from currentVersion(), the instance will - * download the intended version when it launches. - * \return The instance's intended version. - */ - virtual QString intendedVersion() { return getField("IntendedJarVersion", currentVersion()).value(); } - - /*! - * \brief Sets the version that this instance should try to update to. - * \param val The instance's new intended version. - */ - virtual void setIntendedVersion(QString val) { setField("IntendedJarVersion", val); } - - - - //// Timestamps //// - - /*! - * \brief Gets the time that the instance was last launched. - * Measured in milliseconds since epoch. QDateTime::currentMSecsSinceEpoch() - * \return The time that the instance was last launched. - */ - virtual qint64 lastLaunch() { return getField("lastLaunchTime", 0).value(); } - - /*! - * \brief Sets the time that the instance was last launched. - * \param val The time to set. Defaults to QDateTime::currentMSecsSinceEpoch() - */ - virtual void setLastLaunch(qint64 val = QDateTime::currentMSecsSinceEpoch()) - { setField("lastLaunchTime", val); } - - - ////// Directories ////// - //! Gets the path to the instance's minecraft folder. - QString minecraftDir() const; - - /*! - * \brief Gets the path to the instance's instance mods folder. - * This is the folder where the jar mods are kept. - */ - QString instModsDir() const; - - //! Gets the path to the instance's bin folder. - QString binDir() const; - - //! Gets the path to the instance's saves folder. - QString savesDir() const; - - //! Gets the path to the instance's mods folder. (.minecraft/mods) - QString mlModsDir() const; - - //! Gets the path to the instance's coremods folder. - QString coreModsDir() const; - - //! Gets the path to the instance's resources folder. - QString resourceDir() const; - - //! Gets the path to the instance's screenshots folder. - QString screenshotsDir() const; - - //! Gets the path to the instance's texture packs folder. - QString texturePacksDir() const; - - - ////// Files ////// - //! Gets the path to the instance's minecraft.jar - QString mcJar() const; - - //! Gets the path to the instance's mcbackup.jar. - QString mcBackup() const; - - //! Gets the path to the instance's config file. - QString configFile() const; - - //! Gets the path to the instance's modlist file. - QString modListFile() const; - - ////// Settings ////// - - //// Java Settings //// - DEFINE_OVERRIDDEN_SETTING_ADVANCED(JavaPath, JPATHKEY, QString) - DEFINE_OVERRIDDEN_SETTING(JvmArgs, QString) - - //// Custom Commands //// - DEFINE_OVERRIDDEN_SETTING(PreLaunchCommand, QString) - DEFINE_OVERRIDDEN_SETTING(PostExitCommand, QString) - - //// Memory //// - DEFINE_OVERRIDDEN_SETTING(MinMemAlloc, int) - DEFINE_OVERRIDDEN_SETTING(MaxMemAlloc, int) - - //// Auto login //// - DEFINE_OVERRIDDEN_SETTING(AutoLogin, bool) - - // This little guy here is to keep Qt Creator from being a dumbass and - // auto-indenting the lines below the macros. Seriously, it's really annoying. - ; - - - //////// OTHER FUNCTIONS //////// - - //// Version System //// - - /*! - * \brief Checks whether or not the currentVersion of the instance needs to be updated. - * If this returns true, updateCurrentVersion is called. In the - * standard instance, this is determined by checking a timestamp - * stored in the instance config file against the last modified time of Minecraft.jar. - * \return True if updateCurrentVersion() should be called. - */ - virtual bool shouldUpdateCurrentVersion() = 0; - - /*! - * \brief Updates the current version. - * This function should first set the current version timestamp - * (setCurrentVersionTimestamp()) to the current time. Next, if - * keepCurrent is false, this function should check what the - * instance's current version is and call setCurrentVersion() to - * update it. This function will automatically be called when the - * instance is loaded if shouldUpdateCurrentVersion returns true. - * \param keepCurrent If true, only the version timestamp will be updated. - */ - virtual void updateCurrentVersion(bool keepCurrent = false) = 0; - -protected: - /*! - * \brief Gets the value of the given field in the instance's config file. - * If the value isn't in the config file, defVal is returned instead. - * \param name The name of the field in the config file. - * \param defVal The default value. - * \return The value of the given field or defVal if the field doesn't exist. - * \sa setField() - */ - virtual QVariant getField(const QString &name, QVariant defVal = QVariant()) const; - - /*! - * \brief Sets the value of the given field in the config file. - * \param name The name of the field in the config file. - * \param val The value to set the field to. - * \sa getField() - */ - virtual void setField(const QString &name, QVariant val); - - // Overrides for SettingBase stuff. - virtual QVariant getValue(const QString &name, QVariant defVal = QVariant()) const - { return settings->getValue(name, defVal); } - virtual void setValue(const QString &name, QVariant val) - { setField(name, val); } - - INIFile config; - -private: - QString m_rootDir; -}; - -#endif // INSTANCE_H diff --git a/data/inst/instancelist.cpp b/data/inst/instancelist.cpp deleted file mode 100644 index cbb89f05..00000000 --- a/data/inst/instancelist.cpp +++ /dev/null @@ -1,78 +0,0 @@ -/* Copyright 2013 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "instancelist.h" - -#include "data/siglist_impl.h" - -#include -#include -#include - -#include "instance.h" -#include "instanceloader.h" - -#include "util/pathutils.h" - - -InstanceList::InstanceList(const QString &instDir, QObject *parent) : - QObject(parent), m_instDir(instDir) -{ - -} - -InstanceList::InstListError InstanceList::loadList() -{ - QDir dir(m_instDir); - QDirIterator iter(dir); - - while (iter.hasNext()) - { - QString subDir = iter.next(); - if (QFileInfo(PathCombine(subDir, "instance.cfg")).exists()) - { - QSharedPointer inst; - InstanceLoader::InstTypeError error = InstanceLoader::loader. - loadInstance(inst.data(), subDir); - - if (inst.data() && error == InstanceLoader::NoError) - { - qDebug(QString("Loaded instance %1").arg(inst->name()).toUtf8()); - inst->setParent(this); - append(QSharedPointer(inst)); - } - else if (error != InstanceLoader::NotAnInstance) - { - QString errorMsg = QString("Failed to load instance %1: "). - arg(QFileInfo(subDir).baseName()).toUtf8(); - - switch (error) - { - case InstanceLoader::TypeNotRegistered: - errorMsg += "Instance type not found."; - break; - } - qDebug(errorMsg.toUtf8()); - } - else if (!inst.data()) - { - qDebug(QString("Error loading instance %1. Instance loader returned null."). - arg(QFileInfo(subDir).baseName()).toUtf8()); - } - } - } - - return NoError; -} diff --git a/data/inst/instancelist.h b/data/inst/instancelist.h deleted file mode 100644 index c43c4cc0..00000000 --- a/data/inst/instancelist.h +++ /dev/null @@ -1,57 +0,0 @@ -/* Copyright 2013 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef INSTANCELIST_H -#define INSTANCELIST_H - -#include - -#include - -#include "data/siglist.h" - -class Instance; - -class InstanceList : public QObject, public SigList> -{ - Q_OBJECT -public: - explicit InstanceList(const QString &instDir, QObject *parent = 0); - - /*! - * \brief Error codes returned by functions in the InstanceList class. - * NoError Indicates that no error occurred. - * UnknownError indicates that an unspecified error occurred. - */ - enum InstListError - { - NoError = 0, - UnknownError - }; - - QString instDir() const { return m_instDir; } - - /*! - * \brief Loads the instance list. - */ - InstListError loadList(); - - DEFINE_SIGLIST_SIGNALS(QSharedPointer); - SETUP_SIGLIST_SIGNALS(QSharedPointer); -protected: - QString m_instDir; -}; - -#endif // INSTANCELIST_H diff --git a/data/inst/instanceloader.cpp b/data/inst/instanceloader.cpp deleted file mode 100644 index e80a0e9e..00000000 --- a/data/inst/instanceloader.cpp +++ /dev/null @@ -1,106 +0,0 @@ -/* Copyright 2013 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "instanceloader.h" - -#include - -#include "instancetype.h" - -#include "data/inifile.h" - -#include "util/pathutils.h" - -InstanceLoader InstanceLoader::loader; - -InstanceLoader::InstanceLoader() : - QObject(NULL) -{ - -} - - -InstanceLoader::InstTypeError InstanceLoader::registerInstanceType(InstanceType *type) -{ - // Check to see if the type ID exists. - if (m_typeMap.contains(type->typeID())) - return TypeIDExists; - - // Set the parent to this. - type->setParent(this); - - // Add it to the map. - m_typeMap.insert(type->typeID(), type); - return NoError; -} - -InstanceLoader::InstTypeError InstanceLoader::createInstance(Instance *inst, - const InstanceType *type, - const QString &instDir) -{ - // Check if the type is registered. - if (!type || findType(type->typeID()) != type) - return TypeNotRegistered; - - // Create the instance. - return type->createInstance(inst, instDir); -} - -InstanceLoader::InstTypeError InstanceLoader::loadInstance(Instance *inst, - const InstanceType *type, - const QString &instDir) -{ - // Check if the type is registered. - if (!type || findType(type->typeID()) != type) - return TypeNotRegistered; - - return type->loadInstance(inst, instDir); -} - -InstanceLoader::InstTypeError InstanceLoader::loadInstance(Instance *inst, - const QString &instDir) -{ - QFileInfo instConfig(PathCombine(instDir, "instance.cfg")); - - if (!instConfig.exists()) - return NotAnInstance; - - INIFile ini; - ini.loadFile(instConfig.path()); - QString typeName = ini.get("type", "StdInstance").toString(); - const InstanceType *type = findType(typeName); - - return loadInstance(inst, type, instDir); -} - -const InstanceType *InstanceLoader::findType(const QString &id) -{ - if (!m_typeMap.contains(id)) - return NULL; - else - return m_typeMap[id]; -} - -InstTypeList InstanceLoader::typeList() -{ - InstTypeList typeList; - - for (auto iter = m_typeMap.begin(); iter != m_typeMap.end(); iter++) - { - typeList.append(*iter); - } - - return typeList; -} diff --git a/data/inst/instanceloader.h b/data/inst/instanceloader.h deleted file mode 100644 index 60c4e998..00000000 --- a/data/inst/instanceloader.h +++ /dev/null @@ -1,133 +0,0 @@ -/* Copyright 2013 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef INSTANCELOADER_H -#define INSTANCELOADER_H - -#include -#include -#include - -class InstanceType; -class Instance; - -typedef QList InstTypeList; - -/*! - * \brief The InstanceLoader is a singleton that manages all of the instance types and handles loading and creating instances. - * Instance types are registered with the instance loader through its registerInstType() function. - * Creating instances is done through the InstanceLoader's createInstance() function. This function takes - */ -class InstanceLoader : public QObject -{ - Q_OBJECT -public: - static InstanceLoader loader; - - /*! - * \brief Error codes returned by functions in the InstanceLoader and InstanceType classes. - * - * - NoError indicates that no error occurred. - * - OtherError indicates that an unspecified error occurred. - * - TypeIDExists is returned by registerInstanceType() if the ID of the type being registered already exists. - * - TypeNotRegistered is returned by createInstance() and loadInstance() when the given type is not registered. - * - InstExists is returned by createInstance() if the given instance directory is already an instance. - * - NotAnInstance is returned by loadInstance() if the given instance directory is not a valid instance. - * - WrongInstType is returned by loadInstance() if the given instance directory's type doesn't match the given type. - */ - enum InstTypeError - { - NoError = 0, - OtherError, - - TypeIDExists, - - TypeNotRegistered, - InstExists, - NotAnInstance, - WrongInstType - }; - - /*! - * \brief Registers the given InstanceType with the instance loader. - * This causes the instance loader to take ownership of the given - * instance type (meaning the instance type's parent will be set to - * the instance loader). - * - * \param type The InstanceType to register. - * \return An InstTypeError error code. - * - TypeIDExists if the given type's is already registered to another instance type. - */ - InstTypeError registerInstanceType(InstanceType *type); - - /*! - * \brief Creates an instance with the given type and stores it in inst. - * - * \param inst Pointer to store the created instance in. - * \param type The type of instance to create. - * \param instDir The instance's directory. - * \return An InstTypeError error code. - * - TypeNotRegistered if the given type is not registered with the InstanceLoader. - * - InstExists if the given instance directory is already an instance. - */ - InstTypeError createInstance(Instance *inst, const InstanceType *type, const QString &instDir); - - /*! - * \brief Loads an instance from the given directory. - * - * \param inst Pointer to store the loaded instance in. - * \param type The type of instance to load. - * \param instDir The instance's directory. - * \return An InstTypeError error code. - * - TypeNotRegistered if the given type is not registered with the InstanceLoader. - * - NotAnInstance if the given instance directory isn't a valid instance. - * - WrongInstType if the given instance directory's type isn't the same as the given type. - */ - InstTypeError loadInstance(Instance *inst, const InstanceType *type, const QString &instDir); - - /*! - * \brief Loads an instance from the given directory. - * Checks the instance's INI file to figure out what the instance's type is first. - * \param inst Pointer to store the loaded instance in. - * \param instDir The instance's directory. - * \return An InstTypeError error code. - * - TypeNotRegistered if the instance's type is not registered with the InstanceLoader. - * - NotAnInstance if the given instance directory isn't a valid instance. - */ - InstTypeError loadInstance(Instance *inst, const QString &instDir); - - /*! - * \brief Finds an instance type with the given ID. - * If one cannot be found, returns NULL. - * - * \param id The ID of the type to find. - * \return The type with the given ID. NULL if none were found. - */ - const InstanceType *findType(const QString &id); - - /*! - * \brief Gets a list of the registered instance types. - * - * \return A list of instance types. - */ - InstTypeList typeList(); - -private: - InstanceLoader(); - - QMap m_typeMap; -}; - -#endif // INSTANCELOADER_H diff --git a/data/inst/instancetype.cpp b/data/inst/instancetype.cpp deleted file mode 100644 index 4f27542d..00000000 --- a/data/inst/instancetype.cpp +++ /dev/null @@ -1,21 +0,0 @@ -/* Copyright 2013 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "instancetype.h" - -InstanceType::InstanceType(QObject *parent) : - QObject(parent) -{ -} diff --git a/data/inst/instancetype.h b/data/inst/instancetype.h deleted file mode 100644 index bd22a17c..00000000 --- a/data/inst/instancetype.h +++ /dev/null @@ -1,83 +0,0 @@ -/* Copyright 2013 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef INSTANCETYPE_H -#define INSTANCETYPE_H - -#include - -#include "instanceloader.h" - -/*! - * \brief The InstanceType class is a base class for all instance types. - * It handles loading and creating instances of a certain type. There should be - * one of these for each type of instance and they should be registered with the - * InstanceLoader. - * To create an instance, the InstanceLoader calls the type's createInstance() - * function. Loading is done through the loadInstance() function. - */ -class InstanceType : public QObject -{ - Q_OBJECT -public: - explicit InstanceType(QObject *parent = 0); - - friend class InstanceLoader; - - /*! - * \brief Gets the ID for this instance type. - * The type ID should be unique as it is used to identify the type - * of instances when they are loaded. - * Changing this value at runtime results in undefined behavior. - * \return This instance type's ID string. - */ - virtual QString typeID() const = 0; - - /*! - * \brief Gets the name of this instance type as it is displayed to the user. - * \return The instance type's display name. - */ - virtual QString displayName() const = 0; - - /*! - * \brief Gets a longer, more detailed description of this instance type. - * \return The instance type's description. - */ - virtual QString description() const = 0; - -protected: - /*! - * \brief Creates an instance and stores it in inst. - * \param inst Pointer to store the created instance in. - * \param instDir The instance's directory. - * \return An InstTypeError error code. - * TypeNotRegistered if the given type is not registered with the InstanceLoader. - * InstExists if the given instance directory is already an instance. - */ - virtual InstanceLoader::InstTypeError createInstance(Instance *inst, const QString &instDir) const = 0; - - /*! - * \brief Loads an instance from the given directory. - * \param inst Pointer to store the loaded instance in. - * \param instDir The instance's directory. - * \return An InstTypeError error code. - * TypeNotRegistered if the given type is not registered with the InstanceLoader. - * NotAnInstance if the given instance directory isn't a valid instance. - * WrongInstType if the given instance directory's type isn't an instance of this type. - */ - virtual InstanceLoader::InstTypeError loadInstance(Instance *inst, const QString &instDir) const = 0; -}; - -#endif // INSTANCETYPE_H diff --git a/data/plugin/instancetypeplugin.h b/data/plugin/instancetypeplugin.h deleted file mode 100644 index 8e3febdb..00000000 --- a/data/plugin/instancetypeplugin.h +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright 2013 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef INSTANCETYPEPLUGIN_H -#define INSTANCETYPEPLUGIN_H - -#include - -#include "data/inst/instancetype.h" - -/*! - * \brief Interface for plugins that want to provide custom instance types. - */ -class InstanceTypePlugin -{ -public: - /*! - * \brief Gets a QList containing the instance types that this plugin provides. - * These instance types are then registered with the InstanceLoader. - * The InstanceType objects should \e not be deleted by the plugin. Once they - * are registered, they belong to the InstanceLoader. - * \return A QList containing this plugin's instance types. - */ - virtual QList getInstanceTypes() = 0; -}; - -Q_DECLARE_INTERFACE(InstanceTypePlugin, "net.forkk.MultiMC.InstanceTypePlugin/0.1") - -#endif // INSTANCETYPEPLUGIN_H diff --git a/data/plugin/pluginmanager.cpp b/data/plugin/pluginmanager.cpp index cd33b285..2f066293 100644 --- a/data/plugin/pluginmanager.cpp +++ b/data/plugin/pluginmanager.cpp @@ -18,10 +18,17 @@ #include #include #include +#include + +#include #include -#include "data/plugin/instancetypeplugin.h" +#include "instancetypeinterface.h" + +// MultiMC's API version. This must match the "api" field in each plugin's +// metadata or MultiMC won't consider them valid MultiMC plugin. +#define MMC_API_VERSION "MultiMC5-API-1" PluginManager PluginManager::manager; @@ -33,8 +40,16 @@ PluginManager::PluginManager() : bool PluginManager::loadPlugins(QString pluginDir) { + // Delete the loaded plugins and clear the list. + for (int i = 0; i < m_plugins.count(); i++) + { + delete m_plugins[i]; + } m_plugins.clear(); + qDebug(QString("Loading plugins from directory: %1"). + arg(pluginDir).toUtf8()); + QDir dir(pluginDir); QDirIterator iter(dir); @@ -44,53 +59,47 @@ bool PluginManager::loadPlugins(QString pluginDir) if (pluginFile.exists() && pluginFile.isFile()) { - QPluginLoader pluginLoader(pluginFile.absoluteFilePath()); - pluginLoader.load(); - QObject *plugin = pluginLoader.instance(); - if (plugin) - { - qDebug(QString("Loaded plugin %1."). - arg(pluginFile.baseName()).toUtf8()); - m_plugins.push_back(plugin); - } - else + qDebug(QString("Attempting to load plugin: %1"). + arg(pluginFile.canonicalFilePath()).toUtf8()); + + QPluginLoader *pluginLoader = new QPluginLoader(pluginFile.absoluteFilePath()); + + QJsonObject pluginInfo = pluginLoader->metaData(); + QJsonObject pluginMetadata = pluginInfo.value("MetaData").toObject(); + + if (pluginMetadata.value("api").toString("") != MMC_API_VERSION) { - qWarning(QString("Error loading plugin %1. Not a valid plugin."). - arg(pluginFile.baseName()).toUtf8()); + // If "api" is not specified, it's not a MultiMC plugin. + qDebug(QString("Not loading plugin %1. Not a valid MultiMC plugin. " + "API: %2"). + arg(pluginFile.canonicalFilePath(), pluginMetadata.value("api").toString("")).toUtf8()); + continue; } + + qDebug(QString("Loaded plugin: %1"). + arg(pluginInfo.value("IID").toString()).toUtf8()); + m_plugins.push_back(pluginLoader); } } return true; } -bool PluginManager::initInstanceTypes() +QPluginLoader *PluginManager::getPlugin(int index) +{ + return m_plugins[index]; +} + +void PluginManager::initInstanceTypes() { for (int i = 0; i < m_plugins.count(); i++) { - InstanceTypePlugin *plugin = qobject_cast(m_plugins[i]); - if (plugin) + InstanceTypeInterface *instType = qobject_cast(m_plugins[i]->instance()); + + if (instType) { - QList instanceTypes = plugin->getInstanceTypes(); - - for (int i = 0; i < instanceTypes.count(); i++) - { - InstanceLoader::InstTypeError error = - InstanceLoader::loader.registerInstanceType(instanceTypes[i]); - switch (error) - { - case InstanceLoader::TypeIDExists: - qWarning(QString("Instance type %1 already registered."). - arg(instanceTypes[i]->typeID()).toUtf8()); - } - } + // TODO: Handle errors + InstanceLoader::get().registerInstanceType(instType); } } - - return true; -} - -QObject *PluginManager::getPlugin(int index) -{ - return m_plugins[index]; } diff --git a/data/plugin/pluginmanager.h b/data/plugin/pluginmanager.h index 8e2dba0d..b93fd6d2 100644 --- a/data/plugin/pluginmanager.h +++ b/data/plugin/pluginmanager.h @@ -41,12 +41,6 @@ public: */ bool loadPlugins(QString pluginDir); - /*! - * \brief Initializes the instance type plugins. - * \return True if successful. False on failure. - */ - bool initInstanceTypes(); - /*! * \brief Checks how many plugins are loaded. * \return The number of plugins. @@ -58,12 +52,19 @@ public: * \param index The index of the plugin to get. * \return The plugin at the given index. */ - QObject *getPlugin(int index); + QPluginLoader *getPlugin(int index); + + /*! + * \brief Initializes and registers all the instance types. + * This is done by going through the plugin list and registering all of the + * plugins that derive from the InstanceTypeInterface with the InstanceLoader. + */ + void initInstanceTypes(); private: PluginManager(); - QList m_plugins; + QList m_plugins; static PluginManager manager; }; diff --git a/data/siglist.h b/data/siglist.h deleted file mode 100644 index b6432b6e..00000000 --- a/data/siglist.h +++ /dev/null @@ -1,130 +0,0 @@ -/* Copyright 2013 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef SIGLIST_H -#define SIGLIST_H - -#include -#include - -// A QList that allows emitting signals when the list changes. -// Since QObject doesn't support templates, to use this class with a -// certain type, you should create a class deriving from SigList and then -// call the DEFINE_SIGLIST_SIGNALS(T) and SETUP_SIGLIST_SIGNALS(T) macros. -template -class SigList : public QList -{ - -public: - explicit SigList() : QList() {} - - virtual void append(const T &value); - virtual void append(const QList &other); - - virtual void clear(); - - virtual void erase(iterator pos); - virtual void erase(iterator first, iterator last); - - virtual void insert(int i, const T &t); - virtual void insert(iterator before, const T &t); - - virtual void move(int from, int to); - - virtual void pop_back() { takeLast(); } - virtual void pop_front() { takeFirst(); } - - virtual void push_back(const T &t) { append(t); } - virtual void push_front(const T &t) { prepend(t); } - - virtual void prepend(const T &t); - - virtual int removeAll(const T &t); - virtual bool removeOne(const T &t); - - virtual void removeAt(int i) { takeAt(i); } - virtual void removeFirst() { takeFirst(); } - virtual void removeLast() { takeLast(); } - - virtual void swap(QList &other); - virtual void swap(int i, int j); - - virtual T takeAt(int i); - virtual T takeFirst(); - virtual T takeLast(); - - virtual QList &operator +=(const QList &other) { append(other); return *this; } - virtual QList &operator +=(const T &value) { append(value); return *this; } - virtual QList &operator <<(const QList &other) { append(other); return *this; } - virtual QList &operator <<(const T &value) { append(value); return *this; } - - virtual QList &operator =(const QList &other); - - - // Signal emitted after an item is added to the list. - // Contains a reference to item and the item's new index. - virtual void onItemAdded(const T &item, int index) = 0; - - // Signal emitted after multiple items are added to the list at once. - // The items parameter is a const reference to a QList of the items that - // were added. - // The firstIndex parameter is the new index of the first item added. - virtual void onItemsAdded(const QList &items, int firstIndex) = 0; - - // Signal emitted after an item is removed to the list. - // Contains a reference to the item and the item's old index. - virtual void onItemRemoved(const T &item, int index) = 0; - - // Signal emitted after multiple items are removed from the list at once. - // The items parameter is a const reference to a QList of the items that - // were added. - // The firstIndex parameter is the new index of the first item added. - virtual void onItemsRemoved(const QList &items, int firstIndex) = 0; - - // Signal emitted after an item is moved to another index. - // Contains the item, the old index, and the new index. - virtual void onItemMoved(const T &item, int oldIndex, int newIndex) = 0; - - // Signal emitted after an operation that changes the whole list occurs. - // This signal should be treated as if all data in the entire list was cleared - // and new data added in its place. - virtual void onInvalidated() = 0; -}; - -// Defines the signals for a SigList -#define DEFINE_SIGLIST_SIGNALS(TYPE) \ - Q_SIGNAL void itemAdded(TYPE const &item, int index);\ - Q_SIGNAL void itemsAdded(const QList &items, int firstIndex);\ - Q_SIGNAL void itemRemoved(TYPE const &item, int index);\ - Q_SIGNAL void itemsRemoved(const QList &items, int firstIndex);\ - Q_SIGNAL void itemMoved(TYPE const &item, int oldIndex, int newIndex);\ - Q_SIGNAL void invalidated(); - -// Overrides the onItem* functions and causes them to emit their corresponding -// signals. -#define SETUP_SIGLIST_SIGNALS(TYPE) \ - virtual void onItemAdded(TYPE const &item, int index)\ - { emit itemAdded(item, index); }\ - virtual void onItemsAdded(const QList &items, int firstIndex)\ - { emit itemsAdded(items, firstIndex); }\ - virtual void onItemRemoved(TYPE const &item, int index)\ - { emit itemRemoved(item, index); }\ - virtual void onItemsRemoved(const QList &items, int firstIndex)\ - { emit itemsRemoved(items, firstIndex); }\ - virtual void onItemMoved(TYPE const &item, int oldIndex, int newIndex)\ - { emit itemMoved(item, oldIndex, newIndex); }\ - virtual void onInvalidated() { emit invalidated(); } - -#endif // SIGLIST_H diff --git a/data/siglist_impl.h b/data/siglist_impl.h deleted file mode 100644 index 16ddd9b0..00000000 --- a/data/siglist_impl.h +++ /dev/null @@ -1,156 +0,0 @@ -/* Copyright 2013 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "siglist.h" - -template -void SigList::append(const T &value) -{ - QList::append(value); - onItemAdded(value, length() - 1); -} - -template -void SigList::prepend(const T &value) -{ - QList::prepend(value); - onItemAdded(value, 0); -} - -template -void SigList::append(const QList &other) -{ - int index = length(); - QList::append(other); - onItemsAdded(other, index); -} - -template -void SigList::clear() -{ - QList::clear(); - onInvalidated(); -} - -template -void SigList::erase(QList::iterator pos) -{ - T value = *pos; - int index = indexOf(*pos); - QList::erase(pos); - onItemRemoved(value, index); -} - -template -void SigList::erase(QList::iterator first, QList::iterator last) -{ - QList removedValues; - int firstIndex = indexOf(*first); - - for (QList::iterator iter = first; iter < last; iter++) - { - removedValues << *iter; - QList::erase(iter); - } - - onItemsRemoved(removedValues, firstIndex); -} - -template -void SigList::insert(int i, const T &t) -{ - QList::insert(i, t); - onItemAdded(t, i); -} - -template -void SigList::insert(QList::iterator before, const T &t) -{ - QList::insert(before, t); - onItemAdded(t, indexOf(t)); -} - -template -void SigList::move(int from, int to) -{ - const T &item = at(from); - QList::move(from, to); - onItemMoved(item, from, to); -} - -template -int SigList::removeAll(const T &t) -{ - int retVal = QList::removeAll(t); - onInvalidated(); - return retVal; -} - -template -bool SigList::removeOne(const T &t) -{ - int index = indexOf(t); - if (QList::removeOne(t)) - { - onItemRemoved(t, index); - return true; - } - return false; -} - -template -void SigList::swap(QList &other) -{ - QList::swap(other); - onInvalidated(); -} - -template -void SigList::swap(int i, int j) -{ - const T &item1 = at(i); - const T &item2 = at(j); - QList::swap(i, j); - onItemMoved(item1, i, j); - onItemMoved(item2, j, i); -} - -template -T SigList::takeAt(int i) -{ - T val = QList::takeAt(i); - onItemRemoved(val, i); - return val; -} - -template -T SigList::takeFirst() -{ - return takeAt(0); -} - -template -T SigList::takeLast() -{ - return takeAt(length() - 1); -} - -template -QList &SigList::operator =(const QList &other) -{ - QList::operator =(other); - onInvalidated(); - return *this; -} diff --git a/data/version/instversion.cpp b/data/version/instversion.cpp deleted file mode 100644 index 1493153a..00000000 --- a/data/version/instversion.cpp +++ /dev/null @@ -1,32 +0,0 @@ -/* Copyright 2013 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "instversion.h" -#include "instversionlist.h" - -InstVersion::InstVersion(InstVersionList *parent) : - QObject(parent) -{ - -} - -InstVersionList *InstVersion::versionList() const -{ - // Parent should *always* be an InstVersionList - if (!parent() || !parent()->inherits("InstVersionList")) - return NULL; - else - return (InstVersionList *)parent(); -} diff --git a/data/version/instversion.h b/data/version/instversion.h deleted file mode 100644 index 361563fd..00000000 --- a/data/version/instversion.h +++ /dev/null @@ -1,51 +0,0 @@ -/* Copyright 2013 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef INSTVERSION_H -#define INSTVERSION_H - -#include - -class InstVersionList; - -class InstVersion : public QObject -{ - Q_OBJECT -public: - // Constructs a new InstVersion with the given parent. The parent *must* - // be the InstVersionList that contains this InstVersion. The InstVersion - // should be added to the list immediately after being created as any calls - // to id() will likely fail unless the InstVersion is in a list. - explicit InstVersion(InstVersionList *parent = 0); - - // Returns this InstVersion's ID. This is usually just the InstVersion's index - // within its InstVersionList, but not always. - // If this InstVersion is not in an InstVersionList, returns -1. - virtual int id() const = 0; - - // Returns this InstVersion's name. This is displayed to the user in the GUI - // and is usually just the version number ("1.4.7"), for example. - virtual QString name() const = 0; - - // Returns this InstVersion's name. This is usually displayed to the user - // in the GUI and specifies what kind of version this is. For example: it - // could be "Snapshot", "Latest Version", "MCNostalgia", etc. - virtual QString type() const = 0; - - // Returns the version list that this InstVersion is a part of. - virtual InstVersionList *versionList() const; -}; - -#endif // INSTVERSION_H diff --git a/data/version/instversionlist.cpp b/data/version/instversionlist.cpp deleted file mode 100644 index ab57f94c..00000000 --- a/data/version/instversionlist.cpp +++ /dev/null @@ -1,21 +0,0 @@ -/* Copyright 2013 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "instversionlist.h" - -InstVersionList::InstVersionList() : - QObject(NULL) -{ -} diff --git a/data/version/instversionlist.h b/data/version/instversionlist.h deleted file mode 100644 index f79bc1b0..00000000 --- a/data/version/instversionlist.h +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright 2013 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef INSTVERSIONLIST_H -#define INSTVERSIONLIST_H - -#include - -class InstVersion; - -// Class that each instance type's version list derives from. Version lists are -// the lists that keep track of the available game versions for that instance. -// This list will not be loaded on startup. It will be loaded when the list's -// load function is called. -class InstVersionList : public QObject -{ - Q_OBJECT -public: - explicit InstVersionList(); - - // Reloads the version list. - virtual void loadVersionList() = 0; - - // Gets the version at the given index. - virtual const InstVersion *at(int i) const = 0; - - // Returns the number of versions in the list. - virtual int count() const = 0; -}; - -#endif // INSTVERSIONLIST_H diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index d19d69dc..19ff2108 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -21,20 +21,25 @@ #include #include +#include -#include "util/osutils.h" +#include "osutils.h" #include "gui/settingsdialog.h" #include "gui/newinstancedialog.h" #include "gui/logindialog.h" #include "gui/taskdialog.h" -#include "data/inst/instancelist.h" -#include "data/appsettings.h" +#include "instancelist.h" +#include "appsettings.h" #include "data/version.h" #include "tasks/logintask.h" +// Opens the given file in the default application. +// TODO: Move this somewhere. +void openInDefaultProgram(QString filename); + MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow), @@ -156,3 +161,8 @@ void MainWindow::onLoginComplete(LoginResponse response) QString("Logged in as %1 with session ID %2."). arg(response.getUsername(), response.getSessionID())); } + +void openInDefaultProgram(QString filename) +{ + QDesktopServices::openUrl("file:///" + QFileInfo(filename).absolutePath()); +} diff --git a/gui/mainwindow.h b/gui/mainwindow.h index d286bd0e..591d0632 100644 --- a/gui/mainwindow.h +++ b/gui/mainwindow.h @@ -18,7 +18,7 @@ #include -#include "data/inst/instancelist.h" +#include "instancelist.h" #include "data/loginresponse.h" namespace Ui diff --git a/gui/settingsdialog.cpp b/gui/settingsdialog.cpp index ab4d18ee..b3c42380 100644 --- a/gui/settingsdialog.cpp +++ b/gui/settingsdialog.cpp @@ -16,7 +16,7 @@ #include "settingsdialog.h" #include "ui_settingsdialog.h" -#include "data/appsettings.h" +#include "appsettings.h" #include #include diff --git a/libinstance/CMakeLists.txt b/libinstance/CMakeLists.txt index 503bda75..d0a9aa08 100644 --- a/libinstance/CMakeLists.txt +++ b/libinstance/CMakeLists.txt @@ -1,31 +1,47 @@ -project(stdinstance) +project(libmmcinst) -ADD_DEFINITIONS(-DQT_PLUGIN) +set(CMAKE_AUTOMOC ON) # Find Qt find_package(Qt5Core REQUIRED) -find_package(Qt5Network REQUIRED) # Include Qt headers. include_directories(${Qt5Base_INCLUDE_DIRS}) include_directories(${Qt5Network_INCLUDE_DIRS}) -# Include MultiMC's headers. -include_directories(../../) +# Include utility library. +include_directories(${CMAKE_SOURCE_DIR}/libutil/include) -SET(STDINST_HEADERS -stdinstplugin.h -stdinstancetype.h -stdinstance.h +# Include utility library. +include_directories(${CMAKE_SOURCE_DIR}/libsettings/include) + +SET(LIBINST_HEADERS +include/libinstance_config.h + +include/instancetypeinterface.h + +include/instance.h +include/instancelist.h +include/instanceloader.h + +include/instversion.h +include/instversionlist.h ) -SET(STDINST_SOURCES -stdinstplugin.cpp -stdinstancetype.cpp -stdinstance.cpp +SET(LIBINST_SOURCES +src/instance.cpp +src/instancelist.cpp +src/instanceloader.cpp + +src/instversion.cpp +src/instversionlist.cpp ) -add_library(stdinstance SHARED ${STDINST_SOURCES} ${STDINST_HEADERS}) -set_target_properties(stdinstance PROPERTIES PREFIX "") -qt5_use_modules(stdinstance Core Network) -target_link_libraries(stdinstance quazip patchlib) +# Set the include dir path. +SET(LIBMMCINST_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include" PARENT_SCOPE) + +add_definitions(-DLIBMMCINST_LIBRARY) + +add_library(libmmcinst SHARED ${LIBINST_SOURCES} ${LIBINST_HEADERS}) +qt5_use_modules(libmmcinst Core) +target_link_libraries(libmmcinst libmmcutil libmmcsettings) diff --git a/libinstance/include/instance.h b/libinstance/include/instance.h new file mode 100644 index 00000000..7b3c001d --- /dev/null +++ b/libinstance/include/instance.h @@ -0,0 +1,342 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef INSTANCE_H +#define INSTANCE_H + +#include +#include + +#include "appsettings.h" +#include "inifile.h" + +#include "libinstance_config.h" + +#define DEFINE_OVERRIDDEN_SETTING_ADVANCED(funcName, cfgEntryName, typeName) \ + typeName get ## funcName() const { return getField(cfgEntryName, settings->get ## funcName()).value(); } + +#define DEFINE_OVERRIDDEN_SETTING(funcName, typeName) \ + DEFINE_OVERRIDDEN_SETTING_ADVANCED(funcName, STR_VAL(funcName), typeName) + +class InstanceList; + +/*! + * \brief Base class for instances. + * This class implements many functions that are common between instances and + * provides a standard interface for all instances. + * + * To create a new instance type, create a new class inheriting from this class + * and implement the pure virtual functions. + */ +class LIBMMCINST_EXPORT Instance : public SettingsBase +{ + Q_OBJECT +public: + explicit Instance(const QString &rootDir, QObject *parent = 0); + + // Please, for the sake of my (and everyone else's) sanity, at least keep this shit + // *somewhat* organized. Also, documentation is semi-important here. Please don't + // leave undocumented stuff behind. + + + //////// STUFF //////// + + /*! + * \brief Get the instance's ID. + * This is a unique identifier string that is, by default, set to the + * instance's folder name. It's not always the instance's folder name, + * however, as any class deriving from Instance can override the id() + * method and change how the ID is determined. The instance's ID + * should always remain constant. Undefined behavior results if an + * already loaded instance's ID changes. + * + * \return The instance's ID. + */ + virtual QString id() const; + + /*! + * \brief Gets the path to the instance's root directory. + * \return The path to the instance's root directory. + */ + virtual QString rootDir() const; + + /*! + * \brief Gets the instance list that this instance is a part of. + * Returns NULL if this instance is not in a list + * (the parent is not an InstanceList). + * \return A pointer to the InstanceList containing this instance. + */ + virtual InstanceList *instList() const; + + + //////// FIELDS AND SETTINGS //////// + // Fields are options stored in the instance's config file that are specific + // to instances (not a part of SettingsBase). Settings are things overridden + // from SettingsBase. + + + ////// Fields ////// + + //// General Info //// + + /*! + * \brief Gets this instance's name. + * This is the name that will be displayed to the user. + * \return The instance's name. + * \sa setName + */ + virtual QString name() { return getField("name", "Unnamed Instance").value(); } + + /*! + * \brief Sets the instance's name + * \param val The instance's new name. + */ + virtual void setName(QString val) { setField("name", val); } + + /*! + * \brief Gets the instance's icon key. + * \return The instance's icon key. + * \sa setIconKey() + */ + virtual QString iconKey() const { return getField("iconKey", "default").value(); } + + /*! + * \brief Sets the instance's icon key. + * \param val The new icon key. + */ + virtual void setIconKey(QString val) { setField("iconKey", val); } + + + /*! + * \brief Gets the instance's notes. + * \return The instances notes. + */ + virtual QString notes() const { return getField("notes", "").value(); } + + /*! + * \brief Sets the instance's notes. + * \param val The instance's new notes. + */ + virtual void setNotes(QString val) { setField("notes", val); } + + + /*! + * \brief Checks if the instance's minecraft.jar needs to be rebuilt. + * If this is true, the instance's mods will be reinstalled to its + * minecraft.jar file. This value is automatically set to true when + * the jar mod list changes. + * \return Whether or not the instance's jar file should be rebuilt. + */ + virtual bool shouldRebuild() const { return getField("NeedsRebuild", false).value(); } + + /*! + * \brief Sets whether or not the instance's minecraft.jar needs to be rebuilt. + * \param val Whether the instance's minecraft needs to be rebuilt or not. + */ + virtual void setShouldRebuild(bool val) { setField("NeedsRebuild", val); } + + + //// Version Stuff //// + + /*! + * \brief Sets the instance's current version. + * This value represents the instance's current version. If this value + * is different from intendedVersion(), the instance should be updated. + * This value is updated by the updateCurrentVersion() function. + * \return A string representing the instance's current version. + */ + virtual QString currentVersion() { return getField("JarVersion", "Unknown").value(); } + + /*! + * \brief Sets the instance's current version. + * This is used to keep track of the instance's current version. Don't + * mess with this unless you know what you're doing. + * \param val The new value. + */ + virtual void setCurrentVersion(QString val) { setField("JarVersion", val); } + + + /*! + * \brief Gets the version of LWJGL that this instance should use. + * If no LWJGL version is specified in the instance's config file, + * defaults to "Mojang" + * \return The instance's LWJGL version. + */ + virtual QString lwjglVersion() { return getField("LwjglVersion", "Mojang").value(); } + + /*! + * \brief Sets the version of LWJGL that this instance should use. + * \param val The LWJGL version to use + */ + virtual void setLWJGLVersion(QString val) { setField("LwjglVersion", val); } + + + /*! + * \brief Gets the version that this instance should try to update to. + * If this value differs from currentVersion(), the instance will + * download the intended version when it launches. + * \return The instance's intended version. + */ + virtual QString intendedVersion() { return getField("IntendedJarVersion", currentVersion()).value(); } + + /*! + * \brief Sets the version that this instance should try to update to. + * \param val The instance's new intended version. + */ + virtual void setIntendedVersion(QString val) { setField("IntendedJarVersion", val); } + + + + //// Timestamps //// + + /*! + * \brief Gets the time that the instance was last launched. + * Measured in milliseconds since epoch. QDateTime::currentMSecsSinceEpoch() + * \return The time that the instance was last launched. + */ + virtual qint64 lastLaunch() { return getField("lastLaunchTime", 0).value(); } + + /*! + * \brief Sets the time that the instance was last launched. + * \param val The time to set. Defaults to QDateTime::currentMSecsSinceEpoch() + */ + virtual void setLastLaunch(qint64 val = QDateTime::currentMSecsSinceEpoch()) + { setField("lastLaunchTime", val); } + + + ////// Directories ////// + //! Gets the path to the instance's minecraft folder. + QString minecraftDir() const; + + /*! + * \brief Gets the path to the instance's instance mods folder. + * This is the folder where the jar mods are kept. + */ + QString instModsDir() const; + + //! Gets the path to the instance's bin folder. + QString binDir() const; + + //! Gets the path to the instance's saves folder. + QString savesDir() const; + + //! Gets the path to the instance's mods folder. (.minecraft/mods) + QString mlModsDir() const; + + //! Gets the path to the instance's coremods folder. + QString coreModsDir() const; + + //! Gets the path to the instance's resources folder. + QString resourceDir() const; + + //! Gets the path to the instance's screenshots folder. + QString screenshotsDir() const; + + //! Gets the path to the instance's texture packs folder. + QString texturePacksDir() const; + + + ////// Files ////// + //! Gets the path to the instance's minecraft.jar + QString mcJar() const; + + //! Gets the path to the instance's mcbackup.jar. + QString mcBackup() const; + + //! Gets the path to the instance's config file. + QString configFile() const; + + //! Gets the path to the instance's modlist file. + QString modListFile() const; + + ////// Settings ////// + + //// Java Settings //// + DEFINE_OVERRIDDEN_SETTING_ADVANCED(JavaPath, JPATHKEY, QString) + DEFINE_OVERRIDDEN_SETTING(JvmArgs, QString) + + //// Custom Commands //// + DEFINE_OVERRIDDEN_SETTING(PreLaunchCommand, QString) + DEFINE_OVERRIDDEN_SETTING(PostExitCommand, QString) + + //// Memory //// + DEFINE_OVERRIDDEN_SETTING(MinMemAlloc, int) + DEFINE_OVERRIDDEN_SETTING(MaxMemAlloc, int) + + //// Auto login //// + DEFINE_OVERRIDDEN_SETTING(AutoLogin, bool) + + // This little guy here is to keep Qt Creator from being a dumbass and + // auto-indenting the lines below the macros. Seriously, it's really annoying. + ; + + + //////// OTHER FUNCTIONS //////// + + //// Version System //// + + /*! + * \brief Checks whether or not the currentVersion of the instance needs to be updated. + * If this returns true, updateCurrentVersion is called. In the + * standard instance, this is determined by checking a timestamp + * stored in the instance config file against the last modified time of Minecraft.jar. + * \return True if updateCurrentVersion() should be called. + */ + virtual bool shouldUpdateCurrentVersion() = 0; + + /*! + * \brief Updates the current version. + * This function should first set the current version timestamp + * (setCurrentVersionTimestamp()) to the current time. Next, if + * keepCurrent is false, this function should check what the + * instance's current version is and call setCurrentVersion() to + * update it. This function will automatically be called when the + * instance is loaded if shouldUpdateCurrentVersion returns true. + * \param keepCurrent If true, only the version timestamp will be updated. + */ + virtual void updateCurrentVersion(bool keepCurrent = false) = 0; + +protected: + /*! + * \brief Gets the value of the given field in the instance's config file. + * If the value isn't in the config file, defVal is returned instead. + * \param name The name of the field in the config file. + * \param defVal The default value. + * \return The value of the given field or defVal if the field doesn't exist. + * \sa setField() + */ + virtual QVariant getField(const QString &name, QVariant defVal = QVariant()) const; + + /*! + * \brief Sets the value of the given field in the config file. + * \param name The name of the field in the config file. + * \param val The value to set the field to. + * \sa getField() + */ + virtual void setField(const QString &name, QVariant val); + + // Overrides for SettingBase stuff. + virtual QVariant getValue(const QString &name, QVariant defVal = QVariant()) const + { return settings->getValue(name, defVal); } + virtual void setValue(const QString &name, QVariant val) + { setField(name, val); } + + INIFile config; + +private: + QString m_rootDir; +}; + +#endif // INSTANCE_H diff --git a/libinstance/include/instancelist.h b/libinstance/include/instancelist.h new file mode 100644 index 00000000..f6be815c --- /dev/null +++ b/libinstance/include/instancelist.h @@ -0,0 +1,59 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef INSTANCELIST_H +#define INSTANCELIST_H + +#include + +#include + +#include "siglist.h" + +#include "libinstance_config.h" + +class Instance; + +class LIBMMCINST_EXPORT InstanceList : public QObject, public SigList> +{ + Q_OBJECT +public: + explicit InstanceList(const QString &instDir, QObject *parent = 0); + + /*! + * \brief Error codes returned by functions in the InstanceList class. + * NoError Indicates that no error occurred. + * UnknownError indicates that an unspecified error occurred. + */ + enum InstListError + { + NoError = 0, + UnknownError + }; + + QString instDir() const { return m_instDir; } + + /*! + * \brief Loads the instance list. + */ + InstListError loadList(); + + DEFINE_SIGLIST_SIGNALS(QSharedPointer); + SETUP_SIGLIST_SIGNALS(QSharedPointer); +protected: + QString m_instDir; +}; + +#endif // INSTANCELIST_H diff --git a/libinstance/include/instanceloader.h b/libinstance/include/instanceloader.h new file mode 100644 index 00000000..39696639 --- /dev/null +++ b/libinstance/include/instanceloader.h @@ -0,0 +1,137 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef INSTANCELOADER_H +#define INSTANCELOADER_H + +#include +#include +#include + +#include "libinstance_config.h" + +class InstanceTypeInterface; +class Instance; + +typedef QList InstTypeList; + +/*! + * \brief The InstanceLoader is a singleton that manages all of the instance types and handles loading and creating instances. + * Instance types are registered with the instance loader through its registerInstType() function. + * Creating instances is done through the InstanceLoader's createInstance() function. This function takes + */ +class LIBMMCINST_EXPORT InstanceLoader : public QObject +{ + Q_OBJECT +public: + /*! + * \brief Gets a reference to the instance loader. + */ + static InstanceLoader &get() { return loader; } + + /*! + * \brief Error codes returned by functions in the InstanceLoader and InstanceType classes. + * + * - NoError indicates that no error occurred. + * - OtherError indicates that an unspecified error occurred. + * - TypeIDExists is returned by registerInstanceType() if the ID of the type being registered already exists. + * - TypeNotRegistered is returned by createInstance() and loadInstance() when the given type is not registered. + * - InstExists is returned by createInstance() if the given instance directory is already an instance. + * - NotAnInstance is returned by loadInstance() if the given instance directory is not a valid instance. + * - WrongInstType is returned by loadInstance() if the given instance directory's type doesn't match the given type. + */ + enum InstTypeError + { + NoError = 0, + OtherError, + + TypeIDExists, + + TypeNotRegistered, + InstExists, + NotAnInstance, + WrongInstType + }; + + /*! + * \brief Registers the given InstanceType with the instance loader. + * + * \param type The InstanceType to register. + * \return An InstTypeError error code. + * - TypeIDExists if the given type's is already registered to another instance type. + */ + InstTypeError registerInstanceType(InstanceTypeInterface *type); + + /*! + * \brief Creates an instance with the given type and stores it in inst. + * + * \param inst Pointer to store the created instance in. + * \param type The type of instance to create. + * \param instDir The instance's directory. + * \return An InstTypeError error code. + * - TypeNotRegistered if the given type is not registered with the InstanceLoader. + * - InstExists if the given instance directory is already an instance. + */ + InstTypeError createInstance(Instance *inst, const InstanceTypeInterface *type, const QString &instDir); + + /*! + * \brief Loads an instance from the given directory. + * + * \param inst Pointer to store the loaded instance in. + * \param type The type of instance to load. + * \param instDir The instance's directory. + * \return An InstTypeError error code. + * - TypeNotRegistered if the given type is not registered with the InstanceLoader. + * - NotAnInstance if the given instance directory isn't a valid instance. + * - WrongInstType if the given instance directory's type isn't the same as the given type. + */ + InstTypeError loadInstance(Instance *inst, const InstanceTypeInterface *type, const QString &instDir); + + /*! + * \brief Loads an instance from the given directory. + * Checks the instance's INI file to figure out what the instance's type is first. + * \param inst Pointer to store the loaded instance in. + * \param instDir The instance's directory. + * \return An InstTypeError error code. + * - TypeNotRegistered if the instance's type is not registered with the InstanceLoader. + * - NotAnInstance if the given instance directory isn't a valid instance. + */ + InstTypeError loadInstance(Instance *inst, const QString &instDir); + + /*! + * \brief Finds an instance type with the given ID. + * If one cannot be found, returns NULL. + * + * \param id The ID of the type to find. + * \return The type with the given ID. NULL if none were found. + */ + const InstanceTypeInterface *findType(const QString &id); + + /*! + * \brief Gets a list of the registered instance types. + * + * \return A list of instance types. + */ + InstTypeList typeList(); + +private: + InstanceLoader(); + + QMap m_typeMap; + + static InstanceLoader loader; +}; + +#endif // INSTANCELOADER_H diff --git a/libinstance/include/instancetypeinterface.h b/libinstance/include/instancetypeinterface.h new file mode 100644 index 00000000..a061b9d2 --- /dev/null +++ b/libinstance/include/instancetypeinterface.h @@ -0,0 +1,86 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef INSTANCETYPE_H +#define INSTANCETYPE_H + +#include + +#include "instanceloader.h" + +//! The InstanceTypeInterface's interface ID. +#define InstanceTypeInterface_IID "net.forkk.MultiMC.InstanceTypeInterface/0.1" + +/*! + * \brief The InstanceType class is an interface for all instance types. + * InstanceTypes are usually provided by plugins. + * It handles loading and creating instances of a certain type. There should be + * one of these for each type of instance and they should be registered with the + * InstanceLoader. + * To create an instance, the InstanceLoader calls the type's createInstance() + * function. Loading is done through the loadInstance() function. + */ +class InstanceTypeInterface +{ +public: + friend class InstanceLoader; + + /*! + * \brief Gets the ID for this instance type. + * The type ID should be unique as it is used to identify the type + * of instances when they are loaded. + * Changing this value at runtime results in undefined behavior. + * \return This instance type's ID string. + */ + virtual QString typeID() const = 0; + + /*! + * \brief Gets the name of this instance type as it is displayed to the user. + * \return The instance type's display name. + */ + virtual QString displayName() const = 0; + + /*! + * \brief Gets a longer, more detailed description of this instance type. + * \return The instance type's description. + */ + virtual QString description() const = 0; + +protected: + /*! + * \brief Creates an instance and stores it in inst. + * \param inst Pointer to store the created instance in. + * \param instDir The instance's directory. + * \return An InstTypeError error code. + * TypeNotRegistered if the given type is not registered with the InstanceLoader. + * InstExists if the given instance directory is already an instance. + */ + virtual InstanceLoader::InstTypeError createInstance(Instance *inst, const QString &instDir) const = 0; + + /*! + * \brief Loads an instance from the given directory. + * \param inst Pointer to store the loaded instance in. + * \param instDir The instance's directory. + * \return An InstTypeError error code. + * TypeNotRegistered if the given type is not registered with the InstanceLoader. + * NotAnInstance if the given instance directory isn't a valid instance. + * WrongInstType if the given instance directory's type isn't an instance of this type. + */ + virtual InstanceLoader::InstTypeError loadInstance(Instance *inst, const QString &instDir) const = 0; +}; + +Q_DECLARE_INTERFACE(InstanceTypeInterface, InstanceTypeInterface_IID) + +#endif // INSTANCETYPE_H diff --git a/libinstance/include/instversion.h b/libinstance/include/instversion.h new file mode 100644 index 00000000..c505c5a3 --- /dev/null +++ b/libinstance/include/instversion.h @@ -0,0 +1,53 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef INSTVERSION_H +#define INSTVERSION_H + +#include + +#include "libinstance_config.h" + +class InstVersionList; + +class LIBMMCINST_EXPORT InstVersion : public QObject +{ + Q_OBJECT +public: + // Constructs a new InstVersion with the given parent. The parent *must* + // be the InstVersionList that contains this InstVersion. The InstVersion + // should be added to the list immediately after being created as any calls + // to id() will likely fail unless the InstVersion is in a list. + explicit InstVersion(InstVersionList *parent = 0); + + // Returns this InstVersion's ID. This is usually just the InstVersion's index + // within its InstVersionList, but not always. + // If this InstVersion is not in an InstVersionList, returns -1. + virtual int id() const = 0; + + // Returns this InstVersion's name. This is displayed to the user in the GUI + // and is usually just the version number ("1.4.7"), for example. + virtual QString name() const = 0; + + // Returns this InstVersion's name. This is usually displayed to the user + // in the GUI and specifies what kind of version this is. For example: it + // could be "Snapshot", "Latest Version", "MCNostalgia", etc. + virtual QString type() const = 0; + + // Returns the version list that this InstVersion is a part of. + virtual InstVersionList *versionList() const; +}; + +#endif // INSTVERSION_H diff --git a/libinstance/include/instversionlist.h b/libinstance/include/instversionlist.h new file mode 100644 index 00000000..2cd9ed1e --- /dev/null +++ b/libinstance/include/instversionlist.h @@ -0,0 +1,45 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef INSTVERSIONLIST_H +#define INSTVERSIONLIST_H + +#include + +#include "libinstance_config.h" + +class InstVersion; + +// Class that each instance type's version list derives from. Version lists are +// the lists that keep track of the available game versions for that instance. +// This list will not be loaded on startup. It will be loaded when the list's +// load function is called. +class LIBMMCINST_EXPORT InstVersionList : public QObject +{ + Q_OBJECT +public: + explicit InstVersionList(); + + // Reloads the version list. + virtual void loadVersionList() = 0; + + // Gets the version at the given index. + virtual const InstVersion *at(int i) const = 0; + + // Returns the number of versions in the list. + virtual int count() const = 0; +}; + +#endif // INSTVERSIONLIST_H diff --git a/libinstance/include/libinstance_config.h b/libinstance/include/libinstance_config.h new file mode 100644 index 00000000..2e6dc884 --- /dev/null +++ b/libinstance/include/libinstance_config.h @@ -0,0 +1,27 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +//#ifndef LIBINSTANCE_CONFIG_H +//#define LIBINSTANCE_CONFIG_H + +#include + +#ifdef LIBMMCINST_LIBRARY +# define LIBMMCINST_EXPORT Q_DECL_EXPORT +#else +# define LIBMMCINST_EXPORT Q_DECL_IMPORT +#endif + +//#endif // LIBINSTANCE_CONFIG_H diff --git a/libinstance/src/instance.cpp b/libinstance/src/instance.cpp new file mode 100644 index 00000000..c79c0213 --- /dev/null +++ b/libinstance/src/instance.cpp @@ -0,0 +1,110 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "include/instance.h" + +#include + +#include "pathutils.h" + +Instance::Instance(const QString &rootDir, QObject *parent) : + SettingsBase(parent) +{ + m_rootDir = rootDir; + config.loadFile(PathCombine(rootDir, "instance.cfg")); +} + +QString Instance::id() const +{ + return QFileInfo(rootDir()).baseName(); +} + +QString Instance::rootDir() const +{ + return m_rootDir; +} + +InstanceList *Instance::instList() const +{ + if (parent()->inherits("InstanceList")) + return (InstanceList *)parent(); + else + return NULL; +} + +QString Instance::minecraftDir() const +{ + QFileInfo mcDir(PathCombine(rootDir(), "minecraft")); + QFileInfo dotMCDir(PathCombine(rootDir(), ".minecraft")); + + if (dotMCDir.exists() && !mcDir.exists()) + { + return dotMCDir.path(); + } + else + { + return mcDir.path(); + } +} + +QString Instance::binDir() const +{ + return PathCombine(minecraftDir(), "bin"); +} + +QString Instance::savesDir() const +{ + return PathCombine(minecraftDir(), "saves"); +} + +QString Instance::mlModsDir() const +{ + return PathCombine(minecraftDir(), "mods"); +} + +QString Instance::coreModsDir() const +{ + return PathCombine(minecraftDir(), "coremods"); +} + +QString Instance::resourceDir() const +{ + return PathCombine(minecraftDir(), "resources"); +} + +QString Instance::screenshotsDir() const +{ + return PathCombine(minecraftDir(), "screenshots"); +} + +QString Instance::texturePacksDir() const +{ + return PathCombine(minecraftDir(), "texturepacks"); +} + +QString Instance::mcJar() const +{ + return PathCombine(binDir(), "minecraft.jar"); +} + +QVariant Instance::getField(const QString &name, QVariant defVal) const +{ + return config.get(name, defVal); +} + +void Instance::setField(const QString &name, QVariant val) +{ + config.set(name, val); +} diff --git a/libinstance/src/instancelist.cpp b/libinstance/src/instancelist.cpp new file mode 100644 index 00000000..15f79d05 --- /dev/null +++ b/libinstance/src/instancelist.cpp @@ -0,0 +1,84 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "include/instancelist.h" + +#include "siglist_impl.h" + +#include +#include +#include + +#include "include/instance.h" +#include "include/instanceloader.h" + +#include "pathutils.h" + + +InstanceList::InstanceList(const QString &instDir, QObject *parent) : + QObject(parent), m_instDir(instDir) +{ + +} + +InstanceList::InstListError InstanceList::loadList() +{ + QDir dir(m_instDir); + QDirIterator iter(dir); + + while (iter.hasNext()) + { + QString subDir = iter.next(); + if (QFileInfo(PathCombine(subDir, "instance.cfg")).exists()) + { + QSharedPointer inst; + InstanceLoader::InstTypeError error = InstanceLoader::get(). + loadInstance(inst.data(), subDir); + + if (error != InstanceLoader::NoError && + error != InstanceLoader::NotAnInstance) + { + QString errorMsg = QString("Failed to load instance %1: "). + arg(QFileInfo(subDir).baseName()).toUtf8(); + + switch (error) + { + case InstanceLoader::TypeNotRegistered: + errorMsg += "Instance type not found."; + break; + + default: + errorMsg += QString("Unknown instance loader error %1"). + arg(error); + break; + } + qDebug(errorMsg.toUtf8()); + } + else if (!inst.data()) + { + qDebug(QString("Error loading instance %1. Instance loader returned null."). + arg(QFileInfo(subDir).baseName()).toUtf8()); + } + else + { + qDebug(QString("Loaded instance %1").arg(inst->name()).toUtf8()); + inst->setParent(this); + append(QSharedPointer(inst)); + } + } + } + + return NoError; +} diff --git a/libinstance/src/instanceloader.cpp b/libinstance/src/instanceloader.cpp new file mode 100644 index 00000000..eff9d56e --- /dev/null +++ b/libinstance/src/instanceloader.cpp @@ -0,0 +1,109 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "include/instanceloader.h" + +#include + +#include "include/instancetypeinterface.h" + +#include "inifile.h" + +#include "pathutils.h" + +InstanceLoader InstanceLoader::loader; + +InstanceLoader::InstanceLoader() : + QObject(NULL) +{ + +} + + +InstanceLoader::InstTypeError InstanceLoader::registerInstanceType(InstanceTypeInterface *type) +{ + // Check to see if the type ID exists. + if (m_typeMap.contains(type->typeID())) + return TypeIDExists; + + // Set the parent to this. + // ((QObject *)type)->setParent(this); + + // Add it to the map. + m_typeMap.insert(type->typeID(), type); + + qDebug(QString("Registered instance type %1."). + arg(type->typeID()).toUtf8()); + return NoError; +} + +InstanceLoader::InstTypeError InstanceLoader::createInstance(Instance *inst, + const InstanceTypeInterface *type, + const QString &instDir) +{ + // Check if the type is registered. + if (!type || findType(type->typeID()) != type) + return TypeNotRegistered; + + // Create the instance. + return type->createInstance(inst, instDir); +} + +InstanceLoader::InstTypeError InstanceLoader::loadInstance(Instance *inst, + const InstanceTypeInterface *type, + const QString &instDir) +{ + // Check if the type is registered. + if (!type || findType(type->typeID()) != type) + return TypeNotRegistered; + + return type->loadInstance(inst, instDir); +} + +InstanceLoader::InstTypeError InstanceLoader::loadInstance(Instance *inst, + const QString &instDir) +{ + QFileInfo instConfig(PathCombine(instDir, "instance.cfg")); + + if (!instConfig.exists()) + return NotAnInstance; + + INIFile ini; + ini.loadFile(instConfig.path()); + QString typeName = ini.get("type", "net.forkk.MultiMC.StdInstance").toString(); + const InstanceTypeInterface *type = findType(typeName); + + return loadInstance(inst, type, instDir); +} + +const InstanceTypeInterface *InstanceLoader::findType(const QString &id) +{ + if (!m_typeMap.contains(id)) + return NULL; + else + return m_typeMap[id]; +} + +InstTypeList InstanceLoader::typeList() +{ + InstTypeList typeList; + + for (auto iter = m_typeMap.begin(); iter != m_typeMap.end(); iter++) + { + typeList.append(*iter); + } + + return typeList; +} diff --git a/libinstance/src/instversion.cpp b/libinstance/src/instversion.cpp new file mode 100644 index 00000000..cedb61df --- /dev/null +++ b/libinstance/src/instversion.cpp @@ -0,0 +1,32 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "include/instversion.h" +#include "include/instversionlist.h" + +InstVersion::InstVersion(InstVersionList *parent) : + QObject(parent) +{ + +} + +InstVersionList *InstVersion::versionList() const +{ + // Parent should *always* be an InstVersionList + if (!parent() || !parent()->inherits("InstVersionList")) + return NULL; + else + return (InstVersionList *)parent(); +} diff --git a/libinstance/src/instversionlist.cpp b/libinstance/src/instversionlist.cpp new file mode 100644 index 00000000..e171cfa5 --- /dev/null +++ b/libinstance/src/instversionlist.cpp @@ -0,0 +1,21 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "include/instversionlist.h" + +InstVersionList::InstVersionList() : + QObject(NULL) +{ +} diff --git a/libsettings/CMakeLists.txt b/libsettings/CMakeLists.txt new file mode 100644 index 00000000..2cf72365 --- /dev/null +++ b/libsettings/CMakeLists.txt @@ -0,0 +1,30 @@ +project(libmmcsettings) + +# Find Qt +find_package(Qt5Core REQUIRED) + +# Include Qt headers. +include_directories(${Qt5Base_INCLUDE_DIRS}) +include_directories(${Qt5Network_INCLUDE_DIRS}) + +# Include utils library headers. +include_directories(${CMAKE_SOURCE_DIR}/libutil/include) + +SET(LIBSETTINGS_HEADERS +include/libsettings_config.h + +include/appsettings.h +) + +SET(LIBSETTINGS_SOURCES +src/appsettings.cpp +) + +# Set the include dir path. +SET(LIBMMCSETTINGS_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include" PARENT_SCOPE) + +add_definitions(-DLIBMMCSETTINGS_LIBRARY) + +add_library(libmmcsettings SHARED ${LIBSETTINGS_SOURCES} ${LIBSETTINGS_HEADERS}) +qt5_use_modules(libmmcsettings Core) +target_link_libraries(libmmcsettings libmmcutil) diff --git a/libsettings/include/appsettings.h b/libsettings/include/appsettings.h new file mode 100644 index 00000000..79515618 --- /dev/null +++ b/libsettings/include/appsettings.h @@ -0,0 +1,119 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef APPSETTINGS_H +#define APPSETTINGS_H + +#include +#include +//#include +#include + +#include +#include + +#include "libsettings_config.h" + +#if WINDOWS +#define JPATHKEY "JavaPathWindows" +#elif OSX +#define JPATHKEY "JavaPathOSX" +#else +#define JPATHKEY "JavaPathLinux" +#endif + +#define DEFINE_SETTING_ADVANCED(funcName, name, valType, defVal) \ + virtual valType get ## funcName() const { return getValue(name, defVal).value(); } \ + virtual void set ## funcName(valType value) { setValue(name, value); } + +#define DEFINE_SETTING(name, valType, defVal) \ + DEFINE_SETTING_ADVANCED(name, STR_VAL(name), valType, defVal) + + +class LIBMMCSETTINGS_EXPORT SettingsBase : public QObject +{ + Q_OBJECT +public: + explicit SettingsBase(QObject *parent = 0); + + // Updates + DEFINE_SETTING(UseDevBuilds, bool, false) + DEFINE_SETTING(AutoUpdate, bool, true) + + // Folders + DEFINE_SETTING(InstanceDir, QString, "instances") + DEFINE_SETTING(CentralModsDir, QString, "mods") + DEFINE_SETTING(LWJGLDir, QString, "lwjgl") + + // Console + DEFINE_SETTING(ShowConsole, bool, true) + DEFINE_SETTING(AutoCloseConsole, bool, true) + + // Toolbar settings + DEFINE_SETTING(InstanceToolbarVisible, bool, true) + DEFINE_SETTING(InstanceToolbarPosition, QPoint, QPoint()) + + // Console Colors + // Currently commented out because QColor is a part of QtGUI +// DEFINE_SETTING(SysMessageColor, QColor, QColor(Qt::blue)) +// DEFINE_SETTING(StdOutColor, QColor, QColor(Qt::black)) +// DEFINE_SETTING(StdErrColor, QColor, QColor(Qt::red)) + + // Window Size + DEFINE_SETTING(LaunchCompatMode, bool, false) + DEFINE_SETTING(LaunchMaximized, bool, false) + DEFINE_SETTING(MinecraftWinWidth, int, 854) + DEFINE_SETTING(MinecraftWinHeight, int, 480) + + // Auto login + DEFINE_SETTING(AutoLogin, bool, false) + + // Memory + DEFINE_SETTING(MinMemAlloc, int, 512) + DEFINE_SETTING(MaxMemAlloc, int, 1024) + + // Java Settings + DEFINE_SETTING_ADVANCED(JavaPath, JPATHKEY, QString, "java") + DEFINE_SETTING(JvmArgs, QString, "") + + // Custom Commands + DEFINE_SETTING(PreLaunchCommand, QString, "") + DEFINE_SETTING(PostExitCommand, QString, "") + + virtual QVariant getValue(const QString& name, QVariant defVal = QVariant()) const = 0; + virtual void setValue(const QString& name, QVariant val) = 0; +}; + +class LIBMMCSETTINGS_EXPORT AppSettings : public SettingsBase +{ + Q_OBJECT +public: + explicit AppSettings(QObject *parent = 0); + + QSettings& getConfig() { return config; } + + virtual QVariant getValue(const QString &name, QVariant defVal = QVariant()) const; + virtual void setValue(const QString& name, QVariant val); + +protected: + QSettings config; +}; + +#undef DEFINE_SETTING_ADVANCED +#undef DEFINE_SETTING + +LIBMMCSETTINGS_EXPORT extern AppSettings* settings; + +#endif // APPSETTINGS_H diff --git a/libsettings/include/libsettings_config.h b/libsettings/include/libsettings_config.h new file mode 100644 index 00000000..05df5bfa --- /dev/null +++ b/libsettings/include/libsettings_config.h @@ -0,0 +1,27 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LIBINSTANCE_CONFIG_H +#define LIBINSTANCE_CONFIG_H + +#include + +#ifdef LIBMMCSETTINGS_LIBRARY +# define LIBMMCSETTINGS_EXPORT Q_DECL_EXPORT +#else +# define LIBMMCSETTINGS_EXPORT Q_DECL_IMPORT +#endif + +#endif // LIBINSTANCE_CONFIG_H diff --git a/libsettings/src/appsettings.cpp b/libsettings/src/appsettings.cpp new file mode 100644 index 00000000..8fe9b8ad --- /dev/null +++ b/libsettings/src/appsettings.cpp @@ -0,0 +1,40 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "include/appsettings.h" + +AppSettings* settings; + +SettingsBase::SettingsBase(QObject *parent) : + QObject(parent) +{ + +} + +AppSettings::AppSettings(QObject *parent) : + SettingsBase(parent) +{ + +} + +QVariant AppSettings::getValue(const QString& name, QVariant defVal) const +{ + return config.value(name, defVal); +} + +void AppSettings::setValue(const QString& name, QVariant val) +{ + config.setValue(name, val); +} diff --git a/libutil/CMakeLists.txt b/libutil/CMakeLists.txt new file mode 100644 index 00000000..b6eadf50 --- /dev/null +++ b/libutil/CMakeLists.txt @@ -0,0 +1,38 @@ +project(libmmcutil) + +# Find Qt +find_package(Qt5Core REQUIRED) + +# Include Qt headers. +include_directories(${Qt5Base_INCLUDE_DIRS}) +include_directories(${Qt5Network_INCLUDE_DIRS}) + +SET(LIBUTIL_HEADERS +include/libutil_config.h + +include/apputils.h + +include/pathutils.h +include/osutils.h + +include/inifile.h + +include/siglist.h +include/siglist_impl.h +) + +SET(LIBUTIL_SOURCES +src/pathutils.cpp +src/osutils.cpp + +src/inifile.cpp +) + +# Set the include dir path. +SET(LIBMMCUTIL_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include" PARENT_SCOPE) + +add_definitions(-DLIBMMCUTIL_LIBRARY) + +add_library(libmmcutil SHARED ${LIBUTIL_SOURCES} ${LIBUTIL_HEADERS}) +qt5_use_modules(libmmcutil Core) +target_link_libraries(libmmcutil) diff --git a/libutil/include/apputils.h b/libutil/include/apputils.h new file mode 100644 index 00000000..a64adc50 --- /dev/null +++ b/libutil/include/apputils.h @@ -0,0 +1,21 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef APPUTILS_H +#define APPUTILS_H + +#define STR_VAL(val) # val + +#endif // APPUTILS_H diff --git a/libutil/include/inifile.h b/libutil/include/inifile.h new file mode 100644 index 00000000..1280c7e3 --- /dev/null +++ b/libutil/include/inifile.h @@ -0,0 +1,38 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef INIFILE_H +#define INIFILE_H + +#include +#include +#include + +#include "libutil_config.h" + +// Sectionless INI parser (for instance config files) +class LIBMMCUTIL_EXPORT INIFile : public QMap +{ +public: + explicit INIFile(); + + bool loadFile(QString fileName); + bool saveFile(QString fileName); + + QVariant get(QString key, QVariant def) const; + void set(QString key, QVariant val); +}; + +#endif // INIFILE_H diff --git a/libutil/include/libutil_config.h b/libutil/include/libutil_config.h new file mode 100644 index 00000000..41766184 --- /dev/null +++ b/libutil/include/libutil_config.h @@ -0,0 +1,27 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef LIBUTIL_CONFIG_H +#define LIBUTIL_CONFIG_H + +#include + +#ifdef LIBMMCUTIL_LIBRARY +# define LIBMMCUTIL_EXPORT Q_DECL_EXPORT +#else +# define LIBMMCUTIL_EXPORT Q_DECL_IMPORT +#endif + +#endif // LIBUTIL_CONFIG_H diff --git a/libutil/include/osutils.h b/libutil/include/osutils.h new file mode 100644 index 00000000..c5d4bb61 --- /dev/null +++ b/libutil/include/osutils.h @@ -0,0 +1,29 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef OSUTILS_H +#define OSUTILS_H + +#include + +#if defined _WIN32 | defined _WIN64 +#define WINDOWS 1 +#elif __APPLE__ & __MACH__ +#define OSX 1 +#elif __linux__ +#define LINUX 1 +#endif + +#endif // OSUTILS_H diff --git a/libutil/include/pathutils.h b/libutil/include/pathutils.h new file mode 100644 index 00000000..d5f106ef --- /dev/null +++ b/libutil/include/pathutils.h @@ -0,0 +1,28 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef PATHUTILS_H +#define PATHUTILS_H + +#include + +#include "libutil_config.h" + +LIBMMCUTIL_EXPORT QString PathCombine(QString path1, QString path2); +LIBMMCUTIL_EXPORT QString PathCombine(QString path1, QString path2, QString path3); + +LIBMMCUTIL_EXPORT QString AbsolutePath(QString path); + +#endif // PATHUTILS_H diff --git a/libutil/include/siglist.h b/libutil/include/siglist.h new file mode 100644 index 00000000..b6432b6e --- /dev/null +++ b/libutil/include/siglist.h @@ -0,0 +1,130 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef SIGLIST_H +#define SIGLIST_H + +#include +#include + +// A QList that allows emitting signals when the list changes. +// Since QObject doesn't support templates, to use this class with a +// certain type, you should create a class deriving from SigList and then +// call the DEFINE_SIGLIST_SIGNALS(T) and SETUP_SIGLIST_SIGNALS(T) macros. +template +class SigList : public QList +{ + +public: + explicit SigList() : QList() {} + + virtual void append(const T &value); + virtual void append(const QList &other); + + virtual void clear(); + + virtual void erase(iterator pos); + virtual void erase(iterator first, iterator last); + + virtual void insert(int i, const T &t); + virtual void insert(iterator before, const T &t); + + virtual void move(int from, int to); + + virtual void pop_back() { takeLast(); } + virtual void pop_front() { takeFirst(); } + + virtual void push_back(const T &t) { append(t); } + virtual void push_front(const T &t) { prepend(t); } + + virtual void prepend(const T &t); + + virtual int removeAll(const T &t); + virtual bool removeOne(const T &t); + + virtual void removeAt(int i) { takeAt(i); } + virtual void removeFirst() { takeFirst(); } + virtual void removeLast() { takeLast(); } + + virtual void swap(QList &other); + virtual void swap(int i, int j); + + virtual T takeAt(int i); + virtual T takeFirst(); + virtual T takeLast(); + + virtual QList &operator +=(const QList &other) { append(other); return *this; } + virtual QList &operator +=(const T &value) { append(value); return *this; } + virtual QList &operator <<(const QList &other) { append(other); return *this; } + virtual QList &operator <<(const T &value) { append(value); return *this; } + + virtual QList &operator =(const QList &other); + + + // Signal emitted after an item is added to the list. + // Contains a reference to item and the item's new index. + virtual void onItemAdded(const T &item, int index) = 0; + + // Signal emitted after multiple items are added to the list at once. + // The items parameter is a const reference to a QList of the items that + // were added. + // The firstIndex parameter is the new index of the first item added. + virtual void onItemsAdded(const QList &items, int firstIndex) = 0; + + // Signal emitted after an item is removed to the list. + // Contains a reference to the item and the item's old index. + virtual void onItemRemoved(const T &item, int index) = 0; + + // Signal emitted after multiple items are removed from the list at once. + // The items parameter is a const reference to a QList of the items that + // were added. + // The firstIndex parameter is the new index of the first item added. + virtual void onItemsRemoved(const QList &items, int firstIndex) = 0; + + // Signal emitted after an item is moved to another index. + // Contains the item, the old index, and the new index. + virtual void onItemMoved(const T &item, int oldIndex, int newIndex) = 0; + + // Signal emitted after an operation that changes the whole list occurs. + // This signal should be treated as if all data in the entire list was cleared + // and new data added in its place. + virtual void onInvalidated() = 0; +}; + +// Defines the signals for a SigList +#define DEFINE_SIGLIST_SIGNALS(TYPE) \ + Q_SIGNAL void itemAdded(TYPE const &item, int index);\ + Q_SIGNAL void itemsAdded(const QList &items, int firstIndex);\ + Q_SIGNAL void itemRemoved(TYPE const &item, int index);\ + Q_SIGNAL void itemsRemoved(const QList &items, int firstIndex);\ + Q_SIGNAL void itemMoved(TYPE const &item, int oldIndex, int newIndex);\ + Q_SIGNAL void invalidated(); + +// Overrides the onItem* functions and causes them to emit their corresponding +// signals. +#define SETUP_SIGLIST_SIGNALS(TYPE) \ + virtual void onItemAdded(TYPE const &item, int index)\ + { emit itemAdded(item, index); }\ + virtual void onItemsAdded(const QList &items, int firstIndex)\ + { emit itemsAdded(items, firstIndex); }\ + virtual void onItemRemoved(TYPE const &item, int index)\ + { emit itemRemoved(item, index); }\ + virtual void onItemsRemoved(const QList &items, int firstIndex)\ + { emit itemsRemoved(items, firstIndex); }\ + virtual void onItemMoved(TYPE const &item, int oldIndex, int newIndex)\ + { emit itemMoved(item, oldIndex, newIndex); }\ + virtual void onInvalidated() { emit invalidated(); } + +#endif // SIGLIST_H diff --git a/libutil/include/siglist_impl.h b/libutil/include/siglist_impl.h new file mode 100644 index 00000000..16ddd9b0 --- /dev/null +++ b/libutil/include/siglist_impl.h @@ -0,0 +1,156 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "siglist.h" + +template +void SigList::append(const T &value) +{ + QList::append(value); + onItemAdded(value, length() - 1); +} + +template +void SigList::prepend(const T &value) +{ + QList::prepend(value); + onItemAdded(value, 0); +} + +template +void SigList::append(const QList &other) +{ + int index = length(); + QList::append(other); + onItemsAdded(other, index); +} + +template +void SigList::clear() +{ + QList::clear(); + onInvalidated(); +} + +template +void SigList::erase(QList::iterator pos) +{ + T value = *pos; + int index = indexOf(*pos); + QList::erase(pos); + onItemRemoved(value, index); +} + +template +void SigList::erase(QList::iterator first, QList::iterator last) +{ + QList removedValues; + int firstIndex = indexOf(*first); + + for (QList::iterator iter = first; iter < last; iter++) + { + removedValues << *iter; + QList::erase(iter); + } + + onItemsRemoved(removedValues, firstIndex); +} + +template +void SigList::insert(int i, const T &t) +{ + QList::insert(i, t); + onItemAdded(t, i); +} + +template +void SigList::insert(QList::iterator before, const T &t) +{ + QList::insert(before, t); + onItemAdded(t, indexOf(t)); +} + +template +void SigList::move(int from, int to) +{ + const T &item = at(from); + QList::move(from, to); + onItemMoved(item, from, to); +} + +template +int SigList::removeAll(const T &t) +{ + int retVal = QList::removeAll(t); + onInvalidated(); + return retVal; +} + +template +bool SigList::removeOne(const T &t) +{ + int index = indexOf(t); + if (QList::removeOne(t)) + { + onItemRemoved(t, index); + return true; + } + return false; +} + +template +void SigList::swap(QList &other) +{ + QList::swap(other); + onInvalidated(); +} + +template +void SigList::swap(int i, int j) +{ + const T &item1 = at(i); + const T &item2 = at(j); + QList::swap(i, j); + onItemMoved(item1, i, j); + onItemMoved(item2, j, i); +} + +template +T SigList::takeAt(int i) +{ + T val = QList::takeAt(i); + onItemRemoved(val, i); + return val; +} + +template +T SigList::takeFirst() +{ + return takeAt(0); +} + +template +T SigList::takeLast() +{ + return takeAt(length() - 1); +} + +template +QList &SigList::operator =(const QList &other) +{ + QList::operator =(other); + onInvalidated(); + return *this; +} diff --git a/libutil/src/inifile.cpp b/libutil/src/inifile.cpp new file mode 100644 index 00000000..43545a4a --- /dev/null +++ b/libutil/src/inifile.cpp @@ -0,0 +1,86 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "include/inifile.h" + +#include +#include +#include + +INIFile::INIFile() +{ + +} + +bool INIFile::saveFile(QString fileName) +{ + // TODO Handle errors. + QFile file(fileName); + file.open(QIODevice::WriteOnly); + QTextStream out(&file); + + for (Iterator iter = begin(); iter != end(); iter++) + { + out << iter.key() << "=" << iter.value().toString() << "\n"; + } + + return true; +} + +bool INIFile::loadFile(QString fileName) +{ + // TODO Handle errors. + QFile file(fileName); + file.open(QIODevice::ReadOnly); + QTextStream in(&file); + + QStringList lines = in.readAll().split('\n'); + for (int i = 0; i < lines.count(); i++) + { + QString & lineRaw = lines[i]; + // Ignore comments. + QString line = lineRaw.left(lineRaw.indexOf('#')).trimmed(); + + int eqPos = line.indexOf('='); + if(eqPos == -1) + continue; + QString key = line.left(eqPos).trimmed(); + QString valueStr = line.right(line.length() - eqPos - 1).trimmed(); + + QVariant value(valueStr); + /* + QString dbg = key; + dbg += " = "; + dbg += valueStr; + qDebug(dbg.toLocal8Bit()); + */ + this->operator [](key) = value; + } + + return true; +} + +QVariant INIFile::get(QString key, QVariant def) const +{ + if (!this->contains(key)) + return def; + else + return this->operator [](key); +} + +void INIFile::set(QString key, QVariant val) +{ + this->operator [](key) = val; +} diff --git a/libutil/src/osutils.cpp b/libutil/src/osutils.cpp new file mode 100644 index 00000000..9a85d1e5 --- /dev/null +++ b/libutil/src/osutils.cpp @@ -0,0 +1,19 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "include/osutils.h" + +#include +#include diff --git a/libutil/src/pathutils.cpp b/libutil/src/pathutils.cpp new file mode 100644 index 00000000..8e91bf31 --- /dev/null +++ b/libutil/src/pathutils.cpp @@ -0,0 +1,37 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "include/pathutils.h" + +#include +#include + +QString PathCombine(QString path1, QString path2) +{ + if (!path1.endsWith('/')) + return path1.append('/').append(path2); + else + return path1.append(path2); +} + +QString PathCombine(QString path1, QString path2, QString path3) +{ + return PathCombine(PathCombine(path1, path2), path3); +} + +QString AbsolutePath(QString path) +{ + return QFileInfo(path).absolutePath(); +} diff --git a/main.cpp b/main.cpp index 29c11e87..b78774a8 100644 --- a/main.cpp +++ b/main.cpp @@ -17,12 +17,12 @@ #include "gui/mainwindow.h" #include -#include "data/appsettings.h" +#include "appsettings.h" #include "data/loginresponse.h" #include "data/plugin/pluginmanager.h" -#include "util/pathutils.h" +#include "pathutils.h" int main(int argc, char *argv[]) { diff --git a/plugins/stdinstance/CMakeLists.txt b/plugins/stdinstance/CMakeLists.txt index 503bda75..0bb466ec 100644 --- a/plugins/stdinstance/CMakeLists.txt +++ b/plugins/stdinstance/CMakeLists.txt @@ -10,22 +10,40 @@ find_package(Qt5Network REQUIRED) include_directories(${Qt5Base_INCLUDE_DIRS}) include_directories(${Qt5Network_INCLUDE_DIRS}) -# Include MultiMC's headers. -include_directories(../../) +# Include the Java library. +include_directories(${CMAKE_SOURCE_DIR}/java) + +# Include utils library headers. +include_directories(${CMAKE_SOURCE_DIR}/libutil/include) + +# Include settings library headers. +include_directories(${CMAKE_SOURCE_DIR}/libsettings/include) + +# Include instance library headers. +include_directories(${CMAKE_SOURCE_DIR}libinstance/include) SET(STDINST_HEADERS -stdinstplugin.h stdinstancetype.h stdinstance.h ) SET(STDINST_SOURCES -stdinstplugin.cpp stdinstancetype.cpp stdinstance.cpp ) add_library(stdinstance SHARED ${STDINST_SOURCES} ${STDINST_HEADERS}) + set_target_properties(stdinstance PROPERTIES PREFIX "") +set_target_properties(stdinstance PROPERTIES RUNTIME_OUTPUT_DIRECTORY "..") + qt5_use_modules(stdinstance Core Network) -target_link_libraries(stdinstance quazip patchlib) +target_link_libraries(stdinstance +quazip +patchlib + +# Link the util, settings, and instance libraries. +libmmcutil +libmmcsettings +libmmcinst +) diff --git a/plugins/stdinstance/stdinstance.cpp b/plugins/stdinstance/stdinstance.cpp index 19490965..12d86bbc 100644 --- a/plugins/stdinstance/stdinstance.cpp +++ b/plugins/stdinstance/stdinstance.cpp @@ -17,7 +17,7 @@ #include -#include +#include StdInstance::StdInstance(const QString &rootDir, QObject *parent) : Instance(rootDir, parent) @@ -47,7 +47,8 @@ void StdInstance::updateCurrentVersion(bool keepCurrent) setLastVersionUpdate(time); if (!keepCurrent) { - QString newVersion = javautils::GetMinecraftJarVersion(jar.absoluteFilePath()); + // TODO: Implement GetMinecraftJarVersion function. + QString newVersion = "Unknown";//javautils::GetMinecraftJarVersion(jar.absoluteFilePath()); setCurrentVersion(newVersion); } } diff --git a/plugins/stdinstance/stdinstance.h b/plugins/stdinstance/stdinstance.h index 17c03f15..d812a9b0 100644 --- a/plugins/stdinstance/stdinstance.h +++ b/plugins/stdinstance/stdinstance.h @@ -16,7 +16,7 @@ #ifndef STDINSTANCE_H #define STDINSTANCE_H -#include +#include class StdInstance : public Instance { diff --git a/plugins/stdinstance/stdinstance.json b/plugins/stdinstance/stdinstance.json index 0967ef42..704f0b73 100644 --- a/plugins/stdinstance/stdinstance.json +++ b/plugins/stdinstance/stdinstance.json @@ -1 +1,8 @@ -{} +{ + "api": "MultiMC5-API-1", + + "name": "Standard Instance Plugin", + "summary": "A plugin that provides standard Minecraft instances.", + "description": "This is a built-in plugin that provides the standard Minecraft instance.", + "version": "0.1" +} diff --git a/plugins/stdinstance/stdinstancetype.cpp b/plugins/stdinstance/stdinstancetype.cpp index 3e9e00a0..9b7aa994 100644 --- a/plugins/stdinstance/stdinstancetype.cpp +++ b/plugins/stdinstance/stdinstancetype.cpp @@ -16,7 +16,7 @@ #include "stdinstancetype.h" StdInstanceType::StdInstanceType(QObject *parent) : - InstanceType(parent) + QObject(parent) { } diff --git a/plugins/stdinstance/stdinstancetype.h b/plugins/stdinstance/stdinstancetype.h index 9516aa80..4f659ba7 100644 --- a/plugins/stdinstance/stdinstancetype.h +++ b/plugins/stdinstance/stdinstancetype.h @@ -16,11 +16,15 @@ #ifndef STDINSTANCETYPE_H #define STDINSTANCETYPE_H -#include +#include -class StdInstanceType : public InstanceType +#define StdInstanceType_IID "net.forkk.MultiMC.StdInstanceType/0.1" + +class StdInstanceType : public QObject, InstanceTypeInterface { Q_OBJECT + Q_PLUGIN_METADATA(IID StdInstanceType_IID FILE "stdinstance.json") + Q_INTERFACES(InstanceTypeInterface) public: explicit StdInstanceType(QObject *parent = 0); diff --git a/plugins/stdinstance/stdinstplugin.cpp b/plugins/stdinstance/stdinstplugin.cpp deleted file mode 100644 index 98e12ae0..00000000 --- a/plugins/stdinstance/stdinstplugin.cpp +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright 2013 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "stdinstplugin.h" - -#include - -#include "stdinstancetype.h" - -QList StdInstPlugin::getInstanceTypes() -{ - QList types; - types.push_back(new StdInstanceType(this)); - return types; -} diff --git a/plugins/stdinstance/stdinstplugin.h b/plugins/stdinstance/stdinstplugin.h deleted file mode 100644 index f44409bd..00000000 --- a/plugins/stdinstance/stdinstplugin.h +++ /dev/null @@ -1,33 +0,0 @@ -/* Copyright 2013 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef STDINSTPLUGIN_H -#define STDINSTPLUGIN_H - -#include - -#include - -class StdInstPlugin : public QObject, InstanceTypePlugin -{ - Q_OBJECT - Q_INTERFACES(InstanceTypePlugin) - Q_PLUGIN_METADATA(IID "net.forkk.MultiMC.Plugins.StdInstance") - -public: - virtual QList getInstanceTypes(); -}; - -#endif // STDINSTPLUGIN_H diff --git a/util/apputils.h b/util/apputils.h deleted file mode 100644 index a64adc50..00000000 --- a/util/apputils.h +++ /dev/null @@ -1,21 +0,0 @@ -/* Copyright 2013 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef APPUTILS_H -#define APPUTILS_H - -#define STR_VAL(val) # val - -#endif // APPUTILS_H diff --git a/util/osutils.cpp b/util/osutils.cpp deleted file mode 100644 index 6b095518..00000000 --- a/util/osutils.cpp +++ /dev/null @@ -1,25 +0,0 @@ -/* Copyright 2013 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "osutils.h" - -#include -#include -#include - -void openInDefaultProgram(QString filename) -{ - QDesktopServices::openUrl("file:///" + QFileInfo(filename).absolutePath()); -} diff --git a/util/osutils.h b/util/osutils.h deleted file mode 100644 index f779ea2d..00000000 --- a/util/osutils.h +++ /dev/null @@ -1,32 +0,0 @@ -/* Copyright 2013 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef OSUTILS_H -#define OSUTILS_H - -#include - -#if defined _WIN32 | defined _WIN64 -#define WINDOWS 1 -#elif __APPLE__ & __MACH__ -#define OSX 1 -#elif __linux__ -#define LINUX 1 -#endif - -// Opens the given file in the default application. -void openInDefaultProgram(QString filename); - -#endif // OSUTILS_H diff --git a/util/pathutils.cpp b/util/pathutils.cpp deleted file mode 100644 index 8610b80d..00000000 --- a/util/pathutils.cpp +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright 2013 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "pathutils.h" - -#include -#include - -QString PathCombine(QString path1, QString path2) -{ - if (!path1.endsWith('/')) - return path1.append('/').append(path2); - else - return path1.append(path2); -} - -QString PathCombine(QString path1, QString path2, QString path3) -{ - return PathCombine(PathCombine(path1, path2), path3); -} - -QString AbsolutePath(QString path) -{ - return QFileInfo(path).absolutePath(); -} diff --git a/util/pathutils.h b/util/pathutils.h deleted file mode 100644 index 1922e3a0..00000000 --- a/util/pathutils.h +++ /dev/null @@ -1,26 +0,0 @@ -/* Copyright 2013 MultiMC Contributors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef PATHUTILS_H -#define PATHUTILS_H - -#include - -QString PathCombine(QString path1, QString path2); -QString PathCombine(QString path1, QString path2, QString path3); - -QString AbsolutePath(QString path); - -#endif // PATHUTILS_H -- cgit v1.2.3