#include #include #include #include "savedata.h" #include #include #include #include int dc_readed[MAX_LEVEL];//リード済みエントリ数 const wchar_t *sdataRoot_w = L"data:/"; #define ROOTLENGTH 6 const char *sdataName = "data:"; static bool IsMounted; wchar_t path_w[MAX_PATH_LENGTH];//パス名 wchar_t pathu_w[MAX_LEVEL][MAX_PATH_LENGTH];//パス名履歴 wchar_t pathw_w[MAX_PATH_LENGTH];//パス名ワーク //セーブ作成、成功時はマウント状態 myResult SaveData::Format(tArcInfo *pinfo) { if ( IsMounted )return RESULT_ALREADY_MOUNT; LastNnResult = nn::fs::FormatCtrCardSaveData(pinfo->FileEntry,pinfo->DirEntry,pinfo->Dup); if (LastNnResult.IsFailure())return RESULT_FAIL_FORMAT; if ( Mount() != RESULT_OK )return RESULT_FAIL_MOUNT; IsMounted = true; return RESULT_OK; } void SaveData::ResetPath() { s_lv=0; s_serch = false; wcscpy(path_w,sdataRoot_w); for (int n = 0;nMAX_PATH_LENGTH - 1)return RESULT_PATH_LENGTH_OVER; wcscat(path,dcEntryl.entryName); return RESULT_OK; } } } } //アンマウント void SaveData::Unmount() { if(IsMounted){ IsMounted = false; nn::fs::Unmount(sdataName); } } //バックアップの存在チェック myResult SaveData::IsExist(){ myResult res; res = Mount(); Unmount(); return res; } //アーカイブ情報の取得 bool SaveData::GetInfo(tArcInfo *pinfo) { static nn::fs::DirectoryEntry dcEntryl; static nn::fs::Directory dcl; if(IsMounted==false){NN_LOG("GetInfo: Not Mounted\n");return false;}; s_lv=0; m_info.DirCount = 0; m_info.FileCount = 0; m_info.DirEntry = 0; m_info.FileEntry = 0; m_info.Dup = false; wcscpy(path_w,sdataRoot_w); int n; int lv = 0; for (n = 0;n dir/file bool SaveData::Open(wchar_t *path) { wcscpy(pathw_w,sdataRoot_w); wcscat(pathw_w,path); LastNnResult = reader.TryInitialize(pathw_w); if (LastNnResult.IsSuccess()) { LastNnResult = reader.TryGetSize(&FileSize); if (LastNnResult.IsSuccess())return true; else Close(); } return false; } bool SaveData::OpenW(wchar_t *path,s64 size,bool *mkdir) { int pos,pos2; wcscpy(path_w,sdataRoot_w); wcscat(path_w,path); *mkdir = false; LastNnResult = nn::fs::TryCreateFile(path_w,size); if(LastNnResult.IsSuccess()) { LastNnResult = writer.TryInitialize(path_w,false); return LastNnResult.IsSuccess(); } //ディレクトリがなければディレクトリを作成 pos = GetPosDelmLast(path_w,ROOTLENGTH);//ファイルが存在するディレクトリ if (pos <= 0)return false;//rootかパスが不正 wcscpy(pathw_w,path_w);//ワークにコピー while (LastNnResult.IsFailure()){//ディレクトリ作成できるまで遡る if(LastNnResult.GetDescription()!=nn::fs::DESCRIPTION_DBM_DIRECTORY_NOT_FOUND)return false; pos2 = GetPosDelmLast(pathw_w,ROOTLENGTH);//境界位置を探す if (pos2 == 0)return false;//root到達 pathw_w[pos2] = 0;//境界まで削除 (例) dir1/dir2/file -> dir1/dir2 -> dir1 LastNnResult = nn::fs::TryCreateDirectory(pathw_w); } //作成ディレクトリ多いと画面止まるので、作成ごとに抜ける *mkdir = true; // 帰値:false で mkdir=true ならディレクトリ作成のみ return false; } //ファイルライト s32 SaveData::Write(char *buffer,size_t size) { s32 ct; LastNnResult = writer.TryWrite(&ct,(void*)buffer,size); if(LastNnResult.IsFailure())ct=0; return ct; } //コミット bool SaveData::Commit() { LastNnResult=nn::fs::CommitSaveData(sdataName); return LastNnResult.IsSuccess(); } //コンストラクタ SaveData::SaveData() { IsMounted = false; s_lv=0; PrdCode[0] = 0; m_info.DirCount = 0; m_info.FileCount = 0; m_info.DirEntry = 0; m_info.FileEntry = 0; wcscpy(path_w,sdataRoot_w); pPathTop = (wchar_t*)((u32)&path_w+strlen(sdataName)*2+2); } void SaveData::Finalize() { Close(); Unmount(); } //デストラクタ SaveData::~SaveData() { Finalize(); }