警告ログ出力のフォント色変更

A or START入力ならばセーブデータチェック後エラー画面に遷移するように
左+A or START入力で削除後吸出しに遷移するように

git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_Repair@441 385bec56-5757-e545-9c3a-d8741f4650f1
This commit is contained in:
N2614 2011-10-03 06:07:53 +00:00
parent 86548396f2
commit 32d798b269
11 changed files with 436 additions and 281 deletions

View File

@ -31,6 +31,7 @@ nn::os::Thread s_CheckerThread;
nn::os::StackBuffer<CHECKER_STACK_SIZE> s_CheckerThreadStackSize;
nn::Result s_CheckerResult;
NandSavedataChecker* s_pChecker;
bool s_CheckErrorOccured = false;
}
@ -47,7 +48,7 @@ s32 GetCheckSaveDataProgress()
}
void CheckSaveDataThreadFunc()
void CheckSaveDataThreadFunc(bool erase)
{
size_t bufSize = common::GetAllocatableSize();
if(bufSize > common::FILE_COPY_HEAP_SIZE)
@ -58,7 +59,7 @@ void CheckSaveDataThreadFunc()
if (heap.GetAddr() != NULL)
{
s_pChecker = new NandSavedataChecker(heap.GetAddr(), bufSize);
s_CheckerResult = s_pChecker->CleanUp();
s_CheckerResult = s_pChecker->CleanUp(erase);
}
else
{
@ -68,9 +69,9 @@ void CheckSaveDataThreadFunc()
}
}
void StartSaveDataCheck()
void StartSaveDataCheck(bool erase)
{
s_CheckerThread.Start(CheckSaveDataThreadFunc, s_CheckerThreadStackSize);
s_CheckerThread.Start(CheckSaveDataThreadFunc, erase, s_CheckerThreadStackSize);
}
bool IsCheckSaveDataFinished()
@ -85,10 +86,16 @@ void FinalizeSaveDataCheck()
if(s_pChecker != NULL)
{
s_CheckErrorOccured = s_pChecker->GetCheckErrorOccured();
delete s_pChecker;
}
}
bool CheckSaveDataErrorOccured()
{
return s_CheckErrorOccured;
}
bool CheckSaveDataSucceeded()
{
COMMON_LOGGER_RETURN_FALSE_IF_FAILED(s_CheckerResult);

View File

@ -20,9 +20,12 @@ namespace ConsoleBackup
{
s32 GetCheckSaveDataProgress();
void StartSaveDataCheck();
//!@ brief セーブデータのチェックを開始する
//!@ param[in] erase エラー発生時にファイルを削除するかどうか
void StartSaveDataCheck(bool erase);
bool IsCheckSaveDataFinished();
void FinalizeSaveDataCheck();
bool CheckSaveDataErrorOccured();
bool CheckSaveDataSucceeded();
}

View File

@ -155,6 +155,7 @@ extern "C" void nnMain(void)
bool flip = false;
bool continueBackup = false;
bool forceDelete = false;
for(;;)
{
@ -166,6 +167,10 @@ extern "C" void nnMain(void)
padStatus.trigger & nn::hid::BUTTON_START)
{
nextStep = true;
if(padStatus.hold & nn::hid::BUTTON_LEFT)
{
forceDelete = true;
}
}
// LまたはRボタンで上下画面フリップ
@ -214,7 +219,7 @@ extern "C" void nnMain(void)
// 進捗確認メッセージを兼ねる?
::std::vector<std::string> operationMessage;
ControlState(manager, operationMessage, nextStep, continueBackup);
ControlState(manager, operationMessage, nextStep, continueBackup, forceDelete);
nn::util::FloatColor titleColor;
@ -239,6 +244,7 @@ extern "C" void nnMain(void)
GetProgress(),
IsBackupFailed(),
IsBackupSucceeded(),
IsBackupWarning(),
s_HwUtility.GetMacAddress(),
operationMessage,
s_HwUtility.GetRegion(),
@ -246,6 +252,20 @@ extern "C" void nnMain(void)
s_HwUtility.HasReadFriendCode()
);
if (GetBackupMode() == BACKUP_MODE_DELETE_IF_FAILED)
{
const u8 spaceSize = 10;
const u8 lineBottom = 23;
const u32 screenWidth = 400;
renderSystem.SetColor(1.f, 1.f, 1.f);
renderSystem.DrawText(0, lineBottom * spaceSize, "Delete Error File Mode");
renderSystem.SetColor(titleColor.r, titleColor.g, titleColor.b);
renderSystem.FillRectangle(0, lineBottom * spaceSize, screenWidth, spaceSize);
renderSystem.SetColor(1.f, 1.f, 1.f);
}
renderSystem.SwapBuffers();
// デフォルトで下画面に描画するもの
@ -254,7 +274,11 @@ extern "C" void nnMain(void)
{
renderSystem.SetClearColor(common::GetRenderTarget(NN_GX_DISPLAY1, flip), SUCCESS_COLOR);
}
if(IsBackupFailed())
if(IsBackupWarning())
{
renderSystem.SetClearColor(common::GetRenderTarget(NN_GX_DISPLAY1, flip), WARN_COLOR);
}
else if(IsBackupFailed())
{
renderSystem.SetClearColor(common::GetRenderTarget(NN_GX_DISPLAY1, flip), FAIL_COLOR);
}

