trunk r393,410,411,413-415をマージ

git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_Repair@416 385bec56-5757-e545-9c3a-d8741f4650f1
This commit is contained in:
N2614 2011-08-02 08:22:02 +00:00
parent 8c6fb30493
commit 3c02065415
13 changed files with 880 additions and 24 deletions

View File

@ -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<CHECKER_STACK_SIZE> 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();
}
}

View File

@ -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_ */

View File

@ -20,6 +20,7 @@
#include "Exporter.h"
#include "SimplePlayer.h"
#include "CommonLogger.h"
#include "Checker.h"
#include <nn.h>
@ -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<std::stri
if (!error)
{
COMMON_LOGGER("Start Export Data\n");
COMMON_LOGGER("Checking SaveData\n");
s_BackupState = EXPORT_TWL_NAND;
s_BackupState = CHECK_SAVEDATA;
}
}
break;
case CHECK_SAVEDATA:
{
static bool init = true;
if (init)
{
StartSaveDataCheck();
init = false;
}
if (IsCheckSaveDataFinished())
{
FinalizeSaveDataCheck();
if (CheckSaveDataSucceeded())
{
COMMON_LOGGER("Start Export Data\n");
s_BackupState = EXPORT_TWL_NAND;
}
else
{
s_BackupState = FAIL;
}
}
}
break;
// TWLセーブデータ領域の吸出し中
case EXPORT_TWL_NAND:
{
@ -272,7 +301,7 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector<std::stri
{
COMMON_LOGGER("Export NAND Data Finished.\n");
if (GetProgress() > 99)
if (GetExportProgress() > 99)
{
s_BackupState = DELETE_NIM;
}
@ -374,6 +403,18 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector<std::stri
}
}
u32 GetProgress()
{
if(s_BackupState == CHECK_SAVEDATA)
{
return GetCheckSaveDataProgress();
}
else
{
return GetExportProgress();
}
}
bool InProgress()
{
return s_BackupState == EXPORT_CTR_NAND;

View File

@ -46,6 +46,9 @@ void OnSdEjected();
// 状態を初期化する
void InitializeState();
// 進捗を取得する
u32 GetProgress();
}
#endif /* CONTOROLLER_H_ */

View File

@ -899,6 +899,9 @@ bool ExportData(common::HardwareStateManager& manager)
{
nn::Result result;
// 電源断の履歴をptmに追加する
AddShutDownPtmEvent();
// リージョンデータをSDに書き込む
result = WriteRegionData();
COMMON_LOGGER_RETURN_FALSE_IF_FAILED(result);
@ -923,9 +926,6 @@ bool ExportData(common::HardwareStateManager& manager)
result = WriteIvs(manager);
COMMON_LOGGER_RETURN_FALSE_IF_FAILED(result);
// 電源断の履歴をptmに追加する
AddShutDownPtmEvent();
// RTCをSDに書き出す
result = WriteMcuRtcData(manager);
COMMON_LOGGER_RETURN_FALSE_IF_FAILED(result);
@ -951,7 +951,7 @@ bool ExportData(common::HardwareStateManager& manager)
return true;
}
u32 GetProgress()
u32 GetExportProgress()
{
return common::GetProgress();
}

View File

@ -43,7 +43,7 @@ bool ExportData(common::HardwareStateManager& manager);
bool DeleteNimSaveData();
// 出力スレッドの進捗を返す
u32 GetProgress();
u32 GetExportProgress();
// 出力スレッドが終了したかどうか
bool IsExportThreadFinished();

View File

@ -26,6 +26,8 @@ SOURCES[] =
ConsoleBackup.cpp
Controller.cpp
Exporter.cpp
Checker.cpp
SavedataChecker.cpp
../common/Util.cpp
../common/DrawSystemState.cpp
../common/FileTransfer.cpp

View File

@ -0,0 +1,418 @@
/*---------------------------------------------------------------------------*
Project: Horizon
File: NandSavedataChecker.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 <nn/fs/fs_ApiSysSaveData.h>
#include <nn/fs/fs_ApiSharedExtSaveData.h>
#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 */

View File

@ -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 <string>
#include <nn.h>
#include <nn/fs/fs_ParametersForSystem.h>
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_ */

View File

@ -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();

View File

@ -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();

View File

@ -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<std::string>::iterator it;
::std::vector<LogText>::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<std::string>::iterator it;
::std::vector<LogText>::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

View File

@ -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<std::string> m_Log;
::std::vector<LogText> 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;
};