named sds's
[mTask.git] / Devices / mTaskTCP.icl
index bf05e05..5373d50 100644 (file)
@@ -1,28 +1,64 @@
 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 =  catchAll (
-               tcpconnect s.host s.port channels {ConnectionHandlers|
+       synFun s channels
+       | not (trace_tn "synFun started") = undef
+       = tcpconnect s.host s.port channels {ConnectionHandlers|
                                onConnect=onConnect,
-                               whileConnected=whileConnected,
-                               onDisconnect=onDisconnect} @! ())
-               (\v->traceValue v @! ())
+                               onData=onData,
+                               onShareChange=onShareChange,
+                               onDisconnect=onDisconnect}
+                               >>| throw "Device disconnected"
                where
-                       onConnect :: String ([MTaskMSGRecv],[MTaskMSGSend],Bool) -> (MaybeErrorString String, Maybe ([MTaskMSGRecv],[MTaskMSGSend],Bool), [String], Bool)
-                       onConnect _ (msgs,send,sendStopped) = (Ok "", Just (msgs,[],sendStopped), map encode send, False)
+                       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)
 
-                       whileConnected :: (Maybe String) String ([MTaskMSGRecv], [MTaskMSGSend],Bool) -> (MaybeErrorString String, Maybe ([MTaskMSGRecv],[MTaskMSGSend],Bool), [String], Bool)
-                       whileConnected Nothing acc (msgs,send,sendStopped) = (Ok acc, Nothing, [], False)
-                       whileConnected (Just newData) acc (msgs,send,sendStopped) = (Ok acc, Just (msgs ++ [decode newData],[],False), 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)
                        
-                       onDisconnect :: String ([MTaskMSGRecv],[MTaskMSGSend],Bool) -> (MaybeErrorString String, Maybe ([MTaskMSGRecv],[MTaskMSGSend],Bool))
-                       onDisconnect l (msgs,send,sendStopped) = (Ok l, Nothing)
+                       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))