diff --git a/trunk/ConsoleDataMigration/sources/ConsoleBackup/SavedataChecker.cpp b/trunk/ConsoleDataMigration/sources/ConsoleBackup/SavedataChecker.cpp index 0bb82bd..addd5e4 100644 --- a/trunk/ConsoleDataMigration/sources/ConsoleBackup/SavedataChecker.cpp +++ b/trunk/ConsoleDataMigration/sources/ConsoleBackup/SavedataChecker.cpp @@ -28,11 +28,17 @@ namespace } -SavedataCheckerBase::SavedataCheckerBase(void* buf, size_t size) : m_Buf(buf), m_Bufsize(size) +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 = %d\n", m_TotalReadSize); +} + nn::Result SavedataCheckerBase::CleanUpFilesRecursively(bool* modified, std::wstring currentDirectory) { nn::fs::Directory dir; @@ -102,6 +108,7 @@ nn::Result SavedataCheckerBase::CleanUpFilesRecursively(bool* modified, std::wst { s32 readSize; result = file.TryRead(&readSize, m_Buf, m_Bufsize); + m_TotalReadSize += readSize; if(result.IsFailure()) { nn::dbg::PrintResult(result); @@ -125,6 +132,83 @@ nn::Result SavedataCheckerBase::CleanUpFilesRecursively(bool* modified, std::wst return nn::ResultSuccess(); } +nn::Result SavedataCheckerBase::GetFileSize(std::wstring currentDirectory) +{ + nn::fs::Directory dir; + nn::fs::DirectoryEntry entry; + nn::Result result; + + COMMON_LOGGER("%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(); + + COMMON_LOGGER("%s\n", common::GetCharStr(path)); + + result = file.TryInitialize(path); + if(result.IsFailure()) + { + continue; + } + + m_CalculatedFileSize += file.GetSize(); + } + } + + return nn::ResultSuccess(); +} + +nn::Result SavedataCheckerBase::GetProgress(s32* progress) +{ + if(m_CalculatedFileSize != 0) + { + *progress = m_TotalReadSize * 100 / m_CalculatedFileSize; + } + else + { + *progress = 0; + } + + return nn::ResultSuccess(); +} + + + NandSavedataChecker::NandSavedataChecker() { // TODO 自動生成されたコンストラクター・スタブ @@ -144,14 +228,19 @@ NandSavedataChecker::~NandSavedataChecker() nn::Result NandSavedataChecker::CleanUp() { nn::Result result; + { SharedExtSavedataChecker sharedExtSaveChecker(m_Buf, m_Bufsize); + result = sharedExtSaveChecker.CalculateFileSize(); + NN_UTIL_RETURN_IF_FAILED(result); result = sharedExtSaveChecker.CleanUp(); NN_UTIL_RETURN_IF_FAILED(result); } { SystemSavedataChecker syssaveChecker(m_Buf, m_Bufsize); + result = syssaveChecker.CalculateFileSize(); + NN_UTIL_RETURN_IF_FAILED(result); result = syssaveChecker.CleanUp(); NN_UTIL_RETURN_IF_FAILED(result); } @@ -208,12 +297,32 @@ nn::Result SystemSavedataChecker::CleanUp() result = nn::fs::CommitSystemSaveData(SYSTEM_SAVEDATA_ARCHIVE_NAME); } - result = nn::fs::Unmount("ssave:"); + result = nn::fs::Unmount(SYSTEM_SAVEDATA_ARCHIVE_NAME); COMMON_LOGGER_RETURN_RESULT_IF_FAILED(result); } } + return result; +} +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 = %d\n", m_CalculatedFileSize); return result; } @@ -291,4 +400,33 @@ nn::Result SharedExtSavedataChecker::CleanUp() 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); + NN_UTIL_RETURN_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:/"); + NN_UTIL_RETURN_IF_FAILED(result); + + result = nn::fs::Unmount(SHARED_EXT_SAVEDATA_ARCHIVE_NAME); + NN_UTIL_RETURN_IF_FAILED(result); + } + } + + NN_LOG("CalculatedFileSize = %d\n", m_CalculatedFileSize); + return nn::ResultSuccess(); +} + } /* namespace ConsoleBackup */ diff --git a/trunk/ConsoleDataMigration/sources/ConsoleBackup/SavedataChecker.h b/trunk/ConsoleDataMigration/sources/ConsoleBackup/SavedataChecker.h index c4306ad..cabf723 100644 --- a/trunk/ConsoleDataMigration/sources/ConsoleBackup/SavedataChecker.h +++ b/trunk/ConsoleDataMigration/sources/ConsoleBackup/SavedataChecker.h @@ -119,17 +119,38 @@ class SavedataCheckerBase public: SavedataCheckerBase() {} SavedataCheckerBase(void* buf, size_t size); - ~SavedataCheckerBase() {} + ~SavedataCheckerBase(); + + virtual nn::Result CleanUp() = 0; + virtual nn::Result CalculateFileSize() = 0; 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); + + //! @brief 進捗を取得する + //! @param[out] progress 0~100で表される進捗 + nn::Result GetProgress(s32* progress); + //! バッファ void* m_Buf; //! バッファサイズ size_t m_Bufsize; + //! 事前読み取りサイズ + size_t m_CalculatedFileSize; + + //! 累計読み取りサイズ + size_t m_TotalReadSize; + }; @@ -142,7 +163,10 @@ public: ~SystemSavedataChecker(); //! @brief システムセーブデータを調べて問題があるファイルを削除する - nn::Result CleanUp(); + virtual nn::Result CleanUp(); + + //! @brief ファイルサイズをチェックする + virtual nn::Result CalculateFileSize(); }; //! @brief 共有拡張セーブデータをチェックするためのクラス @@ -154,7 +178,10 @@ public: ~SharedExtSavedataChecker(); //! @brief 共有拡張セーブデータを調べて問題があるファイルを削除する - nn::Result CleanUp(); + virtual nn::Result CleanUp(); + + //! @brief ファイルサイズをチェックする + virtual nn::Result CalculateFileSize(); };