aboutsummaryrefslogtreecommitdiff
path: root/src/FATStorage.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/FATStorage.h')
-rw-r--r--src/FATStorage.h101
1 files changed, 101 insertions, 0 deletions
diff --git a/src/FATStorage.h b/src/FATStorage.h
new file mode 100644
index 0000000..3f3afa4
--- /dev/null
+++ b/src/FATStorage.h
@@ -0,0 +1,101 @@
+/*
+ Copyright 2016-2021 Arisotura
+
+ This file is part of melonDS.
+
+ melonDS is free software: you can redistribute it and/or modify it under
+ the terms of the GNU General Public License as published by the Free
+ Software Foundation, either version 3 of the License, or (at your option)
+ any later version.
+
+ melonDS is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with melonDS. If not, see http://www.gnu.org/licenses/.
+*/
+
+#ifndef FATSTORAGE_H
+#define FATSTORAGE_H
+
+#include <stdio.h>
+#include <string>
+#include <map>
+#include <filesystem>
+
+#include "types.h"
+#include "fatfs/ff.h"
+
+
+class FATStorage
+{
+public:
+ FATStorage(std::string filename, u64 size, bool readonly, std::string sourcedir);
+ ~FATStorage();
+
+ bool Open();
+ void Close();
+
+ bool InjectFile(std::string path, u8* data, u32 len);
+
+ u32 ReadSectors(u32 start, u32 num, u8* data);
+ u32 WriteSectors(u32 start, u32 num, u8* data);
+
+private:
+ std::string FilePath;
+ std::string IndexPath;
+ std::string SourceDir;
+ bool ReadOnly;
+
+ FILE* File;
+ u64 FileSize;
+
+ static FILE* FF_File;
+ static u64 FF_FileSize;
+ static UINT FF_ReadStorage(BYTE* buf, LBA_t sector, UINT num);
+ static UINT FF_WriteStorage(BYTE* buf, LBA_t sector, UINT num);
+
+ static u32 ReadSectorsInternal(FILE* file, u64 filelen, u32 start, u32 num, u8* data);
+ static u32 WriteSectorsInternal(FILE* file, u64 filelen, u32 start, u32 num, u8* data);
+
+ void LoadIndex();
+ void SaveIndex();
+
+ bool ExportFile(std::string path, std::filesystem::path out);
+ void ExportDirectory(std::string path, std::string outbase, int level);
+ bool DeleteHostDirectory(std::string path, std::string outbase, int level);
+ void ExportChanges(std::string outbase);
+
+ bool CanFitFile(u32 len);
+ bool DeleteDirectory(std::string path, int level);
+ void CleanupDirectory(std::string sourcedir, std::string path, int level);
+ bool ImportFile(std::string path, std::filesystem::path in);
+ bool ImportDirectory(std::string sourcedir);
+ u64 GetDirectorySize(std::string sourcedir);
+
+ bool Load(std::string filename, u64 size, std::string sourcedir);
+ bool Save();
+
+ typedef struct
+ {
+ std::string Path;
+ bool IsReadOnly;
+
+ } DirIndexEntry;
+
+ typedef struct
+ {
+ std::string Path;
+ bool IsReadOnly;
+ u64 Size;
+ s64 LastModified;
+ u32 LastModifiedInternal;
+
+ } FileIndexEntry;
+
+ std::map<std::string, DirIndexEntry> DirIndex;
+ std::map<std::string, FileIndexEntry> FileIndex;
+};
+
+#endif // FATSTORAGE_H