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

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 Project: Horizon
File: ActCompleter.cpp File: ActCompleter.cpp
@ -20,13 +20,20 @@
#include <nn/act/act_ApiAdmin.h> #include <nn/act/act_ApiAdmin.h>
#include <nn/act/act_ApiTransfer.h> #include <nn/act/act_ApiTransfer.h>
#include <nn/act/act_ResultPrivate.h> #include <nn/act/act_ResultPrivate.h>
#include <nn/actslv/actslv_Api.h>
namespace ConsoleRestore namespace ConsoleRestore
{ {
nn::Result ActCompleter::s_Result; nn::Result ActCompleter::s_Result;
const size_t ActCompleter::STACK_SIZE; const size_t ActCompleter::STACK_SIZE;
nn::os::Thread ActCompleter::s_Thread; 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_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() ActCompleter::ActCompleter()
@ -45,8 +52,15 @@ nn::Result ActCompleter::GetResult()
return s_Result; 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); s_Thread.Start(Exec, s_ThreadStack);
} }
@ -57,8 +71,21 @@ bool ActCompleter::IsFinished()
void ActCompleter::Finish() void ActCompleter::Finish()
{ {
s_Thread.Join(); if(s_Thread.IsValid())
s_Thread.Finalize(); {
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() void ActCompleter::Exec()
@ -66,6 +93,11 @@ void ActCompleter::Exec()
s_Result = ExecImpl(); s_Result = ExecImpl();
} }
void ActCompleter::UnmountThreadFunc()
{
nn::act::KeepUnmountAndBlock( &s_BeginEvent, &s_EndEvent );
}
nn::Result ActCompleter::ExecImpl() nn::Result ActCompleter::ExecImpl()
{ {
if(!nn::ac::IsConnected()) if(!nn::ac::IsConnected())
@ -77,11 +109,37 @@ nn::Result ActCompleter::ExecImpl()
NN_UTIL_RETURN_IF_FAILED( NN_UTIL_RETURN_IF_FAILED(
nn::act::InitializeAdmin()); nn::act::InitializeAdmin());
NN_UTIL_RETURN_IF_FAILED( if (s_Mode == ACT_COMPLETE_TRANSFER_WITH_SALVEGE)
nn::act::CompleteTransfer()); {
// アンマウント
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( NN_UTIL_RETURN_IF_FAILED(
common::FinalizeNetwork()); common::FinalizeNetwork());

View File

@ -1,4 +1,4 @@
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Project: Horizon Project: Horizon
File: ActCompleter.h File: ActCompleter.h
@ -24,22 +24,34 @@ namespace ConsoleRestore
class ActCompleter class ActCompleter
{ {
public: public:
enum CompleteMode {
ACT_COMPLETE_TRANSFER,
ACT_COMPLETE_TRANSFER_WITH_SALVEGE
};
ActCompleter(); ActCompleter();
virtual ~ActCompleter(); virtual ~ActCompleter();
static nn::Result GetResult(); static nn::Result GetResult();
static void Start(); static void Start(CompleteMode mode);
static bool IsFinished(); static bool IsFinished();
static void Finish(); static void Finish();
private: private:
static void Exec(); static void Exec();
static void UnmountThreadFunc();
static nn::Result ExecImpl(); static nn::Result ExecImpl();
static nn::Result s_Result; static nn::Result s_Result;
static const size_t STACK_SIZE = 0x1000; static const size_t STACK_SIZE = 0x1000;
static nn::os::Thread s_Thread; 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_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 */ } /* namespace ConsoleRestore */

View File

@ -94,6 +94,8 @@ bool s_ShopOperationExecuted[SHOP_OPERATION_NUM_MAX];
// ショップ処理を何回リトライしたか // ショップ処理を何回リトライしたか
u32 s_ShopOperationRetryCount[SHOP_OPERATION_NUM_MAX]; u32 s_ShopOperationRetryCount[SHOP_OPERATION_NUM_MAX];
ActCompleter::CompleteMode s_ActCompleteMode;
void PutAliveMessage(common::OperationMessage& operationMessage, const char* str); void PutAliveMessage(common::OperationMessage& operationMessage, const char* str);
bool CheckAndReadAPSetting(common::OperationMessage& operationMessage); bool CheckAndReadAPSetting(common::OperationMessage& operationMessage);
@ -1400,6 +1402,7 @@ void ControlState(common::HardwareStateManager& manager, common::OperationMessag
} }
else else
{ {
s_ActCompleteMode = ActCompleter::ACT_COMPLETE_TRANSFER;
s_RestoreState = COMPLETE_ACT; s_RestoreState = COMPLETE_ACT;
} }
} }
@ -1410,7 +1413,7 @@ void ControlState(common::HardwareStateManager& manager, common::OperationMessag
COMMON_LOGGER("Complete NNA Transfer\n"); COMMON_LOGGER("Complete NNA Transfer\n");
if (ImportCountryLanguageData().IsSuccess()) if (ImportCountryLanguageData().IsSuccess())
{ {
ActCompleter::Start(); ActCompleter::Start(s_ActCompleteMode);
s_RestoreState = COMPLETE_ACT_WAIT; s_RestoreState = COMPLETE_ACT_WAIT;
} }
else else
@ -1437,6 +1440,7 @@ void ControlState(common::HardwareStateManager& manager, common::OperationMessag
else else
{ {
COMMON_LOGGER("Complete NNA Transfer failed, Retrying..."); COMMON_LOGGER("Complete NNA Transfer failed, Retrying...");
COMMON_LOGGER_RESULT(result, __func__);
s_RestoreState = COMPLETE_ACT; s_RestoreState = COMPLETE_ACT;
} }
} }
@ -1657,6 +1661,7 @@ void ControlState(common::HardwareStateManager& manager, common::OperationMessag
operationMessage.Add("Press A or START Button to Continue."); operationMessage.Add("Press A or START Button to Continue.");
if(nextStep) if(nextStep)
{ {
s_ActCompleteMode = ActCompleter::ACT_COMPLETE_TRANSFER_WITH_SALVEGE;
s_RestoreState = COMPLETE_ACT; s_RestoreState = COMPLETE_ACT;
DeleteAllCheckFiles(); DeleteAllCheckFiles();
} }
@ -1708,6 +1713,7 @@ void ControlState(common::HardwareStateManager& manager, common::OperationMessag
PlayCursorSound(PREINSTALL_WAIT_SYNC_TICKET); PlayCursorSound(PREINSTALL_WAIT_SYNC_TICKET);
if(nextStep) if(nextStep)
{ {
s_ActCompleteMode = ActCompleter::ACT_COMPLETE_TRANSFER_WITH_SALVEGE;
s_RestoreState = COMPLETE_ACT; s_RestoreState = COMPLETE_ACT;
} }
} }

View File

@ -78,6 +78,7 @@ LIBS += libnn_cfg \
libnn_xml_simple \ libnn_xml_simple \
libnn_act \ libnn_act \
libnn_actslv \ libnn_actslv \
libnn_enc \
QRE_LIBRARIES[] = libmw_qre QRE_LIBRARIES[] = libmw_qre
LIBFILES += $`(addprefix $(CTRMW_QRE_ROOT)$(DIRSEP)$(SUBDIR_LIBRARIES)$(DIRSEP)$(config.getTargetSubDirectory true)$(DIRSEP), $(QRE_LIBRARIES)) \ LIBFILES += $`(addprefix $(CTRMW_QRE_ROOT)$(DIRSEP)$(SUBDIR_LIBRARIES)$(DIRSEP)$(config.getTargetSubDirectory true)$(DIRSEP), $(QRE_LIBRARIES)) \