diff options
| author | isanae <14251494+isanae@users.noreply.github.com> | 2019-10-07 02:28:34 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-10-07 02:28:34 -0400 |
| commit | 97d58a17bdf7b8b29b413c54490c863b875b8a59 (patch) | |
| tree | e74d5561f536a56d930a14496334c4868496d240 /src/nxmaccessmanager.h | |
| parent | 73556ad0845ee6dea2ec9f1fa50903de0448fa91 (diff) | |
| parent | 925dbcba875477e1111453878f9b69e069bc8fd2 (diff) | |
Merge pull request #853 from isanae/validation-progress-dialog-fixes
Validation progress dialog fixes
Diffstat (limited to 'src/nxmaccessmanager.h')
| -rw-r--r-- | src/nxmaccessmanager.h | 169 |
1 files changed, 108 insertions, 61 deletions
diff --git a/src/nxmaccessmanager.h b/src/nxmaccessmanager.h index 0c85153b..6a45d880 100644 --- a/src/nxmaccessmanager.h +++ b/src/nxmaccessmanager.h @@ -31,39 +31,9 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>. #include <set> namespace MOBase { class IPluginGame; } +namespace Ui { class ValidationProgressDialog; } class NXMAccessManager; -class ValidationProgressDialog : private QDialog -{ - Q_OBJECT; - -public: - ValidationProgressDialog(std::chrono::seconds timeout); - - void setParentWidget(QWidget* w); - - void start(); - void stop(); - - using QDialog::show; - -protected: - void showEvent(QShowEvent* e) override; - void closeEvent(QCloseEvent* e) override; - -private: - std::chrono::seconds m_timeout; - QProgressBar* m_bar; - QDialogButtonBox* m_buttons; - QTimer* m_timer; - QElapsedTimer m_elapsed; - bool m_first; - - void onButton(QAbstractButton* b); - void onTimer(); -}; - - class NexusSSOLogin { public: @@ -112,50 +82,123 @@ private: }; +class ValidationAttempt +{ +public: + enum Result + { + None, + Success, + SoftError, + HardError, + Cancelled + }; + + std::function<void (APIUserAccount)> success; + std::function<void ()> failure; + + ValidationAttempt(std::chrono::seconds timeout); + ValidationAttempt(const ValidationAttempt&) = delete; + ValidationAttempt& operator=(const ValidationAttempt&) = delete; + + void start(NXMAccessManager& m, const QString& key); + void cancel(); + + bool done() const; + Result result() const; + const QString& message() const; + std::chrono::seconds timeout() const; + QElapsedTimer elapsed() const; + +private: + QNetworkReply* m_reply; + Result m_result; + QString m_message; + QTimer m_timeout; + QElapsedTimer m_elapsed; + + bool sendRequest(NXMAccessManager& m, const QString& key); + + void onFinished(); + void onSslErrors(const QList<QSslError>& errors); + void onTimeout(); + + void setFailure(Result r, const QString& error); + void setSuccess(const APIUserAccount& user); + + void cleanup(); +}; + + class NexusKeyValidator { public: - enum States + enum Behaviour { - Connecting, - Finished, - InvalidJson, - BadResponse, - Timeout, - Cancelled, - Error + OneShot = 0, + Retry }; - std::function<void (APIUserAccount)> finished; - std::function<void (States, QString)> stateChanged; + using FinishedCallback = void ( + ValidationAttempt::Result, const QString&, + std::optional<APIUserAccount>); - static QString stateToString(States s, const QString& e); + std::function<FinishedCallback> finished; + std::function<void (const ValidationAttempt&)> attemptFinished; NexusKeyValidator(NXMAccessManager& am); ~NexusKeyValidator(); - void start(const QString& key); + void start(const QString& key, Behaviour b); void cancel(); bool isActive() const; + const ValidationAttempt* lastAttempt() const; + const ValidationAttempt* currentAttempt() const; private: NXMAccessManager& m_manager; - QNetworkReply* m_reply; - QTimer m_timeout; - bool m_active; + QString m_key; + std::vector<std::unique_ptr<ValidationAttempt>> m_attempts; - void setState(States s, const QString& error={}); + void createAttempts(const std::vector<std::chrono::seconds>& timeouts); - void close(); - void abort(); + bool nextTry(); + void onAttemptSuccess(const ValidationAttempt& a, const APIUserAccount& u); + void onAttemptFailure(const ValidationAttempt& a); - void onFinished(); - void onSslErrors(const QList<QSslError>& errors); - void onTimeout(); + void setFinished( + ValidationAttempt::Result r, const QString& message, + std::optional<APIUserAccount> user); +}; + + +class ValidationProgressDialog : public QDialog +{ + Q_OBJECT; + +public: + ValidationProgressDialog(NexusKeyValidator& v); + + void setParentWidget(QWidget* w); + + void start(); + void stop(); + +protected: + void showEvent(QShowEvent* e) override; + void closeEvent(QCloseEvent* e) override; + +private: + std::unique_ptr<Ui::ValidationProgressDialog> ui; + NexusKeyValidator& m_validator; + QTimer* m_updateTimer; + bool m_first; - void handleError( - int code, const QString& nexusMessage, const QString& httpError); + void onHide(); + void onCancel(); + void onTimer(); + void updateProgress(); }; @@ -166,10 +209,7 @@ class NXMAccessManager : public QNetworkAccessManager { Q_OBJECT public: - static const std::chrono::seconds ValidationTimeout; - - explicit NXMAccessManager(QObject *parent, const QString &moVersion); - + NXMAccessManager(QObject *parent, const QString &moVersion); void setTopLevelWidget(QWidget* w); @@ -224,14 +264,21 @@ private: }; QWidget* m_TopLevel; - mutable ValidationProgressDialog* m_ProgressDialog; + mutable std::unique_ptr<ValidationProgressDialog> m_ProgressDialog; QString m_MOVersion; NexusKeyValidator m_validator; States m_validationState; void startValidationCheck(const QString& key); - void onValidatorState(NexusKeyValidator::States s, const QString& e); - void onValidatorFinished(const APIUserAccount& user); + + void onValidatorFinished( + ValidationAttempt::Result r, const QString& message, + std::optional<APIUserAccount>); + + void onValidatorAttemptFinished(const ValidationAttempt& a); + + void startProgress(); + void stopProgress(); }; #endif // NXMACCESSMANAGER_H |
