{-# LANGUAGE ScopedTypeVariables #-}
module Network.ADB.Socket where

import Control.Exception
import Control.Monad.Error
import Network.ADB.Transport
import Network.Socket (Socket, sClose)
import Network.Socket.ByteString
import System.IO.Error
import Prelude hiding (read)


socketTransport :: Socket -> Transport (ErrorT TransportError IO)
socketTransport s = Transport {
        write = \bs -> do
            --liftIO $ putStrLn $ hexdump 0 (C.unpack bs)   -- ###
            ee <- liftIO . try $ sendAll s bs
            case ee of
                Left (exc :: IOError) -> throwError ClosedByPeer
                Right () -> return (),
        read = \n -> do
            ee <- liftIO . try $ recv s n
            case ee of
                Left (exc :: IOError) -> throwError ClosedByPeer
                Right blk -> do
                    --liftIO $ putStrLn $ hexdump 0 (C.unpack blk)   -- ###
                    return blk,
        close = do
            ee <- liftIO . try $ sClose s
            case ee of
                Left (exc :: IOError) -> throwError ClosedByPeer
                Right blk -> return blk
    }