summaryrefslogtreecommitdiffstats
path: root/libmultimc/include/gameupdatetask.h
blob: f607db6b11acbef9feb2f247ed5d5fb168ecd9ba (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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
/* Copyright 2013 MultiMC Contributors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef GAMEUPDATETASK_H
#define GAMEUPDATETASK_H

#include <QObject>

#include <QList>

#include <QNetworkAccessManager>
#include <QUrl>
#include "dlqueue.h"

#include "task.h"
#include "loginresponse.h"
#include "instance.h"

#include "libmmc_config.h"

class MinecraftVersion;

/*!
 * The game update task is the task that handles downloading instances' files.
 */
class LIBMULTIMC_EXPORT GameUpdateTask : public Task
{
	Q_OBJECT
	
	/*!
	 * The task's state.
	 * A certain state message will be shown depending on what this is set to.
	 */
	Q_PROPERTY(int state READ state WRITE setState)
	
	/*!
	 * The substatus message.
	 * This will be next to the the state message in the task's status.
	 */
	Q_PROPERTY(QString subStatus READ subStatus WRITE setSubStatus)
public:
	explicit GameUpdateTask(const LoginResponse &response, Instance *inst, QObject *parent = 0);
	
	
	/////////////////////////
	// EXECUTION FUNCTIONS //
	/////////////////////////
	
	virtual void executeTask();
	
	//////////////////////
	// STATE AND STATUS //
	//////////////////////
	
	virtual int state() const;
	virtual void setState(int state, bool resetSubStatus = true);
	
	virtual QString subStatus() const;
	virtual void setSubStatus(const QString &msg);
	
	/*!
	 * Gets the message that will be displated for the given state.
	 */
	virtual QString getStateMessage(int state);
	
private:
	void getLegacyJar();
	void determineNewVersion();
	
public slots:
	
	/*!
	 * Updates the status message based on the state and substatus message.
	 */
	virtual void updateStatus();
	
	
	virtual void error(const QString &msg);
	
	
private slots:
	void updateDownloadProgress(qint64 current, qint64 total);
	void legacyJarFinished();
	void legacyJarFailed();
	
	void versionFileFinished();
	void versionFileFailed();
	
signals:
	/*!
	 * \brief Signal emitted when the game update is complete.
	 * \param response The login response received from login task.
	 */
	void gameUpdateComplete(const LoginResponse &response);
	
	/*!
	 * \brief Signal emitted if an error occurrs during the update.
	 * \param errorMsg An error message to be displayed to the user.
	 */
	void gameUpdateError(const QString &errorMsg);
	
private:
	///////////
	// STUFF //
	///////////
	
	Instance *m_inst;
	LoginResponse m_response;
	
	////////////////////////////
	// STATE AND STATUS STUFF //
	////////////////////////////
	
	int m_updateState;
	QString m_subStatusMsg;
	
	enum UpdateState
	{
		// Initializing
		StateInit = 0,
		
		// Determining files to download
		StateDetermineURLs,
		
		// Downloading files
		StateDownloadFiles,
		
		// Installing files
		StateInstall,
		
		// Finished
		StateFinished
	};
	JobListPtr legacyDownloadJob;
	JobListPtr specificVersionDownloadJob;
	JobListPtr jarlibDownloadJob;
	JobListQueue download_queue;
	
	// target version, determined during this task
	MinecraftVersion *targetVersion;
};


#endif // GAMEUPDATETASK_H