module Sockets(DLValue,module Sockets) where
import Event(XEvent)
import Xtypes(WindowId,Display)
import PackedString(PackedString)
import DLValue
import System.Posix.DynamicLinker(DL)

-- NOTE: Matching definitions for the C world appear in xlib/sockets.h --------

data SocketRequest = OpenLSocket Port                -- -> SR LSocket
                   | OpenSocket Host Port            -- -> SR Socket
                   | WriteSocket Socket String       -- -> SR Success
                   | CloseSocket Socket              -- -> SR Success
                   | CloseLSocket LSocket            -- -> SR Success
                   | GetStdinSocket                  -- -> SR Socket
                   | CreateTimer Int Int             -- -> SR Timer
                   | DestroyTimer Timer              -- -> Success
		   | GetLSocketName LSocket          -- -> Str
		   | GetSocketName Socket            -- -> Str
		   | StartProcess String Bool Bool Bool -- -> ProcessSockets
		   | DLOpen String                   -- -> SR DLHandle
		   | DLClose DLHandle		     -- -> Success
                   | DLSym DLHandle String           -- -> SR DLValue
		   | OpenFileAsSocket String String  -- -> SR Socket
		                   -- name,  mode  (as in fopen(name,mode))
		   | WriteSocketPS Socket PackedString -- -> SR Wrote
                   | GetStdoutSocket                 -- -> SR Socket
                      deriving (Int -> SocketRequest -> ShowS
[SocketRequest] -> ShowS
SocketRequest -> String
(Int -> SocketRequest -> ShowS)
-> (SocketRequest -> String)
-> ([SocketRequest] -> ShowS)
-> Show SocketRequest
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SocketRequest] -> ShowS
$cshowList :: [SocketRequest] -> ShowS
show :: SocketRequest -> String
$cshow :: SocketRequest -> String
showsPrec :: Int -> SocketRequest -> ShowS
$cshowsPrec :: Int -> SocketRequest -> ShowS
Show,ReadPrec [SocketRequest]
ReadPrec SocketRequest
Int -> ReadS SocketRequest
ReadS [SocketRequest]
(Int -> ReadS SocketRequest)
-> ReadS [SocketRequest]
-> ReadPrec SocketRequest
-> ReadPrec [SocketRequest]
-> Read SocketRequest
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [SocketRequest]
$creadListPrec :: ReadPrec [SocketRequest]
readPrec :: ReadPrec SocketRequest
$creadPrec :: ReadPrec SocketRequest
readList :: ReadS [SocketRequest]
$creadList :: ReadS [SocketRequest]
readsPrec :: Int -> ReadS SocketRequest
$creadsPrec :: Int -> ReadS SocketRequest
Read)

data SocketResponse = LSocket LSocket
                    | Socket Socket
                    | Timer Timer
		    | ProcessSockets (Maybe Socket) (Maybe Socket) (Maybe Socket)
                    | DLHandle DLHandle
                    | DLVal DLValue
		    | Wrote Int
                      deriving (Int -> SocketResponse -> ShowS
[SocketResponse] -> ShowS
SocketResponse -> String
(Int -> SocketResponse -> ShowS)
-> (SocketResponse -> String)
-> ([SocketResponse] -> ShowS)
-> Show SocketResponse
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SocketResponse] -> ShowS
$cshowList :: [SocketResponse] -> ShowS
show :: SocketResponse -> String
$cshow :: SocketResponse -> String
showsPrec :: Int -> SocketResponse -> ShowS
$cshowsPrec :: Int -> SocketResponse -> ShowS
Show,ReadPrec [SocketResponse]
ReadPrec SocketResponse
Int -> ReadS SocketResponse
ReadS [SocketResponse]
(Int -> ReadS SocketResponse)
-> ReadS [SocketResponse]
-> ReadPrec SocketResponse
-> ReadPrec [SocketResponse]
-> Read SocketResponse
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [SocketResponse]
$creadListPrec :: ReadPrec [SocketResponse]
readPrec :: ReadPrec SocketResponse
$creadPrec :: ReadPrec SocketResponse
readList :: ReadS [SocketResponse]
$creadList :: ReadS [SocketResponse]
readsPrec :: Int -> ReadS SocketResponse
$creadsPrec :: Int -> ReadS SocketResponse
Read) --(Eq, Ord, Text)

type Port = Int
type Host = String
type Peer = Host

