Package proton :: Module _reactor_impl
[frames] | no frames]

Source Code for Module proton._reactor_impl

  1  # 
  2  # Licensed to the Apache Software Foundation (ASF) under one 
  3  # or more contributor license agreements.  See the NOTICE file 
  4  # distributed with this work for additional information 
  5  # regarding copyright ownership.  The ASF licenses this file 
  6  # to you under the Apache License, Version 2.0 (the 
  7  # "License"); you may not use this file except in compliance 
  8  # with the License.  You may obtain a copy of the License at 
  9  # 
 10  #   http://www.apache.org/licenses/LICENSE-2.0 
 11  # 
 12  # Unless required by applicable law or agreed to in writing, 
 13  # software distributed under the License is distributed on an 
 14  # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
 15  # KIND, either express or implied.  See the License for the 
 16  # specific language governing permissions and limitations 
 17  # under the License. 
 18  # 
 19   
 20  from __future__ import absolute_import 
 21   
 22  import weakref 
 23   
 24  from cproton import PN_INVALID_SOCKET, \ 
 25      pn_incref, pn_decref, \ 
 26      pn_handler_add, pn_handler_clear, pn_pyhandler, \ 
 27      pn_selectable_is_reading, pn_selectable_attachments, pn_selectable_set_reading, \ 
 28      pn_selectable_expired, pn_selectable_set_fd, pn_selectable_set_registered, pn_selectable_writable, \ 
 29      pn_selectable_is_writing, pn_selectable_set_deadline, pn_selectable_is_registered, pn_selectable_terminate, \ 
 30      pn_selectable_get_deadline, pn_selectable_is_terminal, pn_selectable_readable, \ 
 31      pn_selectable_release, pn_selectable_set_writing, pn_selectable_get_fd 
 32   
 33  from ._common import millis2secs, secs2millis 
 34  from ._wrapper import Wrapper 
 35   
 36  from . import _compat 
 37   
 38  _DEFAULT = False 
39 40 41 -class Selectable(Wrapper):
42 43 @staticmethod
44 - def wrap(impl):
45 if impl is None: 46 return None 47 else: 48 return Selectable(impl)
49
50 - def __init__(self, impl):
51 Wrapper.__init__(self, impl, pn_selectable_attachments)
52
53 - def _init(self):
54 pass
55
56 - def fileno(self, fd=_DEFAULT):
57 if fd is _DEFAULT: 58 return pn_selectable_get_fd(self._impl) 59 elif fd is None: 60 pn_selectable_set_fd(self._impl, PN_INVALID_SOCKET) 61 else: 62 pn_selectable_set_fd(self._impl, fd)
63
64 - def _is_reading(self):
65 return pn_selectable_is_reading(self._impl)
66
67 - def _set_reading(self, val):
68 pn_selectable_set_reading(self._impl, bool(val))
69 70 reading = property(_is_reading, _set_reading) 71
72 - def _is_writing(self):
73 return pn_selectable_is_writing(self._impl)
74
75 - def _set_writing(self, val):
76 pn_selectable_set_writing(self._impl, bool(val))
77 78 writing = property(_is_writing, _set_writing) 79
80 - def _get_deadline(self):
81 tstamp = pn_selectable_get_deadline(self._impl) 82 if tstamp: 83 return millis2secs(tstamp) 84 else: 85 return None
86
87 - def _set_deadline(self, deadline):
88 pn_selectable_set_deadline(self._impl, secs2millis(deadline))
89 90 deadline = property(_get_deadline, _set_deadline) 91
92 - def readable(self):
93 pn_selectable_readable(self._impl)
94
95 - def writable(self):
96 pn_selectable_writable(self._impl)
97
98 - def expired(self):
99 pn_selectable_expired(self._impl)
100
101 - def _is_registered(self):
102 return pn_selectable_is_registered(self._impl)
103
104 - def _set_registered(self, registered):
105 pn_selectable_set_registered(self._impl, registered)
106 107 registered = property(_is_registered, _set_registered, 108 doc=""" 109 The registered property may be get/set by an I/O polling system to 110 indicate whether the fd has been registered or not. 111 """) 112 113 @property
114 - def is_terminal(self):
115 return pn_selectable_is_terminal(self._impl)
116
117 - def terminate(self):
118 pn_selectable_terminate(self._impl)
119
120 - def release(self):
121 pn_selectable_release(self._impl)
122
123 124 -class _cadapter:
125
126 - def __init__(self, handler, on_error=None):
127 self.handler = handler 128 self.on_error = on_error
129
130 - def dispatch(self, cevent, ctype):
131 from ._events import Event 132 ev = Event.wrap(cevent, ctype) 133 ev.dispatch(self.handler)
134
135 - def exception(self, exc, val, tb):
136 if self.on_error is None: 137 _compat.raise_(exc, val, tb) 138 else: 139 self.on_error((exc, val, tb))
140
141 142 -class WrappedHandlersChildSurrogate:
143 - def __init__(self, delegate):
144 self.handlers = [] 145 self.delegate = weakref.ref(delegate)
146
147 - def on_unhandled(self, method, event):
148 from ._events import _dispatch 149 delegate = self.delegate() 150 if delegate: 151 _dispatch(delegate, method, event)
152
153 154 -class WrappedHandlersProperty(object):
155 - def __get__(self, obj, clazz):
156 if obj is None: 157 return None 158 return self.surrogate(obj).handlers
159
160 - def __set__(self, obj, value):
161 self.surrogate(obj).handlers = value
162
163 - def surrogate(self, obj):
164 key = "_surrogate" 165 objdict = obj.__dict__ 166 surrogate = objdict.get(key, None) 167 if surrogate is None: 168 objdict[key] = surrogate = WrappedHandlersChildSurrogate(obj) 169 obj.add(surrogate) 170 return surrogate
171
172 173 -class WrappedHandler(Wrapper):
174 handlers = WrappedHandlersProperty() 175 176 @classmethod
177 - def wrap(cls, impl, on_error=None):
178 if impl is None: 179 return None 180 else: 181 handler = cls(impl) 182 handler.__dict__["on_error"] = on_error 183 return handler
184
185 - def __init__(self, impl_or_constructor):
186 Wrapper.__init__(self, impl_or_constructor) 187 if list(self.__class__.__mro__).index(WrappedHandler) > 1: 188 # instantiate the surrogate 189 self.handlers.extend([])
190
191 - def _on_error(self, info):
192 on_error = getattr(self, "on_error", None) 193 if on_error is None: 194 _compat.raise_(info[0], info[1], info[2]) 195 else: 196 on_error(info)
197
198 - def add(self, handler, on_error=None):
199 if handler is None: return 200 if on_error is None: on_error = self._on_error 201 impl = _chandler(handler, on_error) 202 pn_handler_add(self._impl, impl) 203 pn_decref(impl)
204
205 - def clear(self):
206 pn_handler_clear(self._impl)
207
208 209 -def _chandler(obj, on_error=None):
210 if obj is None: 211 return None 212 elif isinstance(obj, WrappedHandler): 213 impl = obj._impl 214 pn_incref(impl) 215 return impl 216 else: 217 return pn_pyhandler(_cadapter(obj, on_error))
218