small update
[mTask.git] / Devices / mTaskTCP.icl
index e0b85e2..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
@@ -13,20 +16,32 @@ getmTaskTCPDevice = TCPDevice <$> enterInformation "Settings" []
 
 instance MTaskDuplex TCPSettings where
        synFun :: TCPSettings (Shared Channels) -> Task ()
-       synFun s channels =  catchAll (
+       synFun s channels =
                tcpconnect s.host s.port channels {ConnectionHandlers|
                                onConnect=onConnect,
                                whileConnected=whileConnected,
-                               onDisconnect=onDisconnect} @! ())
-               (\v->traceValue v @! ())
+                               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 mnewData acc (msgs,send,sendStopped)
-                       | not (trace_tn (printToString (map decode (maybeToList mnewData)))) = undef
-                       = (Ok acc, Just (msgs ++ map decode (maybeToList mnewData),[],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 l (msgs,send,sendStopped) = (Ok l, Nothing)
+                       onDisconnect _ (msgs,send,sendStopped) = (Ok "", Nothing)