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" [] :: ChD :== ([MTaskMSGRecv], [MTaskMSGSend], Bool) instance MTaskDuplex TCPSettings where synFun :: TCPSettings (Shared Channels) -> Task () synFun s channels | not (trace_tn "synFun started") = undef = tcpconnect s.host s.port channels {ConnectionHandlers| onConnect=onConnect, onData=onData, onShareChange=onShareChange, onDisconnect=onDisconnect} >>| throw "Device disconnected" where onConnect :: String ChD -> (MaybeErrorString String, Maybe ChD, [String], Bool) onConnect acc (msgs,send,sendStopped) | not (trace_tn "onConnect") = undef | isEmpty send = (Ok "", Nothing, [], False) = (Ok "", Just (msgs, [], sendStopped), map encode send, False) onData :: String String ChD -> (MaybeErrorString String, Maybe ChD, [String], Bool) onData newdata acc (msgs,send,True) | not (trace_tn "onData: stop") = undef = (Ok acc, Nothing, [], True) onData newdata acc (msgs,send,sendStopped) | not (trace_tn "onData: notstop") = undef # split = indexOf "\n" newdata | split == -1 = (Ok acc, Just (msgs, send, False), [], False) # newMsg = decode (newdata % (0, split-1)) // Recurse with smaller data, empty accumulator and new message = onData (newdata % (split+1, size newdata - split)) "" (msgs ++ [newMsg], send, False) onShareChange :: String ChD -> (MaybeErrorString String, Maybe ChD, [String], Bool) // Stop! onShareChange acc (msgs,send,True) | not (trace_tn "onSC: stop") = undef = (Ok acc, Nothing, [], True) // Nothing to send onShareChange acc (msgs,[], _) = (Ok acc, Nothing, [], False) // Something to send onShareChange acc (msgs,send, ss) | not (trace_tn "onSC: send") = undef = (Ok acc, Just (msgs,[],ss), map encode send, False) onDisconnect :: String ChD -> (MaybeErrorString String, Maybe ChD) onDisconnect _ (msgs,send,_) | not (trace_tn "ondisconnect") = undef = (Ok "", Just ([], [], True))