From 68c9011a614e4b4e90a86b7e6af749effed3ee4e Mon Sep 17 00:00:00 2001 From: mizu Date: Thu, 16 Feb 2012 05:48:14 +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@639 385bec56-5757-e545-9c3a-d8741f4650f1 --- trunk/CardSaveData/OMakefile | 1 + .../ToSD/Imp/imp_list/batch/cts_list.txt | 2 +- .../ToSD/Imp/imp_list/batch/cts_sign.dat | 5 +- trunk/CardSaveData/ToSD/body/OMakefile | 2 +- trunk/CardSaveData/ToSD/body/source/main.cpp | 29 +- .../ToSD/body/source/screen/screen.cpp | 11 +- trunk/CardSaveData/ToSD/body/ver.h | 2 +- trunk/CardSaveData/ToSD/release.txt | 2 + trunk/CardSaveData/common/common.cpp | 15 +- trunk/CardSaveData/common/common.h | 2 +- trunk/CardSaveData/common/gui/gui.cpp | 225 ++++--------- trunk/CardSaveData/common/gui/gui.h | 12 +- trunk/CardSaveData/common/my_defs.h | 42 ++- trunk/CardSaveData/common/savefile/exsave.cpp | 306 +++--------------- trunk/CardSaveData/common/savefile/exsave.h | 48 +-- trunk/CardSaveData/common/savefile/membak.cpp | 19 +- trunk/CardSaveData/common/savefile/membak.h | 6 +- .../CardSaveData/common/savefile/savedata.cpp | 5 +- .../CardSaveData/common/savefile/savefile.cpp | 132 +++++++- trunk/CardSaveData/common/savefile/savefile.h | 52 ++- trunk/CardSaveData/common/savefile/sdmcwo.cpp | 5 +- trunk/CardSaveData/common/savefile/sdmcwo.h | 2 +- trunk/CardSaveData/common/shfnt.cpp | 101 +++++- trunk/CardSaveData/common/shfnt.h | 8 + trunk/CardSaveData/common/test_data.cpp | 292 ++++++++++++----- 25 files changed, 712 insertions(+), 614 deletions(-) diff --git a/trunk/CardSaveData/OMakefile b/trunk/CardSaveData/OMakefile index 9890e86..7d24b46 100644 --- a/trunk/CardSaveData/OMakefile +++ b/trunk/CardSaveData/OMakefile @@ -25,6 +25,7 @@ LIBS += lib_demo libnn_am .SUBDIRS: $(exist-dirs \ Mover \ ToSD \ + Mover_child \ ) DefineDefaultRules() diff --git a/trunk/CardSaveData/ToSD/Imp/imp_list/batch/cts_list.txt b/trunk/CardSaveData/ToSD/Imp/imp_list/batch/cts_list.txt index 0f11b78..f222c05 100644 --- a/trunk/CardSaveData/ToSD/Imp/imp_list/batch/cts_list.txt +++ b/trunk/CardSaveData/ToSD/Imp/imp_list/batch/cts_list.txt @@ -1 +1 @@ -EJF10000237 +EJF10000308 diff --git a/trunk/CardSaveData/ToSD/Imp/imp_list/batch/cts_sign.dat b/trunk/CardSaveData/ToSD/Imp/imp_list/batch/cts_sign.dat index 990b849..3f28c63 100644 --- a/trunk/CardSaveData/ToSD/Imp/imp_list/batch/cts_sign.dat +++ b/trunk/CardSaveData/ToSD/Imp/imp_list/batch/cts_sign.dat @@ -1,2 +1,3 @@ -c°Àæ;q’i|xÛ$^DÿQ¨lŒ¡Ë_òùO?·OQwø]i…³¾ÄdžÁUÄÊ›PˆàíðàL8ªýQLÊîQ’j€ô)°~SVO>( $6çùi(—H?ä8?0Û„U ‹zO¤W󃳽$‘}葯šÀPГŽ<ö]ϨúÖï[¤Ø Ý)3„Öèv}2^F¡oð¿{5íÔTzdNA*-‰—Í\Â$4ŒÐ]Î9éìKmÈT¬F­0ÍúãL—3’9ƒõÖi=åèŽô’'[4>³÷¿´•Q,/µ†³GÈ—]˜žŸß03‡ -þ“›Ðâ×Û= \ No newline at end of file +C¯‚ï$3›´dbh¶± +ê?Yùa+! ¬ “Œî*S¿WÉIÚÊvá¶ÆDY­ 0´xH¼B´nÓ&R pjD/'‡êY j9ʾlô|Ü0) { int i,rev=0; for (i=0;i +#include #include #include @@ -14,17 +15,17 @@ extern uptr heapForGx; //ƒGƒ‰[•\ަ—p•¶Žš—ñ¶¬ -void GetErrorStr(ErcDev dev,nn::Result res,int cd,char* s) +void GetErrorStr(TgtDev dev,nn::Result res,int cd,tChar* s) { int desc=0,code; - if ((cd ==0 ) && (dev != ERC_DEV_OTHER)) + if ( (cd ==0 ) && ((dev == TGT_SD) || (dev == TGT_CARD))) { 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? - else if (desc < 220 ) code = ERC_WRITE_NS;//‹ó‚«‚ª–³‚¢ + else if (desc < 200 ) code = ERC_WRITE;//ƒtƒ@ƒCƒ‹‚ª‘¶Ý + else if (desc < 220 ) code = ERC_NOSPACE;//‹ó‚«‚ª–³‚¢ else if (desc < 260 ) code = ERC_ACCESS;//‘€ì‹‘”Û else if (desc < 280 ) code = ERC_WRITE_PROTECT;//‘‚«ž‚݋֎~ else if (desc < 340 ) code = ERC_ACCESS;//ƒAƒNƒZƒXƒGƒ‰[ @@ -39,7 +40,11 @@ void GetErrorStr(ErcDev dev,nn::Result res,int cd,char* s) //if (desc>=600){ // sprintf(s,"ERROR %d, desc %d",dev+code,desc); //}else{ +#ifdef USE_WCHAR + swprintf(s,16,L"ERROR %d",dev+code); +#else sprintf(s,"ERROR %d",dev+code); +#endif // } } @@ -107,7 +112,7 @@ void finish() g_AwakeEvent.Finalize(); g_TransitionEvent.Finalize(); - nn::fs::Finalize(); + //nn::fs::Finalize(); appHeap.Free(reinterpret_cast(heapForGx)); diff --git a/trunk/CardSaveData/common/common.h b/trunk/CardSaveData/common/common.h index b2a8566..3899bbd 100644 --- a/trunk/CardSaveData/common/common.h +++ b/trunk/CardSaveData/common/common.h @@ -8,7 +8,7 @@ typedef void (*FUNCP)(); void finish(); void CheckSysBreak(); void InitSysBreak(uptr adrs); -void GetErrorStr(ErcDev dev,nn::Result res,int cd,char* s); +void GetErrorStr(TgtDev dev,nn::Result res,int cd,tChar* s); #endif diff --git a/trunk/CardSaveData/common/gui/gui.cpp b/trunk/CardSaveData/common/gui/gui.cpp index c39d534..27a4077 100644 --- a/trunk/CardSaveData/common/gui/gui.cpp +++ b/trunk/CardSaveData/common/gui/gui.cpp @@ -13,6 +13,7 @@ *---------------------------------------------------------------------------*/ #include +#include #include #include #include @@ -67,15 +68,20 @@ public: }; + //パãƒãƒ« class cmPanel: public cmBase { public: tStyle style; - char *caption; + tChar *caption; public: cmPanel(){ +#ifdef USE_WCHAR + caption=L"None"; +#else caption="None"; +#endif style.image = 0; style.color.r = 1.0f; style.color.g = 1.0f; @@ -85,6 +91,8 @@ public: } }; + + //メッセージ class cmMessage: public cmPanel { @@ -95,58 +103,6 @@ public: }; -#define LINES_MAX 20 -#define CHARS_MAX 128 -//メモ -class cmMemo: public cmBase -{ -private: - char strlst[LINES_MAX][CHARS_MAX]; -public: - tStyle style; - u32 lines;//行サイズ:strlené…列数以下ã§ã‚ã‚‹ã“㨠- u32 parent;//親コンãƒãƒ¼ãƒãƒ³ãƒˆID -public: - cmMemo(); - bool setline(char *p,u16 ln); - char* line(u16 ln); - void clr(){ - for (int i=0;ir, col->g, col->b,col->a); + shf_SetColorW(col->r,col->g,col->b,col->a); +} +#else + +tChar* Wak_H = "-"; +tChar* Wak_V = "|"; +#define setText(x,y,s) shf_DrawText_0(x,y,s) +#define setSize(sz) shf_SetSize(sz) +#define setScale(h,v) shf_SetScale(h,v) +#define getFontwidth shf_GetFontWidth() +#define getFontheight shf_GetFontHeight() +#define getLen(s) strlen(s) +void setColor(tCol *col) +{ shf_SetColor(col->r,col->g,col->b,col->a); } +#endif -//void setSize(f32 sz) -//{ -// s_RenderSystem.SetFontSize(sz); -//} -/* -#define FONT_CAPTION_SIZE 12 -//caption付ãBoxæç”» -void drawBox(tU16xy top,tU16xy size,tStyle *st,char* str = 0) -{ - u16 xe = top.x + size.x -1; - u16 ye = top.y + size.y -1; - setColor(&st->color); - s_RenderSystem.SetLineWidth(st->width); - s_RenderSystem.DrawLine(top.x, top.y, xe, top.y); - s_RenderSystem.DrawLine(xe, top.y, xe, ye); - s_RenderSystem.DrawLine(xe, ye, top.x, ye); - s_RenderSystem.DrawLine(top.x, ye, top.x, top.y); - if (str != 0){ - int w = (size.x - strlen(str)*FONT_CAPTION_SIZE) >> 1; - int h = (size.y - FONT_CAPTION_SIZE) >> 1; - if ((w>0) && (h>0)){ - setSize(FONT_CAPTION_SIZE); - s_RenderSystem.DrawText(top.x + w,top.y + h,str); - } - } -} -*/ //上画é¢ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸æž è¡¨ç¤º -void drawBox(tU16xy top,tU16xy size,tStyle *st,char* str = 0) +void drawBox(tU16xy top,tU16xy size,tStyle *st,tChar* str = 0) { int i; - shf_SetScale(2.0f,2.0f); + setScale(2.0f,2.0f); setColor(&st->color); - for (i=0;i> 1; + int w = getFontwidth/2; + int h = getFontheight; + setScale(1.0f,1.0f); + w = (size.x - getLen(str)*w) >> 1; h = (size.y - h) >> 1; if ((w>0) && (h>0)){ setText(top.x + w+10,top.y + h,str); @@ -251,21 +198,21 @@ void drawBox(tU16xy top,tU16xy size,tStyle *st,char* str = 0) } //下画é¢ãƒœã‚¿ãƒ³è¡¨ç¤º -void drawBox2(tU16xy top,tU16xy size,tStyle *st,char* str = 0) +void drawBox2(tU16xy top,tU16xy size,tStyle *st,tChar* str = 0) { int i; setColor(&st->color); - shf_SetScale(2.0f,2.0f); - for (i=0;i> 1; + setScale(1.0f,1.0f); + int w = getFontwidth/2; + int h = getFontheight; + w = (size.x - getLen(str)*w) >> 1; h = (size.y - h) >> 1; if ((w>0) && (h>0)){ setText(top.x + w+10,top.y + h+10,str); @@ -274,7 +221,7 @@ void drawBox2(tU16xy top,tU16xy size,tStyle *st,char* str = 0) } - +static int si; //æç”» void drawDisp() @@ -283,7 +230,7 @@ void drawDisp() //上 s_RenderSystem.SetRenderTarget(NN_GX_DISPLAY0); s_RenderSystem.Clear(); - int i,j; + int i; for (i=0;i= MESS_MAX)return RESULT_BAD_PARAM; s_Message[id].caption = str; @@ -599,38 +534,6 @@ myResult Gui::MessCol(u8 id,eColor col) return RESULT_OK; } -myResult Gui::MemoSet(const tMemo *m) -{ - if ((m->parent >= PANEL_MAX) || (m->id >= MEMO_MAX))return RESULT_BAD_PARAM; - if (m->lines > LINES_MAX)return RESULT_BAD_PARAM; - s_Memo[m->id].lines = m->lines; - s_Memo[m->id].pos.x = m->x; - s_Memo[m->id].pos.y = m->y; - s_Memo[m->id].parent = m->parent; - s_Memo[m->id].style.width = m->size; - ColorFromCode(m->color,&s_Memo[m->id].style.color); - s_Memo[m->id].clr(); - s_Memo[m->id].visible = false; - s_Memo[m->id].enable = false; - return RESULT_OK; -} - -myResult Gui::MemoStr(u8 id,char *str,u16 ln) -{ - if ((id < MEMO_MAX) && s_Memo[id].setline(str,ln) )return RESULT_OK; - return RESULT_BAD_PARAM; -} - - -myResult Gui::MemoEffective(u8 id,bool enable,bool visible) -{ - if (id >= MEMO_MAX)return RESULT_BAD_PARAM; - s_Memo[id].enable = enable; - s_Memo[id].visible = visible; - return RESULT_OK; -} - - void Gui::Draw() { diff --git a/trunk/CardSaveData/common/gui/gui.h b/trunk/CardSaveData/common/gui/gui.h index 2d1af2c..5e9c06e 100644 --- a/trunk/CardSaveData/common/gui/gui.h +++ b/trunk/CardSaveData/common/gui/gui.h @@ -23,7 +23,7 @@ typedef struct { uptr callback; - char* caption; + tChar* caption; u16 x,y; u16 width,height; u16 id; @@ -44,7 +44,7 @@ typedef enum { typedef struct { - char* str; + tChar* str; u16 x,y;//親ã®å§‹ç‚¹ã¨ã®ç›¸å¯¾ eColor color;// u8 size;//文字サイズ @@ -78,15 +78,15 @@ public: void ButtonMask(u32 mask); myResult PanelSet(const tPanel *panel); myResult MessSet(const tMessage *mes); - myResult MemoSet(const tMemo *m); +// myResult MemoSet(const tMemo *m); void Draw(); void DisableAll(); myResult PanelEffective(u8 id,bool enable=true,bool visible=true); myResult MessEffective(u8 id,bool enable=true,bool visible=true); - myResult MemoEffective(u8 id,bool enable=true,bool visible=true); - myResult MessStr(u8 id,char *str); +// myResult MemoEffective(u8 id,bool enable=true,bool visible=true); + myResult MessStr(u8 id,tChar *str); myResult MessCol(u8 id,eColor col); - myResult MemoStr(u8 id,char *str,u16 ln); +// myResult MemoStr(u8 id,tChar *str,u16 ln); myResult PanelLineStyle(u8 id,eColor col=COLOR_WHITE,u8 width = 2); //void thUpdate(); }; diff --git a/trunk/CardSaveData/common/my_defs.h b/trunk/CardSaveData/common/my_defs.h index 4ea84a0..5e07fae 100644 --- a/trunk/CardSaveData/common/my_defs.h +++ b/trunk/CardSaveData/common/my_defs.h @@ -16,20 +16,38 @@ #ifndef MYDEFS_H_ #define MYDEFS_H_ +//拡張セーブ用ã®ï¼©ï¼¤ +//rsfã®UIDã¨åˆã‚ã›ã‚‹ +#define OWN_UID 0xf8014 + +#define USE_WCHAR 1 + +//文字列型 +#ifdef USE_WCHAR +typedef wchar_t tChar; +#else +typedef char tChar; +#endif + //エラー表示コード +//v2.0ã§å¤‰æ›´ +//ERC_PATH:パスãŒé•·ã™ãŽ,ERC_DIRDEPTH:ディレクトリ深ã™ãŽ +//->ERC_WORK ã«ã¾ã¨ã‚ã‚‹ +//5番をPULLOUTã«å¤‰æ›´ + enum { ERC_UNKNOWN = 0, //䏿˜Ž ERC_DEVICE, //デãƒã‚¤ã‚¹ãŒè¦‹ã¤ã‹ã‚‰ãªã„(カード抜ã‘) ERC_PRODCODE,//プロダクトコードä¸ä¸€è‡´ ERC_VERIFI,//ベリファイエラー -ERC_PATH,//パスãŒé•·ã™ãŽ -ERC_DIRDEPTH,//ディレクトリ深ã™ãŽ +ERC_WORK,//ワーク作æˆã«å¤±æ•— +ERC_PULLOUT,//æŠœã‘æ¤œå‡º ERC_MEDIA, //メディアãŒè¦‹ã¤ã‹ã‚‰ãªã„(サブ基盤外れãªã©) -//ERC_PULLOUT,//æŠœã‘æ¤œå‡º ERC_READ = 10, //ファイルãŒè¦‹ã¤ã‹ã‚‰ãªã„ -ERC_WRITE_OW = 20, //æ—¢ã«å­˜åœ¨ -ERC_WRITE_NS, //空ã容é‡ãŒãªã„ +//ERC_WRITE_OW = 20, //æ—¢ã«å­˜åœ¨ +ERC_WRITE = 20, //ライトエラー +ERC_NOSPACE, //空ã容é‡ãŒãªã„ ERC_WRITE_PROTECT, //書込ã¿ç¦æ­¢ ERC_ACCESS = 30, //アクセスエラー ERC_FORMAT = 50, //フォーマットエラー @@ -40,12 +58,13 @@ ERC_EXEC = 90, //実行時エラー ERC_FATAL = 99 //深刻ãªã‚¨ãƒ©ãƒ¼ }; -typedef enum{ -ERC_DEV_CARD = 100, -ERC_DEV_OUT = 200, -ERC_DEV_OTHER = 300 -}ErcDev; - +typedef enum{//対象デãƒã‚¤ã‚¹æŒ‡å®š +TGT_NONE = 0, +TGT_CARD = 100, +TGT_SD = 200, +TGT_MEM = 300 +}TgtDev; +//OUT=SD or MEM //内部使用ã®ã‚¨ãƒ©ãƒ¼ typedef enum { @@ -74,6 +93,7 @@ typedef enum { RESULT_DIR_LEVEL_OVER, RESULT_PATH_LENGTH_OVER, RESULT_DEVICE_FULL, + RESULT_WORK_OVER, RESULT_MAX }myResult; diff --git a/trunk/CardSaveData/common/savefile/exsave.cpp b/trunk/CardSaveData/common/savefile/exsave.cpp index 6cf769a..99ffc3b 100644 --- a/trunk/CardSaveData/common/savefile/exsave.cpp +++ b/trunk/CardSaveData/common/savefile/exsave.cpp @@ -1,81 +1,49 @@ #include #include #include -#include <../fs/fs_ResultPrivate.h> #include "exsave.h" - -#define OWN_UID 0xf8014 -const char *exsaveName = "exsave:"; -const wchar_t *exsaveRoot_w = L"exsave:/save/"; -const char *exsaveRoot = "exsave:/save/"; -#define ROOTLENGTH_EX 8 -const wchar_t *exsaveSys_w = L"exsave:/ncl_sysdata.ncl";//暫定 -wchar_t expath_w[PATHLENGTH_MAX];//パスå -wchar_t expathu_w[100][PATHLENGTH_MAX];//上層パスå -wchar_t expathw_w[PATHLENGTH_MAX];//パスåワーク -static nn::fs::DirectoryEntry exdcEntry[MAX_LEVEL]; -static nn::fs::Directory exdc[MAX_LEVEL]; +#include +#include +//#include +//#include -//拡張セーブデータ -//å­˜åœ¨ç¢ºèª -bool ExSave::IsExist() -{ - LastNnResult = nn::fs::MountExtSaveData(exsaveName,OWN_UID); - nn::fs::Unmount(exsaveName); - return LastNnResult.IsSuccess(); -} +extern "C" { + extern u8* ICON_BEGIN[]; + extern u8* ICON_END[]; -//パス検索ä½ç½®ã®ãƒªã‚»ãƒƒãƒˆ -void ExSave::ResetPath() -{ - s_lv=0; - s_serch = false; - wcscpy(expath_w,exsaveRoot_w); - //wcscpy(expathu_w,expath_w); + const void* ICON = ICON_BEGIN; + const size_t ICON_SIZE = ICON_END-ICON_BEGIN; } -myResult ExSave::GetPath(wchar_t *path) +//セーブ作æˆã€æˆåŠŸæ™‚ã¯ãƒžã‚¦ãƒ³ãƒˆçŠ¶æ…‹ +myResult ExSave::Create(u32 entryDir,u32 entryFile) { - int n; - while(1){ - if (s_serch==false){ - LastNnResult = exdc[s_lv].TryInitialize(expath_w);//Open - if (LastNnResult.IsFailure()){ - return RESULT_FAIL; - } - } - while(1){ - n = (exdc[s_lv].Read(&exdcEntry[s_lv],1)); - if ( n==0 )//終端 - { - exdc[s_lv].Finalize(); - if (s_lv == 0){path[0]=0;return RESULT_OK;}// ---- rootãªã‚‰çµ‚了 - s_lv--;//上ã®å±¤ã«æˆ»ã‚‹ - wcscpy(expath_w,expathu_w[s_lv]);//パス戻㙠- }else{ - if(exdcEntry[s_lv].attributes.isDirectory){//ディレクトリ - //m_info.DirCount++; - wcscpy(expathu_w[s_lv],expath_w);//パスä¿å­˜ - wcscat(expath_w,exdcEntry[s_lv].entryName);//次ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãƒ‘ス - wcscat(expath_w,L"/"); - if (++s_lv == MAX_LEVEL)return RESULT_DIR_LEVEL_OVER; - s_serch = false; - break; - }else{//ファイル - //m_info.FileCount++; - s_serch = true; - wcscpy(path,pPathTop); - wcscat(path,exdcEntry[s_lv].entryName); - return RESULT_OK; - } - } - } - } - + if ( IsMounted )return RESULT_ALREADY_MOUNT; + LastNnResult = nn::fs::CreateExtSaveData(OWN_UID,ICON,ICON_SIZE,entryDir,entryFile); + if (LastNnResult.IsFailure())return RESULT_FAIL_CREATE; + LastNnResult = nn::fs::MountExtSaveData(devName,OWN_UID); + if (LastNnResult.IsFailure())return RESULT_FAIL_MOUNT; + //LastNnResult = nn::fs::TryCreateDirectory(root_w); + //if (LastNnResult.IsFailure()){ + // nn::fs::Unmount(devName); + // return RESULT_FAIL_MOUNT; + //} + IsMounted = true; + return RESULT_OK; } +//空ãå®¹é‡ +s64 ExSave::GetFreeSize() +{ + if (IsMounted==false)if(MountCore()==false)return 0; + s64 a,b; + LastNnResult = nn::fs::GetSdmcSize(&a,&b); + if (IsMounted==false)Unmount(); + if (LastNnResult.IsFailure())return 0; + return b; +} //削除 bool ExSave::Delete() @@ -85,215 +53,29 @@ bool ExSave::Delete() return LastNnResult.IsSuccess(); } -//セーブ作æˆã€æˆåŠŸæ™‚ã¯ãƒžã‚¦ãƒ³ãƒˆçŠ¶æ…‹ -myResult ExSave::Create(const void* icon,size_t iconSize,u32 entryDir,u32 entryFile) -{ - if ( IsMounted )return RESULT_ALREADY_MOUNT; - LastNnResult = nn::fs::CreateExtSaveData(OWN_UID,icon,iconSize,entryDir,entryFile); - if (LastNnResult.IsFailure())return RESULT_FAIL_CREATE; - LastNnResult = nn::fs::MountExtSaveData(exsaveName,OWN_UID); - if (LastNnResult.IsFailure())return RESULT_FAIL_MOUNT; - LastNnResult = nn::fs::TryCreateDirectory(exsaveRoot_w); - if (LastNnResult.IsFailure()){ - nn::fs::Unmount(exsaveName); - return RESULT_FAIL_MOUNT; - } - IsMounted = true; - return RESULT_OK; -} + //マウント -myResult ExSave::Mount() +bool ExSave::MountCore() { - if ( IsMounted )return RESULT_ALREADY_MOUNT; - LastNnResult = nn::fs::MountExtSaveData(exsaveName,OWN_UID); - if (LastNnResult.IsFailure()){ - return RESULT_FAIL_MOUNT; - } - IsMounted = true; - return RESULT_OK; -} -void ExSave::Unmount() -{ - IsMounted = false; - nn::fs::Unmount(exsaveName); -} -//ライト属性ファイルを閉ã˜ã‚‹ -void ExSave::CloseW() -{ - writer.Finalize(); -} - -//ファイルライト -s32 ExSave::Write(char *buffer,size_t size) -{ - s32 ct; - LastNnResult = writer.TryWrite(&ct,(void*)buffer,size); - if(LastNnResult.IsFailure())ct=0; - return ct; -} - - -//管ç†ç”¨ãƒ•ァイル -//ライト属性ã§é–‹ã -bool ExSave::OpenSysW() -{ - LastNnResult = nn::fs::TryCreateFile(exsaveSys_w,sizeof(tArcInfo)); - LastNnResult = writerSys.TryInitialize(exsaveSys_w,false); - return LastNnResult.IsSuccess(); -} -//ライト属性ファイルを閉ã˜ã‚‹ -void ExSave::CloseSysW() -{ - writerSys.Finalize(); -} -//システムファイルライト -bool ExSave::WriteSys(tArcInfo *pinfo) -{ - s32 ct; - pinfo->Ver = INFO_VERSION; - LastNnResult = writerSys.TryWrite(&ct,(void*)pinfo,sizeof(tArcInfo)); - return LastNnResult.IsSuccess(); -} -//リード属性ã§é–‹ã -bool ExSave::OpenSysR() -{ - LastNnResult = readerSys.TryInitialize(exsaveSys_w); - return LastNnResult.IsSuccess(); -} -//ライト属性ファイルを閉ã˜ã‚‹ -void ExSave::CloseSysR() -{ - readerSys.Finalize(); -} -//ファイルリード -bool ExSave::ReadSys(tArcInfo *pinfo) -{ - s32 ct; - LastNnResult = readerSys.TryRead(&ct,(void*)pinfo,sizeof(tArcInfo)); + LastNnResult = nn::fs::MountExtSaveData(devName,OWN_UID); return LastNnResult.IsSuccess(); } - - - -//ライト属性ファイルを開ã -bool ExSave::OpenW(wchar_t *path,s64 size) +//フォーマット情報 +void ExSave::GetFormatInfoCore(tArcInfo *ifo) { - int pos,pos2; - - wcscpy(expath_w,exsaveRoot_w); - wcscat(expath_w,path); - while(1){ - LastNnResult = nn::fs::TryCreateFile(expath_w,size); - if(LastNnResult.IsSuccess())break; - //ディレクトリãŒãªã‘れã°ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’ä½œæˆ - pos = GetPosDelmLast(expath_w,ROOTLENGTH_EX);//ファイルãŒå­˜åœ¨ã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª - if (pos <= 0)return false;//rootã‹ãƒ‘スãŒä¸æ­£ - //while (1){ - wcscpy(expathw_w,expath_w);//ワークã«ã‚³ãƒ”ー - while (LastNnResult.IsFailure()){//ディレクトリ作æˆã§ãã‚‹ã¾ã§é¡ã‚‹ - if(LastNnResult.GetDescription()!=nn::fs::DESCRIPTION_DBM_DIRECTORY_NOT_FOUND)return false; - pos2 = GetPosDelmLast(expathw_w,ROOTLENGTH_EX);//境界ä½ç½®ã‚’探㙠- if (pos2 == 0)return false;//rootåˆ°é” - expathw_w[pos2] = 0;//境界ã¾ã§å‰Šé™¤ (例) dir1/dir2/file -> dir1/dir2 -> dir1 - LastNnResult = nn::fs::TryCreateDirectory(expathw_w); - } - //if (pos2 == pos)break;//é…置ディレクトリãªã‚‰æŠœã‘ã‚‹ - //todo:ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒæ·±ã„ã¨ã時間ãŒã‹ã‹ã‚‹ãªã‚‰ã€ç„¡é§„ãªTryCreateã‚’çœã - //案)直上ã‹ã‚‰æœ€åˆã®æˆåŠŸã¾ã§ã®ãƒ‡ãƒªãƒŸã‚¿ä½ç½®ã‚’記録 - //å…ˆã«å…¨ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªä½œã£ã¦ãŠãã®ãŒã‚ˆã•ã’ - //} - } - LastNnResult = writer.TryInitialize(expath_w,false); - return LastNnResult.IsSuccess(); -} - -//ファイルリード -s32 ExSave::Read(char *buffer,size_t size) -{ -// if (IsMounted==false)return 0; - s32 ct; - LastNnResult = reader.TryRead(&ct,(void*)buffer,size); - if(LastNnResult.IsFailure())ct=0; - return ct; -} - - -void ExSave::Close() -{ - reader.Finalize(); -} - - -//ファイルを開ã -//パス指定ã¯ãƒ«ãƒ¼ãƒˆä»¥é™ -//(ex)data:/dir/file -> dir/file -bool ExSave::Open(wchar_t *path) -{ - wcscpy(expathw_w,exsaveRoot_w); - wcscat(expathw_w,path); - LastNnResult = reader.TryInitialize(expathw_w); - if (LastNnResult.IsSuccess()) - { - LastNnResult = reader.TryGetSize(&FileSize); - if (LastNnResult.IsSuccess())return true; - else Close(); - } - return false; -} - -//アーカイブ情報ã®å–å¾— -bool ExSave::GetInfo(tArcInfo *pinfo) -{ - if(Mount()==RESULT_FAIL_MOUNT)return false; - //システムデータã‹ã‚‰ãƒ•ォーマット情報 - if (OpenSysR()) - { - if(ReadSys(pinfo) == false){ - pinfo->Pcode[0]=0; - CloseSysR();//クローズ - Unmount(); - return false; - } - }else{ - Unmount(); - return false; - } - CloseSysR();//クローズ -// Unmount(); -//#ifdef INFO_API_USE -//APIæƒ…å ±ã¨æ¯”較 -// LastNnResult = nn::fs::GetExtSaveDataFormatInfo(OWN_UID,&m_info.FileEntry,&m_info.DirEntry); -// if (m_info.FileEntry != pinfo->FileEntry)return false; -// if (m_info.DirEntry != pinfo->DirEntry)return false; -// //if (m_info.Dup != pinfo->Dup)return false; //ExSaveã«ã¯ç„¡ã„ -//#endif - return true; + LastNnResult = nn::fs::GetExtSaveDataFormatInfo(&ifo->FileEntry,&ifo->DirEntry,OWN_UID); } //コンストラクタ ExSave::ExSave() { - IsMounted = false; - s_lv=0; - m_info.DirCount = 0; - m_info.FileCount = 0; - m_info.DirEntry = 0; - m_info.FileEntry = 0; - wcscpy(expath_w,exsaveRoot_w); - //wcscpy(expathu_w,expath_w); - pPathTop = (wchar_t*)((u32)&expath_w+strlen(exsaveRoot)*2); + PrdCode[0] = 0; + strcpy(devName,"exsave:"); + SetRootPath(L"exsave:"); + } -void ExSave::Finalize() -{ - Close(); - Unmount(); -} -//デストラクタ -ExSave::~ExSave() -{ - Finalize(); -} + diff --git a/trunk/CardSaveData/common/savefile/exsave.h b/trunk/CardSaveData/common/savefile/exsave.h index 0806d88..39a43ec 100644 --- a/trunk/CardSaveData/common/savefile/exsave.h +++ b/trunk/CardSaveData/common/savefile/exsave.h @@ -21,50 +21,22 @@ #include "../my_defs.h" #include "savefile.h" -class ExSave +class ExSave: public SaveFileRead,public SaveFileWrite { public: - s64 FileSize; - nn::Result LastNnResult; + char PrdCode[20]; private: - nn::fs::FileReader reader; - nn::fs::FileWriter writer; - nn::fs::FileReader readerSys; - nn::fs::FileWriter writerSys; - wchar_t *pPathTop; - tArcInfo m_info; - int s_lv; - int exrootlen; - bool IsMounted; - bool s_serch; + void GetFormatInfoCore(tArcInfo *ifo); public: - ExSave(); - ~ExSave(); - void Finalize(); - myResult Create(const void* icon,size_t iconSize,u32 entryDir,u32 entryFile); - myResult CreateSys(const void* icon,size_t iconSize); - myResult Mount(); - myResult MountSys(); - bool IsExist(); - void Unmount(); + bool MountCore(); bool Delete(); - void CloseW(); - bool OpenW(wchar_t *path,s64 size); - bool OpenSysW();//暫定 - void CloseSysW();//暫定 - bool OpenSysR();//暫定 - void CloseSysR();//暫定 - s32 Write(char *buffer,size_t size); - bool WriteSys(tArcInfo *pinfo); - bool ReadSys(tArcInfo *pinfo); - void ResetPath(); - s32 Read(char *buffer,size_t size); - void Close(); - bool Open(wchar_t *path); - myResult GetPath(wchar_t *path); - bool GetInfo(tArcInfo *pinfo); + s64 GetFreeSize(); + myResult Create(u32 entryDir,u32 entryFile); + void Finalize(){Close();}; +// bool GetPrdCode(); + ExSave(); + ~ExSave(){Finalize();}; }; - #endif diff --git a/trunk/CardSaveData/common/savefile/membak.cpp b/trunk/CardSaveData/common/savefile/membak.cpp index a8e17a8..a868833 100644 --- a/trunk/CardSaveData/common/savefile/membak.cpp +++ b/trunk/CardSaveData/common/savefile/membak.cpp @@ -12,7 +12,7 @@ namespace bit8 s_Buffer[BUFFER_SIZE] NN_ATTRIBUTE_ALIGN(4096); } -bool info_alive; +//bool info_alive; //-------------------------------------------------------------------- // @@ -28,7 +28,7 @@ MemBak::MemBak() LastNnResult = ResultSuccess(); ResetPath(); - info_alive = false; +// info_alive = false; } void MemBak::Finalize() @@ -61,10 +61,13 @@ myResult MemBak::Create(u32 entryDir,u32 entryFile) } m_NumDirEntry = entryDir; + m_ArcInfo.DirEntry = entryDir; m_NumFileEntry = entryFile; + m_ArcInfo.FileEntry = entryFile; m_Exists = true; m_IsMounted = true; + m_pBufferPos = m_pBuffer; return RESULT_OK; } @@ -72,14 +75,16 @@ myResult MemBak::Create(u32 entryDir,u32 entryFile) bool MemBak::Delete() { m_Exists = false; - info_alive = false; +// info_alive = false; m_pBufferPos = m_pBuffer; + m_IsMounted = false; return true; } //ƒ}ƒEƒ“ƒg myResult MemBak::Mount() { + if (m_Exists == false)return RESULT_FAIL_MOUNT; if ( m_IsMounted ) { return RESULT_ALREADY_MOUNT; @@ -88,6 +93,7 @@ myResult MemBak::Mount() m_IsMounted = true; return RESULT_OK; } + void MemBak::Unmount() { m_IsMounted = false; @@ -102,12 +108,11 @@ void MemBak::Unmount() //ƒA[ƒJƒCƒuî•ñ‚̎擾 bool MemBak::GetInfo(tArcInfo *pinfo) { - if (info_alive==false)return false; *pinfo = m_ArcInfo; - return true; + return m_Exists; } - +/* //ŠÇ——pƒtƒ@ƒCƒ‹ //ƒ‰ƒCƒg‘®«‚ÅŠJ‚­ bool MemBak::OpenSysW() @@ -128,7 +133,7 @@ bool MemBak::WriteSys(tArcInfo *pinfo) m_ArcInfo = *pinfo; return true; } - +*/ diff --git a/trunk/CardSaveData/common/savefile/membak.h b/trunk/CardSaveData/common/savefile/membak.h index 08c54e4..0711ea7 100644 --- a/trunk/CardSaveData/common/savefile/membak.h +++ b/trunk/CardSaveData/common/savefile/membak.h @@ -173,12 +173,12 @@ public: bool Delete(); void CloseW(); bool OpenW(wchar_t *path,s64 size); - bool OpenSysW();//Žb’è - void CloseSysW();//Žb’è +// bool OpenSysW();//Žb’è +// void CloseSysW();//Žb’è // bool OpenSysR();//Žb’è // void CloseSysR();//Žb’è s32 Write(char *buffer,size_t size); - bool WriteSys(tArcInfo *pinfo); +// bool WriteSys(tArcInfo *pinfo); // bool ReadSys(tArcInfo *pinfo); void ResetPath(); s32 Read(char *buffer,size_t size); diff --git a/trunk/CardSaveData/common/savefile/savedata.cpp b/trunk/CardSaveData/common/savefile/savedata.cpp index 2e4e010..be267fb 100644 --- a/trunk/CardSaveData/common/savefile/savedata.cpp +++ b/trunk/CardSaveData/common/savefile/savedata.cpp @@ -16,17 +16,21 @@ bool SaveData::GetPrdCode() nn::ProgramId programId; LastNnResult = nn::am::InitializeForLocalImporter(); +// LastNnResult = nn::am::InitializeForSystemMenu(); if (LastNnResult.IsFailure()){ nn::am::FinalizeForLocalImporter(); + // nn::am::FinalizeForSystemMenu(); return false; } LastNnResult = nn::am::GetProgramList(&numPrograms, &programId, 1, nn::fs::MEDIA_TYPE_CTRCARD); if (LastNnResult.IsFailure()){ nn::am::FinalizeForLocalImporter(); + //nn::am::FinalizeForSystemMenu(); return false; } LastNnResult = nn::am::GetProductCode( (nn::ProductCode*)&PrdCode,nn::fs::MEDIA_TYPE_CTRCARD,programId); nn::am::FinalizeForLocalImporter(); + //nn::am::FinalizeForSystemMenu(); PrdCode[sizeof(nn::ProductCode)] = 0;//表示時ã®ã‚ªãƒ¼ãƒãƒ©ãƒ³å¯¾ç­– return LastNnResult.IsSuccess(); } @@ -76,4 +80,3 @@ SaveData::SaveData() } - diff --git a/trunk/CardSaveData/common/savefile/savefile.cpp b/trunk/CardSaveData/common/savefile/savefile.cpp index eedd2ba..28457ac 100644 --- a/trunk/CardSaveData/common/savefile/savefile.cpp +++ b/trunk/CardSaveData/common/savefile/savefile.cpp @@ -26,7 +26,7 @@ void ChainPath(wchar_t *p1,wchar_t *p2) } -//ƒpƒX–¼ƒ`ƒFƒbƒN for SD +//ƒpƒX–¼ƒ`ƒFƒbƒN for SDMC //fsŠÖ”‚ňø”ƒGƒ‰[(INVALID_ARGUMENT)‚ɂȂç‚È‚¢‚à‚Ì‚ðƒ`ƒFƒbƒN bool CheckPath(wchar_t *s) { @@ -48,6 +48,72 @@ bool CheckPath(wchar_t *s) } +//ƒpƒX–¼ƒ`ƒFƒbƒN for Šg’£ƒZ[ƒu +bool CheckPathEx(wchar_t *s) +{ + size_t n = wcslen(s); + if ((n > 248) || (n==0))return false; + return true; +} + +//ƒfƒBƒŒƒNƒgƒŠˆê’vƒ`ƒFƒbƒN +//ret= 0:‚È‚µA‘¼:ʼn‚Ɉê’v‚µ‚½ŠK‘w +//ex) s = "/d1/d2/d3",s2 ="d2" or "/d2" ret=2 +// "/"‚ň͂܂ꂽ•¶Žš—ñ‚ðƒfƒBƒŒƒNƒgƒŠ‚ÆŒ©‚È‚· +int CmpDirW(wchar_t *s,wchar_t *s2) +{ + int i=0,j,n = wcslen(s),n2 = wcslen(s2); + int lv=1; + wchar_t *ss; + if (s2[0]==L'/') + { + ss = &s2[1]; + n2--; + }else ss = s2; + while(i=n)return 0; + if ((j-i-1) == n2) + {//•¶Žš’·ˆê’v‚µ‚½‚ç”äŠr + if(memcmp((void*)&s[i+1],(void*)ss,n2)==0)return lv; + } + lv++; + i=j;//ŽŸ + }else i++; + } + return 0; + +} + +//ƒtƒ@ƒCƒ‹–¼‚̈ê’vŠm”F +//s:ƒpƒX ex)"/dir/name" +//s2:ƒtƒ@ƒCƒ‹–¼ ex) "/name" +bool CmpNameW(wchar_t *s,wchar_t *s2) +{ + int n,n2,i; + n = wcslen(s); + n2 = wcslen(s2); + i = GetPosDelmLast(s,1);//"/"‚̈ʒu + if (n2 != n-i)return false;//•¶Žš”ˆê’vH + return memcmp((void*)&s[i],(void*)s2,n2*2)==0; +} + +bool CmpPathW(wchar_t *s,wchar_t *s2) +{ + int n,n2; + n = wcslen(s); + n2 = wcslen(s2); + if (n2 != n)return false;//•¶Žš”ˆê’vH + return memcmp((void*)s,(void*)s2,n2*2)==0; +} + + //-------------- Class SaveFileWrite //ƒfƒBƒŒƒNƒgƒŠì¬‚ ‚è‚̃I[ƒvƒ“ bool SaveFileWrite::OpenC(wchar_t *path,s64 size,bool *mkdir) @@ -81,6 +147,35 @@ bool SaveFileWrite::OpenC(wchar_t *path,s64 size,bool *mkdir) return false; } +//ƒfƒBƒŒƒNƒgƒŠì¬ +//–³‚¯‚ê‚΃pƒX‚Ɋ܂ރfƒBƒŒƒNƒgƒŠ‚àì¬ +bool SaveFileWrite::MakeDir(wchar_t *path,bool *mkdir) +{ + int pos,pos2; + + *mkdir = false; + LastNnResult = nn::fs::TryCreateDirectory(path); + if(LastNnResult.IsSuccess())return true; + if(nn::fs::ResultAlreadyExists::Includes(LastNnResult))return true; + + //ƒfƒBƒŒƒNƒgƒŠ‚ª‚È‚¯‚ê‚΃fƒBƒŒƒNƒgƒŠ‚ðì¬ + pos = GetPosDelmLast(path,RootLength);//ƒtƒ@ƒCƒ‹‚ª‘¶Ý‚·‚éƒfƒBƒŒƒNƒgƒŠ + if (pos <= 0)return false;//root‚©ƒpƒX‚ª•s³ + wcscpy(pathw_w2,path);//ƒ[ƒN‚ɃRƒs[ + while (LastNnResult.IsFailure()){//ƒfƒBƒŒƒNƒgƒŠì¬‚Å‚«‚é‚܂ők‚é + if(nn::fs::ResultNotFound::Includes(LastNnResult)==false)return false; + pos2 = GetPosDelmLast(pathw_w2,RootLength);//‹«ŠEˆÊ’u‚ð’T‚· + if (pos2 == 0)return false;//root“ž’B + pathw_w2[pos2] = 0;//‹«ŠE‚Ü‚Åíœ (—á) dir1/dir2/file -> dir1/dir2 -> dir1 + LastNnResult = nn::fs::TryCreateDirectory(pathw_w2); + } + + //쬃fƒBƒŒƒNƒgƒŠ‘½‚¢‚Ɖæ–ÊŽ~‚Ü‚é‚Ì‚ÅA쬂²‚Ƃɔ²‚¯‚é + *mkdir = true; // ‹A’lFfalse ‚Å mkdir=true ‚È‚çƒfƒBƒŒƒNƒgƒŠì¬‚Ì‚Ý + return false; +} + + //ƒfƒBƒŒƒNƒgƒŠì¬‚È‚µƒI[ƒvƒ“A‘¶Ý‚·‚éꇂ͒NjL bool SaveFileWrite::OpenAdd(wchar_t *path) { @@ -140,6 +235,11 @@ bool SaveFileWrite::DeleteDir(const wchar_t *dir) return LastNnResult.IsSuccess(); } +bool SaveFileWrite::DeleteFile(const wchar_t *path) +{ + LastNnResult = nn::fs::TryDeleteFile(path); + return LastNnResult.IsSuccess(); +} //------------------------------------------------------ Class SaveFileRead bool SaveFileRead::Open(const wchar_t *path) @@ -163,6 +263,15 @@ void SaveFileRead::Close() } +//ƒV[ƒN +bool SaveFileRead::SetPos(s64 pos) +{ + LastNnResult = reader.TrySetPosition(pos); + return LastNnResult.IsSuccess(); +} + + + //ƒtƒ@ƒCƒ‹ƒŠ[ƒh s32 SaveFileRead::Read(char *buffer,size_t size) { @@ -173,11 +282,11 @@ s32 SaveFileRead::Read(char *buffer,size_t size) } //‘¶Ýƒ`ƒFƒbƒN -myResult SaveFileRead::IsExist(){ +bool SaveFileRead::IsExist(){ myResult res; res = Mount(); Unmount(); - return res; + return (res != RESULT_FAIL_MOUNT); } @@ -227,9 +336,9 @@ static nn::fs::Directory dcl; } - //ƒA[ƒJƒCƒuî•ñ‚̎擾 -bool SaveFileRead::GetInfo(tArcInfo *pinfo,size_t clsz) +//clsz:SD‚ÌꇃNƒ‰ƒXƒ^ƒTƒCƒYŽw’è‚ÅŒ»ŽÀ‚ɋ߂¢ƒTƒCƒY‚É’²® +bool SaveFileRead::GetInfo(tArcInfo *pinfo,tDcList *pDcList,size_t clsz) { static nn::fs::DirectoryEntry dcEntryl; static nn::fs::Directory dcl; @@ -246,6 +355,9 @@ static nn::fs::Directory dcl; wcscpy(pathw_w,root_w); wcscat(pathw_w,L"/"); + CheckPathBit = 0; + pDcList->num = 0; + int n; int lv = 0; for (n = 0;n0)m_info.total +=clsz;//SD..ƒfƒBƒŒƒNƒgƒŠ‚ŃNƒ‰ƒXƒ^•ªŽæ‚é wcscpy(pathu_w[lv],pathw_w);//ƒpƒX•Û‘¶ wcscat(pathw_w,dcEntryl.entryName);//ŽŸ‚̃fƒBƒŒƒNƒgƒŠƒpƒX + if ( m_info.DirCount < MAX_DCLIST) + wcscpy(pDcList->name[m_info.DirCount],pathw_w);//ƒŠƒXƒg‚ÉŠi”[ + m_info.DirCount++; wcscat(pathw_w,L"/"); if (++lv == MAX_LEVEL)return false; break; @@ -283,6 +397,10 @@ static nn::fs::Directory dcl; if ((dcEntryl.entrySize % clsz) > 0 )sn++; m_info.total += sn*clsz; } + wcscpy(pathw_w2,pathw_w); + wcscat(pathw_w2,dcEntryl.entryName); + if(CheckPathEx(pathw_w2)==false)CheckPathBit |= cpb_ex; + if(CheckPath(pathw_w2)==false)CheckPathBit |= cpb_sdmc; } } } @@ -293,7 +411,7 @@ static nn::fs::Directory dcl; Unmount();//GetCtrCardSaveDataFormatInfo“à‚Ń}ƒEƒ“ƒg‚·‚é‚̂ňê’UƒAƒ“ƒ}ƒEƒ“ƒg(SDK2.1`3‚̂݃Gƒ‰[H) GetFormatInfoCore(&m_info); Mount(); - + pDcList->num = m_info.DirCount; *pinfo = m_info; return true; diff --git a/trunk/CardSaveData/common/savefile/savefile.h b/trunk/CardSaveData/common/savefile/savefile.h index eb1af3f..57db5fc 100644 --- a/trunk/CardSaveData/common/savefile/savefile.h +++ b/trunk/CardSaveData/common/savefile/savefile.h @@ -14,21 +14,45 @@ //ƒA[ƒJƒCƒu–¼‚¨‚æ‚ÑSDŠi”[ƒfƒBƒŒƒNƒgƒŠ‚Ì—]—T•ª‚ð‚݂Ƃ­ #define MAX_PATH_LENGTH 512 //ƒpƒXŠK‘wãŒÀ -//ƒtƒ@ƒCƒ‹ŒŸõŽž‚ÉŽg—pA"/"+1•¶Žš‚ªÅ’Z‚Ȃ̂Å128‚Å\•ª +//ƒtƒ@ƒCƒ‹ŒŸõŽž‚ÉŽg—pAƒpƒX’·ãŒÀ(253)‚©‚ç128‚Å\•ª #define MAX_LEVEL 128 +//ƒfƒBƒŒƒNƒgƒŠƒŠƒXƒgãŒÀ +#define MAX_DCLIST 256 + +typedef enum{ +cpb_sdmc = 1, +cpb_ex +}Cpb_bits; + + //******************************** functions ********** -//ƒpƒX–¼ƒ`ƒFƒbƒN +//ƒpƒX–¼ƒ`ƒFƒbƒN .. for sdmc //FATˆá”½‚Ì”¼ŠpƒXƒy[ƒX‚ ‚é‚©ƒ`ƒFƒbƒN //•¶ŽšA—\–ñ–¼AƒpƒX’·‚ÍAPIƒGƒ‰[(INVALID_ARGUMENT)‚Å”»’è bool CheckPath(wchar_t *s); +//ƒpƒX–¼ƒ`ƒFƒbƒN .. Šg’£ƒZ[ƒu +bool CheckPathEx(wchar_t *s); + //ƒfƒŠƒ~ƒ^("/")ˆÊ’u‚ð•Ô‚· +//top:ŒŸõŠJŽnˆÊ’u int GetPosDelmLast(wchar_t *s,int top); //ƒpƒXŒ‹‡ void ChainPath(wchar_t *p1,wchar_t *p2); +//ƒfƒBƒŒƒNƒgƒŠˆê’vƒ`ƒFƒbƒN +//ret= 0:‚È‚µA‘¼:ʼn‚Ɉê’v‚µ‚½ŠK‘w +//ex) s = "/d1/d2/d3",s2 ="d2" or "/d2" ret=2 +int CmpDirW(wchar_t *s,wchar_t *s2); + +//ƒtƒ@ƒCƒ‹–¼‚̈ê’vŠm”F +//s:ƒpƒX ex)"/dir/name" +//s2:ƒtƒ@ƒCƒ‹ ex) "name" +bool CmpNameW(wchar_t *s,wchar_t *s2); + +bool CmpPathW(wchar_t *s,wchar_t *s2); //******************************** Types ********** //ƒZ[ƒu‚ÉŠÖ‚·‚éî•ñ @@ -40,14 +64,26 @@ struct tArcInfo{ char Pcode[20];//product code SDK‚̃TƒCƒY‚ð‰º‰ñ‚ç‚È‚¢‚±‚Æ bool Dup;//2d‰» u8 Ver; - u8 yobi;//ƒpƒfƒBƒ“ƒO + //u8 yobi;//ƒpƒfƒBƒ“ƒO }; +//ƒfƒBƒŒƒNƒgƒŠ +struct tDcList{ + u16 num; + wchar_t name[MAX_DCLIST][MAX_PATH_LENGTH]; +}; + +//ƒ[ƒjƒ“ƒO—}§ +//1300:inherits implisit virtual +//1301:insert padding +#pragma diag_suppress 1300,1301 + //******************************** Class *************** class SaveFileBase { public: nn::Result LastNnResult; + u8 CheckPathBit; //ƒpƒX–¼ˆá”½ƒ`ƒFƒbƒNbit protected: wchar_t root_w[MAX_PATH_LENGTH];//Šî’êƒpƒX(ƒfƒoƒCƒX–¼ŠÜ) wchar_t path_w[MAX_PATH_LENGTH];//ƒpƒX–¼ @@ -98,6 +134,8 @@ public: SaveFileWrite(){RootLength=0;}; ~SaveFileWrite(){}; bool DeleteDir(const wchar_t *dir); + bool MakeDir(wchar_t *path,bool *mkdir); + bool DeleteFile(const wchar_t *path); bool OpenW(const wchar_t *path); bool OpenC(wchar_t *path,s64 size,bool *mkdir); bool OpenAdd(wchar_t *path); @@ -120,12 +158,13 @@ private: tArcInfo m_info; bool s_serch; public: - myResult IsExist(); + bool IsExist(); bool Open(const wchar_t *path); void Close(); + bool SetPos(s64 pos); myResult GetPath(wchar_t *path); void ResetPath(); - bool GetInfo(tArcInfo *pinfo,size_t clsz = 0); + bool GetInfo(tArcInfo *pinfo,tDcList *pDcList,size_t clsz = 0); s32 Read(char *buffer,size_t size); SaveFileRead(){ s_lv=0; @@ -136,6 +175,7 @@ public: }; ~SaveFileRead(){}; }; - +//Œx‚ð–ß‚· +//#pragma diag_warning 1300,1301 #endif diff --git a/trunk/CardSaveData/common/savefile/sdmcwo.cpp b/trunk/CardSaveData/common/savefile/sdmcwo.cpp index 6660dd0..51dcb03 100644 --- a/trunk/CardSaveData/common/savefile/sdmcwo.cpp +++ b/trunk/CardSaveData/common/savefile/sdmcwo.cpp @@ -33,8 +33,9 @@ std::wstring Sdmcwo::GetDateName() //charåž‹ :表示ã§ä½¿ã† - wcstombs(DirName, name.str().c_str(), 14); - DirName[14] = 0; + //wcstombs(DirName, name.str().c_str(), 14); + //DirName[14] = 0; + wcscpy(DirName,name.str().c_str()); return name.str(); } diff --git a/trunk/CardSaveData/common/savefile/sdmcwo.h b/trunk/CardSaveData/common/savefile/sdmcwo.h index 63cb155..3976965 100644 --- a/trunk/CardSaveData/common/savefile/sdmcwo.h +++ b/trunk/CardSaveData/common/savefile/sdmcwo.h @@ -53,7 +53,7 @@ struct AdditionalInfo class Sdmcwo: public SaveFileWrite { public: - char DirName[16]; + wchar_t DirName[16]; size_t ClasterSize;//SDクラスタサイズ .. Create後有効 size_t FreeSize;//Create直後ã®ç©ºã..Create後有効 private: diff --git a/trunk/CardSaveData/common/shfnt.cpp b/trunk/CardSaveData/common/shfnt.cpp index 65ca877..3f471bd 100644 --- a/trunk/CardSaveData/common/shfnt.cpp +++ b/trunk/CardSaveData/common/shfnt.cpp @@ -7,6 +7,7 @@ #include #include "demo.h" +#include const char s_ShaderBinaryFilePath[] = "rom:/nnfont_RectDrawerShader.shbin"; @@ -231,6 +232,7 @@ nn::font::DispStringBuffer *pDrawStringBuf0; nn::font::DispStringBuffer *pDrawStringBuf1; nn::font::ResFont font; nn::font::TextWriter writer; +nn::font::WideTextWriter writer_w; //--------------------------------------------------------------------------- //! @brief ASCII文字列をæç”»ã—ã¾ã™ã€‚ //--------------------------------------------------------------------------- @@ -270,7 +272,6 @@ void shf_DrawText_1( u16 x,u16 y,char *s) drawer.DrawEnd(); } - void shf_SetSize(f32 sz) { writer.SetScale(sz/14,sz/20); @@ -297,12 +298,104 @@ f32 shf_GetFontHeight() return writer.GetFontHeight(); } - void shf_SetColor(f32 r,f32 g,f32 b,f32 a) { writer.SetTextColor(nn::util::FloatColor(r,g,b,a)); } +//******** ワイド文字列 ************ + +//エラーã«ãªã‚‹ã‚³ãƒ¼ãƒ‰ã‚’ç½®ãæ›ãˆã‚‹ +//int chgCode(int size,wchar_t *s) +//{ +// for (int i=0;i 32){ + NN_LOG("DrawText:size over"); + return; + } + wcscpy(ss,s); + + writer_w.SetCursor(x, y); + +// chgCode(size,ss); + + writer_w.StartPrint(); + (void)writer_w.Print(ss); + writer_w.EndPrint(); + drawer.BuildTextCommand(&writer_w); + + + drawer.DrawBegin(); + + SetupTextCamera(&drawer, NN_GX_DISPLAY0_WIDTH, NN_GX_DISPLAY0_HEIGHT); + writer_w.UseCommandBuffer(); + + drawer.DrawEnd(); +} + +void shf_DrawText_1w( u16 x,u16 y,wchar_t *s) +{ + writer_w.SetCursor(x, y); + + writer_w.StartPrint(); + (void)writer_w.Print(s); + writer_w.EndPrint(); + drawer.BuildTextCommand(&writer_w); + + + drawer.DrawBegin(); + + SetupTextCamera(&drawer, NN_GX_DISPLAY1_WIDTH, NN_GX_DISPLAY1_HEIGHT); + writer_w.UseCommandBuffer(); + + drawer.DrawEnd(); +} + + +void shf_SetSizeW(f32 sz) +{ + writer_w.SetScale(sz/14,sz/20); +} + +void shf_SetScaleW(f32 h,f32 v) +{ + writer_w.SetScale(h,v); +} + + +void shf_SetFontSizeW(f32 sz) +{ + writer_w.SetFontSize(sz); +} + +f32 shf_GetFontWidthW() +{ + return writer_w.GetFontWidth(); +} + +f32 shf_GetFontHeightW() +{ + return writer_w.GetFontHeight(); +} + +void shf_SetColorW(f32 r,f32 g,f32 b,f32 a) +{ + writer_w.SetTextColor(nn::util::FloatColor(r,g,b,a)); +} + + + //åˆæœŸåŒ– //AppHeap確ä¿ã€RenderSystem.Inititã®å¾Œã«å‘¼ã¶ void SharedFontInit() @@ -341,6 +434,10 @@ void SharedFontInit() writer.SetDispStringBuffer(pDrawStringBuf0); writer.SetFont(&font); + + writer_w.SetDispStringBuffer(pDrawStringBuf0); + writer_w.SetFont(&font); + SetupTextCamera(&drawer, NN_GX_DISPLAY0_WIDTH, NN_GX_DISPLAY0_HEIGHT); } diff --git a/trunk/CardSaveData/common/shfnt.h b/trunk/CardSaveData/common/shfnt.h index e168087..3e5e23b 100644 --- a/trunk/CardSaveData/common/shfnt.h +++ b/trunk/CardSaveData/common/shfnt.h @@ -20,11 +20,19 @@ void SharedFontInit(); void SharedFontFinalize(); void shf_DrawText_0(u16 x,u16 y,char* s); void shf_DrawText_1(u16 x,u16 y,char* s); +void shf_DrawText_0w(u16 x,u16 y,wchar_t* s); +void shf_DrawText_1w(u16 x,u16 y,wchar_t* s); void shf_SetSize(f32 sz); void shf_SetScale(f32 h,f32 v); void shf_SetColor(f32 r,f32 g,f32 b,f32 a); void shf_SetFontSize(f32 sz); f32 shf_GetFontWidth(); f32 shf_GetFontHeight(); +void shf_SetSizeW(f32 sz); +void shf_SetScaleW(f32 h,f32 v); +void shf_SetColorW(f32 r,f32 g,f32 b,f32 a); +void shf_SetFontSizeW(f32 sz); +f32 shf_GetFontWidthW(); +f32 shf_GetFontHeightW(); #endif diff --git a/trunk/CardSaveData/common/test_data.cpp b/trunk/CardSaveData/common/test_data.cpp index fd73e36..a40eebd 100644 --- a/trunk/CardSaveData/common/test_data.cpp +++ b/trunk/CardSaveData/common/test_data.cpp @@ -65,10 +65,13 @@ void make_pattern() s32 size; #define SIZE_TEST1 421888 //#define SIZE_TEST1 244736 //dup +#define DMX_TEST0 100 +#define FMX_TEST0 100 +#define DUP_TEST0 true bool Test0_W(int n)//Casual { - res = nn::fs::FormatSaveData(100,100,false); + res = nn::fs::FormatSaveData(DMX_TEST0,FMX_TEST0,DUP_TEST0); if (res.IsFailure()){ drawText(8,100,"format Fail"); return false; @@ -79,23 +82,57 @@ bool Test0_W(int n)//Casual return false; } - int num = 0,total=0; + int num = 0,total=0,size=512; while(1){ - sprintf(file_path,"data:/test%d",num); + /* + swprintf(file_pathw,512,L"data:/空ディレクトリ%d",num); + res = nn::fs::TryCreateDirectory(file_pathw); + if (res.IsFailure()){ + drawText(8,100,"Dir create Fail"); + nn::fs::Unmount("data:"); + return false; + } + */ + sprintf(file_path,"data:/nulldir%d",num); res = nn::fs::TryCreateDirectory(file_path); if (res.IsFailure()){ drawText(8,100,"Dir create Fail"); nn::fs::Unmount("data:"); return false; } - sprintf(file_path,"data:/test%d/test%d.bin",num,num); - res = fout.TryInitialize(file_path,true); + sprintf(file_path,"data:/null%d",num); + res = nn::fs::TryCreateDirectory(file_path); + if (res.IsFailure()){ + drawText(8,100,"Dir create Fail"); + nn::fs::Unmount("data:"); + return false; + } + sprintf(file_path,"data:/null%d/nulldir",num); + res = nn::fs::TryCreateDirectory(file_path); + if (res.IsFailure()){ + drawText(8,100,"Dir create Fail"); + nn::fs::Unmount("data:"); + return false; + } + //swprintf(file_pathw,512,L"data:/テスト%d",num); + swprintf(file_pathw,512,L"data:/test%d",num); + res = nn::fs::TryCreateDirectory(file_pathw); + if (res.IsFailure()){ + drawText(8,100,"Dir create Fail"); + nn::fs::Unmount("data:"); + return false; + } + //sprintf(file_path,"data:/test%d/test%d.bin",num,num); + //res = fout.TryInitialize(file_path,true); + //swprintf(file_pathw,512,L"data:/テスト%d/テスト%d.bin",num,num); + swprintf(file_pathw,512,L"data:/test%d/test%d.bin",num,num); + res = fout.TryInitialize(file_pathw,true); if (res.IsFailure()){ drawText(8,100,"open Fail"); nn::fs::Unmount("data:"); return false; } - res = fout.TryWrite( &size,&src_buff[total],512); + res = fout.TryWrite( &size,&src_buff[total],size); if (res.IsFailure()){ drawText(8,100,"write Fail"); fout.Finalize(); @@ -103,7 +140,8 @@ bool Test0_W(int n)//Casual return false; } fout.Finalize(); - total += 512; + total += size; + size += size; num++; sprintf(str,"size %d , num %d",total,num); s_RenderSystem.Clear(); @@ -125,25 +163,75 @@ bool Test0_W(int n)//Casual bool Test0_V(int n)//Casual { - int num = 0,total=0; + int num = 0,total=0,size = 512; + size_t maxF,maxD; + bool isDup; + + nn::fs::Directory dc; + + res = nn::fs::GetSaveDataFormatInfo(&maxF,&maxD,&isDup); + if (res.IsFailure()){ + drawText(8,100,"fail to get formatinfo"); + nn::fs::Unmount("data:"); + return false; + } + if ((maxF != FMX_TEST0)||(maxD!=DMX_TEST0)||(isDup != DUP_TEST0)){ + drawText(8,100,"wrong format"); + nn::fs::Unmount("data:"); + return false; + } + + + while(1){ - sprintf(file_path,"data:/test%d/test%d.bin",num,num); - res = fin.TryInitialize(file_path); + sprintf(file_path,"data:/nulldir%d",num);//ディレクトリ + res = dc.TryInitialize(file_path); + if (res.IsFailure()){ + drawText(8,100,"open Dir"); + dc.Finalize(); + nn::fs::Unmount("data:"); + return false; + } + dc.Finalize(); + sprintf(file_path,"data:/null%d/nulldir",num);//ディレクトリ + res = dc.TryInitialize(file_path); + if (res.IsFailure()){ + drawText(8,100,"open Dir"); + dc.Finalize(); + nn::fs::Unmount("data:"); + return false; + } + dc.Finalize(); + /* + swprintf(file_pathw,512,L"data:/空ディレクトリ%d",num);//ディレクトリ + res = dc.TryInitialize(file_pathw); + if (res.IsFailure()){ + drawText(8,100,"open Dir"); + dc.Finalize(); + nn::fs::Unmount("data:"); + return false; + } + dc.Finalize(); + */ + //swprintf(file_pathw,512,L"data:/テスト%d/テスト%d.bin",num,num); + swprintf(file_pathw,512,L"data:/test%d/test%d.bin",num,num); + res = fin.TryInitialize(file_pathw); if (res.IsFailure()){ drawText(8,100,"open Fail"); nn::fs::Unmount("data:"); return false; } - res = fin.TryRead( &size,&get_buff[total],512); + res = fin.TryRead( &size,&get_buff[total],size); if (res.IsFailure()){ drawText(8,100,"read Fail"); fin.Finalize(); nn::fs::Unmount("data:"); return false; } - for(int i=0;i<512;i++)if (src_buff[total+i]!=get_buff[total+i])return false; + for(int i=0;i=DirDepthLow){ + strcpy(file_path2,file_path); + sprintf(str,"/t%d.bin",num); + strcat(file_path2,str); + res = fout.TryInitialize(file_path2,true); + if (res.IsFailure()){ + drawText(8,100,"open Fail"); + nn::fs::Unmount("data:"); + return false; + } + res = fout.TryWrite( &size,&src_buff[total],size2); + if (res.IsFailure()){ + drawText(8,100,"write Fail"); + fout.Finalize(); + nn::fs::Unmount("data:"); + return false; + } + fout.Finalize(); + total+=size; } - fout.Finalize(); - num++; - total+=size; s_RenderSystem.Clear(); sprintf(str,"num %d",num); drawText(10,80,str); @@ -446,7 +542,7 @@ bool Test3_W() nn::fs::Unmount("data:"); drawText(10,100,"end"); - sprintf(str,"length = %d",(int)strlen(file_path2)); + sprintf(str,"length = %d",(int)strlen(file_path2)-6); drawText(8,110,str); s_RenderSystem.SwapBuffers(); nngxWaitVSync(NN_GX_DISPLAY0); @@ -465,34 +561,34 @@ bool Test3_V() while(1){ sprintf(str,"/%d",num); strcat(file_path,str); - strcpy(file_path2,file_path); - sprintf(str,"/t%d.bin",num); - strcat(file_path2,str); - res = fin.TryInitialize(file_path2); - if (res.IsFailure()){ - drawText(8,100,"open Fail"); - nn::fs::Unmount("data:"); - return false; - } - res = fin.TryRead( &size,&get_buff[total],size2); - if (res.IsFailure()){ - drawText(8,100,"read Fail"); + if (num>=DirDepthLow){ + strcpy(file_path2,file_path); + sprintf(str,"/t%d.bin",num); + strcat(file_path2,str); + res = fin.TryInitialize(file_path2); + if (res.IsFailure()){ + drawText(8,100,"open Fail"); + nn::fs::Unmount("data:"); + return false; + } + res = fin.TryRead( &size,&get_buff[total],size2); + if (res.IsFailure()){ + drawText(8,100,"read Fail"); + fin.Finalize(); + nn::fs::Unmount("data:"); + return false; + } + for (i=0;i= SIZE_TEST5)break; } + fout.Finalize(); nn::fs::CommitSaveData(); nn::fs::Unmount("data:"); @@ -718,7 +837,8 @@ bool Test5_W() bool Test5_V() { - int i,pos; + int i; + s64 pos; res = fin.TryInitialize(L"data:/test5.bin"); if (res.IsFailure()){ @@ -726,7 +846,7 @@ bool Test5_V() nn::fs::Unmount("data:"); return false; } - pos =0; + pos = SIZE_TEST5_START; while(1){ fin.SetPosition(pos); res = fin.TryRead( &size,&get_buff[pos],512); @@ -736,7 +856,7 @@ bool Test5_V() nn::fs::Unmount("data:"); return false; } - sprintf(str,"position %d",pos); + sprintf(str,"position %d",(int)pos); s_RenderSystem.Clear(); drawText(10,80,str); s_RenderSystem.SwapBuffers(); @@ -746,7 +866,7 @@ bool Test5_V() drawText(8,100,"verifi Fail at %d",i); return false; } - pos += 1024;//512飛ã°ã™ + pos += SIZE_TEST5_HZ;//飛ã°ã™ if (pos >= SIZE_TEST5)break; } fin.Finalize(); @@ -1085,7 +1205,7 @@ void TestMain() switch(curs){ case 0:sccs = Test0_W(5);break; case 1:sccs = Test1_W();break; - case 2:sccs = Test2_W(680);break; + case 2:sccs = Test2_W(test2_ct);break; case 3:sccs = Test3_W();break; case 4:sccs = Test4_W();break; case 5:sccs = Test5_W();break; @@ -1121,7 +1241,7 @@ void TestMain() if (sccs == false){ fin.Finalize(); fout.Finalize(); - res =nn::fs::Unmount("data:"); + nn::fs::Unmount("data:"); drawText(8,120,"Failed"); } sprintf(str,"desc %d",res.GetDescription());