/*---------------------------------------------------------------------------* Project: Horizon File: NinjaCommunicator.cpp Copyright 2009-2011 Nintendo. 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 "NinjaCommunicator.h" #include "Util.h" #include "CommonLogger.h" #include #include #include #include #include namespace ConsoleRestore { namespace { static unsigned char s_Buffer[4096] NN_ATTRIBUTE_ALIGN(4096); } NinjaCommunicator::NinjaCommunicator() { } NinjaCommunicator::~NinjaCommunicator() { // TODO Auto-generated destructor stub } nn::Result NinjaCommunicator::GetNsUid(const char* baseUrl, nn::ProgramId programId) { if(!nn::ac::IsConnected()) { COMMON_LOGGER_RETURN_RESULT_IF_FAILED( common::InitializeNetwork()); } std::string url(baseUrl); GenerateUrlForNsUid(url, programId); return HttpCommunicationCore(url); } nn::Result NinjaCommunicator::GetEcInfo(const char* baseUrl, const char* nsUid, const char* countryCode) { if(!nn::ac::IsConnected()) { COMMON_LOGGER_RESULT_IF_FAILED( common::InitializeNetwork()); } std::string url(baseUrl); GenerateUrlForEcInfo(url, nsUid, countryCode); return HttpCommunicationCore(url); } nn::Result NinjaCommunicator::HttpCommunicationCore(std::string url) { /* ------------------------------------------------------------------------ ライブラリの初期化(HTTPライブラリ使用前に、各プロセスで一度だけ実行する。) ------------------------------------------------------------------------ */ COMMON_LOGGER_RESULT_IF_FAILED( nn::http::Initialize(reinterpret_cast(s_Buffer), sizeof(s_Buffer))); /* ------------------------------------------------------------------------ 通信準備 ------------------------------------------------------------------------ */ //通信先の設定 //<>URLの先頭文字はhttpsとなります COMMON_LOGGER_RESULT_IF_FAILED( m_HttpCon.Initialize(url.c_str())); /* ------------------------------------------------------------------------ <>SSL処理用設定 ------------------------------------------------------------------------ */ //ルート証明書の設定 COMMON_LOGGER_RESULT_IF_FAILED( m_HttpCon.SetRootCa(nn::ssl::CACERT_NINTENDO_CA)); COMMON_LOGGER_RESULT_IF_FAILED( m_HttpCon.SetRootCa(nn::ssl::CACERT_NINTENDO_CA_G2)); COMMON_LOGGER_RESULT_IF_FAILED( m_HttpCon.SetRootCa(nn::ssl::CACERT_NINTENDO_CA_G3)); COMMON_LOGGER_RESULT_IF_FAILED( m_HttpCon.SetRootCa(nn::ssl::CACERT_NINTENDO_CLASS2_CA)); COMMON_LOGGER_RESULT_IF_FAILED( m_HttpCon.SetRootCa(nn::ssl::CACERT_NINTENDO_CLASS2_CA_G2)); COMMON_LOGGER_RESULT_IF_FAILED( m_HttpCon.SetRootCa(nn::ssl::CACERT_NINTENDO_CLASS2_CA_G3)); // クライアント証明書の設定 COMMON_LOGGER_RESULT_IF_FAILED( m_HttpCon.SetClientCert(nn::ssl::CLIENTCERT_DEFAULT)); #ifndef USE_PROD_KEY // 開発用サーバは自己署名証明書なので検証項目を減らす COMMON_LOGGER_RESULT_IF_FAILED( m_HttpCon.DisableVerifyOptionForDebug( nn::ssl::VERIFY_COMMON_NAME | nn::ssl::VERIFY_SUBJECT_ALT_NAME | nn::ssl::VERIFY_ROOT_CA)); #endif /* ------------------------------------------------------------------------ 通信実行 ------------------------------------------------------------------------ */ //通信の開始 COMMON_LOGGER_RESULT_IF_FAILED( m_HttpCon.Connect()); //リクエストの送信を開始する。機器が同時実行可能な最大個数のHTTP通信がすでに実行中の場合は、空きができるまでブロック return nn::ResultSuccess(); } void NinjaCommunicator::GenerateUrlForNsUid(std::string& url, nn::ProgramId programId) { url.append("titles/id_pair?title_id%5B%5D="); char programIdStr[32]; std::snprintf(programIdStr, sizeof(programIdStr), "%016llX", programId); url.append(programIdStr); NN_LOG("URL=%s\n", url.c_str()); } void NinjaCommunicator::GenerateUrlForEcInfo(std::string& url, const char* nsUid, const char* countryCode) { url.append(countryCode); url.append("/title/"); url.append(nsUid); url.append("/ec_info?countryCode="); url.append(countryCode); NN_LOG("URL=%s\n", url.c_str()); } nn::Result NinjaCommunicator::GetBody(u8 *buf, size_t size) { //HTTPレスポンスの取得 nn::fnd::TimeSpan timeOut = nn::fnd::TimeSpan::FromSeconds(90); std::memset(buf, 0, size); //読み取りが完了するまでブロック。Bodyの最後までの読み込みが成功した場合は、Successを表すResultが返る。バッファサイズが足りない場合は、エラー(Description==ER_RES_BODYBUF_SHORTAGEのResult)が返る*/ COMMON_LOGGER_RETURN_RESULT_IF_FAILED( m_HttpCon.Read(buf, size, timeOut)); return nn::ResultSuccess(); } nn::Result NinjaCommunicator::GetSslError(s32* pResultCode) { return m_HttpCon.GetSslError(pResultCode); } nn::Result NinjaCommunicator::Finalize() { COMMON_LOGGER_RETURN_RESULT_IF_FAILED( m_HttpCon.Finalize()); COMMON_LOGGER_RETURN_RESULT_IF_FAILED( nn::http::Finalize()); return nn::ResultSuccess(); } } /* namespace ConsoleRestore */