IVS取得モードでユーザのSDカードを調べるように

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
This commit is contained in:
N2614 2011-04-25 02:25:31 +00:00
parent 8a6fb97c54
commit 7c5b20eec6
6 changed files with 91 additions and 22 deletions

View File

@ -228,7 +228,7 @@ extern "C" void nnMain(void)
// RenderSystemを作ってからログが出せる // RenderSystemを作ってからログが出せる
common::Logger::InitializeEjectThread(); common::Logger::InitializeEjectThread();
common::Logger::SetEjectHandler(OnSdEjected); common::Logger::SetEjectHandler(OnSdEjected);
common::Logger::SetInsertHandler(OnSdEjected); common::Logger::SetInsertHandler(OnSdInserted);
COMMON_LOGGER("\n"); COMMON_LOGGER("\n");
COMMON_LOGGER("CTR Console Restore start\n"); COMMON_LOGGER("CTR Console Restore start\n");

View File

@ -33,6 +33,7 @@
#include "NtpClient.h" #include "NtpClient.h"
#include "TitleDownloader.h" #include "TitleDownloader.h"
#include "Shop.h" #include "Shop.h"
#include "Util.h"
namespace ConsoleRestore namespace ConsoleRestore
{ {
@ -40,7 +41,7 @@ namespace ConsoleRestore
namespace namespace
{ {
// インターネット設定を読んだかどうか // ネットワーク設定ファイルを読んだかどうか
bool s_ReadSettingDone = false; bool s_ReadSettingDone = false;
// インターネット設定を読んだ結果 // インターネット設定を読んだ結果
bool s_ReadSettingIsSuccess = false; bool s_ReadSettingIsSuccess = false;
@ -110,7 +111,8 @@ typedef enum RestoreState
DOWNLOAD_IVS_DONE, // インフラからIVSを取得完了 DOWNLOAD_IVS_DONE, // インフラからIVSを取得完了
CHECK_IVS, // IVSとSDカードのセーブデータディレクトリの一致を確認 CHECK_IVS, // IVSとSDカードのセーブデータディレクトリの一致を確認
CHECK_SD_DIRECTORY, // SDカードのIVS依存ディレクトリを探す 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, // ショップアカウントを削除する
DELETE_ACCOUNT_DONE, // ショップアカウント削除完了 DELETE_ACCOUNT_DONE, // ショップアカウント削除完了
SYNC_TICKET, // eTicketを同期する SYNC_TICKET, // eTicketを同期する
@ -895,33 +897,45 @@ void ControlState(::std::vector<std::string>& operationMessage, bool& nextStep)
{ {
if (nn::fs::IsSdmcInserted()) if (nn::fs::IsSdmcInserted())
{ {
NN_LOG("Check User's SD Card\n");
// ユーザのSDカードにはAP設定ファイルは無いはず // ユーザのSDカードにはAP設定ファイルは無いはず
if (ExistsAPSetting()) if (ExistsAPSetting())
{ {
NN_LOG("AP Setting Exists. Retry\n");
s_RestoreState = CHECK_IVS; s_RestoreState = CHECK_IVS;
} }
else 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; break;
case CHECK_SD_DIRECTORY_DONE: case CHECK_SD_DIRECTORY_SUCCESS:
{ {
static bool init = true; operationMessage.push_back(::std::string("Check User's SD Card Succeeded."));
if(init) operationMessage.push_back(::std::string("Pull Out SD Card"));
{
DeleteAllCheckFiles();
init = false;
} }
break;
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")); operationMessage.push_back(::std::string("Pull Out SD Card"));
} }
break; break;
@ -1343,7 +1357,7 @@ bool IsRestoreFailed()
void OnSdEjected() 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; s_RestoreState = ALL_DONE;
} }
@ -1351,10 +1365,14 @@ void OnSdEjected()
{ {
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のときは一旦電源を切らないと動かないようにしておく // FAILのときは一旦電源を切らないと動かないようにしておく
// IVSチェック時はユーザのSDカードを挿入してもらうため // IVSチェック時はユーザのSDカードを挿入してもらうため
else if(s_RestoreState != FAIL && else if (s_RestoreState != FAIL && s_RestoreState != CHECK_IVS)
s_RestoreState != CHECK_IVS)
{ {
InitializeState(); InitializeState();
ClearFileReadResult(); ClearFileReadResult();
@ -1365,6 +1383,8 @@ void OnSdInserted()
{ {
if(s_RestoreState == CHECK_IVS) if(s_RestoreState == CHECK_IVS)
{ {
// SDカードが変わるのでファイルチェックは初期化する
common::InitializeFileCheck();
s_RestoreState = CHECK_SD_DIRECTORY; s_RestoreState = CHECK_SD_DIRECTORY;
} }
} }

View File

@ -820,11 +820,57 @@ nn::Result ReadVersionData()
return result; return result;
} }
bool ExistsIvsDirectory() bool ExistsIvsDirectory(std::string& ivsRoot)
{ {
// TODO: Nintendo 3DS ディレクトリを検索する 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; return true;
} }
}
}
}
}
void Cleanup() void Cleanup()
{ {

View File

@ -19,6 +19,7 @@
#include <nn.h> #include <nn.h>
#include "FileName.h" #include "FileName.h"
#include <nn/ac/CTR/private/ac_NetworkSetting.h> #include <nn/ac/CTR/private/ac_NetworkSetting.h>
#include <string>
namespace ConsoleRestore namespace ConsoleRestore
{ {
@ -95,7 +96,7 @@ nn::Result InitializeHardwareDependentSetting();
nn::Result ReadVersionData(); nn::Result ReadVersionData();
// SDカードのNintendo 3DS以下ににIVSと一致するディレクトリがあるかどうか // SDカードのNintendo 3DS以下ににIVSと一致するディレクトリがあるかどうか
bool ExistsIvsDirectory(); bool ExistsIvsDirectory(std::string& ivsRoot);
} }

View File

@ -354,6 +354,7 @@ void ShopOperationSingleThreadFunc(ShopThreadParam param)
case SHOP_OPERATION_GET_IVS: case SHOP_OPERATION_GET_IVS:
{ {
ShopOperationConnect();
// IVSを取得する // IVSを取得する
result = nn::nim::Shop::ImportIvsFromInfrastructure(); result = nn::nim::Shop::ImportIvsFromInfrastructure();
NIM_SHOP_RESULT_CHECK(result); NIM_SHOP_RESULT_CHECK(result);

View File

@ -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 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 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 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 enum TWL_PATH_INDEX
{ {