ctr_Repair/trunk/Initializer2ndNUP/AcChanger.cpp
N2614 5d8ac9e88a インターネット設定をバックアップメモリに保存、バックアップメモリからの書き出しする機能を追加
git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_Repair@756 385bec56-5757-e545-9c3a-d8741f4650f1
2013-11-01 07:59:36 +00:00

206 lines
5.2 KiB
C++

/*---------------------------------------------------------------------------*
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 <nn/cfg.h>
#include <nn/cfg/CTR/cfg_ApiSys.h>
#include <nn/cfg/CTR/detail/cfg_Keys.h>
#include <nn/cfg/CTR/detail/cfg_DataStructures.h>
#include <nn/cfg/CTR/cfg_NtrSettings.h>
#include <nn/cfg/CTR/cfg_ApiNor.h>
#include <nn/ac/CTR/private/ac_InternalApi.h>
#include <nn/ac/CTR/private/ac_NetworkSetting.h>
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;
// インターネット接続設定取得
result = nn::ac::CTR::InitializeInternal();
if (result.IsSuccess())
{
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]));
}
}
NN_UTIL_RETURN_IF_FAILED(
nn::ac::CTR::FinalizeInternal()
);
}
else
{
std::memset(s_SaveData.m_NetworkSetting, 0, sizeof(s_SaveData.m_NetworkSetting));
}
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::Result result = nn::ac::CTR::InitializeInternal();
if (result.IsSuccess())
{
for(s32 i = 0; i < 3; i++)
{
result = nn::ac::CTR::UpdateNetworkSetting(i, s_SaveData.m_NetworkSetting[i]);
if(result.IsFailure())
{
std::memset(&s_SaveData.m_NetworkSetting[i], 0 , sizeof(s_SaveData.m_NetworkSetting[i]));
}
}
NN_UTIL_RETURN_IF_FAILED(
nn::ac::CTR::FlushNetworkSetting()
);
NN_UTIL_RETURN_IF_FAILED(
nn::ac::CTR::FinalizeInternal()
);
}
else
{
std::memset(s_SaveData.m_NetworkSetting, 0, sizeof(s_SaveData.m_NetworkSetting));
}
return nn::ResultSuccess();
}