summaryrefslogtreecommitdiffstats
path: root/backend
diff options
context:
space:
mode:
authorPetr Mrázek <peterix@gmail.com>2013-08-17 13:40:51 +0200
committerPetr Mrázek <peterix@gmail.com>2013-08-17 13:40:51 +0200
commit253067c782955380bbf66ac0475dc954375b1ff4 (patch)
treeca97e231fd3a764256d95b5fc8d08fc25ff72161 /backend
parent77e80665422c4e97e2286418ab55e20c4030023b (diff)
downloadMultiMC-253067c782955380bbf66ac0475dc954375b1ff4.tar
MultiMC-253067c782955380bbf66ac0475dc954375b1ff4.tar.gz
MultiMC-253067c782955380bbf66ac0475dc954375b1ff4.tar.lz
MultiMC-253067c782955380bbf66ac0475dc954375b1ff4.tar.xz
MultiMC-253067c782955380bbf66ac0475dc954375b1ff4.zip
Move all the things (YES. Move them.)
Also, implemented some basic modlist logic, to be wired up.
Diffstat (limited to 'backend')
-rw-r--r--backend/BaseInstance.cpp181
-rw-r--r--backend/BaseInstance.h143
-rw-r--r--backend/BaseInstance_p.h14
-rw-r--r--backend/BaseUpdate.cpp13
-rw-r--r--backend/BaseUpdate.h50
-rw-r--r--backend/CMakeLists.txt120
-rw-r--r--backend/IconListModel.cpp163
-rw-r--r--backend/IconListModel.h33
-rw-r--r--backend/InstanceFactory.cpp113
-rw-r--r--backend/InstanceFactory.h81
-rw-r--r--backend/InstanceVersion.h69
-rw-r--r--backend/LegacyForge.cpp57
-rw-r--r--backend/LegacyForge.h25
-rw-r--r--backend/LegacyInstance.cpp229
-rw-r--r--backend/LegacyInstance.h85
-rw-r--r--backend/LegacyInstance_p.h10
-rw-r--r--backend/LegacyUpdate.cpp381
-rw-r--r--backend/LegacyUpdate.h68
-rw-r--r--backend/MinecraftProcess.cpp169
-rw-r--r--backend/MinecraftProcess.h88
-rw-r--r--backend/MinecraftVersion.h78
-rw-r--r--backend/Mod.cpp264
-rw-r--r--backend/Mod.h69
-rw-r--r--backend/ModList.cpp418
-rw-r--r--backend/ModList.h75
-rw-r--r--backend/NostalgiaInstance.cpp12
-rw-r--r--backend/NostalgiaInstance.h10
-rw-r--r--backend/OneSixAssets.cpp162
-rw-r--r--backend/OneSixAssets.h22
-rw-r--r--backend/OneSixInstance.cpp211
-rw-r--r--backend/OneSixInstance.h32
-rw-r--r--backend/OneSixInstance_p.h9
-rw-r--r--backend/OneSixUpdate.cpp169
-rw-r--r--backend/OneSixUpdate.h55
-rw-r--r--backend/OneSixVersion.cpp132
-rw-r--r--backend/OneSixVersion.h212
-rw-r--r--backend/VersionFactory.cpp195
-rw-r--r--backend/VersionFactory.h24
-rw-r--r--backend/libmmc_config.h24
-rw-r--r--backend/lists/InstVersionList.cpp129
-rw-r--r--backend/lists/InstVersionList.h122
-rw-r--r--backend/lists/InstanceList.cpp232
-rw-r--r--backend/lists/InstanceList.h92
-rw-r--r--backend/lists/LwjglVersionList.cpp206
-rw-r--r--backend/lists/LwjglVersionList.h119
-rw-r--r--backend/lists/MinecraftVersionList.cpp300
-rw-r--r--backend/lists/MinecraftVersionList.h84
-rw-r--r--backend/net/DownloadJob.cpp138
-rw-r--r--backend/net/DownloadJob.h51
-rw-r--r--backend/net/JobQueue.h180
-rw-r--r--backend/net/NetWorker.cpp12
-rw-r--r--backend/net/NetWorker.h20
-rw-r--r--backend/tasks/LoginTask.cpp111
-rw-r--r--backend/tasks/LoginTask.h59
-rw-r--r--backend/tasks/Task.cpp85
-rw-r--r--backend/tasks/Task.h67
56 files changed, 0 insertions, 6272 deletions
diff --git a/backend/BaseInstance.cpp b/backend/BaseInstance.cpp
deleted file mode 100644
index 951b403a..00000000
--- a/backend/BaseInstance.cpp
+++ /dev/null
@@ -1,181 +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 "BaseInstance.h"
-#include "BaseInstance_p.h"
-
-#include <QFileInfo>
-
-#include "inisettingsobject.h"
-#include "setting.h"
-#include "overridesetting.h"
-
-#include "pathutils.h"
-#include <lists/MinecraftVersionList.h>
-
-
-BaseInstance::BaseInstance( BaseInstancePrivate* d_in,
- const QString& rootDir,
- SettingsObject* settings_obj,
- QObject* parent
- )
-:inst_d(d_in), QObject(parent)
-{
- I_D(BaseInstance);
- d->m_settings = settings_obj;
- d->m_rootDir = rootDir;
-
- settings().registerSetting(new Setting("name", "Unnamed Instance"));
- settings().registerSetting(new Setting("iconKey", "default"));
- settings().registerSetting(new Setting("notes", ""));
- settings().registerSetting(new Setting("lastLaunchTime", 0));
-
- // Java Settings
- settings().registerSetting(new Setting("OverrideJava", false));
- settings().registerSetting(new OverrideSetting("JavaPath", globalSettings->getSetting("JavaPath")));
- settings().registerSetting(new OverrideSetting("JvmArgs", globalSettings->getSetting("JvmArgs")));
-
- // Custom Commands
- settings().registerSetting(new Setting("OverrideCommands", false));
- settings().registerSetting(new OverrideSetting("PreLaunchCommand", globalSettings->getSetting("PreLaunchCommand")));
- settings().registerSetting(new OverrideSetting("PostExitCommand", globalSettings->getSetting("PostExitCommand")));
-
- // Window Size
- settings().registerSetting(new Setting("OverrideWindow", false));
- settings().registerSetting(new OverrideSetting("LaunchMaximized", globalSettings->getSetting("LaunchMaximized")));
- settings().registerSetting(new OverrideSetting("MinecraftWinWidth", globalSettings->getSetting("MinecraftWinWidth")));
- settings().registerSetting(new OverrideSetting("MinecraftWinHeight", globalSettings->getSetting("MinecraftWinHeight")));
-
- // Memory
- settings().registerSetting(new Setting("OverrideMemory", false));
- settings().registerSetting(new OverrideSetting("MinMemAlloc", globalSettings->getSetting("MinMemAlloc")));
- settings().registerSetting(new OverrideSetting("MaxMemAlloc", globalSettings->getSetting("MaxMemAlloc")));
-
- // Auto login
- settings().registerSetting(new Setting("OverrideLogin", false));
- settings().registerSetting(new OverrideSetting("AutoLogin", globalSettings->getSetting("AutoLogin")));
-
- // Console
- settings().registerSetting(new Setting("OverrideConsole", false));
- settings().registerSetting(new OverrideSetting("ShowConsole", globalSettings->getSetting("ShowConsole")));
- settings().registerSetting(new OverrideSetting("AutoCloseConsole", globalSettings->getSetting("AutoCloseConsole")));
-}
-
-QString BaseInstance::id() const
-{
- return QFileInfo(instanceRoot()).fileName();
-}
-
-QString BaseInstance::instanceType() const
-{
- I_D(BaseInstance);
- return d->m_settings->get("InstanceType").toString();
-}
-
-
-QString BaseInstance::instanceRoot() const
-{
- I_D(BaseInstance);
- return d->m_rootDir;
-}
-
-QString BaseInstance::minecraftRoot() const
-{
- QFileInfo mcDir(PathCombine(instanceRoot(), "minecraft"));
- QFileInfo dotMCDir(PathCombine(instanceRoot(), ".minecraft"));
-
- if (dotMCDir.exists() && !mcDir.exists())
- return dotMCDir.filePath();
- else
- return mcDir.filePath();
-}
-
-InstanceList *BaseInstance::instList() const
-{
- if (parent()->inherits("InstanceList"))
- return (InstanceList *)parent();
- else
- return NULL;
-}
-
-InstVersionList *BaseInstance::versionList() const
-{
- return &MinecraftVersionList::getMainList();
-}
-
-SettingsObject &BaseInstance::settings() const
-{
- I_D(BaseInstance);
- return *d->m_settings;
-}
-
-qint64 BaseInstance::lastLaunch() const
-{
- I_D(BaseInstance);
- return d->m_settings->get ( "lastLaunchTime" ).value<qint64>();
-}
-void BaseInstance::setLastLaunch ( qint64 val )
-{
- I_D(BaseInstance);
- d->m_settings->set ( "lastLaunchTime", val );
- emit propertiesChanged ( this );
-}
-
-void BaseInstance::setGroup ( QString val )
-{
- I_D(BaseInstance);
- d->m_group = val;
- emit propertiesChanged ( this );
-}
-QString BaseInstance::group() const
-{
- I_D(BaseInstance);
- return d->m_group;
-}
-
-void BaseInstance::setNotes ( QString val )
-{
- I_D(BaseInstance);
- d->m_settings->set ( "notes", val );
-}
-QString BaseInstance::notes() const
-{
- I_D(BaseInstance);
- return d->m_settings->get ( "notes" ).toString();
-}
-
-void BaseInstance::setIconKey ( QString val )
-{
- I_D(BaseInstance);
- d->m_settings->set ( "iconKey", val );
- emit propertiesChanged ( this );
-}
-QString BaseInstance::iconKey() const
-{
- I_D(BaseInstance);
- return d->m_settings->get ( "iconKey" ).toString();
-}
-
-void BaseInstance::setName ( QString val )
-{
- I_D(BaseInstance);
- d->m_settings->set ( "name", val );
- emit propertiesChanged ( this );
-}
-QString BaseInstance::name() const
-{
- I_D(BaseInstance);
- return d->m_settings->get ( "name" ).toString();
-}
diff --git a/backend/BaseInstance.h b/backend/BaseInstance.h
deleted file mode 100644
index 05f3ce00..00000000
--- a/backend/BaseInstance.h
+++ /dev/null
@@ -1,143 +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.
- */
-
-#pragma once
-
-#include <QObject>
-#include <QDateTime>
-
-#include <settingsobject.h>
-
-#include "inifile.h"
-#include "lists/InstVersionList.h"
-
-#include "libmmc_config.h"
-
-class BaseUpdate;
-class MinecraftProcess;
-class OneSixUpdate;
-class InstanceList;
-class BaseInstancePrivate;
-
-/*!
- * \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 LIBMULTIMC_EXPORT BaseInstance : public QObject
-{
- Q_OBJECT
-protected:
- /// no-touchy!
- BaseInstance(BaseInstancePrivate * d, const QString &rootDir, SettingsObject * settings, QObject *parent = 0);
-public:
- /// virtual destructor to make sure the destruction is COMPLETE
- virtual ~BaseInstance() {};
-
- /// The instance's ID. The ID SHALL be determined by MMC internally. The ID IS guaranteed to be unique.
- QString id() const;
-
- /// get the type of this instance
- QString instanceType() const;
-
- /// Path to the instance's root directory.
- QString instanceRoot() const;
-
- /// Path to the instance's minecraft directory.
- QString minecraftRoot() const;
-
- QString name() const;
- void setName(QString val);
-
- QString iconKey() const;
- void setIconKey(QString val);
-
- QString notes() const;
- void setNotes(QString val);
-
- QString group() const;
- void setGroup(QString val);
-
- virtual QString intendedVersionId() const = 0;
- virtual bool setIntendedVersionId(QString version) = 0;
-
- /*!
- * The instance's current version.
- * This value represents the instance's current version. If this value is
- * different from the intendedVersion, the instance should be updated.
- * \warning Don't change this value unless you know what you're doing.
- */
- virtual QString currentVersionId() const = 0;
- //virtual void setCurrentVersionId(QString val) = 0;
-
- /*!
- * Whether or not Minecraft should be downloaded when the instance is launched.
- */
- virtual bool shouldUpdate() const = 0;
- virtual void setShouldUpdate(bool val) = 0;
-
- /**
- * Gets the time that the instance was last launched.
- * Stored in milliseconds since epoch.
- */
- qint64 lastLaunch() const;
- /// Sets the last launched time to 'val' milliseconds since epoch
- void setLastLaunch(qint64 val = QDateTime::currentMSecsSinceEpoch());
-
- /*!
- * \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.
- */
- InstanceList *instList() const;
-
- /*!
- * \brief Gets a pointer to this instance's version list.
- * \return A pointer to the available version list for this instance.
- */
- virtual InstVersionList *versionList() const;
-
- /*!
- * \brief Gets this instance's settings object.
- * This settings object stores instance-specific settings.
- * \return A pointer to this instance's settings object.
- */
- virtual SettingsObject &settings() const;
-
- /// returns a valid update task if update is needed, NULL otherwise
- virtual BaseUpdate* doUpdate() = 0;
-
- /// returns a valid minecraft process, ready for launch
- virtual MinecraftProcess* prepareForLaunch(QString user, QString session) = 0;
-
- /// do any necessary cleanups after the instance finishes. also runs before 'prepareForLaunch'
- virtual void cleanupAfterRun() = 0;
-signals:
- /*!
- * \brief Signal emitted when properties relevant to the instance view change
- */
- void propertiesChanged(BaseInstance * inst);
-
-protected:
- QSharedPointer<BaseInstancePrivate> inst_d;
-};
-
-// pointer for lazy people
-typedef QSharedPointer<BaseInstance> InstancePtr;
-
diff --git a/backend/BaseInstance_p.h b/backend/BaseInstance_p.h
deleted file mode 100644
index a30916a4..00000000
--- a/backend/BaseInstance_p.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#pragma once
-#include <QString>
-#include <settingsobject.h>
-
-class BaseInstance;
-
-#define I_D(Class) Class##Private * const d = (Class##Private * const) inst_d.data()
-
-struct BaseInstancePrivate
-{
- QString m_rootDir;
- QString m_group;
- SettingsObject *m_settings;
-}; \ No newline at end of file
diff --git a/backend/BaseUpdate.cpp b/backend/BaseUpdate.cpp
deleted file mode 100644
index b086ab14..00000000
--- a/backend/BaseUpdate.cpp
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "BaseUpdate.h"
-
-BaseUpdate::BaseUpdate ( BaseInstance* inst, QObject* parent ) : Task ( parent )
-{
- m_inst = inst;
-}
-
-void BaseUpdate::updateDownloadProgress(qint64 current, qint64 total)
-{
- // The progress on the current file is current / total
- float currentDLProgress = (float) current / (float) total;
- setProgress((int)(currentDLProgress * 100)); // convert to percentage
-} \ No newline at end of file
diff --git a/backend/BaseUpdate.h b/backend/BaseUpdate.h
deleted file mode 100644
index b7d2017e..00000000
--- a/backend/BaseUpdate.h
+++ /dev/null
@@ -1,50 +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.
- */
-
-#pragma once
-
-#include <QObject>
-#include <QList>
-#include <QUrl>
-
-#include "net/DownloadJob.h"
-
-#include "tasks/Task.h"
-#include "libmmc_config.h"
-
-class MinecraftVersion;
-class BaseInstance;
-
-/*!
- * The game update task is the task that handles downloading instances' files.
- */
-class LIBMULTIMC_EXPORT BaseUpdate : public Task
-{
- Q_OBJECT
-public:
- explicit BaseUpdate(BaseInstance *inst, QObject *parent = 0);
-
- virtual void executeTask() = 0;
-
-protected slots:
- //virtual void error(const QString &msg);
- void updateDownloadProgress(qint64 current, qint64 total);
-
-protected:
- JobListQueue download_queue;
- BaseInstance *m_inst;
-};
-
-
diff --git a/backend/CMakeLists.txt b/backend/CMakeLists.txt
deleted file mode 100644
index 7a92d5cf..00000000
--- a/backend/CMakeLists.txt
+++ /dev/null
@@ -1,120 +0,0 @@
-project(libMultiMC)
-
-set(CMAKE_AUTOMOC ON)
-
-# Find Qt
-find_package(Qt5Core REQUIRED)
-find_package(Qt5Network REQUIRED)
-find_package(Qt5Xml REQUIRED)
-
-# Include Qt headers.
-include_directories(${Qt5Base_INCLUDE_DIRS})
-include_directories(${Qt5Network_INCLUDE_DIRS})
-
-# Include utility library.
-include_directories(${CMAKE_SOURCE_DIR}/libutil/include)
-
-# Include settings library.
-include_directories(${CMAKE_SOURCE_DIR}/libsettings/include)
-
-SET(LIBINST_HEADERS
-libmmc_config.h
-
-# Base classes and infrastructure
-InstanceVersion.h
-MinecraftVersion.h
-InstanceFactory.h
-BaseUpdate.h
-BaseInstance.h
-BaseInstance_p.h
-MinecraftProcess.h
-Mod.h
-ModList.h
-
-# network stuffs
-net/DownloadJob.h
-net/JobQueue.h
-net/NetWorker.h
-
-# legacy instances
-LegacyInstance.h
-LegacyInstance_p.h
-LegacyUpdate.h
-LegacyForge.h
-
-# 1.6 instances
-OneSixAssets.h
-OneSixInstance.h
-OneSixInstance_p.h
-OneSixUpdate.h
-OneSixVersion.h
-VersionFactory.h
-
-# Nostalgia
-NostalgiaInstance.h
-
-# Lists
-lists/InstanceList.h
-lists/InstVersionList.h
-lists/MinecraftVersionList.h
-lists/LwjglVersionList.h
-IconListModel.h
-
-# Tasks
-tasks/Task.h
-tasks/LoginTask.h
-)
-
-SET(LIBINST_SOURCES
-# Base classes and infrastructure
-InstanceFactory.cpp
-BaseUpdate.cpp
-BaseInstance.cpp
-MinecraftProcess.cpp
-Mod.cpp
-ModList.cpp
-
-# network stuffs
-net/NetWorker.cpp
-net/DownloadJob.cpp
-
-# legacy instances
-LegacyInstance.cpp
-LegacyUpdate.cpp
-LegacyForge.cpp
-
-# 1.6 instances
-OneSixAssets.cpp
-OneSixInstance.cpp
-OneSixVersion.cpp
-OneSixUpdate.cpp
-VersionFactory.cpp
-
-# Nostalgia
-NostalgiaInstance.cpp
-
-# Lists
-lists/InstanceList.cpp
-lists/InstVersionList.cpp
-lists/MinecraftVersionList.cpp
-lists/LwjglVersionList.cpp
-IconListModel.cpp
-
-# Tasks
-tasks/Task.cpp
-tasks/LoginTask.cpp
-)
-
-# Set the include dir path.
-SET(LIBMULTIMC_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}" PARENT_SCOPE)
-
-# Include self.
-include_directories(${CMAKE_CURRENT_SOURCE_DIR})
-include_directories(${CMAKE_BINARY_DIR}/include)
-
-add_definitions(-DLIBMULTIMC_LIBRARY)
-
-add_library(backend SHARED ${LIBINST_SOURCES} ${LIBINST_HEADERS})
-qt5_use_modules(backend Core Network Xml)
-target_link_libraries(backend libUtil libSettings quazip)
-
diff --git a/backend/IconListModel.cpp b/backend/IconListModel.cpp
deleted file mode 100644
index 2d2fb6cf..00000000
--- a/backend/IconListModel.cpp
+++ /dev/null
@@ -1,163 +0,0 @@
-#include "IconListModel.h"
-#include <pathutils.h>
-#include <QMap>
-#include <QEventLoop>
-#include <QDir>
-
-#define MAX_SIZE 1024
-IconList* IconList::m_Instance = 0;
-QMutex IconList::mutex;
-
-struct entry
-{
- QString key;
- QString name;
- QIcon icon;
- bool is_builtin;
-};
-
-class Private : public QObject
-{
- Q_OBJECT
-public:
- QMap<QString, int> index;
- QVector<entry> icons;
- Private()
- {
- }
-};
-
-
-IconList::IconList() : QAbstractListModel(), d(new Private())
-{
- QDir instance_icons(":/icons/instances/");
- auto file_info_list = instance_icons.entryInfoList(QDir::Files, QDir::Name);
- for(auto file_info: file_info_list)
- {
- QString key = file_info.baseName();
- addIcon(key, key, file_info.absoluteFilePath(), true);
- }
-
- // FIXME: get from settings
- ensurePathExists("icons/");
- QDir user_icons("icons/");
- file_info_list = user_icons.entryInfoList(QDir::Files, QDir::Name);
- for(auto file_info: file_info_list)
- {
- QString filename = file_info.absoluteFilePath();
- QString key = file_info.baseName();
- addIcon(key, key, filename);
- }
-}
-
-IconList::~IconList()
-{
- delete d;
- d = nullptr;
-}
-
-QVariant IconList::data ( const QModelIndex& index, int role ) const
-{
- if(!index.isValid())
- return QVariant();
-
- int row = index.row();
-
- if(row < 0 || row >= d->icons.size())
- return QVariant();
-
- switch(role)
- {
- case Qt::DecorationRole:
- return d->icons[row].icon;
- case Qt::DisplayRole:
- return d->icons[row].name;
- case Qt::UserRole:
- return d->icons[row].key;
- default:
- return QVariant();
- }
-}
-
-int IconList::rowCount ( const QModelIndex& parent ) const
-{
- return d->icons.size();
-}
-
-bool IconList::addIcon ( QString key, QString name, QString path, bool is_builtin )
-{
- auto iter = d->index.find(key);
- if(iter != d->index.end())
- {
- if(d->icons[*iter].is_builtin) return false;
-
- QIcon icon(path);
- if(icon.isNull()) return false;
-
- // replace the icon
- d->icons[*iter] = {key, name, icon, is_builtin};
- return true;
- }
- else
- {
- QIcon icon(path);
- if(icon.isNull()) return false;
-
- // add a new icon
- d->icons.push_back({key, name, icon, is_builtin});
- d->index[key] = d->icons.size() - 1;
- return true;
- }
-}
-
-
-QIcon IconList::getIcon ( QString key )
-{
- int icon_index = getIconIndex(key);
-
- if(icon_index != -1)
- return d->icons[icon_index].icon;
-
- // Fallback for icons that don't exist.
- icon_index = getIconIndex("infinity");
-
- if(icon_index != -1)
- return d->icons[icon_index].icon;
- return QIcon();
-}
-
-int IconList::getIconIndex ( QString key )
-{
- if(key == "default")
- key = "infinity";
-
- auto iter = d->index.find(key);
- if(iter != d->index.end())
- return *iter;
-
-
- return -1;
-}
-
-
-void IconList::drop()
-{
- mutex.lock();
- delete m_Instance;
- m_Instance = 0;
- mutex.unlock();
-}
-
-IconList* IconList::instance()
-{
- if ( !m_Instance )
- {
- mutex.lock();
- if ( !m_Instance )
- m_Instance = new IconList;
- mutex.unlock();
- }
- return m_Instance;
-}
-
-#include "IconListModel.moc" \ No newline at end of file
diff --git a/backend/IconListModel.h b/backend/IconListModel.h
deleted file mode 100644
index 31b05e64..00000000
--- a/backend/IconListModel.h
+++ /dev/null
@@ -1,33 +0,0 @@
-#pragma once
-
-#include <QMutex>
-#include <QAbstractListModel>
-#include <QtGui/QIcon>
-
-class Private;
-
-class IconList : public QAbstractListModel
-{
-public:
- static IconList* instance();
- static void drop();
- QIcon getIcon ( QString key );
- int getIconIndex ( QString key );
-
- virtual QVariant data ( const QModelIndex& index, int role = Qt::DisplayRole ) const;
- virtual int rowCount ( const QModelIndex& parent = QModelIndex() ) const;
-
- bool addIcon(QString key, QString name, QString path, bool is_builtin = false);
-
-
-private:
- virtual ~IconList();
- IconList();
- // hide copy constructor
- IconList ( const IconList & ) = delete;
- // hide assign op
- IconList& operator= ( const IconList & ) = delete;
- static IconList* m_Instance;
- static QMutex mutex;
- Private* d;
-};
diff --git a/backend/InstanceFactory.cpp b/backend/InstanceFactory.cpp
deleted file mode 100644
index f3511157..00000000
--- a/backend/InstanceFactory.cpp
+++ /dev/null
@@ -1,113 +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 "InstanceFactory.h"
-
-#include <QDir>
-#include <QFileInfo>
-
-#include "BaseInstance.h"
-#include "LegacyInstance.h"
-#include "OneSixInstance.h"
-#include "NostalgiaInstance.h"
-#include "InstanceVersion.h"
-#include "MinecraftVersion.h"
-
-#include "inifile.h"
-#include <inisettingsobject.h>
-#include <setting.h>
-
-#include "pathutils.h"
-
-InstanceFactory InstanceFactory::loader;
-
-InstanceFactory::InstanceFactory() :
- QObject(NULL)
-{
-
-}
-
-InstanceFactory::InstLoadError InstanceFactory::loadInstance(BaseInstance *&inst, const QString &instDir)
-{
- auto m_settings = new INISettingsObject(PathCombine(instDir, "instance.cfg"));
-
- m_settings->registerSetting(new Setting("InstanceType", "Legacy"));
-
- QString inst_type = m_settings->get("InstanceType").toString();
-
- //FIXME: replace with a map lookup, where instance classes register their types
- if(inst_type == "Legacy")
- {
- inst = new LegacyInstance(instDir, m_settings, this);
- }
- else if(inst_type == "OneSix")
- {
- inst = new OneSixInstance(instDir, m_settings, this);
- }
- else if(inst_type == "Nostalgia")
- {
- inst = new NostalgiaInstance(instDir, m_settings, this);
- }
- else
- {
- return InstanceFactory::UnknownLoadError;
- }
- return NoLoadError;
-}
-
-
-InstanceFactory::InstCreateError InstanceFactory::createInstance( BaseInstance*& inst, InstVersionPtr version, const QString& instDir )
-{
- QDir rootDir(instDir);
-
- qDebug(instDir.toUtf8());
- if (!rootDir.exists() && !rootDir.mkpath("."))
- {
- return InstanceFactory::CantCreateDir;
- }
- auto mcVer = version.dynamicCast<MinecraftVersion>();
- if(!mcVer)
- return InstanceFactory::NoSuchVersion;
-
- auto m_settings = new INISettingsObject(PathCombine(instDir, "instance.cfg"));
- m_settings->registerSetting(new Setting("InstanceType", "Legacy"));
-
- switch(mcVer->type)
- {
- case MinecraftVersion::Legacy:
- m_settings->set("InstanceType", "Legacy");
- inst = new LegacyInstance(instDir, m_settings, this);
- inst->setIntendedVersionId(version->descriptor);
- break;
- case MinecraftVersion::OneSix:
- m_settings->set("InstanceType", "OneSix");
- inst = new OneSixInstance(instDir, m_settings, this);
- inst->setIntendedVersionId(version->descriptor);
- break;
- case MinecraftVersion::Nostalgia:
- m_settings->set("InstanceType", "Nostalgia");
- inst = new NostalgiaInstance(instDir, m_settings, this);
- inst->setIntendedVersionId(version->descriptor);
- break;
- default:
- {
- delete m_settings;
- return InstanceFactory::NoSuchVersion;
- }
- }
-
- //FIXME: really, how do you even know?
- return InstanceFactory::NoCreateError;
-}
diff --git a/backend/InstanceFactory.h b/backend/InstanceFactory.h
deleted file mode 100644
index e1100504..00000000
--- a/backend/InstanceFactory.h
+++ /dev/null
@@ -1,81 +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.
- */
-
-#pragma once
-
-#include <QObject>
-#include <QMap>
-#include <QList>
-
-#include "libmmc_config.h"
-#include "InstanceVersion.h"
-
-class InstVersion;
-class BaseInstance;
-
-/*!
- * The \bInstanceFactory\b is a singleton that manages loading and creating instances.
- */
-class LIBMULTIMC_EXPORT InstanceFactory : public QObject
-{
- Q_OBJECT
-public:
- /*!
- * \brief Gets a reference to the instance loader.
- */
- static InstanceFactory &get() { return loader; }
-
- enum InstLoadError
- {
- NoLoadError = 0,
- UnknownLoadError,
- NotAnInstance
- };
-
- enum InstCreateError
- {
- NoCreateError = 0,
- NoSuchVersion,
- UnknownCreateError,
- InstExists,
- CantCreateDir
- };
-
- /*!
- * \brief Creates a stub instance
- *
- * \param inst Pointer to store the created instance in.
- * \param instDir The instance's directory.
- * \return An InstCreateError error code.
- * - InstExists if the given instance directory is already an instance.
- * - CantCreateDir if the given instance directory cannot be created.
- */
- InstCreateError createInstance(BaseInstance *&inst, InstVersionPtr version, 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 InstLoadError error code.
- * - NotAnInstance if the given instance directory isn't a valid instance.
- */
- InstLoadError loadInstance(BaseInstance *&inst, const QString &instDir);
-
-private:
- InstanceFactory();
-
- static InstanceFactory loader;
-};
diff --git a/backend/InstanceVersion.h b/backend/InstanceVersion.h
deleted file mode 100644
index aeff9842..00000000
--- a/backend/InstanceVersion.h
+++ /dev/null
@@ -1,69 +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.
- */
-
-#pragma once
-#include "libmmc_config.h"
-#include <QSharedPointer>
-
-/*!
- * An abstract base class for versions.
- */
-struct LIBMULTIMC_EXPORT InstVersion
-{
- /*!
- * Checks if this version is less (older) than the given version.
- * \param other The version to compare this one to.
- * \return True if this version is older than the given version.
- */
- virtual bool operator<(const InstVersion &rhs) const
- {
- return timestamp < rhs.timestamp;
- }
-
- /*!
- * Checks if this version is greater (newer) than the given version.
- * \param other The version to compare this one to.
- * \return True if this version is newer than the given version.
- */
- virtual bool operator>( const InstVersion& rhs ) const
- {
- return timestamp > rhs.timestamp;
- }
-
- /*!
- * A string used to identify this version in config files.
- * This should be unique within the version list or shenanigans will occur.
- */
- QString descriptor;
- /*!
- * The name of this version as it is displayed to the user.
- * For example: "1.5.1"
- */
- QString name;
- /*!
- * Gets the version's timestamp.
- * This is primarily used for sorting versions in a list.
- */
- qint64 timestamp;
-
- virtual QString typeString() const
- {
- return "InstVersion";
- }
-};
-
-typedef QSharedPointer<InstVersion> InstVersionPtr;
-
-Q_DECLARE_METATYPE( InstVersionPtr ) \ No newline at end of file
diff --git a/backend/LegacyForge.cpp b/backend/LegacyForge.cpp
deleted file mode 100644
index adcf487c..00000000
--- a/backend/LegacyForge.cpp
+++ /dev/null
@@ -1,57 +0,0 @@
-//
-// Copyright 2012 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 "LegacyForge.h"
-
-MinecraftForge::MinecraftForge ( const QString& file ) : Mod ( file )
-{
-
-}
-bool MinecraftForge::FixVersionIfNeeded ( QString newVersion )
-{/*
- wxString reportedVersion = GetModVersion();
- if(reportedVersion == "..." || reportedVersion.empty())
- {
- std::auto_ptr<wxFFileInputStream> in(new wxFFileInputStream("forge.zip"));
- wxTempFileOutputStream out("forge.zip");
- wxTextOutputStream textout(out);
- wxZipInputStream inzip(*in);
- wxZipOutputStream outzip(out);
- std::auto_ptr<wxZipEntry> entry;
- // preserve metadata
- outzip.CopyArchiveMetaData(inzip);
- // copy all entries
- while (entry.reset(inzip.GetNextEntry()), entry.get() != NULL)
- if (!outzip.CopyEntry(entry.release(), inzip))
- return false;
- // release last entry
- in.reset();
- outzip.PutNextEntry("forgeversion.properties");
-
- wxStringTokenizer tokenizer(newVersion,".");
- wxString verFile;
- verFile << wxString("forge.major.number=") << tokenizer.GetNextToken() << "\n";
- verFile << wxString("forge.minor.number=") << tokenizer.GetNextToken() << "\n";
- verFile << wxString("forge.revision.number=") << tokenizer.GetNextToken() << "\n";
- verFile << wxString("forge.build.number=") << tokenizer.GetNextToken() << "\n";
- auto buf = verFile.ToUTF8();
- outzip.Write(buf.data(), buf.length());
- // check if we succeeded
- return inzip.Eof() && outzip.Close() && out.Commit();
- }
- */
- return true;
-}
diff --git a/backend/LegacyForge.h b/backend/LegacyForge.h
deleted file mode 100644
index 00a054b8..00000000
--- a/backend/LegacyForge.h
+++ /dev/null
@@ -1,25 +0,0 @@
-//
-// Copyright 2012 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.
-//
-
-#pragma once
-#include "Mod.h"
-
-class MinecraftForge : public Mod
-{
-public:
- MinecraftForge ( const QString& file );
- bool FixVersionIfNeeded(QString newVersion);
-};
diff --git a/backend/LegacyInstance.cpp b/backend/LegacyInstance.cpp
deleted file mode 100644
index 9102c9c7..00000000
--- a/backend/LegacyInstance.cpp
+++ /dev/null
@@ -1,229 +0,0 @@
-#include "LegacyInstance.h"
-#include "LegacyInstance_p.h"
-#include "MinecraftProcess.h"
-#include "LegacyUpdate.h"
-#include <setting.h>
-#include <pathutils.h>
-#include <cmdutils.h>
-#include <QFileInfo>
-#include <QDir>
-#include <QImage>
-
-#define LAUNCHER_FILE "MultiMCLauncher.jar"
-
-LegacyInstance::LegacyInstance(const QString& rootDir, SettingsObject* settings, QObject* parent)
- :BaseInstance( new LegacyInstancePrivate(),rootDir, settings, parent)
-{
- settings->registerSetting(new Setting("NeedsRebuild", true));
- settings->registerSetting(new Setting("ShouldUpdate", false));
- settings->registerSetting(new Setting("JarVersion", "Unknown"));
- settings->registerSetting(new Setting("LwjglVersion", "2.9.0"));
- settings->registerSetting(new Setting("IntendedJarVersion", ""));
-}
-
-BaseUpdate* LegacyInstance::doUpdate()
-{
- return new LegacyUpdate(this, this);
-}
-
-MinecraftProcess* LegacyInstance::prepareForLaunch(QString user, QString session)
-{
- MinecraftProcess * proc = new MinecraftProcess(this);
-
- // FIXME: extract the icon
- // QImage(":/icons/instances/" + iconKey()).save(PathCombine(minecraftRoot(), "icon.png"));
-
- // extract the legacy launcher
- QFile(":/launcher/launcher.jar").copy(PathCombine(minecraftRoot(), LAUNCHER_FILE));
-
- // set the process arguments
- {
- QStringList args;
-
- // window size
- QString windowSize;
- if (settings().get("LaunchMaximized").toBool())
- windowSize = "max";
- else
- windowSize = QString("%1x%2").
- arg(settings().get("MinecraftWinWidth").toInt()).
- arg(settings().get("MinecraftWinHeight").toInt());
-
- // window title
- QString windowTitle;
- windowTitle.append("MultiMC: ").append(name());
-
- // Java arguments
- args.append(Util::Commandline::splitArgs(settings().get("JvmArgs").toString()));
-
-#ifdef OSX
- // OSX dock icon and name
- args << "-Xdock:icon=icon.png";
- args << QString("-Xdock:name=\"%1\"").arg(windowTitle);
-#endif
-
- QString lwjgl = QDir(globalSettings->get("LWJGLDir").toString() + "/" + lwjglVersion()).absolutePath();
-
- // launcher arguments
- args << QString("-Xms%1m").arg(settings().get("MinMemAlloc").toInt());
- args << QString("-Xmx%1m").arg(settings().get("MaxMemAlloc").toInt());
- args << "-jar" << LAUNCHER_FILE;
- args << user;
- args << session;
- args << windowTitle;
- args << windowSize;
- args << lwjgl;
- proc->setMinecraftArguments(args);
- }
-
- // set the process work path
- proc->setMinecraftWorkdir(minecraftRoot());
-
- return proc;
-}
-
-void LegacyInstance::cleanupAfterRun()
-{
- //FIXME: delete the launcher and icons and whatnot.
-}
-
-
-QString LegacyInstance::instModsDir() const
-{
- return PathCombine(instanceRoot(), "instMods");
-}
-
-QString LegacyInstance::binDir() const
-{
- return PathCombine(minecraftRoot(), "bin");
-}
-
-QString LegacyInstance::savesDir() const
-{
- return PathCombine(minecraftRoot(), "saves");
-}
-
-QString LegacyInstance::mlModsDir() const
-{
- return PathCombine(minecraftRoot(), "mods");
-}
-
-QString LegacyInstance::coreModsDir() const
-{
- return PathCombine(minecraftRoot(), "coremods");
-}
-
-QString LegacyInstance::resourceDir() const
-{
- return PathCombine(minecraftRoot(), "resources");
-}
-
-QString LegacyInstance::mcJar() const
-{
- return PathCombine(binDir(), "minecraft.jar");
-}
-
-QString LegacyInstance::mcBackup() const
-{
- return PathCombine(binDir(), "mcbackup.jar");
-}
-
-QString LegacyInstance::modListFile() const
-{
- return PathCombine(instanceRoot(), "modlist");
-}
-
-bool LegacyInstance::shouldUpdateCurrentVersion() const
-{
- QFileInfo jar(mcJar());
- return jar.lastModified().toUTC().toMSecsSinceEpoch() != lastCurrentVersionUpdate();
-}
-
-void LegacyInstance::updateCurrentVersion(bool keepCurrent)
-{
- QFileInfo jar(mcJar());
-
- if(!jar.exists())
- {
- setLastCurrentVersionUpdate(0);
- setCurrentVersionId("Unknown");
- return;
- }
-
- qint64 time = jar.lastModified().toUTC().toMSecsSinceEpoch();
-
- setLastCurrentVersionUpdate(time);
- if (!keepCurrent)
- {
- // TODO: Implement GetMinecraftJarVersion function.
- QString newVersion = "Unknown";//javautils::GetMinecraftJarVersion(jar.absoluteFilePath());
- setCurrentVersionId(newVersion);
- }
-}
-qint64 LegacyInstance::lastCurrentVersionUpdate() const
-{
- I_D(LegacyInstance);
- return d->m_settings->get ( "lastVersionUpdate" ).value<qint64>();
-}
-void LegacyInstance::setLastCurrentVersionUpdate ( qint64 val )
-{
- I_D(LegacyInstance);
- d->m_settings->set ( "lastVersionUpdate", val );
-}
-bool LegacyInstance::shouldRebuild() const
-{
- I_D(LegacyInstance);
- return d->m_settings->get ( "NeedsRebuild" ).toBool();
-}
-void LegacyInstance::setShouldRebuild ( bool val )
-{
- I_D(LegacyInstance);
- d->m_settings->set ( "NeedsRebuild", val );
-}
-QString LegacyInstance::currentVersionId() const
-{
- I_D(LegacyInstance);
- return d->m_settings->get ( "JarVersion" ).toString();
-}
-
-void LegacyInstance::setCurrentVersionId ( QString val )
-{
- I_D(LegacyInstance);
- d->m_settings->set ( "JarVersion", val );
-}
-
-QString LegacyInstance::lwjglVersion() const
-{
- I_D(LegacyInstance);
- return d->m_settings->get ( "LwjglVersion" ).toString();
-}
-void LegacyInstance::setLWJGLVersion ( QString val )
-{
- I_D(LegacyInstance);
- d->m_settings->set ( "LwjglVersion", val );
-}
-QString LegacyInstance::intendedVersionId() const
-{
- I_D(LegacyInstance);
- return d->m_settings->get ( "IntendedJarVersion" ).toString();
-}
-bool LegacyInstance::setIntendedVersionId ( QString version )
-{
- settings().set("IntendedJarVersion", version);
- setShouldUpdate(true);
- return true;
-}
-bool LegacyInstance::shouldUpdate() const
-{
- I_D(LegacyInstance);
- QVariant var = settings().get ( "ShouldUpdate" );
- if ( !var.isValid() || var.toBool() == false )
- {
- return intendedVersionId() != currentVersionId();
- }
- return true;
-}
-void LegacyInstance::setShouldUpdate ( bool val )
-{
- settings().set ( "ShouldUpdate", val );
-}
diff --git a/backend/LegacyInstance.h b/backend/LegacyInstance.h
deleted file mode 100644
index 6c9a295f..00000000
--- a/backend/LegacyInstance.h
+++ /dev/null
@@ -1,85 +0,0 @@
-#pragma once
-
-#include "BaseInstance.h"
-
-class BaseUpdate;
-
-class LIBMULTIMC_EXPORT LegacyInstance : public BaseInstance
-{
- Q_OBJECT
-public:
-
- explicit LegacyInstance(const QString &rootDir, SettingsObject * settings, QObject *parent = 0);
-
- /// Path to the instance's minecraft.jar
- QString mcJar() const;
-
- //! Path to the instance's mcbackup.jar
- QString mcBackup() const;
-
- //! Path to the instance's modlist file.
- QString modListFile() const;
-
- ////// Directories //////
- QString savesDir() const;
- QString instModsDir() const;
- QString binDir() const;
- QString mlModsDir() const;
- QString coreModsDir() const;
- QString resourceDir() const;
-
- /*!
- * \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.
- */
- bool shouldUpdateCurrentVersion() const;
-
- /*!
- * \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.
- */
- void updateCurrentVersion(bool keepCurrent = false);
-
- /*!
- * Gets the last time that the current version was checked.
- * This is checked against the last modified time on the jar file to see if
- * the current version needs to be checked again.
- */
- qint64 lastCurrentVersionUpdate() const;
- void setLastCurrentVersionUpdate(qint64 val);
-
- /*!
- * Whether or not the instance's minecraft.jar needs to be rebuilt.
- * If this is true, when the instance launches, its jar mods will be
- * re-added to a fresh minecraft.jar file.
- */
- bool shouldRebuild() const;
- void setShouldRebuild(bool val);
-
- virtual QString currentVersionId() const;
- virtual void setCurrentVersionId(QString val);
-
- //! The version of LWJGL that this instance uses.
- QString lwjglVersion() const;
- /// st the version of LWJGL libs this instance will use
- void setLWJGLVersion(QString val);
-
- virtual QString intendedVersionId() const;
- virtual bool setIntendedVersionId ( QString version );
-
- virtual bool shouldUpdate() const;
- virtual void setShouldUpdate(bool val);
- virtual BaseUpdate* doUpdate();
-
- virtual MinecraftProcess* prepareForLaunch( QString user, QString session );
- virtual void cleanupAfterRun();
-}; \ No newline at end of file
diff --git a/backend/LegacyInstance_p.h b/backend/LegacyInstance_p.h
deleted file mode 100644
index ac367e20..00000000
--- a/backend/LegacyInstance_p.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#pragma once
-#include <QString>
-#include <settingsobject.h>
-#include "BaseInstance_p.h"
-
-class BaseInstance;
-
-struct LegacyInstancePrivate: public BaseInstancePrivate
-{
-}; \ No newline at end of file
diff --git a/backend/LegacyUpdate.cpp b/backend/LegacyUpdate.cpp
deleted file mode 100644
index a748bad3..00000000
--- a/backend/LegacyUpdate.cpp
+++ /dev/null
@@ -1,381 +0,0 @@
-#include "LegacyUpdate.h"
-#include "lists/LwjglVersionList.h"
-#include "lists/MinecraftVersionList.h"
-#include "BaseInstance.h"
-#include "LegacyInstance.h"
-#include "net/NetWorker.h"
-#include <pathutils.h>
-#include <quazip.h>
-#include <quazipfile.h>
-
-
-LegacyUpdate::LegacyUpdate ( BaseInstance* inst, QObject* parent ) : BaseUpdate ( inst, parent ) {}
-
-void LegacyUpdate::executeTask()
-{
- lwjglStart();
-}
-
-void LegacyUpdate::lwjglStart()
-{
- LegacyInstance * inst = (LegacyInstance *) m_inst;
-
- lwjglVersion = inst->lwjglVersion();
- lwjglTargetPath = PathCombine("lwjgl", lwjglVersion );
- lwjglNativesPath = PathCombine( lwjglTargetPath, "natives/");
-
- // if the 'done' file exists, we don't have to download this again
- QFileInfo doneFile(PathCombine(lwjglTargetPath, "done"));
- if(doneFile.exists())
- {
- jarStart();
- return;
- }
-
- auto &list = LWJGLVersionList::get();
- if(!list.isLoaded())
- {
- emitFailed("Too soon! Let the LWJGL list load :)");
- return;
- }
-
- setStatus("Downloading new LWJGL.");
- auto version = list.getVersion(lwjglVersion);
- if(!version)
- {
- emitFailed("Game update failed: the selected LWJGL version is invalid.");
- return;
- }
-
- QString url = version->url();
- QUrl realUrl(url);
- QString hostname = realUrl.host();
- auto &worker = NetWorker::spawn();
- QNetworkRequest req(realUrl);
- req.setRawHeader("Host", hostname.toLatin1());
- req.setHeader(QNetworkRequest::UserAgentHeader, "Wget/1.14 (linux-gnu)");
- QNetworkReply * rep = worker.get ( req );
-
- m_reply = QSharedPointer<QNetworkReply> (rep, &QObject::deleteLater);
- connect(rep, SIGNAL(downloadProgress(qint64,qint64)), SLOT(updateDownloadProgress(qint64,qint64)));
- connect(&worker, SIGNAL(finished(QNetworkReply*)), SLOT(lwjglFinished(QNetworkReply*)));
- //connect(rep, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(downloadError(QNetworkReply::NetworkError)));
-}
-
-void LegacyUpdate::lwjglFinished(QNetworkReply* reply)
-{
- if(m_reply != reply)
- {
- return;
- }
- if(reply->error() != QNetworkReply::NoError)
- {
- emitFailed( "Failed to download: "+
- reply->errorString()+
- "\nSometimes you have to wait a bit if you download many LWJGL versions in a row. YMMV");
- return;
- }
- auto &worker = NetWorker::spawn();
- //Here i check if there is a cookie for me in the reply and extract it
- QList<QNetworkCookie> cookies = qvariant_cast<QList<QNetworkCookie>>(reply->header(QNetworkRequest::SetCookieHeader));
- if(cookies.count() != 0)
- {
- //you must tell which cookie goes with which url
- worker.cookieJar()->setCookiesFromUrl(cookies, QUrl("sourceforge.net"));
- }
-
- //here you can check for the 302 or whatever other header i need
- QVariant newLoc = reply->header(QNetworkRequest::LocationHeader);
- if(newLoc.isValid())
- {
- auto &worker = NetWorker::spawn();
- QString redirectedTo = reply->header(QNetworkRequest::LocationHeader).toString();
- QUrl realUrl(redirectedTo);
- QString hostname = realUrl.host();
- QNetworkRequest req(redirectedTo);
- req.setRawHeader("Host", hostname.toLatin1());
- req.setHeader(QNetworkRequest::UserAgentHeader, "Wget/1.14 (linux-gnu)");
- QNetworkReply * rep = worker.get(req);
- connect(rep, SIGNAL(downloadProgress(qint64,qint64)), SLOT(updateDownloadProgress(qint64,qint64)));
- m_reply = QSharedPointer<QNetworkReply> (rep, &QObject::deleteLater);
- return;
- }
- QFile saveMe("lwjgl.zip");
- saveMe.open(QIODevice::WriteOnly);
- saveMe.write(m_reply->readAll());
- saveMe.close();
- setStatus("Installing new LWJGL...");
- extractLwjgl();
- jarStart();
-}
-void LegacyUpdate::extractLwjgl()
-{
- // make sure the directories are there
-
- bool success = ensurePathExists(lwjglNativesPath);
-
- if(!success)
- {
- emitFailed("Failed to extract the lwjgl libs - error when creating required folders.");
- return;
- }
-
- QuaZip zip("lwjgl.zip");
- if(!zip.open(QuaZip::mdUnzip))
- {
- emitFailed("Failed to extract the lwjgl libs - not a valid archive.");
- return;
- }
-
- // and now we are going to access files inside it
- QuaZipFile file(&zip);
- const QString jarNames[] = { "jinput.jar", "lwjgl_util.jar", "lwjgl.jar" };
- for(bool more=zip.goToFirstFile(); more; more=zip.goToNextFile())
- {
- if(!file.open(QIODevice::ReadOnly))
- {
- zip.close();
- emitFailed("Failed to extract the lwjgl libs - error while reading archive.");
- return;
- }
- QuaZipFileInfo info;
- QString name = file.getActualFileName();
- if(name.endsWith('/'))
- {
- file.close();
- continue;
- }
- QString destFileName;
- // Look for the jars
- for (int i = 0; i < 3; i++)
- {
- if (name.endsWith(jarNames[i]))
- {
- destFileName = PathCombine(lwjglTargetPath, jarNames[i]);
- }
- }
- // Not found? look for the natives
- if(destFileName.isEmpty())
- {
-#ifdef Q_OS_WIN32
- QString nativesDir = "windows";
-#elif Q_OS_MAC
- QString nativesDir = "macosx";
-#else
- QString nativesDir = "linux";
-#endif
- if (name.contains(nativesDir))
- {
- int lastSlash = name.lastIndexOf('/');
- int lastBackSlash = name.lastIndexOf('/');
- if(lastSlash != -1)
- name = name.mid(lastSlash+1);
- else if(lastBackSlash != -1)
- name = name.mid(lastBackSlash+1);
- destFileName = PathCombine(lwjglNativesPath, name);
- }
- }
- // Now if destFileName is still empty, go to the next file.
- if (!destFileName.isEmpty())
- {
- setStatus("Installing new LWJGL - Extracting " + name);
- QFile output(destFileName);
- output.open(QIODevice::WriteOnly);
- output.write(file.readAll()); // FIXME: wste of memory!?
- output.close();
- }
- file.close(); // do not forget to close!
- }
- zip.close();
- m_reply.clear();
- QFile doneFile(PathCombine(lwjglTargetPath, "done"));
- doneFile.open(QIODevice::WriteOnly);
- doneFile.write("done.");
- doneFile.close();
-}
-
-void LegacyUpdate::lwjglFailed()
-{
- emitFailed("Bad stuff happened while trying to get the lwjgl libs...");
-}
-
-void LegacyUpdate::jarStart()
-{
- setStatus("Checking ...");
- LegacyInstance * inst = (LegacyInstance *) m_inst;
- QString current_version_id = inst->currentVersionId();
- QString intended_version_id = inst->intendedVersionId();
- bool shouldUpdate = inst->shouldUpdate();
- if(!shouldUpdate)
- {
- emitSucceeded();
- return;
- }
-
- // nuke the backup file, we are replacing the base jar anyway
- QFile mc_backup(inst->mcBackup());
- if (mc_backup.exists())
- {
- mc_backup.remove();
- }
-
- // Get a pointer to the version object that corresponds to the instance's version.
- auto targetVersion = MinecraftVersionList::getMainList().findVersion(intended_version_id);
-
- if(!targetVersion)
- {
- emitFailed("Not a valid version:" + intended_version_id);
- return;
- }
-
- // Make directories
- QDir binDir(inst->binDir());
- if (!binDir.exists() && !binDir.mkpath("."))
- {
- emitFailed("Failed to create bin folder.");
- return;
- }
-
- // Build a list of URLs that will need to be downloaded.
- setStatus("Downloading new minecraft.jar");
-
- // This will be either 'minecraft' or the version number, depending on where
- // we're downloading from.
- QString jarFilename = "minecraft";
- QString download_path = PathCombine(inst->minecraftRoot(), "bin/minecraft.jar");
-
- QString urlstr("http://s3.amazonaws.com/Minecraft.Download/versions/");
- urlstr += targetVersion->descriptor + "/" + targetVersion->descriptor + ".jar";
- auto dljob = DownloadJob::create(QUrl(urlstr), download_path);
-
- legacyDownloadJob.reset(new JobList());
- legacyDownloadJob->add(dljob);
- connect(legacyDownloadJob.data(), SIGNAL(finished()), SLOT(jarFinished()));
- connect(legacyDownloadJob.data(), SIGNAL(failed()), SLOT(jarFailed()));
- connect(legacyDownloadJob.data(), SIGNAL(progress(qint64,qint64)), SLOT(updateDownloadProgress(qint64,qint64)));
- download_queue.enqueue(legacyDownloadJob);
-}
-
-void LegacyUpdate::jarFinished()
-{
- // process the jar
- emitSucceeded();
-}
-
-void LegacyUpdate::jarFailed()
-{
- // bad, bad
- emitFailed("Failed to download the minecraft jar. Try again later.");
-}
-
-void LegacyUpdate::ModTheJar()
-{
- /*
- LegacyInstance * inst = (LegacyInstance *) m_inst;
- // Get the mod list
- auto modList = inst->getJarModList();
-
- QFileInfo mcBin(inst->binDir());
- QFileInfo mcJar(inst->mcJar());
- QFileInfo mcBackup(inst->mcBackup());
-
- // Nothing to do if there are no jar mods to install, no backup and just the mc jar
- if(mcJar.isFile() && !mcBackup.exists() && modList->empty())
- {
- inst->setShouldRebuild(false);
- emitSucceeded();
- return;
- }
-
- setStatus("Installing mods - backing up minecraft.jar...");
- if (!mcBackup.exists() && !QFile::copy(mcJar.absoluteFilePath(), mcBackup.absoluteFilePath()) )
- {
- emitFailed("Failed to back up minecraft.jar");
- return;
- }
-
- if (mcJar.isFile() && !QFile::remove(mcJar.absoluteFilePath()))
- {
- emitFailed("Failed to delete old minecraft.jar");
- return;
- }
-
- setStatus("Installing mods - Opening minecraft.jar");
-
- wxFFileOutputStream jarStream(mcJar.absoluteFilePath());
- wxZipOutputStream zipOut(jarStream);
-
- // Files already added to the jar.
- // These files will be skipped.
- QSet<QString> addedFiles;
-
- // Modify the jar
- setStatus("Installing mods - Adding mod files...");
- for (ModList::const_reverse_iterator iter = modList->rbegin(); iter != modList->rend(); iter++)
- {
- wxFileName modFileName = iter->GetFileName();
- setStatus("Installing mods - Adding " + modFileName.GetFullName());
- if (iter->GetModType() == Mod::ModType::MOD_ZIPFILE)
- {
- wxFFileInputStream modStream(modFileName.GetFullPath());
- wxZipInputStream zipStream(modStream);
- std::unique_ptr<wxZipEntry> entry;
- while (entry.reset(zipStream.GetNextEntry()), entry.get() != NULL)
- {
- if (entry->IsDir())
- continue;
-
- wxString name = entry->GetName();
- if (addedFiles.count(name) == 0)
- {
- if (!zipOut.CopyEntry(entry.release(), zipStream))
- break;
- addedFiles.insert(name);
- }
- }
- }
- else
- {
- wxFileName destFileName = modFileName;
- destFileName.MakeRelativeTo(m_inst->GetInstModsDir().GetFullPath());
- wxString destFile = destFileName.GetFullPath();
-
- if (addedFiles.count(destFile) == 0)
- {
- wxFFileInputStream input(modFileName.GetFullPath());
- zipOut.PutNextEntry(destFile);
- zipOut.Write(input);
-
- addedFiles.insert(destFile);
- }
- }
- }
-
- {
- wxFFileInputStream inStream(mcBackup.GetFullPath());
- wxZipInputStream zipIn(inStream);
-
- std::auto_ptr<wxZipEntry> entry;
- while (entry.reset(zipIn.GetNextEntry()), entry.get() != NULL)
- {
- wxString name = entry->GetName();
-
- if (!name.Matches("META-INF*") &&
- addedFiles.count(name) == 0)
- {
- if (!zipOut.CopyEntry(entry.release(), zipIn))
- break;
- addedFiles.insert(name);
- }
- }
- }
-
- // Recompress the jar
- TaskStep(); // STEP 3
- SetStatus(_("Installing mods - Recompressing jar..."));
-
- inst->SetNeedsRebuild(false);
- inst->UpdateVersion(true);
- return (ExitCode)1;
- */
-} \ No newline at end of file
diff --git a/backend/LegacyUpdate.h b/backend/LegacyUpdate.h
deleted file mode 100644
index a48189a6..00000000
--- a/backend/LegacyUpdate.h
+++ /dev/null
@@ -1,68 +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.
- */
-
-#pragma once
-
-#include <QObject>
-#include <QList>
-#include <QUrl>
-
-#include "net/DownloadJob.h"
-#include "tasks/Task.h"
-#include "libmmc_config.h"
-#include "BaseUpdate.h"
-
-class MinecraftVersion;
-class BaseInstance;
-
-class LIBMULTIMC_EXPORT LegacyUpdate : public BaseUpdate
-{
- Q_OBJECT
-public:
- explicit LegacyUpdate(BaseInstance *inst, QObject *parent = 0);
- virtual void executeTask();
-
-private slots:
- void lwjglStart();
- void lwjglFinished( QNetworkReply* );
- void lwjglFailed();
-
- void jarStart();
- void jarFinished();
- void jarFailed();
-
- void extractLwjgl();
-
- void ModTheJar();
-private:
-
- QSharedPointer<QNetworkReply> m_reply;
-
- // target version, determined during this task
- // MinecraftVersion *targetVersion;
- QString lwjglURL;
- QString lwjglVersion;
-
- QString lwjglTargetPath;
- QString lwjglNativesPath;
-private:
- JobListPtr legacyDownloadJob;
- JobListQueue download_queue;
-
- // target version, determined during this task
- QSharedPointer<MinecraftVersion> targetVersion;
-};
-
-
diff --git a/backend/MinecraftProcess.cpp b/backend/MinecraftProcess.cpp
deleted file mode 100644
index d34be835..00000000
--- a/backend/MinecraftProcess.cpp
+++ /dev/null
@@ -1,169 +0,0 @@
-/* Copyright 2013 MultiMC Contributors
- *
- * Authors: Orochimarufan <orochimarufan.x3@gmail.com>
- *
- * 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 "MinecraftProcess.h"
-
-#include <QDataStream>
-#include <QFile>
-#include <QDir>
-//#include <QImage>
-#include <QProcessEnvironment>
-
-#include "BaseInstance.h"
-
-#include "osutils.h"
-#include "pathutils.h"
-#include "cmdutils.h"
-
-#define IBUS "@im=ibus"
-
-// constructor
-MinecraftProcess::MinecraftProcess( BaseInstance* inst ) :
- m_instance(inst)
-{
- connect(this, SIGNAL(finished(int, QProcess::ExitStatus)), SLOT(finish(int, QProcess::ExitStatus)));
-
- // prepare the process environment
- QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
-
-#ifdef LINUX
- // Strip IBus
- if (env.value("XMODIFIERS").contains(IBUS))
- env.insert("XMODIFIERS", env.value("XMODIFIERS").replace(IBUS, ""));
-#endif
-
- // export some infos
- env.insert("INST_NAME", inst->name());
- env.insert("INST_ID", inst->id());
- env.insert("INST_DIR", QDir(inst->instanceRoot()).absolutePath());
-
- this->setProcessEnvironment(env);
- m_prepostlaunchprocess.setProcessEnvironment(env);
-
- // std channels
- connect(this, SIGNAL(readyReadStandardError()), SLOT(on_stdErr()));
- connect(this, SIGNAL(readyReadStandardOutput()), SLOT(on_stdOut()));
-}
-
-void MinecraftProcess::setMinecraftArguments ( QStringList args )
-{
- m_args = args;
-}
-
-void MinecraftProcess::setMinecraftWorkdir ( QString path )
-{
- QDir mcDir(path);
- this->setWorkingDirectory(mcDir.absolutePath());
- m_prepostlaunchprocess.setWorkingDirectory(mcDir.absolutePath());
-}
-
-
-// console window
-void MinecraftProcess::on_stdErr()
-{
- QByteArray data = readAllStandardError();
- QString str = m_err_leftover + QString::fromLocal8Bit(data);
- m_err_leftover.clear();
- QStringList lines = str.split("\n");
- bool complete = str.endsWith("\n");
-
- for(int i = 0; i < lines.size() - 1; i++)
- {
- QString & line = lines[i];
- MessageLevel::Enum level = MessageLevel::Error;
- if(line.contains("[INFO]") || line.contains("[CONFIG]") || line.contains("[FINE]") || line.contains("[FINER]") || line.contains("[FINEST]") )
- level = MessageLevel::Message;
- if(line.contains("[SEVERE]") || line.contains("[WARNING]") || line.contains("[STDERR]"))
- level = MessageLevel::Error;
- emit log(lines[i].toLocal8Bit(), level);
- }
- if(!complete)
- m_err_leftover = lines.last();
-}
-
-void MinecraftProcess::on_stdOut()
-{
- QByteArray data = readAllStandardOutput();
- QString str = m_out_leftover + QString::fromLocal8Bit(data);
- m_out_leftover.clear();
- QStringList lines = str.split("\n");
- bool complete = str.endsWith("\n");
-
- for(int i = 0; i < lines.size() - 1; i++)
- {
- QString & line = lines[i];
- emit log(lines[i].toLocal8Bit(), MessageLevel::Message);
- }
- if(!complete)
- m_out_leftover = lines.last();
-}
-
-// exit handler
-void MinecraftProcess::finish(int code, ExitStatus status)
-{
- if (status != NormalExit)
- {
- //TODO: error handling
- }
-
- emit log("Minecraft exited.");
-
- m_prepostlaunchprocess.processEnvironment().insert("INST_EXITCODE", QString(code));
-
- // run post-exit
- if (!m_instance->settings().get("PostExitCommand").toString().isEmpty())
- {
- m_prepostlaunchprocess.start(m_instance->settings().get("PostExitCommand").toString());
- m_prepostlaunchprocess.waitForFinished();
- if (m_prepostlaunchprocess.exitStatus() != NormalExit)
- {
- //TODO: error handling
- }
- }
- m_instance->cleanupAfterRun();
- emit ended();
-}
-
-void MinecraftProcess::launch()
-{
- if (!m_instance->settings().get("PreLaunchCommand").toString().isEmpty())
- {
- m_prepostlaunchprocess.start(m_instance->settings().get("PreLaunchCommand").toString());
- m_prepostlaunchprocess.waitForFinished();
- if (m_prepostlaunchprocess.exitStatus() != NormalExit)
- {
- //TODO: error handling
- return;
- }
- }
-
- m_instance->setLastLaunch();
-
- emit log(QString("Minecraft folder is: '%1'").arg(workingDirectory()));
- QString JavaPath = m_instance->settings().get("JavaPath").toString();
- emit log(QString("Java path: '%1'").arg(JavaPath));
- emit log(QString("Arguments: '%1'").arg(m_args.join("' '")));
- start(JavaPath, m_args);
- if (!waitForStarted())
- {
- emit log("Could not launch minecraft!");
- return;
- //TODO: error handling
- }
-}
-
-
diff --git a/backend/MinecraftProcess.h b/backend/MinecraftProcess.h
deleted file mode 100644
index 756d2de5..00000000
--- a/backend/MinecraftProcess.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/* Copyright 2013 MultiMC Contributors
- *
- * Authors: Orochimarufan <orochimarufan.x3@gmail.com>
- *
- * 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.
- */
-#pragma once
-
-#include <QProcess>
-
-#include "BaseInstance.h"
-
-#include "libmmc_config.h"
-
-/**
- * @brief the MessageLevel Enum
- * defines what level a message is
- */
-namespace MessageLevel {
-enum LIBMULTIMC_EXPORT Enum {
- MultiMC, /**< MultiMC Messages */
- Debug, /**< Debug Messages */
- Info, /**< Info Messages */
- Message, /**< Standard Messages */
- Warning, /**< Warnings */
- Error, /**< Errors */
- Fatal /**< Fatal Errors */
-};
-}
-
-/**
- * @file data/minecraftprocess.h
- * @brief The MinecraftProcess class
- */
-class LIBMULTIMC_EXPORT MinecraftProcess : public QProcess
-{
- Q_OBJECT
-public:
- /**
- * @brief MinecraftProcess constructor
- * @param inst the Instance pointer to launch
- */
- MinecraftProcess(BaseInstance *inst);
-
- /**
- * @brief launch minecraft
- */
- void launch();
-
- void setMinecraftWorkdir(QString path);
-
- void setMinecraftArguments(QStringList args);
-
-signals:
- /**
- * @brief emitted when mc has finished and the PostLaunchCommand was run
- */
- void ended();
-
- /**
- * @brief emitted when we want to log something
- * @param text the text to log
- * @param level the level to log at
- */
- void log(QString text, MessageLevel::Enum level=MessageLevel::MultiMC);
-
-protected:
- BaseInstance *m_instance;
- QStringList m_args;
- QString m_err_leftover;
- QString m_out_leftover;
- QProcess m_prepostlaunchprocess;
-
-protected slots:
- void finish(int, QProcess::ExitStatus status);
- void on_stdErr();
- void on_stdOut();
-};
diff --git a/backend/MinecraftVersion.h b/backend/MinecraftVersion.h
deleted file mode 100644
index 5cd29925..00000000
--- a/backend/MinecraftVersion.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/* Copyright 2013 Andrew Okin
- *
- * 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.
- */
-
-#pragma once
-
-#include "libmmc_config.h"
-
-#include "InstanceVersion.h"
-#include <QStringList>
-
-struct LIBMULTIMC_EXPORT MinecraftVersion : public InstVersion
-{
- // From InstVersion:
- /*
- QString m_descriptor;
- QString m_name;
- qint64 m_timestamp;
- */
-
- /// The URL that this version will be downloaded from. maybe.
- QString download_url;
-
- /// This version's type. Used internally to identify what kind of version this is.
- enum VersionType
- {
- OneSix,
- Legacy,
- Nostalgia
- } type;
-
- /// is this the latest version?
- bool is_latest = false;
-
- /// is this a snapshot?
- bool is_snapshot = false;
-
- virtual QString typeString() const
- {
- QStringList pre_final;
- if(is_latest == true)
- {
- pre_final.append("Latest");
- }
- switch (type)
- {
- case OneSix:
- pre_final.append("OneSix");
- break;
- case Legacy:
- pre_final.append("Legacy");
- break;
- case Nostalgia:
- pre_final.append("Nostalgia");
- break;
-
- default:
- pre_final.append(QString("Type(%1)").arg(type));
- break;
- }
- if(is_snapshot == true)
- {
- pre_final.append("Snapshot");
- }
- return pre_final.join(' ');
- }
-};
diff --git a/backend/Mod.cpp b/backend/Mod.cpp
deleted file mode 100644
index 652bbda7..00000000
--- a/backend/Mod.cpp
+++ /dev/null
@@ -1,264 +0,0 @@
-//
-// Copyright 2012 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 "Mod.h"
-#include <pathutils.h>
-#include <QDir>
-
-Mod::Mod( const QFileInfo& file )
-{
- repath(file);
-}
-
-void Mod::repath ( const QFileInfo& file )
-{
- m_file = file;
- m_name = file.baseName();
- m_id = file.fileName();
-
- m_type = Mod::MOD_UNKNOWN;
- if (m_file.isDir())
- m_type = MOD_FOLDER;
- else if (m_file.isFile())
- {
- QString ext = m_file.suffix().toLower();
- if (ext == "zip" || ext == "jar")
- m_type = MOD_ZIPFILE;
- else
- m_type = MOD_SINGLEFILE;
- }
-
- /*
- switch (modType)
- {
- case MOD_ZIPFILE:
- {
- wxFFileInputStream fileIn(modFile.GetFullPath());
- wxZipInputStream zipIn(fileIn);
-
- std::auto_ptr<wxZipEntry> entry;
-
- bool is_forge = false;
- while(true)
- {
- entry.reset(zipIn.GetNextEntry());
- if (entry.get() == nullptr)
- break;
- if(entry->GetInternalName().EndsWith("mcmod.info"))
- break;
- if(entry->GetInternalName().EndsWith("forgeversion.properties"))
- {
- is_forge = true;
- break;
- }
- }
-
- if (entry.get() != nullptr)
- {
- // Read the info file into text
- wxString infoFileData;
- wxStringOutputStream stringOut(&infoFileData);
- zipIn.Read(stringOut);
- if(!is_forge)
- ReadModInfoData(infoFileData);
- else
- ReadForgeInfoData(infoFileData);
- }
- }
- break;
-
- case MOD_FOLDER:
- {
- wxString infoFile = Path::Combine(modFile, "mcmod.info");
- if (!wxFileExists(infoFile))
- {
- infoFile = wxEmptyString;
-
- wxDir modDir(modFile.GetFullPath());
-
- if (!modDir.IsOpened())
- {
- wxLogError(_("Can't fine mod info file. Failed to open mod folder."));
- break;
- }
-
- wxString currentFile;
- if (modDir.GetFirst(&currentFile))
- {
- do
- {
- if (currentFile.EndsWith("mcmod.info"))
- {
- infoFile = Path::Combine(modFile.GetFullPath(), currentFile);
- break;
- }
- } while (modDir.GetNext(&currentFile));
- }
- }
-
- if (infoFile != wxEmptyString && wxFileExists(infoFile))
- {
- wxString infoStr;
- wxFFileInputStream fileIn(infoFile);
- wxStringOutputStream strOut(&infoStr);
- fileIn.Read(strOut);
- ReadModInfoData(infoStr);
- }
- }
- break;
- }
-*/
-}
-
-
-/*
-void ReadModInfoData(QString info)
-{
- using namespace boost::property_tree;
-
- // Read the data
- ptree ptRoot;
-
- std::stringstream stringIn(cStr(info));
- try
- {
- read_json(stringIn, ptRoot);
-
- ptree pt = ptRoot.get_child(ptRoot.count("modlist") == 1 ? "modlist" : "").begin()->second;
-
- modID = wxStr(pt.get<std::string>("modid"));
- modName = wxStr(pt.get<std::string>("name"));
- modVersion = wxStr(pt.get<std::string>("version"));
- }
- catch (json_parser_error e)
- {
- // Silently fail...
- }
- catch (ptree_error e)
- {
- // Silently fail...
- }
-}
-*/
-
-// FIXME: abstraction violated.
-/*
-void Mod::ReadForgeInfoData(QString infoFileData)
-{
- using namespace boost::property_tree;
-
- // Read the data
- ptree ptRoot;
- modName = "Minecraft Forge";
- modID = "Forge";
- std::stringstream stringIn(cStr(infoFileData));
- try
- {
- read_ini(stringIn, ptRoot);
- wxString major, minor, revision, build;
- // BUG: boost property tree is bad. won't let us get a key with dots in it
- // Likely cause = treating the dots as path separators.
- for (auto iter = ptRoot.begin(); iter != ptRoot.end(); iter++)
- {
- auto &item = *iter;
- std::string key = item.first;
- std::string value = item.second.get_value<std::string>();
- if(key == "forge.major.number")
- major = value;
- if(key == "forge.minor.number")
- minor = value;
- if(key == "forge.revision.number")
- revision = value;
- if(key == "forge.build.number")
- build = value;
- }
- modVersion.Empty();
- modVersion << major << "." << minor << "." << revision << "." << build;
- }
- catch (json_parser_error e)
- {
- std::cerr << e.what();
- }
- catch (ptree_error e)
- {
- std::cerr << e.what();
- }
-}
-*/
-
-bool Mod::replace ( Mod& with )
-{
- if(!destroy())
- return false;
- bool success = false;
- auto t = with.type();
- if(t == MOD_ZIPFILE || t == MOD_SINGLEFILE)
- {
- success = QFile::copy(with.m_file.filePath(), m_file.path());
- }
- if(t == MOD_FOLDER)
- {
- success = copyPath(with.m_file.filePath(), m_file.path());
- }
- if(success)
- {
- m_id = with.m_id;
- m_mcversion = with.m_mcversion;
- m_type = with.m_type;
- m_name = with.m_name;
- m_version = with.m_version;
- }
- return success;
-}
-
-bool Mod::destroy()
-{
- if(m_type == MOD_FOLDER)
- {
- QDir d(m_file.filePath());
- if(d.removeRecursively())
- {
- m_type = MOD_UNKNOWN;
- return true;
- }
- return false;
- }
- else if (m_type == MOD_SINGLEFILE || m_type == MOD_ZIPFILE)
- {
- QFile f(m_file.filePath());
- if(f.remove())
- {
- m_type = MOD_UNKNOWN;
- return true;
- }
- return false;
- }
- return true;
-}
-
-
-QString Mod::version() const
-{
- switch(type())
- {
- case MOD_ZIPFILE:
- return m_version;
- case MOD_FOLDER:
- return "Folder";
- case MOD_SINGLEFILE:
- return "File";
- }
-}
diff --git a/backend/Mod.h b/backend/Mod.h
deleted file mode 100644
index d9d90426..00000000
--- a/backend/Mod.h
+++ /dev/null
@@ -1,69 +0,0 @@
-//
-// Copyright 2012 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.
-//
-
-#pragma once
-#include <QFileInfo>
-
-class Mod
-{
-public:
- enum ModType
- {
- MOD_UNKNOWN, //!< Indicates an unspecified mod type.
- MOD_ZIPFILE, //!< The mod is a zip file containing the mod's class files.
- MOD_SINGLEFILE, //!< The mod is a single file (not a zip file).
- MOD_FOLDER, //!< The mod is in a folder on the filesystem.
- };
-
- Mod(const QFileInfo &file);
-
- QFileInfo filename() const { return m_file; }
- QString id() const { return m_id; }
- ModType type() const { return m_type; }
- QString mcversion() const;
- bool valid() {return m_type != MOD_UNKNOWN;}
-
- QString version() const;
-
- // delete all the files of this mod
- bool destroy();
- // replace this mod with a copy of the other
- bool replace(Mod & with);
- // change the mod's filesystem path (used by mod lists for *MAGIC* purposes)
- void repath(const QFileInfo &file);
-
-
- bool operator ==(const Mod &other) const
- {
- return filename() == other.filename();
- }
-
-protected:
-
- //FIXME: what do do with those? HMM...
- /*
- void ReadModInfoData(QString info);
- void ReadForgeInfoData(QString infoFileData);
- */
-
- QFileInfo m_file;
- QString m_id;
- QString m_name;
- QString m_version;
- QString m_mcversion;
-
- ModType m_type;
-};
diff --git a/backend/ModList.cpp b/backend/ModList.cpp
deleted file mode 100644
index 851eb940..00000000
--- a/backend/ModList.cpp
+++ /dev/null
@@ -1,418 +0,0 @@
-//
-// Copyright 2012 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 "ModList.h"
-#include "LegacyInstance.h"
-#include <pathutils.h>
-
-ModList::ModList ( const QString& dir ) : QObject(), m_dir(dir)
-{
- m_dir.setFilter(QDir::Readable | QDir::NoDotAndDotDot | QDir::Files | QDir::Dirs | QDir::NoSymLinks);
- m_dir.setSorting(QDir::Name);
- update();
-}
-
-bool ModList::update()
-{
- if (!isValid())
- return false;
-
- bool initial = mods.empty();
-
- bool listChanged = false;
-
- auto list = m_dir.entryInfoList();
- for(auto entry: list)
- {
- Mod mod(entry);
- if (initial || !mods.contains(mod))
- {
- mods.push_back(mod);
- listChanged = true;
- }
- }
- return listChanged;
-}
-
-bool ModList::isValid()
-{
- return m_dir.exists() && m_dir.isReadable();
-}
-
-bool ModList::installMod ( const QFileInfo& filename, size_t index )
-{
- if(!filename.exists() || !filename.isReadable())
- {
- return false;
- }
- Mod m(filename);
- if(!m.valid())
- return false;
-
- // if it's already there, replace the original mod (in place)
- int idx = mods.indexOf(m);
- if(idx != -1)
- {
- if(mods[idx].replace(m))
- {
- emit changed();
- return true;
- }
- return false;
- }
-
- auto type = m.type();
- if(type == Mod::MOD_UNKNOWN)
- return false;
- if(type == Mod::MOD_SINGLEFILE || type == Mod::MOD_ZIPFILE)
- {
- QString newpath = PathCombine(m_dir.path(), filename.fileName());
- if(!QFile::copy(filename.filePath(), newpath))
- return false;
- m.repath(newpath);
- mods.append(m);
- emit changed();
- return true;
- }
- else if(type == Mod::MOD_FOLDER)
- {
- QString newpath = PathCombine(m_dir.path(), filename.fileName());
- if(!copyPath(filename.filePath(), newpath))
- return false;
- m.repath(newpath);
- mods.append(m);
- emit changed();
- return true;
- }
- return false;
-}
-
-bool ModList::deleteMod ( size_t index )
-{
- if(index >= mods.size())
- return false;
- Mod & m = mods[index];
- if(m.destroy())
- {
- mods.erase(mods.begin() + index);
- emit changed();
- return true;
- }
- return false;
-}
-
-
-/*
-ModList::ModList(const QString &dir)
- : modsFolder(dir)
-{
-
-}
-
-bool ModList::update(bool quickLoad)
-{
- bool listChanged = false;
-
- // Check for mods in the list whose files do not exist and remove them from the list.
- // If doing a quickLoad, erase the whole list.
- for (size_t i = 0; i < size(); i++)
- {
- if (quickLoad || !at(i).GetFileName().FileExists())
- {
- erase(begin() + i);
- i--;
- listChanged = true;
- }
- }
-
- // Add any mods in the mods folder that aren't already in the list.
- if (LoadModListFromDir(QString(), quickLoad))
- listChanged = true;
-
- return listChanged;
-}
-
-bool ModList::LoadModListFromDir(const QString& loadFrom, bool quickLoad)
-{
- QString dir(loadFrom.isEmpty() ? modsFolder : loadFrom);
-
- QDir modDir(dir);
- if (!modDir.exists())
- return false;
-
- bool listChanged = false;
-
- auto list = modDir.entryInfoList(QDir::Readable|QDir::NoDotAndDotDot, QDir::Name);
- for(auto currentFile: list)
- {
- if (currentFile.isFile())
- {
- if (quickLoad || FindByFilename(currentFile.absoluteFilePath()) == nullptr)
- {
- Mod mod(currentFile.absoluteFilePath());
- push_back(mod);
- listChanged = true;
- }
- }
- else if (currentFile.isDir())
- {
- if (LoadModListFromDir(currentFile.absoluteFilePath()))
- listChanged = true;
- }
- }
-
- return listChanged;
-}
-
-Mod *ModList::FindByFilename(const QString& filename)
-{
- // Search the list for a mod with the given filename.
- for (auto iter = begin(); iter != end(); ++iter)
- {
- if (iter->GetFileName() == QFileInfo(filename))
- return &(*iter);
- }
-
- // If nothing is found, return nullptr.
- return nullptr;
-}
-
-int ModList::FindIndexByFilename(const QString& filename)
-{
- // Search the list for a mod with the given filename.
- int i = 0;
- for (auto iter = begin(); iter != end(); ++iter, i++)
- {
- if (iter->GetFileName() == QFileInfo(filename))
- return i;
- }
-
- // If nothing is found, return nullptr.
- return -1;
-}
-
-Mod* ModList::FindByID(const QString& modID, const QString& modVersion)
-{
- // Search the list for a mod that matches
- for (auto iter = begin(); iter != end(); ++iter)
- {
- QString ID = iter->GetModID();
- QString version = iter->GetModVersion();
- if ( ID == modID && version == modVersion)
- return &(*iter);
- }
-
- // If nothing is found, return nullptr.
- return nullptr;
-}
-
-void ModList::LoadFromFile(const QString& file)
-{
- if (!wxFileExists(file))
- return;
-
- wxFFileInputStream inputStream(file);
- wxArrayString modListFile = ReadAllLines(inputStream);
-
- for (wxArrayString::iterator iter = modListFile.begin(); iter != modListFile.end(); iter++)
- {
- // Normalize the path to the instMods dir.
- wxFileName modFile(*iter);
- modFile.Normalize(wxPATH_NORM_ALL, modsFolder);
- modFile.MakeRelativeTo();
- // if the file is gone, do not load it
- if(!modFile.Exists())
- {
- continue;
- }
-
- if (FindByFilename(modFile.GetFullPath()) == nullptr)
- {
- push_back(Mod(modFile));
- }
- }
-}
-
-void ModList::SaveToFile(const QString& file)
-{
- QString text;
- for (iterator iter = begin(); iter != end(); ++iter)
- {
- wxFileName modFile = iter->GetFileName();
- modFile.MakeRelativeTo(modsFolder);
- text.append(modFile.GetFullPath());
- text.append("\n");
- }
-
- wxTempFileOutputStream out(file);
- WriteAllText(out, text);
- out.Commit();
-}
-
-bool ModList::InsertMod(size_t index, const QString &filename, const QString& saveToFile)
-{
- QFileInfo source(filename);
- QFileInfo dest(PathCombine(modsFolder, source.fileName()));
-
- if (source != dest)
- {
- QFile::copy(source.absoluteFilePath(), dest.absoluteFilePath());
- }
-
- int oldIndex = FindIndexByFilename(dest.absoluteFilePath());
-
- if (oldIndex != -1)
- {
- erase(begin() + oldIndex);
- }
-
- if (index >= size())
- push_back(Mod(dest));
- else
- insert(begin() + index, Mod(dest));
-
- if (!saveToFile.isEmpty())
- SaveToFile(saveToFile);
-
- return true;
-}
-
-bool ModList::DeleteMod(size_t index, const QString& saveToFile)
-{
- Mod *mod = &at(index);
- if(mod->GetModType() == Mod::MOD_FOLDER)
- {
- QDir dir(mod->GetFileName().absoluteFilePath());
- if(dir.removeRecursively())
- {
- erase(begin() + index);
-
- if (!saveToFile.isEmpty())
- SaveToFile(saveToFile);
-
- return true;
- }
- else
- {
- // wxLogError(_("Failed to delete mod."));
- }
- }
- else if (QFile(mod->GetFileName().absoluteFilePath()).remove())
- {
- erase(begin() + index);
-
- if (!saveToFile.isEmpty())
- SaveToFile(saveToFile);
-
- return true;
- }
- else
- {
- // wxLogError(_("Failed to delete mod."));
- }
- return false;
-}
-
-bool JarModList::InsertMod(size_t index, const QString &filename, const QString& saveToFile)
-{
- QString saveFile = saveToFile;
- if (saveToFile.isEmpty())
- saveFile = m_inst->GetModListFile().GetFullPath();
-
- if (ModList::InsertMod(index, filename, saveFile))
- {
- m_inst->setLWJGLVersion(true);
- return true;
- }
- return false;
-}
-
-bool JarModList::DeleteMod(size_t index, const QString& saveToFile)
-{
- QString saveFile = saveToFile;
- if (saveToFile.IsEmpty())
- saveFile = m_inst->GetModListFile().GetFullPath();
-
- if (ModList::DeleteMod(index, saveFile))
- {
- m_inst->SetNeedsRebuild();
- return true;
- }
- return false;
-}
-
-bool JarModList::UpdateModList(bool quickLoad)
-{
- if (ModList::UpdateModList(quickLoad))
- {
- m_inst->SetNeedsRebuild();
- return true;
- }
- return false;
-}
-
-bool FolderModList::LoadModListFromDir(const QString& loadFrom, bool quickLoad)
-{
- QString dir(loadFrom.IsEmpty() ? modsFolder : loadFrom);
-
- if (!wxDirExists(dir))
- return false;
-
- bool listChanged = false;
- wxDir modDir(dir);
-
- if (!modDir.IsOpened())
- {
- wxLogError(_("Failed to open directory: ") + dir);
- return false;
- }
-
- QString currentFile;
- if (modDir.GetFirst(&currentFile))
- {
- do
- {
- wxFileName modFile(Path::Combine(dir, currentFile));
-
- if (wxFileExists(modFile.GetFullPath()) || wxDirExists(modFile.GetFullPath()))
- {
- if (quickLoad || FindByFilename(modFile.GetFullPath()) == nullptr)
- {
- Mod mod(modFile.GetFullPath());
- push_back(mod);
- listChanged = true;
- }
- }
- } while (modDir.GetNext(&currentFile));
- }
-
- return listChanged;
-}
-
-bool ModNameSort (const Mod & i,const Mod & j)
-{
- if(i.GetModType() == j.GetModType())
- return (i.GetName().toLower() < j.GetName().toLower());
- return (i.GetModType() < j.GetModType());
-}
-
-bool FolderModList::UpdateModList ( bool quickLoad )
-{
- bool changed = ModList::UpdateModList(quickLoad);
- std::sort(begin(),end(),ModNameSort);
- return changed;
-}
-*/
diff --git a/backend/ModList.h b/backend/ModList.h
deleted file mode 100644
index bf65a080..00000000
--- a/backend/ModList.h
+++ /dev/null
@@ -1,75 +0,0 @@
-//
-// Copyright 2012 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
-//
-#pragma once
-
-class LegacyInstance;
-class BaseInstance;
-#include <QList>
-#include <QString>
-#include <QDir>
-
-#include "Mod.h"
-
-/**
- * A basic mod list.
- * Backed by a folder.
- */
-class ModList : public QObject
-{
- Q_OBJECT
-public:
- ModList(const QString& dir = QString());
-
- size_t size() { return mods.size(); };
- Mod& operator[](size_t index) { return mods[index]; };
-
- /// Reloads the mod list and returns true if the list changed.
- virtual bool update();
-
- /// Adds the given mod to the list at the given index.
- virtual bool installMod(const QFileInfo& filename, size_t index = 0);
-
- /// Deletes the mod at the given index.
- virtual bool deleteMod(size_t index);
-
- /**
- * move the mod at index to the position N
- * 0 is the beginning of the list, length() is the end of the list.
- */
- virtual bool moveMod(size_t from, size_t to) { return false; };
-
- virtual bool isValid();
-
-signals:
- virtual void changed();
-protected:
- QDir m_dir;
- QList<Mod> mods;
-};
-
-/**
- * A jar mod list.
- * Backed by a folder and a file which specifies the load order.
- */
-class JarModList : public ModList
-{
- Q_OBJECT
-public:
- JarModList(const QString& dir, const QString& list_file, LegacyInstance * inst)
- : ModList(dir), m_listfile(list_file), m_inst(inst) {}
-
- virtual bool update();
- virtual bool installMod(const QString &filename, size_t index);
- virtual bool deleteMod(size_t index);
- virtual bool moveMod(size_t from, size_t to);
-protected:
- QString m_listfile;
- LegacyInstance * m_inst;
-};
diff --git a/backend/NostalgiaInstance.cpp b/backend/NostalgiaInstance.cpp
deleted file mode 100644
index 0a7f3c5a..00000000
--- a/backend/NostalgiaInstance.cpp
+++ /dev/null
@@ -1,12 +0,0 @@
-#include "NostalgiaInstance.h"
-
-NostalgiaInstance::NostalgiaInstance ( const QString& rootDir, SettingsObject* settings, QObject* parent )
- : OneSixInstance ( rootDir, settings, parent )
-{
-
-}
-
-/*
-ADD MORE
- IF REQUIRED
-*/
diff --git a/backend/NostalgiaInstance.h b/backend/NostalgiaInstance.h
deleted file mode 100644
index 7c48713b..00000000
--- a/backend/NostalgiaInstance.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#pragma once
-
-#include "OneSixInstance.h"
-
-class LIBMULTIMC_EXPORT NostalgiaInstance : public OneSixInstance
-{
- Q_OBJECT
-public:
- explicit NostalgiaInstance(const QString &rootDir, SettingsObject * settings, QObject *parent = 0);
-};
diff --git a/backend/OneSixAssets.cpp b/backend/OneSixAssets.cpp
deleted file mode 100644
index db9e7421..00000000
--- a/backend/OneSixAssets.cpp
+++ /dev/null
@@ -1,162 +0,0 @@
-#include <QString>
-#include <QDebug>
-#include <QtXml/QtXml>
-#include "OneSixAssets.h"
-#include "net/DownloadJob.h"
-
-inline QDomElement getDomElementByTagName(QDomElement parent, QString tagname)
-{
- QDomNodeList elementList = parent.elementsByTagName(tagname);
- if (elementList.count())
- return elementList.at(0).toElement();
- else
- return QDomElement();
-}
-
-class ThreadedDeleter : public QThread
-{
- Q_OBJECT
-public:
- void run()
- {
- QDirIterator iter(m_base, QDirIterator::Subdirectories);
- QStringList nuke_list;
- int base_length = m_base.length();
- while (iter.hasNext())
- {
- QString filename = iter.next();
- QFileInfo current(filename);
- // we keep the dirs... whatever
- if(current.isDir())
- continue;
- QString trimmedf = filename;
- trimmedf.remove(0, base_length + 1);
- if(m_whitelist.contains(trimmedf))
- {
- // qDebug() << trimmedf << " gets to live";
- }
- else
- {
- // DO NOT TOLERATE JUNK
- // qDebug() << trimmedf << " dies";
- QFile f (filename);
- f.remove();
- }
- }
- };
- QString m_base;
- QStringList m_whitelist;
-};
-
-class NukeAndPaveJob: public Job
-{
- Q_OBJECT
-public:
-
- explicit NukeAndPaveJob(QString base, QStringList whitelist)
- :Job()
- {
- QDir dir(base);
- deleterThread.m_base = dir.absolutePath();
- deleterThread.m_whitelist = whitelist;
- };
-public slots:
- virtual void start()
- {
- connect(&deleterThread, SIGNAL(finished()), SLOT(threadFinished()));
- deleterThread.start();
- };
- void threadFinished()
- {
- emit finish();
- }
-private:
- ThreadedDeleter deleterThread;
-};
-
-
-
-void OneSixAssets::fetchFinished()
-{
- QString prefix ( "http://s3.amazonaws.com/Minecraft.Resources/" );
- QString fprefix ( "assets/" );
- QStringList nuke_whitelist;
-
- JobPtr firstJob = index_job->getFirstJob();
- auto DlJob = firstJob.dynamicCast<DownloadJob>();
- QByteArray ba = DlJob->m_data;
-
- QString xmlErrorMsg;
- QDomDocument doc;
- if ( !doc.setContent ( ba, false, &xmlErrorMsg ) )
- {
- qDebug() << "Failed to process s3.amazonaws.com/Minecraft.Resources. XML error:" <<
- xmlErrorMsg << ba;
- }
- //QRegExp etag_match(".*([a-f0-9]{32}).*");
- QDomNodeList contents = doc.elementsByTagName ( "Contents" );
-
- JobList *job = new JobList();
- connect ( job, SIGNAL ( finished() ), SIGNAL(finished()) );
- connect ( job, SIGNAL ( failed() ), SIGNAL(failed()) );
-
- for ( int i = 0; i < contents.length(); i++ )
- {
- QDomElement element = contents.at ( i ).toElement();
-
- if ( element.isNull() )
- continue;
-
- QDomElement keyElement = getDomElementByTagName ( element, "Key" );
- QDomElement lastmodElement = getDomElementByTagName ( element, "LastModified" );
- QDomElement etagElement = getDomElementByTagName ( element, "ETag" );
- QDomElement sizeElement = getDomElementByTagName ( element, "Size" );
-
- if ( keyElement.isNull() || lastmodElement.isNull() || etagElement.isNull() || sizeElement.isNull() )
- continue;
-
- QString keyStr = keyElement.text();
- QString lastModStr = lastmodElement.text();
- QString etagStr = etagElement.text();
- QString sizeStr = sizeElement.text();
-
- //Filter folder keys
- if ( sizeStr == "0" )
- continue;
-
- QString filename = fprefix + keyStr;
- QFile check_file ( filename );
- QString client_etag = "nonsense";
- // if there already is a file and md5 checking is in effect and it can be opened
- if ( check_file.exists() && check_file.open ( QIODevice::ReadOnly ) )
- {
- // check the md5 against the expected one
- client_etag = QCryptographicHash::hash ( check_file.readAll(), QCryptographicHash::Md5 ).toHex().constData();
- check_file.close();
- }
-
- QString trimmedEtag = etagStr.remove ( '"' );
- nuke_whitelist.append ( keyStr );
- if(trimmedEtag != client_etag)
- job->add ( DownloadJob::create ( QUrl ( prefix + keyStr ), filename ) );
-
- }
- job->add ( JobPtr ( new NukeAndPaveJob ( fprefix, nuke_whitelist ) ) );
- files_job.reset ( job );
- dl.enqueue ( files_job );
-}
-void OneSixAssets::fetchStarted()
-{
- qDebug() << "Started downloading!";
-}
-void OneSixAssets::start()
-{
- JobList *job = new JobList();
- job->add ( DownloadJob::create ( QUrl ( "http://s3.amazonaws.com/Minecraft.Resources/" ) ) );
- connect ( job, SIGNAL ( finished() ), SLOT ( fetchFinished() ) );
- connect ( job, SIGNAL ( started() ), SLOT ( fetchStarted() ) );
- index_job.reset ( job );
- dl.enqueue ( index_job );
-}
-
-#include "OneSixAssets.moc" \ No newline at end of file
diff --git a/backend/OneSixAssets.h b/backend/OneSixAssets.h
deleted file mode 100644
index 8c345daa..00000000
--- a/backend/OneSixAssets.h
+++ /dev/null
@@ -1,22 +0,0 @@
-#pragma once
-#include "net/DownloadJob.h"
-
-class Private;
-
-class OneSixAssets : public QObject
-{
- Q_OBJECT
-signals:
- void failed();
- void finished();
-
-public slots:
- void fetchFinished();
- void fetchStarted();
-public:
- void start();
-private:
- JobListQueue dl;
- JobListPtr index_job;
- JobListPtr files_job;
-};
diff --git a/backend/OneSixInstance.cpp b/backend/OneSixInstance.cpp
deleted file mode 100644
index 46866b0e..00000000
--- a/backend/OneSixInstance.cpp
+++ /dev/null
@@ -1,211 +0,0 @@
-#include "OneSixInstance.h"
-#include "OneSixInstance_p.h"
-#include "OneSixUpdate.h"
-#include "MinecraftProcess.h"
-#include "VersionFactory.h"
-
-#include <setting.h>
-#include <pathutils.h>
-#include <cmdutils.h>
-#include <JlCompress.h>
-
-OneSixInstance::OneSixInstance ( const QString& rootDir, SettingsObject* setting_obj, QObject* parent )
-: BaseInstance ( new OneSixInstancePrivate(), rootDir, setting_obj, parent )
-{
- I_D(OneSixInstance);
- d->m_settings->registerSetting(new Setting("IntendedVersion", ""));
- d->m_settings->registerSetting(new Setting("ShouldUpdate", false));
- reloadFullVersion();
-}
-
-BaseUpdate* OneSixInstance::doUpdate()
-{
- return new OneSixUpdate(this);
-}
-
-QString replaceTokensIn(QString text, QMap<QString, QString> with)
-{
- QString result;
- QRegExp token_regexp("\\$\\{(.+)\\}");
- token_regexp.setMinimal(true);
- QStringList list;
- int tail = 0;
- int head = 0;
- while ((head = token_regexp.indexIn(text, head)) != -1)
- {
- result.append(text.mid(tail, head-tail));
- QString key = token_regexp.cap(1);
- auto iter = with.find(key);
- if(iter != with.end())
- {
- result.append(*iter);
- }
- head += token_regexp.matchedLength();
- tail = head;
- }
- result.append(text.mid(tail));
- return result;
-}
-
-QStringList OneSixInstance::processMinecraftArgs( QString user, QString session )
-{
- I_D(OneSixInstance);
- auto version = d->version;
- QString args_pattern = version->minecraftArguments;
-
- QMap<QString, QString> token_mapping;
- token_mapping["auth_username"] = user;
- token_mapping["auth_session"] = session;
- //FIXME: user and player name are DIFFERENT!
- token_mapping["auth_player_name"] = user;
- //FIXME: WTF is this. I just plugged in a random UUID here.
- token_mapping["auth_uuid"] = "7d4bacf0-fd62-11e2-b778-0800200c9a66"; // obviously fake.
-
- // this is for offline:
- /*
- map["auth_player_name"] = "Player";
- map["auth_player_name"] = "00000000-0000-0000-0000-000000000000";
- */
-
- token_mapping["profile_name"] = name();
- token_mapping["version_name"] = version->id;
-
- QString absRootDir = QDir(minecraftRoot()).absolutePath();
- token_mapping["game_directory"] = absRootDir;
- QString absAssetsDir = QDir("assets/").absolutePath();
- token_mapping["game_assets"] = absAssetsDir;
-
- QStringList parts = args_pattern.split(' ',QString::SkipEmptyParts);
- for (int i = 0; i < parts.length(); i++)
- {
- parts[i] = replaceTokensIn(parts[i], token_mapping);
- }
- return parts;
-}
-
-MinecraftProcess* OneSixInstance::prepareForLaunch ( QString user, QString session )
-{
- I_D(OneSixInstance);
- cleanupAfterRun();
- auto version = d->version;
- if(!version)
- return nullptr;
- auto libs_to_extract = version->getActiveNativeLibs();
- QString natives_dir_raw = PathCombine(instanceRoot(), "natives/");
- bool success = ensurePathExists(natives_dir_raw);
- if(!success)
- {
- // FIXME: handle errors
- return nullptr;
- }
-
- for(auto lib: libs_to_extract)
- {
- QString path = "libraries/" + lib->storagePath();
- qDebug() << "Will extract " << path.toLocal8Bit();
- if(JlCompress::extractWithExceptions(path, natives_dir_raw, lib->extract_excludes).isEmpty())
- {
- return nullptr;
- }
- }
-
- QStringList args;
- args.append(Util::Commandline::splitArgs(settings().get("JvmArgs").toString()));
- args << QString("-Xms%1m").arg(settings().get("MinMemAlloc").toInt());
- args << QString("-Xmx%1m").arg(settings().get("MaxMemAlloc").toInt());
- QDir natives_dir(natives_dir_raw);
- args << QString("-Djava.library.path=%1").arg( natives_dir.absolutePath() );
- QString classPath;
- {
- auto libs = version->getActiveNormalLibs();
- for (auto lib: libs)
- {
- QFileInfo fi(QString("libraries/") + lib->storagePath());
- classPath.append(fi.absoluteFilePath());
- //FIXME: make separator tweakable
- classPath.append(':');
- }
- QString targetstr = "versions/" + version->id + "/" + version->id + ".jar";
- QFileInfo fi(targetstr);
- classPath.append(fi.absoluteFilePath());
- }
- if(classPath.size())
- {
- args << "-cp";
- args << classPath;
- }
- args << version->mainClass;
- args.append(processMinecraftArgs(user, session));
-
- // create the process and set its parameters
- MinecraftProcess * proc = new MinecraftProcess(this);
- proc->setMinecraftArguments(args);
- proc->setMinecraftWorkdir(minecraftRoot());
- return proc;
-}
-
-void OneSixInstance::cleanupAfterRun()
-{
- QString target_dir = PathCombine(instanceRoot(), "natives/");
- QDir dir(target_dir);
- dir.removeRecursively();
-}
-
-bool OneSixInstance::setIntendedVersionId ( QString version )
-{
- settings().set("IntendedVersion", version);
- setShouldUpdate(true);
- return true;
-}
-
-QString OneSixInstance::intendedVersionId() const
-{
- return settings().get("IntendedVersion").toString();
-}
-
-void OneSixInstance::setShouldUpdate ( bool val )
-{
- settings().set ( "ShouldUpdate", val );
-}
-
-bool OneSixInstance::shouldUpdate() const
-{
- I_D(OneSixInstance);
- QVariant var = settings().get ( "ShouldUpdate" );
- if ( !var.isValid() || var.toBool() == false )
- {
- return intendedVersionId() != currentVersionId();
- }
- return true;
-}
-
-QString OneSixInstance::currentVersionId() const
-{
- return intendedVersionId();
-}
-
-bool OneSixInstance::reloadFullVersion()
-{
- I_D(OneSixInstance);
-
- QString verpath = PathCombine(instanceRoot(), "version.json");
- QFile versionfile(verpath);
- if(versionfile.exists() && versionfile.open(QIODevice::ReadOnly))
- {
- FullVersionFactory fvf;
- auto version = fvf.parse(versionfile.readAll());
- versionfile.close();
- if(version)
- {
- d->version = version;
- return true;
- }
- };
- return false;
-}
-
-QSharedPointer< FullVersion > OneSixInstance::getFullVersion()
-{
- I_D(OneSixInstance);
- return d->version;
-}
diff --git a/backend/OneSixInstance.h b/backend/OneSixInstance.h
deleted file mode 100644
index 12ad9e40..00000000
--- a/backend/OneSixInstance.h
+++ /dev/null
@@ -1,32 +0,0 @@
-#pragma once
-
-#include "BaseInstance.h"
-#include <QStringList>
-class FullVersion;
-class BaseUpdate;
-
-class LIBMULTIMC_EXPORT OneSixInstance : public BaseInstance
-{
- Q_OBJECT
-public:
- explicit OneSixInstance(const QString &rootDir, SettingsObject * settings, QObject *parent = 0);
- virtual BaseUpdate* doUpdate();
- virtual MinecraftProcess* prepareForLaunch ( QString user, QString session );
- virtual void cleanupAfterRun();
-
- virtual QString intendedVersionId() const;
- virtual bool setIntendedVersionId ( QString version );
-
- virtual QString currentVersionId() const;
- // virtual void setCurrentVersionId ( QString val ) {};
-
- virtual bool shouldUpdate() const;
- virtual void setShouldUpdate(bool val);
-
- /// reload the full version json file. return true on success!
- bool reloadFullVersion();
- /// get the current full version info
- QSharedPointer<FullVersion> getFullVersion();
-private:
- QStringList processMinecraftArgs( QString user, QString session );
-}; \ No newline at end of file
diff --git a/backend/OneSixInstance_p.h b/backend/OneSixInstance_p.h
deleted file mode 100644
index 1037e03c..00000000
--- a/backend/OneSixInstance_p.h
+++ /dev/null
@@ -1,9 +0,0 @@
-#pragma once
-
-#include "BaseInstance_p.h"
-#include "OneSixVersion.h"
-
-struct OneSixInstancePrivate: public BaseInstancePrivate
-{
- QSharedPointer<FullVersion> version;
-}; \ No newline at end of file
diff --git a/backend/OneSixUpdate.cpp b/backend/OneSixUpdate.cpp
deleted file mode 100644
index 2bb2f496..00000000
--- a/backend/OneSixUpdate.cpp
+++ /dev/null
@@ -1,169 +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 "OneSixUpdate.h"
-
-#include <QtNetwork>
-
-#include <QFile>
-#include <QFileInfo>
-#include <QTextStream>
-#include <QDataStream>
-
-#include <QDebug>
-
-#include "BaseInstance.h"
-#include "lists/MinecraftVersionList.h"
-#include "VersionFactory.h"
-#include "OneSixVersion.h"
-#include "OneSixInstance.h"
-
-#include "pathutils.h"
-
-
-OneSixUpdate::OneSixUpdate(BaseInstance *inst, QObject *parent):BaseUpdate(inst, parent){}
-
-void OneSixUpdate::executeTask()
-{
- QString intendedVersion = m_inst->intendedVersionId();
-
- // Make directories
- QDir mcDir(m_inst->minecraftRoot());
- if (!mcDir.exists() && !mcDir.mkpath("."))
- {
- emitFailed("Failed to create bin folder.");
- return;
- }
-
- // Get a pointer to the version object that corresponds to the instance's version.
- targetVersion = MinecraftVersionList::getMainList().findVersion(intendedVersion).dynamicCast<MinecraftVersion>();
- if(targetVersion == nullptr)
- {
- // don't do anything if it was invalid
- emitSucceeded();
- return;
- }
-
- if(m_inst->shouldUpdate())
- {
- versionFileStart();
- }
- else
- {
- jarlibStart();
- }
-}
-
-void OneSixUpdate::versionFileStart()
-{
- setStatus("Getting the version files from Mojang.");
-
- QString urlstr("http://s3.amazonaws.com/Minecraft.Download/versions/");
- urlstr += targetVersion->descriptor + "/" + targetVersion->descriptor + ".json";
- auto dljob = DownloadJob::create(QUrl(urlstr));
- specificVersionDownloadJob.reset(new JobList());
- specificVersionDownloadJob->add(dljob);
- connect(specificVersionDownloadJob.data(), SIGNAL(finished()), SLOT(versionFileFinished()));
- connect(specificVersionDownloadJob.data(), SIGNAL(failed()), SLOT(versionFileFailed()));
- connect(specificVersionDownloadJob.data(), SIGNAL(progress(qint64,qint64)), SLOT(updateDownloadProgress(qint64,qint64)));
- download_queue.enqueue(specificVersionDownloadJob);
-}
-
-void OneSixUpdate::versionFileFinished()
-{
- JobPtr firstJob = specificVersionDownloadJob->getFirstJob();
- auto DlJob = firstJob.dynamicCast<DownloadJob>();
-
- QString version_id = targetVersion->descriptor;
- QString inst_dir = m_inst->instanceRoot();
- // save the version file in $instanceId/version.json
- {
- QString version1 = PathCombine(inst_dir, "/version.json");
- ensurePathExists(version1);
- // FIXME: detect errors here, download to a temp file, swap
- QFile vfile1 (version1);
- vfile1.open(QIODevice::Truncate | QIODevice::WriteOnly );
- vfile1.write(DlJob->m_data);
- vfile1.close();
- }
-
- // the version is downloaded safely. update is 'done' at this point
- m_inst->setShouldUpdate(false);
- // save the version file in versions/$version/$version.json
- /*
- //QString version2 = QString("versions/") + version_id + "/" + version_id + ".json";
- //ensurePathExists(version2);
- //QFile vfile2 (version2);
- //vfile2.open(QIODevice::Truncate | QIODevice::WriteOnly );
- //vfile2.write(DlJob->m_data);
- //vfile2.close();
- */
-
- jarlibStart();
-}
-
-void OneSixUpdate::versionFileFailed()
-{
- emitFailed("Failed to download the version description. Try again.");
-}
-
-void OneSixUpdate::jarlibStart()
-{
- OneSixInstance * inst = (OneSixInstance *) m_inst;
- bool successful = inst->reloadFullVersion();
- if(!successful)
- {
- emitFailed("Failed to load the version description file (version.json). It might be corrupted, missing or simply too new.");
- return;
- }
-
- QSharedPointer<FullVersion> version = inst->getFullVersion();
-
- // download the right jar, save it in versions/$version/$version.jar
- QString urlstr("http://s3.amazonaws.com/Minecraft.Download/versions/");
- urlstr += version->id + "/" + version->id + ".jar";
- QString targetstr ("versions/");
- targetstr += version->id + "/" + version->id + ".jar";
-
- auto dljob = DownloadJob::create(QUrl(urlstr), targetstr);
- jarlibDownloadJob.reset(new JobList());
- jarlibDownloadJob->add(dljob);
-
- auto libs = version->getActiveNativeLibs();
- libs.append(version->getActiveNormalLibs());
-
- for(auto lib: libs)
- {
- QString download_path = lib->downloadPath();
- QString storage_path = "libraries/" + lib->storagePath();
- jarlibDownloadJob->add(DownloadJob::create(download_path, storage_path));
- }
- connect(jarlibDownloadJob.data(), SIGNAL(finished()), SLOT(jarlibFinished()));
- connect(jarlibDownloadJob.data(), SIGNAL(failed()), SLOT(jarlibFailed()));
- connect(jarlibDownloadJob.data(), SIGNAL(progress(qint64,qint64)), SLOT(updateDownloadProgress(qint64,qint64)));
-
- download_queue.enqueue(jarlibDownloadJob);
-}
-
-void OneSixUpdate::jarlibFinished()
-{
- emitSucceeded();
-}
-
-void OneSixUpdate::jarlibFailed()
-{
- emitFailed("Failed to download the binary garbage. Try again. Maybe. IF YOU DARE");
-}
-
diff --git a/backend/OneSixUpdate.h b/backend/OneSixUpdate.h
deleted file mode 100644
index 75575166..00000000
--- a/backend/OneSixUpdate.h
+++ /dev/null
@@ -1,55 +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.
- */
-
-#pragma once
-
-#include <QObject>
-#include <QList>
-#include <QUrl>
-#include "net/DownloadJob.h"
-
-#include "tasks/Task.h"
-#include "libmmc_config.h"
-#include "BaseUpdate.h"
-
-class MinecraftVersion;
-class BaseInstance;
-
-class LIBMULTIMC_EXPORT OneSixUpdate : public BaseUpdate
-{
- Q_OBJECT
-public:
- explicit OneSixUpdate(BaseInstance *inst, QObject *parent = 0);
- virtual void executeTask();
-
-private slots:
- void versionFileStart();
- void versionFileFinished();
- void versionFileFailed();
-
- void jarlibStart();
- void jarlibFinished();
- void jarlibFailed();
-
-private:
- JobListPtr specificVersionDownloadJob;
- JobListPtr jarlibDownloadJob;
- JobListQueue download_queue;
-
- // target version, determined during this task
- QSharedPointer<MinecraftVersion> targetVersion;
-};
-
-
diff --git a/backend/OneSixVersion.cpp b/backend/OneSixVersion.cpp
deleted file mode 100644
index 2b2f79f5..00000000
--- a/backend/OneSixVersion.cpp
+++ /dev/null
@@ -1,132 +0,0 @@
-#include "OneSixVersion.h"
-
-RuleAction RuleAction_fromString(QString name)
-{
- if(name == "allow")
- return Allow;
- if(name == "disallow")
- return Disallow;
- return Defer;
-}
-
-OpSys OpSys_fromString(QString name)
-{
- if(name == "linux")
- return Os_Linux;
- if(name == "windows")
- return Os_Windows;
- if(name == "osx")
- return Os_OSX;
- return Os_Other;
-}
-
-void Library::finalize()
-{
- QStringList parts = m_name.split ( ':' );
- QString relative = parts[0];
- relative.replace ( '.','/' );
- relative += '/' + parts[1] + '/' + parts[2] + '/' + parts[1] + '-' + parts[2];
- if ( !m_is_native )
- relative += ".jar";
- else
- {
- if ( m_native_suffixes.contains ( currentSystem ) )
- {
- relative += "-" + m_native_suffixes[currentSystem] + ".jar";
- }
- else
- {
- // really, bad.
- relative += ".jar";
- }
- }
- m_storage_path = relative;
- m_download_path = m_base_url + relative;
-
- if ( m_rules.empty() )
- {
- m_is_active = true;
- }
- else
- {
- RuleAction result = Disallow;
- for ( auto rule: m_rules )
- {
- RuleAction temp = rule->apply ( this );
- if ( temp != Defer )
- result = temp;
- }
- m_is_active = ( result == Allow );
- }
- if ( m_is_native )
- {
- m_is_active = m_is_active && m_native_suffixes.contains ( currentSystem );
- }
-}
-
-void Library::setName ( QString name )
-{
- m_name = name;
-}
-void Library::setBaseUrl ( QString base_url )
-{
- m_base_url = base_url;
-}
-void Library::setIsNative()
-{
- m_is_native = true;
-}
-void Library::addNative ( OpSys os, QString suffix )
-{
- m_is_native = true;
- m_native_suffixes[os] = suffix;
-}
-void Library::setRules ( QList< QSharedPointer< Rule > > rules )
-{
- m_rules = rules;
-}
-bool Library::isActive()
-{
- return m_is_active;
-}
-bool Library::isNative()
-{
- return m_is_native;
-}
-QString Library::downloadPath()
-{
- return m_download_path;
-}
-QString Library::storagePath()
-{
- return m_storage_path;
-}
-
-
-QList<QSharedPointer<Library> > FullVersion::getActiveNormalLibs()
-{
- QList<QSharedPointer<Library> > output;
- for ( auto lib: libraries )
- {
- if (lib->isActive() && !lib->isNative())
- {
- output.append(lib);
- }
- }
- return output;
-}
-
-QList<QSharedPointer<Library> > FullVersion::getActiveNativeLibs()
-{
- QList<QSharedPointer<Library> > output;
- for ( auto lib: libraries )
- {
- if (lib->isActive() && lib->isNative())
- {
- output.append(lib);
- }
- }
- return output;
-}
-
-
diff --git a/backend/OneSixVersion.h b/backend/OneSixVersion.h
deleted file mode 100644
index e4f75542..00000000
--- a/backend/OneSixVersion.h
+++ /dev/null
@@ -1,212 +0,0 @@
-#pragma once
-#include <QtCore>
-
-class Library;
-
-enum OpSys
-{
- Os_Windows,
- Os_Linux,
- Os_OSX,
- Os_Other
-};
-
-OpSys OpSys_fromString(QString);
-
-#ifdef Q_OS_WIN32
- #define currentSystem Os_Windows
-#elif Q_OS_MAC
- #define currentSystem Os_OSX
-#else
- #define currentSystem Os_Linux
-#endif
-
-enum RuleAction
-{
- Allow,
- Disallow,
- Defer
-};
-
-RuleAction RuleAction_fromString(QString);
-
-class Rule
-{
-protected:
- RuleAction m_result;
- virtual bool applies(Library * parent) = 0;
-public:
- Rule(RuleAction result)
- :m_result(result) {}
- virtual ~Rule(){};
- RuleAction apply(Library * parent)
- {
- if(applies(parent))
- return m_result;
- else
- return Defer;
- };
-};
-
-class OsRule : public Rule
-{
-private:
- // the OS
- OpSys m_system;
- // the OS version regexp
- QString m_version_regexp;
-protected:
- virtual bool applies ( Library* )
- {
- return (m_system == currentSystem);
- }
- OsRule(RuleAction result, OpSys system, QString version_regexp)
- : Rule(result), m_system(system), m_version_regexp(version_regexp) {}
-public:
- static QSharedPointer<OsRule> create(RuleAction result, OpSys system, QString version_regexp)
- {
- return QSharedPointer<OsRule> (new OsRule(result, system, version_regexp));
- }
-};
-
-class ImplicitRule : public Rule
-{
-protected:
- virtual bool applies ( Library* )
- {
- return true;
- }
- ImplicitRule(RuleAction result)
- : Rule(result) {}
-public:
- static QSharedPointer<ImplicitRule> create(RuleAction result)
- {
- return QSharedPointer<ImplicitRule> (new ImplicitRule(result));
- }
-};
-
-class Library
-{
-private:
- // basic values used internally (so far)
- QString m_name;
- QString m_base_url;
- QList<QSharedPointer<Rule> > m_rules;
-
- // derived values used for real things
- /// where to store the lib locally
- QString m_storage_path;
- /// where to download the lib from
- QString m_download_path;
- /// is this lib actually active on the current OS?
- bool m_is_active;
- /// is the library a native?
- bool m_is_native;
- /// native suffixes per OS
- QMap<OpSys, QString> m_native_suffixes;
-public:
- QStringList extract_excludes;
-
-public:
- /// Constructor
- Library(QString name)
- {
- m_is_native = false;
- m_is_native = false;
- m_name = name;
- m_base_url = "https://s3.amazonaws.com/Minecraft.Download/libraries/";
- }
-
- /**
- * finalize the library, processing the input values into derived values and state
- *
- * This SHALL be called after all the values are parsed or after any further change.
- */
- void finalize();
-
- /// Set the library composite name
- void setName(QString name);
- /// Set the url base for downloads
- void setBaseUrl(QString base_url);
- /// Call this to mark the library as 'native' (it's a zip archive with DLLs)
- void setIsNative();
- /// Attach a name suffix to the specified OS native
- void addNative(OpSys os, QString suffix);
- /// Set the load rules
- void setRules(QList<QSharedPointer<Rule> > rules);
-
- /// Returns true if the library should be loaded (or extracted, in case of natives)
- bool isActive();
- /// Returns true if the library is native
- bool isNative();
- /// Get the URL to download the library from
- QString downloadPath();
- /// Get the relative path where the library should be saved
- QString storagePath();
-};
-
-
-class FullVersion
-{
-public:
- /// the ID - determines which jar to use! ACTUALLY IMPORTANT!
- QString id;
- /// Last updated time - as a string
- QString time;
- /// Release time - as a string
- QString releaseTime;
- /// Release type - "release" or "snapshot"
- QString type;
- /**
- * DEPRECATED: Old versions of the new vanilla launcher used this
- * ex: "username_session_version"
- */
- QString processArguments;
- /**
- * arguments that should be used for launching minecraft
- *
- * ex: "--username ${auth_player_name} --session ${auth_session}
- * --version ${version_name} --gameDir ${game_directory} --assetsDir ${game_assets}"
- */
- QString minecraftArguments;
- /**
- * the minimum launcher version required by this version ... current is 4 (at point of writing)
- */
- int minimumLauncherVersion;
- /**
- * The main class to load first
- */
- QString mainClass;
-
- /// the list of libs - both active and inactive, native and java
- QList<QSharedPointer<Library> > libraries;
-
- /*
- FIXME: add support for those rules here? Looks like a pile of quick hacks to me though.
-
- "rules": [
- {
- "action": "allow"
- },
- {
- "action": "disallow",
- "os": {
- "name": "osx",
- "version": "^10\\.5\\.\\d$"
- }
- }
- ],
- "incompatibilityReason": "There is a bug in LWJGL which makes it incompatible with OSX 10.5.8. Please go to New Profile and use 1.5.2 for now. Sorry!"
- }
- */
- // QList<Rule> rules;
-
-public:
- FullVersion()
- {
- minimumLauncherVersion = 0xDEADBEEF;
- }
-
- QList<QSharedPointer<Library> > getActiveNormalLibs();
- QList<QSharedPointer<Library> > getActiveNativeLibs();
-}; \ No newline at end of file
diff --git a/backend/VersionFactory.cpp b/backend/VersionFactory.cpp
deleted file mode 100644
index 9eccce26..00000000
--- a/backend/VersionFactory.cpp
+++ /dev/null
@@ -1,195 +0,0 @@
-#include "VersionFactory.h"
-#include "OneSixVersion.h"
-
-// Library rules (if any)
-QList<QSharedPointer<Rule> > FullVersionFactory::parse4rules(QJsonObject & baseObj)
-{
- QList<QSharedPointer<Rule> > rules;
- auto rulesVal = baseObj.value("rules");
- if(rulesVal.isArray())
- {
- QJsonArray ruleList = rulesVal.toArray();
- for(auto ruleVal : ruleList)
- {
- QSharedPointer<Rule> rule;
- if(!ruleVal.isObject())
- continue;
- auto ruleObj = ruleVal.toObject();
- auto actionVal = ruleObj.value("action");
- if(!actionVal.isString())
- continue;
- auto action = RuleAction_fromString(actionVal.toString());
- if(action == Defer)
- continue;
-
- auto osVal = ruleObj.value("os");
- if(!osVal.isObject())
- {
- // add a new implicit action rule
- rules.append(ImplicitRule::create(action));
- }
- else
- {
- auto osObj = osVal.toObject();
- auto osNameVal = osObj.value("name");
- if(!osNameVal.isString())
- continue;
- OpSys requiredOs = OpSys_fromString(osNameVal.toString());
- QString versionRegex = osObj.value("version").toString();
- // add a new OS rule
- rules.append(OsRule::create(action, requiredOs, versionRegex));
- }
- }
- }
- return rules;
-}
-
-
-QSharedPointer<FullVersion> FullVersionFactory::parse4(QJsonObject root, QSharedPointer<FullVersion> fullVersion)
-{
- fullVersion->id = root.value("id").toString();
-
- fullVersion->mainClass = root.value("mainClass").toString();
- auto procArgsValue = root.value("processArguments");
- if(procArgsValue.isString())
- {
- fullVersion->processArguments = procArgsValue.toString();
- QString toCompare = fullVersion->processArguments.toLower();
- if(toCompare == "legacy")
- {
- fullVersion->minecraftArguments = " ${auth_player_name} ${auth_session}";
- }
- else if(toCompare == "username_session")
- {
- fullVersion->minecraftArguments = "--username ${auth_player_name} --session ${auth_session}";
- }
- else if(toCompare == "username_session_version")
- {
- fullVersion->minecraftArguments = "--username ${auth_player_name} --session ${auth_session} --version ${profile_name}";
- }
- }
-
- auto minecraftArgsValue = root.value("minecraftArguments");
- if(minecraftArgsValue.isString())
- {
- fullVersion->minecraftArguments = minecraftArgsValue.toString();
- }
-
- auto minecraftTypeValue = root.value("type");
- if(minecraftTypeValue.isString())
- {
- fullVersion->type = minecraftTypeValue.toString();
- }
-
- fullVersion->releaseTime = root.value("releaseTime").toString();
- fullVersion->time = root.value("time").toString();
-
- // Iterate through the list, if it's a list.
- auto librariesValue = root.value("libraries");
- if(!librariesValue.isArray())
- return fullVersion;
-
- QJsonArray libList = root.value("libraries").toArray();
- for (auto libVal : libList)
- {
- if (!libVal.isObject())
- {
- continue;
- }
-
- QJsonObject libObj = libVal.toObject();
-
- // Library name
- auto nameVal = libObj.value("name");
- if(!nameVal.isString())
- continue;
- QSharedPointer<Library> library(new Library(nameVal.toString()));
-
- auto urlVal = libObj.value("url");
- if(urlVal.isString())
- {
- library->setBaseUrl(urlVal.toString());
- }
-
- // Extract excludes (if any)
- auto extractVal = libObj.value("extract");
- if(extractVal.isObject())
- {
- QStringList excludes;
- auto extractObj = extractVal.toObject();
- auto excludesVal = extractObj.value("exclude");
- if(!excludesVal.isArray())
- goto SKIP_EXTRACTS;
- auto excludesList = excludesVal.toArray();
- for(auto excludeVal : excludesList)
- {
- if(excludeVal.isString())
- excludes.append(excludeVal.toString());
- }
- library->extract_excludes = excludes;
- }
- SKIP_EXTRACTS:
-
- auto nativesVal = libObj.value("natives");
- if(nativesVal.isObject())
- {
- library->setIsNative();
- auto nativesObj = nativesVal.toObject();
- auto iter = nativesObj.begin();
- while(iter != nativesObj.end())
- {
- auto osType = OpSys_fromString(iter.key());
- if(osType == Os_Other)
- continue;
- if(!iter.value().isString())
- continue;
- library->addNative(osType, iter.value().toString());
- iter++;
- }
- }
- library->setRules(parse4rules(libObj));
- library->finalize();
- fullVersion->libraries.append(library);
- }
- return fullVersion;
-}
-
-QSharedPointer<FullVersion> FullVersionFactory::parse(QByteArray data)
-{
- QSharedPointer<FullVersion> readVersion(new FullVersion());
-
- QJsonParseError jsonError;
- QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &jsonError);
-
- if (jsonError.error != QJsonParseError::NoError)
- {
- error_string = QString( "Error reading version file :") + " " + jsonError.errorString();
- m_error = FullVersionFactory::ParseError;
- return QSharedPointer<FullVersion>();
- }
-
- if(!jsonDoc.isObject())
- {
- error_string = "Error reading version file.";
- m_error = FullVersionFactory::ParseError;
- return QSharedPointer<FullVersion>();
- }
- QJsonObject root = jsonDoc.object();
-
- int launcher_ver = readVersion->minimumLauncherVersion = root.value("minimumLauncherVersion").toDouble();
- // ADD MORE HERE :D
- if(launcher_ver > 0 && launcher_ver <= 7)
- return parse4(root, readVersion);
- else
- {
- error_string = "Version file was for an unrecognized launcher version. RIP";
- m_error = FullVersionFactory::UnsupportedVersion;
- return QSharedPointer<FullVersion>();
- }
-}
-
-
-FullVersionFactory::FullVersionFactory()
-{
- m_error = FullVersionFactory::AllOK;
-}
diff --git a/backend/VersionFactory.h b/backend/VersionFactory.h
deleted file mode 100644
index 82c5278a..00000000
--- a/backend/VersionFactory.h
+++ /dev/null
@@ -1,24 +0,0 @@
-#pragma once
-#include <QtCore>
-
-struct FullVersion;
-class Rule;
-
-class FullVersionFactory
-{
-public:
- enum Error
- {
- AllOK, // all parsed OK
- ParseError, // the file was corrupted somehow
- UnsupportedVersion // the file was meant for a launcher version we don't support (yet)
- } m_error;
- QString error_string;
-
-public:
- FullVersionFactory();
- QSharedPointer<FullVersion> parse(QByteArray data);
-private:
- QSharedPointer<FullVersion> parse4(QJsonObject root, QSharedPointer<FullVersion> product);
- QList<QSharedPointer<Rule> > parse4rules(QJsonObject & baseObj);
-}; \ No newline at end of file
diff --git a/backend/libmmc_config.h b/backend/libmmc_config.h
deleted file mode 100644
index 6d967f5f..00000000
--- a/backend/libmmc_config.h
+++ /dev/null
@@ -1,24 +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.
- */
-
-#pragma once
-
-#include <QtCore/QtGlobal>
-
-#ifdef LIBMULTIMC_LIBRARY
-# define LIBMULTIMC_EXPORT Q_DECL_EXPORT
-#else
-# define LIBMULTIMC_EXPORT Q_DECL_IMPORT
-#endif
diff --git a/backend/lists/InstVersionList.cpp b/backend/lists/InstVersionList.cpp
deleted file mode 100644
index 855fce45..00000000
--- a/backend/lists/InstVersionList.cpp
+++ /dev/null
@@ -1,129 +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"
-#include "InstanceVersion.h"
-
-InstVersionList::InstVersionList(QObject *parent) :
- QAbstractListModel(parent)
-{
-}
-
-InstVersionPtr InstVersionList::findVersion( const QString& descriptor )
-{
- for (int i = 0; i < count(); i++)
- {
- if (at(i)->descriptor == descriptor)
- return at(i);
- }
- return InstVersionPtr();
-}
-
-InstVersionPtr InstVersionList::getLatestStable() const
-{
- if (count() <= 0)
- return InstVersionPtr();
- else
- return at(0);
-}
-
-QVariant InstVersionList::data(const QModelIndex &index, int role) const
-{
- if (!index.isValid())
- return QVariant();
-
- if (index.row() > count())
- return QVariant();
-
-
- InstVersionPtr version = at(index.row());
-
- switch (role)
- {
- case Qt::DisplayRole:
- switch (index.column())
- {
- case NameColumn:
- return version->name;
-
- case TypeColumn:
- return version->typeString();
-
- case TimeColumn:
- return version->timestamp;
-
- default:
- return QVariant();
- }
-
- case Qt::ToolTipRole:
- return version->descriptor;
-
- case VersionPointerRole:
- return qVariantFromValue(version);
-
- default:
- return QVariant();
- }
-}
-
-QVariant InstVersionList::headerData(int section, Qt::Orientation orientation, int role) const
-{
- switch (role)
- {
- case Qt::DisplayRole:
- switch (section)
- {
- case NameColumn:
- return "Name";
-
- case TypeColumn:
- return "Type";
-
- case TimeColumn:
- return "Time";
-
- default:
- return QVariant();
- }
-
- case Qt::ToolTipRole:
- switch (section)
- {
- case NameColumn:
- return "The name of the version.";
-
- case TypeColumn:
- return "The version's type.";
-
- default:
- return QVariant();
- }
-
- default:
- return QVariant();
- }
-}
-
-int InstVersionList::rowCount(const QModelIndex &parent) const
-{
- // Return count
- return count();
-}
-
-int InstVersionList::columnCount(const QModelIndex &parent) const
-{
- return 2;
-}
diff --git a/backend/lists/InstVersionList.h b/backend/lists/InstVersionList.h
deleted file mode 100644
index ff6938b4..00000000
--- a/backend/lists/InstVersionList.h
+++ /dev/null
@@ -1,122 +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.
- */
-
-#pragma once
-
-#include <QObject>
-#include <QVariant>
-#include <QAbstractListModel>
-#include <QSharedPointer>
-
-#include "libmmc_config.h"
-#include "InstanceVersion.h"
-
-class Task;
-
-/*!
- * \brief 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. Before using the version list, you
- * should check to see if it has been loaded yet and if not, load the list.
- *
- * Note that this class also inherits from QAbstractListModel. Methods from that
- * class determine how this version list shows up in a list view. Said methods
- * all have a default implementation, but they can be overridden by plugins to
- * change the behavior of the list.
- */
-class LIBMULTIMC_EXPORT InstVersionList : public QAbstractListModel
-{
- Q_OBJECT
-public:
- enum ModelRoles
- {
- VersionPointerRole = 0x34B1CB48
- };
-
- enum VListColumns
- {
- // First column - Name
- NameColumn = 0,
-
- // Second column - Type
- TypeColumn,
-
- // Third column - Timestamp
- TimeColumn
- };
-
- explicit InstVersionList(QObject *parent = 0);
-
- /*!
- * \brief Gets a task that will reload the version list.
- * Simply execute the task to load the list.
- * The task returned by this function should reset the model when it's done.
- * \return A pointer to a task that reloads the version list.
- */
- virtual Task *getLoadTask() = 0;
-
- //! Checks whether or not the list is loaded. If this returns false, the list should be loaded.
- virtual bool isLoaded() = 0;
-
- //! Gets the version at the given index.
- virtual const InstVersionPtr at(int i) const = 0;
-
- //! Returns the number of versions in the list.
- virtual int count() const = 0;
-
-
- //////// List Model Functions ////////
- virtual QVariant data(const QModelIndex &index, int role) const;
- virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const;
- virtual int rowCount(const QModelIndex &parent) const;
- virtual int columnCount(const QModelIndex &parent) const;
-
-
- /*!
- * \brief Finds a version by its descriptor.
- * \param The descriptor of the version to find.
- * \return A const pointer to the version with the given descriptor. NULL if
- * one doesn't exist.
- */
- virtual InstVersionPtr findVersion(const QString &descriptor);
-
- /*!
- * \brief Gets the latest stable version of this instance type.
- * This is the version that will be selected by default.
- * By default, this is simply the first version in the list.
- */
- virtual InstVersionPtr getLatestStable() const;
-
- /*!
- * Sorts the version list.
- */
- virtual void sort() = 0;
-
-protected slots:
- /*!
- * Updates this list with the given list of versions.
- * This is done by copying each version in the given list and inserting it
- * into this one.
- * We need to do this so that we can set the parents of the versions are set to this
- * version list. This can't be done in the load task, because the versions the load
- * task creates are on the load task's thread and Qt won't allow their parents
- * to be set to something created on another thread.
- * To get around that problem, we invoke this method on the GUI thread, which
- * then copies the versions and sets their parents correctly.
- * \param versions List of versions whose parents should be set.
- */
- virtual void updateListData(QList<InstVersionPtr > versions) = 0;
-};
diff --git a/backend/lists/InstanceList.cpp b/backend/lists/InstanceList.cpp
deleted file mode 100644
index 101d52c5..00000000
--- a/backend/lists/InstanceList.cpp
+++ /dev/null
@@ -1,232 +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 <QDir>
-#include <QFile>
-#include <QDirIterator>
-#include <QThread>
-#include <QTextStream>
-#include <QJsonDocument>
-#include <QJsonObject>
-#include <QJsonArray>
-
-#include "lists/InstanceList.h"
-#include "BaseInstance.h"
-#include "InstanceFactory.h"
-
-#include "pathutils.h"
-
-const static int GROUP_FILE_FORMAT_VERSION = 1;
-
-InstanceList::InstanceList(const QString &instDir, QObject *parent) :
- QObject(parent), m_instDir("instances")
-{
-
-}
-
-void InstanceList::loadGroupList(QMap<QString, QString> & groupMap)
-{
- QString groupFileName = m_instDir + "/instgroups.json";
-
- // if there's no group file, fail
- if(!QFileInfo(groupFileName).exists())
- return;
-
- QFile groupFile(groupFileName);
-
- // if you can't open the file, fail
- if (!groupFile.open(QIODevice::ReadOnly))
- {
- // An error occurred. Ignore it.
- qDebug("Failed to read instance group file.");
- return;
- }
-
- QTextStream in(&groupFile);
- QString jsonStr = in.readAll();
- groupFile.close();
-
- QJsonParseError error;
- QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonStr.toUtf8(), &error);
-
- // if the json was bad, fail
- if (error.error != QJsonParseError::NoError)
- {
- qWarning(QString("Failed to parse instance group file: %1 at offset %2").
- arg(error.errorString(), QString::number(error.offset)).toUtf8());
- return;
- }
-
- // if the root of the json wasn't an object, fail
- if (!jsonDoc.isObject())
- {
- qWarning("Invalid group file. Root entry should be an object.");
- return;
- }
-
- QJsonObject rootObj = jsonDoc.object();
-
- // Make sure the format version matches, otherwise fail.
- if (rootObj.value("formatVersion").toVariant().toInt() != GROUP_FILE_FORMAT_VERSION)
- return;
-
- // Get the groups. if it's not an object, fail
- if (!rootObj.value("groups").isObject())
- {
- qWarning("Invalid group list JSON: 'groups' should be an object.");
- return;
- }
-
- // Iterate through all the groups.
- QJsonObject groupMapping = rootObj.value("groups").toObject();
- for (QJsonObject::iterator iter = groupMapping.begin(); iter != groupMapping.end(); iter++)
- {
- QString groupName = iter.key();
-
- // If not an object, complain and skip to the next one.
- if (!iter.value().isObject())
- {
- qWarning(QString("Group '%1' in the group list should "
- "be an object.").arg(groupName).toUtf8());
- continue;
- }
-
- QJsonObject groupObj = iter.value().toObject();
- if (!groupObj.value("instances").isArray())
- {
- qWarning(QString("Group '%1' in the group list is invalid. "
- "It should contain an array "
- "called 'instances'.").arg(groupName).toUtf8());
- continue;
- }
-
- // Iterate through the list of instances in the group.
- QJsonArray instancesArray = groupObj.value("instances").toArray();
-
- for (QJsonArray::iterator iter2 = instancesArray.begin();
- iter2 != instancesArray.end(); iter2++)
- {
- groupMap[(*iter2).toString()] = groupName;
- }
- }
-}
-
-InstanceList::InstListError InstanceList::loadList()
-{
- // load the instance groups
- QMap<QString, QString> groupMap;
- loadGroupList(groupMap);
-
- m_instances.clear();
- QDir dir(m_instDir);
- QDirIterator iter(dir);
- while (iter.hasNext())
- {
- QString subDir = iter.next();
- if (!QFileInfo(PathCombine(subDir, "instance.cfg")).exists())
- continue;
-
- BaseInstance *instPtr = NULL;
- auto &loader = InstanceFactory::get();
- auto error = loader.loadInstance(instPtr, subDir);
-
- switch(error)
- {
- case InstanceFactory::NoLoadError:
- break;
- case InstanceFactory::NotAnInstance:
- break;
- }
-
- if (error != InstanceFactory::NoLoadError &&
- error != InstanceFactory::NotAnInstance)
- {
- QString errorMsg = QString("Failed to load instance %1: ").
- arg(QFileInfo(subDir).baseName()).toUtf8();
-
- switch (error)
- {
- default:
- errorMsg += QString("Unknown instance loader error %1").
- arg(error);
- break;
- }
- qDebug(errorMsg.toUtf8());
- }
- else if (!instPtr)
- {
- qDebug(QString("Error loading instance %1. Instance loader returned null.").
- arg(QFileInfo(subDir).baseName()).toUtf8());
- }
- else
- {
- QSharedPointer<BaseInstance> inst(instPtr);
- auto iter = groupMap.find(inst->id());
- if(iter != groupMap.end())
- {
- inst->setGroup((*iter));
- }
- qDebug(QString("Loaded instance %1").arg(inst->name()).toUtf8());
- inst->setParent(this);
- m_instances.append(inst);
- connect(instPtr, SIGNAL(propertiesChanged(BaseInstance*)),this, SLOT(propertiesChanged(BaseInstance*)));
- }
- }
- emit invalidated();
- return NoError;
-}
-
-/// Clear all instances. Triggers notifications.
-void InstanceList::clear()
-{
- m_instances.clear();
- emit invalidated();
-};
-
-/// Add an instance. Triggers notifications, returns the new index
-int InstanceList::add(InstancePtr t)
-{
- m_instances.append(t);
- emit instanceAdded(count() - 1);
- return count() - 1;
-}
-
-InstancePtr InstanceList::getInstanceById(QString instId)
-{
- QListIterator<InstancePtr> iter(m_instances);
- InstancePtr inst;
- while(iter.hasNext())
- {
- inst = iter.next();
- if (inst->id() == instId)
- break;
- }
- if (inst->id() != instId)
- return InstancePtr();
- else
- return iter.peekPrevious();
-}
-
-void InstanceList::propertiesChanged(BaseInstance * inst)
-{
- for(int i = 0; i < m_instances.count(); i++)
- {
- if(inst == m_instances[i].data())
- {
- emit instanceChanged(i);
- break;
- }
- }
-}
diff --git a/backend/lists/InstanceList.h b/backend/lists/InstanceList.h
deleted file mode 100644
index 8c9965e5..00000000
--- a/backend/lists/InstanceList.h
+++ /dev/null
@@ -1,92 +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.
- */
-
-#pragma once
-
-#include <QObject>
-#include <QSharedPointer>
-
-#include "BaseInstance.h"
-#include "libmmc_config.h"
-
-class BaseInstance;
-
-class LIBMULTIMC_EXPORT InstanceList : public QObject
-{
- Q_OBJECT
-private:
- /*!
- * \brief Get the instance groups
- */
- void loadGroupList(QMap<QString, QString> & groupList);
-
-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. Triggers notifications.
- */
- InstListError loadList();
-
- /*!
- * \brief Get the instance at index
- */
- InstancePtr at(int i) const
- {
- return m_instances.at(i);
- };
-
- /*!
- * \brief Get the count of loaded instances
- */
- int count() const
- {
- return m_instances.count();
- };
-
- /// Clear all instances. Triggers notifications.
- void clear();
-
- /// Add an instance. Triggers notifications, returns the new index
- int add(InstancePtr t);
-
- /// Get an instance by ID
- InstancePtr getInstanceById (QString id);
-
-signals:
- void instanceAdded(int index);
- void instanceChanged(int index);
- void invalidated();
-
-private slots:
- void propertiesChanged(BaseInstance * inst);
-
-protected:
- QString m_instDir;
- QList< InstancePtr > m_instances;
-};
diff --git a/backend/lists/LwjglVersionList.cpp b/backend/lists/LwjglVersionList.cpp
deleted file mode 100644
index 068394e8..00000000
--- a/backend/lists/LwjglVersionList.cpp
+++ /dev/null
@@ -1,206 +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 "LwjglVersionList.h"
-#include <net/NetWorker.h>
-
-#include <QtNetwork>
-
-#include <QtXml>
-
-#include <QRegExp>
-
-#define RSS_URL "http://sourceforge.net/api/file/index/project-id/58488/mtime/desc/rss"
-
-LWJGLVersionList mainVersionList;
-
-LWJGLVersionList &LWJGLVersionList::get()
-{
- return mainVersionList;
-}
-
-
-LWJGLVersionList::LWJGLVersionList(QObject *parent) :
- QAbstractListModel(parent)
-{
- setLoading(false);
-}
-
-QVariant LWJGLVersionList::data(const QModelIndex &index, int role) const
-{
- if (!index.isValid())
- return QVariant();
-
- if (index.row() > count())
- return QVariant();
-
- const PtrLWJGLVersion version = at(index.row());
-
- switch (role)
- {
- case Qt::DisplayRole:
- return version->name();
-
- case Qt::ToolTipRole:
- return version->url();
-
- default:
- return QVariant();
- }
-}
-
-QVariant LWJGLVersionList::headerData(int section, Qt::Orientation orientation, int role) const
-{
- switch (role)
- {
- case Qt::DisplayRole:
- return "Version";
-
- case Qt::ToolTipRole:
- return "LWJGL version name.";
-
- default:
- return QVariant();
- }
-}
-
-int LWJGLVersionList::columnCount(const QModelIndex &parent) const
-{
- return 1;
-}
-
-bool LWJGLVersionList::isLoading() const
-{
- return m_loading;
-}
-
-void LWJGLVersionList::loadList()
-{
- Q_ASSERT_X(!m_loading, "loadList", "list is already loading (m_loading is true)");
-
- setLoading(true);
- auto & worker = NetWorker::spawn();
- reply = worker.get(QNetworkRequest(QUrl(RSS_URL)));
- connect(reply, SIGNAL(finished()), SLOT(netRequestComplete()));
-}
-
-inline QDomElement getDomElementByTagName(QDomElement parent, QString tagname)
-{
- QDomNodeList elementList = parent.elementsByTagName(tagname);
- if (elementList.count())
- return elementList.at(0).toElement();
- else
- return QDomElement();
-}
-
-void LWJGLVersionList::netRequestComplete()
-{
- if (reply->error() == QNetworkReply::NoError)
- {
- QRegExp lwjglRegex("lwjgl-(([0-9]\\.?)+)\\.zip");
- Q_ASSERT_X(lwjglRegex.isValid(), "load LWJGL list",
- "LWJGL regex is invalid");
-
- QDomDocument doc;
-
- QString xmlErrorMsg;
- int errorLine;
- if (!doc.setContent(reply->readAll(), false, &xmlErrorMsg, &errorLine))
- {
- failed("Failed to load LWJGL list. XML error: " + xmlErrorMsg + " at line " + QString::number(errorLine));
- setLoading(false);
- return;
- }
-
- QDomNodeList items = doc.elementsByTagName("item");
-
- QList<PtrLWJGLVersion> tempList;
-
- for (int i = 0; i < items.length(); i++)
- {
- Q_ASSERT_X(items.at(i).isElement(), "load LWJGL list",
- "XML element isn't an element... wat?");
-
- QDomElement linkElement = getDomElementByTagName(items.at(i).toElement(), "link");
- if (linkElement.isNull())
- {
- qWarning() << "Link element" << i << "in RSS feed doesn't exist! Skipping.";
- continue;
- }
-
- QString link = linkElement.text();
-
- // Make sure it's a download link.
- if (link.endsWith("/download") && link.contains(lwjglRegex))
- {
- QString name = link.mid(lwjglRegex.indexIn(link) + 6);
- // Subtract 4 here to remove the .zip file extension.
- name = name.left(lwjglRegex.matchedLength() - 10);
-
- QUrl url(link);
- if (!url.isValid())
- {
- qWarning() << "LWJGL version URL isn't valid:" << link << "Skipping.";
- continue;
- }
-
- tempList.append(LWJGLVersion::Create(name, link));
- }
- }
-
- beginResetModel();
- m_vlist.swap(tempList);
- endResetModel();
-
- qDebug("Loaded LWJGL list.");
- finished();
- }
- else
- {
- failed("Failed to load LWJGL list. Network error: " + reply->errorString());
- }
-
- setLoading(false);
- reply->deleteLater();
-}
-
-const PtrLWJGLVersion LWJGLVersionList::getVersion(const QString &versionName)
-{
- for (int i = 0; i < count(); i++)
- {
- QString name = at(i)->name();
- if ( name == versionName)
- return at(i);
- }
- return PtrLWJGLVersion();
-}
-
-
-void LWJGLVersionList::failed(QString msg)
-{
- qWarning() << msg;
- emit loadListFailed(msg);
-}
-
-void LWJGLVersionList::finished()
-{
- emit loadListFinished();
-}
-
-void LWJGLVersionList::setLoading(bool loading)
-{
- m_loading = loading;
- emit loadingStateUpdated(m_loading);
-}
diff --git a/backend/lists/LwjglVersionList.h b/backend/lists/LwjglVersionList.h
deleted file mode 100644
index 2360f181..00000000
--- a/backend/lists/LwjglVersionList.h
+++ /dev/null
@@ -1,119 +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.
- */
-
-#pragma once
-
-#include <QObject>
-#include <QAbstractListModel>
-#include <QSharedPointer>
-#include <QUrl>
-
-#include <QNetworkReply>
-
-#include "libmmc_config.h"
-
-class LWJGLVersion;
-typedef QSharedPointer<LWJGLVersion> PtrLWJGLVersion;
-
-class LIBMULTIMC_EXPORT LWJGLVersion : public QObject
-{
- Q_OBJECT
-
- LWJGLVersion(const QString &name, const QString &url, QObject *parent = 0) :
- QObject(parent), m_name(name), m_url(url) { }
-public:
-
- static PtrLWJGLVersion Create(const QString &name, const QString &url, QObject *parent = 0)
- {
- return PtrLWJGLVersion(new LWJGLVersion(name, url, parent));
- };
-
- QString name() const { return m_name; }
-
- QString url() const { return m_url; }
-
-protected:
- QString m_name;
- QString m_url;
-};
-
-class LIBMULTIMC_EXPORT LWJGLVersionList : public QAbstractListModel
-{
- Q_OBJECT
-public:
- explicit LWJGLVersionList(QObject *parent = 0);
-
- static LWJGLVersionList &get();
-
- bool isLoaded() { return m_vlist.length() > 0; }
-
- const PtrLWJGLVersion getVersion(const QString &versionName);
- PtrLWJGLVersion at(int index) { return m_vlist[index]; }
- const PtrLWJGLVersion at(int index) const { return m_vlist[index]; }
-
- int count() const { return m_vlist.length(); }
-
- virtual QVariant data(const QModelIndex &index, int role) const;
- virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const;
- virtual int rowCount(const QModelIndex &parent) const { return count(); }
- virtual int columnCount(const QModelIndex &parent) const;
-
- virtual bool isLoading() const;
- virtual bool errored() const { return m_errored; }
-
- virtual QString lastErrorMsg() const { return m_lastErrorMsg; }
-
-public slots:
- /*!
- * Loads the version list.
- * This is done asynchronously. On success, the loadListFinished() signal will
- * be emitted. The list model will be reset as well, resulting in the modelReset()
- * signal being emitted. Note that the model will be reset before loadListFinished() is emitted.
- * If loading the list failed, the loadListFailed(QString msg),
- * signal will be emitted.
- */
- virtual void loadList();
-
-signals:
- /*!
- * Emitted when the list either starts or finishes loading.
- * \param loading Whether or not the list is loading.
- */
- void loadingStateUpdated(bool loading);
-
- void loadListFinished();
-
- void loadListFailed(QString msg);
-
-private:
- QList<PtrLWJGLVersion> m_vlist;
-
- QNetworkReply *m_netReply;
- QNetworkReply *reply;
-
- bool m_loading;
- bool m_errored;
- QString m_lastErrorMsg;
-
- void failed(QString msg);
-
- void finished();
-
- void setLoading(bool loading);
-
-private slots:
- virtual void netRequestComplete();
-};
-
diff --git a/backend/lists/MinecraftVersionList.cpp b/backend/lists/MinecraftVersionList.cpp
deleted file mode 100644
index 2e5f0cd7..00000000
--- a/backend/lists/MinecraftVersionList.cpp
+++ /dev/null
@@ -1,300 +0,0 @@
-/* Copyright 2013 Andrew Okin
- *
- * 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 "MinecraftVersionList.h"
-#include <net/NetWorker.h>
-
-#include <QDebug>
-
-#include <QtXml>
-
-#include <QJsonDocument>
-#include <QJsonObject>
-#include <QJsonArray>
-#include <QJsonValue>
-#include <QJsonParseError>
-
-#include <QtAlgorithms>
-
-#include <QtNetwork>
-
-#define MCVLIST_URLBASE "http://s3.amazonaws.com/Minecraft.Download/versions/"
-#define ASSETS_URLBASE "http://assets.minecraft.net/"
-#define MCN_URLBASE "http://sonicrules.org/mcnweb.py"
-
-MinecraftVersionList mcVList;
-
-MinecraftVersionList::MinecraftVersionList(QObject *parent) :
- InstVersionList(parent)
-{
-
-}
-
-Task *MinecraftVersionList::getLoadTask()
-{
- return new MCVListLoadTask(this);
-}
-
-bool MinecraftVersionList::isLoaded()
-{
- return m_loaded;
-}
-
-const InstVersionPtr MinecraftVersionList::at(int i) const
-{
- return m_vlist.at(i);
-}
-
-int MinecraftVersionList::count() const
-{
- return m_vlist.count();
-}
-
-bool cmpVersions(InstVersionPtr first, InstVersionPtr second)
-{
- const InstVersion & left = *first;
- const InstVersion & right = *second;
- return left > right;
-}
-
-void MinecraftVersionList::sort()
-{
- beginResetModel();
- qSort(m_vlist.begin(), m_vlist.end(), cmpVersions);
- endResetModel();
-}
-
-InstVersionPtr MinecraftVersionList::getLatestStable() const
-{
- for (int i = 0; i < m_vlist.length(); i++)
- {
- auto ver = m_vlist.at(i).dynamicCast<MinecraftVersion>();
- if (ver->is_latest && !ver->is_snapshot)
- {
- return m_vlist.at(i);
- }
- }
- return InstVersionPtr();
-}
-
-MinecraftVersionList &MinecraftVersionList::getMainList()
-{
- return mcVList;
-}
-
-void MinecraftVersionList::updateListData(QList<InstVersionPtr > versions)
-{
- beginResetModel();
- m_vlist = versions;
- m_loaded = true;
- endResetModel();
- // NOW SORT!!
- sort();
-}
-
-inline QDomElement getDomElementByTagName(QDomElement parent, QString tagname)
-{
- QDomNodeList elementList = parent.elementsByTagName(tagname);
- if (elementList.count())
- return elementList.at(0).toElement();
- else
- return QDomElement();
-}
-
-inline QDateTime timeFromS3Time(QString str)
-{
- return QDateTime::fromString(str, Qt::ISODate);
-}
-
-
-MCVListLoadTask::MCVListLoadTask(MinecraftVersionList *vlist)
-{
- m_list = vlist;
- m_currentStable = NULL;
- vlistReply = nullptr;
- legacyWhitelist.insert("1.5.2");
- legacyWhitelist.insert("1.5.1");
- legacyWhitelist.insert("1.5");
- legacyWhitelist.insert("1.4.7");
- legacyWhitelist.insert("1.4.6");
- legacyWhitelist.insert("1.4.5");
- legacyWhitelist.insert("1.4.4");
- legacyWhitelist.insert("1.4.2");
- legacyWhitelist.insert("1.3.2");
- legacyWhitelist.insert("1.3.1");
- legacyWhitelist.insert("1.2.5");
- legacyWhitelist.insert("1.2.4");
- legacyWhitelist.insert("1.2.3");
- legacyWhitelist.insert("1.2.2");
- legacyWhitelist.insert("1.2.1");
- legacyWhitelist.insert("1.1");
- legacyWhitelist.insert("1.0.1");
- legacyWhitelist.insert("1.0");
-}
-
-MCVListLoadTask::~MCVListLoadTask()
-{
-}
-
-void MCVListLoadTask::executeTask()
-{
- setStatus("Loading instance version list...");
- auto & worker = NetWorker::spawn();
- vlistReply = worker.get(QNetworkRequest(QUrl(QString(MCVLIST_URLBASE) + "versions.json")));
- connect(vlistReply, SIGNAL(finished()), this, SLOT(list_downloaded()));
-}
-
-
-void MCVListLoadTask::list_downloaded()
-{
- if(vlistReply->error() != QNetworkReply::QNetworkReply::NoError)
- {
- vlistReply->deleteLater();
- emitFailed("Failed to load Minecraft main version list" + vlistReply->errorString());
- return;
- }
-
- QJsonParseError jsonError;
- QJsonDocument jsonDoc = QJsonDocument::fromJson(vlistReply->readAll(), &jsonError);
- vlistReply->deleteLater();
-
- if (jsonError.error != QJsonParseError::NoError)
- {
- emitFailed("Error parsing version list JSON:" + jsonError.errorString());
- return;
- }
-
- if(!jsonDoc.isObject())
- {
- emitFailed("Error parsing version list JSON: jsonDoc is not an object");
- return;
- }
-
- QJsonObject root = jsonDoc.object();
-
- // Get the ID of the latest release and the latest snapshot.
- if(!root.value("latest").isObject())
- {
- emitFailed("Error parsing version list JSON: version list is missing 'latest' object");
- return;
- }
-
- QJsonObject latest = root.value("latest").toObject();
-
- QString latestReleaseID = latest.value("release").toString("");
- QString latestSnapshotID = latest.value("snapshot").toString("");
- if(latestReleaseID.isEmpty())
- {
- emitFailed("Error parsing version list JSON: latest release field is missing");
- return;
- }
- if(latestSnapshotID.isEmpty())
- {
- emitFailed("Error parsing version list JSON: latest snapshot field is missing");
- return;
- }
-
- // Now, get the array of versions.
- if(!root.value("versions").isArray())
- {
- emitFailed("Error parsing version list JSON: version list object is missing 'versions' array");
- return;
- }
- QJsonArray versions = root.value("versions").toArray();
-
- QList<InstVersionPtr > tempList;
- for (int i = 0; i < versions.count(); i++)
- {
- bool is_snapshot = false;
- bool is_latest = false;
-
- // Load the version info.
- if(!versions[i].isObject())
- {
- //FIXME: log this somewhere
- continue;
- }
- QJsonObject version = versions[i].toObject();
- QString versionID = version.value("id").toString("");
- QString versionTimeStr = version.value("releaseTime").toString("");
- QString versionTypeStr = version.value("type").toString("");
- if(versionID.isEmpty() || versionTimeStr.isEmpty() || versionTypeStr.isEmpty())
- {
- //FIXME: log this somewhere
- continue;
- }
-
- // Parse the timestamp.
- QDateTime versionTime = timeFromS3Time(versionTimeStr);
- if(!versionTime.isValid())
- {
- //FIXME: log this somewhere
- continue;
- }
- // Parse the type.
- MinecraftVersion::VersionType versionType;
- // OneSix or Legacy. use filter to determine type
- if (versionTypeStr == "release")
- {
- versionType = legacyWhitelist.contains(versionID)?MinecraftVersion::Legacy:MinecraftVersion::OneSix;
- is_latest = (versionID == latestReleaseID);
- is_snapshot = false;
- }
- else if(versionTypeStr == "snapshot") // It's a snapshot... yay
- {
- versionType = legacyWhitelist.contains(versionID)?MinecraftVersion::Legacy:MinecraftVersion::OneSix;
- is_latest = (versionID == latestSnapshotID);
- is_snapshot = true;
- }
- else if(versionTypeStr == "old_alpha")
- {
- versionType = MinecraftVersion::Nostalgia;
- is_latest = false;
- is_snapshot = false;
- }
- else if(versionTypeStr == "old_beta")
- {
- versionType = MinecraftVersion::Legacy;
- is_latest = false;
- is_snapshot = false;
- }
- else
- {
- //FIXME: log this somewhere
- continue;
- }
- // Get the download URL.
- QString dlUrl = QString(MCVLIST_URLBASE) + versionID + "/";
-
- // Now, we construct the version object and add it to the list.
- QSharedPointer<MinecraftVersion> mcVersion(new MinecraftVersion());
- mcVersion->name = mcVersion->descriptor = versionID;
- mcVersion->timestamp = versionTime.toMSecsSinceEpoch();
- mcVersion->download_url = dlUrl;
- mcVersion->is_latest = is_latest;
- mcVersion->is_snapshot = is_snapshot;
- mcVersion->type = versionType;
- tempList.append(mcVersion);
- }
- m_list->updateListData(tempList);
-
- emitSucceeded();
- return;
-}
-
-// FIXME: we should have a local cache of the version list and a local cache of version data
-bool MCVListLoadTask::loadFromVList()
-{
-}
diff --git a/backend/lists/MinecraftVersionList.h b/backend/lists/MinecraftVersionList.h
deleted file mode 100644
index d3b18691..00000000
--- a/backend/lists/MinecraftVersionList.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/* Copyright 2013 Andrew Okin
- *
- * 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.
- */
-
-#pragma once
-
-#include <QObject>
-#include <QList>
-#include <QSet>
-#include <QSharedPointer>
-
-#include "InstVersionList.h"
-#include "tasks/Task.h"
-#include "MinecraftVersion.h"
-#include "libmmc_config.h"
-
-class MCVListLoadTask;
-class QNetworkReply;
-
-class LIBMULTIMC_EXPORT MinecraftVersionList : public InstVersionList
-{
- Q_OBJECT
-public:
- friend class MCVListLoadTask;
-
- explicit MinecraftVersionList(QObject *parent = 0);
-
- virtual Task *getLoadTask();
- virtual bool isLoaded();
- virtual const InstVersionPtr at(int i) const;
- virtual int count() const;
- virtual void sort();
-
- virtual InstVersionPtr getLatestStable() const;
-
- /*!
- * Gets the main version list instance.
- */
- static MinecraftVersionList &getMainList();
-
-
-protected:
- QList<InstVersionPtr > m_vlist;
-
- bool m_loaded;
-
-protected slots:
- virtual void updateListData(QList<InstVersionPtr > versions);
-};
-
-class MCVListLoadTask : public Task
-{
- Q_OBJECT
-
-public:
- explicit MCVListLoadTask(MinecraftVersionList *vlist);
- ~MCVListLoadTask();
-
- virtual void executeTask();
-
-protected slots:
- void list_downloaded();
-
-protected:
- //! Loads versions from Mojang's official version list.
- bool loadFromVList();
-
- QNetworkReply *vlistReply;
- MinecraftVersionList *m_list;
- MinecraftVersion *m_currentStable;
- QSet<QString> legacyWhitelist;
-};
-
diff --git a/backend/net/DownloadJob.cpp b/backend/net/DownloadJob.cpp
deleted file mode 100644
index ef842dfd..00000000
--- a/backend/net/DownloadJob.cpp
+++ /dev/null
@@ -1,138 +0,0 @@
-#include "DownloadJob.h"
-#include "pathutils.h"
-#include "NetWorker.h"
-
-DownloadJob::DownloadJob (QUrl url,
- QString target_path,
- QString expected_md5 )
- :Job()
-{
- m_url = url;
- m_target_path = target_path;
- m_expected_md5 = expected_md5;
-
- m_check_md5 = m_expected_md5.size();
- m_save_to_file = m_target_path.size();
- m_status = Job_NotStarted;
- m_opened_for_saving = false;
-}
-
-JobPtr DownloadJob::create (QUrl url,
- QString target_path,
- QString expected_md5 )
-{
- return JobPtr ( new DownloadJob ( url, target_path, expected_md5 ) );
-}
-
-void DownloadJob::start()
-{
- if ( m_save_to_file )
- {
- QString filename = m_target_path;
- m_output_file.setFileName ( filename );
- // if there already is a file and md5 checking is in effect and it can be opened
- if ( m_output_file.exists() && m_output_file.open ( QIODevice::ReadOnly ) )
- {
- // check the md5 against the expected one
- QString hash = QCryptographicHash::hash ( m_output_file.readAll(), QCryptographicHash::Md5 ).toHex().constData();
- m_output_file.close();
- // skip this file if they match
- if ( m_check_md5 && hash == m_expected_md5 )
- {
- qDebug() << "Skipping " << m_url.toString() << ": md5 match.";
- emit finish();
- return;
- }
- else
- {
- m_expected_md5 = hash;
- }
- }
- if(!ensurePathExists(filename))
- {
- emit fail();
- return;
- }
- }
- qDebug() << "Downloading " << m_url.toString();
- QNetworkRequest request ( m_url );
- request.setRawHeader(QString("If-None-Match").toLatin1(), m_expected_md5.toLatin1());
-
- auto &worker = NetWorker::spawn();
- QNetworkReply * rep = worker.get ( request );
-
- m_reply = QSharedPointer<QNetworkReply> ( rep, &QObject::deleteLater );
- connect ( rep, SIGNAL ( downloadProgress ( qint64,qint64 ) ), SLOT ( downloadProgress ( qint64,qint64 ) ) );
- connect ( rep, SIGNAL ( finished() ), SLOT ( downloadFinished() ) );
- connect ( rep, SIGNAL ( error ( QNetworkReply::NetworkError ) ), SLOT ( downloadError ( QNetworkReply::NetworkError ) ) );
- connect ( rep, SIGNAL ( readyRead() ), SLOT ( downloadReadyRead() ) );
-}
-
-void DownloadJob::downloadProgress ( qint64 bytesReceived, qint64 bytesTotal )
-{
- emit progress ( bytesReceived, bytesTotal );
-}
-
-void DownloadJob::downloadError ( QNetworkReply::NetworkError error )
-{
- // error happened during download.
- // TODO: log the reason why
- m_status = Job_Failed;
-}
-
-void DownloadJob::downloadFinished()
-{
- // if the download succeeded
- if ( m_status != Job_Failed )
- {
- // nothing went wrong...
- m_status = Job_Finished;
- // save the data to the downloadable if we aren't saving to file
- if ( !m_save_to_file )
- {
- m_data = m_reply->readAll();
- }
- else
- {
- m_output_file.close();
- }
-
- //TODO: check md5 here!
- m_reply.clear();
- emit finish();
- return;
- }
- // else the download failed
- else
- {
- if ( m_save_to_file )
- {
- m_output_file.close();
- m_output_file.remove();
- }
- m_reply.clear();
- emit fail();
- return;
- }
-}
-
-void DownloadJob::downloadReadyRead()
-{
- if( m_save_to_file )
- {
- if(!m_opened_for_saving)
- {
- if ( !m_output_file.open ( QIODevice::WriteOnly ) )
- {
- /*
- * Can't open the file... the job failed
- */
- m_reply->abort();
- emit fail();
- return;
- }
- m_opened_for_saving = true;
- }
- m_output_file.write ( m_reply->readAll() );
- }
-}
diff --git a/backend/net/DownloadJob.h b/backend/net/DownloadJob.h
deleted file mode 100644
index cbde3852..00000000
--- a/backend/net/DownloadJob.h
+++ /dev/null
@@ -1,51 +0,0 @@
-#pragma once
-#include "JobQueue.h"
-#include <QtNetwork>
-
-/**
- * A single file for the downloader/cache to process.
- */
-class LIBUTIL_EXPORT DownloadJob : public Job
-{
- Q_OBJECT
-public:
- DownloadJob(QUrl url,
- QString rel_target_path = QString(),
- QString expected_md5 = QString()
- );
- static JobPtr create(QUrl url, QString rel_target_path = QString(), QString expected_md5 = QString());
-public slots:
- virtual void start();
-
-private slots:
- void downloadProgress(qint64 bytesReceived, qint64 bytesTotal);;
- void downloadError(QNetworkReply::NetworkError error);
- void downloadFinished();
- void downloadReadyRead();
-
-public:
- /// the network reply
- QSharedPointer<QNetworkReply> m_reply;
- /// source URL
- QUrl m_url;
-
- /// if true, check the md5sum against a provided md5sum
- /// also, if a file exists, perform an md5sum first and don't download only if they don't match
- bool m_check_md5;
- /// the expected md5 checksum
- QString m_expected_md5;
-
- /// save to file?
- bool m_save_to_file;
- /// is the saving file already open?
- bool m_opened_for_saving;
- /// if saving to file, use the one specified in this string
- QString m_target_path;
- /// this is the output file, if any
- QFile m_output_file;
- /// if not saving to file, downloaded data is placed here
- QByteArray m_data;
-
- /// The file's status
- JobStatus m_status;
-};
diff --git a/backend/net/JobQueue.h b/backend/net/JobQueue.h
deleted file mode 100644
index 26f49307..00000000
--- a/backend/net/JobQueue.h
+++ /dev/null
@@ -1,180 +0,0 @@
-#pragma once
-#include <QtCore>
-#include "libutil_config.h"
-
-enum JobStatus
-{
- Job_NotStarted,
- Job_InProgress,
- Job_Finished,
- Job_Failed
-};
-
-class JobList;
-
-class LIBUTIL_EXPORT Job : public QObject
-{
- Q_OBJECT
-protected:
- explicit Job(): QObject(0){};
-public:
- virtual ~Job() {};
-signals:
- void finish();
- void fail();
- void progress(qint64 current, qint64 total);
-public slots:
- virtual void start() = 0;
-};
-typedef QSharedPointer<Job> JobPtr;
-
-/**
- * A list of jobs, to be processed one by one.
- */
-class LIBUTIL_EXPORT JobList : public QObject
-{
- friend class JobListQueue;
- Q_OBJECT
-public:
-
- JobList() : QObject(0)
- {
- m_status = Job_NotStarted;
- current_job_idx = 0;
- }
- JobStatus getStatus()
- {
- return m_status;
- }
- void add(JobPtr dlable)
- {
- if(m_status == Job_NotStarted)
- m_jobs.append(dlable);
- //else there's a bug. TODO: catch the bugs
- }
- JobPtr getFirstJob()
- {
- if(m_jobs.size())
- return m_jobs[0];
- else
- return JobPtr();
- }
- void start()
- {
- current_job_idx = 0;
- auto job = m_jobs[current_job_idx];
-
- connect(job.data(), SIGNAL(progress(qint64,qint64)), SLOT(currentJobProgress(qint64,qint64)));
- connect(job.data(), SIGNAL(finish()), SLOT(currentJobFinished()));
- connect(job.data(), SIGNAL(fail()), SLOT(currentJobFailed()));
- job->start();
- emit started();
- }
-private slots:
- void currentJobFinished()
- {
- if(current_job_idx == m_jobs.size() - 1)
- {
- m_status = Job_Finished;
- emit finished();
- }
- else
- {
- current_job_idx++;
- auto job = m_jobs[current_job_idx];
- connect(job.data(), SIGNAL(progress(qint64,qint64)), SLOT(currentJobProgress(qint64,qint64)));
- connect(job.data(), SIGNAL(finish()), SLOT(currentJobFinished()));
- connect(job.data(), SIGNAL(fail()), SLOT(currentJobFailed()));
- job->start();
- }
- }
- void currentJobFailed()
- {
- m_status = Job_Failed;
- emit failed();
- }
- void currentJobProgress(qint64 current, qint64 total)
- {
- if(!total)
- return;
-
- int total_jobs = m_jobs.size();
-
- if(!total_jobs)
- return;
-
- float job_chunk = 1000.0 / float(total_jobs);
- float cur = current;
- float tot = total;
- float last_chunk = (cur / tot) * job_chunk;
-
- float list_total = job_chunk * current_job_idx + last_chunk;
- emit progress(qint64(list_total), 1000LL);
- }
-private:
- QVector<JobPtr> m_jobs;
- /// The overall status of this job list
- JobStatus m_status;
- int current_job_idx;
-signals:
- void progress(qint64 current, qint64 total);
- void started();
- void finished();
- void failed();
-};
-typedef QSharedPointer<JobList> JobListPtr;
-
-
-/**
- * A queue of job lists! The job lists fail or finish as units.
- */
-class LIBUTIL_EXPORT JobListQueue : public QObject
-{
- Q_OBJECT
-public:
- JobListQueue(QObject *p = 0):
- QObject(p),
- currentIndex(0),
- is_running(false){}
-
- void enqueue(JobListPtr job)
- {
- jobs.enqueue(job);
-
- // finish or fail, we should catch that and start the next one
- connect(job.data(),SIGNAL(finished()), SLOT(startNextJob()));
- connect(job.data(),SIGNAL(failed()), SLOT(startNextJob()));
-
- if(!is_running)
- {
- QTimer::singleShot(0, this, SLOT(startNextJob()));
- }
- }
-
-private slots:
- void startNextJob()
- {
- if (jobs.isEmpty())
- {
- currentJobList.clear();
- currentIndex = 0;
- is_running = false;
- emit finishedAllJobs();
- return;
- }
-
- currentJobList = jobs.dequeue();
- is_running = true;
- currentIndex = 0;
- currentJobList->start();
- }
-
-signals:
- void finishedAllJobs();
-
-private:
- JobListPtr currentJobList;
- QQueue<JobListPtr> jobs;
- unsigned currentIndex;
- bool is_running;
-};
diff --git a/backend/net/NetWorker.cpp b/backend/net/NetWorker.cpp
deleted file mode 100644
index 1eef13d9..00000000
--- a/backend/net/NetWorker.cpp
+++ /dev/null
@@ -1,12 +0,0 @@
-#include "NetWorker.h"
-#include <QThreadStorage>
-
-NetWorker& NetWorker::spawn()
-{
- static QThreadStorage<NetWorker *> storage;
- if (!storage.hasLocalData())
- {
- storage.setLocalData(new NetWorker());
- }
- return *storage.localData();
-}
diff --git a/backend/net/NetWorker.h b/backend/net/NetWorker.h
deleted file mode 100644
index 98374e3b..00000000
--- a/backend/net/NetWorker.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- _.ooo-._
- .OOOP _ '.
- dOOOO (_) \
- OOOOOb |
- OOOOOOb. |
- OOOOOOOOb |
- YOO(_)OOO /
- 'OOOOOY _.'
- '""""''
-*/
-
-#pragma once
-#include <QNetworkAccessManager>
-class NetWorker : public QNetworkAccessManager
-{
- Q_OBJECT
-public:
- static NetWorker &spawn();
-}; \ No newline at end of file
diff --git a/backend/tasks/LoginTask.cpp b/backend/tasks/LoginTask.cpp
deleted file mode 100644
index 48202044..00000000
--- a/backend/tasks/LoginTask.cpp
+++ /dev/null
@@ -1,111 +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 "LoginTask.h"
-#include <net/NetWorker.h>
-
-#include <QStringList>
-
-#include <QNetworkReply>
-#include <QNetworkRequest>
-
-#include <QUrl>
-#include <QUrlQuery>
-
-LoginTask::LoginTask( const UserInfo& uInfo, QObject* parent ) : Task(parent), uInfo(uInfo){}
-
-void LoginTask::executeTask()
-{
- setStatus("Logging in...");
- auto & worker = NetWorker::spawn();
- connect(&worker, SIGNAL(finished(QNetworkReply*)), this, SLOT(processNetReply(QNetworkReply*)));
-
- QUrl loginURL("https://login.minecraft.net/");
- QNetworkRequest netRequest(loginURL);
- netRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
-
- QUrlQuery params;
- params.addQueryItem("user", uInfo.username);
- params.addQueryItem("password", uInfo.password);
- params.addQueryItem("version", "13");
-
- netReply = worker.post(netRequest, params.query(QUrl::EncodeSpaces).toUtf8());
-}
-
-void LoginTask::processNetReply(QNetworkReply *reply)
-{
- if(netReply != reply)
- return;
- // Check for errors.
- switch (reply->error())
- {
- case QNetworkReply::NoError:
- {
- // Check the response code.
- int responseCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
-
- if (responseCode == 200)
- {
- QString responseStr(reply->readAll());
-
- QStringList strings = responseStr.split(":");
- if (strings.count() >= 4)
- {
- bool parseSuccess;
- qint64 latestVersion = strings[0].toLongLong(&parseSuccess);
- if (parseSuccess)
- {
- // strings[1] is the download ticket. It isn't used anymore.
- QString username = strings[2];
- QString sessionID = strings[3];
-
- result = {username, sessionID, latestVersion};
- emitSucceeded();
- }
- else
- {
- emitFailed("Failed to parse Minecraft version string.");
- }
- }
- else
- {
- if (responseStr.toLower() == "bad login")
- emitFailed("Invalid username or password.");
- else if (responseStr.toLower() == "old version")
- emitFailed("Launcher outdated, please update.");
- else
- emitFailed("Login failed: " + responseStr);
- }
- }
- else if (responseCode == 503)
- {
- emitFailed("The login servers are currently unavailable. Check http://help.mojang.com/ for more info.");
- }
- else
- {
- emitFailed(QString("Login failed: Unknown HTTP error %1 occurred.").arg(QString::number(responseCode)));
- }
- break;
- }
-
- case QNetworkReply::OperationCanceledError:
- emitFailed("Login canceled.");
- break;
-
- default:
- emitFailed("Login failed: " + reply->errorString());
- break;
- }
-}
diff --git a/backend/tasks/LoginTask.h b/backend/tasks/LoginTask.h
deleted file mode 100644
index 77d65255..00000000
--- a/backend/tasks/LoginTask.h
+++ /dev/null
@@ -1,59 +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 LOGINTASK_H
-#define LOGINTASK_H
-
-#include "Task.h"
-#include <QSharedPointer>
-#include "libmmc_config.h"
-
-struct UserInfo
-{
- QString username;
- QString password;
-};
-
-struct LoginResponse
-{
- QString username;
- QString sessionID;
- qint64 latestVersion;
-};
-
-class QNetworkReply;
-
-class LIBMULTIMC_EXPORT LoginTask : public Task
-{
- Q_OBJECT
-public:
- explicit LoginTask(const UserInfo& uInfo, QObject *parent = 0);
- LoginResponse getResult()
- {
- return result;
- };
-
-protected slots:
- void processNetReply(QNetworkReply* reply);
-
-protected:
- void executeTask();
-
- LoginResponse result;
- QNetworkReply* netReply;
- UserInfo uInfo;
-};
-
-#endif // LOGINTASK_H
diff --git a/backend/tasks/Task.cpp b/backend/tasks/Task.cpp
deleted file mode 100644
index 7c148591..00000000
--- a/backend/tasks/Task.cpp
+++ /dev/null
@@ -1,85 +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 "Task.h"
-
-Task::Task(QObject *parent) :
- QObject(parent)
-{
-
-}
-
-QString Task::getStatus() const
-{
- return status;
-}
-
-void Task::setStatus(const QString &status)
-{
- this->status = status;
- emitStatusChange(status);
-}
-
-int Task::getProgress() const
-{
- return progress;
-}
-
-void Task::setProgress(int progress)
-{
- this->progress = progress;
- emitProgressChange(progress);
-}
-
-void Task::startTask()
-{
- emitStarted();
- executeTask();
-}
-
-void Task::emitStarted()
-{
- running = true;
- emit started();
-}
-
-void Task::emitFailed(QString reason)
-{
- running = false;
- emit failed(reason);
-}
-
-void Task::emitSucceeded()
-{
- running = false;
- emit succeeded();
-}
-
-
-bool Task::isRunning() const
-{
- return running;
-}
-
-
-void Task::emitStatusChange(const QString &status)
-{
- emit statusChanged(status);
-}
-
-void Task::emitProgressChange(int progress)
-{
- emit progressChanged(progress);
-}
diff --git a/backend/tasks/Task.h b/backend/tasks/Task.h
deleted file mode 100644
index 15219931..00000000
--- a/backend/tasks/Task.h
+++ /dev/null
@@ -1,67 +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 TASK_H
-#define TASK_H
-
-#include <QObject>
-#include <QString>
-
-#include "libmmc_config.h"
-
-class LIBMULTIMC_EXPORT Task : public QObject
-{
- Q_OBJECT
-public:
- explicit Task(QObject *parent = 0);
-
- QString getStatus() const;
- int getProgress() const;
- bool isRunning() const;
-
-public slots:
- void startTask();
-
-protected slots:
- void setStatus(const QString& status);
- void setProgress(int progress);
-
-signals:
- void started();
- void failed(QString reason);
- void succeeded();
-
- void statusChanged(Task* task, const QString& status);
- void progressChanged(Task* task, int progress);
-
- void statusChanged(const QString& status);
- void progressChanged(int progress);
-
-protected:
- virtual void executeTask() = 0;
-
- virtual void emitStarted();
- virtual void emitFailed(QString reason);
- virtual void emitSucceeded();
-
- virtual void emitStatusChange(const QString &status);
- virtual void emitProgressChange(int progress);
-
- QString status;
- int progress;
- bool running = false;
-};
-
-#endif // TASK_H