summaryrefslogtreecommitdiffstats
path: root/logic/auth/YggdrasilTask.h
blob: 5a433aeb6c2d5d0a9d517d09c06d5317ae6c817b (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
/* 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 <logic/tasks/Task.h>

#include <QString>
#include <QJsonObject>

#include "logic/auth/MojangAccount.h"

class QNetworkReply;


/**
 * A Yggdrasil task is a task that performs an operation on a given mojang account.
 */
class YggdrasilTask : public Task
{
Q_OBJECT
public:
	explicit YggdrasilTask(MojangAccountPtr account, QObject* parent=0);
	~YggdrasilTask();

	/**
	 * Class describing a Yggdrasil error response.
	 */
	class Error
	{
	public:
		Error(const QString& shortError, const QString& errorMessage, const QString& cause) : 
			m_shortError(shortError), m_errorMessage(errorMessage), m_cause(cause) {}

		QString getShortError() const { return m_shortError; }
		QString getErrorMessage() const { return m_errorMessage; }
		QString getCause() const { return m_cause; }

		/// Gets the string to display in the GUI for describing this error.
		QString getDisplayMessage() { return getErrorMessage(); }

	protected:
		QString m_shortError;
		QString m_errorMessage;
		QString m_cause;
	};

	/**
	 * Gets the Mojang account that this task is operating on.
	 */
	virtual MojangAccountPtr getMojangAccount() const;

	/**
	 * Returns a pointer to a YggdrasilTask::Error object if an error has occurred.
	 * If no error has occurred, returns a null pointer.
	 */
	virtual Error* getError() const;

protected:
	/**
	 * Enum for describing the state of the current task.
	 * Used by the getStateMessage function to determine what the status message should be.
	 */
	enum State
	{
		STATE_SENDING_REQUEST,
		STATE_PROCESSING_RESPONSE,
		STATE_OTHER,
	};

	virtual void executeTask();

	/**
	 * Gets the JSON object that will be sent to the authentication server.
	 * Should be overridden by subclasses.
	 */
	virtual QJsonObject getRequestContent() const = 0;

	/**
	 * Gets the endpoint to POST to.
	 * No leading slash.
	 */
	virtual QString getEndpoint() const = 0;

	/**
	 * Processes the response received from the server.
	 * If an error occurred, this should emit a failed signal and return false.
	 * If Yggdrasil gave an error response, it should call setError() first, and then return false.
	 * Otherwise, it should return true.
	 * Note: If the response from the server was blank, and the HTTP code was 200, this function is called with
	 * an empty QJsonObject.
	 */
	virtual bool processResponse(QJsonObject responseData) = 0;

	/**
	 * Processes an error response received from the server.
	 * The default implementation will read data from Yggdrasil's standard error response format and set it as this task's Error.
	 * \returns a QString error message that will be passed to emitFailed.
	 */
	virtual QString processError(QJsonObject responseData);

	/**
	 * Returns the state message for the given state.
	 * Used to set the status message for the task.
	 * Should be overridden by subclasses that want to change messages for a given state.
	 */
	virtual QString getStateMessage(const State state) const;

	MojangAccountPtr m_account;

	QNetworkReply* m_netReply;

	Error* m_error;

protected slots:
	void processReply(QNetworkReply* reply);
};