21 listenLoop handle (linesNumber + 1) (buf ++ [str]) chan clientID |
21 listenLoop handle (linesNumber + 1) (buf ++ [str]) chan clientID |
22 |
22 |
23 clientRecvLoop :: Handle -> Chan CoreMessage -> Int -> IO () |
23 clientRecvLoop :: Handle -> Chan CoreMessage -> Int -> IO () |
24 clientRecvLoop handle chan clientID = |
24 clientRecvLoop handle chan clientID = |
25 listenLoop handle 0 [] chan clientID |
25 listenLoop handle 0 [] chan clientID |
26 `catch` (\e -> (clientOff $ show e) >> return ()) |
26 `catch` (\e -> clientOff (show e) >> return ()) |
27 where clientOff msg = writeChan chan $ ClientMessage (clientID, ["QUIT", msg]) -- if the client disconnects, we perform as if it sent QUIT message |
27 where clientOff msg = writeChan chan $ ClientMessage (clientID, ["QUIT", msg]) -- if the client disconnects, we perform as if it sent QUIT message |
28 |
28 |
29 clientSendLoop :: Handle -> Chan CoreMessage -> Chan [String] -> Int -> IO() |
29 clientSendLoop :: Handle -> Chan CoreMessage -> Chan [String] -> Int -> IO() |
30 clientSendLoop handle coreChan chan clientID = do |
30 clientSendLoop handle coreChan chan clientID = do |
31 answer <- readChan chan |
31 answer <- readChan chan |
32 doClose <- Exception.handle |
32 doClose <- Exception.handle |
33 (\(e :: Exception.IOException) -> if isQuit answer then return True else sendQuit e >> return False) $ do |
33 (\(e :: Exception.IOException) -> if isQuit answer then return True else sendQuit e >> return False) $ do |
34 forM_ answer (\str -> hPutStrLn handle str) |
34 forM_ answer (hPutStrLn handle) |
35 hPutStrLn handle "" |
35 hPutStrLn handle "" |
36 hFlush handle |
36 hFlush handle |
37 return $ isQuit answer |
37 return $ isQuit answer |
38 |
38 |
39 if doClose then |
39 if doClose then |