アカウント移行のためのStateを追加

IVSを正しく取得できるように

git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_Repair@239 385bec56-5757-e545-9c3a-d8741f4650f1
This commit is contained in:
N2614 2011-04-27 12:58:24 +00:00
parent 56a51449b4
commit 878819630c
9 changed files with 147 additions and 53 deletions

View File

@ -106,6 +106,8 @@ typedef enum RestoreState
UPDATE_DONE, // アップデート完了
NUP_ONLY_WAIT_SD_EJECT, // NUP_ONLYモードでSDカード抜き待ち
NUP_ONLY_WAIT_NEXT, // NUP_ONLYモードでキー入力待ち
TRANSFER_ACCOUNT, // アカウント転送を完了させる
TRANSFER_ACCOUNT_DONE, // アカウント転送完了
DOWNLOAD_IVS, // インフラからIVSを取得する
DOWNLOAD_IVS_DONE, // インフラからIVSを取得完了
CHECK_IVS, // IVSとSDカードのセーブデータディレクトリの一致を確認
@ -148,6 +150,7 @@ void CheckApSetting(common::HardwareStateManager& manager, ::std::vector<std::st
void CheckNupExecuted(common::HardwareStateManager& manager, ::std::vector<std::string>& message, bool& goNextStep);
void CheckDownloadIvs(common::HardwareStateManager& manager, ::std::vector<std::string>& message, bool& goNextStep);
void CheckAccountDeleted(common::HardwareStateManager& manager, ::std::vector<std::string>& message, bool& goNextStep);
void CheckAccountTransfered(common::HardwareStateManager& manager, ::std::vector<std::string>& message, bool& goNextStep);
void CheckWriteFinished(common::HardwareStateManager& manager, ::std::vector<std::string>& message, bool& goNextStep);
void CheckReadIvs(common::HardwareStateManager& manager, ::std::vector<std::string>& message, bool& goNextStep);
void CheckConsoleInitialized(common::HardwareStateManager& manager, ::std::vector<std::string>& message, bool& goNextStep);
@ -284,6 +287,7 @@ void CheckDownloadIvs(common::HardwareStateManager& manager, ::std::vector<std::
}
else
{
COMMON_LOGGER("Download IVS\n");
s_RestoreState = DOWNLOAD_IVS;
}
@ -295,7 +299,7 @@ void CheckAccountDeleted(common::HardwareStateManager& manager, ::std::vector<st
// アカウント削除確認ファイルがあるか?
if (common::ExistsDeleteAccountChecked())
{
CheckDownloadIvs(manager, message, goNextStep);
CheckAccountTransfered(manager, message, goNextStep);
}
else
{
@ -303,15 +307,31 @@ void CheckAccountDeleted(common::HardwareStateManager& manager, ::std::vector<st
if(EqualsDeviceIdFileandDeviceId(manager).IsSuccess())
{
CreateDeleteAccountFinishedFile();
CheckDownloadIvs(manager, message, goNextStep);
CheckAccountTransfered(manager, message, goNextStep);
}
else
{
COMMON_LOGGER("Delete Account\n");
s_RestoreState = DELETE_ACCOUNT;
}
}
}
// アカウント移行済みかチェック
void CheckAccountTransfered(common::HardwareStateManager& manager, ::std::vector<std::string>& message, bool& goNextStep)
{
// アカウント移行確認ファイルがあるか?
if (common::ExistsTransferAccountChecked())
{
CheckDownloadIvs(manager, message, goNextStep);
}
else
{
COMMON_LOGGER("Transfer Account\n");
s_RestoreState = TRANSFER_ACCOUNT;
}
}
// 書き込み完了かどうかチェック
void CheckWriteFinished(common::HardwareStateManager& manager, ::std::vector<std::string>& message, bool& goNextStep)
{
@ -524,6 +544,13 @@ void ShopOperationSingleTemplate(
{
ShopOperationSuccess(op, logMessage, nextState);
}
else if(op == SHOP_OPERATION_CONNECT && nextState == TRANSFER_ACCOUNT_DONE &&
GetShopOperationSingleResult() == nn::nim::ResultNeedGetIvs())
{
NN_LOG("ResultNeedGetIvs\n");
ShopOperationSuccess(op, logMessage, nextState);
}
else
{
if (s_ShopOperationRetryCount[op]++ < RETRY_MAX)
@ -942,6 +969,20 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector<std::stri
}
break;
case TRANSFER_ACCOUNT:
{
ShopOperationSingleTemplate(manager, operationMessage, SHOP_OPERATION_CONNECT, "Transfer Account",
"Transfer Account Finished.\n", "Transfer Account Failed. Retrying...", TRANSFER_ACCOUNT_DONE);
}
break;
case TRANSFER_ACCOUNT_DONE:
{
CreateTransferAccountFinishedFile();
s_RestoreState = STARTUP;
}
break;
case DELETE_ACCOUNT:
{
ShopOperationSingleTemplate(manager, operationMessage, SHOP_OPERATION_UNREGISTER, "Deleting Account",
@ -1151,7 +1192,7 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector<std::stri
case SYNC_TICKET:
{
ShopOperationSingleTemplate(manager, operationMessage, SHOP_OPERATION_CONNECT_ONLY, "Shop Connect",
ShopOperationSingleTemplate(manager, operationMessage, SHOP_OPERATION_CONNECT, "Shop Connect",
"Shop Connect Finished.\n", "Shop Connect Failed. Retrying...", UPLOAD_IVS);
}
break;

View File

@ -916,32 +916,45 @@ bool IsImportFinished()
void CreateWriteFinishedFile()
{
CreateEmptyFile(common::WRITE_FINISHED_CHECK_PATHNAME);
CreateEmptyFile(common::FILENAME_TABLE[common::EXISTS_WRITE_FINISHED]);
common::ClearFileCheck(common::EXISTS_WRITE_FINISHED);
}
void CreateConsoleInitializedFile()
{
CreateEmptyFile(common::INITIALIZED_CHECK_PATHNAME);
CreateEmptyFile(common::FILENAME_TABLE[common::EXISTS_CONSOLE_INTIALIZED]);
common::ClearFileCheck(common::EXISTS_CONSOLE_INTIALIZED);
}
void CreateUpdateFinishedFile()
{
CreateEmptyFile(common::UPDATE_CHECK_PATHNAME);
CreateEmptyFile(common::FILENAME_TABLE[common::EXISTS_UPDATE_FINISHED]);
common::ClearFileCheck(common::EXISTS_UPDATE_FINISHED);
}
void CreateRtcSyncFinishedFile()
{
CreateEmptyFile(common::RTC_SYNC_CHECK_PATHNAME);
CreateEmptyFile(common::FILENAME_TABLE[common::EXISTS_RTC_SYNC_FINISHED]);
common::ClearFileCheck(common::EXISTS_RTC_SYNC_FINISHED);
}
void CreateDownloadIvsFinishedFile()
{
CreateEmptyFile(common::DOWNLOAD_IVS_CHECK_PATHNAME);
CreateEmptyFile(common::FILENAME_TABLE[common::EXISTS_DOWNLOAD_IVS]);
common::ClearFileCheck(common::EXISTS_DOWNLOAD_IVS);
}
void CreateDeleteAccountFinishedFile()
{
CreateEmptyFile(common::DELETE_ACCOUNT_CHECK_PATHNAME);
CreateEmptyFile(common::FILENAME_TABLE[common::EXISTS_DELETE_ACCOUNT]);
common::ClearFileCheck(common::EXISTS_DELETE_ACCOUNT);
}
void CreateTransferAccountFinishedFile()
{
CreateEmptyFile(common::FILENAME_TABLE[common::EXISTS_TRANSFER_ACCOUNT]);
common::ClearFileCheck(common::EXISTS_TRANSFER_ACCOUNT);
}
u32 GetImportProgress()

View File

@ -42,6 +42,7 @@ void CreateConsoleInitializedFile();
void CreateRtcSyncFinishedFile();
void CreateDownloadIvsFinishedFile();
void CreateDeleteAccountFinishedFile();
void CreateTransferAccountFinishedFile();
u32 GetImportProgress();
// NANDのごみを削除する
@ -54,7 +55,8 @@ const wchar_t* const CHECK_FILENAME_TABLE[] =
common::WRITE_FINISHED_CHECK_PATHNAME,
common::RTC_SYNC_CHECK_PATHNAME,
common::DOWNLOAD_IVS_CHECK_PATHNAME,
common::DELETE_ACCOUNT_CHECK_PATHNAME
common::DELETE_ACCOUNT_CHECK_PATHNAME,
common::TRANSFER_ACCOUNT_CHECK_PATHNAME
};
void DeleteAllCheckFiles();

View File

@ -50,8 +50,9 @@ const size_t UNREGISTER_THREAD_STACK_SIZE = 0x1000;
nn::os::Thread s_UnregisterThread;
nn::os::StackBuffer<UNREGISTER_THREAD_STACK_SIZE> s_UnregisterThreadStack;
static const size_t EC_BUFFER_SIZE = 128 * 1024;
static u8 s_EcBufffer[EC_BUFFER_SIZE];
const size_t EC_BUFFER_SIZE = 128 * 1024;
u8 s_EcBufffer[EC_BUFFER_SIZE];
bool s_IsNimShopInitialized = false;
struct ShopThreadParam
{
@ -251,11 +252,11 @@ nn::Result FinalizeInternal()
namespace ConsoleRestore{
void ShopOperationConnect();
void ShopOperationFinalize();
nn::Result ShopOperationConnect();
nn::Result ShopOperationFinalize();
void ShopOperationConnect(ECAccountInfo** pAccountInfo)
nn::Result ShopOperationConnect(ECAccountInfo** pAccountInfo)
{
nn::Result result = nn::ResultSuccess();
@ -264,22 +265,28 @@ void ShopOperationConnect(ECAccountInfo** pAccountInfo)
-------------------------------------------------------------------- */
NN_LOG("nim::Shop::Connect\n");
result = nn::nim::Shop::Connect(pAccountInfo, s_EcBufffer, EC_BUFFER_SIZE);
NIM_SHOP_RESULT_CHECK(result);
NN_UTIL_RETURN_IF_FAILED(result);
PrintECAccountInfo(**pAccountInfo);
NN_LOG("\n");
return result;
}
void ShopOperationInitialize()
nn::Result ShopOperationInitialize()
{
nn::Result result = nn::ResultSuccess();
/* -------------------------------------------------------------------
Initialize
-------------------------------------------------------------------- */
NN_LOG("nim::InitializeForShop\n");
result = nn::nim::InitializeForShop();
NIM_SHOP_RESULT_CHECK(result);
if (!s_IsNimShopInitialized)
{
NN_LOG("nim::InitializeForShop\n");
result = nn::nim::InitializeForShop();
NN_UTIL_RETURN_IF_FAILED(result);
s_IsNimShopInitialized = true;
}
/* -------------------------------------------------------------------
SetParameter
@ -287,25 +294,32 @@ void ShopOperationInitialize()
NN_LOG("nim::Shop::SetApplication Id\n");
nn::nim::Shop::SetApplicationId();
NIM_SHOP_RESULT_CHECK(result);
NN_UTIL_RETURN_IF_FAILED(result);
NN_LOG("nim::Shop::SetTIN\n");
result = nn::nim::Shop::SetTin(CONSOLE_RESTORE_TIN);
NIM_SHOP_RESULT_CHECK(result);
NN_UTIL_RETURN_IF_FAILED(result);
return result;
}
void ShopOperationConnect()
nn::Result ShopOperationConnect()
{
ShopOperationInitialize();
nn::Result result;
result = ShopOperationInitialize();
NN_UTIL_RETURN_IF_FAILED(result);
/* -------------------------------------------------------------------
Connect
-------------------------------------------------------------------- */
ECAccountInfo* pAccountInfo;
ShopOperationConnect(&pAccountInfo);
result = ShopOperationConnect(&pAccountInfo);
NN_UTIL_RETURN_IF_FAILED(result);
return result;
}
void ShopOperationFinalize()
nn::Result ShopOperationFinalize()
{
nn::Result result = nn::ResultSuccess();
@ -314,11 +328,14 @@ void ShopOperationFinalize()
-------------------------------------------------------------------- */
NN_LOG("nim::FinalizeForShop\n");
result = nn::nim::FinalizeForShop();
NIM_SHOP_RESULT_CHECK(result);
NN_UTIL_RETURN_IF_FAILED(result);
s_IsNimShopInitialized = false;
NN_LOG("util::ac::Finalize\n");
result = FinalizeInternal();
NIM_SHOP_RESULT_CHECK(result);
NN_UTIL_RETURN_IF_FAILED(result);
return result;
}
namespace
@ -329,34 +346,31 @@ void ShopOperationSingleThreadFunc(ShopThreadParam param)
{
s_ShopResult = nn::ResultSuccess();
if(param.op == SHOP_OPERATION_CLOSE_WITHOUT_CONNECT)
{
ShopOperationFinalize();
return;
}
NN_LOG("util::ac::Initialize\n");
InitializeInternal();
nn::Result result = nn::ResultSuccess();
nn::Result result = InitializeInternal();
NIM_SHOP_RESULT_CHECK(result);
switch(param.op)
{
case SHOP_OPERATION_CONNECT_WITHOUT_CLOSE:
case SHOP_OPERATION_CONNECT:
{
ShopOperationConnect();
return;
}
case SHOP_OPERATION_CONNECT_ONLY:
{
ShopOperationConnect();
result = ShopOperationConnect();
NIM_SHOP_RESULT_CHECK(result);
}
break;
case SHOP_OPERATION_GET_IVS:
{
ShopOperationConnect();
result = ShopOperationConnect();
if(result.IsFailure())
{
// ResultNeedGetIvsは発生するのでエラーとしない
if(result != nn::nim::ResultNeedGetIvs())
{
NIM_SHOP_RESULT_CHECK(result);
}
}
// IVSを取得する
result = nn::nim::Shop::ImportIvsFromInfrastructure();
NIM_SHOP_RESULT_CHECK(result);
@ -365,9 +379,11 @@ void ShopOperationSingleThreadFunc(ShopThreadParam param)
case SHOP_OPERATION_UNREGISTER:
{
ShopOperationInitialize();
result = ShopOperationInitialize();
NIM_SHOP_RESULT_CHECK(result);
ECAccountInfo* pAccountInfo;
ShopOperationConnect(&pAccountInfo);
result = ShopOperationConnect(&pAccountInfo);
NIM_SHOP_RESULT_CHECK(result);
if (pAccountInfo->accountStatus && pAccountInfo->accountStatus[0] == 'R')
{
/* ---------------------------------------------------------------
@ -386,6 +402,8 @@ void ShopOperationSingleThreadFunc(ShopThreadParam param)
case SHOP_OPERATION_DOWNLOAD_TITLE:
{
result = ShopOperationConnect();
NIM_SHOP_RESULT_CHECK(result);
NN_LOG("Try Download %016llx\n", param.config.titleId);
result = nn::nim::Shop::StartDownload(param.config);
@ -447,7 +465,8 @@ void ShopOperationSingleThreadFunc(ShopThreadParam param)
break;
}
ShopOperationFinalize();
result = ShopOperationFinalize();
NIM_SHOP_RESULT_CHECK(result);
}
}

View File

@ -26,11 +26,9 @@ namespace ConsoleRestore
typedef enum SHOP_OPERATION
{
SHOP_OPERATION_CONNECT_ONLY, // Shop::ConnectしてCloseするだけ
SHOP_OPERATION_CONNECT, // Shop::ConnectしてCloseするだけ
SHOP_OPERATION_GET_IVS, // Shop::ImportIvsFromInfrastructureを実行
SHOP_OPERATION_UNREGISTER, // Shop::Unregisterを実行
SHOP_OPERATION_CONNECT_WITHOUT_CLOSE, // Shop::ConnectしてCloseしない
SHOP_OPERATION_CLOSE_WITHOUT_CONNECT, // Shop::ConnectせずいきなりCloseする
SHOP_OPERATION_DOWNLOAD_TITLE, // Titleをダウンロードする
SHOP_OPERATION_NUM_MAX

View File

@ -180,7 +180,6 @@ void TitleDownloader::Start()
for(u8 i = 0; i < m_TwlTiteNum; i++)
{
StartShopOperationSingle(SHOP_OPERATION_CONNECT_WITHOUT_CLOSE);
WaitShopOperationAndFinalize();
nn::nim::TitleConfig config;

View File

@ -65,6 +65,17 @@ bool ExistsFile(FileExistsCheck index)
return s_FileExistsCheckeResult[index];
}
void ClearFileCheck(FileExistsCheck index)
{
if(index > EXISTS_MAX)
{
NN_LOG("Invalid File index!!\n");
return;
}
s_FileExistsChecked[index] = false;
}
bool ExistsUpdateCheckedFile()
{
return ExistsFile(EXISTS_UPDATE_FINISHED);
@ -120,6 +131,11 @@ bool ExistsDeleteAccountChecked()
return ExistsFile(EXISTS_DELETE_ACCOUNT);
}
bool ExistsTransferAccountChecked()
{
return ExistsFile(EXISTS_TRANSFER_ACCOUNT);
}
bool ExistsDownloadIvsCheckedFile()
{
return ExistsFile(EXISTS_DOWNLOAD_IVS);

View File

@ -34,6 +34,7 @@ typedef enum FILE_EXISTS_CHECK
EXISTS_VERSION_DATA,
EXISTS_REGION_DATA,
EXISTS_DELETE_ACCOUNT,
EXISTS_TRANSFER_ACCOUNT,
EXISTS_DOWNLOAD_IVS,
EXISTS_MAX
} FileExistsCheck;
@ -51,6 +52,7 @@ const wchar_t* const FILENAME_TABLE[EXISTS_MAX] =
common::VERSION_DATA_PATHNAME,
common::REGION_DATA_PATHNAME,
common::DELETE_ACCOUNT_CHECK_PATHNAME,
common::TRANSFER_ACCOUNT_CHECK_PATHNAME,
common::DOWNLOAD_IVS_CHECK_PATHNAME
};
@ -66,8 +68,11 @@ bool ExistsCountryLanguageFile();
bool ExistsVersionData();
bool ExistsRegionData();
bool ExistsDeleteAccountChecked();
bool ExistsTransferAccountChecked();
bool ExistsDownloadIvsCheckedFile();
void ClearFileCheck(FileExistsCheck index);
void InitializeFileCheck();
}

View File

@ -51,6 +51,7 @@ const wchar_t* const SDMC_ROOT_DIRECTORY_PATH = L"sdmc:/";
const wchar_t* const WRITE_FINISHED_CHECK_PATHNAME = L"sdmc:/CTR_Console_Repair/WriteFinished";
const wchar_t* const UPDATE_CHECK_PATHNAME = L"sdmc:/CTR_Console_Repair/UpdateFinished";
const wchar_t* const DELETE_ACCOUNT_CHECK_PATHNAME = L"sdmc:/CTR_Console_Repair/AccountDeletedChecked";
const wchar_t* const TRANSFER_ACCOUNT_CHECK_PATHNAME = L"sdmc:/CTR_Console_Repair/AccountTransferedChecked";
const wchar_t* const DOWNLOAD_IVS_CHECK_PATHNAME = L"sdmc:/CTR_Console_Repair/DownloadIvsFinished";
const wchar_t* const INITIALIZED_CHECK_PATHNAME = L"sdmc:/CTR_Console_Repair/ConsoleInitialized";
const wchar_t* const RTC_SYNC_CHECK_PATHNAME = L"sdmc:/CTR_Console_Repair/RtcSyncFinished";