diff --git a/trunk/KENJEraser/main.cpp b/trunk/KENJEraser/main.cpp index 400cfc0..8a9c8aa 100644 --- a/trunk/KENJEraser/main.cpp +++ b/trunk/KENJEraser/main.cpp @@ -41,6 +41,12 @@ nn::dbg::PrintResult(result); \ } \ +#define RED 1.0f, 0.0f, 0.0f +#define GREEN 0.0f, 1.0f, 0.0f +#define YELLOW 1.0f, 1.0f, 0.0f +#define WHITE 1.0f, 1.0f, 1.0f +#define BLACK 0.0f, 0.0f, 0.0f + namespace { const char* const NAND_TWL_ARCHIVE_NAME = "twln:"; const char* const NAND_TWL_KENJ_DIR_PATHNAME = "twln:/title/00030004/4b454e4a"; @@ -82,43 +88,31 @@ namespace { }; nn::Result DeleteKENJ(void); - void FatalDrawing(nn::Result result); const size_t ERASE_THREAD_STACK_SIZE = 0x1000; nn::os::Thread s_EraseThread; nn::os::StackBuffer s_EraseThreadStack; demo::RenderSystemDrawing s_RenderSystem; + + bool s_IsAppExist = false; + bool s_IsFinish = false; + bool s_IsSaveDataCleanSuccess = false; + bool s_IsAppDeleteSuccess = false; + nn::Result s_result; // グラフィックスに割り当てるメモリ const size_t s_GxHeapSize = 0x800000; - - ::std::vector* s_pOperationMessage; - + void EraseThreadFunc(void) { - nn::Result result; - - s_pOperationMessage->push_back(std::string("")); - // ほぼ日健康手帳を消去する - result = DeleteKENJ(); - - if(result.IsFailure()) - { - nn::dbg::PrintResult(result); - s_pOperationMessage->push_back(std::string("Failed Delete Program")); - FatalDrawing(result); - } - - s_pOperationMessage->push_back(std::string("")); - s_pOperationMessage->push_back(std::string("Finished.")); - s_RenderSystem.SetClearColor(NN_GX_DISPLAY0, 0, 1, 0, 0); - s_RenderSystem.SetClearColor(NN_GX_DISPLAY1, 0, 1, 0, 0); + s_result = DeleteKENJ(); + + s_IsFinish = true; } - nn::Result FillRandamDataToKENJSaveData(void) { nn::Result result; @@ -189,12 +183,12 @@ namespace { nn::fs::Directory dir; if( dir.TryInitialize(NAND_TWL_KENJ_DIR_PATHNAME).IsFailure() ) { - s_pOperationMessage->push_back(std::string("KENJ not found\n")); dir.Finalize(); } else { - s_pOperationMessage->push_back(std::string("Deleting...")); + // アプリ存在フラグを上げる + s_IsAppExist = true; // ここでfinalizeしておかないと、DeleteProgramでフェータルになる。 dir.Finalize(); @@ -206,9 +200,18 @@ namespace { nn::fs::Unmount( "twln:" ); return result; } + else + { + s_IsSaveDataCleanSuccess = true; + } // ほぼ日健康手帳を消す result = nn::am::DeleteUserProgram(nn::fs::MEDIA_TYPE_NAND, NAND_TWL_KENJ_PROGRAM_ID); + if( result.IsSuccess() ) + { + s_IsAppDeleteSuccess = true; + } + UTIL_RETURN_IF_NOT_AM_NOT_FOUND(result); } @@ -218,40 +221,85 @@ namespace { } - void SetTextWriterCore() + void DrawResultText() { - using namespace common; - - GetTextWriter()->Print("KENJ Eraser\n\n"); - ::std::vector::iterator it; - for (it = s_pOperationMessage->begin(); it != s_pOperationMessage->end(); it++) + s_RenderSystem.SetFontSize(8.0f); + s_RenderSystem.SetColor( YELLOW ); + s_RenderSystem.DrawText(10.0f, 20.0f, "SaveData Cleaner"); + + s_RenderSystem.SetColor( WHITE ); + s_RenderSystem.DrawText(10.0f, 60.0f, "Initialcode : KENJ"); + + if( s_result.IsSuccess() ) { - GetTextWriter()->Printf("%s\n", it->c_str()); + if( s_IsAppExist ) + { + s_RenderSystem.SetColor( GREEN ); + s_RenderSystem.DrawText(10.0f, 75.0f, "application found"); + + s_RenderSystem.SetColor( WHITE ); + s_RenderSystem.DrawText(10.0f, 120.0f, "Private Save :"); + s_RenderSystem.DrawText(10.0f, 135.0f, "Public Save :"); + s_RenderSystem.DrawText(10.0f, 150.0f, "application :"); + + s_RenderSystem.SetColor( YELLOW ); + s_RenderSystem.DrawText(130.0f, 120.0f, "not existed"); + + s_RenderSystem.SetColor( GREEN ); + s_RenderSystem.DrawText(130.0f, 135.0f, "cleanup succeeded"); + s_RenderSystem.DrawText(130.0f, 150.0f, "cleanup succeeded"); + } + else + { + s_RenderSystem.SetColor( YELLOW ); + s_RenderSystem.DrawText(10.0f, 70.0f, "application not found"); + } } - - } - - void FatalDrawing(nn::Result result) - { - char resultStr[32]; - std::snprintf(resultStr, sizeof(resultStr), "%X", result.GetPrintableBits()); - s_pOperationMessage->push_back(resultStr); - - for(;;) + else { - s_RenderSystem.SetRenderTarget(NN_GX_DISPLAY0); - s_RenderSystem.SetClearColor(NN_GX_DISPLAY0, 1.f, 0, 0, 0); - s_RenderSystem.Clear(); + s_RenderSystem.SetColor( WHITE ); + s_RenderSystem.DrawText(10.0f, 120.0f, "Private Save :"); + s_RenderSystem.DrawText(10.0f, 135.0f, "Public Save :"); + s_RenderSystem.DrawText(10.0f, 150.0f, "application :"); - common::SetDrawTextHandler(SetTextWriterCore); - common::DrawResFont(NN_GX_DISPLAY0); - s_RenderSystem.SwapBuffers(); - - s_RenderSystem.SetRenderTarget(NN_GX_DISPLAY1); - s_RenderSystem.SetClearColor(NN_GX_DISPLAY1, 1.f, 0, 0, 0); - s_RenderSystem.Clear(); - - s_RenderSystem.SwapBuffers(); + s_RenderSystem.SetColor( YELLOW ); + s_RenderSystem.DrawText(130.0f, 120.0f, "not existed"); + + // アプリある? + if( s_IsAppExist ) + { + s_RenderSystem.SetColor( GREEN ); + s_RenderSystem.DrawText(10.0f, 75.0f, "application found"); + } + else + { + s_RenderSystem.SetColor( RED ); + s_RenderSystem.DrawText(10.0f, 75.0f, "application not found"); + } + + // セーブデータの乱数埋めでエラー? + if( s_IsSaveDataCleanSuccess ) + { + s_RenderSystem.SetColor( GREEN ); + s_RenderSystem.DrawText(130.0f, 135.0f, "cleanup succeeded"); + } + else + { + s_RenderSystem.SetColor( RED ); + s_RenderSystem.DrawText(130.0f, 135.0f, "cleanup failed"); + } + + // アプリ削除でエラー? + if( s_IsAppDeleteSuccess ) + { + s_RenderSystem.SetColor( GREEN ); + s_RenderSystem.DrawText(130.0f, 150.0f, "cleanup failed"); + } + else + { + s_RenderSystem.SetColor( RED ); + s_RenderSystem.DrawText(130.0f, 150.0f, "cleanup failed"); + } } } } @@ -287,32 +335,51 @@ extern "C" void nnMain(void) // ResFontの初期化 common::InitializeResFont(); - std::vector operationMessage; - s_pOperationMessage = &operationMessage; - s_EraseThread.Start(EraseThreadFunc, s_EraseThreadStack); - - // ボタン入力 - nn::hid::PadReader padReader; - nn::hid::PadStatus padStatus; - s_RenderSystem.SetClearColor(NN_GX_DISPLAY0, 0, 0, 0, 0); - s_RenderSystem.SetClearColor(NN_GX_DISPLAY1, 0, 0, 0, 0); + s_RenderSystem.SetClearColor(NN_GX_DISPLAY0, BLACK, 0); + s_RenderSystem.SetClearColor(NN_GX_DISPLAY1, BLACK, 0); for(;;) { - padReader.ReadLatest(&padStatus); + if( s_IsFinish ) + { + // 初期化 + s_RenderSystem.SetRenderTarget(NN_GX_DISPLAY0); + s_RenderSystem.Clear(); - s_RenderSystem.SetRenderTarget(NN_GX_DISPLAY0); - s_RenderSystem.Clear(); + // 上画面の色変更 + if( s_result.IsSuccess() ) + { + if( !s_IsAppExist ) + { + s_RenderSystem.SetClearColor(NN_GX_DISPLAY0, YELLOW, 0); + } + else + { + s_RenderSystem.SetClearColor(NN_GX_DISPLAY0, GREEN, 0); + } + } + else + { + s_RenderSystem.SetClearColor(NN_GX_DISPLAY0, RED, 0); + } + + // バッファへ + s_RenderSystem.SwapBuffers(); + + // 初期化 + s_RenderSystem.SetRenderTarget(NN_GX_DISPLAY1); + s_RenderSystem.Clear(); + + // 変更 + DrawResultText(); + common::DrawResFont(NN_GX_DISPLAY1); + + // バッファへ + s_RenderSystem.SwapBuffers(); + } - common::SetDrawTextHandler(SetTextWriterCore); - common::DrawResFont(NN_GX_DISPLAY0); - s_RenderSystem.SwapBuffers(); - - s_RenderSystem.SetRenderTarget(NN_GX_DISPLAY1); - s_RenderSystem.Clear(); - s_RenderSystem.SwapBuffers(); nn::os::Thread::Sleep(nn::fnd::TimeSpan::FromMilliSeconds(10)); if ( nn::applet::IsExpectedToCloseApplication() )