idris-0.9.3: lib/network/sockets.idr
%include "network.h"
%lib "network.o"
f_netTest = mkForeign (FFun "netTest" (Cons FStr (Cons FInt Nil)) FInt);
[%nocg]
f_clientSocket = mkForeign (FFun "net_UDP_clientSocket"
(Cons FStr (Cons FInt Nil)) FPtr); [%eval]
f_serverSocket = mkForeign (FFun "net_UDP_serverSocket"
(Cons FInt Nil) FPtr); [%eval]
f_send = mkForeign (FFun "net_sendUDP"
(Cons FPtr (Cons FStr (Cons FInt (Cons FStr Nil)))) FInt); [%eval]
f_recv = mkForeign (FFun "net_recvUDP"
(Cons FPtr Nil) FPtr); [%eval]
f_recvBuf = mkForeign (FFun "get_recvBuf"
(Cons FPtr Nil) FStr); [%eval]
f_recvServer = mkForeign (FFun "get_recvServer"
(Cons FPtr Nil) FStr); [%eval]
f_recvPort = mkForeign (FFun "get_recvPort"
(Cons FPtr Nil) FInt); [%eval]
f_nullPtr = mkForeign (FFun "nullPtr" (Cons FPtr Nil) FInt); [%eval]
nullPtr : Ptr -> (IO Bool);
nullPtr ptr = do { p <- f_nullPtr ptr;
return (if_then_else (p==1) True False);
};
data Socket = mkCon Ptr;
data Recv = mkRecv String String Int
| noRecv;
clientSocket : String -> Int -> (IO Socket);
clientSocket server port = do {
sock <- f_clientSocket server port;
return (mkCon sock); };
serverSocket : Int -> (IO Socket);
serverSocket port = do {
sock <- f_serverSocket port;
return (mkCon sock); };
sendTo : Socket -> String -> Int -> String -> (IO ());
sendTo (mkCon c) server port dat
= do { v <- f_send c server port dat;
return II; };
doMkRecv : Bool -> Ptr -> (IO Recv);
doMkRecv True _ = return noRecv;
doMkRecv False rcv = do {
buf <- f_recvBuf rcv;
server <- f_recvServer rcv;
port <- f_recvPort rcv;
-- putStrLn ("Port from connection is " ++ (__toString port));
return (mkRecv buf server port);
};
recvFrom : Socket -> (IO Recv);
recvFrom (mkCon c) = do {
rcv <- f_recv c;
nul <- nullPtr rcv;
doMkRecv nul rcv;
};
recvOK : Recv -> Bool;
recvOK (mkRecv _ _ _) = True;
recvOK noRecv = False;
recvStr : Recv -> String;
recvStr (mkRecv buf server port) = buf;
recvServer : Recv -> String;
recvServer (mkRecv buf server port) = server;
recvPort : Recv -> Int;
recvPort (mkRecv buf server port) = port;