mirror of
https://github.com/rvtr/ctr_Repair.git
synced 2025-10-31 13:51:08 -04:00
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:
parent
8c6fb30493
commit
3c02065415
93
branches/work/RW_Aging/sources/ConsoleBackup/Checker.cpp
Normal file
93
branches/work/RW_Aging/sources/ConsoleBackup/Checker.cpp
Normal 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();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
30
branches/work/RW_Aging/sources/ConsoleBackup/Checker.h
Normal file
30
branches/work/RW_Aging/sources/ConsoleBackup/Checker.h
Normal 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_ */
|
||||||
@ -20,6 +20,7 @@
|
|||||||
#include "Exporter.h"
|
#include "Exporter.h"
|
||||||
#include "SimplePlayer.h"
|
#include "SimplePlayer.h"
|
||||||
#include "CommonLogger.h"
|
#include "CommonLogger.h"
|
||||||
|
#include "Checker.h"
|
||||||
|
|
||||||
#include <nn.h>
|
#include <nn.h>
|
||||||
|
|
||||||
@ -32,6 +33,7 @@ namespace
|
|||||||
typedef enum BackupState
|
typedef enum BackupState
|
||||||
{
|
{
|
||||||
STARTUP, // 初期値
|
STARTUP, // 初期値
|
||||||
|
CHECK_SAVEDATA, // セーブデータの確認
|
||||||
EXPORT_TWL_NAND, // TWLセーブデータ領域の吸出し中
|
EXPORT_TWL_NAND, // TWLセーブデータ領域の吸出し中
|
||||||
EXPORT_TWL_SOUND, // TWLサウンド領域の吸出し中
|
EXPORT_TWL_SOUND, // TWLサウンド領域の吸出し中
|
||||||
EXPORT_TWL_PHOTO, // TWL写真領域の吸出し中
|
EXPORT_TWL_PHOTO, // TWL写真領域の吸出し中
|
||||||
@ -148,14 +150,41 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector<std::stri
|
|||||||
|
|
||||||
if (!error)
|
if (!error)
|
||||||
{
|
{
|
||||||
COMMON_LOGGER("Start Export Data\n");
|
COMMON_LOGGER("Checking SaveData\n");
|
||||||
|
|
||||||
s_BackupState = EXPORT_TWL_NAND;
|
s_BackupState = CHECK_SAVEDATA;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
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セーブデータ領域の吸出し中
|
// TWLセーブデータ領域の吸出し中
|
||||||
case EXPORT_TWL_NAND:
|
case EXPORT_TWL_NAND:
|
||||||
{
|
{
|
||||||
@ -272,7 +301,7 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector<std::stri
|
|||||||
{
|
{
|
||||||
COMMON_LOGGER("Export NAND Data Finished.\n");
|
COMMON_LOGGER("Export NAND Data Finished.\n");
|
||||||
|
|
||||||
if (GetProgress() > 99)
|
if (GetExportProgress() > 99)
|
||||||
{
|
{
|
||||||
s_BackupState = DELETE_NIM;
|
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()
|
bool InProgress()
|
||||||
{
|
{
|
||||||
return s_BackupState == EXPORT_CTR_NAND;
|
return s_BackupState == EXPORT_CTR_NAND;
|
||||||
|
|||||||
@ -46,6 +46,9 @@ void OnSdEjected();
|
|||||||
// 状態を初期化する
|
// 状態を初期化する
|
||||||
void InitializeState();
|
void InitializeState();
|
||||||
|
|
||||||
|
// 進捗を取得する
|
||||||
|
u32 GetProgress();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* CONTOROLLER_H_ */
|
#endif /* CONTOROLLER_H_ */
|
||||||
|
|||||||
@ -899,6 +899,9 @@ bool ExportData(common::HardwareStateManager& manager)
|
|||||||
{
|
{
|
||||||
nn::Result result;
|
nn::Result result;
|
||||||
|
|
||||||
|
// 電源断の履歴をptmに追加する
|
||||||
|
AddShutDownPtmEvent();
|
||||||
|
|
||||||
// リージョンデータをSDに書き込む
|
// リージョンデータをSDに書き込む
|
||||||
result = WriteRegionData();
|
result = WriteRegionData();
|
||||||
COMMON_LOGGER_RETURN_FALSE_IF_FAILED(result);
|
COMMON_LOGGER_RETURN_FALSE_IF_FAILED(result);
|
||||||
@ -923,9 +926,6 @@ bool ExportData(common::HardwareStateManager& manager)
|
|||||||
result = WriteIvs(manager);
|
result = WriteIvs(manager);
|
||||||
COMMON_LOGGER_RETURN_FALSE_IF_FAILED(result);
|
COMMON_LOGGER_RETURN_FALSE_IF_FAILED(result);
|
||||||
|
|
||||||
// 電源断の履歴をptmに追加する
|
|
||||||
AddShutDownPtmEvent();
|
|
||||||
|
|
||||||
// RTCをSDに書き出す
|
// RTCをSDに書き出す
|
||||||
result = WriteMcuRtcData(manager);
|
result = WriteMcuRtcData(manager);
|
||||||
COMMON_LOGGER_RETURN_FALSE_IF_FAILED(result);
|
COMMON_LOGGER_RETURN_FALSE_IF_FAILED(result);
|
||||||
@ -951,7 +951,7 @@ bool ExportData(common::HardwareStateManager& manager)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 GetProgress()
|
u32 GetExportProgress()
|
||||||
{
|
{
|
||||||
return common::GetProgress();
|
return common::GetProgress();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -43,7 +43,7 @@ bool ExportData(common::HardwareStateManager& manager);
|
|||||||
bool DeleteNimSaveData();
|
bool DeleteNimSaveData();
|
||||||
|
|
||||||
// 出力スレッドの進捗を返す
|
// 出力スレッドの進捗を返す
|
||||||
u32 GetProgress();
|
u32 GetExportProgress();
|
||||||
|
|
||||||
// 出力スレッドが終了したかどうか
|
// 出力スレッドが終了したかどうか
|
||||||
bool IsExportThreadFinished();
|
bool IsExportThreadFinished();
|
||||||
|
|||||||
@ -26,6 +26,8 @@ SOURCES[] =
|
|||||||
ConsoleBackup.cpp
|
ConsoleBackup.cpp
|
||||||
Controller.cpp
|
Controller.cpp
|
||||||
Exporter.cpp
|
Exporter.cpp
|
||||||
|
Checker.cpp
|
||||||
|
SavedataChecker.cpp
|
||||||
../common/Util.cpp
|
../common/Util.cpp
|
||||||
../common/DrawSystemState.cpp
|
../common/DrawSystemState.cpp
|
||||||
../common/FileTransfer.cpp
|
../common/FileTransfer.cpp
|
||||||
|
|||||||
418
branches/work/RW_Aging/sources/ConsoleBackup/SavedataChecker.cpp
Normal file
418
branches/work/RW_Aging/sources/ConsoleBackup/SavedataChecker.cpp
Normal 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 */
|
||||||
214
branches/work/RW_Aging/sources/ConsoleBackup/SavedataChecker.h
Normal file
214
branches/work/RW_Aging/sources/ConsoleBackup/SavedataChecker.h
Normal 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_ */
|
||||||
@ -82,6 +82,11 @@ void CommonLogger::ClearSdLog()
|
|||||||
GetSdInstance()->Clear();
|
GetSdInstance()->Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CommonLogger::SetTextColor(f32 red, f32 green, f32 blue, f32 alpha)
|
||||||
|
{
|
||||||
|
GetConsoleInstance()->SetTextColor(red, green, blue, alpha);
|
||||||
|
}
|
||||||
|
|
||||||
void CommonLogger::ScrollUp()
|
void CommonLogger::ScrollUp()
|
||||||
{
|
{
|
||||||
GetConsoleInstance()->ScrollUp();
|
GetConsoleInstance()->ScrollUp();
|
||||||
|
|||||||
@ -22,6 +22,18 @@
|
|||||||
#include "SdLogger.h"
|
#include "SdLogger.h"
|
||||||
|
|
||||||
#define COMMON_LOGGER( ... ) (void)common::Logger::GetLoggerInstance()->Print(__VA_ARGS__)
|
#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) \
|
#define COMMON_LOGGER_RESULT(result, func) \
|
||||||
NN_DBG_PRINT_RESULT(result); \
|
NN_DBG_PRINT_RESULT(result); \
|
||||||
(void)common::Logger::GetLoggerInstance()->PrintResultSdLog("Func = %s\n", func); \
|
(void)common::Logger::GetLoggerInstance()->PrintResultSdLog("Func = %s\n", func); \
|
||||||
@ -122,6 +134,9 @@ public:
|
|||||||
// SDカードのログファイルを消去する
|
// SDカードのログファイルを消去する
|
||||||
void ClearSdLog();
|
void ClearSdLog();
|
||||||
|
|
||||||
|
// 下画面ログのフォントカラーを設定する
|
||||||
|
void SetTextColor(f32 red, f32 green, f32 blue, f32 alpha);
|
||||||
|
|
||||||
// 下画面ログを上スクロールする
|
// 下画面ログを上スクロールする
|
||||||
void ScrollUp();
|
void ScrollUp();
|
||||||
|
|
||||||
|
|||||||
@ -44,9 +44,13 @@ void LogConsole::Initialize(u32 width, u32 height, u32 maxLine, demo::RenderSyst
|
|||||||
m_Width = width;
|
m_Width = width;
|
||||||
m_Height = height;
|
m_Height = height;
|
||||||
m_MaxLine = maxLine;
|
m_MaxLine = maxLine;
|
||||||
m_RenderSystem = renderSystem;
|
m_pRenderSystem = renderSystem;
|
||||||
m_CurrentViewLine = 0;
|
m_CurrentViewLine = 0;
|
||||||
m_LineNum = 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)
|
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)
|
if(m_LineNum >= m_MaxLine)
|
||||||
{
|
{
|
||||||
// 満杯なので先頭を削除する
|
// 満杯なので先頭を削除する
|
||||||
::std::vector<std::string>::iterator it;
|
::std::vector<LogText>::iterator it;
|
||||||
it = m_Log.begin();
|
it = m_Log.begin();
|
||||||
m_Log.erase(it);
|
m_Log.erase(it);
|
||||||
m_LineNum--;
|
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()
|
void LogConsole::ScrollUp()
|
||||||
{
|
{
|
||||||
if(m_CurrentViewLine > 0)
|
if(m_CurrentViewLine > 0)
|
||||||
@ -131,7 +143,7 @@ void LogConsole::ScrollToEnd()
|
|||||||
|
|
||||||
void LogConsole::Print()
|
void LogConsole::Print()
|
||||||
{
|
{
|
||||||
::std::vector<std::string>::iterator it;
|
::std::vector<LogText>::iterator it;
|
||||||
|
|
||||||
it = m_Log.begin();
|
it = m_Log.begin();
|
||||||
it += m_CurrentViewLine;
|
it += m_CurrentViewLine;
|
||||||
@ -139,7 +151,8 @@ void LogConsole::Print()
|
|||||||
u32 count = 0;
|
u32 count = 0;
|
||||||
for(; it != m_Log.end() && count < m_Height && count < m_MaxLine; it++)
|
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)
|
if(m_LineNum > m_Height)
|
||||||
@ -151,22 +164,22 @@ void LogConsole::Print()
|
|||||||
|
|
||||||
void LogConsole::AddWrapedText(const char* str)
|
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()
|
void LogConsole::DrawScrollBar()
|
||||||
{
|
{
|
||||||
m_RenderSystem->SetColor(0.4f, 0.4f, 0.4f);
|
m_pRenderSystem->SetColor(0.4f, 0.4f, 0.4f);
|
||||||
m_RenderSystem->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 + 2) * FONT_WIDTH - 1, 0);
|
||||||
m_RenderSystem->DrawLine((m_Width + 1)* FONT_WIDTH, 0, (m_Width + 1)* FONT_WIDTH, m_Height * FONT_HEIGHT);
|
m_pRenderSystem->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_pRenderSystem->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->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;
|
u32 y = (m_Height * FONT_HEIGHT - 2) * m_CurrentViewLine / m_MaxLine;
|
||||||
m_RenderSystem->SetColor(0.7f, 0.7f, 0.7f);
|
m_pRenderSystem->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->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
|
} //namespace ConsoleBackup
|
||||||
|
|||||||
@ -24,6 +24,21 @@
|
|||||||
namespace common
|
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 画面にテキストコンソールを描画します
|
//! @brief 画面にテキストコンソールを描画します
|
||||||
class LogConsole
|
class LogConsole
|
||||||
{
|
{
|
||||||
@ -37,6 +52,9 @@ public:
|
|||||||
// コンソールに描画する文字列を追加する
|
// コンソールに描画する文字列を追加する
|
||||||
void AddText(const char* fmt, ::std::va_list arg);
|
void AddText(const char* fmt, ::std::va_list arg);
|
||||||
|
|
||||||
|
// コンソールに描画する文字を変更する
|
||||||
|
void SetTextColor(f32 red, f32 green, f32 blue, f32 alpha);
|
||||||
|
|
||||||
// 上スクロールする
|
// 上スクロールする
|
||||||
void ScrollUp();
|
void ScrollUp();
|
||||||
|
|
||||||
@ -56,7 +74,7 @@ private:
|
|||||||
void AddWrapedText(const char* str);
|
void AddWrapedText(const char* str);
|
||||||
void DrawScrollBar();
|
void DrawScrollBar();
|
||||||
|
|
||||||
::std::vector<std::string> m_Log;
|
::std::vector<LogText> m_Log;
|
||||||
|
|
||||||
//! @brief コンソールの列数
|
//! @brief コンソールの列数
|
||||||
u32 m_Width;
|
u32 m_Width;
|
||||||
@ -65,12 +83,16 @@ private:
|
|||||||
//! @brief コンソールのログの最大行数
|
//! @brief コンソールのログの最大行数
|
||||||
u32 m_MaxLine;
|
u32 m_MaxLine;
|
||||||
//! @brief 描画のためのRenderSystemDrawingへのポインタ
|
//! @brief 描画のためのRenderSystemDrawingへのポインタ
|
||||||
demo::RenderSystemDrawing* m_RenderSystem;
|
demo::RenderSystemDrawing* m_pRenderSystem;
|
||||||
//! @brief 追加したログの行数
|
//! @brief 追加したログの行数
|
||||||
u32 m_LineNum;
|
u32 m_LineNum;
|
||||||
//! @brief 表示を開始するログの行数
|
//! @brief 表示を開始するログの行数
|
||||||
u32 m_CurrentViewLine;
|
u32 m_CurrentViewLine;
|
||||||
|
//! @描画フォントの色
|
||||||
|
f32 m_ColorRed;
|
||||||
|
f32 m_ColorGreen;
|
||||||
|
f32 m_ColorBlue;
|
||||||
|
f32 m_ColorAlpha;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user