From 3db689389e94a76c2d658eeac9efb989d6197da5 Mon Sep 17 00:00:00 2001 From: Kelvin Sherlock Date: Fri, 12 Aug 2016 19:50:22 -0400 Subject: [PATCH] resource manager tweaks. --- toolbox/rm-new.cpp | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/toolbox/rm-new.cpp b/toolbox/rm-new.cpp index f54038e..12139f4 100644 --- a/toolbox/rm-new.cpp +++ b/toolbox/rm-new.cpp @@ -50,7 +50,7 @@ #include #include - +#include #include "stackframe.h" #include "fs_spec.h" @@ -165,6 +165,7 @@ struct resource { uint16_t id = 0; uint16_t attr = 0; uint32_t data_offset = 0; + uint32_t disk_size = -1; //uint32_t name_offset = 0; uint32_t handle = 0; std::string name; @@ -423,7 +424,7 @@ namespace { size_t ok = read(rf.fd, buffer, sizeof(buffer)); if (ok != 4) return mapReadErr; - return read_32(buffer); + return r.disk_size = read_32(buffer); } @@ -594,14 +595,32 @@ namespace { if (!(r.attr & resChanged)) return noErr; if (r.attr & resProtected) return noErr; - // todo... - fprintf(stderr, "%s not yet implemented\n", __func__); - exit(1); - return SetResError(0); + if (!r.handle) return noErr; // should never happen... - // set r.attr |= mapChanged; if it moves. - r.attr &= ~resChanged; + auto hi = MM::Native::GetHandleInfo(r.handle); + + if (r.data_offset && r.disk_size != -1 && r.disk_size < hi->size) + rf.attr |= mapCompact; + + + if (r.data_offset == 0 || r.disk_size == -1 || r.disk_size < hi->size){ + // append + rf.attr |= mapChanged; + + + r.data_offset = rf.offset_rdata + rf.length_rdata; + rf.length_rdata += hi->size; + // rf.offset_rmap no longer valid. + } + + uint32_t xx = htobe32(hi->size); + lseek(rf.fd, rf.offset_rdata + r.data_offset, SEEK_SET); + write(rf.fd, &xx, 4); + // todo -- if purged, is size 0?? + write(rf.fd, memoryPointer(hi->address), hi->size); + rf.attr &= ~resChanged; return noErr; + } tool_return write_resource_map(resource_file &rf) {