チケット同期とIVS送信は1度に行う

ショップ接続してCloseしないモードの復活
acのResultチェックのためログ出力コードを挟む

git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_Repair@242 385bec56-5757-e545-9c3a-d8741f4650f1
This commit is contained in:
N2614 2011-04-28 12:13:19 +00:00
parent 6ff730a779
commit fd358bb8ba
5 changed files with 89 additions and 61 deletions

View File

@ -117,7 +117,6 @@ typedef enum RestoreState
DELETE_ACCOUNT, // ショップアカウントを削除する
DELETE_ACCOUNT_DONE, // ショップアカウント削除完了
SYNC_TICKET, // eTicketを同期する
UPLOAD_IVS, // IVSを送信する
READ_FILELIST, // ファイル一覧の読み込み
RESTORE_TWL_NAND, // TWL NANDの書き込み中
RESTORE_TWL_SOUND, // TWLサウンドの書き込み中
@ -538,6 +537,12 @@ void ShopOperationSingleTemplate(
{
ShopOperationSuccess(op, logMessage, nextState);
}
else if(GetShopOperationSingleResult() == nn::ac::ResultFailedConnectAp())
{
COMMON_LOGGER("Failed Connect AccesPoint.");
nn::os::Thread::Sleep(nn::fnd::TimeSpan::FromSeconds(5));
}
// IVSがアップロードされていない場合もあるため
// IVSを取得できない状況も成功として扱う
else if(op == SHOP_OPERATION_GET_IVS && GetShopOperationSingleResult() == nn::nim::ResultCannotGetIvs())
@ -1186,6 +1191,7 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector<std::stri
s_RestoreState = FAIL;
}
COMMON_LOGGER("Sync eTicket\n");
s_RestoreState = SYNC_TICKET;
}
break;
@ -1193,15 +1199,7 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector<std::stri
case SYNC_TICKET:
{
ShopOperationSingleTemplate(manager, operationMessage, SHOP_OPERATION_CONNECT, "Shop Connect",
"Shop Connect Finished.\n", "Shop Connect Failed. Retrying...", UPLOAD_IVS);
}
break;
// 本体更新が発生しない状況でNUPすることでIVSが送信される
// UPLOAD_IN_PROGRESSでのNUP実行後、サーバが更新されないという前提なので注意
case UPLOAD_IVS:
{
UpdateOperation(manager, operationMessage, DOWNLOAD_TWL);
"Shop Connect Finished.\n", "Shop Connect Failed. Retrying...", DOWNLOAD_TWL);
}
break;

View File

