-- | 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.Bits (testBit) import Data.Word (Word8) ---- -- | Parses Extended Header as 'ID3ExtHeader' structure parseExtHeader :: TagParser ID3ExtHeader parseExtHeader = do s <- parseSize 4 True `err` "ext header size" -- Extended header size: 4 * %0xxxxxxx _ <- word8 0x01 `err` "ext header pre-flags" -- Number of flag bytes: $01 flags <- anyWord8 `err` "ext header flags" -- Extended Flags: %0bcd0000 let (b, c, d) = (testBit flags 6, testBit flags 5, testBit flags 4) bb <- if b then parseB else return False cc <- if c then do crc <- parseC return $ Just crc else return Nothing dd <- if d then parseD else return False return $ initID3ExtHeader [ extSize^=s , isUpdate^=bb , crcData^=cc , restrictionsPresent^=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::Integer) anyWord8 -- | parser for @d@ flag - restrictions flags -- TODO: Properly read these flags into a data structure... parseD :: TagParser Bool parseD = do _ <- word8 0x01 _ <- anyWord8 return True