| 29 | |
| 30 | |
| 31 | class Selectable(object): |
| 32 | |
| 33 | def __init__( |
| 34 | self, |
| 35 | delegate: Optional[Union['EventInjector', 'socket']], |
| 36 | reactor: 'Container', |
| 37 | ) -> None: |
| 38 | self._delegate = delegate |
| 39 | self.reading = False |
| 40 | self.writing = False |
| 41 | self._deadline = 0 |
| 42 | self._terminal = False |
| 43 | self._released = False |
| 44 | self._terminated = False |
| 45 | self._reactor = reactor |
| 46 | self.push_event(self, Event.SELECTABLE_INIT) |
| 47 | |
| 48 | def close(self) -> None: |
| 49 | if self._delegate and not self._released: |
| 50 | self._delegate.close() |
| 51 | |
| 52 | def fileno(self) -> int: |
| 53 | if self._delegate: |
| 54 | return self._delegate.fileno() |
| 55 | else: |
| 56 | return PN_INVALID_SOCKET |
| 57 | |
| 58 | def __getattr__(self, name: str) -> Any: |
| 59 | return getattr(self._delegate, name) |
| 60 | |
| 61 | @property |
| 62 | def deadline(self) -> Optional[float]: |
| 63 | tstamp = self._deadline |
| 64 | if tstamp: |
| 65 | return tstamp |
| 66 | else: |
| 67 | return None |
| 68 | |
| 69 | @deadline.setter |
| 70 | def deadline(self, deadline: Optional[float]) -> None: |
| 71 | if not deadline: |
| 72 | self._deadline = 0 |
| 73 | else: |
| 74 | self._deadline = deadline |
| 75 | |
| 76 | def push_event( |
| 77 | self, |
| 78 | context: 'Selectable', |
| 79 | etype: 'EventType', |
| 80 | ) -> None: |
| 81 | self._reactor.push_event(context, etype) |
| 82 | |
| 83 | def update(self) -> None: |
| 84 | if not self._terminated: |
| 85 | if self._terminal: |
| 86 | self._terminated = True |
| 87 | self.push_event(self, Event.SELECTABLE_FINAL) |
| 88 | else: |