View File

@ -39,10 +39,16 @@ typedef enum BackupState
DELETE_NIM, // nimのシステムセーブデータ削除
DONE, // 吸出し完了
FINISHED, // SDカード抜き完了
FAIL // 失敗
FAIL, // 失敗
FAIL_CHECK, // セーブデータのチェック時エラー
STATE_MAX
} BackupState;
// Backupモード管理
BackupMode s_BackupMode = BACKUP_MODE_CHECK;
// APSettingの書式が無い警告サウンドを鳴らしたかどうか
bool s_ExistAPSettingAnnotation = false;
// SDに書き込みできない警告サウンドを鳴らしたかどうか
@ -85,7 +91,7 @@ bool NeedsAcAdapter(common::HardwareStateManager& manager)
}
void ControlState(common::HardwareStateManager& manager, ::std::vector<std::string>& operationMessage, bool& nextStep,
bool& continueBackup)
bool& continueBackup, bool forceDelete)
{
// 状態遷移Controller
switch (s_BackupState)
@ -93,89 +99,93 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector<std::stri
// 起動時
case STARTUP:
{
bool error = false;
// 完全性検証SEEDを読めるか
if (manager.CanReadIvs())
{
// SDカードが挿入されているか
if (nn::fs::IsSdmcInserted())
bool error = false;
// 完全性検証SEEDを読めるか
if (manager.CanReadIvs())
{
// SDカードに書き込みできるか?
if (!nn::fs::IsSdmcWritable())
// SDカードが挿入されているか?
if (nn::fs::IsSdmcInserted())
{
if (!s_SdWriteProetctAnnotation)
// SDカードに書き込みできるか
if (!nn::fs::IsSdmcWritable())
{
s_SdWriteProetctAnnotation = true;
common::PlaySound(common::SOUND_ANNOTATION);
}
operationMessage.push_back(::std::string("Can*t Write SD Card!!\n"));
break;
}
// 無線設定ファイルがあるか?
if (common::ExistsAPSetting())
{
// 書き込み中に抜かないように
if (nextStep)
{
// シリアルナンバーを読み取れるか?
if (!manager.CanReadSerialNumber())
if (!s_SdWriteProetctAnnotation)
{
s_SdWriteProetctAnnotation = true;
common::PlaySound(common::SOUND_ANNOTATION);
COMMON_LOGGER("Can't Read Serial Number\n");
}
operationMessage.push_back(::std::string("Can*t Write SD Card!!\n"));
break;
}
// 無線設定ファイルがあるか?
if (common::ExistsAPSetting())
{
// 書き込み中に抜かないように
if (nextStep)
{
// シリアルナンバーを読み取れるか?
if (!manager.CanReadSerialNumber())
{
common::PlaySound(common::SOUND_ANNOTATION);
COMMON_LOGGER("Can't Read Serial Number\n");
}
}
}
else
{
error = true;
if (!s_ExistAPSettingAnnotation)
{
s_ExistAPSettingAnnotation = true;
common::PlaySound(common::SOUND_ANNOTATION);
}
operationMessage.push_back(::std::string("Accsess_Point_Setting does not exist!"));
}
}
else
{
error = true;
if (!s_ExistAPSettingAnnotation)
{
s_ExistAPSettingAnnotation = true;
common::PlaySound(common::SOUND_ANNOTATION);
}
operationMessage.push_back(::std::string("Accsess_Point_Setting does not exist!"));
operationMessage.push_back(::std::string("Insert SD Card!!"));
}
}
else
{
error = true;
operationMessage.push_back(::std::string("Insert SD Card!!"));
operationMessage.push_back(::std::string("Can't Read SDCI!!"));
}
}
else
{
error = true;
operationMessage.push_back(::std::string("Can't Read SDCI!!"));
}
// ACアダプタが必要か
if (NeedsAcAdapter(manager))
{
error = true;
operationMessage.push_back(::std::string("Connect AC Adapter!!"));
}
// エラーが無ければ進行用メッセージ表示
if(!error)
{
operationMessage.push_back(::std::string("Push A or START Button"));
if(!s_PlayedStartCursor)
// ACアダプタが必要か
if (NeedsAcAdapter(manager))
{
common::PlaySound(common::SOUND_CURSOR);
s_PlayedStartCursor = true;
error = true;
operationMessage.push_back(::std::string("Connect AC Adapter!!"));
}
// エラーが無ければ進行用メッセージ表示
if (!error)
{
operationMessage.push_back(::std::string("Push A or START Button"));
if (!s_PlayedStartCursor)
{
common::PlaySound(common::SOUND_CURSOR);
s_PlayedStartCursor = true;
}
}
if (nextStep && !error)
{
COMMON_LOGGER("Checking SaveData\n");
if(forceDelete)
{
s_BackupMode = BACKUP_MODE_DELETE_IF_FAILED;
}
s_BackupState = CHECK_SAVEDATA;
}
}
if (nextStep && !error)
{
COMMON_LOGGER("Checking SaveData\n");
s_BackupState = CHECK_SAVEDATA;
}
}
break;
break;
case CHECK_SAVEDATA:
@ -183,7 +193,7 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector<std::stri
static bool init = true;
if (init)
{
StartSaveDataCheck();
StartSaveDataCheck(s_BackupMode == BACKUP_MODE_DELETE_IF_FAILED);
init = false;
}
@ -192,11 +202,86 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector<std::stri
if (IsCheckSaveDataFinished())
{
FinalizeSaveDataCheck();
if (CheckSaveDataSucceeded())
// 削除モードでなければエラーにする
if (CheckSaveDataErrorOccured() && !forceDelete)
{
COMMON_LOGGER("Start Export Data\n");
s_BackupState = FAIL_CHECK;
}
else
{
if (CheckSaveDataSucceeded())
{
COMMON_LOGGER("Start Export Data\n");
s_BackupState = EXPORT_TWL_NAND;
s_BackupState = EXPORT_TWL_NAND;
}
else
{
s_BackupState = FAIL;
}
}
}
}
break;
// TWLセーブデータ領域の吸出し中
case EXPORT_TWL_NAND:
{
static bool init = true;
if (init)
{
// コンテキストを初期化する
InitializeFileListContext();
// データを書き込む
if (ExportTwlSaveData().IsFailure())
{
s_BackupState = FAIL;
break;
}
init = false;
}
PutAliveMessage(operationMessage, "Exporting TWL SaveData");
// 処理が完了した
if (IsExportThreadFinished())
{
FinalizeExportThread();
if (IsExportSucceeded())
{
s_BackupState = EXPORT_TWL_SOUND;
}
else
{
s_BackupState = FAIL;
}
}
}
break;
// TWLサウンド領域の吸出し中
case EXPORT_TWL_SOUND:
{
static bool init = true;
if (init)
{
// データを書き込む
ExportTwlSoundData();
init = false;
}
PutAliveMessage(operationMessage, "Exporting TWL Sound Data");
// 処理が完了した
if (IsExportThreadFinished())
{
FinalizeExportThread();
if (IsExportSucceeded())
{
s_BackupState = EXPORT_TWL_PHOTO;
}
else
{
@ -206,200 +291,144 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector<std::stri
}
break;
// TWLセーブデータ領域の吸出し中
case EXPORT_TWL_NAND:
{
static bool init = true;
if(init)
{
// コンテキストを初期化する
InitializeFileListContext();
// データを書き込む
if(ExportTwlSaveData().IsFailure())
{
s_BackupState = FAIL;
break;
}
init = false;
}
PutAliveMessage(operationMessage, "Exporting TWL SaveData");
// 処理が完了した
if (IsExportThreadFinished())
{
FinalizeExportThread();
if(IsExportSucceeded())
{
s_BackupState = EXPORT_TWL_SOUND;
}
else
{
s_BackupState = FAIL;
}
}
}
break;
// TWLサウンド領域の吸出し中
case EXPORT_TWL_SOUND:
{
static bool init = true;
if(init)
{
// データを書き込む
ExportTwlSoundData();
init = false;
}
PutAliveMessage(operationMessage, "Exporting TWL Sound Data");
// 処理が完了した
if (IsExportThreadFinished())
{
FinalizeExportThread();
if(IsExportSucceeded())
{
s_BackupState = EXPORT_TWL_PHOTO;
}
else
{
s_BackupState = FAIL;
}
}
}
break;
// TWL写真領域の吸出し中
// TWL写真領域の吸出し中
case EXPORT_TWL_PHOTO:
{
static bool init = true;
if(init)
{
// データを書き込む
ExportTwlPhotoData();
init = false;
}
PutAliveMessage(operationMessage, "Exporting TWL Photo Data");
// 処理が完了した
if (IsExportThreadFinished())
{
FinalizeExportThread();
if(IsExportSucceeded())
static bool init = true;
if (init)
{
s_BackupState = EXPORT_CTR_NAND;
// データを書き込む
ExportTwlPhotoData();
init = false;
}
else
{
s_BackupState = FAIL;
}
}
}
break;
// 吸出し中
case EXPORT_CTR_NAND:
{
continueBackup = true;
PutAliveMessage(operationMessage, "Exporting TWL Photo Data");
// ACアダプタが必要か
if (NeedsAcAdapter(manager))
{
continueBackup = false;
operationMessage.push_back(::std::string("Connect AC Adapter!!"));
}
PutAliveMessage(operationMessage, "Exporting Nand Data");
// データを書き込む
if (!ExportData(manager))
{
s_BackupState = FAIL;
}
else
{
// 処理が完了した
if (continueBackup && IsExportThreadFinished())
if (IsExportThreadFinished())
{
FinalizeExportThread();
if (IsExportSucceeded())
{
COMMON_LOGGER("Export NAND Data Finished.\n");
if (GetExportProgress() > 99)
{
s_BackupState = DELETE_NIM;
}
else
{
s_BackupState = FAIL;
}
s_BackupState = EXPORT_CTR_NAND;
}
else
{
s_BackupState = FAIL;
}
}
}
}
break;
break;
// nimのシステムセーブデータ削除
// 吸出し中
case EXPORT_CTR_NAND:
{
continueBackup = true;
// ACアダプタが必要か
if (NeedsAcAdapter(manager))
{
continueBackup = false;
operationMessage.push_back(::std::string("Connect AC Adapter!!"));
}
PutAliveMessage(operationMessage, "Exporting Nand Data");
// データを書き込む
if (!ExportData(manager))
{
s_BackupState = FAIL;
}
else
{
// 処理が完了した
if (continueBackup && IsExportThreadFinished())
{
FinalizeExportThread();
if (IsExportSucceeded())
{
COMMON_LOGGER("Export NAND Data Finished.\n");
if (GetExportProgress() > 99)
{
s_BackupState = DELETE_NIM;
}
else
{
s_BackupState = FAIL;
}
}
else
{
s_BackupState = FAIL;
}
}
}
}
break;
// nimのシステムセーブデータ削除
case DELETE_NIM:
{
if(DeleteNimSaveData())
{
s_BackupState = DONE;
}
else
{
s_BackupState = FAIL;
}
if (DeleteNimSaveData())
{
s_BackupState = DONE;
}
else
{
s_BackupState = FAIL;
}
}
break;
}
break;
// 吸出し完了
case DONE:
{
operationMessage.push_back(::std::string("Backup Done. Pull Out SD Card."));
if(!s_PlayedSdPullOutCursor)
{
common::PlaySound(common::SOUND_CURSOR);
s_PlayedSdPullOutCursor = true;
operationMessage.push_back(::std::string("Backup Done. Pull Out SD Card."));
if (!s_PlayedSdPullOutCursor)
{
common::PlaySound(common::SOUND_CURSOR);
s_PlayedSdPullOutCursor = true;
}
}
}
break;
break;
// SDカード抜き完了
case FINISHED:
{
operationMessage.push_back(::std::string("Backup Succeeded!!\n"));
if(!s_PlayedFinishedSound)
{
common::PlaySound(common::SOUND_OK);
s_PlayedFinishedSound = true;
operationMessage.push_back(::std::string("Backup Succeeded!!\n"));
if (!s_PlayedFinishedSound)
{
common::PlaySound(common::SOUND_OK);
s_PlayedFinishedSound = true;
}
}
}
break;
break;
// 吸出し失敗
case FAIL:
{
operationMessage.push_back(::std::string("Backup Failed."));
if(!s_PlayedFailSound)
{
common::PlaySound(common::SOUND_NG);
s_PlayedFailSound = true;
operationMessage.push_back(::std::string("Backup Failed."));
if (!s_PlayedFailSound)
{
common::PlaySound(common::SOUND_NG);
s_PlayedFailSound = true;
}
}
}
break;
break;
case FAIL_CHECK:
{
operationMessage.push_back(::std::string("Check Error."));
if (!s_PlayedFailSound)
{
common::PlaySound(common::SOUND_NG);
s_PlayedFailSound = true;
}
}
break;
}
}
@ -416,6 +445,12 @@ u32 GetProgress()
}
}
// バックアップモードを取得する
BackupMode GetBackupMode()
{
return s_BackupMode;
}
bool InProgress()
{
return s_BackupState == EXPORT_CTR_NAND;
@ -431,13 +466,18 @@ bool IsBackupFailed()
return s_BackupState == FAIL;
}
bool IsBackupWarning()
{
return s_BackupState == FAIL_CHECK;
}
void OnSdEjected()
{
if(s_BackupState == DONE || s_BackupState == FINISHED)
{
s_BackupState = FINISHED;
}
else if(s_BackupState != FAIL)
else if(s_BackupState != FAIL && s_BackupState != FAIL_CHECK)
{
common::InitializeFileCheck();
InitializeState();

View File

@ -23,13 +23,21 @@
namespace ConsoleBackup
{
// 状態遷移を管理する
// manager ハードウェア情報を取得するためのラッパ
// operationMessage 操作情報として表示したい文字列
// nextStep 次の状態に遷移してもよいかどうか
// continueBackup 処理を続けてもよいかどうか
typedef enum BackupMode
{
BACKUP_MODE_CHECK, // セーブデータのチェック後エラーが無ければ吸出し
BACKUP_MODE_DELETE_IF_FAILED // 読み取りエラーのセーブデータを削除後吸出し
} BackupMode;
//! @brief 状態遷移を管理する
//! @param[in] manager ハードウェア情報を取得するためのラッパ
//! @param[in] operationMessage 操作情報として表示したい文字列
//! @param[in] nextStep 次の状態に遷移してもよいかどうか
//! @param[in] continueBackup 処理を続けてもよいかどうか
//! @param[in] forceDelete チェックエラー発生時に削除を実行してもよいかどうか
void ControlState(common::HardwareStateManager& manager, ::std::vector<std::string>& operationMessage, bool& nextStep,
bool& continueBackup);
bool& continueBackup, bool forceDelete);
// バックアップ処理中かどうか
bool InProgress();
@ -40,6 +48,9 @@ bool IsBackupSucceeded();
// バックアップが失敗したかどうか
bool IsBackupFailed();
// バックアップ時に警告があったかどうか
bool IsBackupWarning();
// SDカードが抜き出されたときに実行したい関数
void OnSdEjected();
@ -49,6 +60,9 @@ void InitializeState();
// 進捗を取得する
u32 GetProgress();
// バックアップモードを取得する
BackupMode GetBackupMode();
}
#endif /* CONTOROLLER_H_ */

View File

@ -29,7 +29,7 @@ namespace
}
SavedataCheckerBase::SavedataCheckerBase(void* buf, size_t size) :
m_Buf(buf), m_Bufsize(size), m_CalculatedFileSize(0), m_TotalReadSize(0)
m_Buf(buf), m_Bufsize(size), m_CalculatedFileSize(0), m_TotalReadSize(0), m_CheckErrorOccured(false)
{
}
@ -39,7 +39,7 @@ SavedataCheckerBase::~SavedataCheckerBase()
NN_LOG("m_TotalReadSize = %lld\n", m_TotalReadSize);
}
nn::Result SavedataCheckerBase::CleanUpFilesRecursively(bool* modified, std::wstring currentDirectory)
nn::Result SavedataCheckerBase::CleanUpFilesRecursively(bool* modified, std::wstring currentDirectory, bool erase)
{
nn::fs::Directory dir;
nn::fs::DirectoryEntry entry;
@ -49,9 +49,15 @@ nn::Result SavedataCheckerBase::CleanUpFilesRecursively(bool* modified, std::wst
result = dir.TryInitialize(currentDirectory.c_str());
if(result.IsFailure())
{
COMMON_LOGGER_WARN("Delete Directory %s\n", common::GetCharStr(currentDirectory.c_str()));
result = nn::fs::TryDeleteDirectory(currentDirectory.c_str());
*modified = true;
COMMON_LOGGER_WARN("Error: %s\n", common::GetCharStr(currentDirectory.c_str()));
m_CheckErrorOccured = true;
if (erase)
{
COMMON_LOGGER_WARN("Deleting: %s\n", common::GetCharStr(currentDirectory.c_str()));
result = nn::fs::TryDeleteDirectory(currentDirectory.c_str());
COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result);
*modified = true;
}
return result;
}
@ -62,9 +68,15 @@ nn::Result SavedataCheckerBase::CleanUpFilesRecursively(bool* modified, std::wst
if(result.IsFailure())
{
dir.Finalize();
COMMON_LOGGER_WARN("Delete Directory %s\n", common::GetCharStr(currentDirectory.c_str()));
result = nn::fs::TryDeleteDirectoryRecursively(currentDirectory.c_str());
*modified = true;
COMMON_LOGGER_WARN("Error: %s\n", common::GetCharStr(currentDirectory.c_str()));
m_CheckErrorOccured = true;
if (erase)
{
COMMON_LOGGER_WARN("Deleting: %s\n", common::GetCharStr(currentDirectory.c_str()));
result = nn::fs::TryDeleteDirectoryRecursively(currentDirectory.c_str());
COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result);
*modified = true;
}
continue;
}
@ -83,7 +95,7 @@ nn::Result SavedataCheckerBase::CleanUpFilesRecursively(bool* modified, std::wst
// ディレクトリの場合
if (entry.attributes.isDirectory)
{
return CleanUpFilesRecursively(modified, currentDirectory + std::wstring(entry.entryName) + std::wstring(L"/"));
return CleanUpFilesRecursively(modified, currentDirectory + std::wstring(entry.entryName) + std::wstring(L"/"), erase);
}
// ファイルの場合
else
@ -96,9 +108,14 @@ nn::Result SavedataCheckerBase::CleanUpFilesRecursively(bool* modified, std::wst
if(result.IsFailure())
{
nn::dbg::PrintResult(result);
COMMON_LOGGER_WARN("Cannot Initialize %s, delete.\n", common::GetCharStr(entry.entryName));
result = nn::fs::TryDeleteFile(path);
*modified = true;
COMMON_LOGGER_WARN("Error: %s\n", common::GetCharStr(path));
m_CheckErrorOccured = true;
if (erase)
{
COMMON_LOGGER_WARN("Deleting: %s\n", common::GetCharStr(path));
result = nn::fs::TryDeleteFile(path);
*modified = true;
}
continue;
}
@ -109,12 +126,17 @@ nn::Result SavedataCheckerBase::CleanUpFilesRecursively(bool* modified, std::wst
if(result.IsFailure())
{
nn::dbg::PrintResult(result);
COMMON_LOGGER_WARN("Cannot read %s, delete.\n", common::GetCharStr(entry.entryName));
COMMON_LOGGER_WARN("Error: %s\n", common::GetCharStr(path));
m_TotalReadSize += file.GetSize();
file.Finalize();
result = nn::fs::TryDeleteFile(path);
COMMON_LOGGER_RESULT_IF_FAILED(result);
*modified = true;
m_CheckErrorOccured = true;
if (erase)
{
COMMON_LOGGER_WARN("Deleting: %s\n", common::GetCharStr(path));
result = nn::fs::TryDeleteFile(path);
COMMON_LOGGER_RESULT_IF_FAILED(result);
*modified = true;
}
break;
}
else
@ -202,6 +224,11 @@ s64 SavedataCheckerBase::GetTotalReadSize()
return m_TotalReadSize;
}
bool SavedataCheckerBase::GetCheckErrorOccured()
{
return m_CheckErrorOccured;
}
NandSavedataChecker::NandSavedataChecker()
{
@ -221,17 +248,17 @@ NandSavedataChecker::~NandSavedataChecker()
delete m_pSysSaveChecker;
}
nn::Result NandSavedataChecker::CleanUp()
nn::Result NandSavedataChecker::CleanUp(bool erase)
{
nn::Result result;
m_pSharedExtSaveChecker->CalculateFileSize();
m_pSysSaveChecker->CalculateFileSize();
result = m_pSharedExtSaveChecker->CleanUp();
result = m_pSharedExtSaveChecker->CleanUp(erase);
COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result);
result = m_pSysSaveChecker->CleanUp();
result = m_pSysSaveChecker->CleanUp(erase);
COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result);
return nn::ResultSuccess();
@ -250,6 +277,11 @@ s64 NandSavedataChecker::GetProgress()
}
}
bool NandSavedataChecker::GetCheckErrorOccured()
{
return m_pSharedExtSaveChecker->GetCheckErrorOccured() || m_pSysSaveChecker->GetCheckErrorOccured();
}
SystemSavedataChecker::SystemSavedataChecker()
{
@ -266,7 +298,7 @@ SystemSavedataChecker::~SystemSavedataChecker()
nn::Result SystemSavedataChecker::CleanUp()
nn::Result SystemSavedataChecker::CleanUp(bool erase)
{
nn::Result result;
@ -280,17 +312,24 @@ nn::Result SystemSavedataChecker::CleanUp()
if(result <= nn::fs::ResultVerificationFailed())
{
NN_LOG("Mount Error: %ls\n", SYSTEM_SAVEDATA_COUPLE_LIST[i].name.c_str());
// 削除する
COMMON_LOGGER_WARN("Delete Savedata %s\n", common::GetCharStr(SYSTEM_SAVEDATA_COUPLE_LIST[i].name.c_str()));
result = nn::fs::DeleteSystemSaveData(SYSTEM_SAVEDATA_COUPLE_LIST[i].id);
COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result);
COMMON_LOGGER_WARN(
"Error Savedata %s\n", common::GetCharStr(SYSTEM_SAVEDATA_COUPLE_LIST[i].name.c_str()));
m_CheckErrorOccured = true;
if (erase)
{
COMMON_LOGGER_WARN(
"Deleting Savedata %s\n", common::GetCharStr(SYSTEM_SAVEDATA_COUPLE_LIST[i].name.c_str()));
// 削除する
result = nn::fs::DeleteSystemSaveData(SYSTEM_SAVEDATA_COUPLE_LIST[i].id);
COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result);
}
}
}
else
{
NN_LOG("Mount %ls\n", SYSTEM_SAVEDATA_COUPLE_LIST[i].name.c_str());
// ファイルを個別にチェックする
result = CleanUpFilesRecursively(&modified, L"ssave:/");
result = CleanUpFilesRecursively(&modified, L"ssave:/", erase);
COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result);
if(modified)
@ -342,7 +381,7 @@ SharedExtSavedataChecker::~SharedExtSavedataChecker()
}
nn::Result SharedExtSavedataChecker::CleanUp()
nn::Result SharedExtSavedataChecker::CleanUp(bool erase)
{
nn::Result result;
@ -362,7 +401,7 @@ nn::Result SharedExtSavedataChecker::CleanUp()
NN_LOG("Mount %x\n", IdArray[i]);
// アーカイブ内のファイル・ディレクトリをチェックする
result = CleanUpFilesRecursively(&modified, L"shext:/");
result = CleanUpFilesRecursively(&modified, L"shext:/", erase);
COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result);
result = nn::fs::Unmount(SHARED_EXT_SAVEDATA_ARCHIVE_NAME);
@ -375,10 +414,14 @@ nn::Result SharedExtSavedataChecker::CleanUp()
{
NN_LOG("Mount Error: %x\n", IdArray[i]);
// 削除する
COMMON_LOGGER_WARN("Delete Shared-Ext-Savedata %x\n", IdArray[i]);
result = nn::fs::DeleteSharedExtSaveData(IdArray[i]);
COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result);
COMMON_LOGGER_WARN("Error Shared-Ext-Savedata %x\n", IdArray[i]);
m_CheckErrorOccured = true;
if (erase)
{
COMMON_LOGGER_WARN("Deleting Shared-Ext-Savedata %x\n", IdArray[i]);
result = nn::fs::DeleteSharedExtSaveData(IdArray[i]);
COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result);
}
}
}
}

