packages feed

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;