summaryrefslogtreecommitdiffstats
path: root/logic/updater/GoUpdate.h
blob: c58fd1eb21ab1298e2a6c49ac2fff8251156de75 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#pragma once
#include <QByteArray>
#include <net/NetJob.h>

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
{
	static Operation CopyOp(QString fsource, QString fdest, int fmode=0644) { return Operation{OP_COPY, fsource, fdest, fmode}; }
	static Operation MoveOp(QString fsource, QString fdest, int fmode=0644) { return Operation{OP_MOVE, fsource, fdest, fmode}; }
	static Operation DeleteOp(QString file) { return Operation{OP_DELETE, file, "", 0644}; }
	static Operation ChmodOp(QString file, int fmode) { return Operation{OP_CHMOD, file, "", fmode}; }

	// 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
	{
		OP_COPY,
		OP_DELETE,
		OP_MOVE,
		OP_CHMOD,
	} type;

	//! The file to operate on. If this is a DELETE or CHMOD operation, this is the file that will be modified.
	QString file;

	//! The destination file. If this is a DELETE or CHMOD operation, this field will be ignored.
	QString dest;

	//! The mode to change the source file to. Ignored if this isn't a CHMOD operation.
	int mode;
};
typedef QList<Operation> OperationList;

/**
 * Takes the @OperationList list and writes an install script for the updater to the update files directory.
 */
bool writeInstallScript(OperationList& opsList, QString scriptFile);

/**
 * 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 &currentVersion,
	const VersionFileList &newVersion,
	const QString &rootPath,
	const QString &tempPath,
	NetJobPtr job,
	OperationList &ops,
	bool useLocalUpdater
);

/*!
 * 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);