newtype Socket = So Int deriving (Socket -> Socket -> Bool
(Socket -> Socket -> Bool)
-> (Socket -> Socket -> Bool) -> Eq Socket
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Socket -> Socket -> Bool
$c/= :: Socket -> Socket -> Bool
== :: Socket -> Socket -> Bool
$c== :: Socket -> Socket -> Bool
Eq,Eq Socket
Eq Socket
-> (Socket -> Socket -> Ordering)
-> (Socket -> Socket -> Bool)
-> (Socket -> Socket -> Bool)
-> (Socket -> Socket -> Bool)
-> (Socket -> Socket -> Bool)
-> (Socket -> Socket -> Socket)
-> (Socket -> Socket -> Socket)
-> Ord Socket
Socket -> Socket -> Bool
Socket -> Socket -> Ordering
Socket -> Socket -> Socket
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Socket -> Socket -> Socket
$cmin :: Socket -> Socket -> Socket
max :: Socket -> Socket -> Socket
$cmax :: Socket -> Socket -> Socket
>= :: Socket -> Socket -> Bool
$c>= :: Socket -> Socket -> Bool
> :: Socket -> Socket -> Bool
$c> :: Socket -> Socket -> Bool
<= :: Socket -> Socket -> Bool
$c<= :: Socket -> Socket -> Bool
< :: Socket -> Socket -> Bool
$c< :: Socket -> Socket -> Bool
compare :: Socket -> Socket -> Ordering
$ccompare :: Socket -> Socket -> Ordering
$cp1Ord :: Eq Socket
Ord,Int -> Socket -> ShowS
[Socket] -> ShowS
Socket -> String
(Int -> Socket -> ShowS)
-> (Socket -> String) -> ([Socket] -> ShowS) -> Show Socket
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Socket] -> ShowS
$cshowList :: [Socket] -> ShowS
show :: Socket -> String
$cshow :: Socket -> String
showsPrec :: Int -> Socket -> ShowS
$cshowsPrec :: Int -> Socket -> ShowS
Show,ReadPrec [Socket]
ReadPrec Socket
Int -> ReadS Socket
ReadS [Socket]
(Int -> ReadS Socket)
-> ReadS [Socket]
-> ReadPrec Socket
-> ReadPrec [Socket]
-> Read Socket
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Socket]
$creadListPrec :: ReadPrec [Socket]
readPrec :: ReadPrec Socket
$creadPrec :: ReadPrec Socket
readList :: ReadS [Socket]
$creadList :: ReadS [Socket]
readsPrec :: Int -> ReadS Socket
$creadsPrec :: Int -> ReadS Socket
Read)
newtype LSocket = LSo Int deriving (LSocket -> LSocket -> Bool
(LSocket -> LSocket -> Bool)
-> (LSocket -> LSocket -> Bool) -> Eq LSocket
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: LSocket -> LSocket -> Bool
$c/= :: LSocket -> LSocket -> Bool
== :: LSocket -> LSocket -> Bool
$c== :: LSocket -> LSocket -> Bool
Eq,Eq LSocket
Eq LSocket
-> (LSocket -> LSocket -> Ordering)
-> (LSocket -> LSocket -> Bool)
-> (LSocket -> LSocket -> Bool)
-> (LSocket -> LSocket -> Bool)
-> (LSocket -> LSocket -> Bool)
-> (LSocket -> LSocket -> LSocket)
-> (LSocket -> LSocket -> LSocket)
-> Ord LSocket
LSocket -> LSocket -> Bool
LSocket -> LSocket -> Ordering
LSocket -> LSocket -> LSocket
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: LSocket -> LSocket -> LSocket
$cmin :: LSocket -> LSocket -> LSocket
max :: LSocket -> LSocket -> LSocket
$cmax :: LSocket -> LSocket -> LSocket
>= :: LSocket -> LSocket -> Bool
$c>= :: LSocket -> LSocket -> Bool
> :: LSocket -> LSocket -> Bool
$c> :: LSocket -> LSocket -> Bool
<= :: LSocket -> LSocket -> Bool
$c<= :: LSocket -> LSocket -> Bool
< :: LSocket -> LSocket -> Bool
$c< :: LSocket -> LSocket -> Bool
compare :: LSocket -> LSocket -> Ordering
$ccompare :: LSocket -> LSocket -> Ordering
$cp1Ord :: Eq LSocket
Ord,Int -> LSocket -> ShowS
[LSocket] -> ShowS
LSocket -> String
(Int -> LSocket -> ShowS)
-> (LSocket -> String) -> ([LSocket] -> ShowS) -> Show LSocket
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [LSocket] -> ShowS
$cshowList :: [LSocket] -> ShowS
show :: LSocket -> String
$cshow :: LSocket -> String
showsPrec :: Int -> LSocket -> ShowS
$cshowsPrec :: Int -> LSocket -> ShowS
Show,ReadPrec [LSocket]
ReadPrec LSocket
Int -> ReadS LSocket
ReadS [LSocket]
(Int -> ReadS LSocket)
-> ReadS [LSocket]
-> ReadPrec LSocket
-> ReadPrec [LSocket]
-> Read LSocket
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [LSocket]
$creadListPrec :: ReadPrec [LSocket]
readPrec :: ReadPrec LSocket
$creadPrec :: ReadPrec LSocket
readList :: ReadS [LSocket]
$creadList :: ReadS [LSocket]
readsPrec :: Int -> ReadS LSocket
$creadsPrec :: Int -> ReadS LSocket
Read)

