2015-02-08 16:56:14 +00:00
|
|
|
#pragma once
|
|
|
|
#include <QByteArray>
|
2015-02-09 00:51:14 +00:00
|
|
|
#include <net/NetJob.h>
|
2015-02-08 16:56:14 +00:00
|
|
|
|
|
|
|
namespace GoUpdate
|
|
|
|
{
|
|
|
|
|
|
|
|
/**
|
|
|
|
* A temporary object exchanged between updated checker and the actual update task
|
|
|
|
*/
|
|
|
|
struct Status
|
|
|
|
{
|
|
|
|
bool updateAvailable = false;
|
|
|
|
|
|
|
|
int newVersionId = -1;
|
|
|
|
QString newRepoUrl;
|
|
|
|
|
|
|
|
int currentVersionId = -1;
|
|
|
|
QString currentRepoUrl;
|
|
|
|
|
|
|
|
// path to the root of the application
|
|
|
|
QString rootPath;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Struct that describes an entry in a VersionFileEntry's `Sources` list.
|
|
|
|
*/
|
|
|
|
struct FileSource
|
|
|
|
{
|
|
|
|
FileSource(QString type, QString url, QString compression="")
|
|
|
|
{
|
|
|
|
this->type = type;
|
|
|
|
this->url = url;
|
|
|
|
this->compressionType = compression;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool operator==(const FileSource &f2) const
|
|
|
|
{
|
|
|
|
return type == f2.type && url == f2.url && compressionType == f2.compressionType;
|
|
|
|
}
|
|
|
|
|
|
|
|
QString type;
|
|
|
|
QString url;
|
|
|
|
QString compressionType;
|
|
|
|
};
|
|
|
|
typedef QList<FileSource> FileSourceList;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Structure that describes an entry in a GoUpdate version's `Files` list.
|
|
|
|
*/
|
|
|
|
struct VersionFileEntry
|
|
|
|
{
|
|
|
|
QString path;
|
|
|
|
int mode;
|
|
|
|
FileSourceList sources;
|
|
|
|
QString md5;
|
|
|
|
bool operator==(const VersionFileEntry &v2) const
|
|
|
|
{
|
|
|
|
return path == v2.path && mode == v2.mode && sources == v2.sources && md5 == v2.md5;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
typedef QList<VersionFileEntry> VersionFileList;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Structure that describes an operation to perform when installing updates.
|
|
|
|
*/
|
|
|
|
struct Operation
|
|
|
|
{
|
2015-06-07 21:42:22 +00:00
|
|
|
static Operation CopyOp(QString fsource, QString fdest, int fmode=0644)
|
|
|
|
{
|
2015-06-09 21:23:46 +00:00
|
|
|
return Operation{OP_REPLACE, fsource, fdest, fmode};
|
2015-06-07 21:42:22 +00:00
|
|
|
}
|
|
|
|
static Operation DeleteOp(QString file)
|
|
|
|
{
|
|
|
|
return Operation{OP_DELETE, file, "", 0644};
|
|
|
|
}
|
2015-02-08 16:56:14 +00:00
|
|
|
|
|
|
|
// FIXME: for some types, some of the other fields are irrelevant!
|
|
|
|
bool operator==(const Operation &u2) const
|
|
|
|
{
|
|
|
|
return type == u2.type && file == u2.file && dest == u2.dest && mode == u2.mode;
|
|
|
|
}
|
|
|
|
|
|
|
|
//! Specifies the type of operation that this is.
|
|
|
|
enum Type
|
|
|
|
{
|
2015-06-09 21:23:46 +00:00
|
|
|
OP_REPLACE,
|
2015-02-08 16:56:14 +00:00
|
|
|
OP_DELETE,
|
|
|
|
} type;
|
|
|
|
|
2015-06-08 00:43:16 +00:00
|
|
|
//! The file to operate on.
|
2015-02-08 16:56:14 +00:00
|
|
|
QString file;
|
|
|
|
|
2015-06-08 00:43:16 +00:00
|
|
|
//! The destination file.
|
2015-02-08 16:56:14 +00:00
|
|
|
QString dest;
|
|
|
|
|
2015-06-08 00:43:16 +00:00
|
|
|
//! The mode to change the source file to.
|
2015-02-08 16:56:14 +00:00
|
|
|
int mode;
|
|
|
|
};
|
|
|
|
typedef QList<Operation> OperationList;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Loads the file list from the given version info JSON object into the given list.
|
|
|
|
*/
|
|
|
|
bool parseVersionInfo(const QByteArray &data, VersionFileList& list, QString &error);
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* Takes a list of file entries for the current version's files and the new version's files
|
|
|
|
* and populates the downloadList and operationList with information about how to download and install the update.
|
|
|
|
*/
|
|
|
|
bool processFileLists
|
|
|
|
(
|
|
|
|
const VersionFileList ¤tVersion,
|
|
|
|
const VersionFileList &newVersion,
|
|
|
|
const QString &rootPath,
|
|
|
|
const QString &tempPath,
|
|
|
|
NetJobPtr job,
|
2015-06-07 21:42:22 +00:00
|
|
|
OperationList &ops
|
2015-02-08 16:56:14 +00:00
|
|
|
);
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* This fixes destination paths for OSX - removes 'MultiMC.app' prefix
|
|
|
|
* The updater runs in MultiMC.app/Contents/MacOs by default
|
|
|
|
* The destination paths are such as this: MultiMC.app/blah/blah
|
|
|
|
*
|
|
|
|
* @return false if the path couldn't be fixed (is invalid)
|
|
|
|
*/
|
|
|
|
bool fixPathForOSX(QString &path);
|
|
|
|
|
|
|
|
}
|
|
|
|
Q_DECLARE_METATYPE(GoUpdate::Status);
|