summaryrefslogtreecommitdiffstats
path: root/logic/updater/GoUpdate.h
blob: 21976f8f385a2bc7afdd71a37ce5997c4caba3ca (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
#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 DeleteOp(QString file)
	{
		return Operation{OP_DELETE, file, "", 0644};
	}

	// 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,
	} type;

	//! The file to operate on.
	QString file;

	//! The destination file.
	QString dest;

	//! The mode to change the source file to.
	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 &currentVersion,
	const VersionFileList &newVersion,
	const QString &rootPath,
	const QString &tempPath,
	NetJobPtr job,
	OperationList &ops
);

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