summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/formats/fs_prodos.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/formats/fs_prodos.h')
-rw-r--r--src/lib/formats/fs_prodos.h35
1 files changed, 25 insertions, 10 deletions
diff --git a/src/lib/formats/fs_prodos.h b/src/lib/formats/fs_prodos.h
index 626dcbea821..1f5d2405b98 100644
--- a/src/lib/formats/fs_prodos.h
+++ b/src/lib/formats/fs_prodos.h
@@ -14,10 +14,10 @@ class fs_prodos : public filesystem_manager_t {
public:
class impl : public filesystem_t {
public:
- class dir : public idir_t {
+ class root_dir : public idir_t {
public:
- dir(impl &fs, u16 base_block, u16 key = 0) : m_fs(fs), m_base_block(base_block), m_key(key) { (void)m_key; }
- virtual ~dir() = default;
+ root_dir(impl &fs, u16 base_block) : m_fs(fs), m_base_block(base_block) { }
+ virtual ~root_dir() = default;
virtual void drop_weak_references() override;
@@ -26,18 +26,30 @@ public:
virtual file_t file_get(uint64_t key) override;
virtual dir_t dir_get(uint64_t key) override;
- private:
+ protected:
impl &m_fs;
u16 m_base_block;
- u16 m_key;
std::pair<fsblk_t::block_t, const u8 *> get_entry_ro(uint64_t key);
std::pair<fsblk_t::block_t, u8 *> get_entry(uint64_t key);
};
+ class dir : public root_dir {
+ public:
+ dir(impl &fs, const u8 *entry, u16 base_block, u16 key, root_dir *parent_dir);
+ virtual ~dir() = default;
+
+ virtual fs_meta_data metadata() override;
+
+ protected:
+ root_dir *m_parent_dir;
+ u16 m_key;
+ u8 m_entry[39];
+ };
+
class file : public ifile_t {
public:
- file(impl &fs, const u8 *entry, u16 key);
+ file(impl &fs, const u8 *entry, u16 key, root_dir *parent_dir);
virtual ~file() = default;
virtual void drop_weak_references() override;
@@ -48,12 +60,11 @@ public:
private:
impl &m_fs;
+ root_dir *m_parent_dir;
u16 m_key;
u8 m_entry[39];
- std::vector<uint16_t> get_file_blocks(uint8_t type, u16 block, u32 length);
- std::pair<std::vector<uint16_t>, uint32_t> data_blocks();
- std::pair<std::vector<uint16_t>, uint32_t> rsrc_blocks();
+ std::vector<u8> any_read_all(uint8_t type, u16 block, u32 length);
};
impl(fsblk_t &blockdev);
@@ -67,6 +78,7 @@ public:
void drop_root_ref();
static util::arbitrary_datetime prodos_to_dt(u32 date);
+ std::vector<fs_dir_entry> contents(u16 block);
private:
static const u8 boot[512];
@@ -76,6 +88,9 @@ public:
fs_prodos() : filesystem_manager_t() {}
+ virtual const char *name() const override;
+ virtual const char *description() const override;
+
virtual void enumerate_f(floppy_enumerator &fe, uint32_t form_factor, const std::vector<uint32_t> &variants) const override;
virtual std::unique_ptr<filesystem_t> mount(fsblk_t &blockdev) const override;
@@ -90,6 +105,6 @@ public:
virtual std::vector<fs_meta_description> directory_meta_description() const override;
};
-extern const filesystem_manager_type FS_PRODOS;
+extern const fs_prodos FS_PRODOS;
#endif