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

Reply via email to