r834の追加忘れ

git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_Repair@836 385bec56-5757-e545-9c3a-d8741f4650f1
This commit is contained in:
N2614 2015-03-18 04:34:34 +00:00
parent 7b60b86f39
commit bc3916b6b2
2 changed files with 278 additions and 0 deletions

View File

@ -0,0 +1,213 @@
/*---------------------------------------------------------------------------*
Project: Horizon
File: NinjaXmlReader.cpp
Copyright (C)2015 Nintendo Co., Ltd. All rights reserved.
These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo
Company Ltd., and are protected by Federal copyright law. They may
not be disclosed to third parties or copied or duplicated in any form,
in whole or in part, without the prior written consent of Nintendo.
$Rev$
*---------------------------------------------------------------------------*/
#include "NinjaXmlReader.h"
#include "SimpleXmlPreprocessor.h"
#include "HeapManager.h"
#include <nn/xml/simple/xml_simple_SimpleXmlParser.h>
#include <nn.h>
namespace ConsoleRestore
{
NinjaXmlReader::NinjaXmlReader()
{
// TODO 自動生成されたコンストラクター・スタブ
}
NinjaXmlReader::~NinjaXmlReader()
{
// TODO Auto-generated destructor stub
}
void NinjaXmlReader::GetNsUid(char* pNsUid, size_t size, std::string xml)
{
if(!SimpleXmlPreprocessor::Canonicalize(xml))
{
return;
}
nn::xml::simple::SimpleXmlParser parser(common::GetAllocator());
parser.parse(reinterpret_cast<u8*>(const_cast<char*>(xml.c_str())), xml.size());
GetContentOfElement(parser, "ns_uid", pNsUid, size);
}
bool NinjaXmlReader::HasContentLock(std::string xml)
{
return HasElement(xml, "content_lock");
}
bool NinjaXmlReader::HasExternalSeed(std::string xml)
{
return HasElement(xml, "external_seed");
}
nn::fnd::DateTime NinjaXmlReader::GetPlayableDate(std::string xml)
{
if(!SimpleXmlPreprocessor::Canonicalize(xml))
{
return nn::fnd::DateTime::MIN_DATETIME;
}
const size_t BUF_SIZE = 1024 * 1024;
common::HeapManager manager(BUF_SIZE);
void* buf = manager.GetAddr();
char* playableDateStr = reinterpret_cast<char*>(buf);
if(playableDateStr)
{
nn::xml::simple::SimpleXmlParser parser(common::GetAllocator());
parser.parse(reinterpret_cast<u8*>(const_cast<char*>(xml.c_str())), xml.size());
GetContentOfElement(parser, "playable_date", playableDateStr, BUF_SIZE);
// playable_date は YYYY-MM-DD 形式
std::string yearStr(std::string(playableDateStr).substr(0, 4));
std::string monthStr(std::string(playableDateStr).substr(5, 2));
std::string dayStr(std::string(playableDateStr).substr(8, 2));
char* end = '\0';
s32 year = std::strtol(yearStr.c_str(),&end, 10);
s32 month = std::strtol(monthStr.c_str(),&end, 10);
s32 day = std::strtol(dayStr.c_str(),&end, 10);
nn::fnd::DateTime playableDate = nn::fnd::DateTime::FromParameters(year, month, day);
return playableDate;
}
return nn::fnd::DateTime::MIN_DATETIME;
}
bool NinjaXmlReader::HasElement(std::string xml, const char* element)
{
if(!SimpleXmlPreprocessor::Canonicalize(xml))
{
return false;
}
nn::xml::simple::SimpleXmlParser parser(common::GetAllocator());
parser.parse(reinterpret_cast<u8*>(const_cast<char*>(xml.c_str())), xml.size());
return GetElement(parser, element);
}
bool NinjaXmlReader::GetContentOfElement(nn::xml::simple::SimpleXmlParser& parser, const char* target, char* content, size_t bufSize)
{
if ( !parser.isError() )
{
const nn::xml::simple::SimpleXmlParser::Node* pRootNode = parser.getRootNode();
int rootNameSize = pRootNode->nameSize + 1;
char* pRootName = new char[ rootNameSize ];
std::strlcpy( pRootName, (char*)pRootNode->name, rootNameSize );
NN_LOG( "rootNode name: %s\n", pRootName );
delete pRootName;
bool found = false;
GetNodes(pRootNode, target, content, bufSize, found);
return found;
}
return false;
}
bool NinjaXmlReader::GetElement(nn::xml::simple::SimpleXmlParser& parser, const char* element)
{
const size_t BUF_SIZE = 1024 * 1024;
common::HeapManager manager(BUF_SIZE);
void* addr = manager.GetAddr();
if(addr)
{
return GetContentOfElement(parser, element, reinterpret_cast<char*>(addr), BUF_SIZE);
}
return false;
}
void NinjaXmlReader::GetNodes( const nn::xml::simple::SimpleXmlParser::Node* topNodes, const char* target, char* content, size_t bufSize, bool& found)
{
const nn::xml::simple::SimpleXmlParser::Node* pTargetNode = topNodes->firstChild;
while ( pTargetNode != NULL )
{
// 見つかるまで更新する
// 同じ名前の要素が複数ある場合1つ目の要素を見つけた時点でtrueになる
bool targetIsCurrentNode = GetNodeName(pTargetNode, target);
if(!found)
{
found = targetIsCurrentNode;
}
/*
* [Point]contentSizeは0となる
*/
if(pTargetNode->contentSize > 0)
{
GetNodeContent(pTargetNode, targetIsCurrentNode, content, bufSize);
}
else
{
GetNodes(pTargetNode, target, content, bufSize, found);
}
pTargetNode = pTargetNode->next;
}
}
bool NinjaXmlReader::GetNodeName( const nn::xml::simple::SimpleXmlParser::Node* pNode, const char* target)
{
/*
* [Point] Node::nameには()
* Node::nameSize分のデータをNode::nameの先頭から取得することで
*/
char* pNodeName = new char[ pNode->nameSize+1 ];
std::strlcpy( pNodeName, (char*)pNode->name, pNode->nameSize+1 );
NN_LOG( "Node name: %s\n", pNodeName );
if(!std::strcmp(pNodeName, target))
{
delete pNodeName;
return true;
}
else
{
delete pNodeName;
return false;
}
}
void NinjaXmlReader::GetNodeContent( const nn::xml::simple::SimpleXmlParser::Node* pNode, bool found, char* content, size_t bufSize )
{
if(pNode->contentSize > 0)
{
/*
* [Point] Node::contentには
* Node::contentSize分のデータをNode::contentの先頭から取得することで
*/
char* pNodeContent = new char[ pNode->contentSize+1 ];
std::strlcpy( pNodeContent, (char*)pNode->content, pNode->contentSize+1);
//行頭タブ挿し入れ
NN_LOG( "Node content: %s\n", pNodeContent );
if(found)
{
if(pNode->contentSize+1 < bufSize)
{
std::strlcpy(content, (char*)pNode->content, pNode->contentSize+1);
}
else
{
std::strlcpy(content, (char*)pNode->content, bufSize);
}
}
delete pNodeContent;
}
}
} /* namespace ConsoleRestore */

