    -- ------------------------------------------------------------

    {- |
       Module     : Text.XML.HXT.Arrow.XmlState.MimeTypeTable
       Copyright  : Copyright (C) 2010 Uwe Schmidt
       License    : MIT

       Maintainer : Uwe Schmidt (uwe@fh-wedel.de)
       Stability  : stable
       Portability: portable

       the mime type configuration functions

    -}

    -- ------------------------------------------------------------

    module Text.XML.HXT.Arrow.XmlState.MimeTypeTable
    where

    import Control.Arrow                            -- arrow classes
    import Control.Arrow.ArrowList
    import Control.Arrow.ArrowIO

    import Text.XML.HXT.DOM.Interface

    import Text.XML.HXT.Arrow.XmlState.TypeDefs

    -- ------------------------------------------------------------

    -- | set the table mapping of file extensions to mime types in the system state
    --
    -- Default table is defined in 'Text.XML.HXT.DOM.MimeTypeDefaults'.
    -- This table is used when reading loacl files, (file: protocol) to determine the mime type

    setMimeTypeTable                :: MimeTypeTable -> IOStateArrow s b b
    setMimeTypeTable mtt            = configSysVar $ setS (theMimeTypes .&&&. theMimeTypeFile) (mtt, "")

    -- | set the table mapping of file extensions to mime types by an external config file
    --
    -- The config file must follow the conventions of /etc/mime.types on a debian linux system,
    -- that means all empty lines and all lines starting with a # are ignored. The other lines
    -- must consist of a mime type followed by a possible empty list of extensions.
    -- The list of extenstions and mime types overwrites the default list in the system state
    -- of the IOStateArrow

    setMimeTypeTableFromFile        :: FilePath -> IOStateArrow s b b
    setMimeTypeTableFromFile file   = configSysVar $ setS theMimeTypeFile file

    -- | read the system mimetype table

    getMimeTypeTable                :: IOStateArrow s b MimeTypeTable
    getMimeTypeTable                = getMime $< getSysVar (theMimeTypes .&&&. theMimeTypeFile)
        where
        getMime (mtt, "")           = constA mtt
        getMime (_,  mtf)           = perform (setMimeTypeTable $< arrIO0 ( readMimeTypeTable mtf))
                                      >>>
                                      getMimeTypeTable

    -- ------------------------------------------------------------