implementation module Devices.mTaskTCP import GenPrint import StdDebug import Devices.mTaskDevice import iTasks from Data.Tuple import appSnd from Data.Maybe import fromMaybe from Text import class Text(indexOf), instance Text String derive class iTask TCPSettings derive gPrint MTaskMSGRecv getmTaskTCPDevice :: Task MTaskResource getmTaskTCPDevice = TCPDevice <$> enterInformation "Settings" [] instance MTaskDuplex TCPSettings where synFun :: TCPSettings (Shared Channels) -> Task () synFun s channels = tcpconnect s.host s.port channels {ConnectionHandlers| onConnect=onConnect, whileConnected=whileConnected, onDisconnect=onDisconnect} @! () where onConnect :: String ([MTaskMSGRecv],[MTaskMSGSend],Bool) -> (MaybeErrorString String, Maybe ([MTaskMSGRecv],[MTaskMSGSend],Bool), [String], Bool) onConnect acc (msgs,send,sendStopped) = (Ok "", Just (msgs,[],sendStopped), map encode send, False) whileConnected :: (Maybe String) String ([MTaskMSGRecv], [MTaskMSGSend],Bool) -> (MaybeErrorString String, Maybe ([MTaskMSGRecv],[MTaskMSGSend],Bool), [String], Bool) //We stop whileConnected _ _ (_,_,True) = (Ok "", Nothing, [], True) //No new data and nothing to send whileConnected Nothing acc (_,[],_) = (Ok acc, Nothing, [], False) //New data and possibly something to send whileConnected newdata acc (msgs,send,sendStopped) # (acc, nd) = process (acc +++ fromMaybe "" newdata) | isEmpty nd && isEmpty send = (Ok acc, Nothing, [], False) = (Ok acc, Just (msgs++map decode nd,[],sendStopped), map encode send, False) process :: String -> (String, [String]) process s | not (trace_tn ("process: " +++ toString (toJSON s))) = undef = case indexOf "\n" s of -1 = (s, []) i = appSnd (\ss->[s % (0,i-1):ss]) (process (s % (i+1, size s))) onDisconnect :: String ([MTaskMSGRecv],[MTaskMSGSend],Bool) -> (MaybeErrorString String, Maybe ([MTaskMSGRecv],[MTaskMSGSend],Bool)) onDisconnect _ (msgs,send,sendStopped) = (Ok "", Nothing)