module Network.URI.XDG.MimeApps(HandlersConfig, loadHandlers, queryHandlers) where
import System.Environment (lookupEnv)
import Control.Monad (forM)
import System.FilePath
import Data.List (nub, (\\))
import Network.URI.XDG.Ini
type HandlersConfig = [INI]
loadHandlers :: IO HandlersConfig
loadHandlers = do
desktop <- lookupEnv "XDG_CURRENT_DESKTOP"
dir0 <- mimeAppsDirs "XDG_CONFIG"
dir1 <- mimeAppsDirs "XDG_DATA"
let filepaths = mimeAppsFiles (dir0 ++ map (</> "applications") dir1) desktop
files <- forM filepaths readFile
return $ map parseIni files
mimeAppsDirs envPrefix = do
home <- lookupEnv (envPrefix ++ "_HOME")
dirs <- lookupEnv (envPrefix ++ "_DIRS")
let dirs' = (case dirs of
Just x -> filter (/= "") $ split ':' x
Nothing -> [])
return $ case home of
Just home' -> home' : dirs'
Nothing -> dirs'
mimeAppsFiles (dir:dirs) (Just desktop) = (dir </> desktop ++ "-mimeapps.list") :
(dir </> "mimeapps.list") : (mimeAppsFiles dirs $ Just desktop)
mimeAppsFiles (dir:dirs) Nothing = (dir </> "mimeapps.list") : mimeAppsFiles dirs Nothing
mimeAppsFiles [] _ = []
split b (a:as) | a == b = [] : split b as
| (head':tail') <- split b as = (a:head') : tail'
split _ [] = [[]]
---
queryHandlers :: HandlersConfig -> String -> [String]
-- TODO Expand MIMEtypes in reference to the local MIMEtypes database.
queryHandlers config mime = nub (
queryHandlers' "default applications" config mime ++
(queryHandlers' "added associations" config mime \\
queryHandlers' "removed associations" config mime)
)
queryHandlers' group (config:configs) mime =
queryHandlers'' group config mime ++ queryHandlers' group configs mime
queryHandlers'' group config mime
| Just apps <- iniLookup group mime config = filter (/= "") $ split ';' apps
| otherwise = []