タイトルダウンロードが失敗した時に途中からやり直すように

git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_Repair@609 385bec56-5757-e545-9c3a-d8741f4650f1
This commit is contained in:
N2614 2012-01-26 07:25:34 +00:00
parent 14d6ed5209
commit 9b53c578c8
3 changed files with 24 additions and 9 deletions

View File

@ -39,6 +39,8 @@ bit8 s_buffer1[400 * 1024];
size_t s_ProgramIdNum = 0; size_t s_ProgramIdNum = 0;
// ダウンロードするタイトルのProgramIdの配列 // ダウンロードするタイトルのProgramIdの配列
nn::ProgramId s_ProgramIdList[256]; nn::ProgramId s_ProgramIdList[256];
// ダウンロード済みのタイトルの個数
size_t s_FinishedTitleNum = 0;
const size_t TITLE_DOWNLOADER_STACK_SIZE = 0x2000; const size_t TITLE_DOWNLOADER_STACK_SIZE = 0x2000;
nn::os::Thread s_TitleDownloaderThread; nn::os::Thread s_TitleDownloaderThread;
@ -132,17 +134,19 @@ void TwlTitleDownloaderThreadFunc()
s_Progress = 0; s_Progress = 0;
TitleDownloader::m_Result = ListUpTwlTitles(s_ProgramIdList, &s_ProgramIdNum); TitleDownloader::m_Result = ListUpTwlTitles(s_ProgramIdList, &s_ProgramIdNum);
COMMON_LOGGER_RETURN_VOID_IF_FAILED(TitleDownloader::m_Result); COMMON_LOGGER_RETURN_VOID_IF_FAILED(TitleDownloader::m_Result);
TwlTitleDownloader.SetupTitleList(s_ProgramIdList, s_ProgramIdNum); TwlTitleDownloader.SetupTitleList(s_ProgramIdList, s_ProgramIdNum, s_FinishedTitleNum);
TwlTitleDownloader.Start(); TwlTitleDownloader.Start();
s_FinishedTitleNum = TwlTitleDownloader.GetFinishedTitleNum();
} }
void PreinstallTitleDownloaderThreadFunc() void PreinstallTitleDownloaderThreadFunc()
{ {
TitleDownloader PreinstallTitleDownloader; TitleDownloader PreinstallTitleDownloader;
PreinstallImporter importer;
s_Progress = 0; s_Progress = 0;
PreinstallTitleDownloader.SetupTitleList(s_ProgramIdList, s_ProgramIdNum, s_FinishedTitleNum);
PreinstallTitleDownloader.Start(); PreinstallTitleDownloader.Start();
s_FinishedTitleNum = PreinstallTitleDownloader.GetFinishedTitleNum();
} }
void StartTwlTitleDownload() void StartTwlTitleDownload()
@ -159,7 +163,7 @@ void PreparePreinstallTitleDownloadThreadFunc(PreinstallListupParam param)
preinstallTitleDownloader.m_Result = importer.ListTitles(s_ProgramIdList, &s_ProgramIdNum, param.deviceId, param.serialNo); preinstallTitleDownloader.m_Result = importer.ListTitles(s_ProgramIdList, &s_ProgramIdNum, param.deviceId, param.serialNo);
COMMON_LOGGER_RETURN_VOID_IF_FAILED(preinstallTitleDownloader.m_Result); COMMON_LOGGER_RETURN_VOID_IF_FAILED(preinstallTitleDownloader.m_Result);
preinstallTitleDownloader.SetupTitleList(s_ProgramIdList, s_ProgramIdNum); preinstallTitleDownloader.SetupTitleList(s_ProgramIdList, s_ProgramIdNum, s_FinishedTitleNum);
s64 requiredSize; s64 requiredSize;
preinstallTitleDownloader.CalculateRequiredSize(&requiredSize); preinstallTitleDownloader.CalculateRequiredSize(&requiredSize);
@ -234,7 +238,7 @@ u32 GetTitleDownloadProgress()
} }
TitleDownloader::TitleDownloader() : m_TiteNum(0) TitleDownloader::TitleDownloader() : m_TiteNum(0), m_FinishedTitleNum(0)
{ {
for(u32 i = 0; i < IMPORTABLE_TITLE_MAX; i++) for(u32 i = 0; i < IMPORTABLE_TITLE_MAX; i++)
{ {
@ -338,7 +342,7 @@ void StartShopOperationSingleRetry(ShopOperation op, u32 retryCount)
void TitleDownloader::Start() void TitleDownloader::Start()
{ {
for(u8 i = 0; i < m_TiteNum; i++) for(u8 i = m_FinishedTitleNum; i < m_TiteNum; i++)
{ {
s_Progress = i * 100 / m_TiteNum; s_Progress = i * 100 / m_TiteNum;
StartShopOperationSingle(SHOP_OPERATION_CONNECT_WITHOUT_CLOSE); StartShopOperationSingle(SHOP_OPERATION_CONNECT_WITHOUT_CLOSE);
@ -355,10 +359,11 @@ void TitleDownloader::Start()
WaitShopOperationAndFinalize(); WaitShopOperationAndFinalize();
m_Result = GetShopOperationSingleResult(); m_Result = GetShopOperationSingleResult();
COMMON_LOGGER_RETURN_VOID_IF_FAILED(m_Result); COMMON_LOGGER_RETURN_VOID_IF_FAILED(m_Result);
m_FinishedTitleNum++;
} }
} }
void TitleDownloader::SetupTitleList(nn::ProgramId* list, size_t num) void TitleDownloader::SetupTitleList(nn::ProgramId* list, size_t num, u32 index)
{ {
const size_t listNum = nn::math::Min(num, IMPORTABLE_TITLE_MAX); const size_t listNum = nn::math::Min(num, IMPORTABLE_TITLE_MAX);
for(u32 i = 0; i < listNum; i++) for(u32 i = 0; i < listNum; i++)
@ -366,6 +371,7 @@ void TitleDownloader::SetupTitleList(nn::ProgramId* list, size_t num)
m_ProgramIdList[i] = list[i]; m_ProgramIdList[i] = list[i];
} }
m_TiteNum = listNum; m_TiteNum = listNum;
m_FinishedTitleNum = index;
} }
void TitleDownloader::CalculateRequiredSize(s64* requiredSize) void TitleDownloader::CalculateRequiredSize(s64* requiredSize)
@ -394,4 +400,9 @@ void TitleDownloader::CalculateRequiredSize(s64* requiredSize)
} }
} }
u32 TitleDownloader::GetFinishedTitleNum()
{
return m_FinishedTitleNum;
}
} }

