/*---------------------------------------------------------------------------* Project: Horizon File: AcChanger.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 "AcChanger.h" #include #include #include #include #include #include #include #include namespace { struct SaveData { // インターネット接続設定 nn::ac::CTR::NetworkSetting m_NetworkSetting[3]; }; SaveData s_SaveData; } AcChanger::AcChanger() { // TODO 自動生成されたコンストラクター・スタブ } AcChanger::~AcChanger() { // TODO Auto-generated destructor stub } nn::Result AcChanger::RestoreFromBackup() { NN_UTIL_RETURN_IF_FAILED( nn::fs::MountSaveData("data:") ); NN_UTIL_RETURN_IF_FAILED( CheckBackupFormat() ); NN_UTIL_RETURN_IF_FAILED( RestoreAcDataFromBackup() ); NN_UTIL_RETURN_IF_FAILED( nn::fs::Unmount("data:") ); return nn::ResultSuccess(); } nn::Result AcChanger::CheckBackupFormat() { size_t maxFiles; size_t maxDirectories; bool isDuplicateAll; NN_UTIL_RETURN_IF_FAILED( nn::fs::GetSaveDataFormatInfo(&maxFiles, &maxDirectories, &isDuplicateAll) ); NN_LOG("MaxFile = %d, MaxDirectory = %d, Duplicate = %d\n", maxFiles, maxDirectories, isDuplicateAll); if(maxFiles != FILE_NUM || maxDirectories != DIR_NUM || isDuplicateAll != DUPLICATE ) { return nn::MakePermanentResult(nn::Result::SUMMARY_INVALID_STATE, nn::Result::MODULE_APPLICATION, nn::Result::DESCRIPTION_INVALID_RESULT_VALUE); } return nn::ResultSuccess(); } nn::Result AcChanger::ImportToBackup() { NN_UTIL_RETURN_IF_FAILED( GetAcData() ); // バックアップメモリをフォーマットします NN_UTIL_RETURN_IF_FAILED( nn::fs::FormatSaveData(FILE_NUM, DIR_NUM, DUPLICATE) ); NN_UTIL_RETURN_IF_FAILED( ImportAcDatatoBackup() ); return nn::ResultSuccess(); } nn::Result AcChanger::GetAcData() { nn::Result result; // インターネット接続設定取得 NN_UTIL_RETURN_IF_FAILED( nn::ac::CTR::InitializeInternal() ); ClearNetworkSettingCheck(); for (s32 i = 0; i < 3; i++) { result = nn::ac::CTR::LoadNetworkSetting(i, s_SaveData.m_NetworkSetting[i]); if (result.IsFailure()) { std::memset(&s_SaveData.m_NetworkSetting[i], 0, sizeof(s_SaveData.m_NetworkSetting[i])); } else { m_IsNetworkSettingValid[i] = true; } } NN_UTIL_RETURN_IF_FAILED( nn::ac::CTR::FinalizeInternal() ); // 設定が1つも書かれていない if(IsNetworkSettingAllInvalid()) { return nn::MakePermanentResult(nn::Result::SUMMARY_NOT_FOUND, nn::Result::MODULE_APPLICATION, nn::Result::DESCRIPTION_NOT_FOUND); } return nn::ResultSuccess(); } nn::Result AcChanger::ImportAcDatatoBackup() { NN_UTIL_RETURN_IF_FAILED( nn::fs::MountSaveData("data:") ); nn::fs::FileOutputStream file; NN_UTIL_RETURN_IF_FAILED( file.TryInitialize(L"data:/savedata.bin", true) ); s32 writeSize; NN_UTIL_RETURN_IF_FAILED( file.TryWrite(&writeSize, &s_SaveData, sizeof(s_SaveData), true) ); NN_UTIL_RETURN_IF_FAILED( nn::fs::CommitSaveData("data:") ); NN_UTIL_RETURN_IF_FAILED( nn::fs::Unmount("data:") ); return nn::ResultSuccess(); } nn::Result AcChanger::RestoreAcDataFromBackup() { nn::fs::FileInputStream file; NN_UTIL_RETURN_IF_FAILED( file.TryInitialize(L"data:/savedata.bin") ); s32 readSize; NN_UTIL_RETURN_IF_FAILED( file.TryRead(&readSize, &s_SaveData, sizeof(s_SaveData)) ); // インターネット接続設定 NN_UTIL_RETURN_IF_FAILED( nn::ac::CTR::InitializeInternal() ); for (s32 i = 0; i < 3; i++) { NN_UTIL_RETURN_IF_FAILED( nn::ac::CTR::UpdateNetworkSetting(i, s_SaveData.m_NetworkSetting[i]) ); } NN_UTIL_RETURN_IF_FAILED( nn::ac::CTR::FlushNetworkSetting() ); NN_UTIL_RETURN_IF_FAILED( nn::ac::CTR::FinalizeInternal() ); return nn::ResultSuccess(); } void AcChanger::ClearNetworkSettingCheck() { for(s32 i = 0; i < 3; i++) { m_IsNetworkSettingValid[i] = false; } } bool AcChanger::IsNetworkSettingAllInvalid() { if(!m_IsNetworkSettingValid[0] && !m_IsNetworkSettingValid[1] && !m_IsNetworkSettingValid[2]) { return true; } else { return false; } }