newtype Timer = Ti Int deriving (Timer -> Timer -> Bool
(Timer -> Timer -> Bool) -> (Timer -> Timer -> Bool) -> Eq Timer
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Timer -> Timer -> Bool
$c/= :: Timer -> Timer -> Bool
== :: Timer -> Timer -> Bool
$c== :: Timer -> Timer -> Bool
Eq,Eq Timer
Eq Timer
-> (Timer -> Timer -> Ordering)
-> (Timer -> Timer -> Bool)
-> (Timer -> Timer -> Bool)
-> (Timer -> Timer -> Bool)
-> (Timer -> Timer -> Bool)
-> (Timer -> Timer -> Timer)
-> (Timer -> Timer -> Timer)
-> Ord Timer
Timer -> Timer -> Bool
Timer -> Timer -> Ordering
Timer -> Timer -> Timer
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Timer -> Timer -> Timer
$cmin :: Timer -> Timer -> Timer
max :: Timer -> Timer -> Timer
$cmax :: Timer -> Timer -> Timer
>= :: Timer -> Timer -> Bool
$c>= :: Timer -> Timer -> Bool
> :: Timer -> Timer -> Bool
$c> :: Timer -> Timer -> Bool
<= :: Timer -> Timer -> Bool
$c<= :: Timer -> Timer -> Bool
< :: Timer -> Timer -> Bool
$c< :: Timer -> Timer -> Bool
compare :: Timer -> Timer -> Ordering
$ccompare :: Timer -> Timer -> Ordering
$cp1Ord :: Eq Timer
Ord,Int -> Timer -> ShowS
[Timer] -> ShowS
Timer -> String
(Int -> Timer -> ShowS)
-> (Timer -> String) -> ([Timer] -> ShowS) -> Show Timer
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Timer] -> ShowS
$cshowList :: [Timer] -> ShowS
show :: Timer -> String
$cshow :: Timer -> String
showsPrec :: Int -> Timer -> ShowS
$cshowsPrec :: Int -> Timer -> ShowS
Show,ReadPrec [Timer]
ReadPrec Timer
Int -> ReadS Timer
ReadS [Timer]
(Int -> ReadS Timer)
-> ReadS [Timer]
-> ReadPrec Timer
-> ReadPrec [Timer]
-> Read Timer
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Timer]
$creadListPrec :: ReadPrec [Timer]
readPrec :: ReadPrec Timer
$creadPrec :: ReadPrec Timer
readList :: ReadS [Timer]
$creadList :: ReadS [Timer]
readsPrec :: Int -> ReadS Timer
$creadsPrec :: Int -> ReadS Timer
Read)

type AsyncInput = (Descriptor, AEvent)

