From 17b259df9cb6b28779d4881b2b6c805ee2e48eea Mon Sep 17 00:00:00 2001 From: Michele Calgaro Date: Fri, 7 Jun 2024 23:30:05 +0900 Subject: Rename to tde-ebook-reader Signed-off-by: Michele Calgaro --- .../networkActions/AuthenticationDialogManager.cpp | 192 +++++++++++++++++++++ 1 file changed, 192 insertions(+) create mode 100644 reader/src/networkActions/AuthenticationDialogManager.cpp (limited to 'reader/src/networkActions/AuthenticationDialogManager.cpp') diff --git a/reader/src/networkActions/AuthenticationDialogManager.cpp b/reader/src/networkActions/AuthenticationDialogManager.cpp new file mode 100644 index 0000000..165ab01 --- /dev/null +++ b/reader/src/networkActions/AuthenticationDialogManager.cpp @@ -0,0 +1,192 @@ +/* + * Copyright (C) 2004-2012 Geometer Plus + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +#include +#include +#include + +#include "../network/NetworkErrors.h" +#include "../network/NetworkLink.h" +#include "AuthenticationDialog.h" +#include "NetworkOperationRunnable.h" + +#include "AuthenticationDialogManager.h" + +class AuthenticationDialogListener : public ZLNetworkRequest::Listener { +public: + AuthenticationDialogListener(NetworkAuthenticationManager &mgr, shared_ptr listener); + + void returnAnswer(bool result); + virtual void finished(const std::string &error = std::string()); + +private: + void restart(const std::string &error); + + enum State { LogOut, Authorisation, Initialization }; + + shared_ptr myHolder; + + NetworkAuthenticationManager &myManager; + shared_ptr myListener; + std::string myPassword; + UserList myUserList; + std::string myError; + State myState; +}; + +AuthenticationDialogListener::AuthenticationDialogListener(NetworkAuthenticationManager &mgr, shared_ptr listener) + : myHolder(this), myManager(mgr), myListener(listener), myUserList(mgr.Link.getSiteName()), myState(LogOut) { + finished(std::string()); //start state machine from LogOut state +} + +void AuthenticationDialogListener::returnAnswer(bool result) { + if (result) { + myUserList.saveUser(myManager.currentUserName()); + } + // TODO: Return notable error + myListener->setUIStatus(false); + myListener->finished(result ? std::string() : "Some error"); + ZLTimeManager::deleteLater(myHolder); + myHolder.reset(); +} + + + +void AuthenticationDialogListener::finished(const std::string &error) { + myError = error; + myListener->setUIStatus(false); + switch (myState) { + case LogOut: + if (!AuthenticationDialog::run(myManager.UserNameOption, myUserList, myError, myPassword)) { + myManager.logOut(); + returnAnswer(false); + return; + } + if (myManager.UserNameOption.value().empty()) { + const ZLResource &resource = ZLResource::resource("dialog")["AuthenticationDialog"]; + restart(resource["loginIsEmpty"].value()); + } else { + myState = Authorisation; + myListener->setUIStatus(true); + myManager.authorise(myPassword, myHolder); + return; + } + break; + case Authorisation: + if (!myError.empty()) { + restart(myError); + return; + } + if (myManager.needsInitialization()) { + myState = Initialization; + myListener->setUIStatus(true); + myManager.initialize(myHolder); + } else { + returnAnswer(true); + } + break; + case Initialization: + if (!myError.empty()) { + restart(myError); + return; + } + returnAnswer(true); + break; + } +} + +void AuthenticationDialogListener::restart(const std::string &error) { + myPassword.clear(); + myState = LogOut; + finished(error); + //TODO it was autoremovable task here +} + + +class AuthoriseIfCanListener : public ZLNetworkRequest::Listener { +public: + AuthoriseIfCanListener(NetworkAuthenticationManager &mgr, shared_ptr listener); + + void returnAnswer(std::string answer = std::string()); + virtual void finished(const std::string &error = std::string()); + +private: + enum State { Init, AuthorisationCheck, Initialization}; + + shared_ptr myHolder; + + NetworkAuthenticationManager &myManager; + shared_ptr myListener; + State myState; +}; + +AuthoriseIfCanListener::AuthoriseIfCanListener(NetworkAuthenticationManager &mgr, shared_ptr listener) + : myHolder(this), myManager(mgr), myListener(listener), myState(Init) { + finished(std::string()); //start state machine from Init state +} + +void AuthoriseIfCanListener::returnAnswer(std::string answer) { + myListener->setUIStatus(false); + myListener->finished(answer); + ZLTimeManager::deleteLater(myHolder); + myHolder.reset(); +} + +void AuthoriseIfCanListener::finished(const std::string &error) { + myListener->setUIStatus(false); + switch (myState) { + case Init: + myListener->setUIStatus(true); + myState = AuthorisationCheck; + myManager.isAuthorised(myHolder); + break; + case AuthorisationCheck: + if (!error.empty()) { + NetworkErrors::showErrorMessage(error); + returnAnswer(error); + return; + } + if (myManager.needsInitialization()) { + myState = Initialization; + myListener->setUIStatus(true); + myManager.initialize(myHolder); + } else { + returnAnswer(); + } + break; + case Initialization: + if (!error.empty()) { + NetworkErrors::showErrorMessage(error); + returnAnswer(error); + return; + } + returnAnswer(); + break; + } +} + +std::string AuthenticationDialogManager::authAndInitAsync(NetworkAuthenticationManager &manager, shared_ptr listener) { + new AuthenticationDialogListener(manager, listener); + return std::string(); +} + +std::string AuthenticationDialogManager::athoriseIfCan(NetworkAuthenticationManager &manager, shared_ptr listener) { + new AuthoriseIfCanListener(manager, listener); + return std::string(); +} -- cgit v1.2.3