Skip to content

v0.2.1

Choose a tag to compare

@Aksel-Visby Aksel-Visby released this 27 Jun 12:14

Added

  • Thunderbird .msf enrichment now preserves message priority set inside Thunderbird. A
    priority a user or filter applied in Thunderbird is stored only in the .msf (not in the mbox
    headers), so it was previously lost; it is now read and written to Outlook's importance. Priority
    that arrived on the message's own X-Priority/Importance header was already preserved.
  • Thunderbird .msf enrichment now drops uncompacted dead copies. An un-compacted Thunderbird
    folder can still hold old physical copies of messages it no longer shows; the converter now reads
    each .msf row's live mbox byte offset (storeToken, falling back to msgOffset) and exports
    only the messages Thunderbird still lists, so the PST matches the folder you see. Filtering
    activates only when every live row maps to a real mbox message boundary — on any uncertainty it
    keeps every message, so unique mail is never dropped.

Changed

  • Writer: large attachments (≥ 16 MB) are now written by streaming. A single large attachment
    previously caused writer-side peak memory to spike to a multiple of its size — the vendored
    layer materialised the full payload in memory while building the data blocks. The attachment
    data is now fed through a batched, bounded-residency pipeline, so the writer-side contribution
    to peak memory stays bounded regardless of attachment size (verified end-to-end: resident block
    count stays flat from 9 MB to 512 MB attachments). Small and medium attachments (< 16 MB) keep the
    existing byte[] path; output is byte-identical and is structure-validated by the independent
    MS-PST reader (tools/pst-validate). Note: the mbox parser still materialises one message at a
    time, so total process memory for a single multi-GB attachment remains parser-bound — removing
    that end-to-end ceiling is separate, future work.
  • Writer: PST files are now built from scratch via PSTFile.CreateEmptyStore() instead of
    copying a pre-seeded blank seed file. The blank-seed asset, the seed-extraction helper,
    and the dev-only seed-regeneration tool have been retired; PstWriter, PstPartManager,
    and ConversionRunner no longer accept or require a seed file path.
  • Writer: large folders convert dramatically faster. Adding a message was effectively
    O(n²) in the folder's message count — the vendored heap allocator located free space with
    a linear block scan that grew as a folder filled — so very large single folders slowed down
    progressively. The allocator now uses a maintained best-fit free-space index, keeping
    per-message cost flat. A ~16,000-message folder that took ~70 s now takes ~40 s; output
    validity is unchanged (verified against an independent MS-PST reader).
  • Thunderbird enrichment is far quieter on real profiles. Two harmless internal conditions no
    longer raise per-folder warnings: (1) an empty folder (whose .msf has no message table) is
    now treated as "no messages" instead of an unreadable-.msf warning; (2) the dead-copy
    live-offset filter declining to run — the common, expected case for IMAP accounts, whose .msf
    rows usually carry no usable byte offset — is now silent. In both cases behaviour is unchanged
    (every message is still exported and flags/tags still applied); only the noise is gone. A genuinely
    corrupt .msf, and an ambiguous multi-table .msf, still warn. The aggregate filter-disabled count
    remains in the conversion report for diagnostics.

Fixed

  • Writer: a failed split (e.g. the next part can't be created mid-conversion) no longer
    deletes the already-completed previous part or leaves a stray blank part behind; the
    failure still surfaces as fatal, but completed output is preserved.
  • Writer: a message carrying an attachment larger than a PST attachment can store
    (PidTagAttachSize is a 32-bit value) is now skipped and reported instead of writing a
    wrapped size or risking an out-of-memory load of the whole attachment.
  • Desktop: the per-run temp config file is now removed if the conversion engine fails to
    launch (sidecar missing or spawn error), instead of being left behind in the temp directory.