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@331 385bec56-5757-e545-9c3a-d8741f4650f1
This commit is contained in:
parent
f18fdbd1cf
commit
91e01bb4c5
@ -39,9 +39,9 @@ LIBS += libnn_ps
|
||||
|
||||
IMPORTEE_CIA = importee.cia
|
||||
|
||||
SRC_IMPORTEE_PATH = ../body/images/$(BUILD_TARGET_DIR)/$(BUILD_TYPE_DIR)/CtrSaveDataMover.cia
|
||||
#SRC_IMPORTEE_PATH = ../body/images/$(BUILD_TARGET_DIR)/$(BUILD_TYPE_DIR)/CtrSaveDataMover.cia
|
||||
#とりあえず、マスタリング時は直おき、配置時に改名
|
||||
#SRC_IMPORTEE_PATH = CtrSaveDataMover_master.cia
|
||||
SRC_IMPORTEE_PATH = CtrSaveDataMover_master.cia
|
||||
|
||||
# ビルドタイプ別に romfs を作る
|
||||
#ROMFS_ROOT = $`(TARGET.getObjectDirectory)/romfsroot
|
||||
|
||||
@ -57,7 +57,7 @@ CTR_BANNER_SPEC = banner_null_icon.bsf
|
||||
|
||||
#Cia バージョン:マスタリング毎に更新すること
|
||||
#メジャーはrsfで指定(Remasterversion)
|
||||
MAKECIAFLAGS = -minor 0 -micro 11
|
||||
MAKECIAFLAGS = -minor 0 -micro 12
|
||||
|
||||
include $(ROOT_OMAKE)/modulerules
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -91,21 +91,6 @@ void pushButton(u32 sts)
|
||||
//NN_LOG("button > %4x\n",button);
|
||||
u32 trg = sts & 0x0ffff;
|
||||
u32 hld = sts >> 16;
|
||||
/*
|
||||
if (holdVal)//同時押し猶予期間
|
||||
{
|
||||
if (nn::fnd::TimeSpan::FromMilliSeconds(100) > (nn::os::Tick::GetSystemCurrent()-holdTck)){
|
||||
holdVal |= trg;
|
||||
if (holdVal == nn::hid::BUTTON_LEFT | holdVal & nn::hid::BUTTON_X ){
|
||||
holdVal = 0;
|
||||
scr_evnt = EVNT_PUSH_LEFT_X;
|
||||
}
|
||||
}else holdVal = 0;
|
||||
}else if( (holdVal = trg & (nn::hid::BUTTON_LEFT | nn::hid::BUTTON_X ))>0)
|
||||
{//一定時間どっちかのボタン押し維持
|
||||
holdTck = nn::os::Tick::GetSystemCurrent();
|
||||
}
|
||||
*/
|
||||
|
||||
if( holdVal )//押し続け判定
|
||||
{
|
||||
@ -123,21 +108,6 @@ void pushButton(u32 sts)
|
||||
holdVal = hld;
|
||||
holdTck = nn::os::Tick::GetSystemCurrent();
|
||||
}
|
||||
|
||||
|
||||
#ifdef DEBUG_ENABLE
|
||||
else if (hld & nn::hid::BUTTON_DOWN)//同時押し
|
||||
{
|
||||
if (hld & nn::hid::BUTTON_Y)
|
||||
if (hld & nn::hid::BUTTON_X)
|
||||
scr_evnt = EVNT_PUSH_DOWN_Y;
|
||||
}
|
||||
else if (trg & nn::hid::BUTTON_R)scr_evnt = EVNT_PUSH_R;
|
||||
else if (trg & nn::hid::BUTTON_L)scr_evnt = EVNT_PUSH_L;
|
||||
#endif
|
||||
#ifdef ENABLE_CRUSH
|
||||
else if (trg & nn::hid::BUTTON_Y)scr_evnt = EVNT_PUSH_Y;
|
||||
#endif
|
||||
else if (trg & nn::hid::BUTTON_B)scr_evnt = EVNT_PUSH_B;
|
||||
}
|
||||
|
||||
@ -520,18 +490,6 @@ void scr_TopMenu(bool formatted,bool inserted,bool exfm,bool bkupins,int err)
|
||||
|
||||
u32 mask = 0;
|
||||
mask |= (nn::hid::BUTTON_LEFT | nn::hid::BUTTON_X);//LEFT+X = Delete 有効
|
||||
#ifdef DEBUG_ENABLE
|
||||
mask | = ( nn::hid::BUTTON_DOWN | nn::hid::BUTTON_Y |nn::hid::BUTTON_X|nn::hid::BUTTON_L | nn::hid::BUTTON_R);
|
||||
#endif
|
||||
#ifdef CRUSH_ENABLE
|
||||
extern bool CrashForDebug;
|
||||
mask | = nn::hid::BUTTON_Y;
|
||||
if (CrashForDebug==0) gui.MessEffective(MESSAGE_MENU_DEBUG,false,false);
|
||||
else{
|
||||
sprintf(scr_debug,"Crush mode %d",CrashForDebug);
|
||||
gui.MessEffective(MESSAGE_MENU_DEBUG);
|
||||
}
|
||||
#endif
|
||||
|
||||
gui.MessStr(MESSAGE_TITLE," < CTR Card Savedata Mover >");
|
||||
|
||||
@ -549,9 +507,9 @@ void scr_TopMenu(bool formatted,bool inserted,bool exfm,bool bkupins,int err)
|
||||
mask |= (nn::hid::BUTTON_LEFT | nn::hid::BUTTON_X);//LEFT+X = Delete 有効
|
||||
gui.PanelEffective(PANEL_READ,false,false);
|
||||
i =0;
|
||||
if (err & SDATA_ERRPUT_MEDIA) i = ERC_MEDIA + ERC_DEV_CARD;//バックアップがない
|
||||
else
|
||||
if (err & SDATA_ERRPUT_PCODE) i = ERC_DEV_OTHER + ERC_PRODCODE;//プロダクトコード不一致
|
||||
//else
|
||||
//if (err & SDATA_ERRPUT_MEDIA) i = ERC_MEDIA + ERC_DEV_CARD;//バックアップなし
|
||||
if (i !=0 )
|
||||
{
|
||||
gui.PanelEffective(PANEL_WRITE,false,false);
|
||||
@ -572,11 +530,9 @@ void scr_TopMenu(bool formatted,bool inserted,bool exfm,bool bkupins,int err)
|
||||
gui.MessEffective(MESSAGE_MENU_CAUTION);
|
||||
|
||||
}else{
|
||||
if (err & SDATA_ERRPUT_MEDIA) i = ERC_MEDIA + ERC_DEV_CARD;//バックアップがない
|
||||
else
|
||||
if (err & SDATA_ERRPUT_VERIFI) i = ERC_SDK_VERIFI + ERC_DEV_CARD;//データが壊れている
|
||||
if (err & SDATA_ERRPUT_MEDIA) i = ERC_MEDIA + ERC_DEV_CARD;//セーブデータがマウントできない
|
||||
else if (bkupins == false) i = ERC_DEVICE + ERC_DEV_OUT;//書出し先デバイスが無い
|
||||
else i = ERC_FORMAT + ERC_DEV_CARD;//フォーマットエラー
|
||||
else i = ERC_DEV_OTHER;//不明
|
||||
sprintf(scr_err,"ERROR %d",i);
|
||||
gui.MessEffective(MESSAGE_MENU_ERROR);
|
||||
}
|
||||
|
||||
@ -16,7 +16,7 @@
|
||||
#ifndef VER_H_
|
||||
#define VER_H_
|
||||
|
||||
#define VERSION 1.05
|
||||
#define VERSION 1.10
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@ -10,6 +10,7 @@ CUP
|
||||
|
||||
(インポート手順)
|
||||
・デバッガもしくはライタで"cci"をカードに書き込む
|
||||
・本体シリアル含んだリストと署名が入ったSDを差す
|
||||
・Homeメニューよりカード起動しメニューからInport実行
|
||||
・メニューのImportを選ぶ
|
||||
・終了したら電源ボタンを短押し ->"電源を切る"をタッチ
|
||||
@ -21,20 +22,6 @@ CUP
|
||||
・メニューからDelete実行
|
||||
終了後はメニューに戻ります
|
||||
|
||||
(テストパターン書き込み)
|
||||
カード上のバックアップにテストデータを書き込みます
|
||||
手元に使えるゲームカードが無い場合の動作確認用です
|
||||
起動まではインポートと同様
|
||||
・デバッガもしくはライタで"cci"をカードに書き込む
|
||||
・カードを本体に差しメニューからTest Data実行
|
||||
・カーソルで内容を選択、Aでライト、Xでベリファイ
|
||||
種別はCasual Test を選ぶ、他はリリース時のチェックに使う程度
|
||||
|
||||
<テスト手順>
|
||||
ライト後に一旦終了してHomeメニューにもどり
|
||||
Nand上のツールを起動し、リード&リストア
|
||||
Homeボタンなどでツール終了、カード起動しベリファイ
|
||||
|
||||
|
||||
ツール本体の操作は操作マニュアル参照
|
||||
|
||||
@ -42,9 +29,13 @@ Home
|
||||
[Histry]
|
||||
#表示ver マスタリング時のver
|
||||
# 変更内容
|
||||
v1.10 - Remaster 2.0.12
|
||||
body:ルート下ディレクトリの最初しか検索しない不具合を修正(ロンチゲー影響なし)
|
||||
ファイルがメモリ上の確保サイズを超えた時にエラー表示
|
||||
フォーマット系エラー表示を統合(エラー番号106)
|
||||
|
||||
v1.04 - Remaster 2.0.9 - svnリビジョン 190
|
||||
body,imp: アイコンを?に変更:初期メニューのバグでフラグで拒否しても履歴に見えてしまう
|
||||
v1.04 - Remaster 2.0.10 - svnリビジョン 190
|
||||
body,imp: アイコンを?に変更:メニューのバグで拒否フラグ設定しても初期ファームでは履歴に見えてしまう
|
||||
動作中の無線停止
|
||||
|
||||
v1.03 - Remaster 2.0.8 - svnリビジョン 181
|
||||
|
||||
@ -145,7 +145,7 @@ bool TryDeleteDir()
|
||||
{
|
||||
if(exsave.Delete())return true;
|
||||
//フォルダ削除に失敗したら手削除
|
||||
strcpy(mes,"broken folder [ ");
|
||||
strcpy(mes,"Illegal folder [ ");
|
||||
strcat(mes,exsave.DirName);//フォルダ名
|
||||
strcat(mes," ]");
|
||||
//scr_Status(sts,COLOR_RED);
|
||||
@ -153,6 +153,21 @@ bool TryDeleteDir()
|
||||
return false;
|
||||
}
|
||||
|
||||
//情報ファイルの占有サイズ計算
|
||||
//vnfは発生見込み低い上、面倒なので作成時エラー任せ
|
||||
size_t GetSysSpace(size_t cl)
|
||||
{
|
||||
size_t sz;
|
||||
int sn;
|
||||
sn = sizeof(FormatParameters) / cl;
|
||||
if ((sizeof(FormatParameters) % cl) > 0)sn++;
|
||||
sz = sn*cl;
|
||||
sn = sizeof(AdditionalInfo) / cl;
|
||||
if ((sizeof(AdditionalInfo) % cl) > 0)sn++;
|
||||
sz += sn*cl;
|
||||
return sz;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------- CARD to SD
|
||||
RetCode Card2Sd()
|
||||
{
|
||||
@ -165,38 +180,65 @@ RetCode Card2Sd()
|
||||
if(isInsEject != InEx_None )return INSEXIT;//挿抜による中断
|
||||
if (scr_evnt != EVNT_YES)return CANCEL;//キャンセル
|
||||
scr_Backup();//画面表示
|
||||
scr_Status("Mount SaveData",COLOR_YELLO);
|
||||
|
||||
|
||||
//保存先ディレクトリ作成
|
||||
//ディレクトリ作成時にクラスタサイズ、空き容量を取得
|
||||
scr_Status("Create Dir to SD",COLOR_YELLO);
|
||||
if (exsave.Create() == false)
|
||||
{
|
||||
PutError(ERC_DEV_OUT);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
//セーブデータのマウント
|
||||
scr_Status("Mount SaveData",COLOR_YELLO);
|
||||
res = savedata.Mount();
|
||||
if(res != RESULT_OK){
|
||||
exsave.Unmount();
|
||||
TryDeleteDir();
|
||||
PutError(ERC_DEV_CARD);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
//ディレクトリ情報
|
||||
scr_Status("Get Directry",COLOR_YELLO);
|
||||
if(savedata.GetInfo(&arcInfo)==false)
|
||||
if(savedata.GetInfo(&arcInfo,exsave.ClasterSize)==false)
|
||||
{
|
||||
savedata.Unmount();
|
||||
exsave.Unmount();
|
||||
PutError(ERC_DEV_CARD);
|
||||
TryDeleteDir();
|
||||
return ERROR;
|
||||
}
|
||||
strcpy(arcInfo.Pcode,savedata.PrdCode);
|
||||
|
||||
if ((arcInfo.total + GetSysSpace(exsave.ClasterSize)) > exsave.FreeSize)
|
||||
{//容量不足
|
||||
savedata.Unmount();
|
||||
exsave.Unmount();
|
||||
PutError(ERC_DEV_OUT,ERC_WRITE_NS);
|
||||
TryDeleteDir();
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
//カウント異常
|
||||
if (arcInfo.FileCount > arcInfo.FileEntry){
|
||||
savedata.Unmount();
|
||||
exsave.Unmount();
|
||||
PutError(ERC_DEV_OTHER,ERC_EXEC);
|
||||
TryDeleteDir();
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
if (arcInfo.FileCount == 0)//ファイルが無い
|
||||
{
|
||||
scr_Status("no files",COLOR_YELLO);
|
||||
savedata.Unmount();
|
||||
exsave.Unmount();
|
||||
TryDeleteDir();
|
||||
return SUCCESS;//何もしない
|
||||
}else{
|
||||
//保存先ディレクトリ作成
|
||||
scr_Status("Create Dir",COLOR_YELLO);
|
||||
if (exsave.Create() == false)
|
||||
{
|
||||
savedata.Unmount();
|
||||
PutError(ERC_DEV_OUT);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
//ファイルコピー
|
||||
scr_Status("file copying",COLOR_SKY);
|
||||
savedata.ResetPath();
|
||||
@ -385,36 +427,21 @@ void CheckSaveDataState()
|
||||
{
|
||||
myResult myres;
|
||||
|
||||
|
||||
Formatted = false;//フォーマット
|
||||
Formatted = false;
|
||||
Active = false;
|
||||
//failveri = false;
|
||||
|
||||
|
||||
if (savedata.GetPrdCode())
|
||||
{
|
||||
myres = savedata.IsExist();
|
||||
if (myres != RESULT_FAIL)
|
||||
Active = true;//カード
|
||||
myres = savedata.IsExist();//セーブマウント
|
||||
//NN_LOG("%d",savedata.LastNnResult.GetDescription());
|
||||
if (myres == RESULT_OK)
|
||||
{
|
||||
Active = true;//アクセス可能
|
||||
switch(myres){
|
||||
case RESULT_OK:
|
||||
Formatted=true;
|
||||
break;
|
||||
case RESULT_NO_MEDIA:
|
||||
tmerr |= SDATA_ERRPUT_MEDIA;
|
||||
break;
|
||||
case RESULT_NOT_FAUND:
|
||||
break;
|
||||
case RESULT_SDK_VERIFI:
|
||||
//failveri = true;
|
||||
tmerr |= SDATA_ERRPUT_VERIFI;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
Formatted=true;
|
||||
}else{
|
||||
tmerr |= SDATA_ERRPUT_MEDIA;
|
||||
}
|
||||
}
|
||||
}
|
||||
scr_PrdCode(savedata.PrdCode);
|
||||
}
|
||||
|
||||
|
||||
@ -125,19 +125,6 @@ void pushButton(u32 sts)
|
||||
}
|
||||
|
||||
|
||||
#ifdef DEBUG_ENABLE
|
||||
else if (hld & nn::hid::BUTTON_DOWN)//同時押し
|
||||
{
|
||||
if (hld & nn::hid::BUTTON_Y)
|
||||
if (hld & nn::hid::BUTTON_X)
|
||||
scr_evnt = EVNT_PUSH_DOWN_Y;
|
||||
}
|
||||
else if (trg & nn::hid::BUTTON_R)scr_evnt = EVNT_PUSH_R;
|
||||
else if (trg & nn::hid::BUTTON_L)scr_evnt = EVNT_PUSH_L;
|
||||
#endif
|
||||
#ifdef ENABLE_CRUSH
|
||||
else if (trg & nn::hid::BUTTON_Y)scr_evnt = EVNT_PUSH_Y;
|
||||
#endif
|
||||
else if (trg & nn::hid::BUTTON_B)scr_evnt = EVNT_PUSH_B;
|
||||
}
|
||||
|
||||
@ -524,9 +511,6 @@ void scr_TopMenu(bool formatted,bool inserted,bool sdins,int err)
|
||||
|
||||
u32 mask = 0;
|
||||
mask |= (nn::hid::BUTTON_LEFT | nn::hid::BUTTON_X);//LEFT+X = Delete 有効
|
||||
#ifdef DEBUG_ENABLE
|
||||
mask | = ( nn::hid::BUTTON_DOWN | nn::hid::BUTTON_Y | nn::hid::BUTTON_L | nn::hid::BUTTON_R);
|
||||
#endif
|
||||
|
||||
gui.MessStr(MESSAGE_TITLE," < CTR Card Savedata Exporter >");
|
||||
|
||||
@ -555,10 +539,7 @@ void scr_TopMenu(bool formatted,bool inserted,bool sdins,int err)
|
||||
|
||||
}else{
|
||||
if (err & SDATA_ERRPUT_MEDIA) i = ERC_MEDIA + ERC_DEV_CARD;//バックアップがない
|
||||
else
|
||||
if (err & SDATA_ERRPUT_VERIFI) i = ERC_SDK_VERIFI + ERC_DEV_CARD;//データが壊れている
|
||||
//else if (sdins == false) i = ERC_DEVICE + ERC_DEV_OUT;//書出し先デバイスが無い
|
||||
else i = ERC_FORMAT + ERC_DEV_CARD;//フォーマットエラー
|
||||
else i = ERC_DEV_OTHER;//•s–¾
|
||||
sprintf(scr_err,"ERROR %d",i);
|
||||
gui.MessEffective(MESSAGE_MENU_ERROR);
|
||||
}
|
||||
|
||||
@ -6,14 +6,16 @@
|
||||
|
||||
書き出した内容は
|
||||
CTR_SDK\tools\TargetTools\CTR-TS\Release\NandFiler
|
||||
で開発カードへライトできます
|
||||
で開発カード上のサブカードへライトできます
|
||||
容量やタイトルのチェックはしませんので使用者で注意下さい
|
||||
////////////////////////////////////////////////////////////////
|
||||
|
||||
NANDインポートしてから、内臓アプリ同様の手順で起動
|
||||
本体システム2.31(1stNup)以降にしておく
|
||||
本体情報のバージョン 2.0.0 (1stNup)以降のファームで動作する
|
||||
|
||||
(インポート手順)
|
||||
・デバッガもしくはライタで"cci"をカードに書き込む
|
||||
・本体シリアルを含むリストと署名が入ったSDを入れる
|
||||
・Homeメニューよりカード起動しメニューからInport実行
|
||||
・メニューのImportを選ぶ
|
||||
・終了したら電源ボタンを短押し ->"電源を切る"をタッチ
|
||||
@ -27,5 +29,8 @@ NAND
|
||||
|
||||
ツール本体の操作は操作マニュアル参照
|
||||
|
||||
履歴:
|
||||
2011.6.8 ver0.01(リマスタバージョン1.0.0)
|
||||
|
||||
|
||||
[Histry]
|
||||
|
||||
@ -17,10 +17,10 @@ extern uptr heapForGx;
|
||||
void GetErrorStr(ErcDev dev,nn::Result res,int cd,char* s)
|
||||
{
|
||||
int desc=0,code;
|
||||
desc = res.GetDescription();
|
||||
|
||||
if ((cd ==0 ) && (dev != ERC_DEV_OTHER))
|
||||
{
|
||||
desc = res.GetDescription();
|
||||
if (desc < 100 ) code = ERC_UNKNOWN;//キー検索完了 .. ありえない
|
||||
else if (desc < 180 ) code = ERC_READ;//ファイルが見つからないか不正
|
||||
else if (desc < 200 ) code = ERC_WRITE_OW;//ファイルが存在 .. 削除失敗?
|
||||
@ -36,11 +36,11 @@ void GetErrorStr(ErcDev dev,nn::Result res,int cd,char* s)
|
||||
else if (desc < 900 ) code = ERC_EXEC;//実行時エラー、ソフトバグ
|
||||
else code = ERC_FATAL;//本体に問題の可能性
|
||||
}else code = cd;
|
||||
if (desc>=600){
|
||||
sprintf(s,"ERROR %d, desc %d",dev+code,desc);
|
||||
}else{
|
||||
//if (desc>=600){
|
||||
// sprintf(s,"ERROR %d, desc %d",dev+code,desc);
|
||||
//}else{
|
||||
sprintf(s,"ERROR %d",dev+code);
|
||||
}
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -16,18 +16,6 @@
|
||||
#ifndef MYDEFS_H_
|
||||
#define MYDEFS_H_
|
||||
|
||||
//デバグモード有効化
|
||||
//#define DEBUG_ENABLE 1
|
||||
|
||||
//リストア成功時消去
|
||||
#define SUCCESS_DELETE 1
|
||||
|
||||
//SD使用時
|
||||
//#define BKUP_NOTMEM 1
|
||||
|
||||
//データ壊すモード有効
|
||||
//#define CRUSH_ENABLE 1
|
||||
|
||||
|
||||
//エラー表示コード
|
||||
enum {
|
||||
|
||||
@ -8,8 +8,8 @@ using namespace nn;
|
||||
|
||||
namespace
|
||||
{
|
||||
const size_t BUFFER_SIZE = 10 * 1024 * 1024;
|
||||
bit8 s_Buffer[BUFFER_SIZE] NN_ATTRIBUTE_ALIGN(32);
|
||||
const size_t BUFFER_SIZE = MEM_BKUP_SIZE;
|
||||
bit8 s_Buffer[BUFFER_SIZE] NN_ATTRIBUTE_ALIGN(4096);
|
||||
}
|
||||
|
||||
bool info_alive;
|
||||
@ -46,7 +46,6 @@ MemBak::~MemBak()
|
||||
//--------------------------------------------------------------------
|
||||
// mount, unmount, create, delete
|
||||
|
||||
//拡張セーブデータ
|
||||
//存在確認
|
||||
bool MemBak::IsExist()
|
||||
{
|
||||
@ -54,11 +53,8 @@ bool MemBak::IsExist()
|
||||
}
|
||||
|
||||
//セーブ作成、成功時はマウント状態
|
||||
myResult MemBak::Create(const void* icon,size_t iconSize,u32 entryDir,u32 entryFile)
|
||||
myResult MemBak::Create(u32 entryDir,u32 entryFile)
|
||||
{
|
||||
NN_UNUSED_VAR(icon);
|
||||
NN_UNUSED_VAR(iconSize);
|
||||
|
||||
if ( m_IsMounted )
|
||||
{
|
||||
return RESULT_ALREADY_MOUNT;
|
||||
|
||||
@ -22,6 +22,10 @@
|
||||
#include "savefile.h"
|
||||
#include <nn/math.h>
|
||||
|
||||
//メモリ上の仮想バックアップ容量
|
||||
//SDK更新でアプリ領域が減る可能性あるので無理しない
|
||||
#define MEM_BKUP_SIZE 10*1024*1024
|
||||
|
||||
class MemBak
|
||||
{
|
||||
public:
|
||||
@ -160,8 +164,8 @@ public:
|
||||
MemBak();
|
||||
~MemBak();
|
||||
void Finalize();
|
||||
myResult Create(const void* icon,size_t iconSize,u32 entryDir,u32 entryFile);
|
||||
myResult CreateSys(const void* icon,size_t iconSize);
|
||||
myResult Create(u32 entryDir,u32 entryFile);
|
||||
// myResult CreateSys();
|
||||
myResult Mount();
|
||||
// myResult MountSys();
|
||||
bool IsExist();
|
||||
|
||||
@ -26,10 +26,10 @@ class SaveData: public SaveFileRead,public SaveFileWrite
|
||||
public:
|
||||
char PrdCode[20];
|
||||
private:
|
||||
public:
|
||||
myResult Format(tArcInfo *pinfo);
|
||||
void GetFormatInfoCore(tArcInfo *ifo);
|
||||
public:
|
||||
bool MountCore();
|
||||
myResult Format(tArcInfo *pinfo);
|
||||
void Finalize(){Close();};
|
||||
bool GetPrdCode();
|
||||
bool Commit();
|
||||
|
||||
@ -48,8 +48,6 @@ bool CheckPath(wchar_t *s)
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
//-------------- Class SaveFileWrite
|
||||
//ディレクトリ作成ありのオープン
|
||||
bool SaveFileWrite::OpenC(wchar_t *path,s64 size,bool *mkdir)
|
||||
@ -77,6 +75,7 @@ bool SaveFileWrite::OpenC(wchar_t *path,s64 size,bool *mkdir)
|
||||
pathw_w2[pos2] = 0;//境界まで削除 (例) dir1/dir2/file -> dir1/dir2 -> dir1
|
||||
LastNnResult = nn::fs::TryCreateDirectory(pathw_w2);
|
||||
}
|
||||
|
||||
//作成ディレクトリ多いと画面止まるので、作成ごとに抜ける
|
||||
*mkdir = true; // 帰値:false で mkdir=true ならディレクトリ作成のみ
|
||||
return false;
|
||||
@ -230,7 +229,7 @@ static nn::fs::Directory dcl;
|
||||
|
||||
|
||||
//アーカイブ情報の取得
|
||||
bool SaveFileRead::GetInfo(tArcInfo *pinfo)
|
||||
bool SaveFileRead::GetInfo(tArcInfo *pinfo,size_t clsz)
|
||||
{
|
||||
static nn::fs::DirectoryEntry dcEntryl;
|
||||
static nn::fs::Directory dcl;
|
||||
@ -242,6 +241,7 @@ static nn::fs::Directory dcl;
|
||||
m_info.FileCount = 0;
|
||||
m_info.DirEntry = 0;
|
||||
m_info.FileEntry = 0;
|
||||
m_info.total = 0;
|
||||
m_info.Dup = false;
|
||||
wcscpy(pathw_w,root_w);
|
||||
wcscat(pathw_w,L"/");
|
||||
@ -250,6 +250,7 @@ static nn::fs::Directory dcl;
|
||||
int lv = 0;
|
||||
for (n = 0;n<MAX_LEVEL;n++)dc_readed[n] = 0;
|
||||
bool cont = true;
|
||||
size_t sn;
|
||||
while(cont){
|
||||
LastNnResult = dcl.TryInitialize(pathw_w);//Open
|
||||
if (LastNnResult.IsFailure())return false;
|
||||
@ -267,6 +268,7 @@ static nn::fs::Directory dcl;
|
||||
}else{
|
||||
if(dcEntryl.attributes.isDirectory){//ディレクトリ
|
||||
m_info.DirCount++;
|
||||
if (clsz>0)m_info.total +=clsz;//SD..ディレクトリでクラスタ分取る
|
||||
wcscpy(pathu_w[lv],pathw_w);//パス保存
|
||||
wcscat(pathw_w,dcEntryl.entryName);//次のディレクトリパス
|
||||
wcscat(pathw_w,L"/");
|
||||
@ -274,6 +276,13 @@ static nn::fs::Directory dcl;
|
||||
break;
|
||||
}else{//ファイル
|
||||
m_info.FileCount++;
|
||||
if (clsz==0){
|
||||
m_info.total += dcEntryl.entrySize;
|
||||
}else{//クラスタサイズで調整 .. SD占有容量
|
||||
sn = dcEntryl.entrySize / clsz;
|
||||
if ((dcEntryl.entrySize % clsz) > 0 )sn++;
|
||||
m_info.total += sn*clsz;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -34,8 +34,9 @@ void ChainPath(wchar_t *p1,wchar_t *p2);
|
||||
//セーブに関する情報
|
||||
#define INFO_VERSION 0
|
||||
struct tArcInfo{
|
||||
s64 total;//ファイルサイズ総計
|
||||
u32 DirEntry,FileEntry;//フォーマット
|
||||
u32 DirCount,FileCount;//“o˜^<5E>”
|
||||
u32 DirCount,FileCount;//Dir,ファイル数
|
||||
char Pcode[20];//product code SDKのサイズを下回らないこと
|
||||
bool Dup;//2重化
|
||||
u8 Ver;
|
||||
@ -56,9 +57,7 @@ protected:
|
||||
wchar_t *pPathTop;
|
||||
char devName[16];
|
||||
bool IsMounted;
|
||||
char dumy[3];
|
||||
public:
|
||||
|
||||
//基底パス設定
|
||||
void SetRootPath(wchar_t *path)
|
||||
{// 最後に"/"はつけない 例) "data:"
|
||||
@ -71,7 +70,7 @@ public:
|
||||
wcscpy(path,root_w);
|
||||
|
||||
}
|
||||
virtual bool MountCore() = 0;
|
||||
virtual bool MountCore() =0;
|
||||
myResult Mount(){
|
||||
if ( IsMounted )return RESULT_ALREADY_MOUNT;
|
||||
if (MountCore()){
|
||||
@ -113,21 +112,20 @@ class SaveFileRead :public virtual SaveFileBase
|
||||
public:
|
||||
s64 FileSize;
|
||||
private:
|
||||
virtual void GetFormatInfoCore(tArcInfo *ifo) = 0;
|
||||
int dc_readed[MAX_LEVEL];//リード済みエントリ数
|
||||
wchar_t pathu_w[MAX_LEVEL][MAX_PATH_LENGTH];//パス名履歴
|
||||
nn::fs::FileReader reader;
|
||||
int s_lv;
|
||||
tArcInfo m_info;
|
||||
bool s_serch;
|
||||
u8 pad[3];//padding
|
||||
public:
|
||||
virtual void GetFormatInfoCore(tArcInfo *ifo) = 0;
|
||||
myResult IsExist();
|
||||
bool Open(const wchar_t *path);
|
||||
void Close();
|
||||
myResult GetPath(wchar_t *path);
|
||||
void ResetPath();
|
||||
bool GetInfo(tArcInfo *pinfo);
|
||||
bool GetInfo(tArcInfo *pinfo,size_t clsz = 0);
|
||||
s32 Read(char *buffer,size_t size);
|
||||
SaveFileRead(){
|
||||
s_lv=0;
|
||||
@ -140,6 +138,4 @@ public:
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@ -40,11 +40,15 @@ private:
|
||||
int exrootlen;
|
||||
//bool s_serch;
|
||||
public:
|
||||
bool MountCore()
|
||||
{
|
||||
LastNnResult = nn::fs::MountSdmcWriteOnly(devName);
|
||||
return LastNnResult.IsSuccess();
|
||||
}
|
||||
Sdmc();
|
||||
~Sdmc();
|
||||
void Finalize();
|
||||
bool Create();
|
||||
myResult Mount();
|
||||
myResult MountSys();
|
||||
void Unmount();
|
||||
bool Delete();
|
||||
|
||||
@ -15,34 +15,8 @@
|
||||
#include <nn/fs.h>
|
||||
#include "sdmcwo.h"
|
||||
|
||||
|
||||
//SDKツールのSaveFiler用の情報ファイル
|
||||
//-------ources\tools\NandFiler\nandf_Dialog.h 参照
|
||||
const wchar_t *SDMC_ROOT_DIR_NAME = L"/filer";
|
||||
|
||||
struct FormatParameters
|
||||
{
|
||||
size_t m_LimitSize;
|
||||
size_t m_MaxDir;
|
||||
size_t m_MaxFile;
|
||||
s32 m_IconSize;
|
||||
bit8 *m_pIconData;
|
||||
bool m_Duplicate;
|
||||
|
||||
FormatParameters()
|
||||
: m_LimitSize(0),m_IconSize(0), m_pIconData(0) {}
|
||||
//オリジナルはLimitSize不定
|
||||
};
|
||||
|
||||
struct AdditionalInfo
|
||||
{
|
||||
bit64 m_Version;
|
||||
bit64 m_Id;
|
||||
bit64 m_Reserved[128];//オリジナルは乱数埋
|
||||
AdditionalInfo()
|
||||
: m_Version(0), m_Id(0) {}
|
||||
};
|
||||
|
||||
//保存先:日時をディレクトリ名
|
||||
//-------- nandf_util.cpp 参照
|
||||
std::wstring Sdmcwo::GetDateName()
|
||||
@ -79,7 +53,6 @@ bool Sdmcwo::DelDir(const wchar_t *dir)
|
||||
if (Mount() == RESULT_FAIL_MOUNT)return false;
|
||||
bool res = DeleteDir(dir);
|
||||
Unmount();
|
||||
//if (res)created==false;
|
||||
return res;
|
||||
}
|
||||
|
||||
@ -94,14 +67,18 @@ bool Sdmcwo::DeleteAll()
|
||||
{
|
||||
std::wostringstream woss;
|
||||
woss << devName << SDMC_ROOT_DIR_NAME;//sdmc:/filer
|
||||
return DelDir(woss.str().c_str());
|
||||
bool res = DelDir(woss.str().c_str());
|
||||
if(res)created=false;
|
||||
else NN_LOG("Deldir fail %d\n",LastNnResult.GetDescription());
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
//保存先のディレクトリ作成
|
||||
//成功時はマウント状態
|
||||
//成功時はマウント状態、クラスタサイズを設定
|
||||
bool Sdmcwo::Create()
|
||||
{
|
||||
s64 size,size2;
|
||||
std::wostringstream woss;
|
||||
created = false;
|
||||
if (Mount() == RESULT_FAIL_MOUNT)return false;
|
||||
@ -117,12 +94,23 @@ bool Sdmcwo::Create()
|
||||
if ( CreateDir(woss.str().c_str()) )
|
||||
{
|
||||
wcscpy(latestPath_w,woss.str().c_str());
|
||||
created = true;//日時ディレクトリ作成フラグ
|
||||
created = true;//日時ディレクトリ存在フラグ
|
||||
//コピー先ルート
|
||||
woss << L"/" << "00000000";//sdmc:/filer/UserSaveData/YearMtDtHrMtSc/00000000
|
||||
if (nn::fs::ResultAlreadyExists::Includes(LastNnResult))
|
||||
{//既にあれば混じらないよう削除(時計合ってれば起こらないはず)
|
||||
nn::fs::TryDeleteDirectoryRecursively(woss.str().c_str());//保存先ディレクトリ
|
||||
wcscpy(pathw_w,woss.str().c_str());
|
||||
wcscat(pathw_w,L".vnf");
|
||||
nn::fs::TryDeleteFile(pathw_w);//追記型ファイル
|
||||
}
|
||||
GetFreeSize(&size);
|
||||
if ( CreateDir(woss.str().c_str()) )
|
||||
{
|
||||
//woss << L"/";//sdmc:/filer/UserSaveData/YearMtDtHrMtSc/00000000/
|
||||
GetFreeSize(&size2);
|
||||
FreeSize = size2;
|
||||
if ((size-size2)<0) ClasterSize = 0;
|
||||
else ClasterSize = size-size2;//クラスタサイズ
|
||||
wcscpy(rootPath_w,woss.str().c_str());//格納先パス保存
|
||||
SetRootPath(rootPath_w);
|
||||
return true;
|
||||
@ -186,11 +174,4 @@ bool Sdmcwo::WriteSys(tArcInfo *ifo)
|
||||
return res;
|
||||
}
|
||||
|
||||
//空き容量
|
||||
bool Sdmcwo::GetFreeSize(s64 *size)
|
||||
{
|
||||
s64 sz;
|
||||
LastNnResult = nn::fs::GetSdmcSize(&sz,size);
|
||||
return LastNnResult.IsSuccess();
|
||||
}
|
||||
|
||||
|
||||
@ -23,10 +23,39 @@
|
||||
#include "../my_defs.h"
|
||||
#include "savefile.h"
|
||||
|
||||
|
||||
//SDKツールのSaveFiler用の情報ファイル
|
||||
//-------ources\tools\NandFiler\nandf_Dialog.h 参照
|
||||
|
||||
struct FormatParameters
|
||||
{
|
||||
size_t m_LimitSize;
|
||||
size_t m_MaxDir;
|
||||
size_t m_MaxFile;
|
||||
s32 m_IconSize;
|
||||
bit8 *m_pIconData;
|
||||
bool m_Duplicate;
|
||||
|
||||
FormatParameters()
|
||||
: m_LimitSize(0),m_IconSize(0), m_pIconData(0) {}
|
||||
//オリジナルはLimitSize不定
|
||||
};
|
||||
|
||||
struct AdditionalInfo
|
||||
{
|
||||
bit64 m_Version;
|
||||
bit64 m_Id;
|
||||
bit64 m_Reserved[128];//オリジナルは乱数埋
|
||||
AdditionalInfo()
|
||||
: m_Version(0), m_Id(0) {}
|
||||
};
|
||||
|
||||
class Sdmcwo: public SaveFileWrite
|
||||
{
|
||||
public:
|
||||
char DirName[16];
|
||||
size_t ClasterSize;//SDクラスタサイズ .. Create後有効
|
||||
size_t FreeSize;//Create直後の空き..Create後有効
|
||||
private:
|
||||
bool DelDir(const wchar_t *dir);
|
||||
std::wstring GetDateName();
|
||||
@ -34,21 +63,30 @@ private:
|
||||
wchar_t latestPath_w[MAX_PATH_LENGTH];//dev:filer/UserSaveData/YearMtDtHrMtSc
|
||||
wchar_t rootPath_w[MAX_PATH_LENGTH];//dev:/filer/UserSaveData/YearMtDtHrMtSc/00000000/
|
||||
bool created;
|
||||
char dummy[3];
|
||||
public:
|
||||
bool MountCore()
|
||||
{
|
||||
LastNnResult = nn::fs::MountSdmcWriteOnly(devName);
|
||||
return LastNnResult.IsSuccess();
|
||||
}
|
||||
bool GetFreeSize(s64 *size);
|
||||
bool GetFreeSize(s64 *size)
|
||||
{
|
||||
s64 sz;
|
||||
LastNnResult = nn::fs::GetSdmcSize(&sz,size);
|
||||
return LastNnResult.IsSuccess();
|
||||
}
|
||||
void Finalize(){CloseW();};
|
||||
bool Create();
|
||||
bool Delete();
|
||||
bool DeleteAll();
|
||||
bool OpenVnfW(wchar_t *path,s64 size);
|
||||
bool WriteSys(tArcInfo *ifo);
|
||||
Sdmcwo(){strcpy(devName,"sdmcwo:");};
|
||||
Sdmcwo(){
|
||||
strcpy(devName,"sdmcwo:");
|
||||
ClasterSize = 0;
|
||||
FreeSize = 0;
|
||||
DirName[0] = 0;
|
||||
};
|
||||
~Sdmcwo(){Finalize();};
|
||||
};
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user