mirror of
https://github.com/rvtr/ctr_Repair.git
synced 2025-10-31 13:51:08 -04:00
git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_Repair@682 385bec56-5757-e545-9c3a-d8741f4650f1
2513 lines
84 KiB
C++
2513 lines
84 KiB
C++
/*!
|
||
@file sysUserInfoAccessor.cpp
|
||
@brief ユーザ情報アクセサ
|
||
*/
|
||
#ifndef MAKE_AREACHECK
|
||
|
||
//#include "sys.h"
|
||
#include "sysHeap.h"
|
||
|
||
#include "sysUserInfoAccessor.h"
|
||
//#include "sysKeyboardManager.h"
|
||
//#include "sysSystem.h"
|
||
#include "sysFile.h"
|
||
#include "sysInput.h"
|
||
|
||
//#include "sceneOtherThread.h"
|
||
//#include "sceneDataTable.h"
|
||
|
||
//#include "ImageDb.h"
|
||
|
||
#include <nn/cfg/CTR/cfg_ApiInit.h>
|
||
#include <nn/pl/CTR/pl_SharedDataTitleId.h>
|
||
#include <nn/news_System.h>
|
||
#include <nn/news/CTR/system/news_BossUtil.h>
|
||
#include <nn/hid/CTR/hid_SoundVolume.h>
|
||
#include <nn/boss/boss_UploadAction.h>
|
||
#include <nn/boss/private/boss_PrivilegedLib.h>
|
||
#include <nn/ndm.h>
|
||
#include <nn/ssl/ssl_Const.h>
|
||
#include <nn/cfg/CTR/cfg_ApiSys.h>
|
||
|
||
#ifndef NW_RELEASE
|
||
//#include "sceneDebugLayout.h"
|
||
#endif
|
||
|
||
#define MOUNT_SHARED_AREA
|
||
#define MOUNT_SHARED_EULA
|
||
|
||
#include "syokaikidou.h"
|
||
|
||
namespace sys
|
||
{
|
||
|
||
//==========================================================================
|
||
//
|
||
//==========================================================================
|
||
const nn::ProgramId cSharedAreaId[] =
|
||
{
|
||
nn::pl::CTR::SHAREDDATA_TITLEID_COUNTRY_REGION,
|
||
};
|
||
|
||
#ifdef MOUNT_SHARED_AREA
|
||
|
||
static const char* cSharedCountryFile[] =
|
||
{
|
||
"area:/JP/country_LZ.bin",
|
||
"area:/US/country_LZ.bin",
|
||
"area:/EU/country_LZ.bin",
|
||
"area:/EU/country_LZ.bin",
|
||
"area:/CN/country_LZ.bin",
|
||
"area:/KR/country_LZ.bin",
|
||
"area:/TW/country_LZ.bin",
|
||
};
|
||
|
||
static const char* cSharedAreaFile[] =
|
||
{
|
||
"area:/JP/%d_LZ.bin",
|
||
"area:/US/%d_LZ.bin",
|
||
"area:/EU/%d_LZ.bin",
|
||
"area:/EU/%d_LZ.bin",
|
||
"area:/CN/%d_LZ.bin",
|
||
"area:/KR/%d_LZ.bin",
|
||
"area:/TW/%d_LZ.bin",
|
||
};
|
||
|
||
#else
|
||
// 共有データにするとき不要
|
||
static const char* cCountryFile[] =
|
||
{
|
||
"rom:/country/JP/country_LZ.bin",
|
||
"rom:/country/US/country_LZ.bin",
|
||
"rom:/country/EU/country_LZ.bin",
|
||
"rom:/country/EU/country_LZ.bin",
|
||
"rom:/country/CN/country_LZ.bin",
|
||
"rom:/country/KR/country_LZ.bin",
|
||
"rom:/country/TW/country_LZ.bin",
|
||
};
|
||
|
||
static const char* cAreaFile[] =
|
||
{
|
||
"rom:/country/JP/%d_LZ.bin",
|
||
"rom:/country/US/%d_LZ.bin",
|
||
"rom:/country/EU/%d_LZ.bin",
|
||
"rom:/country/EU/%d_LZ.bin",
|
||
"rom:/country/CN/%d_LZ.bin",
|
||
"rom:/country/KR/%d_LZ.bin",
|
||
"rom:/country/TW/%d_LZ.bin",
|
||
};
|
||
#endif
|
||
|
||
#ifdef MOUNT_SHARED_EULA
|
||
const nn::ProgramId cSharedEulaId[] =
|
||
{
|
||
nn::pl::CTR::SHAREDDATA_TITLEID_EULA_JP,
|
||
nn::pl::CTR::SHAREDDATA_TITLEID_EULA_US,
|
||
nn::pl::CTR::SHAREDDATA_TITLEID_EULA_EU,
|
||
nn::pl::CTR::SHAREDDATA_TITLEID_EULA_EU,
|
||
nn::pl::CTR::SHAREDDATA_TITLEID_EULA_CN,
|
||
nn::pl::CTR::SHAREDDATA_TITLEID_EULA_KR,
|
||
nn::pl::CTR::SHAREDDATA_TITLEID_EULA_TW,
|
||
};
|
||
#else
|
||
static const char* cEulaCountry[] =
|
||
{
|
||
"rom:/eula/JP/country.bin",
|
||
"rom:/eula/US/country.bin",
|
||
"rom:/eula/EU/country.bin",
|
||
"rom:/eula/EU/country.bin",
|
||
"rom:/eula/CN/country.bin",
|
||
"rom:/eula/KR/country.bin",
|
||
"rom:/eula/TW/country.bin",
|
||
};
|
||
#endif
|
||
|
||
|
||
//----------------------------------------------------------------
|
||
// TWLでユーザ名、コメントとして入力可能な文字コードリスト
|
||
const u16 cTwlUserInfoFontCodeTable[] =
|
||
{
|
||
0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,
|
||
0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,
|
||
0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,
|
||
0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F,
|
||
0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,
|
||
0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,
|
||
0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,
|
||
0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,
|
||
0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,
|
||
0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,
|
||
0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,
|
||
0x0078,0x0079,0x007A,0x007B,0x007D,0x007E,0x00A1,0x00A2,
|
||
0x00A3,0x00A9,0x00AE,0x00B0,0x00B1,0x00BF,0x00C0,0x00C1,
|
||
0x00C2,0x00C4,0x00C7,0x00C8,0x00C9,0x00CA,0x00CB,0x00CC,
|
||
0x00CD,0x00CE,0x00CF,0x00D1,0x00D2,0x00D3,0x00D4,0x00D6,
|
||
0x00D7,0x00D9,0x00DA,0x00DB,0x00DC,0x00DF,0x00E0,0x00E1,
|
||
0x00E2,0x00E4,0x00E7,0x00E8,0x00E9,0x00EA,0x00EB,0x00EC,
|
||
0x00ED,0x00EE,0x00EF,0x00F1,0x00F2,0x00F3,0x00F4,0x00F6,
|
||
0x00F7,0x00F9,0x00FA,0x00FB,0x00FC,0x0152,0x0153,0x02C6,
|
||
0x02DC,0x201C,0x201D,0x2022,0x2026,0x2033,0x203B,0x20AC,
|
||
0x2122,0x2190,0x2191,0x2192,0x2193,0x221E,0x2234,0x25A0,
|
||
0x25A1,0x25B2,0x25B3,0x25BC,0x25BD,0x25C6,0x25C7,0x25CB,
|
||
0x25CE,0x25CF,0x2605,0x2606,0x266A,0x266D,0x3000,0x3001,
|
||
0x3002,0x300C,0x300D,0x3012,0x3041,0x3042,0x3043,0x3044,
|
||
0x3045,0x3046,0x3047,0x3048,0x3049,0x304A,0x304B,0x304C,
|
||
0x304D,0x304E,0x304F,0x3050,0x3051,0x3052,0x3053,0x3054,
|
||
0x3055,0x3056,0x3057,0x3058,0x3059,0x305A,0x305B,0x305C,
|
||
0x305D,0x305E,0x305F,0x3060,0x3061,0x3062,0x3063,0x3064,
|
||
0x3065,0x3066,0x3067,0x3068,0x3069,0x306A,0x306B,0x306C,
|
||
0x306D,0x306E,0x306F,0x3070,0x3071,0x3072,0x3073,0x3074,
|
||
0x3075,0x3076,0x3077,0x3078,0x3079,0x307A,0x307B,0x307C,
|
||
0x307D,0x307E,0x307F,0x3080,0x3081,0x3082,0x3083,0x3084,
|
||
0x3085,0x3086,0x3087,0x3088,0x3089,0x308A,0x308B,0x308C,
|
||
0x308D,0x308E,0x308F,0x3092,0x3093,0x30A1,0x30A2,0x30A3,
|
||
0x30A4,0x30A5,0x30A6,0x30A7,0x30A8,0x30A9,0x30AA,0x30AB,
|
||
0x30AC,0x30AD,0x30AE,0x30AF,0x30B0,0x30B1,0x30B2,0x30B3,
|
||
0x30B4,0x30B5,0x30B6,0x30B7,0x30B8,0x30B9,0x30BA,0x30BB,
|
||
0x30BC,0x30BD,0x30BE,0x30BF,0x30C0,0x30C1,0x30C2,0x30C3,
|
||
0x30C4,0x30C5,0x30C6,0x30C7,0x30C8,0x30C9,0x30CA,0x30CB,
|
||
0x30CC,0x30CD,0x30CE,0x30CF,0x30D0,0x30D1,0x30D2,0x30D3,
|
||
0x30D4,0x30D5,0x30D6,0x30D7,0x30D8,0x30D9,0x30DA,0x30DB,
|
||
0x30DC,0x30DD,0x30DE,0x30DF,0x30E0,0x30E1,0x30E2,0x30E3,
|
||
0x30E4,0x30E5,0x30E6,0x30E7,0x30E8,0x30E9,0x30EA,0x30EB,
|
||
0x30EC,0x30ED,0x30EE,0x30EF,0x30F2,0x30F3,0x30F4,0x30F5,
|
||
0x30F6,0x30FC,0xE000,0xE001,0xE002,0xE003,0xE004,0xE005,
|
||
0xE006,0xE007,0xE008,0xE009,0xE00A,0xE00B,0xE00C,0xE00D,
|
||
0xE00E,0xE00F,0xE010,0xE011,0xE012,0xE013,0xE015,0xE016,
|
||
0xE017,0xE018,0xE019,0xE01A,0xE01B,0xE01C,0xE028,0xFF01,
|
||
0xFF0F,0xFF1F,0xFF3C,0xFF3E,0xFF5B,0xFF5C,0xFF5D,0xFF5E
|
||
}; //計392文字
|
||
|
||
//----------------------------------------------------------------
|
||
// BOSS へ情報を送信する際のタスクID
|
||
static const char* cSendBossInfoTaskId = "sendcfg";
|
||
static const char* cSendBossMmenTaskId = "sendmgn";
|
||
static const char* cSendPhuTaskId = "phu";
|
||
static const char* cSendTiuTaskId = "tiu";
|
||
static const char* cSendSpluTaskId = "splu";
|
||
static const char* cSendBossPnoteTaskId = "URUP";
|
||
|
||
//*********************************************************************************
|
||
// 変数
|
||
//*********************************************************************************
|
||
FirstInfo UserInfoAccessor::msFirst; // 初回起動用フラグ
|
||
|
||
UserInfo UserInfoAccessor::msUserInfo; // 更新中のデータ
|
||
UserInfo UserInfoAccessor::msBackupUserInfo; // リセット用のバックアップデータ
|
||
|
||
TwlInfo UserInfoAccessor::msTwlInfo;
|
||
TwlInfo UserInfoAccessor::msBackupTwlInfo;
|
||
|
||
TwlInfo2 UserInfoAccessor::msTwlInfo2;
|
||
TwlInfo2 UserInfoAccessor::msBackupTwlInfo2;
|
||
|
||
WorkInfo UserInfoAccessor::msWorkInfo;
|
||
WorkInfo UserInfoAccessor::msBackupWorkInfo;
|
||
|
||
nn::cfg::CTR::ParentalControlInfo UserInfoAccessor::msParentInfo;
|
||
nn::cfg::CTR::ParentalControlInfo UserInfoAccessor::msBackupParentInfo;
|
||
|
||
nn::cfg::CTR::detail::CoppacsCfgData UserInfoAccessor::msCoppaInfo;
|
||
nn::cfg::CTR::detail::CoppacsCfgData UserInfoAccessor::msBackupCoppaInfo;
|
||
|
||
nn::cfg::CTR::detail::FirstLaunchInfoCfgData UserInfoAccessor::msFirstInfo;
|
||
|
||
NetInfo UserInfoAccessor::msNetInfo;
|
||
NetInfo UserInfoAccessor::msBackupNetInfo;
|
||
|
||
int UserInfoAccessor::msAccNum = -1; // 接続先
|
||
int UserInfoAccessor::msTmpNum; // 設定先
|
||
|
||
BossSendInfo UserInfoAccessor::msBossSendInfo;
|
||
|
||
u32 UserInfoAccessor::msDirty = 0;
|
||
|
||
u16 UserInfoAccessor::msCountryNum = 1;
|
||
|
||
u8* UserInfoAccessor::mpSharedAreaBuf = NULL;
|
||
|
||
bool UserInfoAccessor::msIsNetSave;
|
||
bool UserInfoAccessor::msIsCoppa = false;
|
||
|
||
// スライダーバーで使用する要素
|
||
wchar_t UserInfoAccessor::msSlideStr[UserInfoAccessor::eFactNum][UserInfoAccessor::eStrSize];
|
||
|
||
const wchar_t* UserInfoAccessor::mspSlideFact[UserInfoAccessor::eFactNum] =
|
||
{
|
||
msSlideStr[0], msSlideStr[1], msSlideStr[2], msSlideStr[3], msSlideStr[4],
|
||
msSlideStr[5], msSlideStr[6], msSlideStr[7], msSlideStr[8], msSlideStr[9],
|
||
msSlideStr[10], msSlideStr[11], msSlideStr[12], msSlideStr[13], msSlideStr[14],
|
||
msSlideStr[15], msSlideStr[16], msSlideStr[17], msSlideStr[18], msSlideStr[19],
|
||
msSlideStr[20], msSlideStr[21], msSlideStr[22], msSlideStr[23], msSlideStr[24],
|
||
msSlideStr[25], msSlideStr[26], msSlideStr[27], msSlideStr[28], msSlideStr[29],
|
||
msSlideStr[30], msSlideStr[31], msSlideStr[32], msSlideStr[33], msSlideStr[34],
|
||
msSlideStr[35], msSlideStr[36], msSlideStr[37], msSlideStr[38], msSlideStr[39],
|
||
msSlideStr[40], msSlideStr[41], msSlideStr[42], msSlideStr[43], msSlideStr[44],
|
||
msSlideStr[45], msSlideStr[46], msSlideStr[47], msSlideStr[48], msSlideStr[49],
|
||
msSlideStr[50], msSlideStr[51], msSlideStr[52], msSlideStr[53], msSlideStr[54],
|
||
msSlideStr[55], msSlideStr[56], msSlideStr[57], msSlideStr[58], msSlideStr[59],
|
||
msSlideStr[60], msSlideStr[61], msSlideStr[62], msSlideStr[63], msSlideStr[64],
|
||
msSlideStr[65], msSlideStr[66], msSlideStr[67], msSlideStr[68], msSlideStr[69],
|
||
msSlideStr[70], msSlideStr[71], msSlideStr[72], msSlideStr[73], msSlideStr[74],
|
||
msSlideStr[75], msSlideStr[76], msSlideStr[77], msSlideStr[78], msSlideStr[79],
|
||
msSlideStr[80], msSlideStr[81], msSlideStr[82], msSlideStr[83], msSlideStr[84],
|
||
msSlideStr[85], msSlideStr[86], msSlideStr[87], msSlideStr[88], msSlideStr[89],
|
||
msSlideStr[90], msSlideStr[91], msSlideStr[92], msSlideStr[93], msSlideStr[94],
|
||
msSlideStr[95], msSlideStr[96], msSlideStr[97], msSlideStr[98], msSlideStr[99],
|
||
};
|
||
|
||
|
||
//*********************************************************************************
|
||
// 初期化
|
||
//*********************************************************************************
|
||
//==========================================================================
|
||
//
|
||
//==========================================================================
|
||
void UserInfoAccessor::init( int flg )
|
||
{
|
||
NN_PANIC("comment out function, %s:%d", __func__, __LINE__);
|
||
NN_UNUSED_VAR(flg);
|
||
#if 0
|
||
int event = eUserInfo_Save1;
|
||
|
||
// 各Infoのクリア
|
||
memset( &msUserInfo, 0, sizeof( msUserInfo ) );
|
||
memset( &msTwlInfo, 0, sizeof( msTwlInfo ) );
|
||
memset( &msTwlInfo2, 0, sizeof( msTwlInfo2 ) );
|
||
memset( &msParentInfo, 0, sizeof( msParentInfo ) );
|
||
memset( &msCoppaInfo, 0, sizeof( msCoppaInfo ) );
|
||
memset( &msNetInfo, 0, sizeof( msNetInfo ) );
|
||
memset( &msWorkInfo, 0, sizeof( msWorkInfo ) );
|
||
memset( &msFirst, 0, sizeof( msFirst ) );
|
||
|
||
msDirty = eNoneInfo;
|
||
msIsNetSave = true;
|
||
|
||
if( flg == 0 )
|
||
{
|
||
// リージョン
|
||
{
|
||
System::set_region_( nn::cfg::CTR::GetRegion() );
|
||
System::set_language_( nn::cfg::CTR::GetLanguage() );
|
||
}
|
||
|
||
// 初回起動フラグのload
|
||
data_user_info_( eKindFirst, 0 );
|
||
}
|
||
|
||
check_first_set_();
|
||
|
||
if( msFirstInfo.mmen == 0 ) // 初回起動のとき
|
||
{
|
||
// 初回起動用パラメータ
|
||
setFirstParam();
|
||
|
||
event = eUserInfo_Save2;
|
||
}
|
||
#ifndef NW_RELEASE
|
||
else
|
||
{
|
||
// (デバッグ機能)初回起動をしないでMSETに入ったときのため
|
||
{
|
||
if( wcslen( msUserInfo.usr_name.userName.userName ) == 0 )
|
||
{
|
||
swprintf( msUserInfo.usr_name.userName.userName, 11, L"USER_NAME" );
|
||
}
|
||
|
||
if( msUserInfo.usr_birthday.month == 0 )
|
||
{
|
||
msUserInfo.usr_birthday.month = 1;
|
||
msUserInfo.usr_birthday.day = 1;
|
||
}
|
||
|
||
if( msUserInfo.usr_address.regionName[0][0] == L'\0' )
|
||
{
|
||
swprintf( msUserInfo.usr_address.regionName[0], 10, L"-" );
|
||
}
|
||
}
|
||
}
|
||
|
||
//フォントテーブルが昇順で並んでいることを確認する
|
||
NN_ASSERT(check_order_twl_user_info_font_table_());
|
||
#endif
|
||
|
||
set_country_info_();
|
||
|
||
msDirty = eAllInfo;
|
||
|
||
// 初回起動のときは通信系プロセスが起動してないので、その部分を書き込まない
|
||
if( msFirstInfo.mmen == 0 ) msDirty &= ~eNetInfo;
|
||
|
||
eventProc( event );
|
||
#endif
|
||
}
|
||
|
||
|
||
//==========================================================================
|
||
// 破棄
|
||
//==========================================================================
|
||
void UserInfoAccessor::destroy()
|
||
{
|
||
delete mpSharedAreaBuf;
|
||
}
|
||
|
||
|
||
//==========================================================================
|
||
// 共有データの読み込み
|
||
// flg : 0 国データ、1 地域データ
|
||
//==========================================================================
|
||
u8* UserInfoAccessor::readCountryData( int flg )
|
||
{
|
||
NN_PANIC("comment out function, %s:%d", __func__, __LINE__);
|
||
NN_UNUSED_VAR(flg);
|
||
return NULL;
|
||
#if 0
|
||
u8* p_data = NULL;
|
||
u8* mount_buf = NULL;
|
||
u32 size;
|
||
|
||
#ifdef MOUNT_SHARED_AREA
|
||
mount_buf = sys::File::mountShare( "area:", cSharedAreaId[0], 0, 200, 10 );
|
||
|
||
if( mount_buf != NULL )
|
||
{
|
||
NN_LOG( "area data mount\n" );
|
||
}
|
||
|
||
if( flg == 0 )
|
||
{
|
||
p_data = sys::File::readLZ( cSharedCountryFile[System::getRegion()], &size );
|
||
}
|
||
else
|
||
{
|
||
char file[40] = "";
|
||
|
||
UT_SPRINTF( file, cSharedAreaFile[System::getRegion()], msWorkInfo.country_id );
|
||
p_data = sys::File::readLZ( file, &size );
|
||
|
||
NN_LOG( "file %s\n", file );
|
||
}
|
||
|
||
nn::fs::Unmount( "area:" );
|
||
delete []mount_buf;
|
||
#else
|
||
if( flg == 0 )
|
||
{
|
||
p_data = sys::File::readLZ( cCountryFile[System::getRegion()], &size );
|
||
}
|
||
else
|
||
{
|
||
char file[40] = "";
|
||
|
||
UT_SPRINTF( file, cAreaFile[System::getRegion()], msWorkInfo.country_id );
|
||
p_data = sys::File::readLZ( file, &size );
|
||
|
||
NN_LOG( "file %s\n", file );
|
||
}
|
||
|
||
#endif
|
||
return p_data;
|
||
#endif
|
||
}
|
||
|
||
|
||
//==========================================================================
|
||
// 初回起動チェック
|
||
//==========================================================================
|
||
void UserInfoAccessor::check_first_set_()
|
||
{
|
||
NN_PANIC("comment out function, %s:%d", __func__, __LINE__);
|
||
#if 0
|
||
#ifdef MAKE_ACCTEST
|
||
// 接続検証
|
||
{
|
||
// ユーザー情報をNANDから読み込み
|
||
for( int i = eKindUserName; i <= eKindDsEula; i++ )
|
||
{
|
||
data_user_info_( i, 0 );
|
||
}
|
||
|
||
// ネット設定
|
||
{
|
||
nn::ac::InitializeInternal();
|
||
nn::ac::LoadNetworkSetting( 0, msNetInfo.setting[0] );
|
||
nn::ac::LoadNetworkSetting( 1, msNetInfo.setting[1] );
|
||
nn::ac::LoadNetworkSetting( 2, msNetInfo.setting[2] );
|
||
nn::ac::FinalizeInternal();
|
||
|
||
#ifndef NW_RELEASE
|
||
print_net_save_(); // ネットワーク設定のNAND内容をデバッグ表示
|
||
#endif
|
||
}
|
||
|
||
setFirstAll( true );
|
||
|
||
msBackupUserInfo = msUserInfo;
|
||
msBackupTwlInfo = msTwlInfo;
|
||
msBackupTwlInfo2 = msTwlInfo2;
|
||
msBackupParentInfo = msParentInfo;
|
||
msBackupCoppaInfo = msCoppaInfo;
|
||
msBackupNetInfo = msNetInfo;
|
||
msBackupWorkInfo = msWorkInfo;
|
||
}
|
||
#else
|
||
// MSET
|
||
if( msFirstInfo.mmen == 0 ) // 初回起動のとき
|
||
{
|
||
ProcessManager::rejectPowerBtn( true );
|
||
ProcessManager::rejectSleep( true );
|
||
|
||
setFirstAll( false );
|
||
|
||
if( System::isSafeMode() )
|
||
{
|
||
msIsNetSave = false;
|
||
}
|
||
|
||
// TWLの初期化
|
||
{
|
||
scene::OtherFnc::ClearNorSetting(); // 通信プロセス起動前にNORをクリアする
|
||
|
||
data_user_info_( eKindDsData, 0 );
|
||
}
|
||
|
||
// ネット設定初期化はDaemon類が起動してないので後回しにします
|
||
|
||
// ImageDbの初期化処理
|
||
{
|
||
imgdb::Result result = imgdb::SetupTwlNand( System::getSdkAllocator() );
|
||
|
||
if( result == imgdb::ResultSuccess )
|
||
{
|
||
// 初期化成功
|
||
NN_LOG( "ImageDb Initialize Success\n" );
|
||
}
|
||
else
|
||
{
|
||
// ここに来た場合は致命的なエラー
|
||
// NANDなどが壊れていたりするとこの結果になるかもしれません
|
||
// 詳細は未定
|
||
// NN_PANIC( "Error! Result=%d\n", result );
|
||
NN_WARNING( false, "Error! Result = %d\n", result);
|
||
}
|
||
}
|
||
|
||
NN_LOG( "first boot( 0 )\n" );
|
||
}
|
||
else // 初回起動が終わっているとき
|
||
{
|
||
// ユーザー情報をNANDから読み込み
|
||
for( int i = eKindUserName; i <= eKindDsEula; i++ )
|
||
{
|
||
if( i != eKindCoppa )
|
||
{
|
||
data_user_info_( i, 0 );
|
||
}
|
||
}
|
||
|
||
// ネット設定
|
||
{
|
||
nn::ac::InitializeInternal();
|
||
nn::ac::LoadNetworkSetting( 0, msNetInfo.setting[0] );
|
||
nn::ac::LoadNetworkSetting( 1, msNetInfo.setting[1] );
|
||
nn::ac::LoadNetworkSetting( 2, msNetInfo.setting[2] );
|
||
nn::ac::FinalizeInternal();
|
||
}
|
||
|
||
setFirstAll( true );
|
||
|
||
msBackupUserInfo = msUserInfo;
|
||
msBackupTwlInfo = msTwlInfo;
|
||
msBackupTwlInfo2 = msTwlInfo2;
|
||
msBackupParentInfo = msParentInfo;
|
||
msBackupNetInfo = msNetInfo;
|
||
msBackupWorkInfo = msWorkInfo;
|
||
}
|
||
|
||
// COPPACSは必ずロードする
|
||
{
|
||
// COPPACSは必要な国か?
|
||
setCoppacs();
|
||
|
||
// Coppaは必ずloadする
|
||
data_user_info_( eKindCoppa, 0 );
|
||
|
||
msBackupCoppaInfo = msCoppaInfo;
|
||
}
|
||
#endif
|
||
#endif
|
||
}
|
||
|
||
|
||
//==========================================================================
|
||
// 初回起動時の国情報の読み込み
|
||
//==========================================================================
|
||
void UserInfoAccessor::set_country_info_()
|
||
{
|
||
NN_PANIC("comment out function, %s:%d", __func__, __LINE__);
|
||
#if 0
|
||
u8* mount_buf = NULL;
|
||
|
||
{
|
||
u8* p_data = readCountryData( 0 );
|
||
int* p_data1 = reinterpret_cast<int*>( p_data );
|
||
int cid = msUserInfo.usr_address.id>>24;
|
||
|
||
msCountryNum = *p_data1++;
|
||
|
||
if( msCountryNum == 1 ) // 国が1つのときは、最初に国情報をセーブしておく
|
||
{
|
||
CountryInfo* p_country = reinterpret_cast<CountryInfo*>( p_data1 );
|
||
int id = (p_country->id)>>24;
|
||
|
||
msWorkInfo.country_id = id;
|
||
msWorkInfo.area_num = p_country->numRegion;
|
||
|
||
if( id != cid )
|
||
{
|
||
msUserInfo.usr_address.id = (id<<24);
|
||
|
||
for( int i = 0; i < eAddrLangageNum; i++ )
|
||
{
|
||
swprintf( msUserInfo.usr_address.countryName[i],
|
||
eAddrNameLength, (const wchar_t*)p_country->countryName[i] );
|
||
}
|
||
|
||
if( p_country->newEntry )
|
||
{
|
||
msTwlInfo2.ds_country.country = nn::cfg::CTR::CFG_COUNTRY_OTHERS;
|
||
}
|
||
else
|
||
{
|
||
msTwlInfo2.ds_country.country = (u8)id;
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
CountryInfo* p_country = reinterpret_cast<CountryInfo*>( p_data1 );
|
||
int id;
|
||
|
||
for( int i = 0; i < msCountryNum; i++ )
|
||
{
|
||
id = (p_country->id)>>24;
|
||
|
||
if( id == cid )
|
||
{
|
||
msWorkInfo.country_id = id;
|
||
msWorkInfo.area_num = p_country->numRegion;
|
||
break;
|
||
}
|
||
p_country++;
|
||
}
|
||
}
|
||
|
||
delete []p_data;
|
||
}
|
||
|
||
// 1言語しかないリージョンのとき
|
||
switch( System::getRegion() )
|
||
{
|
||
case nn::cfg::CTR::CFG_REGION_JAPAN:
|
||
msUserInfo.usr_language.languageCode = nn::cfg::CTR::CFG_LANGUAGE_JAPANESE;
|
||
msTwlInfo.ds_data.option.language = nn::cfg::CTR::CFG_LANGUAGE_JAPANESE;
|
||
msTwlInfo.ds_data_ex.language = nn::cfg::CTR::CFG_LANGUAGE_JAPANESE;
|
||
break;
|
||
|
||
case nn::cfg::CTR::CFG_REGION_CHINA:
|
||
msUserInfo.usr_language.languageCode = nn::cfg::CTR::CFG_LANGUAGE_SIMP_CHINESE;
|
||
msTwlInfo.ds_data.option.language = nn::cfg::CTR::CFG_LANGUAGE_ENGLISH;
|
||
msTwlInfo.ds_data_ex.language = nn::cfg::CTR::CFG_LANGUAGE_SIMP_CHINESE;
|
||
break;
|
||
|
||
case nn::cfg::CTR::CFG_REGION_KOREA:
|
||
msUserInfo.usr_language.languageCode = nn::cfg::CTR::CFG_LANGUAGE_KOREAN;
|
||
msTwlInfo.ds_data.option.language = nn::cfg::CTR::CFG_LANGUAGE_ENGLISH;
|
||
msTwlInfo.ds_data_ex.language = nn::cfg::CTR::CFG_LANGUAGE_KOREAN;
|
||
break;
|
||
|
||
case nn::cfg::CTR::CFG_REGION_TAIWAN:
|
||
if( msFirstInfo.mmen == 0 ) // 初回起動のとき
|
||
{
|
||
msUserInfo.usr_language.languageCode = nn::cfg::CTR::CFG_LANGUAGE_TRAD_CHINESE;
|
||
msTwlInfo.ds_data.option.language = nn::cfg::CTR::CFG_LANGUAGE_JAPANESE;
|
||
msTwlInfo.ds_data_ex.language = nn::cfg::CTR::CFG_LANGUAGE_JAPANESE;
|
||
}
|
||
break;
|
||
|
||
// US・EUリージョン
|
||
default:
|
||
if( msFirstInfo.mmen == 0 ) // 初回起動のとき
|
||
{
|
||
msUserInfo.usr_language.languageCode = nn::cfg::CTR::CFG_LANGUAGE_ENGLISH;
|
||
msTwlInfo.ds_data.option.language = nn::cfg::CTR::CFG_LANGUAGE_ENGLISH;
|
||
msTwlInfo.ds_data_ex.language = nn::cfg::CTR::CFG_LANGUAGE_ENGLISH;
|
||
}
|
||
break;
|
||
}
|
||
#endif
|
||
}
|
||
|
||
|
||
//==========================================================================
|
||
// 初回起動用パラメータ
|
||
//==========================================================================
|
||
void UserInfoAccessor::setFirstParam()
|
||
{
|
||
msUserInfo.usr_sound.soundOutputMode = nn::cfg::CFG_SOUND_OUTPUT_MODE_SURROUND;
|
||
|
||
msUserInfo.usr_birthday.month = 1;
|
||
msUserInfo.usr_birthday.day = 1;
|
||
|
||
msTwlInfo.ds_data.owner.birthday.month = 1;
|
||
msTwlInfo.ds_data.owner.birthday.day = 1;
|
||
|
||
msTwlInfo.ds_data.owner.userColor = 15;
|
||
|
||
msTwlInfo.ds_data.option.isSetBirthday = 1;
|
||
msTwlInfo.ds_data.option.isSetUserColor = 1;
|
||
msTwlInfo.ds_data.option.isSetLanguage = 1;
|
||
msTwlInfo.ds_data.option.isSetNickname = 1;
|
||
|
||
msTwlInfo2.ds_eula.agreeEulaVersion = 0xff;
|
||
|
||
msWorkInfo.time[0] = 10;
|
||
msWorkInfo.time[1] = 0;
|
||
|
||
switch( System::getRegion() )
|
||
{
|
||
case nn::cfg::CTR::CFG_REGION_CHINA:
|
||
case nn::cfg::CTR::CFG_REGION_KOREA:
|
||
case nn::cfg::CTR::CFG_REGION_TAIWAN:
|
||
msWorkInfo.date[0] = 12;
|
||
break;
|
||
|
||
default:
|
||
msWorkInfo.date[0] = 11;
|
||
break;
|
||
}
|
||
|
||
msWorkInfo.date[1] = 1;
|
||
msWorkInfo.date[2] = 1;
|
||
}
|
||
|
||
|
||
//==========================================================================
|
||
// 初回起動フラグのセット・リセット
|
||
//==========================================================================
|
||
void UserInfoAccessor::setFirstAll( bool set )
|
||
{
|
||
if( set )
|
||
{
|
||
msFirstInfo.mmen = 1;
|
||
|
||
msFirst.end = 1;
|
||
msFirst.langage = 1;
|
||
msFirst.date = 1;
|
||
msFirst.time = 1;
|
||
|
||
msFirst.name = 1;
|
||
msFirst.birthday = 1;
|
||
msFirst.country = 1;
|
||
msFirst.area = 1;
|
||
|
||
msFirst.view = 1;
|
||
msFirst.eula = 1;
|
||
}
|
||
else
|
||
{
|
||
memset( &msFirstInfo, 0, sizeof( msFirstInfo ) );
|
||
memset( &msFirst, 0, sizeof( msFirst ) );
|
||
}
|
||
}
|
||
|
||
|
||
//*********************************************************************************
|
||
// イベント
|
||
//*********************************************************************************
|
||
void UserInfoAccessor::eventProc( int info_event )
|
||
{
|
||
NN_PANIC("comment out function, %s:%d", __func__, __LINE__);
|
||
NN_UNUSED_VAR(info_event);
|
||
#if 0
|
||
int type = 1;
|
||
bool lang_change = false;
|
||
|
||
switch( info_event )
|
||
{
|
||
case eUserInfo_Save2:
|
||
type = 2;
|
||
|
||
case eUserInfo_Save:
|
||
case eUserInfo_Save1:
|
||
if( msDirty > 0 )
|
||
{
|
||
bool nand_write = false;
|
||
bool cop_check = false;
|
||
|
||
if( msDirty & eUserInfo )
|
||
{
|
||
bool save = false;
|
||
|
||
// ユーザー情報のNAND書き込み
|
||
for( int i = eKindUserName; i <= eKindSound; i++ )
|
||
{
|
||
if( data_user_info_( i, type ) )
|
||
{
|
||
save = true;
|
||
|
||
if( i == eKindAddressCountry )
|
||
{
|
||
setBossTask();
|
||
cop_check = true;
|
||
}
|
||
else if( i == eKindLanguage )
|
||
{
|
||
System::set_language_( msUserInfo.usr_language.languageCode );
|
||
|
||
if( System::getRegion() == nn::cfg::CTR::CFG_REGION_TAIWAN )
|
||
{
|
||
scene::Table::adjustSmngTable();
|
||
}
|
||
|
||
setBossTask();
|
||
lang_change = true;
|
||
}
|
||
}
|
||
}
|
||
|
||
if( save )
|
||
{
|
||
nand_write = true;
|
||
NN_LOG( "Save UserInfo\n" );
|
||
}
|
||
|
||
msBackupUserInfo = msUserInfo;
|
||
}
|
||
|
||
if( msDirty & eTwlInfo )
|
||
{
|
||
if( data_user_info_( eKindDsData, type ) )
|
||
{
|
||
NN_LOG( "Save TwlInfo\n" );
|
||
}
|
||
|
||
msBackupTwlInfo = msTwlInfo;
|
||
}
|
||
|
||
if( msDirty & eTwlInfo2 )
|
||
{
|
||
bool save = false;
|
||
|
||
for( int i = eKindDsCountry; i <= eKindDsEula; i++ )
|
||
{
|
||
if( data_user_info_( i, type ) )
|
||
{
|
||
save = true;
|
||
}
|
||
}
|
||
|
||
if( save )
|
||
{
|
||
nand_write = true;
|
||
NN_LOG( "Save TwlInfo2\n" );
|
||
}
|
||
|
||
msBackupTwlInfo2 = msTwlInfo2;
|
||
}
|
||
|
||
if( msDirty & eNetInfo )
|
||
{
|
||
if( info_event != eUserInfo_Save1 )
|
||
{
|
||
// ネットワーク設定のNAND書き込み
|
||
flush_net_setting_();
|
||
}
|
||
|
||
msBackupNetInfo = msNetInfo;
|
||
}
|
||
|
||
if( msDirty & eNetInfo2 )
|
||
{
|
||
bool save = false;
|
||
|
||
// NAND書き込み
|
||
for( int i = eKindEula; i <= eKindBoss; i++ )
|
||
{
|
||
if( data_user_info_( i, type ) )
|
||
{
|
||
save = true;
|
||
}
|
||
}
|
||
|
||
if( save )
|
||
{
|
||
nand_write = true;
|
||
NN_LOG( "Save NetInfo2\n" );
|
||
}
|
||
|
||
msBackupNetInfo = msNetInfo;
|
||
}
|
||
|
||
if( msDirty & eParentInfo )
|
||
{
|
||
if( data_user_info_( eKindParental, type ) )
|
||
{
|
||
nand_write = true;
|
||
NN_LOG( "Save Parental\n" );
|
||
}
|
||
|
||
msBackupParentInfo = msParentInfo;
|
||
}
|
||
|
||
#ifdef NW_RELEASE
|
||
// COPPACSが必要な国だけCOPPACSのセーブあり(リリース以外は全バージョンでセーブあり)
|
||
if( msIsCoppa )
|
||
#endif
|
||
{
|
||
if( msDirty & eCoppaInfo )
|
||
{
|
||
if( type != 2 )
|
||
{
|
||
if( data_user_info_( eKindCoppa, type ) )
|
||
{
|
||
nand_write = true;
|
||
NN_LOG( "Save Coppa\n" );
|
||
}
|
||
|
||
msBackupCoppaInfo = msCoppaInfo;
|
||
}
|
||
}
|
||
}
|
||
|
||
if( msDirty & eWorkInfo )
|
||
{
|
||
msBackupWorkInfo = msWorkInfo;
|
||
}
|
||
|
||
msDirty = eNoneInfo;
|
||
|
||
if( nand_write ) // NAND書き込み
|
||
{
|
||
nn::Result result = nn::cfg::CTR::init::FlushConfig();
|
||
|
||
// COPPACSチェック
|
||
if( cop_check )
|
||
{
|
||
setCoppacs();
|
||
}
|
||
|
||
#ifndef NW_RELEASE
|
||
NN_LOG( "flush_cnf = %d\n", result.IsSuccess() );
|
||
#endif
|
||
}
|
||
}
|
||
break;
|
||
|
||
case eUserInfo_Reset:
|
||
msUserInfo = msBackupUserInfo;
|
||
msTwlInfo = msBackupTwlInfo;
|
||
msTwlInfo2 = msBackupTwlInfo2;
|
||
msParentInfo = msBackupParentInfo;
|
||
msCoppaInfo = msBackupCoppaInfo;
|
||
msNetInfo = msBackupNetInfo;
|
||
msWorkInfo = msBackupWorkInfo;
|
||
|
||
msDirty = eNoneInfo;
|
||
break;
|
||
|
||
default:
|
||
break;
|
||
}
|
||
|
||
// 完全にFlushしてから行う
|
||
if( lang_change )
|
||
{
|
||
sys::KeyboardManager::repreload();
|
||
}
|
||
#endif
|
||
}
|
||
|
||
|
||
//*********************************************************************************
|
||
// ユーザー情報
|
||
//*********************************************************************************
|
||
//==========================================================================
|
||
// セーブ準備
|
||
//==========================================================================
|
||
void UserInfoAccessor::setUserInfo( UserInfo& user_info )
|
||
{
|
||
msUserInfo = user_info;
|
||
msDirty |= eUserInfo;
|
||
}
|
||
|
||
|
||
//==========================================================================
|
||
// セーブ準備
|
||
//==========================================================================
|
||
void UserInfoAccessor::setTwlInfo( TwlInfo& twl_info )
|
||
{
|
||
msTwlInfo = twl_info;
|
||
msDirty |= eTwlInfo;
|
||
}
|
||
|
||
|
||
//==========================================================================
|
||
// セーブ準備
|
||
//==========================================================================
|
||
void UserInfoAccessor::setTwlInfo2( TwlInfo2& twl_info )
|
||
{
|
||
msTwlInfo2 = twl_info;
|
||
msDirty |= eTwlInfo2;
|
||
}
|
||
|
||
|
||
//==========================================================================
|
||
// ワーク
|
||
//==========================================================================
|
||
void UserInfoAccessor::setWorkInfo( WorkInfo& work_info )
|
||
{
|
||
msWorkInfo = work_info;
|
||
msDirty |= eWorkInfo;
|
||
}
|
||
|
||
|
||
//*********************************************************************************
|
||
// ペアレンタル情報
|
||
//*********************************************************************************
|
||
//==========================================================================
|
||
// セーブ準備
|
||
//==========================================================================
|
||
void UserInfoAccessor::setParentInfo( nn::cfg::CTR::ParentalControlInfo& parent_info )
|
||
{
|
||
msParentInfo = parent_info;
|
||
msDirty |= eParentInfo;
|
||
}
|
||
|
||
|
||
//==========================================================================
|
||
// ペアレンタルクリア
|
||
//==========================================================================
|
||
void UserInfoAccessor::clrParentInfo( bool eula )
|
||
{
|
||
memset( &msParentInfo, 0, sizeof( msParentInfo ) );
|
||
memset( &msTwlInfo2.ds_pare, 0, sizeof( nn::cfg::CTR::detail::TwlParentalControlInfoCfgData ) );
|
||
|
||
msDirty |= eParentInfo;
|
||
msDirty |= eTwlInfo2;
|
||
|
||
if( eula )
|
||
{
|
||
clrNet2();
|
||
}
|
||
}
|
||
|
||
|
||
//==========================================================================
|
||
// ペアレンタル設定が更新されたかチェック
|
||
//==========================================================================
|
||
bool UserInfoAccessor::isCheckParentInfo()
|
||
{
|
||
s8* org = (s8*)( &msParentInfo );
|
||
s8* back = (s8*)( &msBackupParentInfo );
|
||
int size = sizeof( msParentInfo );
|
||
|
||
for( int i = 0; i < size; i++ )
|
||
{
|
||
if( *org++ != *back++ )
|
||
{
|
||
return true; // 変更があったらtrue
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
|
||
|
||
//*********************************************************************************
|
||
// COPPACS情報
|
||
//*********************************************************************************
|
||
//==========================================================================
|
||
// セーブ準備
|
||
//==========================================================================
|
||
void UserInfoAccessor::setCoppaInfo( nn::cfg::CTR::detail::CoppacsCfgData& coppa_info )
|
||
{
|
||
msCoppaInfo = coppa_info;
|
||
msDirty |= eCoppaInfo;
|
||
}
|
||
|
||
|
||
//==========================================================================
|
||
// COPPACS設定が更新されたかチェック
|
||
//==========================================================================
|
||
bool UserInfoAccessor::isCheckCoppaInfo()
|
||
{
|
||
s8* org = (s8*)( &msCoppaInfo );
|
||
s8* back = (s8*)( &msBackupCoppaInfo );
|
||
int size = sizeof( msCoppaInfo );
|
||
|
||
for( int i = 0; i < size; i++ )
|
||
{
|
||
if( *org++ != *back++ )
|
||
{
|
||
return true; // 変更があったらtrue
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
|
||
|
||
//==========================================================================
|
||
// セーブ
|
||
//==========================================================================
|
||
void UserInfoAccessor::saveCoppaInfo( nn::cfg::CTR::detail::CoppacsCfgData& coppa_info )
|
||
{
|
||
msCoppaInfo = coppa_info;
|
||
|
||
if( data_user_info_( eKindCoppa, 1 ) )
|
||
{
|
||
nn::cfg::CTR::init::FlushConfig();
|
||
|
||
NN_LOG( "Save Coppa\n" );
|
||
}
|
||
|
||
msBackupCoppaInfo = msCoppaInfo;
|
||
}
|
||
|
||
|
||
//==========================================================================
|
||
// COPPACSが必要かどうか
|
||
//==========================================================================
|
||
void UserInfoAccessor::setCoppacs()
|
||
{
|
||
#ifdef NW_RELEASE
|
||
msIsCoppa = nn::cfg::IsCoppacsSupported(); // COPPACSある地域か?
|
||
#else
|
||
msIsCoppa = true;
|
||
#endif
|
||
}
|
||
|
||
|
||
//*********************************************************************************
|
||
// ネットワーク
|
||
//*********************************************************************************
|
||
//==========================================================================
|
||
// セーブ準備
|
||
//==========================================================================
|
||
void UserInfoAccessor::setNetInfo( NetInfo& net_info )
|
||
{
|
||
msNetInfo = net_info;
|
||
msDirty |= eNetInfo;
|
||
}
|
||
|
||
//==========================================================================
|
||
void UserInfoAccessor::setNetWireless( int num, nn::ac::CTR::WirelessSetting& wireless )
|
||
{
|
||
msNetInfo.setting[num].wireless = wireless;
|
||
msDirty |= eNetInfo;
|
||
}
|
||
|
||
//==========================================================================
|
||
void UserInfoAccessor::setNetIp( int num, nn::ac::CTR::IpSetting& ip )
|
||
{
|
||
msNetInfo.setting[num].ip = ip;
|
||
msDirty |= eNetInfo;
|
||
}
|
||
|
||
//==========================================================================
|
||
void UserInfoAccessor::setNetProxy( int num, nn::ac::CTR::ProxySetting& proxy )
|
||
{
|
||
msNetInfo.setting[num].proxy = proxy;
|
||
msDirty |= eNetInfo;
|
||
}
|
||
|
||
//==========================================================================
|
||
void UserInfoAccessor::setNetOther( int num, nn::ac::CTR::OtherSetting& other )
|
||
{
|
||
msNetInfo.setting[num].other = other;
|
||
msDirty |= eNetInfo;
|
||
}
|
||
|
||
//==========================================================================
|
||
// 初回起動特別API、ProcessManagerから呼ばれる
|
||
void UserInfoAccessor::set_first_boot_ac_()
|
||
{
|
||
// ネット設定初期化
|
||
nn::ac::CTR::InitializeInternal();
|
||
|
||
nn::ac::CTR::RemoveNetworkSetting( 0 );
|
||
nn::ac::CTR::RemoveNetworkSetting( 1 );
|
||
nn::ac::CTR::RemoveNetworkSetting( 2 );
|
||
|
||
nn::ac::FlushNetworkSetting();
|
||
nn::ac::CTR::FinalizeInternal();
|
||
|
||
// ネットワーク設定のNAND書き込み
|
||
flush_net_setting_();
|
||
}
|
||
|
||
//==========================================================================
|
||
// BOSS設定
|
||
//==========================================================================
|
||
void UserInfoAccessor::setNetBg24Get( bool used )
|
||
{
|
||
nn::Result result;
|
||
bool optout = !used;
|
||
|
||
// BOSS の受信
|
||
msNetInfo.net_boss.isAllowedPushApp = used;
|
||
|
||
// バショトリャーの受信
|
||
// NN_LOG( "used:%d, optout:%d\n", used, optout );
|
||
result = nn::news::CTR::boss::SaveBashotoryaTaskOptoutFlag( getHomePid(), optout );
|
||
NN_ASSERT_RESULT( result );
|
||
|
||
msDirty |= eNetInfo2;
|
||
}
|
||
|
||
void UserInfoAccessor::setNetBg24Send( bool used )
|
||
{
|
||
nn::Result result;
|
||
bool optout = !used;
|
||
|
||
// 本体情報の送信
|
||
msNetInfo.net_boss.isAllowedUploadPersonalData = used;
|
||
|
||
// プレイ履歴のアップロードタスク
|
||
result = nn::news::CTR::boss::SavePlayLogUploadTaskOptoutFlag( getHomePid(), optout );
|
||
NN_ASSERT_RESULT( result );
|
||
// BOSS へ送信する情報
|
||
saveBossSendInfoTaskOptoutFlag( optout );
|
||
|
||
msDirty |= eNetInfo2;
|
||
}
|
||
|
||
void UserInfoAccessor::clrNetBg24()
|
||
{
|
||
nn::Result result;
|
||
bit64 homePid = getHomePid();
|
||
|
||
msNetInfo.net_boss.isAllowedPushApp = false;
|
||
msNetInfo.net_boss.isAllowedUploadPersonalData = false;
|
||
|
||
// バショトリャーの受信、履歴の送信
|
||
result = nn::news::CTR::boss::SaveBashotoryaTaskOptoutFlag( homePid, true );
|
||
result = nn::news::CTR::boss::SavePlayLogUploadTaskOptoutFlag( homePid, true );
|
||
NN_ASSERT_RESULT( result );
|
||
|
||
msDirty |= eNetInfo2;
|
||
}
|
||
|
||
nn::ProgramId UserInfoAccessor::getHomePid()
|
||
{
|
||
nn::ProgramId pid;
|
||
bit32 uid = nn::CTR::PROGRAM_ID_UNIQUE_ID_HOMEMENU;
|
||
bit8 ver = nn::CTR::PROGRAM_ID_VERSION_HOMEMENU;
|
||
|
||
switch( System::getRegion() )
|
||
{
|
||
case nn::cfg::CTR::CFG_REGION_AMERICA:
|
||
uid = nn::CTR::PROGRAM_ID_UNIQUE_ID_SYSMENU_US;
|
||
ver = nn::CTR::PROGRAM_ID_VERSION_SYSMENU_US;
|
||
break;
|
||
|
||
case nn::cfg::CTR::CFG_REGION_EUROPE:
|
||
case nn::cfg::CTR::CFG_REGION_AUSTRALIA:
|
||
uid = nn::CTR::PROGRAM_ID_UNIQUE_ID_SYSMENU_EU;
|
||
ver = nn::CTR::PROGRAM_ID_VERSION_SYSMENU_EU;
|
||
break;
|
||
|
||
case nn::cfg::CTR::CFG_REGION_CHINA:
|
||
uid = nn::CTR::PROGRAM_ID_UNIQUE_ID_SYSMENU_CN;
|
||
ver = nn::CTR::PROGRAM_ID_VERSION_SYSMENU_CN;
|
||
break;
|
||
|
||
case nn::cfg::CTR::CFG_REGION_KOREA:
|
||
uid = nn::CTR::PROGRAM_ID_UNIQUE_ID_SYSMENU_KR;
|
||
ver = nn::CTR::PROGRAM_ID_VERSION_SYSMENU_KR;
|
||
break;
|
||
|
||
case nn::cfg::CTR::CFG_REGION_TAIWAN:
|
||
uid = nn::CTR::PROGRAM_ID_UNIQUE_ID_SYSMENU_TW;
|
||
ver = nn::CTR::PROGRAM_ID_VERSION_SYSMENU_TW;
|
||
break;
|
||
}
|
||
|
||
pid = nn::CTR::MakeProgramId( nn::CTR::PROGRAM_ID_CATEGORY_APPLET,
|
||
uid,
|
||
ver ); // プログラムID
|
||
NN_LOG( "menu pid:%016llX\n", pid );
|
||
|
||
return pid;
|
||
}
|
||
|
||
nn::ProgramId UserInfoAccessor::getMsetPid()
|
||
{
|
||
nn::ProgramId pid;
|
||
bit32 uid = nn::CTR::PROGRAM_ID_UNIQUE_ID_MSET;
|
||
bit8 ver = nn::CTR::PROGRAM_ID_VERSION_MSET;
|
||
|
||
switch( System::getRegion() )
|
||
{
|
||
case nn::cfg::CTR::CFG_REGION_AMERICA:
|
||
uid = nn::CTR::PROGRAM_ID_UNIQUE_ID_MSET_US;
|
||
ver = nn::CTR::PROGRAM_ID_VERSION_MSET_US;
|
||
break;
|
||
|
||
case nn::cfg::CTR::CFG_REGION_EUROPE:
|
||
case nn::cfg::CTR::CFG_REGION_AUSTRALIA:
|
||
uid = nn::CTR::PROGRAM_ID_UNIQUE_ID_MSET_EU;
|
||
ver = nn::CTR::PROGRAM_ID_VERSION_MSET_EU;
|
||
break;
|
||
|
||
case nn::cfg::CTR::CFG_REGION_CHINA:
|
||
uid = nn::CTR::PROGRAM_ID_UNIQUE_ID_MSET_CN;
|
||
ver = nn::CTR::PROGRAM_ID_VERSION_MSET_CN;
|
||
break;
|
||
|
||
case nn::cfg::CTR::CFG_REGION_KOREA:
|
||
uid = nn::CTR::PROGRAM_ID_UNIQUE_ID_MSET_KR;
|
||
ver = nn::CTR::PROGRAM_ID_VERSION_MSET_KR;
|
||
break;
|
||
|
||
case nn::cfg::CTR::CFG_REGION_TAIWAN:
|
||
uid = nn::CTR::PROGRAM_ID_UNIQUE_ID_MSET_TW;
|
||
ver = nn::CTR::PROGRAM_ID_VERSION_MSET_TW;
|
||
break;
|
||
}
|
||
|
||
pid = nn::CTR::MakeProgramId( nn::CTR::PROGRAM_ID_CATEGORY_SYSTEM_APPLICATION,
|
||
uid,
|
||
ver ); // プログラムID
|
||
NN_LOG( "mset pid:%016llX\n", pid );
|
||
|
||
return pid;
|
||
}
|
||
|
||
nn::ProgramId UserInfoAccessor::getPnotePid()
|
||
{
|
||
nn::ProgramId pid;
|
||
bit32 uid = nn::CTR::PROGRAM_ID_UNIQUE_ID_PNOTE;
|
||
bit8 ver = nn::CTR::PROGRAM_ID_VERSION_APP;
|
||
|
||
switch( System::getRegion() )
|
||
{
|
||
case nn::cfg::CTR::CFG_REGION_AMERICA:
|
||
uid = nn::CTR::PROGRAM_ID_UNIQUE_ID_PNOTE_US;
|
||
break;
|
||
|
||
case nn::cfg::CTR::CFG_REGION_EUROPE:
|
||
case nn::cfg::CTR::CFG_REGION_AUSTRALIA:
|
||
uid = nn::CTR::PROGRAM_ID_UNIQUE_ID_PNOTE_EU;
|
||
break;
|
||
|
||
case nn::cfg::CTR::CFG_REGION_CHINA:
|
||
uid = nn::CTR::PROGRAM_ID_UNIQUE_ID_PNOTE_CN;
|
||
break;
|
||
|
||
case nn::cfg::CTR::CFG_REGION_KOREA:
|
||
uid = nn::CTR::PROGRAM_ID_UNIQUE_ID_PNOTE_KR;
|
||
break;
|
||
|
||
case nn::cfg::CTR::CFG_REGION_TAIWAN:
|
||
uid = nn::CTR::PROGRAM_ID_UNIQUE_ID_PNOTE_TW;
|
||
break;
|
||
}
|
||
|
||
pid = nn::CTR::MakeProgramId( nn::CTR::PROGRAM_ID_CATEGORY_SYSTEM_APPLICATION,
|
||
uid,
|
||
ver ); // プログラムID
|
||
NN_LOG( "pnote pid:%016llX\n", pid );
|
||
|
||
return pid;
|
||
}
|
||
|
||
const char* UserInfoAccessor::getMsetBossCode()
|
||
{
|
||
const char* ret = "H1qQXKK4O6t57mXV";
|
||
|
||
switch( System::getRegion() )
|
||
{
|
||
case nn::cfg::CTR::CFG_REGION_AMERICA:
|
||
ret = "RuVtKeBFoN25TrSW";
|
||
break;
|
||
|
||
case nn::cfg::CTR::CFG_REGION_EUROPE:
|
||
case nn::cfg::CTR::CFG_REGION_AUSTRALIA:
|
||
ret = "JoCrq7bGXiCdPfPb";
|
||
break;
|
||
|
||
case nn::cfg::CTR::CFG_REGION_CHINA:
|
||
ret = "BjXT9luy7CYEvk6B";
|
||
break;
|
||
|
||
case nn::cfg::CTR::CFG_REGION_KOREA:
|
||
ret = "9VBflZvACW6nC7zZ";
|
||
break;
|
||
|
||
case nn::cfg::CTR::CFG_REGION_TAIWAN:
|
||
ret = "9CdgDvc3yDYx755y";
|
||
break;
|
||
}
|
||
|
||
return ret;
|
||
}
|
||
|
||
//==========================================================================
|
||
void UserInfoAccessor::clrNet2()
|
||
{
|
||
msNetInfo.net_eula.agreeVersion.version = 0;
|
||
msDirty |= eNetInfo2;
|
||
|
||
msTwlInfo2.ds_eula.isAgreeEula = false;
|
||
// msTwlInfo2.ds_eula.agreeEulaVersion = 0; // todo: 同意EULAバージョンをクリアするならここで
|
||
msDirty |= eTwlInfo2;
|
||
}
|
||
|
||
//==========================================================================
|
||
void UserInfoAccessor::prepareBossSendInfo()
|
||
{
|
||
memset( &msBossSendInfo, 0, sizeof( msBossSendInfo ) );
|
||
|
||
// cfg の情報のセット
|
||
prepare_boss_send_cfg_info_();
|
||
|
||
// インターネット設定の情報のセット
|
||
prepare_boss_send_net_info_();
|
||
|
||
// 工場出荷時のキャリブ情報のセット
|
||
prepare_boss_send_factory_cal_info_();
|
||
}
|
||
|
||
void UserInfoAccessor::prepare_boss_send_cfg_info_()
|
||
{
|
||
int size = 0;
|
||
bit32 key = 0;
|
||
|
||
size = sizeof( msBossSendInfo.cfgInfo.touchPanel );
|
||
key = get_cfg_key_( nn::cfg::CTR::detail::NN_CFG_HID,
|
||
nn::cfg::CTR::detail::NN_CFG_HID_CAL_TOUCHPANEL );
|
||
nn::cfg::CTR::init::GetConfig( &msBossSendInfo.cfgInfo.touchPanel, size, key );
|
||
|
||
size = sizeof( msBossSendInfo.cfgInfo.analogStick );
|
||
key = get_cfg_key_( nn::cfg::CTR::detail::NN_CFG_HID,
|
||
nn::cfg::CTR::detail::NN_CFG_HID_CAL_ANALOGSTICK );
|
||
nn::cfg::CTR::init::GetConfig( &msBossSendInfo.cfgInfo.analogStick, size, key );
|
||
|
||
size = sizeof( msBossSendInfo.cfgInfo.gyro );
|
||
key = get_cfg_key_( nn::cfg::CTR::detail::NN_CFG_HID,
|
||
nn::cfg::CTR::detail::NN_CFG_HID_CAL_GYROSCOPE );
|
||
nn::cfg::CTR::init::GetConfig( &msBossSendInfo.cfgInfo.gyro, size, key );
|
||
|
||
size = sizeof( msBossSendInfo.cfgInfo.accel );
|
||
key = get_cfg_key_( nn::cfg::CTR::detail::NN_CFG_HID,
|
||
nn::cfg::CTR::detail::NN_CFG_HID_CAL_ACCELEROMETER );
|
||
nn::cfg::CTR::init::GetConfig( &msBossSendInfo.cfgInfo.accel, size, key );
|
||
|
||
size = sizeof( msBossSendInfo.cfgInfo.backLight );
|
||
key = get_cfg_key_( nn::cfg::CTR::detail::NN_CFG_LCD,
|
||
nn::cfg::CTR::detail::NN_CFG_LCD_BACKLIGHT );
|
||
nn::cfg::CTR::init::GetConfig( &msBossSendInfo.cfgInfo.backLight, size, key );
|
||
|
||
size = sizeof( msBossSendInfo.cfgInfo.camera );
|
||
key = get_cfg_key_( nn::cfg::CTR::detail::NN_CFG_CAMERA,
|
||
nn::cfg::CTR::detail::NN_CFG_CAMERA_CAL );
|
||
nn::cfg::CTR::init::GetConfig( &msBossSendInfo.cfgInfo.camera, size, key );
|
||
|
||
size = sizeof( msBossSendInfo.cfgInfo.sound );
|
||
key = get_cfg_key_( nn::cfg::CTR::detail::NN_CFG_SOUND,
|
||
nn::cfg::CTR::detail::NN_CFG_SOUND_SETTING );
|
||
nn::cfg::CTR::init::GetConfig( &msBossSendInfo.cfgInfo.sound, size, key );
|
||
|
||
size = sizeof( msBossSendInfo.cfgInfo.language );
|
||
key = get_cfg_key_( nn::cfg::CTR::detail::NN_CFG_USER_INFO,
|
||
nn::cfg::CTR::detail::NN_CFG_USER_INFO_LANGUAGE );
|
||
nn::cfg::CTR::init::GetConfig( &msBossSendInfo.cfgInfo.language, size, key );
|
||
|
||
size = sizeof( msBossSendInfo.cfgInfo.simpleAddress );
|
||
key = get_cfg_key_( nn::cfg::CTR::detail::NN_CFG_SIMPLE_ADDRESS,
|
||
nn::cfg::CTR::detail::NN_CFG_SIMPLE_ADDRESS_ID );
|
||
nn::cfg::CTR::init::GetConfig( &msBossSendInfo.cfgInfo.simpleAddress, size, key );
|
||
|
||
size = sizeof( msBossSendInfo.cfgInfo.parental );
|
||
key = get_cfg_key_( nn::cfg::CTR::detail::NN_CFG_PARENTAL_CONTROL,
|
||
nn::cfg::CTR::detail::NN_CFG_PARENTAL_CONTROL_INFO );
|
||
nn::cfg::CTR::init::GetConfig( &msBossSendInfo.cfgInfo.parental, size, key );
|
||
|
||
size = sizeof( msBossSendInfo.cfgInfo.eula );
|
||
key = get_cfg_key_( nn::cfg::CTR::detail::NN_CFG_EULA,
|
||
nn::cfg::CTR::detail::NN_CFG_EULA_INFO );
|
||
nn::cfg::CTR::init::GetConfig( &msBossSendInfo.cfgInfo.eula, size, key );
|
||
|
||
size = sizeof( msBossSendInfo.cfgInfo.boss );
|
||
key = get_cfg_key_( nn::cfg::CTR::detail::NN_CFG_BOSS,
|
||
nn::cfg::CTR::detail::NN_CFG_BOSS_SETTING );
|
||
nn::cfg::CTR::init::GetConfig( &msBossSendInfo.cfgInfo.boss, size, key );
|
||
|
||
msBossSendInfo.cfgInfo.svr2Vol = sys::Input::getSvr2Volume();
|
||
nn::hid::CTR::GetSoundVolume( &msBossSendInfo.cfgInfo.sndVol );
|
||
|
||
size = sizeof( msBossSendInfo.coppacsInfo );
|
||
key = get_cfg_key_( nn::cfg::CTR::detail::NN_CFG_PARENTAL_CONTROL,
|
||
nn::cfg::CTR::detail::NN_CFG_PARENTAL_CONTROL_COPPACS );
|
||
nn::cfg::CTR::init::GetConfig( &msBossSendInfo.coppacsInfo, size, key );
|
||
}
|
||
|
||
void UserInfoAccessor::prepare_boss_send_net_info_()
|
||
{
|
||
NetInfo netInfo;
|
||
|
||
memset( &netInfo, 0, sizeof( netInfo ) );
|
||
|
||
nn::ac::InitializeInternal();
|
||
nn::ac::LoadNetworkSetting( 0, netInfo.setting[0] );
|
||
nn::ac::LoadNetworkSetting( 1, netInfo.setting[1] );
|
||
nn::ac::LoadNetworkSetting( 2, netInfo.setting[2] );
|
||
nn::ac::FinalizeInternal();
|
||
|
||
for( int i = 0; i < NetInfo::eInfoMax; ++i )
|
||
{
|
||
if( netInfo.setting[i].wireless.enable )
|
||
{
|
||
msBossSendInfo.netInfo[i].networkVersion = netInfo.setting[i].version;
|
||
msBossSendInfo.netInfo[i].wirelessEnable = netInfo.setting[i].wireless.enable;
|
||
msBossSendInfo.netInfo[i].wirelessEditableEssidSecrity = netInfo.setting[i].wireless.editableEssidSecurity;
|
||
msBossSendInfo.netInfo[i].multiSsidEnable = netInfo.setting[i].wireless.multiSsid.enable;
|
||
msBossSendInfo.netInfo[i].ipEnableDHCP = netInfo.setting[i].ip.enableDHCP;
|
||
msBossSendInfo.netInfo[i].ipAutoDNSSetting = netInfo.setting[i].ip.autoDNSSetting;
|
||
msBossSendInfo.netInfo[i].proxyEnable = netInfo.setting[i].proxy.enable;
|
||
msBossSendInfo.netInfo[i].otherEnableUPnP = netInfo.setting[i].other.enableUPnP;
|
||
msBossSendInfo.netInfo[i].essidSecurityMode = netInfo.setting[i].wireless.essidSecurity.securityMode;
|
||
msBossSendInfo.netInfo[i].multiSsidType = netInfo.setting[i].wireless.multiSsid.multiSsidType;
|
||
msBossSendInfo.netInfo[i].proxyAuthType = netInfo.setting[i].proxy.authType;
|
||
msBossSendInfo.netInfo[i].padding = 0;
|
||
}
|
||
}
|
||
}
|
||
|
||
void UserInfoAccessor::prepare_boss_send_factory_cal_info_()
|
||
{
|
||
nn::Result result;
|
||
|
||
result = nn::cfg::CTR::init::GetCameraFactoryCal( &msBossSendInfo.factoryCalInfo.camera );
|
||
if( result.IsFailure() )
|
||
{
|
||
// 異常状態なのでバッファをクリアしておく
|
||
NN_LOG("get camera factory cal error!\n");
|
||
memset( &msBossSendInfo.factoryCalInfo.camera, 0, sizeof( msBossSendInfo.factoryCalInfo.camera ) );
|
||
}
|
||
result = nn::cfg::CTR::init::GetAnalogStickFactoryCal( &msBossSendInfo.factoryCalInfo.analogStick );
|
||
if( result.IsFailure() )
|
||
{
|
||
// 異常状態なのでバッファをクリアしておく
|
||
NN_LOG("get analog stick factory cal error!\n");
|
||
memset( &msBossSendInfo.factoryCalInfo.analogStick, 0, sizeof( msBossSendInfo.factoryCalInfo.analogStick ) );
|
||
}
|
||
}
|
||
|
||
//==========================================================================
|
||
// NET設定の「新規設定」を選択したときに作られるパラメータ
|
||
//==========================================================================
|
||
void UserInfoAccessor::setNetNewParam( int num )
|
||
{
|
||
memset( &msNetInfo.setting[num], 0, sizeof( nn::ac::CTR::NetworkSetting ) );
|
||
|
||
msNetInfo.setting[num].wireless.editableEssidSecurity = true; // SSIDエディット可能
|
||
msNetInfo.setting[num].ip.enableDHCP = true; // IP自動取得
|
||
msNetInfo.setting[num].ip.autoDNSSetting = true; // DNS自動取得
|
||
msNetInfo.setting[num].proxy.enable = false; // Proxy使用しない
|
||
msNetInfo.setting[num].proxy.authType = nn::ac::CTR::PROXY_AUTH_TYPE_NONE; // Basic認証なし
|
||
msNetInfo.setting[num].other.enableUPnP = false; // UPnP無効
|
||
|
||
msNetInfo.setting[num].proxy.port = 1; // port = 1
|
||
msNetInfo.setting[num].other.mtu = 1400; // MTU = 1400
|
||
|
||
// バックアップにも書き込む
|
||
msBackupNetInfo.setting[num] = msNetInfo.setting[num];
|
||
|
||
msDirty |= eNetInfo;
|
||
}
|
||
|
||
|
||
//==========================================================================
|
||
// 接続設定の消去
|
||
//==========================================================================
|
||
void UserInfoAccessor::delNetSetInfo( int num )
|
||
{
|
||
nn::Result result;
|
||
|
||
nn::ac::InitializeInternal();
|
||
|
||
result = nn::ac::RemoveNetworkSetting( num );
|
||
|
||
#ifndef NW_RELEASE
|
||
NN_DBG_PRINT_RESULT( result );
|
||
#endif
|
||
|
||
nn::ac::FlushNetworkSetting();
|
||
nn::ac::FinalizeInternal();
|
||
|
||
memset( &msNetInfo.setting[num], 0, sizeof( nn::ac::CTR::NetworkSetting ) );
|
||
msBackupNetInfo = msNetInfo;
|
||
}
|
||
|
||
|
||
//==========================================================================
|
||
// ネット設定が更新されたかチェック
|
||
//==========================================================================
|
||
bool UserInfoAccessor::isCheckNetworkInfo()
|
||
{
|
||
s8* org = (s8*)( &msNetInfo.setting[msAccNum] );
|
||
s8* back = (s8*)( &msBackupNetInfo.setting[msAccNum] );
|
||
int size = sizeof( nn::ac::CTR::NetworkSetting )/*-sizeof( msNetInfo.setting[msAccNum].reserve )*/; // reserve分引く
|
||
|
||
for( int i = 0; i < size; i++ )
|
||
{
|
||
if( *org++ != *back++ )
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
|
||
|
||
//==========================================================================
|
||
// ネットワーク設定のNAND書き込み
|
||
//==========================================================================
|
||
void UserInfoAccessor::flush_net_setting_()
|
||
{
|
||
NN_LOG("flush_net_setting_\n");
|
||
|
||
if( ( msAccNum >= 0 ) && ( msAccNum <= 2 ) )
|
||
{
|
||
memset( &msNetInfo.setting[msAccNum].scanlessConnect, 0, sizeof( nn::ac::ScanlessConnectSetting ) );
|
||
}
|
||
|
||
nn::ac::InitializeInternal();
|
||
|
||
for( int i = 0; i < 3; i++ )
|
||
{
|
||
if( msNetInfo.setting[i].wireless.enable )
|
||
{
|
||
nn::ac::UpdateNetworkSetting( i, msNetInfo.setting[i] );
|
||
|
||
NN_LOG( "net set save = %d\n", i );
|
||
}
|
||
}
|
||
|
||
nn::ac::FlushNetworkSetting();
|
||
nn::ac::FinalizeInternal();
|
||
|
||
NN_LOG( "Save NetInfo\n" );
|
||
}
|
||
|
||
|
||
//*********************************************************************************
|
||
// CFG
|
||
//*********************************************************************************
|
||
//==========================================================================
|
||
// CFGデータ(ユーザー設定)の Load / Save
|
||
// type 0: Load / 1: save / 2: 強制save
|
||
//==========================================================================
|
||
bool UserInfoAccessor::data_user_info_( int kind, int type )
|
||
{
|
||
bool ret = ( type == 2 );
|
||
u8* org = NULL;
|
||
u8* back = NULL;
|
||
int size;
|
||
bit32 key;
|
||
|
||
switch( kind )
|
||
{
|
||
case eKindUserName:
|
||
org = (u8*)( &msUserInfo.usr_name );
|
||
back = (u8*)( &msBackupUserInfo.usr_name );
|
||
size = sizeof( nn::cfg::CTR::detail::UserNameCfgData );
|
||
key = get_cfg_key_( nn::cfg::CTR::detail::NN_CFG_USER_INFO,
|
||
nn::cfg::CTR::detail::NN_CFG_USER_INFO_USER_NAME );
|
||
break;
|
||
|
||
case eKindAddressId:
|
||
org = (u8*)( &msUserInfo.usr_address.id );
|
||
back = (u8*)( &msBackupUserInfo.usr_address.id );
|
||
size = sizeof( nn::cfg::CTR::detail::SimpleAddressIdCfgData );
|
||
key = get_cfg_key_( nn::cfg::CTR::detail::NN_CFG_SIMPLE_ADDRESS,
|
||
nn::cfg::CTR::detail::NN_CFG_SIMPLE_ADDRESS_ID );
|
||
break;
|
||
|
||
case eKindAddressCountry:
|
||
org = (u8*)( &msUserInfo.usr_address.countryName[0][0] );
|
||
back = (u8*)( &msBackupUserInfo.usr_address.countryName[0][0] );
|
||
size = sizeof( nn::cfg::CTR::detail::SimpleAddressCountryNameCfgData );
|
||
key = get_cfg_key_( nn::cfg::CTR::detail::NN_CFG_SIMPLE_ADDRESS,
|
||
nn::cfg::CTR::detail::NN_CFG_SIMPLE_ADDRESS_COUNTRY_NAME );
|
||
break;
|
||
|
||
case eKindAddressRegion:
|
||
org = (u8*)( &msUserInfo.usr_address.regionName[0][0] );
|
||
back = (u8*)( &msBackupUserInfo.usr_address.regionName[0][0] );
|
||
size = sizeof( nn::cfg::CTR::detail::SimpleAddressRegionNameCfgData );
|
||
key = get_cfg_key_( nn::cfg::CTR::detail::NN_CFG_SIMPLE_ADDRESS,
|
||
nn::cfg::CTR::detail::NN_CFG_SIMPLE_ADDRESS_REGION_NAME );
|
||
break;
|
||
|
||
case eKindAddressPosition:
|
||
org = (u8*)( &msUserInfo.usr_address.latitude );
|
||
back = (u8*)( &msBackupUserInfo.usr_address.latitude );
|
||
size = sizeof( nn::cfg::CTR::detail::SimpleAddressPositionCfgData );
|
||
key = get_cfg_key_( nn::cfg::CTR::detail::NN_CFG_SIMPLE_ADDRESS,
|
||
nn::cfg::CTR::detail::NN_CFG_SIMPLE_ADDRESS_POSITION );
|
||
break;
|
||
|
||
case eKindBirthday:
|
||
org = (u8*)( &msUserInfo.usr_birthday );
|
||
back = (u8*)( &msBackupUserInfo.usr_birthday );
|
||
size = sizeof( nn::cfg::CTR::detail::BirthdayCfgData );
|
||
key = get_cfg_key_( nn::cfg::CTR::detail::NN_CFG_USER_INFO,
|
||
nn::cfg::CTR::detail::NN_CFG_USER_INFO_BIRTHDAY );
|
||
break;
|
||
|
||
case eKindLanguage:
|
||
org = (u8*)( &msUserInfo.usr_language );
|
||
back = (u8*)( &msBackupUserInfo.usr_language );
|
||
size = sizeof( nn::cfg::CTR::detail::LanguageCfgData );
|
||
key = get_cfg_key_( nn::cfg::CTR::detail::NN_CFG_USER_INFO,
|
||
nn::cfg::CTR::detail::NN_CFG_USER_INFO_LANGUAGE );
|
||
break;
|
||
|
||
case eKindSound:
|
||
org = (u8*)( &msUserInfo.usr_sound );
|
||
back = (u8*)( &msBackupUserInfo.usr_sound );
|
||
size = sizeof( nn::cfg::CTR::detail::SoundSettingCfgData );
|
||
key = get_cfg_key_( nn::cfg::CTR::detail::NN_CFG_SOUND,
|
||
nn::cfg::CTR::detail::NN_CFG_SOUND_SETTING );
|
||
break;
|
||
|
||
case eKindEula:
|
||
org = (u8*)( &msNetInfo.net_eula );
|
||
back = (u8*)( &msBackupNetInfo.net_eula );
|
||
size = sizeof( nn::cfg::CTR::detail::EulaInfoCfgData );
|
||
key = get_cfg_key_( nn::cfg::CTR::detail::NN_CFG_EULA,
|
||
nn::cfg::CTR::detail::NN_CFG_EULA_INFO );
|
||
break;
|
||
|
||
case eKindBoss:
|
||
org = (u8*)( &msNetInfo.net_boss );
|
||
back = (u8*)( &msBackupNetInfo.net_boss );
|
||
size = sizeof( nn::cfg::CTR::detail::BossSettingCfgData );
|
||
key = get_cfg_key_( nn::cfg::CTR::detail::NN_CFG_BOSS,
|
||
nn::cfg::CTR::detail::NN_CFG_BOSS_SETTING );
|
||
break;
|
||
|
||
case eKindParental:
|
||
org = (u8*)( &msParentInfo );
|
||
back = (u8*)( &msBackupParentInfo );
|
||
size = sizeof( nn::cfg::CTR::ParentalControlInfo );
|
||
key = get_cfg_key_( nn::cfg::CTR::detail::NN_CFG_PARENTAL_CONTROL,
|
||
nn::cfg::CTR::detail::NN_CFG_PARENTAL_CONTROL_INFO );
|
||
break;
|
||
|
||
case eKindCoppa:
|
||
org = (u8*)( &msCoppaInfo );
|
||
back = (u8*)( &msBackupCoppaInfo );
|
||
size = sizeof( nn::cfg::CTR::detail::CoppacsCfgData );
|
||
key = get_cfg_key_( nn::cfg::CTR::detail::NN_CFG_PARENTAL_CONTROL,
|
||
nn::cfg::CTR::detail::NN_CFG_PARENTAL_CONTROL_COPPACS );
|
||
break;
|
||
|
||
case eKindDsData:
|
||
org = (u8*)( &msTwlInfo );
|
||
back = (u8*)( &msBackupTwlInfo );
|
||
size = sizeof( TwlInfo );
|
||
break;
|
||
|
||
case eKindDsCountry:
|
||
org = (u8*)( &msTwlInfo2.ds_country );
|
||
back = (u8*)( &msBackupTwlInfo2.ds_country );
|
||
size = sizeof( nn::cfg::CTR::detail::TwlCountryCodeCfgData );
|
||
key = get_cfg_key_( nn::cfg::CTR::detail::NN_CFG_TWL,
|
||
nn::cfg::CTR::detail::NN_CFG_TWL_COUNTRY_CODE );
|
||
break;
|
||
|
||
case eKindDsParental:
|
||
org = (u8*)( &msTwlInfo2.ds_pare );
|
||
back = (u8*)( &msBackupTwlInfo2.ds_pare );
|
||
size = sizeof( nn::cfg::CTR::detail::TwlParentalControlInfoCfgData );
|
||
key = get_cfg_key_( nn::cfg::CTR::detail::NN_CFG_TWL,
|
||
nn::cfg::CTR::detail::NN_CFG_TWL_PARENTAL_CONTROL_INFO );
|
||
break;
|
||
|
||
case eKindDsEula:
|
||
org = (u8*)( &msTwlInfo2.ds_eula );
|
||
back = (u8*)( &msBackupTwlInfo2.ds_eula );
|
||
size = sizeof( nn::cfg::CTR::detail::TwlEulaInfoCfgData );
|
||
key = get_cfg_key_( nn::cfg::CTR::detail::NN_CFG_TWL,
|
||
nn::cfg::CTR::detail::NN_CFG_TWL_EULA_INFO );
|
||
break;
|
||
|
||
case eKindFirst:
|
||
org = (u8*)( &msFirstInfo.mmen );
|
||
size = sizeof( nn::cfg::CTR::detail::FirstLaunchInfoCfgData );
|
||
key = get_cfg_key_( nn::cfg::CTR::detail::NN_CFG_MENU,
|
||
nn::cfg::CTR::detail::NN_CFG_MENU_FIRST_LAUNCH );
|
||
ret = true;
|
||
break;
|
||
|
||
default:
|
||
return ret;
|
||
}
|
||
|
||
if( type >= 1 ) // save
|
||
{
|
||
if( !ret && ( back != NULL ) )
|
||
{
|
||
for( int i = 0; i < size; i++ )
|
||
{
|
||
if( org[i] != back[i] )
|
||
{
|
||
ret = true;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
if( ret )
|
||
{
|
||
nn::Result result;
|
||
|
||
if( kind == eKindDsData )
|
||
{
|
||
result = nn::cfg::nor::CTR::SetNtrSetting( &msTwlInfo.ds_data, &msTwlInfo.ds_data_ex );
|
||
}
|
||
else
|
||
{
|
||
result = nn::cfg::CTR::init::SetConfig( key, org, size );
|
||
}
|
||
|
||
ret = result.IsSuccess();
|
||
|
||
#ifndef NW_RELEASE
|
||
//scene::DebugLayout::setSaveScc( ret, kind );
|
||
#endif
|
||
NN_LOG( "save %d ( %d )\n", kind, result.IsSuccess() );
|
||
}
|
||
}
|
||
else // load
|
||
{
|
||
nn::Result result;
|
||
|
||
if( kind == eKindDsData )
|
||
{
|
||
result = nn::cfg::nor::CTR::GetNtrSetting( &msTwlInfo.ds_data, &msTwlInfo.ds_data_ex );
|
||
}
|
||
else
|
||
{
|
||
result = nn::cfg::CTR::init::GetConfig( org, size, key );
|
||
}
|
||
|
||
NN_LOG( "load %d ( %d )\n", kind, result.IsSuccess() );
|
||
}
|
||
|
||
return ret;
|
||
}
|
||
|
||
|
||
#ifndef NW_RELEASE
|
||
//==========================================================================
|
||
// 初回起動の最後にもう一度Ds設定をNANDから読み込む
|
||
//==========================================================================
|
||
void UserInfoAccessor::getLastDsData()
|
||
{
|
||
nn::Result result = nn::cfg::nor::CTR::GetNtrSetting( &msTwlInfo.ds_data, &msTwlInfo.ds_data_ex );
|
||
|
||
NN_LOG( "ds_name = %ls ( %d ) (%d)\n", msTwlInfo.ds_data.owner.nickname.buffer,
|
||
msTwlInfo.ds_data.owner.nickname.length , result.IsSuccess() );
|
||
}
|
||
#endif
|
||
|
||
|
||
//==========================================================================
|
||
// スライドパッドのデータ取得
|
||
//==========================================================================
|
||
void UserInfoAccessor::getAnalogData( nn::cfg::CTR::detail::AnalogStickCfgData* para, int flg )
|
||
{
|
||
int size = sizeof( nn::cfg::CTR::detail::AnalogStickCfgData );
|
||
bit32 key = get_cfg_key_( nn::cfg::CTR::detail::NN_CFG_HID,
|
||
nn::cfg::CTR::detail::NN_CFG_HID_CAL_ANALOGSTICK );
|
||
|
||
if( flg == 0 )
|
||
{
|
||
nn::cfg::CTR::init::GetConfig( para, size, key );
|
||
}
|
||
else
|
||
{
|
||
nn::cfg::CTR::init::SetConfig( key, para, size );
|
||
nn::cfg::CTR::init::FlushConfig();
|
||
}
|
||
}
|
||
|
||
|
||
//==========================================================================
|
||
// CTR->TWLに文字列の変換
|
||
//==========================================================================
|
||
void UserInfoAccessor::replaceUnusableString( wchar_t* buffer, int len )
|
||
{
|
||
replaceUnusableStringWithTwlUserInfoFontTable(buffer,len);
|
||
}
|
||
|
||
void UserInfoAccessor::replaceUnusableStringWithTwlUserInfoFontTable(wchar_t* buffer, int len)
|
||
{
|
||
#ifndef NW_RELEASE
|
||
// NN_LOG( "twl user info font table size = %d\n", sizeof( cTwlUserInfoFontCodeTable )/sizeof( u16 ) );
|
||
#endif
|
||
for( int i = 0; i < len; i++ )
|
||
{
|
||
if( buffer[i] == L'\0' )
|
||
{
|
||
break;
|
||
}
|
||
else
|
||
{
|
||
if(binarySearchFromTwlUserInfoFontTable(buffer[i]))
|
||
{
|
||
//表示可能文字なので何もしない
|
||
}
|
||
else
|
||
{
|
||
//表示不可能文字なので置換する
|
||
buffer[i] = L'?';
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
bool UserInfoAccessor::binarySearchFromTwlUserInfoFontTable(u16 wc)
|
||
{
|
||
//二分探索
|
||
int begin = 0;
|
||
int end = sizeof( cTwlUserInfoFontCodeTable )/sizeof( u16 ) - 1;
|
||
|
||
while(begin <= end)
|
||
{
|
||
int idx = (begin+end)/2;
|
||
|
||
if(cTwlUserInfoFontCodeTable[idx] == wc)
|
||
{
|
||
//見つかった
|
||
return true;
|
||
}
|
||
else if(cTwlUserInfoFontCodeTable[idx] < wc)
|
||
{
|
||
//wcがあるとしたらidxより後ろ
|
||
begin = idx+1;
|
||
}
|
||
else
|
||
{
|
||
//wcがあるとしたらidxより前
|
||
end = idx-1;
|
||
}
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
|
||
//==========================================================================
|
||
// 初回起動フラグのセーブ
|
||
//==========================================================================
|
||
void UserInfoAccessor::saveFirstInfo( int mmen, u8 net )
|
||
{
|
||
if( mmen >= 0 )
|
||
{
|
||
msFirstInfo.mmen = (u16)mmen;
|
||
}
|
||
|
||
msFirstInfo.internet = net;
|
||
|
||
if( msIsNetSave )
|
||
{
|
||
if( data_user_info_( eKindFirst, 1 ) )
|
||
{
|
||
nn::cfg::CTR::init::FlushConfig();
|
||
|
||
NN_LOG( "Save FirstInfo\n" );
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
//==========================================================================
|
||
// EULAのチェック
|
||
//==========================================================================
|
||
int UserInfoAccessor::checkEula()
|
||
{
|
||
EulaDef eula_data;
|
||
u8* mount_buf = NULL;
|
||
int region = System::getRegion();
|
||
|
||
#ifdef MOUNT_SHARED_EULA
|
||
// Eula情報のマウント
|
||
{
|
||
mount_buf = sys::File::mountShare( "eula:", cSharedEulaId[region], 0, 40, 2 );
|
||
if( mount_buf != NULL )
|
||
{
|
||
NN_LOG( "Eula data mount\n" );
|
||
}
|
||
}
|
||
#endif
|
||
|
||
// EULAデータの読み込み
|
||
{
|
||
u32 size;
|
||
#ifdef MOUNT_SHARED_EULA
|
||
u8* p_file = sys::File::read( "eula:/country.bin", &size, false, false );
|
||
#else
|
||
u8* p_file = sys::File::read( cEulaCountry[region], &size, false, false );
|
||
#endif
|
||
int country_num = p_file[0];
|
||
int country_id = (msUserInfo.usr_address.id>>24);
|
||
|
||
memset( &eula_data, 0, sizeof( EulaDef ) );
|
||
|
||
NN_LOG( "country_id = %d ( %d )\n", country_id, country_num );
|
||
|
||
{
|
||
EulaDef* p_eula = (EulaDef*)&p_file[16];
|
||
|
||
for( int i = 0; i < country_num; i++ )
|
||
{
|
||
if( country_id == p_eula[i].id )
|
||
{
|
||
eula_data = p_eula[i];
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
delete []p_file;
|
||
}
|
||
|
||
#ifdef MOUNT_SHARED_EULA
|
||
nn::fs::Unmount( "eula:" );
|
||
delete []mount_buf;
|
||
#endif
|
||
|
||
msWorkInfo.eula_minor = eula_data.minorVersion;
|
||
msWorkInfo.eula_major = eula_data.majorVersion;
|
||
msBackupWorkInfo = msWorkInfo;
|
||
|
||
// その国にEULAがあるか?
|
||
if( ( eula_data.majorVersion == 0 ) && ( eula_data.minorVersion == 0 ) )
|
||
{
|
||
NN_LOG( "No EULA\n" );
|
||
return -1; // EULAがない
|
||
}
|
||
|
||
// EULAに同意しているか?
|
||
else if( msNetInfo.net_eula.agreeVersion.version == 0 )
|
||
{
|
||
NN_LOG( "Not agree\n" );
|
||
return 0; // 同意していない
|
||
}
|
||
|
||
// 同意バージョンより新しいEULAがあるか?
|
||
else if( ( msNetInfo.net_eula.agreeVersion.version == ((eula_data.majorVersion<<8) | eula_data.minorVersion)) )
|
||
{
|
||
NN_LOG( "old agree\n" );
|
||
return 1; // 新しいEULAがなかった
|
||
}
|
||
|
||
NN_LOG( "new agree\n" );
|
||
return 2; // 新しいEULAがある
|
||
}
|
||
|
||
|
||
//==========================================================================
|
||
// EULAデータ読み直し
|
||
//==========================================================================
|
||
void UserInfoAccessor::loadEula()
|
||
{
|
||
data_user_info_( eKindEula, 0 );
|
||
data_user_info_( eKindBoss, 0 );
|
||
data_user_info_( eKindDsEula, 0 );
|
||
|
||
msBackupNetInfo.net_eula = msNetInfo.net_eula;
|
||
msBackupNetInfo.net_boss = msNetInfo.net_boss;
|
||
msBackupTwlInfo2.ds_eula = msTwlInfo2.ds_eula;
|
||
}
|
||
|
||
|
||
//==========================================================================
|
||
// bossタスクセット
|
||
//==========================================================================
|
||
nn::Result UserInfoAccessor::setBossTask()
|
||
{
|
||
if( msFirstInfo.mmen != 0 ) // 初回起動のときセットしない
|
||
{
|
||
const char* lang = nn::cfg::CTR::GetLanguageCodeA2( (nn::cfg::CTR::CfgLanguageCode)System::getCfgLanguage() );
|
||
if(!lang)
|
||
{
|
||
return nn::MakeStatusResult(nn::Result::SUMMARY_INVALID_STATE, nn::Result::MODULE_APPLICATION, nn::Result::DESCRIPTION_INVALID_RESULT_VALUE);
|
||
}
|
||
const char* country = nn::cfg::CTR::GetCountryCodeA2( (nn::cfg::CTR::CfgCountryCode)( System::getCfgCountryCode()));
|
||
if(!country)
|
||
{
|
||
return nn::MakeStatusResult(nn::Result::SUMMARY_INVALID_STATE, nn::Result::MODULE_APPLICATION, nn::Result::DESCRIPTION_INVALID_RESULT_VALUE);
|
||
}
|
||
const char* boss_code = nn::news::CTR::boss::GetBossCodeA3( (nn::cfg::CTR::CfgRegionCode)System::getRegion() );
|
||
if(!boss_code)
|
||
{
|
||
return nn::MakeStatusResult(nn::Result::SUMMARY_INVALID_STATE, nn::Result::MODULE_APPLICATION, nn::Result::DESCRIPTION_INVALID_RESULT_VALUE);
|
||
}
|
||
|
||
NN_UTIL_RETURN_IF_FAILED(
|
||
nn::news::CTR::boss::RegisterSystemTask( boss_code, country, lang )
|
||
);
|
||
|
||
NN_LOG( "Boss Task Set\n" );
|
||
}
|
||
|
||
return nn::ResultSuccess();
|
||
}
|
||
|
||
|
||
void UserInfoAccessor::setBossSendInfoTask()
|
||
{
|
||
// 初回起動シーケンスを通っていなかったら何もしない
|
||
if( isFirst() )
|
||
{
|
||
NN_LOG("not initialize mset\n");
|
||
return;
|
||
}
|
||
|
||
// BOSS への送信がオプトアウトされてたら何もしない
|
||
data_user_info_( eKindBoss, 0 );
|
||
if( !msNetInfo.net_boss.isAllowedUploadPersonalData )
|
||
{
|
||
NN_LOG("not allow upload\n");
|
||
return;
|
||
}
|
||
|
||
if( !save_boss_send_info_() )
|
||
{
|
||
// 更新がなかったので情報は送信しない
|
||
NN_LOG("no change send boss info\n");
|
||
return;
|
||
}
|
||
|
||
// タスクの登録
|
||
set_boss_send_info_task_();
|
||
}
|
||
|
||
nn::Result UserInfoAccessor::setBossSendInfoTaskFirst()
|
||
{
|
||
// 初回起動シーケンスのときは EULA に同意していたらセットする
|
||
// EULAはCFGから取得する
|
||
using namespace nn::cfg::detail;
|
||
nn::cfg::system::Initialize();
|
||
EulaInfoCfgData eulaInfo;
|
||
NN_UTIL_RETURN_IF_FAILED(
|
||
nn::cfg::system::GetConfig(&eulaInfo, sizeof(EulaInfoCfgData), GET_CFG_KEY(NN_CFG_EULA, NN_CFG_EULA_INFO))
|
||
);
|
||
nn::cfg::system::Finalize();
|
||
|
||
if(!eulaInfo.agreeVersion.version > 0)
|
||
{
|
||
return nn::ResultSuccess();
|
||
}
|
||
|
||
if( !save_boss_send_info_() )
|
||
{
|
||
// 更新がなかったので情報は送信しない
|
||
NN_LOG("no change send boss info\n");
|
||
return nn::ResultSuccess();
|
||
}
|
||
|
||
// タスクの登録
|
||
set_boss_send_info_task_();
|
||
|
||
return nn::ResultSuccess();
|
||
}
|
||
|
||
void UserInfoAccessor::set_boss_send_info_task_()
|
||
{
|
||
const u16 cTaskExecuteTime = 1;
|
||
const u16 cTaskExecuteCount = 1;
|
||
const char* cTaskUrl = "https://npul.c.app.nintendowifi.net/p01/recv/%s/%s";
|
||
const nn::boss::TaskPermission permission = nn::boss::TASK_PERMISSION_IN_PARENTAL_CONTROL;
|
||
const wchar_t* filePath = sys::File::getMsetSysSaveDataPath( sys::File::eSysSaveDataTypeBoss );
|
||
const int setSha1HashLen = 41;
|
||
|
||
nn::Result result;
|
||
nn::fs::FileReader file;
|
||
nn::boss::Task task;
|
||
nn::boss::TaskPolicy policy;
|
||
nn::boss::UploadAction action;
|
||
u8* readData = NULL;
|
||
u8* readDataSha1 = NULL;
|
||
char setSha1Hash[ setSha1HashLen ];
|
||
size_t readDataSize = 0;
|
||
|
||
// システムセーブデータのマウント
|
||
sys::File::initializeMsetSys();
|
||
|
||
result = task.Initialize( cSendBossInfoTaskId );
|
||
NN_RESULT_ASSERT( result );
|
||
|
||
result = policy.Initialize( cTaskExecuteTime, cTaskExecuteCount );
|
||
NN_RESULT_ASSERT( result );
|
||
result = policy.SetProperty( nn::boss::TASK_PERMISSION, &permission, sizeof( permission ) );
|
||
NN_RESULT_ASSERT( result );
|
||
|
||
// すでに登録されていた場合を考慮してタスクを削除します。
|
||
// デーモンをとめていないと失敗する可能性がありますが、
|
||
// MSET では起動時にデーモンを止めているため、
|
||
// ここでデーモンを止める処理は呼びません。
|
||
// また、失敗しても作業を続けるため、戻り値のチェックはしません。
|
||
// ファイルがクローズされないようにファイルオープンよりも先に
|
||
// タスクは削除します。
|
||
nn::boss::UnregisterTask( &task );
|
||
|
||
// ファイルの読み込み
|
||
result = file.TryInitialize( filePath );
|
||
if( result.IsFailure() )
|
||
{
|
||
// ここにきた際にファイルが読み込めないことはないはず
|
||
// 読み込めなかったらこの先の処理も意味がなくなるのでリターンしてしまう
|
||
file.Finalize();
|
||
NN_LOG("can't initialize sendBossInfo file\n");
|
||
sys::File::finalizeMsetSys();
|
||
return;
|
||
}
|
||
|
||
{
|
||
const int len = 100;
|
||
char url[ len ];
|
||
snprintf( url, len, cTaskUrl, getMsetBossCode(), cSendBossInfoTaskId );
|
||
NN_LOG("url:%s\n", url);
|
||
result = action.InitializeForBossDb( url, file.GetHandle() );
|
||
}
|
||
NN_RESULT_ASSERT( result );
|
||
|
||
// クライアント証明書の設定
|
||
result = action.SetClientCert( NNSSL_CLIENTCERT_DEFAULT );
|
||
NN_RESULT_ASSERT( result );
|
||
|
||
// SSL証明書を設定します.
|
||
result = action.SetRootCa( nn::ssl::CACERT_PUBLIC_CA_1 );
|
||
NN_RESULT_ASSERT( result );
|
||
result = action.SetRootCa( nn::ssl::CACERT_NINTENDO_CA_G3 );
|
||
NN_RESULT_ASSERT( result );
|
||
|
||
// 読み込んだファイルの中身をsha-1でハッシュ値計算
|
||
{
|
||
// ファイル読み込み
|
||
// 中で fileReader のinitialize が再び行われるのが少し冗長だが安全に読み込むため
|
||
readData = sys::File::read( filePath, &readDataSize, false, false );
|
||
if( readData == NULL )
|
||
{
|
||
// 読み込み失敗
|
||
file.Finalize();
|
||
NN_LOG("can't read sendBossInfo file\n");
|
||
sys::File::finalizeMsetSys();
|
||
return;
|
||
}
|
||
readDataSha1 = new( sys::Mem::getMainHeap(), 4 ) u8[ nn::crypto::Sha1Context::HASH_SIZE ];
|
||
nn::crypto::CalculateSha1( readDataSha1, readData, readDataSize );
|
||
snprintf( setSha1Hash, setSha1HashLen,
|
||
"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n",
|
||
readDataSha1[ 0 ], readDataSha1[ 1 ], readDataSha1[ 2 ],
|
||
readDataSha1[ 3 ], readDataSha1[ 4 ], readDataSha1[ 5 ],
|
||
readDataSha1[ 6 ], readDataSha1[ 7 ], readDataSha1[ 8 ],
|
||
readDataSha1[ 9 ], readDataSha1[ 10 ], readDataSha1[ 11 ],
|
||
readDataSha1[ 12 ], readDataSha1[ 13 ], readDataSha1[ 14 ],
|
||
readDataSha1[ 15 ], readDataSha1[ 16 ], readDataSha1[ 17 ],
|
||
readDataSha1[ 18 ], readDataSha1[ 19 ] );
|
||
NN_LOG("setSha1Hash:%s\n", setSha1Hash);
|
||
|
||
result = action.AddHeaderField( "X-Boss-Digest", setSha1Hash );
|
||
delete[] readDataSha1;
|
||
delete[] readData;
|
||
NN_RESULT_ASSERT( result );
|
||
}
|
||
|
||
result = nn::boss::RegisterTask( &task, &policy, &action );
|
||
NN_RESULT_ASSERT( result );
|
||
|
||
result = task.Start();
|
||
NN_RESULT_ASSERT( result );
|
||
|
||
file.Finalize();
|
||
sys::File::finalizeMsetSys();
|
||
|
||
NN_LOG("task set send boss info\n");
|
||
}
|
||
|
||
|
||
void UserInfoAccessor::saveBossSendInfoTaskOptoutFlag( bool optoutFlag )
|
||
{
|
||
nn::Result result;
|
||
|
||
if( optoutFlag )
|
||
{
|
||
NN_LOG("send boss info task cancel\n");
|
||
result = nn::boss::CancelTask( getMsetPid(), cSendBossInfoTaskId );
|
||
NN_LOG("mset cancel task\n");
|
||
NN_DBG_PRINT_RESULT( result );
|
||
result = nn::boss::CancelTask( getHomePid(), cSendBossMmenTaskId );
|
||
NN_LOG("mmen cancel task\n");
|
||
NN_DBG_PRINT_RESULT( result );
|
||
result = nn::boss::CancelTask( getHomePid(), cSendPhuTaskId );
|
||
NN_LOG("pedometer cancel task\n");
|
||
NN_DBG_PRINT_RESULT( result );
|
||
result = nn::boss::CancelTask( getHomePid(), cSendTiuTaskId );
|
||
NN_LOG("task info cancel task\n");
|
||
NN_DBG_PRINT_RESULT( result );
|
||
result = nn::boss::CancelTask( getHomePid(), cSendSpluTaskId );
|
||
NN_LOG("street pass cancel task\n");
|
||
NN_DBG_PRINT_RESULT( result );
|
||
result = nn::boss::CancelTask( getPnotePid(), cSendBossPnoteTaskId );
|
||
NN_LOG("pnote cancel task\n");
|
||
NN_DBG_PRINT_RESULT( result );
|
||
}
|
||
else
|
||
{
|
||
NN_LOG("send boss info task start\n");
|
||
result = nn::boss::StartTask( getMsetPid(), cSendBossInfoTaskId );
|
||
NN_LOG("mset start task\n");
|
||
NN_DBG_PRINT_RESULT( result );
|
||
result = nn::boss::StartTask( getHomePid(), cSendBossMmenTaskId );
|
||
NN_LOG("mmen start task\n");
|
||
NN_DBG_PRINT_RESULT( result );
|
||
result = nn::boss::StartTask( getHomePid(), cSendPhuTaskId );
|
||
NN_LOG("pedometer start task\n");
|
||
NN_DBG_PRINT_RESULT( result );
|
||
result = nn::boss::StartTask( getHomePid(), cSendTiuTaskId );
|
||
NN_LOG("task info start task\n");
|
||
NN_DBG_PRINT_RESULT( result );
|
||
result = nn::boss::StartTask( getHomePid(), cSendSpluTaskId );
|
||
NN_LOG("street pass start task\n");
|
||
NN_DBG_PRINT_RESULT( result );
|
||
result = nn::boss::StartTask( getPnotePid(), cSendBossPnoteTaskId );
|
||
NN_LOG("pnote start task\n");
|
||
NN_DBG_PRINT_RESULT( result );
|
||
}
|
||
// 消尽回数1回のタスクがあるので、すでにタスクがなかったときのためにアサートしない
|
||
//NN_RESULT_ASSERT( result );
|
||
}
|
||
|
||
|
||
bool UserInfoAccessor::save_boss_send_info_()
|
||
{
|
||
size_t size = sizeof( BossSendInfo );
|
||
BossSendInfo* pSaveData = new( sys::Mem::getMainHeap() ) BossSendInfo;
|
||
bool ret = false;
|
||
|
||
sys::File::initializeMsetSys();
|
||
sys::File::readMsetFile( (u8*)pSaveData, size, sys::File::eSysSaveDataTypeBoss );
|
||
|
||
// 送信情報の取得
|
||
prepareBossSendInfo();
|
||
if( checkUpdateBossSendInfo( pSaveData ) )
|
||
{
|
||
// 更新があったときのみセーブする
|
||
NN_LOG("save send boss info\n");
|
||
memcpy( pSaveData, &msBossSendInfo, size );
|
||
sys::File::saveMsetSys( (u8*)pSaveData, size, sys::File::eSysSaveDataTypeBoss );
|
||
ret = true;
|
||
}
|
||
sys::File::finalizeMsetSys();
|
||
|
||
if( pSaveData != NULL ) { delete pSaveData; }
|
||
|
||
return ret;
|
||
}
|
||
|
||
|
||
bool UserInfoAccessor::checkUpdateBossSendInfo( BossSendInfo* pSaveData )
|
||
{
|
||
bool ret = false;
|
||
|
||
// BossSendInfo のサイズが4で割り切れることを利用して実装しているため
|
||
// 4で割り切れなかったときは警告
|
||
NN_LOG("sizeof( BossSendInfo ):%d\n", sizeof( BossSendInfo ));
|
||
NN_ASSERT( sizeof( BossSendInfo ) % sizeof( u32 ) == 0 );
|
||
|
||
#if 0
|
||
for( int i = 0; i < NetInfo::eInfoMax; ++i )
|
||
{
|
||
NN_LOG("[%d]networkVersion:%d %d\n", i,
|
||
pSaveData->netInfo[i].networkVersion, msBossSendInfo.netInfo[i].networkVersion);
|
||
NN_LOG("[%d]wirelessEnable:%d %d\n", i,
|
||
pSaveData->netInfo[i].wirelessEnable, msBossSendInfo.netInfo[i].wirelessEnable);
|
||
NN_LOG("[%d]wirelessEditableEssidSecrity:%d %d\n", i,
|
||
pSaveData->netInfo[i].wirelessEditableEssidSecrity, msBossSendInfo.netInfo[i].wirelessEditableEssidSecrity);
|
||
NN_LOG("[%d]multiSsidEnable:%d %d\n", i,
|
||
pSaveData->netInfo[i].multiSsidEnable, msBossSendInfo.netInfo[i].multiSsidEnable);
|
||
NN_LOG("[%d]ipEnableDHCP:%d %d\n", i,
|
||
pSaveData->netInfo[i].ipEnableDHCP, msBossSendInfo.netInfo[i].ipEnableDHCP);
|
||
NN_LOG("[%d]ipAutoDNSSetting:%d %d\n", i,
|
||
pSaveData->netInfo[i].ipAutoDNSSetting, msBossSendInfo.netInfo[i].ipAutoDNSSetting);
|
||
NN_LOG("[%d]proxyEnable:%d %d\n", i,
|
||
pSaveData->netInfo[i].proxyEnable, msBossSendInfo.netInfo[i].proxyEnable);
|
||
NN_LOG("[%d]otherEnableUPnP:%d %d\n", i,
|
||
pSaveData->netInfo[i].otherEnableUPnP, msBossSendInfo.netInfo[i].otherEnableUPnP);
|
||
NN_LOG("[%d]essidSecurityMode:%d %d\n", i,
|
||
pSaveData->netInfo[i].essidSecurityMode, msBossSendInfo.netInfo[i].essidSecurityMode);
|
||
NN_LOG("[%d]multiSsidType:%d %d\n", i,
|
||
pSaveData->netInfo[i].multiSsidType, msBossSendInfo.netInfo[i].multiSsidType);
|
||
NN_LOG("[%d]proxyAuthType:%d %d\n", i,
|
||
pSaveData->netInfo[i].proxyAuthType, msBossSendInfo.netInfo[i].proxyAuthType);
|
||
NN_LOG("[%d]padding:%d %d\n", i,
|
||
pSaveData->netInfo[i].padding, msBossSendInfo.netInfo[i].padding);
|
||
}
|
||
#endif
|
||
|
||
u32* pSave = (u32*)pSaveData;
|
||
u32* pCfg = (u32*)(&msBossSendInfo);
|
||
|
||
for( int i = 0; i < ( sizeof( BossSendInfo ) / sizeof( u32 ) ); ++i )
|
||
{
|
||
if( pSave[ i ] != pCfg[ i ] )
|
||
{
|
||
NN_LOG("i:%d change %08x != %08x\n", i, pSave[ i ], pCfg[ i ]);
|
||
ret = true;
|
||
break;
|
||
}
|
||
}
|
||
|
||
return ret;
|
||
}
|
||
|
||
|
||
#ifdef MAKE_ACCTEST
|
||
#ifndef NW_RELEASE
|
||
//==========================================================================
|
||
// CFGデータ(ネット設定)のモニタ
|
||
//==========================================================================
|
||
void UserInfoAccessor::print_net_save_()
|
||
{
|
||
NN_LOG( "****** Net wireless SAVE DATA ******\n" );
|
||
|
||
for( int i = 0; i < 3; i++ )
|
||
{
|
||
NN_LOG( "--- Setting %d ---\n", i+1 );
|
||
if( !msNetInfo.setting[i].wireless.enable )
|
||
{
|
||
NN_LOG( " no set\n\n" );
|
||
continue;
|
||
}
|
||
|
||
NN_LOG( "version : %d\n", msNetInfo.setting[i].version );
|
||
NN_LOG( "wireless\n" );
|
||
NN_LOG( " editable : %d\n\n", msNetInfo.setting[i].wireless.editableEssidSecurity );
|
||
NN_LOG( "essidSecurity\n" );
|
||
|
||
{
|
||
char ssid[40] = "";
|
||
|
||
for( int j = 0; j < 32; j++ )
|
||
{
|
||
ssid[j] = msNetInfo.setting[i].wireless.essidSecurity.ssid[j];
|
||
}
|
||
NN_LOG( " ssid : %s\n", ssid );
|
||
}
|
||
|
||
NN_LOG( " ssidLength : %d\n", msNetInfo.setting[i].wireless.essidSecurity.ssidLength );
|
||
NN_LOG( " securityMode = %d\n", msNetInfo.setting[i].wireless.essidSecurity.securityMode );
|
||
|
||
{
|
||
char pass[70] = "";
|
||
|
||
for( int j = 0; j < 64; j++ )
|
||
{
|
||
pass[j] = msNetInfo.setting[i].wireless.essidSecurity.passphrase[j];
|
||
}
|
||
NN_LOG( " passphrase : %s\n", pass );
|
||
}
|
||
|
||
NN_LOG( " key :\n" );
|
||
for( int j = 0; j < 64; j++ )
|
||
{
|
||
NN_LOG( "%02x ", msNetInfo.setting[i].wireless.essidSecurity.key[j] );
|
||
if( (j%16) == 15 )
|
||
{
|
||
NN_LOG( "\n" );
|
||
}
|
||
}
|
||
|
||
if( !msNetInfo.setting[i].wireless.multiSsid.enable )
|
||
{
|
||
NN_LOG( " Multi no set\n\n" );
|
||
continue;
|
||
}
|
||
|
||
NN_LOG( " Multi Setting type : %d\n", msNetInfo.setting[i].wireless.multiSsid.multiSsidType );
|
||
NN_LOG( " Setting num = %d\n", msNetInfo.setting[i].wireless.multiSsid.settingNum );
|
||
|
||
for( int n = 0; n < 4; n++ )
|
||
{
|
||
{
|
||
char ssid[40] = "";
|
||
|
||
for( int j = 0; j < 32; j++ )
|
||
{
|
||
ssid[j] = msNetInfo.setting[i].wireless.multiSsid.setting[n].ssid[j];
|
||
}
|
||
NN_LOG( " ssid : %s\n", ssid );
|
||
}
|
||
|
||
NN_LOG( " ssidLength : %d\n", msNetInfo.setting[i].wireless.multiSsid.setting[n].ssidLength );
|
||
NN_LOG( " securityMode = %d\n", msNetInfo.setting[i].wireless.multiSsid.setting[n].securityMode );
|
||
|
||
{
|
||
char pass[70] = "";
|
||
|
||
for( int j = 0; j < 64; j++ )
|
||
{
|
||
pass[j] = msNetInfo.setting[i].wireless.multiSsid.setting[n].passphrase[j];
|
||
}
|
||
NN_LOG( " passphrase : %s\n", pass );
|
||
}
|
||
|
||
NN_LOG( " key :\n" );
|
||
for( int j = 0; j < 64; j++ )
|
||
{
|
||
NN_LOG( "%02x ", msNetInfo.setting[i].wireless.multiSsid.setting[n].key[j] );
|
||
if( (j%16) == 15 )
|
||
{
|
||
NN_LOG( "\n" );
|
||
}
|
||
}
|
||
|
||
NN_LOG( "\n" );
|
||
}
|
||
|
||
NN_LOG( "\n" );
|
||
}
|
||
|
||
NN_LOG( "****** Net wireless SAVE DATA END ******\n" );
|
||
}
|
||
#endif
|
||
#endif
|
||
|
||
#ifndef NW_RELEASE
|
||
bool UserInfoAccessor::check_order_twl_user_info_font_table_()
|
||
{
|
||
int size = sizeof( cTwlUserInfoFontCodeTable )/sizeof( u16 );
|
||
//データが昇順であることを確認する
|
||
for(s32 i=1;i<size;i++)
|
||
{
|
||
if(cTwlUserInfoFontCodeTable[i] <= cTwlUserInfoFontCodeTable[i-1])
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
#endif
|
||
|
||
}
|
||
|
||
#endif // MAKE_AREACHECK
|