Enlightenment CVS committal Author : cmarcelo Project : e17 Module : proto/python-efl
Dir : e17/proto/python-efl/python-evas/evas Modified Files: evas.c_evas_object_events.pxi evas.c_evas_object.pxi evas.c_evas_object_callbacks.pxi Log Message: Add protection code for event objects, avoiding invalid references. Event objects are meant to be used only inside the callbacks, so any access after the callback returns will be considered invalid and raise a ValueError. The first idea (reverted by previous patch) was to make these objects without any reference to original event (copying data), so they couldn't cause trouble. But now we will have event_flags field, which is writeable by the callbacks, so it's better just keep the reference and invalidate the object as we do. =================================================================== RCS file: /cvs/e/e17/proto/python-efl/python-evas/evas/evas.c_evas_object_events.pxi,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- evas.c_evas_object_events.pxi 26 Mar 2008 04:36:27 -0000 1.4 +++ evas.c_evas_object_events.pxi 26 Mar 2008 04:41:15 -0000 1.5 @@ -4,25 +4,38 @@ cdef void _set_obj(self, Evas_Point *obj): self.obj = obj + cdef void _unset_obj(self): + self.obj = NULL + def __str__(self): + self._check_validity() return "%s(%d, %d)" % (self.__class__.__name__, self.obj.x, self.obj.y) + cdef void _check_validity(self) except *: + if self.obj == NULL: + raise ValueError("EventPoint object is invalid.") + property x: def __get__(self): + self._check_validity() return self.obj.x property y: def __get__(self): + self._check_validity() return self.obj.y property xy: def __get__(self): + self._check_validity() return (self.obj.x, self.obj.y) def __len__(self): + self._check_validity() return 2 def __getitem__(self, int index): + self._check_validity() if index == 0: return self.obj.x elif index == 1: @@ -39,6 +52,10 @@ self.canvas = EventPoint() self.canvas._set_obj(<Evas_Point*>canvas) + cdef void _unset_objs(self): + self.output._unset_obj() + self.canvas._unset_obj() + def __str__(self): return "%s(output=(%d, %d), canvas=(%d, %d))" % \ (self.__class__.__name__, self.output.x, self.output.y, @@ -52,7 +69,16 @@ self.position = EventPosition() self.position._set_objs(&self.obj.output, &self.obj.canvas) + cdef void _unset_obj(self): + self.obj = NULL + self.position._unset_objs() + + cdef void _check_validity(self) except *: + if self.obj == NULL: + raise ValueError("EventMouseIn object is invalid.") + def __str__(self): + self._check_validity() return ("%s(buttons=%d, output=(%d, %d), canvas=(%d, %d), " "timestamp=%d)") % \ (self.__class__.__name__, self.obj.buttons, @@ -62,10 +88,12 @@ property buttons: def __get__(self): + self._check_validity() return self.obj.buttons property timestamp: def __get__(self): + self._check_validity() return self.obj.timestamp @@ -75,7 +103,16 @@ self.position = EventPosition() self.position._set_objs(&self.obj.output, &self.obj.canvas) + cdef void _unset_obj(self): + self.obj = NULL + self.position._unset_objs() + + cdef void _check_validity(self) except *: + if self.obj == NULL: + raise ValueError("EventMouseOut object is invalid.") + def __str__(self): + self._check_validity() return ("%s(buttons=%d, output=(%d, %d), canvas=(%d, %d), " "timestamp=%d)") % \ (self.__class__.__name__, self.obj.buttons, @@ -85,10 +122,12 @@ property buttons: def __get__(self): + self._check_validity() return self.obj.buttons property timestamp: def __get__(self): + self._check_validity() return self.obj.timestamp @@ -98,7 +137,16 @@ self.position = EventPosition() self.position._set_objs(&self.obj.output, &self.obj.canvas) + cdef void _unset_obj(self): + self.obj = NULL + self.position._unset_objs() + + cdef void _check_validity(self) except *: + if self.obj == NULL: + raise ValueError("EventMouseDown object is invalid.") + def __str__(self): + self._check_validity() return ("%s(button=%d, output=(%d, %d), canvas=(%d, %d), " "timestamp=%d)") % \ (self.__class__.__name__, self.obj.button, @@ -108,10 +156,12 @@ property button: def __get__(self): + self._check_validity() return self.obj.button property timestamp: def __get__(self): + self._check_validity() return self.obj.timestamp @@ -121,7 +171,16 @@ self.position = EventPosition() self.position._set_objs(&self.obj.output, &self.obj.canvas) + cdef void _unset_obj(self): + self.obj = NULL + self.position._unset_objs() + + cdef void _check_validity(self) except *: + if self.obj == NULL: + raise ValueError("EventMouseUp object is invalid.") + def __str__(self): + self._check_validity() return ("%s(button=%d, output=(%d, %d), canvas=(%d, %d), " "timestamp=%d)") % \ (self.__class__.__name__, self.obj.button, @@ -131,10 +190,12 @@ property button: def __get__(self): + self._check_validity() return self.obj.button property timestamp: def __get__(self): + self._check_validity() return self.obj.timestamp @@ -147,7 +208,17 @@ self.prev_position._set_objs(&self.obj.prev.output, &self.obj.prev.canvas) + cdef void _unset_obj(self): + self.obj = NULL + self.position._unset_objs() + self.prev_position._unset_objs() + + cdef void _check_validity(self) except *: + if self.obj == NULL: + raise ValueError("EventMouseMove object is invalid.") + def __str__(self): + self._check_validity() return ("%s(buttons=%d, output=(%d, %d), canvas=(%d, %d), " "prev_output=(%d, %d), prev_canvas=(%d, %d), timestamp=%d)") %\ (self.__class__.__name__, self.obj.buttons, @@ -159,10 +230,12 @@ property buttons: def __get__(self): + self._check_validity() return self.obj.buttons property timestamp: def __get__(self): + self._check_validity() return self.obj.timestamp @@ -172,7 +245,16 @@ self.position = EventPosition() self.position._set_objs(&self.obj.output, &self.obj.canvas) + cdef void _unset_obj(self): + self.obj = NULL + self.position._unset_objs() + + cdef void _check_validity(self) except *: + if self.obj == NULL: + raise ValueError("EventMouseWheel object is invalid.") + def __str__(self): + self._check_validity() return ("%s(direction=%d, z=%d, output=(%d, %d), " "canvas=(%d, %d), timestamp=%d)") % \ (self.__class__.__name__, self.obj.direction, self.obj.z, @@ -182,14 +264,17 @@ property timestamp: def __get__(self): + self._check_validity() return self.obj.timestamp property direction: def __get__(self): + self._check_validity() return self.obj.direction property z: def __get__(self): + self._check_validity() return self.obj.z @@ -197,7 +282,15 @@ cdef void _set_obj(self, void *ptr): self.obj = <Evas_Event_Key_Down*>ptr + cdef void _unset_obj(self): + self.obj = NULL + + cdef void _check_validity(self) except *: + if self.obj == NULL: + raise ValueError("EventKeyDown object is invalid.") + def __str__(self): + self._check_validity() return ("%s(keyname=%r, key=%r, string=%r, compose=%r, " "timestamp=%d)") % \ (self.__class__.__name__, self.keyname, @@ -206,6 +299,7 @@ property keyname: def __get__(self): + self._check_validity() if self.obj.keyname == NULL: return None else: @@ -213,6 +307,7 @@ property key: def __get__(self): + self._check_validity() if self.obj.key == NULL: return None else: @@ -220,6 +315,7 @@ property string: def __get__(self): + self._check_validity() if self.obj.string == NULL: return None else: @@ -227,6 +323,7 @@ property compose: def __get__(self): + self._check_validity() if self.obj.compose == NULL: return None else: @@ -234,6 +331,7 @@ property timestamp: def __get__(self): + self._check_validity() return self.obj.timestamp @@ -241,7 +339,15 @@ cdef void _set_obj(self, void *ptr): self.obj = <Evas_Event_Key_Up*>ptr + cdef void _unset_obj(self): + self.obj = NULL + + cdef void _check_validity(self) except *: + if self.obj == NULL: + raise ValueError("EventKeyUp object is invalid.") + def __str__(self): + self._check_validity() return ("%s(keyname=%r, key=%r, string=%r, compose=%r, " "timestamp=%d)") % \ (self.__class__.__name__, self.keyname, @@ -250,6 +356,7 @@ property keyname: def __get__(self): + self._check_validity() if self.obj.keyname == NULL: return None else: @@ -257,6 +364,7 @@ property key: def __get__(self): + self._check_validity() if self.obj.key == NULL: return None else: @@ -264,6 +372,7 @@ property string: def __get__(self): + self._check_validity() if self.obj.string == NULL: return None else: @@ -271,6 +380,7 @@ property compose: def __get__(self): + self._check_validity() if self.obj.compose == NULL: return None else: @@ -278,5 +388,6 @@ property timestamp: def __get__(self): + self._check_validity() return self.obj.timestamp =================================================================== RCS file: /cvs/e/e17/proto/python-efl/python-evas/evas/evas.c_evas_object.pxi,v retrieving revision 1.23 retrieving revision 1.24 diff -u -3 -r1.23 -r1.24 --- evas.c_evas_object.pxi 13 Nov 2007 21:55:33 -0000 1.23 +++ evas.c_evas_object.pxi 26 Mar 2008 04:41:15 -0000 1.24 @@ -869,6 +869,9 @@ C{EVAS_CALLBACK_MOUSE_*}, C{EVAS_CALLBACK_KEY_*}, while the second is used by events without. Parameters given at the end of C{event_callback_add()} will be given to the callback. + Note that the object passed to the callback in B{event} + parameter will only be valid during the callback, using it + after callback returns will raise an ValueError. @raise ValueError: if B{type} is unknown. @raise TypeError: if B{func} is not callable. =================================================================== RCS file: /cvs/e/e17/proto/python-efl/python-evas/evas/evas.c_evas_object_callbacks.pxi,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- evas.c_evas_object_callbacks.pxi 5 Nov 2007 21:47:48 -0000 1.6 +++ evas.c_evas_object_callbacks.pxi 26 Mar 2008 04:41:15 -0000 1.7 @@ -30,6 +30,7 @@ event = EventMouseIn() event._set_obj(e_inf) cb_dispatcher(<Object>data, event, EVAS_CALLBACK_MOUSE_IN) + event._unset_obj() cdef void cb_mouse_out(void *data, Evas *e, @@ -38,6 +39,7 @@ event = EventMouseOut() event._set_obj(e_inf) cb_dispatcher(<Object>data, event, EVAS_CALLBACK_MOUSE_OUT) + event._unset_obj() cdef void cb_mouse_down(void *data, Evas *e, @@ -46,6 +48,7 @@ event = EventMouseDown() event._set_obj(e_inf) cb_dispatcher(<Object>data, event, EVAS_CALLBACK_MOUSE_DOWN) + event._unset_obj() cdef void cb_mouse_up(void *data, Evas *e, @@ -54,6 +57,7 @@ event = EventMouseUp() event._set_obj(e_inf) cb_dispatcher(<Object>data, event, EVAS_CALLBACK_MOUSE_UP) + event._unset_obj() cdef void cb_mouse_move(void *data, Evas *e, @@ -62,6 +66,7 @@ event = EventMouseMove() event._set_obj(e_inf) cb_dispatcher(<Object>data, event, EVAS_CALLBACK_MOUSE_MOVE) + event._unset_obj() cdef void cb_mouse_wheel(void *data, Evas *e, @@ -70,6 +75,7 @@ event = EventMouseWheel() event._set_obj(e_inf) cb_dispatcher(<Object>data, event, EVAS_CALLBACK_MOUSE_WHEEL) + event._unset_obj() cdef void cb_free(void *data, Evas *e, @@ -83,6 +89,7 @@ event = EventKeyDown() event._set_obj(e_inf) cb_dispatcher(<Object>data, event, EVAS_CALLBACK_KEY_DOWN) + event._unset_obj() cdef void cb_key_up(void *data, Evas *e, @@ -91,6 +98,7 @@ event = EventKeyUp() event._set_obj(e_inf) cb_dispatcher(<Object>data, event, EVAS_CALLBACK_KEY_UP) + event._unset_obj() cdef void cb_focus_in(void *data, Evas *e, ------------------------------------------------------------------------- Check out the new SourceForge.net Marketplace. It's the best place to buy or sell services for just about anything Open Source. http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs