mirror of
https://github.com/rvtr/ctr_Repair.git
synced 2025-10-31 13:51:08 -04:00
アカウントサルベージ対応。サルベージ成功する場合の動作確認完了
git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_Repair@775 385bec56-5757-e545-9c3a-d8741f4650f1
This commit is contained in:
parent
881d4d0308
commit
51d4607926
@ -1,4 +1,4 @@
|
||||
/*---------------------------------------------------------------------------*
|
||||
/*---------------------------------------------------------------------------*
|
||||
Project: Horizon
|
||||
File: ActCompleter.cpp
|
||||
|
||||
@ -20,13 +20,20 @@
|
||||
#include <nn/act/act_ApiAdmin.h>
|
||||
#include <nn/act/act_ApiTransfer.h>
|
||||
#include <nn/act/act_ResultPrivate.h>
|
||||
#include <nn/actslv/actslv_Api.h>
|
||||
|
||||
namespace ConsoleRestore
|
||||
{
|
||||
nn::Result ActCompleter::s_Result;
|
||||
const size_t ActCompleter::STACK_SIZE;
|
||||
nn::os::Thread ActCompleter::s_Thread;
|
||||
nn::os::Thread ActCompleter::s_UnmountThread;
|
||||
nn::os::StackBuffer<ActCompleter::STACK_SIZE> ActCompleter::s_ThreadStack;
|
||||
nn::os::StackBuffer<ActCompleter::STACK_SIZE> ActCompleter::s_UnmountThreadStack;
|
||||
nn::os::Event ActCompleter::s_BeginEvent;
|
||||
nn::os::Event ActCompleter::s_EndEvent;
|
||||
u32 ActCompleter::s_ApprovalId;
|
||||
ActCompleter::CompleteMode ActCompleter::s_Mode;
|
||||
|
||||
|
||||
ActCompleter::ActCompleter()
|
||||
@ -45,8 +52,15 @@ nn::Result ActCompleter::GetResult()
|
||||
return s_Result;
|
||||
}
|
||||
|
||||
void ActCompleter::Start()
|
||||
void ActCompleter::Start(CompleteMode mode)
|
||||
{
|
||||
s_Mode = mode;
|
||||
if(s_Mode == ACT_COMPLETE_TRANSFER_WITH_SALVEGE)
|
||||
{
|
||||
s_BeginEvent.Initialize(false);
|
||||
s_EndEvent.Initialize(false);
|
||||
}
|
||||
|
||||
s_Thread.Start(Exec, s_ThreadStack);
|
||||
}
|
||||
|
||||
@ -57,8 +71,21 @@ bool ActCompleter::IsFinished()
|
||||
|
||||
void ActCompleter::Finish()
|
||||
{
|
||||
s_Thread.Join();
|
||||
s_Thread.Finalize();
|
||||
if(s_Thread.IsValid())
|
||||
{
|
||||
s_Thread.Join();
|
||||
s_Thread.Finalize();
|
||||
}
|
||||
if(s_Mode == ACT_COMPLETE_TRANSFER_WITH_SALVEGE)
|
||||
{
|
||||
if(s_UnmountThread.IsValid())
|
||||
{
|
||||
s_UnmountThread.Join();
|
||||
s_UnmountThread.Finalize();
|
||||
}
|
||||
s_BeginEvent.Finalize();
|
||||
s_EndEvent.Finalize();
|
||||
}
|
||||
}
|
||||
|
||||
void ActCompleter::Exec()
|
||||
@ -66,6 +93,11 @@ void ActCompleter::Exec()
|
||||
s_Result = ExecImpl();
|
||||
}
|
||||
|
||||
void ActCompleter::UnmountThreadFunc()
|
||||
{
|
||||
nn::act::KeepUnmountAndBlock( &s_BeginEvent, &s_EndEvent );
|
||||
}
|
||||
|
||||
nn::Result ActCompleter::ExecImpl()
|
||||
{
|
||||
if(!nn::ac::IsConnected())
|
||||
@ -77,11 +109,37 @@ nn::Result ActCompleter::ExecImpl()
|
||||
NN_UTIL_RETURN_IF_FAILED(
|
||||
nn::act::InitializeAdmin());
|
||||
|
||||
NN_UTIL_RETURN_IF_FAILED(
|
||||
nn::act::CompleteTransfer());
|
||||
if (s_Mode == ACT_COMPLETE_TRANSFER_WITH_SALVEGE)
|
||||
{
|
||||
// アンマウント
|
||||
s_UnmountThread.Start(UnmountThreadFunc, s_UnmountThreadStack);
|
||||
s_BeginEvent.Wait();
|
||||
|
||||
NN_UTIL_RETURN_IF_FAILED(
|
||||
nn::act::FinalizeAdmin());
|
||||
// アンマウントできたのでアカウントサルベージを実行
|
||||
NN_UTIL_RETURN_IF_FAILED_3(
|
||||
nn::act::SalvageAccounts(),
|
||||
s_EndEvent.Signal(),
|
||||
nn::act::FinalizeAdmin(),
|
||||
common::FinalizeNetwork()
|
||||
);
|
||||
|
||||
s_ApprovalId = nn::act::GetSalvagedApprovalId();
|
||||
COMMON_LOGGER("ApprovalId = %d\n", s_ApprovalId);
|
||||
|
||||
// サルベージ終了をシステムに通知
|
||||
s_EndEvent.Signal();
|
||||
}
|
||||
|
||||
// 移行完了
|
||||
NN_UTIL_RETURN_IF_FAILED_2(
|
||||
nn::act::CompleteTransfer(),
|
||||
nn::act::FinalizeAdmin(),
|
||||
common::FinalizeNetwork());
|
||||
|
||||
NN_UTIL_RETURN_IF_FAILED_1(
|
||||
nn::act::FinalizeAdmin(),
|
||||
common::FinalizeNetwork()
|
||||
);
|
||||
|
||||
NN_UTIL_RETURN_IF_FAILED(
|
||||
common::FinalizeNetwork());
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
/*---------------------------------------------------------------------------*
|
||||
/*---------------------------------------------------------------------------*
|
||||
Project: Horizon
|
||||
File: ActCompleter.h
|
||||
|
||||
@ -24,22 +24,34 @@ namespace ConsoleRestore
|
||||
class ActCompleter
|
||||
{
|
||||
public:
|
||||
enum CompleteMode {
|
||||
ACT_COMPLETE_TRANSFER,
|
||||
ACT_COMPLETE_TRANSFER_WITH_SALVEGE
|
||||
};
|
||||
|
||||
ActCompleter();
|
||||
virtual ~ActCompleter();
|
||||
|
||||
static nn::Result GetResult();
|
||||
static void Start();
|
||||
static void Start(CompleteMode mode);
|
||||
static bool IsFinished();
|
||||
static void Finish();
|
||||
|
||||
private:
|
||||
static void Exec();
|
||||
static void UnmountThreadFunc();
|
||||
static nn::Result ExecImpl();
|
||||
|
||||
static nn::Result s_Result;
|
||||
static const size_t STACK_SIZE = 0x1000;
|
||||
static nn::os::Thread s_Thread;
|
||||
static nn::os::Thread s_UnmountThread;
|
||||
static nn::os::StackBuffer<STACK_SIZE> s_ThreadStack;
|
||||
|
||||
static nn::os::StackBuffer<STACK_SIZE> s_UnmountThreadStack;
|
||||
static nn::os::Event s_BeginEvent;
|
||||
static nn::os::Event s_EndEvent;
|
||||
static u32 s_ApprovalId;
|
||||
static CompleteMode s_Mode;
|
||||
};
|
||||
|
||||
} /* namespace ConsoleRestore */
|
||||
|
||||
@ -94,6 +94,8 @@ bool s_ShopOperationExecuted[SHOP_OPERATION_NUM_MAX];
|
||||
// ショップ処理を何回リトライしたか
|
||||
u32 s_ShopOperationRetryCount[SHOP_OPERATION_NUM_MAX];
|
||||
|
||||
ActCompleter::CompleteMode s_ActCompleteMode;
|
||||
|
||||
void PutAliveMessage(common::OperationMessage& operationMessage, const char* str);
|
||||
bool CheckAndReadAPSetting(common::OperationMessage& operationMessage);
|
||||
|
||||
@ -1400,6 +1402,7 @@ void ControlState(common::HardwareStateManager& manager, common::OperationMessag
|
||||
}
|
||||
else
|
||||
{
|
||||
s_ActCompleteMode = ActCompleter::ACT_COMPLETE_TRANSFER;
|
||||
s_RestoreState = COMPLETE_ACT;
|
||||
}
|
||||
}
|
||||
@ -1410,7 +1413,7 @@ void ControlState(common::HardwareStateManager& manager, common::OperationMessag
|
||||
COMMON_LOGGER("Complete NNA Transfer\n");
|
||||
if (ImportCountryLanguageData().IsSuccess())
|
||||
{
|
||||
ActCompleter::Start();
|
||||
ActCompleter::Start(s_ActCompleteMode);
|
||||
s_RestoreState = COMPLETE_ACT_WAIT;
|
||||
}
|
||||
else
|
||||
@ -1437,6 +1440,7 @@ void ControlState(common::HardwareStateManager& manager, common::OperationMessag
|
||||
else
|
||||
{
|
||||
COMMON_LOGGER("Complete NNA Transfer failed, Retrying...");
|
||||
COMMON_LOGGER_RESULT(result, __func__);
|
||||
s_RestoreState = COMPLETE_ACT;
|
||||
}
|
||||
}
|
||||
@ -1657,6 +1661,7 @@ void ControlState(common::HardwareStateManager& manager, common::OperationMessag
|
||||
operationMessage.Add("Press A or START Button to Continue.");
|
||||
if(nextStep)
|
||||
{
|
||||
s_ActCompleteMode = ActCompleter::ACT_COMPLETE_TRANSFER_WITH_SALVEGE;
|
||||
s_RestoreState = COMPLETE_ACT;
|
||||
DeleteAllCheckFiles();
|
||||
}
|
||||
@ -1708,6 +1713,7 @@ void ControlState(common::HardwareStateManager& manager, common::OperationMessag
|
||||
PlayCursorSound(PREINSTALL_WAIT_SYNC_TICKET);
|
||||
if(nextStep)
|
||||
{
|
||||
s_ActCompleteMode = ActCompleter::ACT_COMPLETE_TRANSFER_WITH_SALVEGE;
|
||||
s_RestoreState = COMPLETE_ACT;
|
||||
}
|
||||
}
|
||||
|
||||
@ -78,6 +78,7 @@ LIBS += libnn_cfg \
|
||||
libnn_xml_simple \
|
||||
libnn_act \
|
||||
libnn_actslv \
|
||||
libnn_enc \
|
||||
|
||||
QRE_LIBRARIES[] = libmw_qre
|
||||
LIBFILES += $`(addprefix $(CTRMW_QRE_ROOT)$(DIRSEP)$(SUBDIR_LIBRARIES)$(DIRSEP)$(config.getTargetSubDirectory true)$(DIRSEP), $(QRE_LIBRARIES)) \
|
||||
|
||||
Loading…
Reference in New Issue
Block a user