Internal
Public Access
Previously an unrecognized rectangle encoding in a FramebufferUpdate aborted the connection with a generic message, and there was nothing tying the set of encodings we announce via SetEncodings to the set we actually know how to decode. Introduces kAnnouncedEncodings as the single source of truth for both, converts the rectangle dispatch to a switch keyed off it, and gives the (still intentionally fatal -- there's no safe way to skip an unknown-length payload) fallback a message that identifies it as a protocol violation rather than "not supported". Adds a regression test asserting every announced encoding has a working dispatch case, so future encodings (Hextile/ZRLE/Tight/ Cursor) can't be added to the announced list without matching decode support. Also replaces scattered inline magic numbers for RFB message-type constants with named constants, in prep for the clipboard/cursor/compression work that follows. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>