From 91e01bb4c50c55b75f376c884af19f2debc88c57 Mon Sep 17 00:00:00 2001 From: mizu Date: Wed, 8 Jun 2011 05:11:36 +0000 Subject: [PATCH] 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 --- trunk/CardSaveData/Mover/Imp/OMakefile | 4 +- trunk/CardSaveData/Mover/body/OMakefile | 2 +- trunk/CardSaveData/Mover/body/source/main.cpp | 733 +++--------------- .../Mover/body/source/screen/screen.cpp | 52 +- trunk/CardSaveData/Mover/body/ver.h | 2 +- trunk/CardSaveData/Mover/release.txt | 23 +- trunk/CardSaveData/ToSD/body/source/main.cpp | 99 ++- .../ToSD/body/source/screen/screen.cpp | 21 +- trunk/CardSaveData/ToSD/release.txt | 9 +- trunk/CardSaveData/common/common.cpp | 10 +- trunk/CardSaveData/common/my_defs.h | 12 - trunk/CardSaveData/common/savefile/membak.cpp | 10 +- trunk/CardSaveData/common/savefile/membak.h | 8 +- trunk/CardSaveData/common/savefile/savedata.h | 4 +- .../CardSaveData/common/savefile/savefile.cpp | 15 +- trunk/CardSaveData/common/savefile/savefile.h | 14 +- trunk/CardSaveData/common/savefile/sdmc.h | 6 +- trunk/CardSaveData/common/savefile/sdmcwo.cpp | 57 +- trunk/CardSaveData/common/savefile/sdmcwo.h | 44 +- 19 files changed, 308 insertions(+), 817 deletions(-) diff --git a/trunk/CardSaveData/Mover/Imp/OMakefile b/trunk/CardSaveData/Mover/Imp/OMakefile index b16c825..201f7e3 100644 --- a/trunk/CardSaveData/Mover/Imp/OMakefile +++ b/trunk/CardSaveData/Mover/Imp/OMakefile @@ -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 diff --git a/trunk/CardSaveData/Mover/body/OMakefile b/trunk/CardSaveData/Mover/body/OMakefile index 6c18610..06cfdf5 100644 --- a/trunk/CardSaveData/Mover/body/OMakefile +++ b/trunk/CardSaveData/Mover/body/OMakefile @@ -57,7 +57,7 @@ CTR_BANNER_SPEC = banner_null_icon.bsf #Cia o[W:}X^OɍXV邱 #W[rsfŎw(Remasterversion) -MAKECIAFLAGS = -minor 0 -micro 11 +MAKECIAFLAGS = -minor 0 -micro 12 include $(ROOT_OMAKE)/modulerules diff --git a/trunk/CardSaveData/Mover/body/source/main.cpp b/trunk/CardSaveData/Mover/body/source/main.cpp index 6ccd878..7da7521 100644 --- a/trunk/CardSaveData/Mover/body/source/main.cpp +++ b/trunk/CardSaveData/Mover/body/source/main.cpp @@ -26,11 +26,7 @@ //#include #include "../../../common/savefile/savefile.h" #include "../../../common/savefile/savedata.h" -#ifdef BKUP_NOTMEM -#include "./savefile/exsave.h" -#else #include "../../../common/savefile/membak.h" -#endif #include "./screen/screen.h" #include "../../../common/common.h" @@ -38,16 +34,7 @@ nn::fnd::ExpHeap appHeap; uptr heapForGx; //Gui gui; myResult errRes; -#ifdef BKUP_NOTMEM -const u32 IconBuffSize = 1024*20; -uptr IconBuffer; -size_t IconSize; -#endif -#ifdef DEBUG_ENABLE -cStrLst memo; -#endif -bool isDebugMode = false;//デバッグモード //char strBuff[128]; //bool exist; @@ -55,13 +42,7 @@ bool isDebugMode = false;//デバッグモード SaveData savedata; nn::os::LightEvent ejectEvnt(false); nn::os::LightEvent insEvnt(false); -#ifdef BKUP_NOTMEM -ExSave exsave; -nn::os::LightEvent ejectEvntSd(false); -nn::os::LightEvent insEvntSd(false); -#else MemBak exsave; -#endif //バックアップの状態 bool Active,Formatted; @@ -76,12 +57,6 @@ bool isAgreePCode; //Top画面エラー表示 int tmerr; - -#ifdef ENABLE_CRUSH -int CrashForDebug= 0; -#endif - - //結果 typedef enum { SUCCESS @@ -95,10 +70,6 @@ typedef enum { InEx_None ,InEx_InsCard ,InEx_EjcCard -#ifdef BKUP_NOTMEM - ,InEx_InsSd - ,InEx_EjcSd -#endif }tIsInsEject; tIsInsEject isInsEject; @@ -116,22 +87,12 @@ void endfunc() nn::fs::UnregisterCardInsertedEvent(); ejectEvnt.Finalize(); insEvnt.Finalize(); -#ifdef BKUP_NOTMEM - nn::fs::UnregisterSdmcEjectedEvent(); - nn::fs::UnregisterSdmcInsertedEvent(); - ejectEvntSd.Finalize(); - insEvntSd.Finalize(); -#endif savedata.Finalize(); exsave.Finalize(); ScrFinalize(); -#ifdef BKUP_NOTMEM - appHeap.Free(reinterpret_cast(IconBuffer)); -#endif - } //エラー停止 @@ -141,106 +102,6 @@ void failstop() finish(); } -#ifdef DEBUG_ENABLE -//ログ追加&表示 -void LogAdd(char *s) -{ - memo.add(s); - if(isDebugMode){ - scr_DgbLog(&memo); - while(ScrGetDrawFlag()){ - nn::os::Thread::Yield();//表示 - } - } -} - -char dst[128],work[64]; -void LogAdd_Int(char *s,int i) -{ - sprintf(dst,s,i); - LogAdd(dst); -} - -void LogAdd_cat(char *s,char *s2) -{ - strcpy(dst,s); - strcat(dst,s2); - LogAdd(dst); -} - -void LogAdd_bytes(char *s,u8 *b,int n) -{ - int i; - for (i=0;i desc = %d",res.GetDescription()); -} - -void LogAdd_Fparam(tArcInfo *p) -{ - LogAdd_Int("FileCount %d",p->FileCount); - LogAdd_Int("DirCount %d",p->DirCount); - LogAdd_Int("FileEntry %d",p->FileEntry); - LogAdd_Int("DirEntry %d",p->DirEntry); -} - -void LogAdd_InfoParam(tArcInfo *p) -{ - LogAdd_Int("Version %d",p->Ver); - LogAdd_cat("> pcode = ",p->Pcode); - LogAdd_Fparam(p); -} -#else -void LogAdd(char *s) -{ - NN_UNUSED_VAR(s); -} - -void LogAdd_Int(char *s,int i) -{ - NN_UNUSED_VAR(s); - NN_UNUSED_VAR(i); -} - -void LogAdd_cat(char *s,char *s2) -{ - NN_UNUSED_VAR(s); - NN_UNUSED_VAR(s2); -} - -void LogAdd_bytes(char *s,u8 *b,int n) -{ - NN_UNUSED_VAR(s); - NN_UNUSED_VAR(b); - NN_UNUSED_VAR(n); -} - -void LogAdd_Res(nn::Result res) -{ - NN_UNUSED_VAR(res); -} - -void LogAdd_Fparam(tArcInfo *p) -{ - NN_UNUSED_VAR(p); -} - -void LogAdd_InfoParam(tArcInfo *p) -{ - NN_UNUSED_VAR(p); -} - -#endif - char sts[64]; void PutError(ErcDev dev,int cd) { @@ -269,37 +130,28 @@ bool Verifi() int ct,i,msize,rsize; s64 total=0; - LogAdd("Verifi"); - //セーブデータのマウント - LogAdd("Mount savedata"); res = savedata.Mount(); if(res != RESULT_OK){ PutError(ERC_DEV_CARD); return false; } +//ファイル数の再取得..ファイル多いと時間かかる +//arcInfoの保持があやしい or 出来ない場合に有効にする /* - if(isDebugMode==false) scr_Status("Ready to Verifi",COLOR_YELLO); + scr_Status("Ready to Verifi",COLOR_YELLO); //情報ファイル LogAdd("Directry Info"); if(savedata.GetInfo(&arcInfo)==false) { - LogAdd("> get fail");//有効な情報ファイルがない savedata.Unmount(); PutError(ERC_DEV_CARD); return ERROR; } - LogAdd_Fparam(&arcInfo); */ //出力デバイスのマウント -#ifdef BKUP_NOMEM //フラグ間違えチェック用に表示分け - LogAdd("Mount Device");//不揮発メディア -#else - LogAdd("memory setup");//メモリ保存 -#endif - res = exsave.Mount(); if(res != RESULT_OK){ PutError(ERC_DEV_OUT); @@ -307,24 +159,18 @@ bool Verifi() } //情報ファイル - LogAdd("Directry Info(out)"); - if (exsave.GetInfo(&arcInfo_ex)) - { - //todo:フォーマット変更時はバージョンチェック入れる - LogAdd_InfoParam(&arcInfo_ex); - }else { - LogAdd("> get fail");//有効な情報ファイルがない + if (exsave.GetInfo(&arcInfo_ex) == false) + { savedata.Unmount(); exsave.Unmount(); return false; - } + }//todo:将来、構造体を変更したらバージョンチェック入れる //フォーマット情報の比較 if ((arcInfo.DirEntry != arcInfo_ex.DirEntry) || (arcInfo.FileEntry != arcInfo_ex.FileEntry) || (arcInfo.Dup != arcInfo_ex.Dup)) { - LogAdd("> verifi fail");//有効な情報ファイルがない PutError(ERC_DEV_OUT,ERC_VERIFI); savedata.Unmount(); exsave.Unmount(); @@ -334,13 +180,11 @@ bool Verifi() ct =0; if (arcInfo.FileCount == 0)//ファイルが無い { - LogAdd("> no files"); savedata.Unmount(); exsave.Unmount(); return true;//フォーマット一致のみ }else{ - LogAdd("-- file compair --"); - if(isDebugMode==false) scr_Status("file compairing",COLOR_YELLO); + scr_Status("file compairing",COLOR_YELLO); savedata.ResetPath(); exsave.ResetPath(); s64 fsize; @@ -349,33 +193,24 @@ bool Verifi() res = savedata.GetPath(file_pathw); if (res != RESULT_OK) { - LogAdd("failed to get path"); if (res == RESULT_DIR_LEVEL_OVER){ - LogAdd("Dir Level Over"); break; } if (res == RESULT_PATH_LENGTH_OVER){ - LogAdd("path name too long"); break; } res = RESULT_FAIL_OPEN; break; } - if (file_pathw[0] == 0){LogAdd("end");break;}//root then end + if (file_pathw[0] == 0)break;//root then end if (ct>=arcInfo.FileCount) {//カウンタ壊れ、メモリフローの可能性 - LogAdd("memory error"); res = RESULT_FAIL; break; } -#ifdef DEBUG_ENABLE - wcstombs(file_path,file_pathw,510); - LogAdd(file_path); -#endif - if(isDebugMode==false) scr_CountPerMax(ct,arcInfo.FileCount); + scr_CountPerMax(ct,arcInfo.FileCount); if (savedata.Open(file_pathw)==false) { - LogAdd("Open Error(card)"); res = RESULT_FAIL_OPEN; break; } @@ -383,7 +218,6 @@ bool Verifi() total += fsize; if (exsave.Open(file_pathw)==false) { - LogAdd("Open Error(out)"); res = RESULT_FAIL_OPENW; //savedata.Close(); break; @@ -395,12 +229,12 @@ bool Verifi() } msize=fsize; if(msize <= FILEBUFF_SIZE ){//一回で読めるサイズならゲージは出さない - if(isDebugMode==false) scr_CountPerMax2(0,0,-1); + scr_CountPerMax2(0,0,-1); } while(fsize) { if(msize > FILEBUFF_SIZE ){ - if(isDebugMode==false) scr_CountPerMax2(msize-fsize,msize,0); + scr_CountPerMax2(msize-fsize,msize,0); } if (fsize > FILEBUFF_SIZE) { @@ -423,14 +257,12 @@ bool Verifi() fileBuffer[i] = 0;//0埋め } }else{ - LogAdd("Read Error(card)"); res = RESULT_FAIL_READ; break; } } if(exsave.Read(fileBuffer_ex,rsize) != rsize ) { - LogAdd("Read Error(out)"); res = RESULT_FAIL; break; } @@ -441,7 +273,6 @@ bool Verifi() //verifi for (i = 0;i MEM_BKUP_SIZE) + { + savedata.Unmount(); + PutError(ERC_DEV_OUT,ERC_WRITE_NS);//容量オーバ + return ERROR; + } + //カウント異常なら実行エラー + if (arcInfo.FileCount > arcInfo.FileEntry) + { + savedata.Unmount(); + PutError(ERC_DEV_OTHER,ERC_EXEC); + return ERROR; + } - if(isDebugMode==false) scr_Status("BackUp Check",COLOR_YELLO); - LogAdd("check bkup Existance"); + scr_Status("BackUp Check",COLOR_YELLO); if(exsave.IsExist()){ - LogAdd("> detect"); - if(exsave.Delete()) LogAdd("> deleted"); - else{ + if(exsave.Delete()==false) + { savedata.Unmount(); - LogAdd("delete failed"); PutError(ERC_DEV_OUT); return ERROR; } - }else{ - LogAdd("not found"); } - if(isDebugMode==false)scr_Status("Create Backup",COLOR_YELLO); - LogAdd("Create bkup"); -#ifdef BKUP_NOTMEM - res = exsave.Create((void*)IconBuffer,IconSize - ,arcInfo.DirEntry+1,arcInfo.FileEntry+1);//管理情報 -#else - res = exsave.Create(0,0,arcInfo.DirEntry+1,arcInfo.FileEntry+1);//管理情報 -#endif - + scr_Status("Create Backup",COLOR_YELLO); + res = exsave.Create(arcInfo.DirEntry+1,arcInfo.FileEntry+1); if (res != RESULT_OK){ savedata.Unmount(); PutError(ERC_DEV_OUT); @@ -538,14 +361,12 @@ RetCode Card2Sd() if (arcInfo.FileCount == 0)//ファイルが無い { - LogAdd("> no files"); - if(isDebugMode==false)scr_Status("no files",COLOR_YELLO); + scr_Status("no files",COLOR_YELLO); savedata.Unmount(); exsave.Unmount(); return SUCCESS;//フォーマットのみ }else{ - LogAdd("-- file copy --"); - if(isDebugMode==false)scr_Status("file copying",COLOR_SKY); + scr_Status("file reading",COLOR_SKY); savedata.ResetPath(); s64 fsize; res = RESULT_OK; @@ -553,35 +374,27 @@ RetCode Card2Sd() res = savedata.GetPath(file_pathw); if (res != RESULT_OK) { - LogAdd("failed to get path"); if (res == RESULT_DIR_LEVEL_OVER){ - LogAdd("Dir Level Over"); PutError(ERC_DEV_CARD,ERC_DIRDEPTH); break; } if (res == RESULT_PATH_LENGTH_OVER){ - LogAdd("path name too long"); PutError(ERC_DEV_CARD,ERC_PATH); break; } res = RESULT_FAIL_OPEN; break; } - if (file_pathw[0] == 0){LogAdd("end");break;}//root then end + if (file_pathw[0] == 0)break;//root then end if (ct>=arcInfo.FileCount) {//カウンタ壊れ、メモリフローの可能性 - LogAdd("memory error"); res = RESULT_FAIL; break; } -#ifdef DEBUG_ENABLE - wcstombs(file_path,file_pathw,510); - LogAdd(file_path); -#endif - if(isDebugMode==false) scr_CountPerMax(ct,arcInfo.FileCount); + + scr_CountPerMax(ct,arcInfo.FileCount); if (savedata.Open(file_pathw)==false) { - LogAdd("Open Error(card)"); res = RESULT_FAIL_OPEN; break; } @@ -589,7 +402,6 @@ RetCode Card2Sd() total += fsize; if (exsave.OpenW(file_pathw,fsize)==false) { - LogAdd("Open Error(sd)"); res = RESULT_FAIL_OPENW; //savedata.Close(); break; @@ -599,7 +411,7 @@ RetCode Card2Sd() while(fsize) { if(msize > FILEBUFF_SIZE * 2){ - if(isDebugMode==false) scr_CountPerMax2(msize-fsize,msize,0); + scr_CountPerMax2(msize-fsize,msize,0); } if (fsize>FILEBUFF_SIZE) { @@ -622,14 +434,12 @@ RetCode Card2Sd() fileBuffer[i] = 0;//0埋め } }else{ - LogAdd("Read Error(card)"); res = RESULT_FAIL_READ; break; } } if(exsave.Write(fileBuffer,rsize) != rsize ) { - LogAdd("Write Error(bkup)"); res = RESULT_FAIL_WRITE; break; } @@ -653,54 +463,48 @@ RetCode Card2Sd() //Exsaveに2重化が無いので情報取得APIでは不足 - 2011.1 現在 //プロダクトコードを追加(2011.1.26) //バージョンを追加(2011.1.27) - LogAdd("save systemfile"); if (exsave.OpenSysW()) { strcpy(arcInfo.Pcode,savedata.PrdCode); - if(exsave.WriteSys(&arcInfo)){ - LogAdd("> done"); - }else{ - LogAdd("> write fail"); + if(exsave.WriteSys(&arcInfo) ==false) + { res = RESULT_FAIL_WRITE; } }else{ - LogAdd("> open fail"); res = RESULT_FAIL_OPENW; } exsave.CloseSysW(); } savedata.Unmount(); - //exsave.Commit(); Nandはコミット入れる(NAND未実装->MEM変更、今後も不要?) + //exsave.Commit(); Nand,SDはコミット入れる exsave.Unmount(); - LogAdd_Int("> %d files",ct); - if(isDebugMode==false){ - scr_CountPerMax(ct,arcInfo.FileCount); - if(total>0)scr_CountPerMax2(0,0,total); - } + scr_CountPerMax(ct,arcInfo.FileCount); + if(total>0)scr_CountPerMax2(0,0,total); //結果 switch(res) { case RESULT_OK: - if (Verifi()==false)return ERROR; - if(isDebugMode==false) scr_Status("Complate",COLOR_WHITE); - return SUCCESS; + if (Verifi()) + { + scr_Status("Complate",COLOR_WHITE); + return SUCCESS; + } + //PutError(ERC_DEV_OTHER,ERC_VERIFI); + break; case RESULT_FAIL_WRITE: case RESULT_FAIL_OPENW: - PutError(ERC_DEV_OUT); - exsave.Delete();//バックアップを削除 - return ERROR; + //本体メモリなので容量以外でエラーはない + PutError(ERC_DEV_OUT,ERC_WRITE_NS);//容量オーバ + break; case RESULT_FAIL_READ: case RESULT_FAIL_OPEN: PutError(ERC_DEV_CARD); - exsave.Delete();//バックアップを削除 - return ERROR; + break; } - //その他、実行時エラー - PutError(ERC_DEV_OTHER); + exsave.Delete();//バックアップを削除 return ERROR; } - bool mkdir; //---------------------------------------------------------------- SD->CARD RetCode Sd2Card() @@ -709,23 +513,18 @@ RetCode Sd2Card() int ct=0,msize,rsize; s64 total = 0; - LogAdd("-- write savedata --"); - if(isDebugMode == false){ - scr_RestoreYesNo();//実行確認 - WaitUI();//入力待ち - if(isInsEject != InEx_None ){//挿抜? - //isInsEject = InEx_None; - return INSEXIT;//挿抜による中断 - } - if (scr_evnt != EVNT_YES)return CANCEL;//キャンセル - } - if(isDebugMode==false){ - scr_Restore();//画面表示 - scr_Status("Check Backup",COLOR_YELLO); + scr_RestoreYesNo();//実行確認 + WaitUI();//入力待ち + if(isInsEject != InEx_None ){//挿抜? + //isInsEject = InEx_None; + return INSEXIT;//挿抜による中断 } + + if (scr_evnt != EVNT_YES)return CANCEL;//キャンセル + scr_Restore();//画面表示 + scr_Status("Check Backup",COLOR_YELLO); //保存先のマウント - LogAdd("Mount bkup"); res = exsave.Mount(); if(res != RESULT_OK){ PutError(ERC_DEV_OUT); @@ -733,26 +532,22 @@ RetCode Sd2Card() } //セーブデータのフォーマット&マウント - if(isDebugMode==false)scr_Status("Card savedata Create",COLOR_YELLO); - LogAdd("Format savedata"); + scr_Status("Card savedata format",COLOR_YELLO); res = savedata.Format(&arcInfo);//_exの方がいいかも if(res != RESULT_OK){ exsave.Unmount(); PutError(ERC_DEV_CARD); return ERROR; } - //パラメータはバックアップ時 //Top画面開始時、挿入イベントで取得 if (arcInfo.FileCount == 0)//ファイルが無い { - LogAdd("> no files"); savedata.Unmount(); exsave.Unmount(); return SUCCESS;//フォーマットのみ }else{ - LogAdd("-- file restore --"); - if(isDebugMode==false)scr_Status("file copying",COLOR_PARPL); + scr_Status("file writing",COLOR_PARPL); exsave.ResetPath(); s64 fsize; res = RESULT_OK; @@ -760,55 +555,38 @@ RetCode Sd2Card() res = exsave.GetPath(file_pathw); if (res != RESULT_OK) { - LogAdd("failed to get path"); - if (res == RESULT_DIR_LEVEL_OVER){ - LogAdd("Dir Level Over"); - break; - } - if (res == RESULT_PATH_LENGTH_OVER){ - LogAdd("path name too long"); - break; - } + if (res == RESULT_DIR_LEVEL_OVER)break; + if (res == RESULT_PATH_LENGTH_OVER)break; res = RESULT_FAIL_OPEN; break; } - if (file_pathw[0] == 0){LogAdd("end");break;}//root then end + if (file_pathw[0] == 0)break;//root then end if (ct>=arcInfo.FileCount) {//カウンタ壊れ、メモリフローの可能性 - LogAdd("memory error"); res = RESULT_FAIL; break; } -#ifdef DEBUG_ENABLE - wcstombs(file_path,file_pathw,510); - LogAdd(file_path);//todo:デバグ表示オーバ対策 -#endif - if(isDebugMode==false) scr_CountPerMax(ct,arcInfo.FileCount); + + scr_CountPerMax(ct,arcInfo.FileCount); if (exsave.Open(file_pathw)==false) { - LogAdd("Open Error(bkup)"); res = RESULT_FAIL_OPEN; break; } fsize = exsave.FileSize; total += fsize; -#ifdef ENABLE_CRUSH - //デバグ用に違うファイル名にする - if (CrashForDebug & 2)wcscat(file_pathw,L"D"); -#endif + int rev = 0; while(1){ if (savedata.OpenC(file_pathw,fsize,&mkdir)==false) { if(mkdir)//ディレクトリのみ作成 {//深い場合に作成が多いと画面が止まるので - LogAdd("Dir create"); rev++; if (rev & 1)scr_MessOnCount2("Create Directry -"); else scr_MessOnCount2("Create Directry |"); }else{ - LogAdd("Open Error(card)"); res = RESULT_FAIL_OPENW; //exsave.Close(); break; @@ -821,13 +599,11 @@ RetCode Sd2Card() int itvl = 0; while(fsize) { - if(isDebugMode==false) - if(msize > FILEBUFF_SIZE * 2){ - scr_CountPerMax2(msize-fsize,msize,0); - if (++itvl & 1)scr_Status("file copying |",COLOR_PARPL); - else scr_Status("file copying -",COLOR_PARPL); - - }else scr_MessOnCount2(""); + if(msize > FILEBUFF_SIZE * 2){ + scr_CountPerMax2(msize-fsize,msize,0); + if (++itvl & 1)scr_Status("file copying |",COLOR_PARPL); + else scr_Status("file copying -",COLOR_PARPL); + }else scr_MessOnCount2(""); if (fsize>FILEBUFF_SIZE) { @@ -839,21 +615,11 @@ RetCode Sd2Card() } if(exsave.Read(fileBuffer,rsize) != rsize ) { - LogAdd("Read Error(bkup)"); res = RESULT_FAIL_READ; break; } -#ifdef ENABLE_CRUSH - //デバグ用にデータを壊す - if (CrashForDebug & 1)//中身 - { - int i; - for (i = 0;i %d files",ct); - if(isDebugMode==false){ - scr_CountPerMax(ct,arcInfo.FileCount); - scr_CountPerMax2(0,0,total); - } + scr_CountPerMax(ct,arcInfo.FileCount); + scr_CountPerMax2(0,0,total); //結果 switch(res){ case RESULT_OK: if (Verifi()==false)return ERROR; -#ifdef SUCCESS_DELETE if(exsave.Delete()){//バックアップを削除 - LogAdd("> deleted"); -#endif - if(isDebugMode==false) scr_Status("Complate",COLOR_WHITE); + scr_Status("Complate",COLOR_WHITE); return SUCCESS; -#ifdef SUCCESS_DELETE - }else{ - LogAdd("> delete fail"); - PutError(ERC_DEV_OUT); - return ERROR; } -#endif case RESULT_FAIL_WRITE: case RESULT_FAIL_OPENW: PutError(ERC_DEV_CARD); @@ -905,113 +659,26 @@ RetCode Sd2Card() return ERROR; } - -//メモリ保存では不要 -#ifdef BKUP_NOTMEM -//------------------------------------------------------------------ アイコンデータ -//NAND起動で失敗は無いはず -void ReadIcon() -{ - const size_t ROMFS_BUFFER_SIZE = 1024 * 64; - static char buffer[ROMFS_BUFFER_SIZE]; - nn::Result res; - - Active = false; - Formatted = false; - - //Iconデータ - //NN_LOG("ICON Data Read\n"); - LogAdd("Mount Rom"); - nn::fs::FileReader RomFsFile; - res = nn::fs::MountRom(16, 16, buffer, ROMFS_BUFFER_SIZE); - if (res.IsFailure()) - { - //NN_LOG("failed :res.desc = %d\n",res.GetDescription()); - //failstop(); - LogAdd("> failed"); - LogAdd_Res(res); - return; - } - LogAdd("Read Icon data"); - res = RomFsFile.TryInitialize(L"rom:/def.icn"); - if (res.IsFailure()) - { - //NN_LOG("failed :res.desc = %d\n",res.GetDescription()); - nn::fs::Unmount("rom:"); - //failstop(); - LogAdd("> open failed"); - LogAdd_Res(res); - return; - } - //s32 gs = RomFsFile.GetSize(); - //NN_LOG("Icon Size = %d\n",gs); - res = RomFsFile.TryRead((s32*)&IconSize,(void*)IconBuffer,IconBuffSize); - if (res.IsFailure()) - { - //NN_LOG("failed :res.desc = %d\n",res.GetDescription()); - //RomFsFile.Finalize(); - nn::fs::Unmount("rom:"); - //failstop(); - LogAdd("> read failed"); - LogAdd_Res(res); - return; - } - //NN_LOG("Read Size = %d\n",IconSize); - RomFsFile.Finalize(); - nn::fs::Unmount("rom:"); - -} -#endif - //--------------------------------------------------------------- セーブデータの情報取得 //呼ぶ前に tmerr のクリアを忘れない事 void CheckSaveDataState() { myResult myres; - - Formatted = false;//フォーマット + Formatted = false; Active = false; - //failveri = false; - LogAdd("get pcode"); if (savedata.GetPrdCode()) { - LogAdd_cat("> pcode = ",savedata.PrdCode); - LogAdd("check savedata"); - myres = savedata.IsExist(); - NN_LOG("%d",savedata.LastNnResult.GetDescription()); - 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: - LogAdd("> exist"); - Formatted=true; - break; - case RESULT_NO_MEDIA: - LogAdd("> Media not found"); - tmerr |= SDATA_ERRPUT_MEDIA; - break; - case RESULT_NOT_FAUND: - LogAdd("> not Found"); - break; - case RESULT_SDK_VERIFI: - LogAdd("> sdk verifi err"); - //failveri = true; - tmerr |= SDATA_ERRPUT_VERIFI; - break; - default: - LogAdd("> Not/Bad Format"); - break; - } + Formatted=true; }else{ - LogAdd("> Invalid state"); - LogAdd_Res(savedata.LastNnResult); + tmerr |= SDATA_ERRPUT_MEDIA; } - }else - { - LogAdd("> fail"); } scr_PrdCode(savedata.PrdCode); //プロダクトコードのチェック @@ -1020,35 +687,15 @@ void CheckSaveDataState() void CheckExSaveState() { - LogAdd("check exsave"); -#ifdef BKUP_NOTMEM - exActive = nn::fs::IsSdmcInserted(); -#else - exActive = true; -#endif - if (exActive){ - exFormatted = exsave.IsExist(); - if (exFormatted){ - LogAdd("> exist"); - if (exsave.GetInfo(&arcInfo)) - { - LogAdd_InfoParam(&arcInfo); - //todo:フォーマット変更時はバージョンチェック入れる - }else { - LogAdd("> sysdata none");//有効な情報ファイルがない - //arcInfo.Pcode[0] = 0; - exFormatted = false; - } - exsave.Unmount(); - }else{ - LogAdd("> not found"); - //arcInfo.Pcode[0] = 0; - } - }else{ - LogAdd("> not inserted"); - //arcInfo.Pcode[0] = 0; - exFormatted = false; - } + exActive = true;//メモリなので常にtrue + //if (exActive){ + exFormatted = exsave.IsExist() && exsave.GetInfo(&arcInfo); + //todo:変更時はバージョンチェック入れる + exsave.Unmount(); + //}else{ + ////arcInfo.Pcode[0] = 0; + // exFormatted = false; + //} if (exFormatted==false) arcInfo.Pcode[0] = 0; scr_PrdCodeEx(arcInfo.Pcode); //プロダクトコードのチェック @@ -1069,43 +716,18 @@ void WaitUI() CheckSysBreak();//中断処理 - int i = nn::ndm::GetDaemonStatus( nn::ndm::DN_CEC ); - if (i !=3 )NN_LOG("DN_CEC %d\n",i); - i = nn::ndm::GetDaemonStatus( nn::ndm::DN_BOSS ); - if (i !=3 )NN_LOG("DN_BOSS %d\n",i); - i = nn::ndm::GetDaemonStatus( nn::ndm::DN_NIM ); - if (i !=3 )NN_LOG("DN_NIM %d\n",i); - i = nn::ndm::GetDaemonStatus( nn::ndm::DN_FRIENDS ); - if (i !=3 )NN_LOG("DN_FRIENDS %d\n",i); - //挿抜を検知したら中断して抜ける //トップ以外ではトップメニューへ戻るようする if (ejectEvnt.TryWait()){ - LogAdd("Card Ejected");//状態表示:抜け CheckSaveDataState(); isInsEject = InEx_EjcCard; return; } if (insEvnt.TryWait()){ - LogAdd("Card Inserted");//状態表示:挿入 CheckSaveDataState(); isInsEject = InEx_InsCard; return; } -#ifdef BKUP_NOTMEM - if (ejectEvntSd.TryWait()){ - LogAdd("SD Ejected");//状態表示:抜け - CheckExSaveState(); - isInsEject = InEx_EjcSd; - return; - } - if (insEvntSd.TryWait()){ - LogAdd("SD Inserted");//状態表示:挿入 - CheckExSaveState(); - isInsEject = InEx_InsSd; - return; - } -#endif } ScrClr();//画面消去 nn::os::Thread::Sleep(nn::fnd::TimeSpan::FromMilliSeconds(500));//チャタ対策 @@ -1127,10 +749,9 @@ void nnMain() int i; myResult mres; RetCode retc; - tColStr *colstr[4]; - colstr[2] = &mess_WhenExc; - colstr[3] = &mess_PoffSys; - isDebugMode = false; + //tColStr *colstr[4]; + //colstr[2] = &mess_WhenExc; + //colstr[3] = &mess_PoffSys; isInsEject = InEx_None; //NN_LOG("Start\n"); @@ -1155,49 +776,23 @@ void nnMain() nn::os::GetDeviceMemorySize(), nn::os::ALLOCATE_OPTION_LINEAR); const u32 GxHeapSize = 0x800000; heapForGx = reinterpret_cast(appHeap.Allocate(GxHeapSize)); -#ifdef BKUP_NOTMEM - IconBuffer = reinterpret_cast(appHeap.Allocate(IconBuffSize)); -#endif //画面初期化 if (ScrInitialize(heapForGx,GxHeapSize) == false)failstop(); -#ifdef DEBUG_ENABLE - memo.clr(); - memo.setbuttom(ScrDbgLogGetMax()-1);//表示行数でリスト数を制限 -#endif ejectEvnt.ClearSignal(); insEvnt.ClearSignal(); nn::fs::RegisterCardEjectedEvent(&ejectEvnt); nn::fs::RegisterCardInsertedEvent(&insEvnt); -#ifdef BKUP_NOTMEM - ejectEvntSd.ClearSignal(); - insEvntSd.ClearSignal(); - nn::fs::RegisterSdmcEjectedEvent(&ejectEvntSd); - nn::fs::RegisterSdmcInsertedEvent(&insEvntSd); - ReadIcon(); //アイコンデータの読込 -#endif // スリープ要求に対する返答を有効にする // また、蓋の状態チェックを行い蓋が閉じられているならスリープ要求が発生する //nn::applet::EnableSleep(true); - LogAdd("-- start --"); - extern u8 scr_evnt; while(1) { tmerr = 0; CheckSaveDataState(); //セーブデータの状態取得 CheckExSaveState(); //同バックアップ -#ifdef DEBUG_ENABLE - //トップメニュー - if (isDebugMode){ - scr_TopMenuDbg(Formatted,Active); - scr_DgbLog(&memo); - while(ScrGetDrawFlag()){ - nn::os::Thread::Yield();//表示 - } - }else -#endif if (isAgreePCode==false) tmerr |= SDATA_ERRPUT_PCODE; // scr_TopMenu(Formatted,Active,exFormatted,exActive,isAgreePCode,failveri); scr_TopMenu(Formatted,Active,exFormatted,exActive,tmerr); @@ -1214,10 +809,6 @@ void nnMain() case EVNT_NONE: break; case EVNT_PUSH_Y: -#ifdef ENABLE_CRUSH - CrashForDebug++; - CrashForDebug &= 3; -#endif break; case EVNT_SEL_READ://リード NN_LOG("select read\n"); @@ -1225,26 +816,14 @@ void nnMain() switch (retc){ case SUCCESS: //CheckExSaveState(); //状態の更新 - if (isDebugMode){ - colstr[1] = &mess_ReadOk; - scr_SuccessQuitDbg(&colstr[1]);//成功とQuitボタン - }else scr_ResultQuit("Success",COLOR_GREEN);//成功とQuitボタン + scr_ResultQuit("Success",COLOR_GREEN);//成功とQuitボタン break; case INSEXIT: //scr_InsExitQuit();//挿抜検知表示 & Quit ScrClr();//画面消去 scr_Backup(); -#ifdef DEBUG_ENABLE - if (isDebugMode){ - colstr[1] = &mess_PullOut; - scr_ErrorQuitDbg(&colstr[1]);//エラーとQuitボタン - }else -#endif { if (isInsEject == InEx_EjcCard)PutError(ERC_DEV_CARD,ERC_DEVICE); -#ifdef BKUP_NOTMEM - else if (isInsEject == InEx_EjcSd)PutError(ERC_DEV_OUT,ERC_DEVICE); -#endif else PutError(ERC_DEV_OTHER); scr_ResultQuit("Break",COLOR_RED);//エラーとQuitボタン } @@ -1253,13 +832,6 @@ void nnMain() //scr_ResultQuit("Canseled",COLOR_YELLO);//キャンセル break; default://errors -#ifdef DEBUG_ENABLE - if (isDebugMode){ - colstr[0] = &mess_ReadError; - colstr[1] = &mess_ChkDev; - scr_ErrorQuitDbg(colstr);//エラーとQuitボタン - }else -#endif scr_ResultQuit("Failed",COLOR_RED);//エラーとQuitボタン break; } @@ -1281,26 +853,14 @@ void nnMain() case SUCCESS: //CheckSaveDataState(); //状態の更新 //CheckExSaveState(); - if (isDebugMode){ - colstr[1] = &mess_WriteOk; - scr_SuccessQuitDbg(&colstr[1]);//成功とQuitボタン - }else scr_ResultQuit("Success",COLOR_GREEN);//成功とQuitボタン + scr_ResultQuit("Success",COLOR_GREEN);//成功とQuitボタン break; case INSEXIT: //scr_InsExitQuit();//挿抜検知表示 & Quit ScrClr();//画面消去 scr_Backup(); -#ifdef DEBUG_ENABLE - if (isDebugMode){ - colstr[1] = &mess_PullOut; - scr_ErrorQuitDbg(&colstr[1]);//エラーとQuitボタン - }else -#endif { if (isInsEject == InEx_EjcCard)PutError(ERC_DEV_CARD,ERC_DEVICE); -#ifdef BKUP_NOTMEM - else if (isInsEject == InEx_EjcSd)PutError(ERC_DEV_OUT,ERC_DEVICE); -#endif else PutError(ERC_DEV_OTHER); scr_ResultQuit("Break",COLOR_RED);//エラーとQuitボタン } @@ -1309,13 +869,6 @@ void nnMain() //scr_ResultQuit("Canseled",COLOR_YELLO);//キャンセル break; default://errors -#ifdef DEBUG_ENABLE - if (isDebugMode){ - colstr[0] = &mess_WriteError; - colstr[1] = &mess_ChkDev; - scr_ErrorQuitDbg(colstr);//エラーとQuitボタン - }else -#endif scr_ResultQuit("Failed",COLOR_RED);//エラーとQuitボタン break; } @@ -1337,14 +890,12 @@ void nnMain() NN_LOG("select NO\n"); break; case EVNT_YES: - NN_LOG("select NO\n"); + NN_LOG("select YES\n"); break; */ - case EVNT_PUSH_L:// ----------------------------------------- 表示の切り替え - case EVNT_PUSH_DOWN_Y:// ----------------------------------------- 表示の切り替え -#ifdef DEBUG_ENABLE - isDebugMode = (isDebugMode == false); -#endif + //old debug key + case EVNT_PUSH_L:// ------------------------------- 表示の切り替え + case EVNT_PUSH_DOWN_Y:// ---------------------------------- 表示の切り替え break; case EVNT_PUSH_LEFT_X:// ------------------------------------- LEFT + X @@ -1366,68 +917,33 @@ void nnMain() for ( i =0;i failed"); - LogAdd_Res(savedata.LastNnResult); - LogAdd_Int("%d",mres); - break; - } + if(mres != RESULT_OK)break; i= 2; - LogAdd("create"); while(i){ sprintf(file_path,"dir%d/file%d",i,i); - LogAdd(file_path); mbstowcs(file_pathw,file_path,510); - if (savedata.OpenC(file_pathw,FILEBUFF_SIZE,&flg)==false) - { - LogAdd("> Open Error"); - break; - } - if(savedata.Write(fileBuffer,FILEBUFF_SIZE)!=FILEBUFF_SIZE) - { - LogAdd("> Write failed"); - break; - } + if (savedata.OpenC(file_pathw,FILEBUFF_SIZE,&flg)==false)break; + if(savedata.Write(fileBuffer,FILEBUFF_SIZE)!=FILEBUFF_SIZE)break; savedata.CloseW(); i--; } i=2; while(i){ sprintf(file_path,"dir%d/dir%d/file%d",i,i,i); - LogAdd(file_path); mbstowcs(file_pathw,file_path,510); - if (savedata.OpenC(file_pathw,FILEBUFF_SIZE,&flg)==false) - { - LogAdd("> Open Error"); - break; - } - if(savedata.Write(fileBuffer,FILEBUFF_SIZE)!=FILEBUFF_SIZE) - { - LogAdd("> Write failed"); - break; - } + if (savedata.OpenC(file_pathw,FILEBUFF_SIZE,&flg)==false)break; + if(savedata.Write(fileBuffer,FILEBUFF_SIZE)!=FILEBUFF_SIZE)break; savedata.CloseW(); sprintf(file_path,"dir%d/dir%d/file%d",i,i,i+2); - LogAdd(file_path); mbstowcs(file_pathw,file_path,510); - if (savedata.OpenC(file_pathw,FILEBUFF_SIZE,&flg)==false) - { - LogAdd("> Open Error"); - break; - } - if(savedata.Write(fileBuffer,FILEBUFF_SIZE)!=FILEBUFF_SIZE) - { - LogAdd("> Write failed"); - break; - } + if (savedata.OpenC(file_pathw,FILEBUFF_SIZE,&flg)==false)break; + if(savedata.Write(fileBuffer,FILEBUFF_SIZE)!=FILEBUFF_SIZE)break; savedata.CloseW(); i--; } @@ -1437,7 +953,6 @@ void nnMain() //CheckSaveDataState(); //カード状態更新 break; default: - NN_LOG("menu error\n"); failstop(); break; } diff --git a/trunk/CardSaveData/Mover/body/source/screen/screen.cpp b/trunk/CardSaveData/Mover/body/source/screen/screen.cpp index f1bbacc..6d96cf3 100644 --- a/trunk/CardSaveData/Mover/body/source/screen/screen.cpp +++ b/trunk/CardSaveData/Mover/body/source/screen/screen.cpp @@ -91,21 +91,6 @@ void pushButton(u32 sts) //NN_LOG("button > %4x\n",button); u32 trg = sts & 0x0ffff; u32 hld = sts >> 16; -/* - if (holdVal)//P\ - { - 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 L -#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 L gui.PanelEffective(PANEL_READ,false,false); i =0; - if (err & SDATA_ERRPUT_MEDIA) i = ERC_MEDIA + ERC_DEV_CARD;//obNAbvȂ - else if (err & SDATA_ERRPUT_PCODE) i = ERC_DEV_OTHER + ERC_PRODCODE;//v_NgR[hsv + //else + //if (err & SDATA_ERRPUT_MEDIA) i = ERC_MEDIA + ERC_DEV_CARD;//obNAbvȂ 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;//obNAbvȂ - else - if (err & SDATA_ERRPUT_VERIFI) i = ERC_SDK_VERIFI + ERC_DEV_CARD;//f[^Ă + if (err & SDATA_ERRPUT_MEDIA) i = ERC_MEDIA + ERC_DEV_CARD;//Z[uf[^}EgłȂ else if (bkupins == false) i = ERC_DEVICE + ERC_DEV_OUT;//ofoCX - else i = ERC_FORMAT + ERC_DEV_CARD;//tH[}bgG[ + else i = ERC_DEV_OTHER;//s sprintf(scr_err,"ERROR %d",i); gui.MessEffective(MESSAGE_MENU_ERROR); } diff --git a/trunk/CardSaveData/Mover/body/ver.h b/trunk/CardSaveData/Mover/body/ver.h index c99df49..78aaf06 100644 --- a/trunk/CardSaveData/Mover/body/ver.h +++ b/trunk/CardSaveData/Mover/body/ver.h @@ -16,7 +16,7 @@ #ifndef VER_H_ #define VER_H_ -#define VERSION 1.05 +#define VERSION 1.10 #endif diff --git a/trunk/CardSaveData/Mover/release.txt b/trunk/CardSaveData/Mover/release.txt index 9331b64..cf32e59 100644 --- a/trunk/CardSaveData/Mover/release.txt +++ b/trunk/CardSaveData/Mover/release.txt @@ -10,6 +10,7 @@ CUP (C|[g菇) EfobK̓C^"cci"J[hɏ +E{̃VA܂񂾃XgƏSD EHomej[J[hNj[Inports Ej[ImportI EId{^Z ->"d؂"^b` @@ -21,20 +22,6 @@ CUP Ej[Deletes I̓j[ɖ߂܂ -(eXgp^[) -J[h̃obNAbvɃeXgf[^݂܂ -茳ɎgQ[J[hꍇ̓mFpł -N܂ł̓C|[gƓl -EfobK̓C^"cci"J[hɏ -EJ[h{̂ɍj[Test Datas -EJ[\œeIAAŃCgAXŃxt@C -ʂCasual Test IԁA̓[X̃`FbNɎgx - - -CgɈUIHomej[ɂǂ -Nand̃c[NA[hXgA -Home{^ȂǂŃc[IAJ[hNxt@C - c[{̂̑͑}jAQ @@ -42,9 +29,13 @@ Home [Histry] #\ver@}X^Over # ύXe +v1.10 - Remaster 2.0.12 + body:[gfBNg̍ŏȂsC(`Q[eȂ) + t@C̊mۃTCY𒴂ɃG[\ + tH[}bgnG[\𓝍(G[ԍ106) -v1.04 - Remaster 2.0.9 - svnrW 190 - body,imp: ACRHɕύXFj[̃oOŃtOŋۂĂɌĂ܂ +v1.04 - Remaster 2.0.10 - svnrW 190 + body,imp: ACRHɕύXFj[̃oOŋۃtOݒ肵Ăt@[ł͗ɌĂ܂ 쒆̖~ v1.03 - Remaster 2.0.8 - svnrW 181 diff --git a/trunk/CardSaveData/ToSD/body/source/main.cpp b/trunk/CardSaveData/ToSD/body/source/main.cpp index 0f1e2fb..32ccd77 100644 --- a/trunk/CardSaveData/ToSD/body/source/main.cpp +++ b/trunk/CardSaveData/ToSD/body/source/main.cpp @@ -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); } diff --git a/trunk/CardSaveData/ToSD/body/source/screen/screen.cpp b/trunk/CardSaveData/ToSD/body/source/screen/screen.cpp index 90a5531..3d277d3 100644 --- a/trunk/CardSaveData/ToSD/body/source/screen/screen.cpp +++ b/trunk/CardSaveData/ToSD/body/source/screen/screen.cpp @@ -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 L -#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;//obNAbvȂ - else - if (err & SDATA_ERRPUT_VERIFI) i = ERC_SDK_VERIFI + ERC_DEV_CARD;//f[^Ă - //else if (sdins == false) i = ERC_DEVICE + ERC_DEV_OUT;//ofoCX - else i = ERC_FORMAT + ERC_DEV_CARD;//tH[}bgG[ + else i = ERC_DEV_OTHER;//s sprintf(scr_err,"ERROR %d",i); gui.MessEffective(MESSAGE_MENU_ERROR); } diff --git a/trunk/CardSaveData/ToSD/release.txt b/trunk/CardSaveData/ToSD/release.txt index c6aa8d3..dd5a30b 100644 --- a/trunk/CardSaveData/ToSD/release.txt +++ b/trunk/CardSaveData/ToSD/release.txt @@ -6,14 +6,16 @@ oe CTR_SDK\tools\TargetTools\CTR-TS\Release\NandFiler -ŊJJ[hփCgł܂ +ŊJJ[h̃TuJ[hփCgł܂ +eʂ^Cg̃`FbN͂܂̂Ŏgp҂ŒӉ //////////////////////////////////////////////////////////////// NANDC|[gĂAAvl̎菇ŋN -{̃VXe2.31(1stNup)ȍ~ɂĂ +{̏̃o[W 2.0.0 (1stNup)ȍ~̃t@[œ삷 (C|[g菇) EfobK̓C^"cci"J[hɏ +E{̃VA܂ރXgƏSD EHomej[J[hNj[Inports Ej[ImportI EId{^Z ->"d؂"^b` @@ -27,5 +29,8 @@ NAND c[{̂̑͑}jAQ +F +2011.6.8 ver0.01(}X^o[W1.0.0) + [Histry] diff --git a/trunk/CardSaveData/common/common.cpp b/trunk/CardSaveData/common/common.cpp index f887565..c9f509a 100644 --- a/trunk/CardSaveData/common/common.cpp +++ b/trunk/CardSaveData/common/common.cpp @@ -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;//L[ .. 肦Ȃ else if (desc < 180 ) code = ERC_READ;//t@C‚Ȃs else if (desc < 200 ) code = ERC_WRITE_OW;//t@C .. 폜s? @@ -36,11 +36,11 @@ void GetErrorStr(ErcDev dev,nn::Result res,int cd,char* s) else if (desc < 900 ) code = ERC_EXEC;//sG[A\tgoO 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); - } + // } } diff --git a/trunk/CardSaveData/common/my_defs.h b/trunk/CardSaveData/common/my_defs.h index 0e2401e..4ea84a0 100644 --- a/trunk/CardSaveData/common/my_defs.h +++ b/trunk/CardSaveData/common/my_defs.h @@ -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 { diff --git a/trunk/CardSaveData/common/savefile/membak.cpp b/trunk/CardSaveData/common/savefile/membak.cpp index 3d66da8..a8e17a8 100644 --- a/trunk/CardSaveData/common/savefile/membak.cpp +++ b/trunk/CardSaveData/common/savefile/membak.cpp @@ -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 -//gZ[uf[^ //݊mF bool MemBak::IsExist() { @@ -54,11 +53,8 @@ bool MemBak::IsExist() } //Z[u쐬A̓}Eg -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; diff --git a/trunk/CardSaveData/common/savefile/membak.h b/trunk/CardSaveData/common/savefile/membak.h index d3c8677..08c54e4 100644 --- a/trunk/CardSaveData/common/savefile/membak.h +++ b/trunk/CardSaveData/common/savefile/membak.h @@ -22,6 +22,10 @@ #include "savefile.h" #include +//̉zobNAbve +//SDKXVŃAv̈悪”\̂ŖȂ +#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(); diff --git a/trunk/CardSaveData/common/savefile/savedata.h b/trunk/CardSaveData/common/savefile/savedata.h index 3a1c9dc..0b247ea 100644 --- a/trunk/CardSaveData/common/savefile/savedata.h +++ b/trunk/CardSaveData/common/savefile/savedata.h @@ -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(); diff --git a/trunk/CardSaveData/common/savefile/savefile.cpp b/trunk/CardSaveData/common/savefile/savefile.cpp index 3da0b7e..eedd2ba 100644 --- a/trunk/CardSaveData/common/savefile/savefile.cpp +++ b/trunk/CardSaveData/common/savefile/savefile.cpp @@ -48,8 +48,6 @@ bool CheckPath(wchar_t *s) } - - //-------------- Class SaveFileWrite //fBNg쐬̃I[v 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;//E܂ō폜 () dir1/dir2/file -> dir1/dir2 -> dir1 LastNnResult = nn::fs::TryCreateDirectory(pathw_w2); } + //쐬fBNgƉʎ~܂̂ŁA쐬Ƃɔ *mkdir = true; // AlFfalse mkdir=true ȂfBNg쐬̂ return false; @@ -230,7 +229,7 @@ static nn::fs::Directory dcl; //A[JCu̎擾 -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;n0)m_info.total +=clsz;//SD..fBNgŃNX^ wcscpy(pathu_w[lv],pathw_w);//pXۑ wcscat(pathw_w,dcEntryl.entryName);//̃fBNgpX wcscat(pathw_w,L"/"); @@ -274,6 +276,13 @@ static nn::fs::Directory dcl; break; }else{//t@C m_info.FileCount++; + if (clsz==0){ + m_info.total += dcEntryl.entrySize; + }else{//NX^TCYŒ .. SDLe + sn = dcEntryl.entrySize / clsz; + if ((dcEntryl.entrySize % clsz) > 0 )sn++; + m_info.total += sn*clsz; + } } } } diff --git a/trunk/CardSaveData/common/savefile/savefile.h b/trunk/CardSaveData/common/savefile/savefile.h index e409712..eb1af3f 100644 --- a/trunk/CardSaveData/common/savefile/savefile.h +++ b/trunk/CardSaveData/common/savefile/savefile.h @@ -34,8 +34,9 @@ void ChainPath(wchar_t *p1,wchar_t *p2); //Z[uɊւ #define INFO_VERSION 0 struct tArcInfo{ + s64 total;//t@CTCYv u32 DirEntry,FileEntry;//tH[}bg - u32 DirCount,FileCount;//o^ + u32 DirCount,FileCount;//Dir,t@C char Pcode[20];//product code SDK̃TCYȂ bool Dup;//2d u8 Ver; @@ -56,9 +57,7 @@ protected: wchar_t *pPathTop; char devName[16]; bool IsMounted; - char dumy[3]; public: - //pXݒ 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];//[hς݃Gg wchar_t pathu_w[MAX_LEVEL][MAX_PATH_LENGTH];//pX 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 diff --git a/trunk/CardSaveData/common/savefile/sdmc.h b/trunk/CardSaveData/common/savefile/sdmc.h index a0e9512..406bd09 100644 --- a/trunk/CardSaveData/common/savefile/sdmc.h +++ b/trunk/CardSaveData/common/savefile/sdmc.h @@ -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(); diff --git a/trunk/CardSaveData/common/savefile/sdmcwo.cpp b/trunk/CardSaveData/common/savefile/sdmcwo.cpp index b32d1cf..6660dd0 100644 --- a/trunk/CardSaveData/common/savefile/sdmcwo.cpp +++ b/trunk/CardSaveData/common/savefile/sdmcwo.cpp @@ -15,34 +15,8 @@ #include #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(); -} diff --git a/trunk/CardSaveData/common/savefile/sdmcwo.h b/trunk/CardSaveData/common/savefile/sdmcwo.h index 03bb491..63cb155 100644 --- a/trunk/CardSaveData/common/savefile/sdmcwo.h +++ b/trunk/CardSaveData/common/savefile/sdmcwo.h @@ -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();}; };