net.server_select: Remove some debugging code.
[prosody.git] / net / server_event.lua
index dde13e615788ed03277cf74cdfaa131844b7c9d7..43e70a0f7f135a0e1e7d4eb9915ad5ca7f18df2b 100644 (file)
@@ -282,8 +282,21 @@ do
                        return nointerface, noreading, nowriting
        end
        
+       --TODO: Deprecate
        function interface_mt:lock_read(switch)
-               return self:_lock(self.nointerface, switch, self.nowriting);
+               if switch then
+                       return self:pause();
+               else
+                       return self:resume();
+               end
+       end
+
+       function interface_mt:pause()
+               return self:_lock(self.nointerface, true, self.nowriting);
+       end
+
+       function interface_mt:resume()
+               return self:_lock(self.nointerface, false, self.nowriting);
        end
 
        function interface_mt:counter(c)
@@ -389,6 +402,13 @@ do
                        self.starttls = false; -- prevent starttls()
                end
        end
+
+       function interface_mt:set_mode(pattern)
+               if pattern then
+                       self._pattern = pattern;
+               end
+               return self._pattern;
+       end
        
        function interface_mt:set_send(new_send)
                -- No-op, we always use the underlying connection's send
@@ -445,6 +465,8 @@ do
        end
        function interface_mt:ontimeout()
        end
+       function interface_mt:ondrain()
+       end
        function interface_mt:onstatus()
                debug("server.lua: Dummy onstatus()")
        end
@@ -525,6 +547,7 @@ do
                                if succ then  -- writing succesful
                                        interface.writebuffer = ""
                                        interface.writebufferlen = 0
+                                       interface:ondrain();
                                        if interface.fatalerror then
                                                debug "closing client after writing"
                                                interface:_close()  -- close interface if needed
@@ -586,7 +609,7 @@ do
                                                interface.eventreadtimeout = nil
                                        end
                                end
-                               local buffer, err, part = interface.conn:receive( pattern )  -- receive buffer with "pattern"
+                               local buffer, err, part = interface.conn:receive( interface._pattern )  -- receive buffer with "pattern"
                                --vdebug( "read data:", tostring(buffer), "error:", tostring(err), "part:", tostring(part) )
                                buffer = buffer or part or ""
                                local len = string_len( buffer )
@@ -822,11 +845,32 @@ function hook_signal(signal_num, handler)
        return signal_events[signal_num];
 end
 
+local function link(sender, receiver, buffersize)
+       sender:set_mode(buffersize);
+       local sender_locked;
+       
+       function receiver:ondrain()
+               if sender_locked then
+                       sender:resume();
+                       sender_locked = nil;
+               end
+       end
+       
+       function sender:onincoming(data)
+               receiver:write(data);
+               if receiver.writebufferlen >= buffersize then
+                       sender_locked = true;
+                       sender:pause();
+               end
+       end
+end
+
 return {
 
        cfg = cfg,
        base = base,
        loop = loop,
+       link = link,
        event = event,
        event_base = base,
        addevent = newevent,