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
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs