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:
mizu 2011-06-08 05:11:36 +00:00
parent f18fdbd1cf
commit 91e01bb4c5
19 changed files with 308 additions and 817 deletions

View File

@ -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

View File

@ -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

View File

@ -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);
}

View File

@ -16,7 +16,7 @@
#ifndef VER_H_
#define VER_H_
#define VERSION 1.05
#define VERSION 1.10
#endif

View File

@ -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

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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]

View File

@ -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);
}
// }
}

View File

@ -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 {

View File

@ -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;

View File

@ -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();

View File

@ -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();

View File

@ -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;
}
}
}
}

View File

@ -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

View File

@ -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();

View File

@ -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();
}

View File

@ -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();};
};