4 import Control.Concurrent.STM |
4 import Control.Concurrent.STM |
5 import Data.Char |
5 import Data.Char |
6 import Data.Word |
6 import Data.Word |
7 import qualified Data.Map as Map |
7 import qualified Data.Map as Map |
8 import qualified Data.IntMap as IntMap |
8 import qualified Data.IntMap as IntMap |
|
9 import Numeric |
|
10 import Network.Socket |
|
11 import qualified Data.List as List |
9 ------------------------------------------------- |
12 ------------------------------------------------- |
10 import qualified Codec.Binary.Base64 as Base64 |
13 import qualified Codec.Binary.Base64 as Base64 |
11 import qualified Codec.Binary.UTF8.String as UTF8 |
14 import qualified Codec.Binary.UTF8.String as UTF8 |
12 import CoreTypes |
15 import CoreTypes |
|
16 |
|
17 |
|
18 sockAddr2String :: SockAddr -> IO String |
|
19 sockAddr2String (SockAddrInet _ hostAddr) = inet_ntoa hostAddr |
|
20 sockAddr2String (SockAddrInet6 _ _ (a, b, c, d) _) = |
|
21 return $ (foldr1 (.) |
|
22 $ List.intersperse (\a -> ':':a) |
|
23 $ concatMap (\n -> (\(a, b) -> [showHex a, showHex b]) $ divMod n 65536) [a, b, c, d]) [] |
13 |
24 |
14 toEngineMsg :: String -> String |
25 toEngineMsg :: String -> String |
15 toEngineMsg msg = Base64.encode (fromIntegral (length msg) : (UTF8.encode msg)) |
26 toEngineMsg msg = Base64.encode (fromIntegral (length msg) : (UTF8.encode msg)) |
16 |
27 |
17 --tselect :: [ClientInfo] -> STM ([String], ClientInfo) |
28 --tselect :: [ClientInfo] -> STM ([String], ClientInfo) |