View File

@ -0,0 +1,65 @@
/*---------------------------------------------------------------------------*
Project: Horizon
File: NinjaXmlReader.h
Copyright (C)2015 Nintendo Co., Ltd. All rights reserved.
These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo
Company Ltd., and are protected by Federal copyright law. They may
not be disclosed to third parties or copied or duplicated in any form,
in whole or in part, without the prior written consent of Nintendo.
$Rev$
*---------------------------------------------------------------------------*/
#ifndef SOURCES_CONSOLERESTORE_NINJAXMLREADER_H_
#define SOURCES_CONSOLERESTORE_NINJAXMLREADER_H_
#include <string>
#include <nn/fnd/fnd_DateTime.h>
#include <nn/xml/simple/xml_simple_SimpleXmlParser.h>
namespace ConsoleRestore
{
//!@brief Ninjaから取得したXMLデータ読み取るためのクラスです
class NinjaXmlReader
{
public:
NinjaXmlReader();
virtual ~NinjaXmlReader();
//!@brief XMLをパースしてns_uidを取得します
//!@param[out] pNsUid ns_uidを格納するためのバッファ
//!@param[in] size pNsUidのバッファサイズ
//!@param[in] xml Ninjaから取得したXMLデータ
void GetNsUid(char* pNsUid, size_t size, std::string xml);
//!@brief XMLをパースしてcontent_lock要素があるかどうかを返します
//!@param[in] xml Ninjaから取得したXMLデータ
//!@return content_lock要素があるかどうか
bool HasContentLock(std::string xml);
//!@brief XMLをパースしてexternal_seed要素があるかどうかを返します
//!@param[in] xml Ninjaから取得したXMLデータ
//!@return external_seed要素があるかどうか
bool HasExternalSeed(std::string xml);
//!@brief XMLをパースしてプレイ可能日を取得します
//!@param[in] xml Ninjaから取得したXMLデータ
//!@return DateTime型のプレイ可能日
nn::fnd::DateTime GetPlayableDate(std::string xml);
private:
bool HasElement(std::string xml, const char* element);
bool GetContentOfElement(nn::xml::simple::SimpleXmlParser& parser, const char* element, char* content, size_t bufSize);
bool GetElement(nn::xml::simple::SimpleXmlParser& parser, const char* element);
void GetNodes( const nn::xml::simple::SimpleXmlParser::Node* topNodes, const char* target, char* content, size_t bufSize, bool& found);
bool GetNodeName( const nn::xml::simple::SimpleXmlParser::Node* pNode, const char* target);
void GetNodeContent( const nn::xml::simple::SimpleXmlParser::Node* pNode, bool found, char* content, size_t bufSize );
};
} /* namespace ConsoleRestore */
#endif /* SOURCES_CONSOLERESTORE_NINJAXMLREADER_H_ */