--- /dev/null
+# -*-pyrex-*-
+#
+# $Id$
+#
+# File selectors
+#
+# (c) 2005 Straylight/Edgeware
+#
+
+#----- Licensing notice -----------------------------------------------------
+#
+# This file is part of the Python interface to mLib.
+#
+# mLib/Python is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# mLib/Python is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with mLib/Python; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+SEL_READ = _SEL_READ
+SEL_WRITE = _SEL_WRITE
+SEL_EXCEPT = _SEL_EXC
+
+cdef class SelFile:
+ cdef sel_file f
+ cdef int _activep
+ cdef readonly unsigned mode
+ cdef _readyfunc
+ def __new__(me, fd, int mode = SEL_READ, readyproc = None,
+ *hunoz, **hukairz):
+ if (mode != _SEL_READ and
+ mode != _SEL_WRITE and
+ mode != _SEL_EXC):
+ raise ValueError, 'bad select mode'
+ sel_initfile(&_sel, &me.f, _getfd(fd), mode, _filefunc, <void *>me)
+ me._activep = 0
+ me.mode = mode
+ me._ready = _checkcallable(readyproc, 'ready proc')
+ def __dealloc__(me):
+ if me._activep:
+ sel_rmfile(&me.f)
+ property fd:
+ def __get__(me):
+ return me.f.fd
+ property activep:
+ def __get__(me):
+ return _tobool(me._activep)
+ property readyproc:
+ def __get__(me):
+ return me._ready
+ def __set__(me, proc):
+ me._ready = _checkcallable(proc, 'ready proc')
+ def __del__(me):
+ me._ready = None
+ def enable(me):
+ if me._activep:
+ raise ValueError, 'already enabled'
+ sel_addfile(&me.f)
+ me._enabled()
+ return me
+ def disable(me):
+ if not me._activep:
+ raise ValueError, 'already disabled'
+ sel_rmfile(&me.f)
+ me._disabled()
+ return me
+ def force(me):
+ sel_force(&me.f)
+ return me
+ cdef _enabled(me):
+ me._activep = 1
+ me.enabled()
+ cdef _disabled(me):
+ me._activep = 0
+ me.disabled()
+ def enabled(me):
+ pass
+ def disabled(me):
+ pass
+ def ready(me):
+ return _maybecall(me._ready, ())
+
+cdef void _filefunc(int fd, unsigned mode, void *arg):
+ cdef SelFile sf
+ sf = <SelFile>arg
+ sf.ready()
+
+#----- That's all, folks ----------------------------------------------------