View File

@ -69,11 +69,14 @@ public:
virtual ~TitleDownloader(); virtual ~TitleDownloader();
//! @brief タイトルリストを設定する //! @brief タイトルリストを設定する
void SetupTitleList(nn::ProgramId* list, size_t num); void SetupTitleList(nn::ProgramId* list, size_t num, u32 index);
//! @brief タイトルをダウンロードするのに必要なサイズを計算します //! @brief タイトルをダウンロードするのに必要なサイズを計算します
void CalculateRequiredSize(s64* requiredSize); void CalculateRequiredSize(s64* requiredSize);
//! @brief ダウンロードが完了したタイトルの数を取得します
u32 GetFinishedTitleNum();
// タイトルのダウンロードを開始する // タイトルのダウンロードを開始する
void Start(); void Start();
@ -86,6 +89,7 @@ private:
nn::ProgramID m_ProgramIdList[IMPORTABLE_TITLE_MAX]; nn::ProgramID m_ProgramIdList[IMPORTABLE_TITLE_MAX];
u32 m_TiteNum; u32 m_TiteNum;
u32 m_FinishedTitleNum;
}; };

View File

@ -111,7 +111,7 @@ void TitleDownloaderTest::ListUp()
nn::ProgramId list[256]; nn::ProgramId list[256];
ConsoleRestore::ListUpTwlTitles(list, &num); ConsoleRestore::ListUpTwlTitles(list, &num);
dl.SetupTitleList(list, num); dl.SetupTitleList(list, num, 0);
} }
void TitleDownloaderTest::DownloadPreinstall() void TitleDownloaderTest::DownloadPreinstall()
@ -157,7 +157,7 @@ void TitleDownloaderTest::CalculateRequiredSize()
do do
{ {
dl.SetupTitleList(id, sizeof(id) / sizeof(id[0])); dl.SetupTitleList(id, sizeof(id) / sizeof(id[0]), 0);
dl.CalculateRequiredSize(&requiredSize); dl.CalculateRequiredSize(&requiredSize);
}while(dl.m_Result.IsFailure()); }while(dl.m_Result.IsFailure());
NN_LOG("size = %llu\n", requiredSize); NN_LOG("size = %llu\n", requiredSize);