pike.git / lib / modules / Protocols.pmod / Line.pmod

version» Context lines:

pike.git/lib/modules/Protocols.pmod/Line.pmod:1:   /* -  * $Id: Line.pmod,v 1.1 1998/05/27 20:56:39 grubba Exp $ +  * $Id: Line.pmod,v 1.2 1998/09/12 12:53:14 grubba Exp $    *    * Line-buffered protocol handling.    *    * Henrik Grubbström 1998-05-27    */      class simple   {    static object con;       function handle_data;    void handle_command(string data);    -  +  static int timeout; // Idle time before timeout. +  static int timeout_time; // Time at which next timeout will occur. +  +  static void do_timeout() +  { +  if (con) { +  catch { +  con->close(); +  }; +  catch { +  destruct(con); +  }; +  } +  } +  +  static void _timeout_cb() +  { +  if (timeout > 0) { +  // Timeouts are enabled. +  +  int t = time(); +  +  if (t >= timeout_time) { +  // Time out +  do_timeout(); +  } else { +  // Not yet. +  call_out(_timeout_cb, timeout_time - t); +  } +  } +  } +  +  void touch_time() +  { +  if (timeout > 0) { +  timeout_time = time() + timeout; +  } +  } +     static string multi_line_buffer = "";    static void _handle_command(string line)    {    if (handle_data) {    if (line != ".") {    multi_line_buffer += line + "\r\n";    } else {    function handle = handle_data;    string data = multi_line_buffer;    handle_data = 0;
pike.git/lib/modules/Protocols.pmod/Line.pmod:27:    handle(data);    }    } else {    handle_command(line);    }    }       static string read_buffer = "";    static void read_callback(mixed ignored, string data)    { +  touch_time(); +     read_buffer += data;       while(1) {    int i = search(read_buffer, "\r\n");    if (i == -1) {    return;    }    data = read_buffer[..i-1]; // Not the "\r\n".    read_buffer = read_buffer[i+2..];    _handle_command(data);
pike.git/lib/modules/Protocols.pmod/Line.pmod:49:    return;    }    }    }       object(ADT.queue) send_q = ADT.queue();       static string write_buffer = "";    static void write_callback(mixed ignored)    { +  touch_time(); +     while (!sizeof(write_buffer)) {    if (send_q->is_empty()) {    con->set_write_callback(0);    return;    } else {    write_buffer = send_q->get();    if (!write_buffer) {    // EOF    con->set_write_callback(0);    con->close();
pike.git/lib/modules/Protocols.pmod/Line.pmod:109:       static void close_callback()    {    if (handle_data || sizeof(read_buffer) || sizeof(multi_line_buffer)) {    werror("close_callback(): Unexpected close!\n");    }    con->close();    con = 0;    }    -  void create(object con_) +  void create(object con_, int|void timeout_)    {    con = con_; -  +  timeout = timeout_; +  +  // Start the timeout handler. +  touch_time(); +  _timeout_cb(); +     con->set_nonblocking(read_callback, 0, close_callback);    }   };      class smtp_style   {    inherit simple;       constant errorcodes = ([]);