diff options
Diffstat (limited to 'api/logic/minecraft')
-rw-r--r-- | api/logic/minecraft/MinecraftInstance.cpp | 2 | ||||
-rw-r--r-- | api/logic/minecraft/auth/AuthSession.h | 3 | ||||
-rw-r--r-- | api/logic/minecraft/auth/MojangAccount.cpp | 22 | ||||
-rw-r--r-- | api/logic/minecraft/auth/MojangAccount.h | 11 | ||||
-rw-r--r-- | api/logic/minecraft/launch/ClaimAccount.cpp | 24 | ||||
-rw-r--r-- | api/logic/minecraft/launch/ClaimAccount.h | 35 |
6 files changed, 96 insertions, 1 deletions
diff --git a/api/logic/minecraft/MinecraftInstance.cpp b/api/logic/minecraft/MinecraftInstance.cpp index f0d47733..f36e40ed 100644 --- a/api/logic/minecraft/MinecraftInstance.cpp +++ b/api/logic/minecraft/MinecraftInstance.cpp @@ -19,6 +19,7 @@ #include "launch/steps/TextPrint.h" #include "minecraft/launch/LauncherPartLaunch.h" #include "minecraft/launch/ModMinecraftJar.h" +#include "minecraft/launch/ClaimAccount.h" #include "java/launch/CheckJava.h" #include <icons/IIconList.h> @@ -425,6 +426,7 @@ std::shared_ptr<LaunchTask> MinecraftInstance::createLaunchTask(AuthSessionPtr s // if we aren't in offline mode,. if(session->status != AuthSession::PlayableOffline) { + process->appendStep(std::make_shared<ClaimAccount>(pptr, session)); process->appendStep(std::make_shared<Update>(pptr)); } diff --git a/api/logic/minecraft/auth/AuthSession.h b/api/logic/minecraft/auth/AuthSession.h index dede90a9..d2f66db8 100644 --- a/api/logic/minecraft/auth/AuthSession.h +++ b/api/logic/minecraft/auth/AuthSession.h @@ -6,6 +6,8 @@ #include "multimc_logic_export.h" +class MojangAccount; + struct User { QString id; @@ -46,6 +48,7 @@ struct MULTIMC_LOGIC_EXPORT AuthSession bool auth_server_online = false; // Did the user request online mode? bool wants_online = true; + std::shared_ptr<MojangAccount> m_accountPtr; }; typedef std::shared_ptr<AuthSession> AuthSessionPtr; diff --git a/api/logic/minecraft/auth/MojangAccount.cpp b/api/logic/minecraft/auth/MojangAccount.cpp index 69a24c09..2b073aac 100644 --- a/api/logic/minecraft/auth/MojangAccount.cpp +++ b/api/logic/minecraft/auth/MojangAccount.cpp @@ -275,4 +275,26 @@ void MojangAccount::fillSession(AuthSessionPtr session) session->session = "-"; } session->u = user(); + session->m_accountPtr = shared_from_this(); +} + +void MojangAccount::decrementUses() +{ + Usable::decrementUses(); + if(!isInUse()) + { + emit changed(); + qWarning() << "Account" << m_username << "is no longer in use."; + } +} + +void MojangAccount::incrementUses() +{ + bool wasInUse = isInUse(); + Usable::incrementUses(); + if(!wasInUse) + { + emit changed(); + qWarning() << "Account" << m_username << "is now in use."; + } } diff --git a/api/logic/minecraft/auth/MojangAccount.h b/api/logic/minecraft/auth/MojangAccount.h index 2de0c19c..4902ec11 100644 --- a/api/logic/minecraft/auth/MojangAccount.h +++ b/api/logic/minecraft/auth/MojangAccount.h @@ -24,6 +24,7 @@ #include <memory> #include "AuthSession.h" +#include "Usable.h" #include "multimc_logic_export.h" @@ -60,7 +61,10 @@ enum AccountStatus * Said information may include things such as that account's username, client token, and access * token if the user chose to stay logged in. */ -class MULTIMC_LOGIC_EXPORT MojangAccount : public QObject +class MULTIMC_LOGIC_EXPORT MojangAccount : + public QObject, + public Usable, + public std::enable_shared_from_this<MojangAccount> { Q_OBJECT public: /* construction */ @@ -157,6 +161,11 @@ protected: /* variables */ // current task we are executing here std::shared_ptr<YggdrasilTask> m_currentTask; +protected: /* methods */ + + void incrementUses() override; + void decrementUses() override; + private slots: void authSucceeded(); diff --git a/api/logic/minecraft/launch/ClaimAccount.cpp b/api/logic/minecraft/launch/ClaimAccount.cpp new file mode 100644 index 00000000..71670b4f --- /dev/null +++ b/api/logic/minecraft/launch/ClaimAccount.cpp @@ -0,0 +1,24 @@ +#include "ClaimAccount.h" +#include <launch/LaunchTask.h> + +ClaimAccount::ClaimAccount(LaunchTask* parent, AuthSessionPtr session): LaunchStep(parent) +{ + if(session->status == AuthSession::Status::PlayableOnline) + { + m_account = session->m_accountPtr; + } +} + +void ClaimAccount::executeTask() +{ + if(m_account) + { + lock.reset(new UseLock(m_account)); + emitSucceeded(); + } +} + +void ClaimAccount::finalize() +{ + lock.reset(); +} diff --git a/api/logic/minecraft/launch/ClaimAccount.h b/api/logic/minecraft/launch/ClaimAccount.h new file mode 100644 index 00000000..fa5039af --- /dev/null +++ b/api/logic/minecraft/launch/ClaimAccount.h @@ -0,0 +1,35 @@ +/* Copyright 2013-2016 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 <launch/LaunchStep.h> +#include <minecraft/auth/MojangAccount.h> + +class ClaimAccount: public LaunchStep +{ + Q_OBJECT +public: + explicit ClaimAccount(LaunchTask *parent, AuthSessionPtr session); + void executeTask() override; + void finalize() override; + bool canAbort() const override + { + return false; + } +private: + std::unique_ptr<UseLock> lock; + MojangAccountPtr m_account; +}; |