-- The Hpc tracer viewer/debugger
module Main where
import Trace.Hpc.Mix
import Trace.Hpc.Tix
import Trace.Hpc.Util
import Control.Concurrent
import Control.Exception as Exc
import Control.Concurrent.MVar
import Network.TrivialWebServer
import Network.AjaxServer
import System.Environment (getArgs, withArgs)
import Reactive
import Common
import MixActor
import TixActor
import CodeRenderActor
import TixStreamActor
import TracerActor
import AjaxAPI
import CachedFiles
import Flags
import StreamHandle
------------------------------------------------------------------------------
main = do
args <- getArgs
let flags = parseFlags args
(d_h,c_h) <- openStream flags
step <- tracerActor (hpcdir flags) (srcdir flags) d_h c_h
let tracerActor :: TracerRequest -> IO [AjaxCallback]
tracerActor req = do resp <- step req
let respTxt = sendTracerResponse resp
-- print respTxt
return $ respTxt
toScreenRender <- codeRenderActor (hpcdir flags) (srcdir flags)
let mkPage ty body = return $ PageResponse 200 False ty body
let rpc = alts $
[ call "boot" (tracerActor InitRequest)
{-
, call "step" (\ (n :: Int) -> tracerActor (StepRequest Forward))
<*> jsonArg "count"
-}
, call "step/forward" (tracerActor (StepRequest Forward))
, call "step/backward" (tracerActor (StepRequest Backward))
, call "run/forward" (tracerActor (RunRequest Forward))
, call "run/backward" (tracerActor (RunRequest Backward))
, call "run/backward" (tracerActor (RunRequest Backward))
, call "please/continue" (tracerActor ContinueRequest)
, call "please/stop" (tracerActor StopRequest)
] ++
[ jsonArg "status" <*>
jsonArg "breakpoint" <*>
call ("breakpoint")
( \ bp onOff -> tracerActor
$ (if onOff then SetBreakPoint
else ClearBreakPoint)
$ bp
)
] {- ++
[ jsonArg "name" <*>
call "usertext" (\ name value -> do print (name::String,value::String)
return [])
] -}
-- later, implement http://..:8091/modules/Foo as the render engine
let pageRpc = alts
[ jsonArg "module" <*>
call "modulecode" (\ mod -> do
txt <- toScreenRender mod
mkPage "text/html" txt)
]
mVar <- newEmptyMVar
let pages :: String -> IO PageResponse
pages "/favicon.ico" = mkPage "text/ico" favicon
pages "/progress.gif" = mkPage "image/gif" progress
pages "/" = mkPage "text/html" root_html
pages "/code.html" = mkPage "text/html" code_html
pages "/header.html" = mkPage "text/html" header_html
pages "/status.html" = mkPage "text/html" status_html
pages "/footer.html" = mkPage "text/html" footer_html
pages "/default.css" = do
-- hack to improve compile cycle.
-- default_css <- readFile "/Users/andy/darcs/hpc/tools/tracer/fs/default.css"
mkPage "text/css" default_css
pages "/default.js" = do
-- hack to improve compile cycle.
-- default_js <- readFile "/Users/andy/darcs/hpc/tools/tracer/fs/default.js"
mkPage "text/js" default_js
pages "/quit" = do putMVar mVar ()
mkPage "text/html" "aborting"
pages other = do print other
mkPage "text/html" other
forkIO $ ajaxServer (port flags) rpc pageRpc pages
takeMVar mVar
return ()