You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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.