small update
[mTask.git] / Devices / mTaskTCP.icl
index 314799b..4ebc1ac 100644 (file)
@@ -4,6 +4,9 @@ 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
@@ -20,12 +23,25 @@ instance MTaskDuplex TCPSettings where
                                onDisconnect=onDisconnect} @! ()
                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 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)
-                       whileConnected Nothing _ (_,[],_) = (Ok "", Nothing, [], False)
-                       whileConnected md _ (msgs,send,sendStopped)
-                       = (Ok "", Just (msgs++map decode (maybeToList md),[],sendStopped), map encode send, False)
+                       //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)