module TSocket(TSocket(..)) where | |
import Thrift | |
import Data.IORef | |
import Network | |
import IO | |
import Control.Exception | |
data TSocket = TSocket{host::[Char],port::PortNumber,chan :: Maybe Handle} | |
instance TTransport TSocket where | |
tisOpen a = case chan a of | |
Just _ -> True | |
Nothing -> False | |
topen a = do h <- connectTo (host a) (PortNumber (port a)) | |
return $ (a{chan = Just h}) | |
tclose a = case chan a of | |
Just h -> do hClose h | |
return $ a{chan=Nothing} | |
Nothing -> return a | |
tread a 0 = return [] | |
tread a n = case chan a of | |
Just h -> handle (\e -> throwDyn (TransportExn "TSocket: Could not read." TE_UNKNOWN)) | |
(do c <- hGetChar h | |
l <- tread a (n-1) | |
return $ c:l) | |
Nothing -> return [] | |
twrite a s = case chan a of | |
Just h -> hPutStr h s | |
Nothing -> return () | |
tflush a = case chan a of | |
Just h -> hFlush h | |
Nothing -> return () | |