From c367283c333c9560d73d52a4d1cade6625f90cb9 Mon Sep 17 00:00:00 2001 From: N2614 Date: Fri, 20 Jan 2012 02:59:30 +0000 Subject: [PATCH] =?UTF-8?q?PreinstallImporter=E3=82=92=E5=88=86=E5=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_Repair@586 385bec56-5757-e545-9c3a-d8741f4650f1 --- .../ConsoleRestore/PreinstallImporter.cpp | 119 +++++++++++++----- .../ConsoleRestore/PreinstallImporter.h | 15 +++ 2 files changed, 102 insertions(+), 32 deletions(-) diff --git a/trunk/ConsoleDataMigration/sources/ConsoleRestore/PreinstallImporter.cpp b/trunk/ConsoleDataMigration/sources/ConsoleRestore/PreinstallImporter.cpp index 16dbaa3..0c895c2 100644 --- a/trunk/ConsoleDataMigration/sources/ConsoleRestore/PreinstallImporter.cpp +++ b/trunk/ConsoleDataMigration/sources/ConsoleRestore/PreinstallImporter.cpp @@ -17,7 +17,6 @@ #include "HeapManager.h" #include "PreinstallImporter.h" #include "XmlCreator.h" -#include "BgsCommunicator.h" #include "SimpleXmlPreprocessor.h" #include #include @@ -49,6 +48,14 @@ nn::Result PreinstallImporter::ListTitles(nn::ProgramId* list, size_t* num, bit6 return comm.GetLastResult(); } + NN_UTIL_RETURN_IF_FAILED( + GetHtmlBodyAndParseXmlData(comm, list, num) + ); + return nn::ResultSuccess(); +} + +nn::Result PreinstallImporter::GetHtmlBodyAndParseXmlData(BgsCommunicator& comm, nn::ProgramId* list, size_t* num) +{ // 通信結果を取得する size_t bodySize; if(!comm.GetBodySize(&bodySize)) @@ -68,6 +75,14 @@ nn::Result PreinstallImporter::ListTitles(nn::ProgramId* list, size_t* num, bit6 return comm.GetLastResult(); } + // XMLを解析してタイトルリストを設定する + NN_UTIL_RETURN_IF_FAILED(ParseXmlData(buf, list, num)); + + return nn::ResultSuccess(); +} + +nn::Result PreinstallImporter::ParseXmlData(void* buf, nn::ProgramId* list, size_t* num) +{ // 通信結果をパースする // SimpleXmlParserに食わせるために変換する SimpleXmlPreprocessor pp; @@ -78,18 +93,59 @@ nn::Result PreinstallImporter::ListTitles(nn::ProgramId* list, size_t* num, bit6 // XMLをパースしてタイトルリストを取得する nn::fnd::IAllocator* pAllocator = nn::init::GetAllocator(); nn::xml::simple::SimpleXmlParser simpleXmlParser(pAllocator); - simpleXmlParser.parse(reinterpret_cast(const_cast(xmlResult.c_str())), xmlResult.size()); + const nn::xml::simple::SimpleXmlParser::Node* pTaskIdNode; - if(simpleXmlParser.isError()) + NN_UTIL_RETURN_IF_FAILED( + SetNodetoTitleIds(simpleXmlParser, xmlResult, &pTaskIdNode) + ); + + // タイトルIDリストをコピーする + common::HeapManager xmlHeap(pTaskIdNode->contentSize); + void* titleIdBuffer = xmlHeap.GetAddr(); + std::memcpy(titleIdBuffer, pTaskIdNode->content, pTaskIdNode->contentSize); + + SplitTextAndSetupList(list, num, reinterpret_cast(titleIdBuffer)); + return nn::ResultSuccess(); +} + +nn::Result PreinstallImporter::SetNodetoTitleIds(nn::xml::simple::SimpleXmlParser& parser, std::string& xmlData, const nn::xml::simple::SimpleXmlParser::Node** pNode) +{ + /* + * SimpleXmlPreprocessorを通したXMLデータはこんな形になっている + + + + + + + 1326939225587 + 0 + 1 + + 17179924184 + EJA20305940 + JPN + 1324339327000 + 000400000FEEB400,000400000FEEB000 + + + + + + */ + + parser.parse(reinterpret_cast(const_cast(xmlData.c_str())), xmlData.size()); + + if(parser.isError()) { COMMON_LOGGER("invalid xml Data\n"); return nn::Result(nn::Result::LEVEL_STATUS, nn::Result::SUMMARY_INVALID_STATE, nn::Result::MODULE_COMMON, nn::Result::DESCRIPTION_INVALID_RESULT_VALUE); } - const nn::xml::simple::SimpleXmlParser::Node* pRootNode = simpleXmlParser.getRootNode(); - const nn::xml::simple::SimpleXmlParser::Node* pTargetNode = pRootNode->firstChild; // 欲しい情報がある場所まで階層を掘り下げる + 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, @@ -98,35 +154,34 @@ nn::Result PreinstallImporter::ListTitles(nn::ProgramId* list, size_t* num, bit6 "GetPreInstalledInfoResponse"); pPriorityNode = nn::xml::simple::SimpleXmlParser::FindNextNode(pPriorityNode->firstChild, "PreinstalledInfo"); - const nn::xml::simple::SimpleXmlParser::Node* pTaskIdNode = nn::xml::simple::SimpleXmlParser::FindNextNode( - pPriorityNode->firstChild, "TitleIds"); - common::HeapManager xmlHeap(pTaskIdNode->contentSize); - void* titleIdBuffer = xmlHeap.GetAddr(); - std::memcpy(titleIdBuffer, pTaskIdNode->content, pTaskIdNode->contentSize); - - // 分割する - char* tok; - - tok = std::strtok(reinterpret_cast(titleIdBuffer), ","); - if(!tok) - { - return nn::ResultSuccess(); - } - - list[*num] = std::strtoll(tok, NULL, 16); - (*num)++; - - while( tok ) - { - tok = std::strtok(NULL, ","); - if(tok) - { - list[*num] = std::strtoll(tok, NULL, 16); - (*num)++; - } - } + *pNode = nn::xml::simple::SimpleXmlParser::FindNextNode(pPriorityNode->firstChild, "TitleIds"); return nn::ResultSuccess(); } +void PreinstallImporter::SplitTextAndSetupList(nn::ProgramId* list, size_t* num, char* text) +{ + const char* token = ","; + char* cutout; + + cutout = std::strtok(text, token); + if(!cutout) + { + return; + } + + list[*num] = std::strtoll(cutout, NULL, 16); + (*num)++; + + while( cutout ) + { + cutout = std::strtok(NULL, token); + if(cutout) + { + list[*num] = std::strtoll(cutout, NULL, 16); + (*num)++; + } + } +} + } /* namespace ConsoleRestore */ diff --git a/trunk/ConsoleDataMigration/sources/ConsoleRestore/PreinstallImporter.h b/trunk/ConsoleDataMigration/sources/ConsoleRestore/PreinstallImporter.h index 966784d..618f511 100644 --- a/trunk/ConsoleDataMigration/sources/ConsoleRestore/PreinstallImporter.h +++ b/trunk/ConsoleDataMigration/sources/ConsoleRestore/PreinstallImporter.h @@ -17,6 +17,8 @@ #define PREINSTALLIMPORTER_H_ #include +#include +#include "BgsCommunicator.h" namespace ConsoleRestore { @@ -34,6 +36,19 @@ public: //! @param[in] deviceId デバイスID //! @param[in] serialNo シリアルナンバー nn::Result ListTitles(nn::ProgramId* list, size_t* num, bit64 deviceId, u8* serialNo); + +private: + //! @brief HTMLレスポンスを受信してXMLデータを解析します + nn::Result GetHtmlBodyAndParseXmlData(BgsCommunicator& comm, nn::ProgramId* list, size_t* num); + + //! @brief 受信したXMLデータを解析してタイトルIDリストを設定します + nn::Result ParseXmlData(void* buf, nn::ProgramId* list, size_t* num); + + //! @brief SimpleXmlパーサの解析をTitleIdノードまで進めます + nn::Result SetNodetoTitleIds(nn::xml::simple::SimpleXmlParser& parser, std::string& xmlData, const nn::xml::simple::SimpleXmlParser::Node** pNode); + + //! @brief カンマ区切りのプログラムIDのリストを分割して出力用のリストに設定します + void SplitTextAndSetupList(nn::ProgramId* list, size_t* num, char* text); }; } /* namespace ConsoleRestore */