diff --git a/trunk/ConsoleDataMigration/sources/ConsoleBackup/Checker.cpp b/trunk/ConsoleDataMigration/sources/ConsoleBackup/Checker.cpp index a7c11b8..b28a0ff 100644 --- a/trunk/ConsoleDataMigration/sources/ConsoleBackup/Checker.cpp +++ b/trunk/ConsoleDataMigration/sources/ConsoleBackup/Checker.cpp @@ -21,20 +21,73 @@ namespace ConsoleBackup { -bool CheckSaveData() +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) + if (heap.GetAddr() != NULL) { - NandSavedataChecker checker(heap.GetAddr(), bufSize); - nn::Result result = checker.CleanUp(); - return result.IsSuccess(); + 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); - return false; + } +} + +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/trunk/ConsoleDataMigration/sources/ConsoleBackup/Checker.h b/trunk/ConsoleDataMigration/sources/ConsoleBackup/Checker.h index 102c4d2..8f933df 100644 --- a/trunk/ConsoleDataMigration/sources/ConsoleBackup/Checker.h +++ b/trunk/ConsoleDataMigration/sources/ConsoleBackup/Checker.h @@ -19,7 +19,11 @@ namespace ConsoleBackup { -bool CheckSaveData(); +s32 GetCheckSaveDataProgress(); +void StartSaveDataCheck(); +bool IsCheckSaveDataFinished(); +void FinalizeSaveDataCheck(); +bool CheckSaveDataSucceeded(); } diff --git a/trunk/ConsoleDataMigration/sources/ConsoleBackup/Controller.cpp b/trunk/ConsoleDataMigration/sources/ConsoleBackup/Controller.cpp index 9622df4..8a3e9a4 100644 --- a/trunk/ConsoleDataMigration/sources/ConsoleBackup/Controller.cpp +++ b/trunk/ConsoleDataMigration/sources/ConsoleBackup/Controller.cpp @@ -18,6 +18,7 @@ #include "Exporter.h" #include "SimplePlayer.h" #include "CommonLogger.h" +#include "Checker.h" #include @@ -30,6 +31,7 @@ namespace typedef enum BackupState { STARTUP, // 初期値 + CHECK_SAVEDATA, // セーブデータの確認 EXPORT_TWL_NAND, // TWLセーブデータ領域の吸出し中 EXPORT_TWL_SOUND, // TWLサウンド領域の吸出し中 EXPORT_TWL_PHOTO, // TWL写真領域の吸出し中 @@ -145,14 +147,41 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector 99) + if (GetExportProgress() > 99) { s_BackupState = DELETE_NIM; } @@ -342,6 +371,18 @@ void ControlState(common::HardwareStateManager& manager, ::std::vectorCalculateFileSize(); + m_pSysSaveChecker->CalculateFileSize(); - { - SystemSavedataChecker syssaveChecker(m_Buf, m_Bufsize); - result = syssaveChecker.CalculateFileSize(); - NN_UTIL_RETURN_IF_FAILED(result); - result = syssaveChecker.CleanUp(); - NN_UTIL_RETURN_IF_FAILED(result); - } + 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() { @@ -302,7 +303,7 @@ nn::Result SystemSavedataChecker::CleanUp() } } - return result; + return nn::ResultSuccess(); } nn::Result SystemSavedataChecker::CalculateFileSize() @@ -322,7 +323,7 @@ nn::Result SystemSavedataChecker::CalculateFileSize() } } - NN_LOG("CalculatedFileSize = %d\n", m_CalculatedFileSize); + NN_LOG("CalculatedFileSize = %lld\n", m_CalculatedFileSize); return result; } @@ -350,7 +351,7 @@ nn::Result SharedExtSavedataChecker::CleanUp() bit32 IdArray[ARRAY_SIZE]; result = nn::fs::EnumerateSharedExtSaveData(&numId, IdArray, ARRAY_SIZE); - NN_UTIL_RETURN_IF_FAILED(result); + COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result); NN_LOG_DEBUG("ExtData num = %d\n", numId); bool modified = false; @@ -359,28 +360,13 @@ nn::Result SharedExtSavedataChecker::CleanUp() if (nn::fs::MountSharedExtSaveData(SHARED_EXT_SAVEDATA_ARCHIVE_NAME, IdArray[i]).IsSuccess()) { NN_LOG("Mount %x\n", IdArray[i]); - s64 totalBlockSize; - s64 leftBlockSize; - s32 blockSize; - if (nn::fs::GetSharedExtSaveDataBlockSize(&totalBlockSize, &leftBlockSize, &blockSize, IdArray[i]).IsSuccess()) - { - // アーカイブ内のファイル・ディレクトリをチェックする - result = CleanUpFilesRecursively(&modified, L"shext:/"); - COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result); - result = nn::fs::Unmount(SHARED_EXT_SAVEDATA_ARCHIVE_NAME); - NN_UTIL_RETURN_IF_FAILED(result); - } - else - { - // アーカイブごと削除する - result = nn::fs::Unmount(SHARED_EXT_SAVEDATA_ARCHIVE_NAME); - NN_UTIL_RETURN_IF_FAILED(result); - - result = nn::fs::DeleteSharedExtSaveData(IdArray[i]); - COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result); - } + // アーカイブ内のファイル・ディレクトリをチェックする + 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 { @@ -409,7 +395,7 @@ nn::Result SharedExtSavedataChecker::CalculateFileSize() bit32 IdArray[ARRAY_SIZE]; result = nn::fs::EnumerateSharedExtSaveData(&numId, IdArray, ARRAY_SIZE); - NN_UTIL_RETURN_IF_FAILED(result); + COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result); NN_LOG_DEBUG("ExtData num = %d\n", numId); for (s32 i = 0; i < numId; i++ ) @@ -418,14 +404,14 @@ nn::Result SharedExtSavedataChecker::CalculateFileSize() if (result.IsSuccess()) { result = GetFileSize(L"shext:/"); - NN_UTIL_RETURN_IF_FAILED(result); + COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result); result = nn::fs::Unmount(SHARED_EXT_SAVEDATA_ARCHIVE_NAME); - NN_UTIL_RETURN_IF_FAILED(result); + COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result); } } - NN_LOG("CalculatedFileSize = %d\n", m_CalculatedFileSize); + NN_LOG("CalculatedFileSize = %lld\n", m_CalculatedFileSize); return nn::ResultSuccess(); } diff --git a/trunk/ConsoleDataMigration/sources/ConsoleBackup/SavedataChecker.h b/trunk/ConsoleDataMigration/sources/ConsoleBackup/SavedataChecker.h index cabf723..62d93a2 100644 --- a/trunk/ConsoleDataMigration/sources/ConsoleBackup/SavedataChecker.h +++ b/trunk/ConsoleDataMigration/sources/ConsoleBackup/SavedataChecker.h @@ -124,6 +124,12 @@ public: virtual nn::Result CleanUp() = 0; virtual nn::Result CalculateFileSize() = 0; + //! @return 事前に計算したサイズ + s64 GetCalculatedSize(); + + //! @return 読み取ったサイズ + s64 GetTotalReadSize(); + protected: //! @brief ファイルとディレクトリを再帰的にチェックする。エラーがあれば削除する //! @param[out] modified ファイルかディレクトリを削除したかどうか @@ -134,22 +140,19 @@ protected: //! @param[out] size ファイルサイズ //! @param[in] currentDirectory チェックを開始するディレクトリ。スラッシュで終端すること。 nn::Result GetFileSize(std::wstring currentDirectory); - - //! @brief 進捗を取得する - //! @param[out] progress 0~100で表される進捗 - nn::Result GetProgress(s32* progress); - //! バッファ void* m_Buf; //! バッファサイズ size_t m_Bufsize; + NN_PADDING4; + //! 事前読み取りサイズ - size_t m_CalculatedFileSize; + s64 m_CalculatedFileSize; //! 累計読み取りサイズ - size_t m_TotalReadSize; + s64 m_TotalReadSize; }; @@ -194,7 +197,12 @@ public: nn::Result CleanUp(); + s64 GetProgress(); + private: + SharedExtSavedataChecker* m_pSharedExtSaveChecker; + SystemSavedataChecker* m_pSysSaveChecker; + //! バッファ void* m_Buf;