@ -47,7 +47,7 @@ namespace
nn::Result s_ShopResult = nn::ResultSuccess();
const size_t UNREGISTER_THREAD_STACK_SIZE = 0x1000;
nn::os::Thread s_UnregisterThread;
nn::os::Thread s_ShopOperationThread;
nn::os::StackBuffer<UNREGISTER_THREAD_STACK_SIZE> s_UnregisterThreadStack;
const size_t EC_BUFFER_SIZE = 128 * 1024;
@ -194,45 +194,52 @@ void PrintECAccountInfo(const ECAccountInfo& accountInfo)
nn::Result PrintNetworkSetting()
{
nn::Result result;
nn::ac::NetworkSetting networkSetting;
NN_UTIL_RETURN_IF_FAILED(nn::ac::LoadNetworkSetting(0, networkSetting));
result = nn::ac::LoadNetworkSetting(0, networkSetting);
COMMON_LOGGER("SSID: %s\n", networkSetting.wireless.essidSecurity.ssid);
COMMON_LOGGER("DNS : %d.%d.%d.%d\n",
networkSetting.ip.dns[0][0], networkSetting.ip.dns[0][1],
networkSetting.ip.dns[0][2], networkSetting.ip.dns[0][3]);
return nn::ResultSuccess();
return result;
}
nn::Result ConnectNetwork()
{
nn::Result result = nn::ResultSuccess();
nn::Result result;
nn::ac::Config config;
result = nn::ac::CreateDefaultConfig(&config);
COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result);
NN_UTIL_RETURN_IF_FAILED(result);
result = nn::ac::ConnectWithoutEula(config);
COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result);
NN_UTIL_RETURN_IF_FAILED(result);
NN_LOG("Success nn::ac::ConnectWithoutEula\n");
NN_UTIL_RETURN_IF_FAILED(PrintNetworkSetting());
result = PrintNetworkSetting();
COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result);
NN_UTIL_RETURN_IF_FAILED(result);
return nn::ResultSuccess();
return result;
}
nn::Result InitializeInternal()
{
nn::Result result = nn::ResultSuccess();
nn::Result result;
result = nn::ac::InitializeInternal();
COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result);
NN_UTIL_RETURN_IF_FAILED(result);
result = ConnectNetwork();
COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result);
NN_UTIL_RETURN_IF_FAILED(result);
return nn::ResultSuccess();
return result;
}
nn::Result FinalizeInternal()
@ -244,7 +251,7 @@ nn::Result FinalizeInternal()
result = nn::ac::FinalizeInternal();
NN_UTIL_RETURN_IF_FAILED(result);
return nn::ResultSuccess();
return result;
}
}
@ -344,10 +351,13 @@ namespace
// メイン関数
void ShopOperationSingleThreadFunc(ShopThreadParam param)
{
nn::Result result;
s_ShopResult = nn::ResultSuccess();
NN_LOG("util::ac::Initialize\n");
nn::Result result = InitializeInternal();
result = InitializeInternal();
COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(result);
NIM_SHOP_RESULT_CHECK(result);
switch(param.op)
@ -361,16 +371,8 @@ void ShopOperationSingleThreadFunc(ShopThreadParam param)
case SHOP_OPERATION_GET_IVS:
{
result = ShopOperationConnect();
if(result.IsFailure())
{
// ResultNeedGetIvsは発生するのでエラーとしない
if(result != nn::nim::ResultNeedGetIvs())
{
NIM_SHOP_RESULT_CHECK(result);
}
}
result = ShopOperationInitialize();
NIM_SHOP_RESULT_CHECK(result);
// IVSを取得する
result = nn::nim::Shop::ImportIvsFromInfrastructure();
NIM_SHOP_RESULT_CHECK(result);
@ -400,10 +402,16 @@ void ShopOperationSingleThreadFunc(ShopThreadParam param)
}
break;
case SHOP_OPERATION_DOWNLOAD_TITLE:
case SHOP_OPERATION_CONNECT_WITHOUT_CLOSE:
{
result = ShopOperationConnect();
NIM_SHOP_RESULT_CHECK(result);
return;
}
{
case SHOP_OPERATION_DOWNLOAD_TITLE:
NN_LOG("Try Download %016llx\n", param.config.titleId);
result = nn::nim::Shop::StartDownload(param.config);
@ -473,12 +481,12 @@ void ShopOperationSingleThreadFunc(ShopThreadParam param)
void StartShopOperationSingle(ShopOperation op, nn::nim::TitleConfig config)
{
NN_LOG("Start ShopOperationSingle\n");
NN_LOG("Start ShopOperationSingle, %s\n", SHOP_OPERATION_STR[op]);
ShopThreadParam param;
param.op = op;
param.config = config;
s_UnregisterThread.Start(ShopOperationSingleThreadFunc, param, s_UnregisterThreadStack);
s_ShopOperationThread.Start(ShopOperationSingleThreadFunc, param, s_UnregisterThreadStack);
}
void StartShopOperationSingle(ShopOperation op)
@ -486,20 +494,20 @@ void StartShopOperationSingle(ShopOperation op)
ShopThreadParam param;
param.op = op;
NN_LOG("Start ShopOperationSingle\n");
s_UnregisterThread.Start(ShopOperationSingleThreadFunc, param, s_UnregisterThreadStack);
NN_LOG("Start ShopOperationSingle, %s\n", SHOP_OPERATION_STR[op]);
s_ShopOperationThread.Start(ShopOperationSingleThreadFunc, param, s_UnregisterThreadStack);
}
void FinalizeShopOperationSingle()
{
NN_LOG("Finalize ShopOperationSingle\n");
s_UnregisterThread.Join();
s_UnregisterThread.Finalize();
s_ShopOperationThread.Join();
s_ShopOperationThread.Finalize();
}
bool IsShopOperationSingleFinished()
{
return s_UnregisterThread.IsValid() && !s_UnregisterThread.IsAlive();
return s_ShopOperationThread.IsValid() && !s_ShopOperationThread.IsAlive();
}
nn::Result GetShopOperationSingleResult()

View File

@ -19,7 +19,7 @@
#include <nn.h>
#include <nn/nim.h>
#define CONSOLE_RESTORE_TIN "987654321"
const char* const CONSOLE_RESTORE_TIN = "987654321";
namespace ConsoleRestore
{
@ -29,11 +29,21 @@ typedef enum SHOP_OPERATION
SHOP_OPERATION_CONNECT, // Shop::ConnectしてCloseするだけ
SHOP_OPERATION_GET_IVS, // Shop::ImportIvsFromInfrastructureを実行
SHOP_OPERATION_UNREGISTER, // Shop::Unregisterを実行
SHOP_OPERATION_CONNECT_WITHOUT_CLOSE, // Shop::ConnectしてCloseしない
SHOP_OPERATION_DOWNLOAD_TITLE, // Titleをダウンロードする
SHOP_OPERATION_NUM_MAX
} ShopOperation;
const char* const SHOP_OPERATION_STR[] =
{
"Connect",
"Get Ivs",
"Unregister",
"Connect Without Close",
"Download Title"
};
void StartShopOperationSingle(ShopOperation op, nn::nim::TitleConfig config);
void StartShopOperationSingle(ShopOperation op);
void FinalizeShopOperationSingle();

View File

@ -32,8 +32,8 @@ namespace
bit8 s_buffer1[400 * 1024];
const size_t TITLE_DOWNLOADER_STACK_SIZE = 0x1000;
nn::os::Thread s_TitleDownloaderThread;
nn::os::StackBuffer<TITLE_DOWNLOADER_STACK_SIZE> s_TitleDownloaderThreadStack;
nn::os::Thread s_TitleDownloaderThread;
nn::os::StackBuffer<TITLE_DOWNLOADER_STACK_SIZE> s_TitleDownloaderThreadStack;
nn::fs::MediaType GetMediaType(const ES_NAMESPACE::ESTitleId titleId)
{
@ -71,8 +71,18 @@ nn::Result GetEntry(ES_NAMESPACE::ESTitleId titleId, EC_NAMESPACE::ECTitleCatalo
NULL, 0,
&titleCatalog, s_buffer1, sizeof(s_buffer1));
*entry = &(titleCatalog->entries[0]);
if(result.IsSuccess())
{
if(titleCatalog->nEntries == 1)
{
*entry = &(titleCatalog->entries[0]);
}
else
{
return nn::MakeStatusResult(nn::Result::SUMMARY_NOT_FOUND, nn::Result::MODULE_COMMON, nn::Result::DESCRIPTION_NOT_FOUND);
}
}
return result;
}
@ -180,10 +190,12 @@ void TitleDownloader::Start()
for(u8 i = 0; i < m_TwlTiteNum; i++)
{
StartShopOperationSingle(SHOP_OPERATION_CONNECT_WITHOUT_CLOSE);
WaitShopOperationAndFinalize();
nn::nim::TitleConfig config;
result = GetTitleConfig(m_ProgramIdList[i], &config);
COMMON_LOGGER_RESULT_IF_FAILED(result);
if (result.IsSuccess())
{
StartShopOperationSingle(SHOP_OPERATION_DOWNLOAD_TITLE, config);
@ -194,9 +206,8 @@ void TitleDownloader::Start()
nn::Result TitleDownloader::ListUp()
{
COMMON_LOGGER("Export TwlTitle List.\n");
COMMON_LOGGER("Read TwlTitle List.\n");
nn::Result result;
size_t heapSize = common::HeapManager::GetHeap()->GetAllocatableSize();
char* titleListBuf = reinterpret_cast<char*> (common::HeapManager::GetHeap()->Allocate(heapSize));
@ -206,23 +217,24 @@ nn::Result TitleDownloader::ListUp()
common::SdReaderWriter sdReader;
m_Result = sdReader.ReadBufWithCmac(common::TWL_TITLELIST_PATHNAME, titleListBuf, heapSize, &readSize);
COMMON_LOGGER_RESULT_IF_FAILED_WITH_LINE(m_Result);
u32 listHead = 0;
for (u32 i = 0; i < readSize; i++)
if (m_Result.IsSuccess())
{
if (titleListBuf[i] == '\n')
u32 listHead = 0;
for (u32 i = 0; i < readSize; i++)
{
char ProgramIdStr[32];
char *error;
std::memcpy(ProgramIdStr, &titleListBuf[listHead], i - listHead);
m_ProgramIdList[m_TwlTiteNum] = std::strtoull(ProgramIdStr, &error, 16);
m_TwlTiteNum++;
NN_LOG("%016llx\n", m_ProgramIdList[m_TwlTiteNum - 1]);
if (titleListBuf[i] == '\n')
{
char ProgramIdStr[32];
char *error;
std::memcpy(ProgramIdStr, &titleListBuf[listHead], i - listHead);
m_ProgramIdList[m_TwlTiteNum] = std::strtoull(ProgramIdStr, &error, 16);
m_TwlTiteNum++;
NN_LOG("%016llx\n", m_ProgramIdList[m_TwlTiteNum - 1]);
listHead = i + 1;
listHead = i + 1;
}
}
}
common::HeapManager::GetHeap()->Free(titleListBuf);
}
else

View File

@ -58,8 +58,6 @@ nn::os::StackBuffer<UPDATER_THREAD_STACK_SIZE> s_UpdaterThreadStack;
u64 s_Progress = 0;
}
nn::Result PrintNetworkSetting()
{
nn::ac::NetworkSetting networkSetting;
@ -87,7 +85,7 @@ nn::Result ConnectNetwork()
NN_UTIL_RETURN_IF_FAILED(PrintNetworkSetting());
return nn::ResultSuccess();
return result;
}
nn::Result InitializeInternal()
@ -100,7 +98,7 @@ nn::Result InitializeInternal()
result = ConnectNetwork();
NN_UTIL_RETURN_IF_FAILED(result);
return nn::ResultSuccess();
return result;
}
nn::Result FinalizeInternal()
@ -112,7 +110,9 @@ nn::Result FinalizeInternal()
result = nn::ac::FinalizeInternal();
NN_UTIL_RETURN_IF_FAILED(result);
return nn::ResultSuccess();
return result;
}
}
void UpdateThreadFunc()