From 7c5b20eec6dbde409591e02afe4f2659aade9b3e Mon Sep 17 00:00:00 2001 From: N2614 Date: Mon, 25 Apr 2011 02:25:31 +0000 Subject: [PATCH] =?UTF-8?q?IVS=E5=8F=96=E5=BE=97=E3=83=A2=E3=83=BC?= =?UTF-8?q?=E3=83=89=E3=81=A7=E3=83=A6=E3=83=BC=E3=82=B6=E3=81=AESD?= =?UTF-8?q?=E3=82=AB=E3=83=BC=E3=83=89=E3=82=92=E8=AA=BF=E3=81=B9=E3=82=8B?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB?= 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@220 385bec56-5757-e545-9c3a-d8741f4650f1 --- .../sources/ConsoleRestore/ConsoleRestore.cpp | 2 +- .../sources/ConsoleRestore/Controller.cpp | 54 +++++++++++++------ .../sources/ConsoleRestore/Importer.cpp | 52 ++++++++++++++++-- .../sources/ConsoleRestore/Importer.h | 3 +- .../sources/ConsoleRestore/Shop.cpp | 1 + .../sources/common/FileName.h | 1 + 6 files changed, 91 insertions(+), 22 deletions(-) diff --git a/trunk/ConsoleDataMigration/sources/ConsoleRestore/ConsoleRestore.cpp b/trunk/ConsoleDataMigration/sources/ConsoleRestore/ConsoleRestore.cpp index 34f32de..2e87d76 100644 --- a/trunk/ConsoleDataMigration/sources/ConsoleRestore/ConsoleRestore.cpp +++ b/trunk/ConsoleDataMigration/sources/ConsoleRestore/ConsoleRestore.cpp @@ -228,7 +228,7 @@ extern "C" void nnMain(void) // RenderSystemを作ってからログが出せる common::Logger::InitializeEjectThread(); common::Logger::SetEjectHandler(OnSdEjected); - common::Logger::SetInsertHandler(OnSdEjected); + common::Logger::SetInsertHandler(OnSdInserted); COMMON_LOGGER("\n"); COMMON_LOGGER("CTR Console Restore start\n"); diff --git a/trunk/ConsoleDataMigration/sources/ConsoleRestore/Controller.cpp b/trunk/ConsoleDataMigration/sources/ConsoleRestore/Controller.cpp index 4f3553c..dd7ac2b 100644 --- a/trunk/ConsoleDataMigration/sources/ConsoleRestore/Controller.cpp +++ b/trunk/ConsoleDataMigration/sources/ConsoleRestore/Controller.cpp @@ -33,6 +33,7 @@ #include "NtpClient.h" #include "TitleDownloader.h" #include "Shop.h" +#include "Util.h" namespace ConsoleRestore { @@ -40,7 +41,7 @@ namespace ConsoleRestore namespace { -// インターネット設定を読んだかどうか +// ネットワーク設定ファイルを読んだかどうか bool s_ReadSettingDone = false; // インターネット設定を読んだ結果 bool s_ReadSettingIsSuccess = false; @@ -110,7 +111,8 @@ typedef enum RestoreState DOWNLOAD_IVS_DONE, // インフラからIVSを取得完了 CHECK_IVS, // IVSとSDカードのセーブデータディレクトリの一致を確認 CHECK_SD_DIRECTORY, // SDカードのIVS依存ディレクトリを探す - CHECK_SD_DIRECTORY_DONE, // SDカードのIVS依存ディレクトリチェック完了 + CHECK_SD_DIRECTORY_SUCCESS, // SDカードのIVS依存ディレクトリチェック完了 + CHECK_SD_DIRECTORY_FAIL, // SDカードのIVS依存ディレクトリが見つからなかった DELETE_ACCOUNT, // ショップアカウントを削除する DELETE_ACCOUNT_DONE, // ショップアカウント削除完了 SYNC_TICKET, // eTicketを同期する @@ -895,33 +897,45 @@ void ControlState(::std::vector& operationMessage, bool& nextStep) { if (nn::fs::IsSdmcInserted()) { + NN_LOG("Check User's SD Card\n"); // ユーザのSDカードにはAP設定ファイルは無いはず if (ExistsAPSetting()) { + NN_LOG("AP Setting Exists. Retry\n"); s_RestoreState = CHECK_IVS; } else { - if(ExistsIvsDirectory()) + NN_LOG("Read User's SD Card\n"); + void* ivs; + size_t size; + GetIvs(&ivs, &size); + std::string sysSaveRoot; + + common::Util::GetSaveDataDirectoryRoot(sysSaveRoot, ivs, size); + if (ExistsIvsDirectory(sysSaveRoot)) { - s_RestoreState = CHECK_SD_DIRECTORY_DONE; + s_RestoreState = CHECK_SD_DIRECTORY_SUCCESS; + } + else + { + s_RestoreState = CHECK_SD_DIRECTORY_FAIL; } } } } break; - case CHECK_SD_DIRECTORY_DONE: + case CHECK_SD_DIRECTORY_SUCCESS: { - static bool init = true; - if(init) - { - DeleteAllCheckFiles(); + operationMessage.push_back(::std::string("Check User's SD Card Succeeded.")); + operationMessage.push_back(::std::string("Pull Out SD Card")); + } + break; - init = false; - } - - operationMessage.push_back(::std::string("Check User's SD Card Done.")); + case CHECK_SD_DIRECTORY_FAIL: + { + operationMessage.push_back(::std::string("Check User's SD Card Failed.")); operationMessage.push_back(::std::string("Pull Out SD Card")); } break; @@ -1343,18 +1357,22 @@ bool IsRestoreFailed() void OnSdEjected() { - if (s_RestoreState == WAIT_SD_EJECT || s_RestoreState == ALL_DONE || s_RestoreState == CHECK_SD_DIRECTORY_DONE) + if (s_RestoreState == WAIT_SD_EJECT || s_RestoreState == ALL_DONE || s_RestoreState == CHECK_SD_DIRECTORY_SUCCESS) { s_RestoreState = ALL_DONE; } - else if(s_RestoreState == NUP_ONLY_WAIT_SD_EJECT || s_RestoreState == NUP_ONLY_WAIT_NEXT) + else if (s_RestoreState == NUP_ONLY_WAIT_SD_EJECT || s_RestoreState == NUP_ONLY_WAIT_NEXT) { s_RestoreState = NUP_ONLY_WAIT_NEXT; } + // ユーザのSDが抜かれてからFAILにする + else if (s_RestoreState == CHECK_SD_DIRECTORY_FAIL) + { + s_RestoreState = FAIL; + } // FAILのときは一旦電源を切らないと動かないようにしておく // IVSチェック時はユーザのSDカードを挿入してもらうため - else if(s_RestoreState != FAIL && - s_RestoreState != CHECK_IVS) + else if (s_RestoreState != FAIL && s_RestoreState != CHECK_IVS) { InitializeState(); ClearFileReadResult(); @@ -1365,6 +1383,8 @@ void OnSdInserted() { if(s_RestoreState == CHECK_IVS) { + // SDカードが変わるのでファイルチェックは初期化する + common::InitializeFileCheck(); s_RestoreState = CHECK_SD_DIRECTORY; } } diff --git a/trunk/ConsoleDataMigration/sources/ConsoleRestore/Importer.cpp b/trunk/ConsoleDataMigration/sources/ConsoleRestore/Importer.cpp index 2126555..f405e8c 100644 --- a/trunk/ConsoleDataMigration/sources/ConsoleRestore/Importer.cpp +++ b/trunk/ConsoleDataMigration/sources/ConsoleRestore/Importer.cpp @@ -820,10 +820,56 @@ nn::Result ReadVersionData() return result; } -bool ExistsIvsDirectory() +bool ExistsIvsDirectory(std::string& ivsRoot) { - // TODO: Nintendo 3DS ディレクトリを検索する - return true; + nn::Result result; + nn::fs::Directory dir; + + common::SdMountManager::Mount(); + + result = dir.TryInitialize(common::SD_NINTENDO_3DS_ROOT_PATH); + if(result.IsFailure()) + { + nn::dbg::PrintResult(result); + common::SdMountManager::Unmount(); + return false; + } + + wchar_t ivs[34]; + std::mbstowcs(ivs, ivsRoot.c_str(), ivsRoot.size() + 1); + + nn::fs::DirectoryEntry entry; + s32 numEntry; + for (;;) + { + result = dir.TryRead(&numEntry, &entry, 1); + if (result.IsFailure()) + { + dir.Finalize(); + common::SdMountManager::Unmount(); + return false; + } + if (numEntry == 0) + { + // ルートディレクトリを閉じる + dir.Finalize(); + common::SdMountManager::Unmount(); + return false; + } + else + { + // 比較する + if (entry.attributes.isDirectory) + { + NN_LOG("%ls\n", entry.entryName); + if(std::wcscmp(ivs, entry.entryName) == 0) + { + common::SdMountManager::Unmount(); + return true; + } + } + } + } } void Cleanup() diff --git a/trunk/ConsoleDataMigration/sources/ConsoleRestore/Importer.h b/trunk/ConsoleDataMigration/sources/ConsoleRestore/Importer.h index 486f3f9..c1d4651 100644 --- a/trunk/ConsoleDataMigration/sources/ConsoleRestore/Importer.h +++ b/trunk/ConsoleDataMigration/sources/ConsoleRestore/Importer.h @@ -19,6 +19,7 @@ #include #include "FileName.h" #include +#include namespace ConsoleRestore { @@ -95,7 +96,7 @@ nn::Result InitializeHardwareDependentSetting(); nn::Result ReadVersionData(); // SDカードのNintendo 3DS以下ににIVSと一致するディレクトリがあるかどうか -bool ExistsIvsDirectory(); +bool ExistsIvsDirectory(std::string& ivsRoot); } diff --git a/trunk/ConsoleDataMigration/sources/ConsoleRestore/Shop.cpp b/trunk/ConsoleDataMigration/sources/ConsoleRestore/Shop.cpp index f5b6cc4..053fa56 100644 --- a/trunk/ConsoleDataMigration/sources/ConsoleRestore/Shop.cpp +++ b/trunk/ConsoleDataMigration/sources/ConsoleRestore/Shop.cpp @@ -354,6 +354,7 @@ void ShopOperationSingleThreadFunc(ShopThreadParam param) case SHOP_OPERATION_GET_IVS: { + ShopOperationConnect(); // IVSを取得する result = nn::nim::Shop::ImportIvsFromInfrastructure(); NIM_SHOP_RESULT_CHECK(result); diff --git a/trunk/ConsoleDataMigration/sources/common/FileName.h b/trunk/ConsoleDataMigration/sources/common/FileName.h index 8600547..0cf1b11 100644 --- a/trunk/ConsoleDataMigration/sources/common/FileName.h +++ b/trunk/ConsoleDataMigration/sources/common/FileName.h @@ -62,6 +62,7 @@ const wchar_t* const REGION_DATA_PATHNAME = L"sdmc:/CTR_Console_Repair/Region.bi const wchar_t* const DEVICE_ID_PATHNAME = L"sdmc:/CTR_Console_Repair/deviceId.bin"; const wchar_t* const FILE_LIST_PATHNAME = L"sdmc:/CTR_Console_Repair/FileList.txt"; const wchar_t* const TWL_TITLELIST_PATHNAME = L"sdmc:/CTR_Console_Repair/TwlTitleList.txt"; +const wchar_t* const SD_NINTENDO_3DS_ROOT_PATH = L"sdmc:/Nintendo 3DS/"; enum TWL_PATH_INDEX {