View File

@ -121,7 +121,10 @@ public:
SavedataCheckerBase(void* buf, size_t size);
~SavedataCheckerBase();
virtual nn::Result CleanUp() = 0;
//! @brief セーブデータを調べて問題があるファイルを削除するインタフェース
//! @param[in] erase 問題があるファイルを削除するかどうか
virtual nn::Result CleanUp(bool erase) = 0;
//! @brief ファイルサイズをチェックするインタフェース
virtual nn::Result CalculateFileSize() = 0;
//! @return 事前に計算したサイズ
@ -130,11 +133,16 @@ public:
//! @return 読み取ったサイズ
s64 GetTotalReadSize();
//! @brief チェック時にエラーが起こったかどうか調べる
//! @return エラーが起こったかどうか
bool GetCheckErrorOccured();
protected:
//! @brief ファイルとディレクトリを再帰的にチェックする。エラーがあれば削除する
//! @param[out] modified ファイルかディレクトリを削除したかどうか
//! @param[in] currentDirectory チェックを開始するディレクトリ。スラッシュで終端すること。
nn::Result CleanUpFilesRecursively(bool* modified, std::wstring currentDirectory);
//! @param[in] erase ファイルかディレクトリを削除するかどうか
nn::Result CleanUpFilesRecursively(bool* modified, std::wstring currentDirectory, bool erase);
//! @brief ファイルサイズを取得する
//! @param[out] size ファイルサイズ
@ -154,6 +162,10 @@ protected:
//! 累計読み取りサイズ
s64 m_TotalReadSize;
NN_PADDING3;
//! @brief チェック時にエラーが起こったかどうか
bool m_CheckErrorOccured;
NN_PADDING4;
};
@ -166,7 +178,8 @@ public:
~SystemSavedataChecker();
//! @brief システムセーブデータを調べて問題があるファイルを削除する
virtual nn::Result CleanUp();
//! @param[in] erase 問題があるファイルを削除するかどうか
virtual nn::Result CleanUp(bool erase);
//! @brief ファイルサイズをチェックする
virtual nn::Result CalculateFileSize();
@ -181,7 +194,8 @@ public:
~SharedExtSavedataChecker();
//! @brief 共有拡張セーブデータを調べて問題があるファイルを削除する
virtual nn::Result CleanUp();
//! @param[in] erase 問題があるファイルを削除するかどうか
virtual nn::Result CleanUp(bool erase);
//! @brief ファイルサイズをチェックする
virtual nn::Result CalculateFileSize();
@ -195,10 +209,12 @@ public:
NandSavedataChecker(void* buf, size_t size);
~NandSavedataChecker();
nn::Result CleanUp();
nn::Result CleanUp(bool erase);
s64 GetProgress();
bool GetCheckErrorOccured();
private:
SharedExtSavedataChecker* m_pSharedExtSaveChecker;
SystemSavedataChecker* m_pSysSaveChecker;

