1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
| class ecdEntry
{
public:
typedef std::shared_ptr<ecdEntry> ptr;
ecdEntry() :
m_name(new char(PackingRules::Sizes::FileName)),
m_size(0),
m_offset(0),
m_packing_type(PackingRules::PackingTypes::None),
m_childs()
{
}
ecdEntry(const std::string& name,
const unsigned long size,
const unsigned long offset,
const PackingRules::PackingTypes packing_type,
const unsigned int childs = 0
) :
m_name(new char(PackingRules::Sizes::FileName)),
m_size(size),
m_offset(offset),
m_packing_type(packing_type),
m_childs(childs)
{
std::cout << "default ctor"<<std::endl;
if(static_cast<PackingRules::Sizes>(name.size()) >= PackingRules::Sizes::FileName)
{
throw std::logic_error("Name of this entry is too long");
}
std::fill_n(m_name, PackingRules::Sizes::FileName, 0);
memcpy(m_name, name.c_str(), PackingRules::Sizes::FileName);
}
ecdEntry(const ecdEntry& entry) = delete;
ecdEntry& operator=(const ecdEntry& entry) = delete;
~ecdEntry()
{
if(m_name) delete[] m_name;
}
static unsigned long size()
{
return PackingRules::Sizes::FileName
+sizeof(unsigned long)
+sizeof(unsigned long)
+sizeof(unsigned short)
+sizeof(unsigned int);
}
void read(std::ifstream& stream)
{
stream.read(reinterpret_cast<char*>(m_name), PackingRules::Sizes::FileName);
char* buffer;
stream.read(reinterpret_cast<char*>(&buffer), sizeof(unsigned long));
m_size = reinterpret_cast<unsigned long>(buffer);
stream.read(reinterpret_cast<char*>(&buffer), sizeof(unsigned long));
m_offset = reinterpret_cast<unsigned long>(buffer);
stream.read(reinterpret_cast<char*>(&buffer), sizeof(unsigned short));
m_packing_type = static_cast<unsigned short>(reinterpret_cast<unsigned int>(buffer));
stream.read(reinterpret_cast<char*>(&buffer), sizeof(unsigned int));
m_childs = reinterpret_cast<unsigned int>(buffer);
delete[] buffer;
}
void write(std::ofstream& stream)
{
stream.write(m_name, PackingRules::Sizes::FileName);
stream.write(reinterpret_cast<char*>(&m_size), sizeof(unsigned long));
stream.write(reinterpret_cast<char*>(&m_offset), sizeof(unsigned long));
stream.write(reinterpret_cast<char*>(&m_packing_type), sizeof(unsigned short));
stream.write(reinterpret_cast<char*>(&m_childs), sizeof(unsigned int));
}
char* m_name;
unsigned long m_size;
unsigned long m_offset;
unsigned short m_packing_type;
unsigned int m_childs;
}; |
Partager