diff --git a/branches/work/RW_Aging/sources/ConsoleBackup/Checker.cpp b/branches/work/RW_Aging/sources/ConsoleBackup/Checker.cpp new file mode 100644 index 0000000..b28a0ff --- /dev/null +++ b/branches/work/RW_Aging/sources/ConsoleBackup/Checker.cpp @@ -0,0 +1,93 @@ +/*---------------------------------------------------------------------------* + Project: Horizon + File: Checker.cpp + + Copyright 2009 Nintendo. All rights reserved. + + These coded instructions, statements, and computer programs contain + proprietary information of Nintendo of America Inc. and/or Nintendo + Company Ltd., and are protected by Federal copyright law. They may + not be disclosed to third parties or copied or duplicated in any form, + in whole or in part, without the prior written consent of Nintendo. + + $Rev$ + *---------------------------------------------------------------------------*/ + + +#include "CommonLogger.h" +#include "HeapManager.h" +#include "SaveDataChecker.h" + +namespace ConsoleBackup +{ + +namespace +{ + +const size_t CHECKER_STACK_SIZE = 0x1000; +nn::os::Thread s_CheckerThread; +nn::os::StackBuffer s_CheckerThreadStackSize; +nn::Result s_CheckerResult; +NandSavedataChecker* s_pChecker; + +} + +s32 GetCheckSaveDataProgress() +{ + if(s_pChecker != NULL) + { + return s_pChecker->GetProgress(); + } + else + { + return 0; + } + +} + +void CheckSaveDataThreadFunc() +{ + size_t bufSize = common::GetAllocatableSize(); + common::HeapManager heap(bufSize); + if (heap.GetAddr() != NULL) + { + s_pChecker = new NandSavedataChecker(heap.GetAddr(), bufSize); + s_CheckerResult = s_pChecker->CleanUp(); + } + else + { + s_CheckerResult = nn::Result(nn::Result::LEVEL_FATAL, nn::Result::SUMMARY_OUT_OF_RESOURCE, + nn::Result::MODULE_COMMON, nn::Result::DESCRIPTION_OUT_OF_MEMORY); + + } +} + +void StartSaveDataCheck() +{ + s_CheckerThread.Start(CheckSaveDataThreadFunc, s_CheckerThreadStackSize); +} + +bool IsCheckSaveDataFinished() +{ + return s_CheckerThread.IsValid() && !s_CheckerThread.IsAlive(); +} + +void FinalizeSaveDataCheck() +{ + s_CheckerThread.Join(); + s_CheckerThread.Finalize(); + + if(s_pChecker != NULL) + { + delete s_pChecker; + } +} + +bool CheckSaveDataSucceeded() +{ + COMMON_LOGGER_RETURN_FALSE_IF_FAILED(s_CheckerResult); + return s_CheckerResult.IsSuccess(); +} + +} + diff --git a/branches/work/RW_Aging/sources/ConsoleBackup/Checker.h b/branches/work/RW_Aging/sources/ConsoleBackup/Checker.h new file mode 100644 index 0000000..8f933df --- /dev/null +++ b/branches/work/RW_Aging/sources/ConsoleBackup/Checker.h @@ -0,0 +1,30 @@ +/*---------------------------------------------------------------------------* + Project: Horizon + File: Checker.h + + Copyright 2009 Nintendo. All rights reserved. + + These coded instructions, statements, and computer programs contain + proprietary information of Nintendo of America Inc. and/or Nintendo + Company Ltd., and are protected by Federal copyright law. They may + not be disclosed to third parties or copied or duplicated in any form, + in whole or in part, without the prior written consent of Nintendo. + + $Rev$ + *---------------------------------------------------------------------------*/ + +#ifndef CHECKER_H_ +#define CHECKER_H_ + +namespace ConsoleBackup +{ + +s32 GetCheckSaveDataProgress(); +void StartSaveDataCheck(); +bool IsCheckSaveDataFinished(); +void FinalizeSaveDataCheck(); +bool CheckSaveDataSucceeded(); + +} + +#endif /* CHECKER_H_ */ diff --git a/branches/work/RW_Aging/sources/ConsoleBackup/Controller.cpp b/branches/work/RW_Aging/sources/ConsoleBackup/Controller.cpp index 93bd919..880a0b8 100644 --- a/branches/work/RW_Aging/sources/ConsoleBackup/Controller.cpp +++ b/branches/work/RW_Aging/sources/ConsoleBackup/Controller.cpp @@ -20,6 +20,7 @@ #include "Exporter.h" #include "SimplePlayer.h" #include "CommonLogger.h" +#include "Checker.h" #include @@ -32,6 +33,7 @@ namespace typedef enum BackupState { STARTUP, // 初期値 + CHECK_SAVEDATA, // セーブデータの確認 EXPORT_TWL_NAND, // TWLセーブデータ領域の吸出し中 EXPORT_TWL_SOUND, // TWLサウンド領域の吸出し中 EXPORT_TWL_PHOTO, // TWL写真領域の吸出し中 @@ -148,14 +150,41 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector 99) + if (GetExportProgress() > 99) { s_BackupState = DELETE_NIM; } @@ -374,6 +403,18 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector +#include + +#include "SavedataChecker.h" +#include "CommonLogger.h" +#include "FileTransfer.h" + +namespace ConsoleBackup +{ + +namespace +{ + +} + +SavedataCheckerBase::SavedataCheckerBase(void* buf, size_t size) : + m_Buf(buf), m_Bufsize(size), m_CalculatedFileSize(0), m_TotalReadSize(0) +{ + +} + +SavedataCheckerBase::~SavedataCheckerBase() +{ + NN_LOG("m_TotalReadSize = %lld\n", m_TotalReadSize); +} + +nn::Result SavedataCheckerBase::CleanUpFilesRecursively(bool* modified, std::wstring currentDirectory) +{ + nn::fs::Directory dir; + nn::fs::DirectoryEntry entry; + nn::Result result; + + NN_LOG("%s\n", common::GetCharStr(currentDirectory.c_str())); + 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; + return result; + } + + for (;;) + { + s32 numRead; + result = dir.TryRead(&numRead, &entry, 1); + 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; + continue; + } + + + if(numRead == 0) + { + break; + } + + if (std::wcscmp(entry.entryName, L".") == 0 || std::wcscmp(entry.entryName, L"..") == 0) + { + continue; + } + + + // ディレクトリの場合 + if (entry.attributes.isDirectory) + { + return CleanUpFilesRecursively(modified, currentDirectory + std::wstring(entry.entryName) + std::wstring(L"/")); + } + // ファイルの場合 + else + { + nn::fs::FileInputStream file; + std::wstring filePath = (currentDirectory + std::wstring(entry.entryName)).c_str(); + const wchar_t* path = filePath.c_str(); + + result = file.TryInitialize(path); + 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; + continue; + } + + for (;;) + { + s32 readSize; + result = file.TryRead(&readSize, m_Buf, m_Bufsize); + if(result.IsFailure()) + { + nn::dbg::PrintResult(result); + COMMON_LOGGER_WARN("Cannot read %s, delete.\n", common::GetCharStr(entry.entryName)); + m_TotalReadSize += file.GetSize(); + file.Finalize(); + result = nn::fs::TryDeleteFile(path); + COMMON_LOGGER_RESULT_IF_FAILED(result); + *modified = true; + break; + } + else + { + m_TotalReadSize += readSize; + } + + if(readSize == 0) + { + break; + } + } + } + } + + return nn::ResultSuccess(); +} + +nn::Result SavedataCheckerBase::GetFileSize(std::wstring currentDirectory) +{ + nn::fs::Directory dir; + nn::fs::DirectoryEntry entry; + nn::Result result; + + NN_LOG("%s\n", common::GetCharStr(currentDirectory.c_str())); + result = dir.TryInitialize(currentDirectory.c_str()); + if(result.IsFailure()) + { + return result; + } + + for (;;) + { + s32 numRead; + result = dir.TryRead(&numRead, &entry, 1); + if(result.IsFailure()) + { + continue; + } + + + if(numRead == 0) + { + break; + } + + if (std::wcscmp(entry.entryName, L".") == 0 || std::wcscmp(entry.entryName, L"..") == 0) + { + continue; + } + + + // ディレクトリの場合 + if (entry.attributes.isDirectory) + { + return GetFileSize(currentDirectory + std::wstring(entry.entryName) + std::wstring(L"/")); + } + // ファイルの場合 + else + { + nn::fs::FileInputStream file; + std::wstring filePath = (currentDirectory + std::wstring(entry.entryName)).c_str(); + const wchar_t* path = filePath.c_str(); + + result = file.TryInitialize(path); + if(result.IsFailure()) + { + continue; + } + + m_CalculatedFileSize += file.GetSize(); + } + } + + return nn::ResultSuccess(); +} + +s64 SavedataCheckerBase::GetCalculatedSize() +{ + return m_CalculatedFileSize; +} + +s64 SavedataCheckerBase::GetTotalReadSize() +{ + return m_TotalReadSize; +} + + +NandSavedataChecker::NandSavedataChecker() +{ + // TODO 自動生成されたコンストラクター・スタブ + +} + +NandSavedataChecker::NandSavedataChecker(void* buf, size_t size) : m_Buf(buf), m_Bufsize(size) +{ + m_pSharedExtSaveChecker = new SharedExtSavedataChecker(buf, size); + m_pSysSaveChecker = new SystemSavedataChecker(buf, size); +} + +NandSavedataChecker::~NandSavedataChecker() +{ + delete m_pSharedExtSaveChecker; + delete m_pSysSaveChecker; +} + +nn::Result NandSavedataChecker::CleanUp() +{ + nn::Result result; + + m_pSharedExtSaveChecker->CalculateFileSize(); + m_pSysSaveChecker->CalculateFileSize(); + + result = m_pSharedExtSaveChecker->CleanUp(); + COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result); + + result = m_pSysSaveChecker->CleanUp(); + COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result); + + return nn::ResultSuccess(); +} + +s64 NandSavedataChecker::GetProgress() +{ + if (m_pSharedExtSaveChecker->GetCalculatedSize() == 0 || m_pSysSaveChecker->GetCalculatedSize() == 0) + { + return 0; + } + else + { + return (m_pSharedExtSaveChecker->GetTotalReadSize() + m_pSysSaveChecker->GetTotalReadSize()) * 100 + / (m_pSharedExtSaveChecker->GetCalculatedSize() + m_pSysSaveChecker->GetCalculatedSize()); + } +} + +SystemSavedataChecker::SystemSavedataChecker() +{ + +} + +SystemSavedataChecker::SystemSavedataChecker(void* buf, size_t size) : SavedataCheckerBase(buf, size) +{ +} + + +SystemSavedataChecker::~SystemSavedataChecker() +{ +} + + + +nn::Result SystemSavedataChecker::CleanUp() +{ + nn::Result result; + + bool modified = false; + std::wstring currentDirectory; + for (s32 i = 0; i < SYSTEM_SAVE_DATA_NUM; i++) + { + result = nn::fs::MountSystemSaveData(SYSTEM_SAVEDATA_ARCHIVE_NAME, SYSTEM_SAVEDATA_COUPLE_LIST[i].id ); + if (result.IsFailure()) + { + 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); + } + } + else + { + NN_LOG("Mount %ls\n", SYSTEM_SAVEDATA_COUPLE_LIST[i].name.c_str()); + // ファイルを個別にチェックする + result = CleanUpFilesRecursively(&modified, L"ssave:/"); + COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result); + + if(modified) + { + result = nn::fs::CommitSystemSaveData(SYSTEM_SAVEDATA_ARCHIVE_NAME); + } + + result = nn::fs::Unmount(SYSTEM_SAVEDATA_ARCHIVE_NAME); + COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result); + } + } + + return nn::ResultSuccess(); +} + +nn::Result SystemSavedataChecker::CalculateFileSize() +{ + nn::Result result; + + for (s32 i = 0; i < SYSTEM_SAVE_DATA_NUM; i++) + { + result = nn::fs::MountSystemSaveData(SYSTEM_SAVEDATA_ARCHIVE_NAME, SYSTEM_SAVEDATA_COUPLE_LIST[i].id ); + if (result.IsSuccess()) + { + result = GetFileSize(L"ssave:/"); + COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result); + + result = nn::fs::Unmount(SYSTEM_SAVEDATA_ARCHIVE_NAME); + COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result); + } + } + + NN_LOG("CalculatedFileSize = %lld\n", m_CalculatedFileSize); + return result; +} + +SharedExtSavedataChecker::SharedExtSavedataChecker() +{ +} + +SharedExtSavedataChecker::SharedExtSavedataChecker(void* buf, size_t size) : SavedataCheckerBase(buf, size) +{ +} + + + +SharedExtSavedataChecker::~SharedExtSavedataChecker() +{ + +} + +nn::Result SharedExtSavedataChecker::CleanUp() +{ + nn::Result result; + + const size_t ARRAY_SIZE = 256; + s32 numId; + bit32 IdArray[ARRAY_SIZE]; + + result = nn::fs::EnumerateSharedExtSaveData(&numId, IdArray, ARRAY_SIZE); + COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result); + + NN_LOG_DEBUG("ExtData num = %d\n", numId); + bool modified = false; + for (s32 i = 0; i < numId; i++ ) + { + if (nn::fs::MountSharedExtSaveData(SHARED_EXT_SAVEDATA_ARCHIVE_NAME, IdArray[i]).IsSuccess()) + { + NN_LOG("Mount %x\n", IdArray[i]); + + // アーカイブ内のファイル・ディレクトリをチェックする + result = CleanUpFilesRecursively(&modified, L"shext:/"); + COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result); + + result = nn::fs::Unmount(SHARED_EXT_SAVEDATA_ARCHIVE_NAME); + COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result); + } + else + { + // アーカイブごと削除する + if(result <= nn::fs::ResultVerificationFailed()) + { + 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); + } + } + } + + return nn::ResultSuccess(); +} + +nn::Result SharedExtSavedataChecker::CalculateFileSize() +{ + nn::Result result; + + const size_t ARRAY_SIZE = 256; + s32 numId; + bit32 IdArray[ARRAY_SIZE]; + + result = nn::fs::EnumerateSharedExtSaveData(&numId, IdArray, ARRAY_SIZE); + COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result); + + NN_LOG_DEBUG("ExtData num = %d\n", numId); + for (s32 i = 0; i < numId; i++ ) + { + result = nn::fs::MountSharedExtSaveData(SHARED_EXT_SAVEDATA_ARCHIVE_NAME, IdArray[i]); + if (result.IsSuccess()) + { + result = GetFileSize(L"shext:/"); + COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result); + + result = nn::fs::Unmount(SHARED_EXT_SAVEDATA_ARCHIVE_NAME); + COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result); + } + } + + NN_LOG("CalculatedFileSize = %lld\n", m_CalculatedFileSize); + return nn::ResultSuccess(); +} + +} /* namespace ConsoleBackup */ diff --git a/branches/work/RW_Aging/sources/ConsoleBackup/SavedataChecker.h b/branches/work/RW_Aging/sources/ConsoleBackup/SavedataChecker.h new file mode 100644 index 0000000..62d93a2 --- /dev/null +++ b/branches/work/RW_Aging/sources/ConsoleBackup/SavedataChecker.h @@ -0,0 +1,214 @@ +/*---------------------------------------------------------------------------* + Project: Horizon + File: NandSavedataChecker.h + + Copyright 2009 Nintendo. All rights reserved. + + These coded instructions, statements, and computer programs contain + proprietary information of Nintendo of America Inc. and/or Nintendo + Company Ltd., and are protected by Federal copyright law. They may + not be disclosed to third parties or copied or duplicated in any form, + in whole or in part, without the prior written consent of Nintendo. + + $Rev$ + *---------------------------------------------------------------------------*/ + +#ifndef SAVEDATACHECKER_H_ +#define SAVEDATACHECKER_H_ + +#include + +#include +#include + +namespace ConsoleBackup +{ + +struct SystemSaveDataCouple +{ + std::wstring name; + nn::fs::SystemSaveDataId id; +}; + +const SystemSaveDataCouple SYSTEM_SAVEDATA_COUPLE_LIST[] = +{ + { L"fill_data", 0x00010000 }, + { L"cfg", 0x00010017 }, + { L"ptm", 0x00010022 }, + { L"cecd", 0x00010026 }, + { L"nim", 0x0001002C }, + { L"friends", 0x00010032 }, + { L"boss", 0x00010034 }, + { L"news", 0x00010035 }, + + { L"PLOG_JP", 0x00020202 }, + { L"PLOG_US", 0x00020212 }, + { L"PLOG_EU", 0x00020222 }, + + { L"EDIT_JP", 0x00020207 }, + { L"EDIT_US", 0x00020217 }, + { L"EDIT_EU", 0x00020227 }, + + { L"PNOTE_JP", 0x00020204 }, + { L"PNOTE_US", 0x00020214 }, + { L"PNOTE_EU", 0x00020224 }, + + { L"SNOTE_JP", 0x00020205 }, + { L"SNOTE_US", 0x00020215 }, + { L"SNOTE_EU", 0x00020225 }, + + { L"TIGER_JP", 0x00020209 }, + { L"TIGER_US", 0x00020219 }, + { L"TIGER_EU", 0x00020229 }, + + { L"MARS_JP", 0x0002020b }, + { L"MARS_US", 0x0002021b }, + { L"MARS_EU", 0x0002022b }, + + { L"CARDBOARD_JP", 0x0002020a }, + { L"CARDBOARD_US", 0x0002021a }, + { L"CARDBOARD_EU", 0x0002022a }, + + { L"FRUIT_JP", 0x0002020c }, + { L"FRUIT_US", 0x0002021c }, + { L"FRUIT_EU", 0x0002022c }, + + { L"MEET_JP", 0x00020208 }, + { L"MEET_US", 0x00020218 }, + { L"MEET_EU", 0x00020228 }, + + { L"CPLAY_HAL_JP", 0x0002020d }, + { L"CPLAY_HAL_US", 0x0002021d }, + { L"CPLAY_HAL_EU", 0x0002022d }, + + { L"CPLAY_NCL_JP", 0x0002020e }, + { L"CPLAY_NCL_US", 0x0002021e }, + { L"CPLAY_NCL_EU", 0x0002022e }, + + { L"MMEN_JP", 0x00020081 }, + { L"MMEN_US", 0x0002008f }, + { L"MMEN_EU", 0x00020098 }, + + { L"friend_JP", 0x0002008d }, + { L"friend_US", 0x00020096 }, + { L"friend_EU", 0x0002009f }, + + { L"SPIDER_JP", 0x00020088 }, + { L"SPIDER_US", 0x0002009d }, + { L"SPIDER_EU", 0x00020094 }, + + { L"EBIRD_JP", 0x00020086 }, + { L"EBIRD_US", 0x00020092 }, + { L"EBIRD_EU", 0x0002009b }, + + { L"CHERRY_JP", 0x00020087 }, + { L"CHERRY_US", 0x00020093 }, + { L"CHERRY_EU", 0x0002009c }, + + { L"error", 0x000200c5 } + +}; + +const char* const SYSTEM_SAVEDATA_ARCHIVE_NAME = "ssave:"; +const char* const SHARED_EXT_SAVEDATA_ARCHIVE_NAME = "shext:"; + +const size_t SYSTEM_SAVE_DATA_NUM = sizeof(SYSTEM_SAVEDATA_COUPLE_LIST)/sizeof(SYSTEM_SAVEDATA_COUPLE_LIST[0]); + +class SavedataCheckerBase +{ +public: + SavedataCheckerBase() {} + SavedataCheckerBase(void* buf, size_t size); + ~SavedataCheckerBase(); + + virtual nn::Result CleanUp() = 0; + virtual nn::Result CalculateFileSize() = 0; + + //! @return 事前に計算したサイズ + s64 GetCalculatedSize(); + + //! @return 読み取ったサイズ + s64 GetTotalReadSize(); + +protected: + //! @brief ファイルとディレクトリを再帰的にチェックする。エラーがあれば削除する + //! @param[out] modified ファイルかディレクトリを削除したかどうか + //! @param[in] currentDirectory チェックを開始するディレクトリ。スラッシュで終端すること。 + nn::Result CleanUpFilesRecursively(bool* modified, std::wstring currentDirectory); + + //! @brief ファイルサイズを取得する + //! @param[out] size ファイルサイズ + //! @param[in] currentDirectory チェックを開始するディレクトリ。スラッシュで終端すること。 + nn::Result GetFileSize(std::wstring currentDirectory); + //! バッファ + void* m_Buf; + + //! バッファサイズ + size_t m_Bufsize; + + NN_PADDING4; + + //! 事前読み取りサイズ + s64 m_CalculatedFileSize; + + //! 累計読み取りサイズ + s64 m_TotalReadSize; + +}; + + +//! @brief システムセーブデータをチェックするためのクラス +class SystemSavedataChecker : public SavedataCheckerBase +{ +public: + SystemSavedataChecker(); + SystemSavedataChecker(void* buf, size_t size); + ~SystemSavedataChecker(); + + //! @brief システムセーブデータを調べて問題があるファイルを削除する + virtual nn::Result CleanUp(); + + //! @brief ファイルサイズをチェックする + virtual nn::Result CalculateFileSize(); +}; + +//! @brief 共有拡張セーブデータをチェックするためのクラス +class SharedExtSavedataChecker : public SavedataCheckerBase +{ +public: + SharedExtSavedataChecker(); + SharedExtSavedataChecker(void* buf, size_t size); + ~SharedExtSavedataChecker(); + + //! @brief 共有拡張セーブデータを調べて問題があるファイルを削除する + virtual nn::Result CleanUp(); + + //! @brief ファイルサイズをチェックする + virtual nn::Result CalculateFileSize(); +}; + + +class NandSavedataChecker +{ +public: + NandSavedataChecker(); + NandSavedataChecker(void* buf, size_t size); + ~NandSavedataChecker(); + + nn::Result CleanUp(); + + s64 GetProgress(); + +private: + SharedExtSavedataChecker* m_pSharedExtSaveChecker; + SystemSavedataChecker* m_pSysSaveChecker; + + //! バッファ + void* m_Buf; + + //! バッファサイズ + size_t m_Bufsize; +}; + +} /* namespace ConsoleBackup */ +#endif /* SAVEDATACHECKER_H_ */ diff --git a/branches/work/RW_Aging/sources/common/CommonLogger.cpp b/branches/work/RW_Aging/sources/common/CommonLogger.cpp index 373230e..998e49b 100644 --- a/branches/work/RW_Aging/sources/common/CommonLogger.cpp +++ b/branches/work/RW_Aging/sources/common/CommonLogger.cpp @@ -82,6 +82,11 @@ void CommonLogger::ClearSdLog() GetSdInstance()->Clear(); } +void CommonLogger::SetTextColor(f32 red, f32 green, f32 blue, f32 alpha) +{ + GetConsoleInstance()->SetTextColor(red, green, blue, alpha); +} + void CommonLogger::ScrollUp() { GetConsoleInstance()->ScrollUp(); diff --git a/branches/work/RW_Aging/sources/common/CommonLogger.h b/branches/work/RW_Aging/sources/common/CommonLogger.h index 4c0ae93..9e48c27 100644 --- a/branches/work/RW_Aging/sources/common/CommonLogger.h +++ b/branches/work/RW_Aging/sources/common/CommonLogger.h @@ -22,6 +22,18 @@ #include "SdLogger.h" #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()->Print(__VA_ARGS__); \ + (void)common::Logger::GetLoggerInstance()->SetTextColor(1.0f, 1.0f, 1.f, 1.f); \ + +#define COMMON_LOGGER_ERROR( ... ) \ + (void)common::Logger::GetLoggerInstance()->SetTextColor(1.0f, 0.2f, 0.2f, 1.f); \ + (void)common::Logger::GetLoggerInstance()->Print(__VA_ARGS__); \ + (void)common::Logger::GetLoggerInstance()->SetTextColor(1.0f, 1.0f, 1.f, 1.f); \ + + #define COMMON_LOGGER_RESULT(result, func) \ NN_DBG_PRINT_RESULT(result); \ (void)common::Logger::GetLoggerInstance()->PrintResultSdLog("Func = %s\n", func); \ @@ -122,6 +134,9 @@ public: // SDカードのログファイルを消去する void ClearSdLog(); + // 下画面ログのフォントカラーを設定する + void SetTextColor(f32 red, f32 green, f32 blue, f32 alpha); + // 下画面ログを上スクロールする void ScrollUp(); diff --git a/branches/work/RW_Aging/sources/common/LogConsole.cpp b/branches/work/RW_Aging/sources/common/LogConsole.cpp index 0af3ee8..7ddd16e 100644 --- a/branches/work/RW_Aging/sources/common/LogConsole.cpp +++ b/branches/work/RW_Aging/sources/common/LogConsole.cpp @@ -44,9 +44,13 @@ void LogConsole::Initialize(u32 width, u32 height, u32 maxLine, demo::RenderSyst m_Width = width; m_Height = height; m_MaxLine = maxLine; - m_RenderSystem = renderSystem; + m_pRenderSystem = renderSystem; m_CurrentViewLine = 0; m_LineNum = 0; + m_ColorRed = 1.0f; + m_ColorGreen = 1.0f; + m_ColorBlue = 1.0f; + m_ColorAlpha = 1.0f; } void LogConsole::AddText(const char* fmt, ::std::va_list arg) @@ -64,7 +68,7 @@ void LogConsole::AddText(const char* fmt, ::std::va_list arg) if(m_LineNum >= m_MaxLine) { // 満杯なので先頭を削除する - ::std::vector::iterator it; + ::std::vector::iterator it; it = m_Log.begin(); m_Log.erase(it); m_LineNum--; @@ -93,6 +97,14 @@ void LogConsole::AddText(const char* fmt, ::std::va_list arg) } } +void LogConsole::SetTextColor(f32 red, f32 green, f32 blue, f32 alpha) +{ + m_ColorRed = red; + m_ColorGreen = green; + m_ColorBlue = blue; + m_ColorAlpha = alpha; +} + void LogConsole::ScrollUp() { if(m_CurrentViewLine > 0) @@ -131,7 +143,7 @@ void LogConsole::ScrollToEnd() void LogConsole::Print() { - ::std::vector::iterator it; + ::std::vector::iterator it; it = m_Log.begin(); it += m_CurrentViewLine; @@ -139,7 +151,8 @@ void LogConsole::Print() u32 count = 0; for(; it != m_Log.end() && count < m_Height && count < m_MaxLine; it++) { - m_RenderSystem->DrawText(0, count++ * 10, "%s", it->c_str()); + m_pRenderSystem->SetColor(it->m_Red, it->m_Green, it->m_Blue, it->m_Alpha); + m_pRenderSystem->DrawText(0, count++ * 10, "%s", it->m_Text.c_str()); } if(m_LineNum > m_Height) @@ -151,22 +164,22 @@ void LogConsole::Print() void LogConsole::AddWrapedText(const char* str) { - m_Log.push_back(::std::string(str)); + m_Log.push_back(LogText(::std::string(str), m_ColorRed, m_ColorGreen, m_ColorBlue, m_ColorAlpha)); } void LogConsole::DrawScrollBar() { - m_RenderSystem->SetColor(0.4f, 0.4f, 0.4f); - m_RenderSystem->DrawLine((m_Width + 1) * FONT_WIDTH, 0, (m_Width + 2) * FONT_WIDTH - 1, 0); - m_RenderSystem->DrawLine((m_Width + 1)* FONT_WIDTH, 0, (m_Width + 1)* FONT_WIDTH, m_Height * FONT_HEIGHT); - m_RenderSystem->DrawLine((m_Width + 2) * FONT_WIDTH - 1, 0, (m_Width + 2) * FONT_WIDTH - 1, m_Height * FONT_HEIGHT); - m_RenderSystem->DrawLine((m_Width + 1)* FONT_WIDTH, m_Height * FONT_HEIGHT - 1, (m_Width + 2) * FONT_WIDTH - 1, m_Height * FONT_HEIGHT - 1); + m_pRenderSystem->SetColor(0.4f, 0.4f, 0.4f); + m_pRenderSystem->DrawLine((m_Width + 1) * FONT_WIDTH, 0, (m_Width + 2) * FONT_WIDTH - 1, 0); + m_pRenderSystem->DrawLine((m_Width + 1)* FONT_WIDTH, 0, (m_Width + 1)* FONT_WIDTH, m_Height * FONT_HEIGHT); + m_pRenderSystem->DrawLine((m_Width + 2) * FONT_WIDTH - 1, 0, (m_Width + 2) * FONT_WIDTH - 1, m_Height * FONT_HEIGHT); + m_pRenderSystem->DrawLine((m_Width + 1)* FONT_WIDTH, m_Height * FONT_HEIGHT - 1, (m_Width + 2) * FONT_WIDTH - 1, m_Height * FONT_HEIGHT - 1); u32 y = (m_Height * FONT_HEIGHT - 2) * m_CurrentViewLine / m_MaxLine; - m_RenderSystem->SetColor(0.7f, 0.7f, 0.7f); - m_RenderSystem->FillRectangle((m_Width + 1) * FONT_WIDTH, y + 1, FONT_WIDTH - 1, FONT_HEIGHT - 4); + m_pRenderSystem->SetColor(0.7f, 0.7f, 0.7f); + m_pRenderSystem->FillRectangle((m_Width + 1) * FONT_WIDTH, y + 1, FONT_WIDTH - 1, FONT_HEIGHT - 4); - m_RenderSystem->SetColor(1.f, 1.f, 1.f); + m_pRenderSystem->SetColor(1.f, 1.f, 1.f); } } //namespace ConsoleBackup diff --git a/branches/work/RW_Aging/sources/common/LogConsole.h b/branches/work/RW_Aging/sources/common/LogConsole.h index 9b120bc..1b2bbbe 100644 --- a/branches/work/RW_Aging/sources/common/LogConsole.h +++ b/branches/work/RW_Aging/sources/common/LogConsole.h @@ -24,6 +24,21 @@ namespace common { +struct LogText +{ + LogText(std::string text, f32 red, f32 green, f32 blue, f32 alpha) : + m_Text(text), m_Red(red), m_Green(green), m_Blue(blue), m_Alpha(alpha) + { + + } + + std::string m_Text; + f32 m_Red; + f32 m_Green; + f32 m_Blue; + f32 m_Alpha; +}; + //! @brief 画面にテキストコンソールを描画します class LogConsole { @@ -37,6 +52,9 @@ public: // コンソールに描画する文字列を追加する void AddText(const char* fmt, ::std::va_list arg); + // コンソールに描画する文字を変更する + void SetTextColor(f32 red, f32 green, f32 blue, f32 alpha); + // 上スクロールする void ScrollUp(); @@ -56,7 +74,7 @@ private: void AddWrapedText(const char* str); void DrawScrollBar(); - ::std::vector m_Log; + ::std::vector m_Log; //! @brief コンソールの列数 u32 m_Width; @@ -65,12 +83,16 @@ private: //! @brief コンソールのログの最大行数 u32 m_MaxLine; //! @brief 描画のためのRenderSystemDrawingへのポインタ - demo::RenderSystemDrawing* m_RenderSystem; + demo::RenderSystemDrawing* m_pRenderSystem; //! @brief 追加したログの行数 u32 m_LineNum; //! @brief 表示を開始するログの行数 u32 m_CurrentViewLine; - + //! @描画フォントの色 + f32 m_ColorRed; + f32 m_ColorGreen; + f32 m_ColorBlue; + f32 m_ColorAlpha; };