data Descriptor
  = LSocketDe LSocket
  | SocketDe Socket
  | OutputSocketDe Socket
  | TimerDe Timer
  | DisplayDe Display 
  deriving (Descriptor -> Descriptor -> Bool
(Descriptor -> Descriptor -> Bool)
-> (Descriptor -> Descriptor -> Bool) -> Eq Descriptor
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Descriptor -> Descriptor -> Bool
$c/= :: Descriptor -> Descriptor -> Bool
== :: Descriptor -> Descriptor -> Bool
$c== :: Descriptor -> Descriptor -> Bool
Eq, Eq Descriptor
Eq Descriptor
-> (Descriptor -> Descriptor -> Ordering)
-> (Descriptor -> Descriptor -> Bool)
-> (Descriptor -> Descriptor -> Bool)
-> (Descriptor -> Descriptor -> Bool)
-> (Descriptor -> Descriptor -> Bool)
-> (Descriptor -> Descriptor -> Descriptor)
-> (Descriptor -> Descriptor -> Descriptor)
-> Ord Descriptor
Descriptor -> Descriptor -> Bool
Descriptor -> Descriptor -> Ordering
Descriptor -> Descriptor -> Descriptor
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Descriptor -> Descriptor -> Descriptor
$cmin :: Descriptor -> Descriptor -> Descriptor
max :: Descriptor -> Descriptor -> Descriptor
$cmax :: Descriptor -> Descriptor -> Descriptor
>= :: Descriptor -> Descriptor -> Bool
$c>= :: Descriptor -> Descriptor -> Bool
> :: Descriptor -> Descriptor -> Bool
$c> :: Descriptor -> Descriptor -> Bool
<= :: Descriptor -> Descriptor -> Bool
$c<= :: Descriptor -> Descriptor -> Bool
< :: Descriptor -> Descriptor -> Bool
$c< :: Descriptor -> Descriptor -> Bool
compare :: Descriptor -> Descriptor -> Ordering
$ccompare :: Descriptor -> Descriptor -> Ordering
$cp1Ord :: Eq Descriptor
Ord, ReadPrec [Descriptor]
ReadPrec Descriptor
Int -> ReadS Descriptor
ReadS [Descriptor]
(Int -> ReadS Descriptor)
-> ReadS [Descriptor]
-> ReadPrec Descriptor
-> ReadPrec [Descriptor]
-> Read Descriptor
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Descriptor]
$creadListPrec :: ReadPrec [Descriptor]
readPrec :: ReadPrec Descriptor
$creadPrec :: ReadPrec Descriptor
readList :: ReadS [Descriptor]
$creadList :: ReadS [Descriptor]
readsPrec :: Int -> ReadS Descriptor
$creadsPrec :: Int -> ReadS Descriptor
Read, Int -> Descriptor -> ShowS
[Descriptor] -> ShowS
Descriptor -> String
(Int -> Descriptor -> ShowS)
-> (Descriptor -> String)
-> ([Descriptor] -> ShowS)
-> Show Descriptor
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Descriptor] -> ShowS
$cshowList :: [Descriptor] -> ShowS
show :: Descriptor -> String
$cshow :: Descriptor -> String
showsPrec :: Int -> Descriptor -> ShowS
$cshowsPrec :: Int -> Descriptor -> ShowS
Show)

data AEvent
  = SocketAccepted Socket Peer
  | SocketRead String
  | SocketWritable
  | TimerAlarm
  | XEvent (WindowId, XEvent) 
  deriving (Int -> AEvent -> ShowS
[AEvent] -> ShowS
AEvent -> String
(Int -> AEvent -> ShowS)
-> (AEvent -> String) -> ([AEvent] -> ShowS) -> Show AEvent
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AEvent] -> ShowS
$cshowList :: [AEvent] -> ShowS
show :: AEvent -> String
$cshow :: AEvent -> String
showsPrec :: Int -> AEvent -> ShowS
$cshowsPrec :: Int -> AEvent -> ShowS
Show,ReadPrec [AEvent]
ReadPrec AEvent
Int -> ReadS AEvent
ReadS [AEvent]
(Int -> ReadS AEvent)
-> ReadS [AEvent]
-> ReadPrec AEvent
-> ReadPrec [AEvent]
-> Read AEvent
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [AEvent]
$creadListPrec :: ReadPrec [AEvent]
readPrec :: ReadPrec AEvent
$creadPrec :: ReadPrec AEvent
readList :: ReadS [AEvent]
$creadList :: ReadS [AEvent]
readsPrec :: Int -> ReadS AEvent
$creadsPrec :: Int -> ReadS AEvent
Read)

newtype DLHandle = DL DL deriving Int -> DLHandle -> ShowS
[DLHandle] -> ShowS
DLHandle -> String
(Int -> DLHandle -> ShowS)
-> (DLHandle -> String) -> ([DLHandle] -> ShowS) -> Show DLHandle
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DLHandle] -> ShowS
$cshowList :: [DLHandle] -> ShowS
show :: DLHandle -> String
$cshow :: DLHandle -> String
showsPrec :: Int -> DLHandle -> ShowS
$cshowsPrec :: Int -> DLHandle -> ShowS
Show

instance Read DLHandle