アカウントサルベージ対応。サルベージ成功する場合の動作確認完了

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:
N2614 2014-03-06 04:27:22 +00:00
parent 881d4d0308
commit 51d4607926
4 changed files with 89 additions and 12 deletions

View File

@ -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());

View File

@ -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 */

View File

@ -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;
}
}

View File

@ -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)) \