-- | This module provides parsers for Extended Header -- -- () module ID3.Parser.ExtHeader (parseExtHeader) where ---- IMPORTS import ID3.Parser.General import ID3.Type.ExtHeader import Data.Accessor import Data.Word (Word8) ---- -- | Parses Extended Header as 'ID3ExtHeader' structure parseExtHeader :: TagParser ID3ExtHeader parseExtHeader = do s <- parseSize_ 4 `err` "ext header size" -- Extended header size 4 * %0xxxxxxx word8 0x01 `err` "ext header pre-flags" -- Number of flag bytes $01 [b,c,d] <- parseFlags_ [2,3,4] `err` "ext header flags" -- Extended Flags %0bcd0000 bb <- if b then parseB else return False cc <- if c then parseC else return [] dd <- if d then parseD else return [] return $ initID3ExtHeader [ extSize^=s , extFlags^=(initExtFlags [ isUpdate^=bb , crc^=cc , restrictions^=dd ]) ] -- | parser for @b@ flag - 'isUpdate' parseB :: TagParser Bool parseB = do word8 0x00 return True -- | parser for @c@ flag - CRC data parseC :: TagParser [Word8] parseC = do word8 0x05 count 5 anyWord8 -- | parser for @d@ flag - restrictions flags -- TODO: make Flags type and structure for these flags parseD :: TagParser [Bool] parseD = do word8 0x01 parseFlags_ [1..8]