From 51d46079269adde9ae9fed6c925861609f4e0249 Mon Sep 17 00:00:00 2001 From: N2614 Date: Thu, 6 Mar 2014 04:27:22 +0000 Subject: [PATCH] =?UTF-8?q?=E3=82=A2=E3=82=AB=E3=82=A6=E3=83=B3=E3=83=88?= =?UTF-8?q?=E3=82=B5=E3=83=AB=E3=83=99=E3=83=BC=E3=82=B8=E5=AF=BE=E5=BF=9C?= =?UTF-8?q?=E3=80=82=E3=82=B5=E3=83=AB=E3=83=99=E3=83=BC=E3=82=B8=E6=88=90?= =?UTF-8?q?=E5=8A=9F=E3=81=99=E3=82=8B=E5=A0=B4=E5=90=88=E3=81=AE=E5=8B=95?= =?UTF-8?q?=E4=BD=9C=E7=A2=BA=E8=AA=8D=E5=AE=8C=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- .../sources/ConsoleRestore/ActCompleter.cpp | 74 +++++++++++++++++-- .../sources/ConsoleRestore/ActCompleter.h | 18 ++++- .../sources/ConsoleRestore/Controller.cpp | 8 +- .../sources/ConsoleRestore/OMakefile | 1 + 4 files changed, 89 insertions(+), 12 deletions(-) diff --git a/trunk/ConsoleDataMigration/sources/ConsoleRestore/ActCompleter.cpp b/trunk/ConsoleDataMigration/sources/ConsoleRestore/ActCompleter.cpp index 73f8576..ce88757 100644 --- a/trunk/ConsoleDataMigration/sources/ConsoleRestore/ActCompleter.cpp +++ b/trunk/ConsoleDataMigration/sources/ConsoleRestore/ActCompleter.cpp @@ -1,4 +1,4 @@ -/*---------------------------------------------------------------------------* +/*---------------------------------------------------------------------------* Project: Horizon File: ActCompleter.cpp @@ -20,13 +20,20 @@ #include #include #include +#include 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::s_ThreadStack; +nn::os::StackBuffer 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()); diff --git a/trunk/ConsoleDataMigration/sources/ConsoleRestore/ActCompleter.h b/trunk/ConsoleDataMigration/sources/ConsoleRestore/ActCompleter.h index d4b7f91..cf7c70f 100644 --- a/trunk/ConsoleDataMigration/sources/ConsoleRestore/ActCompleter.h +++ b/trunk/ConsoleDataMigration/sources/ConsoleRestore/ActCompleter.h @@ -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 s_ThreadStack; - + static nn::os::StackBuffer s_UnmountThreadStack; + static nn::os::Event s_BeginEvent; + static nn::os::Event s_EndEvent; + static u32 s_ApprovalId; + static CompleteMode s_Mode; }; } /* namespace ConsoleRestore */ diff --git a/trunk/ConsoleDataMigration/sources/ConsoleRestore/Controller.cpp b/trunk/ConsoleDataMigration/sources/ConsoleRestore/Controller.cpp index 6df956c..45565ee 100644 --- a/trunk/ConsoleDataMigration/sources/ConsoleRestore/Controller.cpp +++ b/trunk/ConsoleDataMigration/sources/ConsoleRestore/Controller.cpp @@ -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; } } diff --git a/trunk/ConsoleDataMigration/sources/ConsoleRestore/OMakefile b/trunk/ConsoleDataMigration/sources/ConsoleRestore/OMakefile index 3e12fba..6a9c439 100644 --- a/trunk/ConsoleDataMigration/sources/ConsoleRestore/OMakefile +++ b/trunk/ConsoleDataMigration/sources/ConsoleRestore/OMakefile @@ -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)) \