mirror of
https://github.com/rvtr/ctr_Repair.git
synced 2025-10-31 13:51:08 -04:00
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:
parent
7b60b86f39
commit
bc3916b6b2
@ -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 */
|
||||||
@ -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_ */
|
||||||
Loading…
Reference in New Issue
Block a user