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を作ってからログが出せる
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");

View File

@ -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<std::string>& 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;
}
}

View File

@ -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()

View File

@ -19,6 +19,7 @@
#include <nn.h>
#include "FileName.h"
#include <nn/ac/CTR/private/ac_NetworkSetting.h>
#include <string>
namespace ConsoleRestore
{
@ -95,7 +96,7 @@ nn::Result InitializeHardwareDependentSetting();
nn::Result ReadVersionData();
// 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:
{
ShopOperationConnect();
// IVSを取得する
result = nn::nim::Shop::ImportIvsFromInfrastructure();
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 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
{