mirror of
https://github.com/rvtr/ctr_Repair.git
synced 2025-10-31 13:51:08 -04:00
プリインストールテーブルが存在しない場合にエラー表示するように
git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_Repair@606 385bec56-5757-e545-9c3a-d8741f4650f1
This commit is contained in:
parent
b9c1d2e6a2
commit
20a7e8bd75
@ -1705,8 +1705,9 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector<std::stri
|
|||||||
if (s_PreparePreinstallTitleDownloadRetryCount++ < RETRY_MAX)
|
if (s_PreparePreinstallTitleDownloadRetryCount++ < RETRY_MAX)
|
||||||
{
|
{
|
||||||
COMMON_LOGGER_RESULT_IF_FAILED(GetTitleDownloadResult());
|
COMMON_LOGGER_RESULT_IF_FAILED(GetTitleDownloadResult());
|
||||||
if(GetTitleDownloadResult() == nn::MakePermanentResult(nn::Result::SUMMARY_OUT_OF_RESOURCE,
|
if (GetTitleDownloadResult()
|
||||||
nn::Result::MODULE_APPLICATION, nn::Result::DESCRIPTION_OUT_OF_MEMORY))
|
== nn::MakePermanentResult(nn::Result::SUMMARY_OUT_OF_RESOURCE,
|
||||||
|
nn::Result::MODULE_APPLICATION, nn::Result::DESCRIPTION_OUT_OF_MEMORY))
|
||||||
{
|
{
|
||||||
// SDカード容量不足
|
// SDカード容量不足
|
||||||
s_RestoreState = PREINSTALL_DOWNLOAD_APP_NOT_ENOUGH_SPACE;
|
s_RestoreState = PREINSTALL_DOWNLOAD_APP_NOT_ENOUGH_SPACE;
|
||||||
@ -1718,13 +1719,22 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector<std::stri
|
|||||||
COMMON_LOGGER_RESULT_IF_FAILED(nn::fs::DeleteSdmcRoot());
|
COMMON_LOGGER_RESULT_IF_FAILED(nn::fs::DeleteSdmcRoot());
|
||||||
s_RestoreState = PREINSTALL_DOWNLOAD_APP_NOT_ENOUGH_SPACE;
|
s_RestoreState = PREINSTALL_DOWNLOAD_APP_NOT_ENOUGH_SPACE;
|
||||||
}
|
}
|
||||||
else if(GetTitleDownloadResult() == nn::MakePermanentResult(nn::Result::SUMMARY_INVALID_STATE,
|
else if (GetTitleDownloadResult()
|
||||||
nn::Result::MODULE_APPLICATION, nn::Result::DESCRIPTION_ALREADY_INITIALIZED))
|
== nn::MakePermanentResult(nn::Result::SUMMARY_INVALID_STATE,
|
||||||
|
nn::Result::MODULE_APPLICATION, nn::Result::DESCRIPTION_ALREADY_INITIALIZED))
|
||||||
{
|
{
|
||||||
// ユーザSDが初期化済み
|
// ユーザSDが初期化済み
|
||||||
s_RestoreState = PREINSTALL_CHECK_SD_FAIL;
|
s_RestoreState = PREINSTALL_CHECK_SD_FAIL;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
else if (GetTitleDownloadResult()
|
||||||
|
== nn::MakePermanentResult(nn::Result::SUMMARY_NOT_FOUND,
|
||||||
|
nn::Result::MODULE_APPLICATION, nn::Result::DESCRIPTION_NOT_FOUND))
|
||||||
|
{
|
||||||
|
// プリインストールテーブルが無い
|
||||||
|
COMMON_LOGGER("No PreInstalled Application Found\n");
|
||||||
|
s_RestoreState = PREINSTALL_CHECK_SD_FAIL;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// エラーのためやり直す
|
// エラーのためやり直す
|
||||||
@ -1759,7 +1769,7 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector<std::stri
|
|||||||
if (ExistsAPSetting())
|
if (ExistsAPSetting())
|
||||||
{
|
{
|
||||||
NN_LOG("AP Setting Exists. OK\n");
|
NN_LOG("AP Setting Exists. OK\n");
|
||||||
COMMON_LOGGER("Download Preinstall failed\n");
|
COMMON_LOGGER("Download PreInstalled Application failed\n");
|
||||||
ChangeState(saved, s_RestoreState, FAIL);
|
ChangeState(saved, s_RestoreState, FAIL);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -1776,14 +1786,14 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector<std::stri
|
|||||||
{
|
{
|
||||||
if (!s_ExecutePreinstallTitleDownload)
|
if (!s_ExecutePreinstallTitleDownload)
|
||||||
{
|
{
|
||||||
COMMON_LOGGER("Download PreInstall Application\n");
|
COMMON_LOGGER("Download PreInstalled Application\n");
|
||||||
s_ExecutePreinstallTitleDownload = true;
|
s_ExecutePreinstallTitleDownload = true;
|
||||||
StartPreinstallTitleDownload();
|
StartPreinstallTitleDownload();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 動いていることを表示
|
// 動いていることを表示
|
||||||
{
|
{
|
||||||
PutAliveMessage(operationMessage, "Download PreInstall Title");
|
PutAliveMessage(operationMessage, "Download PreInstalled Title");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IsDownloadTitleFinished())
|
if (IsDownloadTitleFinished())
|
||||||
@ -1809,7 +1819,7 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector<std::stri
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
COMMON_LOGGER("Download PreInstall Title Failed. Retrying... %d\n", s_PreinstallTitleDownloadRetryCount);
|
COMMON_LOGGER("Download PreInstalled Title Failed. Retrying... %d\n", s_PreinstallTitleDownloadRetryCount);
|
||||||
|
|
||||||
s_ExecutePreinstallTitleDownload = false;
|
s_ExecutePreinstallTitleDownload = false;
|
||||||
}
|
}
|
||||||
@ -1850,12 +1860,12 @@ void ControlState(common::HardwareStateManager& manager, ::std::vector<std::stri
|
|||||||
NN_LOG("AP Setting Exists. OK\n");
|
NN_LOG("AP Setting Exists. OK\n");
|
||||||
if(s_PreinstallTitleDownloadSuccess)
|
if(s_PreinstallTitleDownloadSuccess)
|
||||||
{
|
{
|
||||||
COMMON_LOGGER("Download Preinstall done\n");
|
COMMON_LOGGER("Download PreInstalled Application done\n");
|
||||||
ChangeState(saved, s_RestoreState, WAIT_SD_EJECT);
|
ChangeState(saved, s_RestoreState, WAIT_SD_EJECT);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
COMMON_LOGGER("Download Preinstall failed\n");
|
COMMON_LOGGER("Download PreInstalled Application failed\n");
|
||||||
ChangeState(saved, s_RestoreState, FAIL);
|
ChangeState(saved, s_RestoreState, FAIL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -126,6 +126,14 @@ nn::Result PreinstallImporter::ParseXmlData(void* buf, nn::ProgramId* list, size
|
|||||||
SetNodetoTitleIds(simpleXmlParser, xmlResult, &pTaskIdNode)
|
SetNodetoTitleIds(simpleXmlParser, xmlResult, &pTaskIdNode)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
*num = 0;
|
||||||
|
// プリインストールタイトルが無ければ終了
|
||||||
|
if(!pTaskIdNode)
|
||||||
|
{
|
||||||
|
return nn::MakePermanentResult(nn::Result::SUMMARY_NOT_FOUND, nn::Result::MODULE_APPLICATION,
|
||||||
|
nn::Result::DESCRIPTION_NOT_FOUND);
|
||||||
|
}
|
||||||
|
|
||||||
// タイトルIDリストをコピーする
|
// タイトルIDリストをコピーする
|
||||||
common::HeapManager xmlHeap(pTaskIdNode->contentSize);
|
common::HeapManager xmlHeap(pTaskIdNode->contentSize);
|
||||||
void* titleIdBuffer = xmlHeap.GetAddr();
|
void* titleIdBuffer = xmlHeap.GetAddr();
|
||||||
@ -191,7 +199,6 @@ void PreinstallImporter::SplitTextAndSetupList(nn::ProgramId* list, size_t* num,
|
|||||||
const char* token = ",";
|
const char* token = ",";
|
||||||
char* cutout;
|
char* cutout;
|
||||||
|
|
||||||
*num = 0;
|
|
||||||
cutout = std::strtok(text, token);
|
cutout = std::strtok(text, token);
|
||||||
if(!cutout)
|
if(!cutout)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -45,6 +45,8 @@ private:
|
|||||||
nn::Result GetHtmlBodyAndParseXmlData(BgsCommunicator& comm, nn::ProgramId* list, size_t* num);
|
nn::Result GetHtmlBodyAndParseXmlData(BgsCommunicator& comm, nn::ProgramId* list, size_t* num);
|
||||||
|
|
||||||
//! @brief 受信したXMLデータを解析してタイトルIDリストを設定します
|
//! @brief 受信したXMLデータを解析してタイトルIDリストを設定します
|
||||||
|
//! @return プリインストールアプリが存在しない場合、(Level=Status, Summary=NotFound, Module=Application, Description=NotFound)<BR/>
|
||||||
|
//! のResultを返します
|
||||||
nn::Result ParseXmlData(void* buf, nn::ProgramId* list, size_t* num);
|
nn::Result ParseXmlData(void* buf, nn::ProgramId* list, size_t* num);
|
||||||
|
|
||||||
//! @brief SimpleXmlパーサの解析をTitleIdノードまで進めます
|
//! @brief SimpleXmlパーサの解析をTitleIdノードまで進めます
|
||||||
|
|||||||
@ -103,13 +103,22 @@ void PreinstallImporterTest::ListUp()
|
|||||||
|
|
||||||
size_t num;
|
size_t num;
|
||||||
nn::ProgramId list[256];
|
nn::ProgramId list[256];
|
||||||
NN_TEST_ASSERT_RESULT_SUCCESS(
|
nn::Result result;
|
||||||
importer.ListTitles(list, &num, 17179924184, reinterpret_cast<u8*>(const_cast<char*>("EJA20305940"))));
|
result = importer.ListTitles(list, &num, 17179924184, reinterpret_cast<u8*>(const_cast<char*>("EJA20305940")));
|
||||||
|
|
||||||
NN_LOG("Preinstalled num = %d\n", num);
|
if(result == nn::MakePermanentResult(nn::Result::SUMMARY_NOT_FOUND,
|
||||||
for(u32 i = 0; i < num; i++)
|
nn::Result::MODULE_APPLICATION, nn::Result::DESCRIPTION_NOT_FOUND))
|
||||||
{
|
{
|
||||||
NN_LOG("%016llx\n", list[i]);
|
NN_LOG("No PreInstalled Application found\n");
|
||||||
|
NN_TEST_ASSERT(num == 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NN_LOG("Preinstalled num = %d\n", num);
|
||||||
|
for (u32 i = 0; i < num; i++)
|
||||||
|
{
|
||||||
|
NN_LOG("%016llx\n", list[i]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -39,9 +39,11 @@ class SimpleXmlParserTest : public Suite {
|
|||||||
public:
|
public:
|
||||||
SimpleXmlParserTest() {
|
SimpleXmlParserTest() {
|
||||||
TEST_ADD(SimpleXmlParserTest::Find);
|
TEST_ADD(SimpleXmlParserTest::Find);
|
||||||
|
TEST_ADD(SimpleXmlParserTest::NotFound);
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
void Find();
|
void Find();
|
||||||
|
void NotFound();
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
@ -84,6 +86,25 @@ const char* SimpleXmlParserGetter::GetContent(const nn::xml::simple::SimpleXmlPa
|
|||||||
|
|
||||||
char SimpleXmlParserGetter::m_Buf[SimpleXmlParserGetter::BUF_SIZE];
|
char SimpleXmlParserGetter::m_Buf[SimpleXmlParserGetter::BUF_SIZE];
|
||||||
|
|
||||||
|
nn::Result SetNodetoPreinstalledInfo(nn::xml::simple::SimpleXmlParser& parser, std::string& xmlData, const nn::xml::simple::SimpleXmlParser::Node** pNode)
|
||||||
|
{
|
||||||
|
parser.parse(reinterpret_cast<u8*>(const_cast<char*>(xmlData.c_str())), xmlData.size());
|
||||||
|
|
||||||
|
NN_TEST_ASSERT(!parser.isError());
|
||||||
|
const nn::xml::simple::SimpleXmlParser::Node* pRootNode = parser.getRootNode();
|
||||||
|
const nn::xml::simple::SimpleXmlParser::Node* pTargetNode = pRootNode->firstChild;
|
||||||
|
// 欲しい情報がある場所まで階層を掘り下げる
|
||||||
|
const nn::xml::simple::SimpleXmlParser::Node* pPriorityNode = nn::xml::simple::SimpleXmlParser::FindNextNode(
|
||||||
|
pTargetNode, "Body");
|
||||||
|
pPriorityNode = nn::xml::simple::SimpleXmlParser::FindNextNode(pPriorityNode->firstChild,
|
||||||
|
"GetPreInstalledInfoResponse");
|
||||||
|
pPriorityNode = nn::xml::simple::SimpleXmlParser::FindNextNode(pPriorityNode->firstChild,
|
||||||
|
"GetPreInstalledInfoResponse");
|
||||||
|
*pNode = nn::xml::simple::SimpleXmlParser::FindNextNode(pPriorityNode->firstChild, "PreinstalledInfo");
|
||||||
|
|
||||||
|
return nn::ResultSuccess();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------
|
//------------------------------------------------------------------
|
||||||
@ -117,20 +138,9 @@ const char testText[] = "\
|
|||||||
|
|
||||||
nn::fnd::IAllocator* pAllocator = nn::init::GetAllocator();
|
nn::fnd::IAllocator* pAllocator = nn::init::GetAllocator();
|
||||||
nn::xml::simple::SimpleXmlParser simpleXmlParser(pAllocator);
|
nn::xml::simple::SimpleXmlParser simpleXmlParser(pAllocator);
|
||||||
simpleXmlParser.parse(reinterpret_cast<u8*>(const_cast<char*>(testText)), sizeof(testText) - 1);
|
const nn::xml::simple::SimpleXmlParser::Node* pPriorityNode;
|
||||||
|
std::string xmlData(testText);
|
||||||
|
SetNodetoPreinstalledInfo(simpleXmlParser, xmlData, &pPriorityNode);
|
||||||
NN_TEST_ASSERT(!simpleXmlParser.isError());
|
|
||||||
const nn::xml::simple::SimpleXmlParser::Node* pRootNode = simpleXmlParser.getRootNode();
|
|
||||||
const nn::xml::simple::SimpleXmlParser::Node* pTargetNode = pRootNode->firstChild;
|
|
||||||
// 欲しい情報がある場所まで階層を掘り下げる
|
|
||||||
const nn::xml::simple::SimpleXmlParser::Node* pPriorityNode = nn::xml::simple::SimpleXmlParser::FindNextNode(
|
|
||||||
pTargetNode, "Body");
|
|
||||||
pPriorityNode = nn::xml::simple::SimpleXmlParser::FindNextNode(pPriorityNode->firstChild,
|
|
||||||
"GetPreInstalledInfoResponse");
|
|
||||||
pPriorityNode = nn::xml::simple::SimpleXmlParser::FindNextNode(pPriorityNode->firstChild,
|
|
||||||
"GetPreInstalledInfoResponse");
|
|
||||||
pPriorityNode = nn::xml::simple::SimpleXmlParser::FindNextNode(pPriorityNode->firstChild, "PreinstalledInfo");
|
|
||||||
|
|
||||||
{
|
{
|
||||||
const nn::xml::simple::SimpleXmlParser::Node* pTaskIdNode = nn::xml::simple::SimpleXmlParser::FindNextNode(
|
const nn::xml::simple::SimpleXmlParser::Node* pTaskIdNode = nn::xml::simple::SimpleXmlParser::FindNextNode(
|
||||||
@ -158,6 +168,42 @@ const char testText[] = "\
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SimpleXmlParserTest::NotFound()
|
||||||
|
{
|
||||||
|
const char testText[] = \
|
||||||
|
"<Envelope>\
|
||||||
|
<Body>\
|
||||||
|
<GetPreInstalledInfoResponse>\
|
||||||
|
<GetPreInstalledInfoResponse>\
|
||||||
|
<Version></Version>\
|
||||||
|
<MessageId></MessageId>\
|
||||||
|
<TimeStamp>1327551124393</TimeStamp>\
|
||||||
|
<ErrorCode>0</ErrorCode>\
|
||||||
|
<ListResultTotalSize>1</ListResultTotalSize>\
|
||||||
|
<PreinstalledInfo>\
|
||||||
|
<DeviceId>17179924184</DeviceId>\
|
||||||
|
<SerialNo>EJA20305940</SerialNo>\
|
||||||
|
<Region>JPN</Region>\
|
||||||
|
<ManufactureDate>1327545997000</ManufactureDate>\
|
||||||
|
</PreinstalledInfo>\
|
||||||
|
</GetPreInstalledInfoResponse>\
|
||||||
|
</GetPreInstalledInfoResponse>\
|
||||||
|
</Body>\
|
||||||
|
</Envelope>";
|
||||||
|
|
||||||
|
nn::fnd::IAllocator* pAllocator = nn::init::GetAllocator();
|
||||||
|
nn::xml::simple::SimpleXmlParser simpleXmlParser(pAllocator);
|
||||||
|
const nn::xml::simple::SimpleXmlParser::Node* pPriorityNode;
|
||||||
|
std::string xmlData(testText);
|
||||||
|
SetNodetoPreinstalledInfo(simpleXmlParser, xmlData, &pPriorityNode);
|
||||||
|
|
||||||
|
{
|
||||||
|
const nn::xml::simple::SimpleXmlParser::Node* pTaskIdNode = nn::xml::simple::SimpleXmlParser::FindNextNode(
|
||||||
|
pPriorityNode->firstChild, "TitleIds");
|
||||||
|
NN_TEST_ASSERT(!pTaskIdNode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
NN_TEST_DEFINE_MAIN(SimpleXmlParserTest)
|
NN_TEST_DEFINE_MAIN(SimpleXmlParserTest)
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user