{-# LANGUAGE OverloadedStrings #-}
module Types(CArray, Page(..), Application(..)) where
import System.Directory (getCurrentDirectory) -- default referer URI
import SpeechStyle (SpeechStyle)
import Data.CSS.Preprocessor.Conditions (ConditionalStyles, conditionalStyles)
import Data.CSS.Preprocessor.Text (TextStyle)
import Text.XML
import qualified Data.Map.Strict as M
import Network.URI
import Network.URI.Fetch (Application(..))
-- For the in-memory history log
import Data.Trie.Text (Trie)
import qualified Data.Text as Txt
import qualified Data.Trie.Text as Trie
import System.Directory
import System.FilePath ((</>))
import Control.Parallel (par)
import qualified System.IO.Strict as Strict
import Foreign.Ptr
import Foreign.StablePtr
type CArray a = Ptr a
data Page = Page {
url :: URI,
css :: ConditionalStyles (TextStyle SpeechStyle),
html :: Document,
pageTitle :: String,
pageMIME :: String,
apps :: [Application],
backStack :: [(String, URI)],
forwardStack :: [(String, URI)],
-- Probably don't need an MVar here, but let's be safe!
visitedURLs :: Trie ()
}
foreign export ccall c_initialReferer :: IO (StablePtr Page)
loadVisited :: IO (Trie ())
loadVisited = do
dir <- getXdgDirectory XdgData "rhapsode"
let path = dir </> "history.gmni"
exists <- doesFileExist path
if exists then do
file <- Strict.readFile path -- Can't leave this file locked when I'll shortly append to it!
let hist = Trie.fromList [(Txt.pack uri, ()) | _:uri:_ <- map words $ lines file]
hist `par` return hist
else return Trie.empty
c_initialReferer = do
cwd <- getCurrentDirectory
hist <- loadVisited
newStablePtr $ Page {
-- Default to URIs being relative to CWD.
url = URI {uriScheme = "file:", uriPath = cwd,
uriAuthority = Nothing, uriQuery = "", uriFragment = ""},
-- Blank values:
css = conditionalStyles nullURI "temp",
html = Document {
documentPrologue = Prologue [] Nothing [],
documentRoot = Element "temp" M.empty [],
documentEpilogue = []
},
pageTitle = "", pageMIME = "", apps = [],
backStack = [], forwardStack = [], visitedURLs = hist
}
foreign export ccall c_freePage :: StablePtr Page -> IO ()
c_freePage = freeStablePtr