mirror of
https://github.com/davidgiven/fluxengine.git
synced 2025-10-31 11:17:01 -07:00
Fetching HFS files now gives you a AppleSingle file with both data and resource
forks.
This commit is contained in:
78
lib/vfs/applesingle.cc
Normal file
78
lib/vfs/applesingle.cc
Normal file
@@ -0,0 +1,78 @@
|
||||
#include "lib/globals.h"
|
||||
#include "lib/bytes.h"
|
||||
#include "lib/vfs/applesingle.h"
|
||||
|
||||
static constexpr uint32_t APPLESINGLE_MAGIC = 0x00051600;
|
||||
static constexpr uint32_t APPLESINGLE_VERSION = 0x00020000;
|
||||
|
||||
void AppleSingle::parse(const Bytes& bytes)
|
||||
{
|
||||
ByteReader br(bytes);
|
||||
if (br.read_be32() != APPLESINGLE_MAGIC)
|
||||
throw InvalidFileException();
|
||||
if (br.read_be32() > APPLESINGLE_VERSION)
|
||||
throw InvalidFileException();
|
||||
|
||||
br.skip(16);
|
||||
int entries = br.read_be16();
|
||||
for (int i = 0; i < entries; i++)
|
||||
{
|
||||
uint32_t entryType = br.read_be32();
|
||||
uint32_t offset = br.read_be32();
|
||||
uint32_t length = br.read_be32();
|
||||
|
||||
switch (entryType)
|
||||
{
|
||||
case 1:
|
||||
data = bytes.slice(offset, length);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
rsrc = bytes.slice(offset, length);
|
||||
break;
|
||||
|
||||
case 9:
|
||||
{
|
||||
Bytes finderinfo = bytes.slice(offset, length);
|
||||
type = finderinfo.slice(0, 4);
|
||||
creator = finderinfo.slice(4, 4);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Bytes AppleSingle::render()
|
||||
{
|
||||
Bytes result;
|
||||
ByteWriter bw(result);
|
||||
|
||||
bw.write_be32(APPLESINGLE_MAGIC);
|
||||
bw.write_be32(APPLESINGLE_VERSION);
|
||||
bw.append(Bytes(16)); /* padding */
|
||||
bw.write_be16(3); /* number of entries */
|
||||
|
||||
bw.write_be32(9); /* finder info */
|
||||
bw.write_be32(0x3e); /* finder info offset */
|
||||
bw.write_be32(32); /* finder info length */
|
||||
|
||||
bw.write_be32(1); /* data fork */
|
||||
bw.write_be32(OVERHEAD); /* data fork offset */
|
||||
bw.write_be32(data.size()); /* data fork length */
|
||||
|
||||
bw.write_be32(2); /* resource fork */
|
||||
bw.write_be32(OVERHEAD + data.size()); /* resource fork offset */
|
||||
bw.write_be32(rsrc.size()); /* resource fork length */
|
||||
|
||||
bw.append(type.slice(0, 4));
|
||||
bw.append(creator.slice(0, 4));
|
||||
bw.append(Bytes(32 - 8));
|
||||
|
||||
bw.append(data);
|
||||
bw.append(rsrc);
|
||||
|
||||
return result;
|
||||
}
|
||||
Reference in New Issue
Block a user