ctr_Repair/trunk/Initializer2ndNUP/AcChanger.cpp
N2614 05cf83f264 設定取り込み時にインターネット設定が空の場合エラーにするように
git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_Repair@762 385bec56-5757-e545-9c3a-d8741f4650f1
2013-11-18 02:22:18 +00:00

230 lines
5.5 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;
// インターネット接続設定取得
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;
}
}