View File

@ -286,6 +286,7 @@ extern "C" void nnMain(void)
GetProgress(),
IsRestoreFailed(),
IsRestoreSucceeded(),
false,
s_HwUtility.GetMacAddress(),
operationMessage,
s_HwUtility.GetRegion(),

View File

@ -24,7 +24,7 @@
#define COMMON_LOGGER( ... ) (void)common::Logger::GetLoggerInstance()->Print(__VA_ARGS__)
#define COMMON_LOGGER_WARN( ... ) \
(void)common::Logger::GetLoggerInstance()->SetTextColor(1.0f, 1.0f, 0.f, 1.f); \
(void)common::Logger::GetLoggerInstance()->SetTextColor(1.0f, 0.f, 0.f, 1.f); \
(void)common::Logger::GetLoggerInstance()->Print(__VA_ARGS__); \
(void)common::Logger::GetLoggerInstance()->SetTextColor(1.0f, 1.0f, 1.f, 1.f); \

View File

@ -107,8 +107,9 @@ void DrawSystemState
u64 deviceId,
u64 friendCode,
u32 progress,
bool isBackupFailed,
bool isBackupSucceeded,
bool isProcessFailed,
bool isProcessSucceeded,
bool isProcessWarning,
char8* macAddress,
::std::vector<std::string>& operationMessage,
nn::cfg::CTR::CfgRegionCode region,
@ -137,11 +138,15 @@ void DrawSystemState
// デフォルトで上画面に描画するもの
renderSystem.SetRenderTarget(GetRenderTarget(NN_GX_DISPLAY0, flip));
if (isBackupSucceeded)
if (isProcessSucceeded)
{
renderSystem.SetClearColor(GetRenderTarget(NN_GX_DISPLAY0, flip), SUCCESS_COLOR);
}
else if (isBackupFailed)
if (isProcessWarning)
{
renderSystem.SetClearColor(GetRenderTarget(NN_GX_DISPLAY0, flip), WARN_COLOR);
}
else if (isProcessFailed)
{
renderSystem.SetClearColor(GetRenderTarget(NN_GX_DISPLAY0, flip), FAIL_COLOR);
}

View File

@ -39,6 +39,7 @@
#define SUCCESS_COLOR 0.f, 0.6f,0.f, 1.f
#define FAIL_COLOR 0.6f, 0.f,0.f, 1.f
#define NORMAL_COLOR 0.f, 0.f, 0.f, 1.f
#define WARN_COLOR 0.43f, 0.43f, 0.f, 1.f
namespace common
{
@ -66,8 +67,9 @@ void DrawSystemState
u64 deviceId,
u64 friendCode,
u32 progress,
bool isBackupFailed,
bool isBackupSucceeded,
bool isProcessFailed,
bool isProcessSucceeded,
bool isProcessWarning,
char8* macAddress,
::std::vector<std::string>& operationMessage,
nn::cfg::CTR::CfgRegionCode region,