[Imgtool] C++-ification of imgtool_forkent structure

This commit is contained in:
Nathan Woods 2017-07-29 09:45:16 -04:00 committed by Vas Crabb
parent 5d6815b6de
commit 7e8707f496
6 changed files with 93 additions and 60 deletions

View File

@ -580,7 +580,7 @@ imgtool::partition::partition(imgtool::image &image, const imgtool_class &imgcla
m_read_file = (imgtoolerr_t(*)(imgtool::partition &, const char *, const char *, imgtool::stream &)) imgtool_get_info_fct(&imgclass, IMGTOOLINFO_PTR_READ_FILE);
m_write_file = (imgtoolerr_t(*)(imgtool::partition &, const char *, const char *, imgtool::stream &, util::option_resolution *)) imgtool_get_info_fct(&imgclass, IMGTOOLINFO_PTR_WRITE_FILE);
m_delete_file = (imgtoolerr_t(*)(imgtool::partition &, const char *)) imgtool_get_info_fct(&imgclass, IMGTOOLINFO_PTR_DELETE_FILE);
m_list_forks = (imgtoolerr_t(*)(imgtool::partition &, const char *, imgtool_forkent *, size_t)) imgtool_get_info_fct(&imgclass, IMGTOOLINFO_PTR_LIST_FORKS);
m_list_forks = (imgtoolerr_t(*)(imgtool::partition &, const char *, std::vector<imgtool::fork_entry> &forks)) imgtool_get_info_fct(&imgclass, IMGTOOLINFO_PTR_LIST_FORKS);
m_create_dir = (imgtoolerr_t(*)(imgtool::partition &, const char *)) imgtool_get_info_fct(&imgclass, IMGTOOLINFO_PTR_CREATE_DIR);
m_delete_dir = (imgtoolerr_t(*)(imgtool::partition &, const char *)) imgtool_get_info_fct(&imgclass, IMGTOOLINFO_PTR_DELETE_DIR);
m_list_attrs = (imgtoolerr_t(*)(imgtool::partition &, const char *, uint32_t *, size_t)) imgtool_get_info_fct(&imgclass, IMGTOOLINFO_PTR_LIST_ATTRS);
@ -1873,7 +1873,7 @@ imgtoolerr_t imgtool::partition::delete_file(const char *fname)
// forks on an image
//-------------------------------------------------
imgtoolerr_t imgtool::partition::list_file_forks(const char *path, imgtool_forkent *ents, size_t len)
imgtoolerr_t imgtool::partition::list_file_forks(const char *path, std::vector<imgtool::fork_entry> &forks)
{
imgtoolerr_t err;
if (!m_list_forks)
@ -1885,7 +1885,9 @@ imgtoolerr_t imgtool::partition::list_file_forks(const char *path, imgtool_forke
if (err)
return err;
err = m_list_forks(*this, cannonical_path.c_str(), ents, len);
// call the callback
forks.clear();
err = m_list_forks(*this, cannonical_path.c_str(), forks);
if (err)
return err;

View File

@ -158,7 +158,7 @@ namespace imgtool
imgtoolerr_t get_file(const char *filename, const char *fork, const char *dest, filter_getinfoproc filter);
imgtoolerr_t put_file(const char *newfname, const char *fork, const char *source, util::option_resolution *opts, filter_getinfoproc filter);
imgtoolerr_t delete_file(const char *fname);
imgtoolerr_t list_file_forks(const char *path, imgtool_forkent *ents, size_t len);
imgtoolerr_t list_file_forks(const char *path, std::vector<imgtool::fork_entry> &forks);
imgtoolerr_t create_directory(const char *path);
imgtoolerr_t delete_directory(const char *path);
imgtoolerr_t list_file_attributes(const char *path, uint32_t *attrs, size_t len);
@ -209,7 +209,7 @@ namespace imgtool
std::function<imgtoolerr_t(imgtool::partition &partition, const char *filename, const char *fork, imgtool::stream &destf)> m_read_file;
std::function<imgtoolerr_t(imgtool::partition &partition, const char *filename, const char *fork, imgtool::stream &sourcef, util::option_resolution *opts)> m_write_file;
std::function<imgtoolerr_t(imgtool::partition &partition, const char *filename)> m_delete_file;
std::function<imgtoolerr_t(imgtool::partition &partition, const char *path, imgtool_forkent *ents, size_t len)> m_list_forks;
std::function<imgtoolerr_t(imgtool::partition &partition, const char *path, std::vector<imgtool::fork_entry> &forks)> m_list_forks;
std::function<imgtoolerr_t(imgtool::partition &partition, const char *path)> m_create_dir;
std::function<imgtoolerr_t(imgtool::partition &partition, const char *path)> m_delete_dir;
std::function<imgtoolerr_t(imgtool::partition &partition, const char *path, uint32_t *attrs, size_t len)> m_list_attrs;

View File

@ -81,20 +81,59 @@ struct imgtool_chainent
uint64_t block;
};
enum imgtool_forktype_t
namespace imgtool
{
FORK_END,
FORK_DATA,
FORK_RESOURCE,
FORK_ALTERNATE
};
class fork_entry
{
public:
enum class type_t
{
DATA,
RESOURCE,
ALT
};
struct imgtool_forkent
{
imgtool_forktype_t type;
uint64_t size;
char forkname[64];
};
fork_entry(uint64_t size, type_t type = type_t::DATA)
: m_size(size)
, m_type(type)
, m_name(default_name(type))
{
}
fork_entry(uint64_t size, std::string &&name)
: m_size(size)
, m_type(fork_entry::type_t::ALT)
, m_name(std::move(name))
{
}
fork_entry(const fork_entry &that) = default;
fork_entry(fork_entry &&that) = default;
uint64_t size() const { return m_size; }
type_t type() const { return m_type; }
const std::string &name() const { return m_name; }
private:
static std::string default_name(type_t type)
{
switch (type)
{
case type_t::DATA:
return std::string("");
case type_t::RESOURCE:
return std::string("RESOURCE_FORK");
default:
throw false;
}
}
uint64_t m_size;
type_t m_type;
std::string m_name;
};
}
struct imgtool_transfer_suggestion
{
@ -290,7 +329,7 @@ union imgtoolinfo
imgtoolerr_t (*read_file) (imgtool::partition &partition, const char *filename, const char *fork, imgtool::stream &destf);
imgtoolerr_t (*write_file) (imgtool::partition &partition, const char *filename, const char *fork, imgtool::stream &sourcef, util::option_resolution *opts);
imgtoolerr_t (*delete_file) (imgtool::partition &partition, const char *filename);
imgtoolerr_t (*list_forks) (imgtool::partition &partition, const char *path, imgtool_forkent *ents, size_t len);
imgtoolerr_t (*list_forks) (imgtool::partition &partition, const char *path, std::vector<imgtool::fork_entry> &forks);
imgtoolerr_t (*create_dir) (imgtool::partition &partition, const char *path);
imgtoolerr_t (*delete_dir) (imgtool::partition &partition, const char *path);
imgtoolerr_t (*list_attrs) (imgtool::partition &partition, const char *path, uint32_t *attrs, size_t len);

View File

@ -5741,13 +5741,12 @@ static imgtoolerr_t mac_image_writefile(imgtool::partition &partition, const cha
static imgtoolerr_t mac_image_listforks(imgtool::partition &partition, const char *path, imgtool_forkent *ents, size_t len)
static imgtoolerr_t mac_image_listforks(imgtool::partition &partition, const char *path, std::vector<imgtool::fork_entry> &forks)
{
imgtoolerr_t err;
uint32_t parID;
mac_str255 filename;
mac_dirent cat_info;
int fork_num = 0;
imgtool::image &img(partition.image());
struct mac_l2_imgref *image = get_imgref(img);
@ -5758,22 +5757,15 @@ static imgtoolerr_t mac_image_listforks(imgtool::partition &partition, const cha
if (cat_info.dataRecType != hcrt_File)
return IMGTOOLERR_FILENOTFOUND;
/* specify data fork */
ents[fork_num].type = FORK_DATA;
ents[fork_num].forkname[0] = '\0';
ents[fork_num].size = cat_info.dataLogicalSize;
fork_num++;
// specify data fork
forks.emplace_back(cat_info.dataLogicalSize, imgtool::fork_entry::type_t::DATA);
if (cat_info.rsrcLogicalSize > 0)
{
/* specify the resource fork */
ents[fork_num].type = FORK_RESOURCE;
strcpy(ents[fork_num].forkname, "RESOURCE_FORK");
ents[fork_num].size = cat_info.rsrcLogicalSize;
fork_num++;
// specify the resource fork
forks.emplace_back(cat_info.rsrcLogicalSize, imgtool::fork_entry::type_t::RESOURCE);
}
ents[fork_num].type = FORK_END;
return IMGTOOLERR_SUCCESS;
}

View File

@ -2,7 +2,7 @@
// copyright-holders:Raphael Nabet
/****************************************************************************
macbin.c
macbin.cpp
MacBinary filter for use with Mac and ProDOS drivers
@ -82,7 +82,6 @@ static imgtoolerr_t macbinary_readfile(imgtool::partition &partition, const char
imgtoolerr_t err;
uint8_t header[128];
const char *basename;
int i;
uint32_t type_code = 0x3F3F3F3F;
uint32_t creator_code = 0x3F3F3F3F;
@ -93,23 +92,32 @@ static imgtoolerr_t macbinary_readfile(imgtool::partition &partition, const char
uint8_t script_code = 0;
uint8_t extended_flags = 0;
imgtool_forkent fork_entries[4];
const imgtool_forkent *data_fork = NULL;
const imgtool_forkent *resource_fork = NULL;
uint32_t creation_time = 0;
uint32_t lastmodified_time = 0;
imgtool_attribute attr_values[10];
/* get the forks */
err = partition.list_file_forks(filename, fork_entries, sizeof(fork_entries));
// get the forks
std::vector<imgtool::fork_entry> fork_entries;
err = partition.list_file_forks(filename, fork_entries);
if (err)
return err;
for (i = 0; fork_entries[i].type != FORK_END; i++)
const imgtool::fork_entry *data_fork = nullptr;
const imgtool::fork_entry *resource_fork = nullptr;
for (const auto &entry : fork_entries)
{
if (fork_entries[i].type == FORK_DATA)
data_fork = &fork_entries[i];
else if (fork_entries[i].type == FORK_RESOURCE)
resource_fork = &fork_entries[i];
switch (entry.type())
{
case imgtool::fork_entry::type_t::DATA:
data_fork = &entry;
break;
case imgtool::fork_entry::type_t::RESOURCE:
resource_fork = &entry;
break;
default:
// do nothing
break;
}
}
/* get the attributes */
@ -144,8 +152,8 @@ static imgtoolerr_t macbinary_readfile(imgtool::partition &partition, const char
place_integer_be(header, 75, 2, coord_x);
place_integer_be(header, 77, 2, coord_y);
place_integer_be(header, 79, 2, finder_folder);
place_integer_be(header, 83, 4, data_fork ? data_fork->size : 0);
place_integer_be(header, 87, 4, resource_fork ? resource_fork->size : 0);
place_integer_be(header, 83, 4, data_fork ? data_fork->size() : 0);
place_integer_be(header, 87, 4, resource_fork ? resource_fork->size() : 0);
place_integer_be(header, 91, 4, creation_time);
place_integer_be(header, 95, 4, lastmodified_time);
place_integer_be(header, 101, 1, (finder_flags >> 0) & 0xFF);
@ -164,7 +172,7 @@ static imgtoolerr_t macbinary_readfile(imgtool::partition &partition, const char
if (err)
return err;
destf.fill(0, pad128(data_fork->size));
destf.fill(0, pad128(data_fork->size()));
}
if (resource_fork)
@ -173,7 +181,7 @@ static imgtoolerr_t macbinary_readfile(imgtool::partition &partition, const char
if (err)
return err;
destf.fill(0, pad128(resource_fork->size));
destf.fill(0, pad128(resource_fork->size()));
}
return IMGTOOLERR_SUCCESS;

View File

@ -1813,13 +1813,12 @@ static imgtoolerr_t prodos_diskimage_deletefile(imgtool::partition &partition, c
static imgtoolerr_t prodos_diskimage_listforks(imgtool::partition &partition, const char *path, imgtool_forkent *ents, size_t len)
static imgtoolerr_t prodos_diskimage_listforks(imgtool::partition &partition, const char *path, std::vector<imgtool::fork_entry> &forks)
{
imgtoolerr_t err;
imgtool::image &image(partition.image());
prodos_dirent ent;
prodos_direnum direnum;
int fork_num = 0;
err = prodos_lookup_path(image, path, CREATE_NONE, &direnum, &ent);
if (err)
@ -1828,22 +1827,15 @@ static imgtoolerr_t prodos_diskimage_listforks(imgtool::partition &partition, co
if (is_dir_storagetype(ent.storage_type))
return IMGTOOLERR_FILENOTFOUND;
/* specify data fork */
ents[fork_num].type = FORK_DATA;
ents[fork_num].forkname[0] = '\0';
ents[fork_num].size = ent.filesize[0];
fork_num++;
// specify data fork
forks.emplace_back(ent.filesize[0], imgtool::fork_entry::type_t::DATA);
if (is_extendedfile_storagetype(ent.storage_type))
{
/* specify the resource fork */
ents[fork_num].type = FORK_RESOURCE;
strcpy(ents[fork_num].forkname, "RESOURCE_FORK");
ents[fork_num].size = ent.filesize[1];
fork_num++;
// specify the resource fork
forks.emplace_back(ent.filesize[1], imgtool::fork_entry::type_t::RESOURCE);
}
ents[fork_num].type = FORK_END;
return IMGTOOLERR_SUCCESS;
}