diff --git a/trunk/ConsoleDataMigration/sources/ConsoleRestore/Controller.cpp b/trunk/ConsoleDataMigration/sources/ConsoleRestore/Controller.cpp index f94e581..9da7be6 100644 --- a/trunk/ConsoleDataMigration/sources/ConsoleRestore/Controller.cpp +++ b/trunk/ConsoleDataMigration/sources/ConsoleRestore/Controller.cpp @@ -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 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() diff --git a/trunk/ConsoleDataMigration/sources/ConsoleRestore/Shop.h b/trunk/ConsoleDataMigration/sources/ConsoleRestore/Shop.h index f26134c..c3b513e 100644 --- a/trunk/ConsoleDataMigration/sources/ConsoleRestore/Shop.h +++ b/trunk/ConsoleDataMigration/sources/ConsoleRestore/Shop.h @@ -19,7 +19,7 @@ #include #include -#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(); diff --git a/trunk/ConsoleDataMigration/sources/ConsoleRestore/TitleDownloader.cpp b/trunk/ConsoleDataMigration/sources/ConsoleRestore/TitleDownloader.cpp index 800b51e..cf89456 100644 --- a/trunk/ConsoleDataMigration/sources/ConsoleRestore/TitleDownloader.cpp +++ b/trunk/ConsoleDataMigration/sources/ConsoleRestore/TitleDownloader.cpp @@ -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 s_TitleDownloaderThreadStack; +nn::os::Thread s_TitleDownloaderThread; +nn::os::StackBuffer 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 (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 diff --git a/trunk/ConsoleDataMigration/sources/ConsoleRestore/Updater.cpp b/trunk/ConsoleDataMigration/sources/ConsoleRestore/Updater.cpp index df1e102..2da6a7f 100644 --- a/trunk/ConsoleDataMigration/sources/ConsoleRestore/Updater.cpp +++ b/trunk/ConsoleDataMigration/sources/ConsoleRestore/Updater.cpp @@ -58,8 +58,6 @@ nn::os::StackBuffer 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()