gnash-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Gnash-commit] gnash ChangeLog server/as_object.cpp server/but...


From: Sandro Santilli
Subject: [Gnash-commit] gnash ChangeLog server/as_object.cpp server/but...
Date: Mon, 21 Jan 2008 16:02:51 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Sandro Santilli <strk>  08/01/21 16:02:51

Modified files:
        .              : ChangeLog 
        server         : as_object.cpp button_character_instance.cpp 
                         character.cpp character.h event_id.h 
                         namedStrings.cpp namedStrings.h 
                         sprite_instance.cpp 
        server/asobj   : xml.cpp 
        server/vm      : action.cpp 

Log message:
        Add more named strings, use them for event function "names" and in a few
        other places.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.5444&r2=1.5445
http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_object.cpp?cvsroot=gnash&r1=1.92&r2=1.93
http://cvs.savannah.gnu.org/viewcvs/gnash/server/button_character_instance.cpp?cvsroot=gnash&r1=1.76&r2=1.77
http://cvs.savannah.gnu.org/viewcvs/gnash/server/character.cpp?cvsroot=gnash&r1=1.74&r2=1.75
http://cvs.savannah.gnu.org/viewcvs/gnash/server/character.h?cvsroot=gnash&r1=1.121&r2=1.122
http://cvs.savannah.gnu.org/viewcvs/gnash/server/event_id.h?cvsroot=gnash&r1=1.13&r2=1.14
http://cvs.savannah.gnu.org/viewcvs/gnash/server/namedStrings.cpp?cvsroot=gnash&r1=1.8&r2=1.9
http://cvs.savannah.gnu.org/viewcvs/gnash/server/namedStrings.h?cvsroot=gnash&r1=1.10&r2=1.11
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.cpp?cvsroot=gnash&r1=1.453&r2=1.454
http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/xml.cpp?cvsroot=gnash&r1=1.65&r2=1.66
http://cvs.savannah.gnu.org/viewcvs/gnash/server/vm/action.cpp?cvsroot=gnash&r1=1.30&r2=1.31

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.5444
retrieving revision 1.5445
diff -u -b -r1.5444 -r1.5445
--- ChangeLog   21 Jan 2008 15:02:32 -0000      1.5444
+++ ChangeLog   21 Jan 2008 16:02:49 -0000      1.5445
@@ -1,3 +1,17 @@
+2008-01-21 Sandro Santilli <address@hidden>
+
+       * server/as_object.cpp, server/button_character_instance.cpp,
+         server/sprite_instance.cpp, server/asobj/xml.cpp: use new
+         named strings. This should be particularely effective for
+         sprite_instance::can_handle_mouse_event, which is called
+         on every mouse movement.
+       * server/character.{cpp,h}: add a getUserDefinedMethod() interface
+         taking a string_table::key.
+       * server/event_id.h, vm/action.cpp: add event_id::get_funtion_key
+         method.
+       * server/namedStrings.{cpp,h}: add more named strings
+         for core properties.
+
 2008-01-21 Benjamin Wolsey <address@hidden>
 
        * server/asobj/System.cpp: correct typo in server string, clean up.

Index: server/as_object.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/as_object.cpp,v
retrieving revision 1.92
retrieving revision 1.93
diff -u -b -r1.92 -r1.93
--- server/as_object.cpp        18 Jan 2008 17:48:26 -0000      1.92
+++ server/as_object.cpp        21 Jan 2008 16:02:50 -0000      1.93
@@ -863,14 +863,7 @@
 {
        as_value event_handler;
 
-       std::string handler_name = id.get_function_name();
-
-       if ( _vm.getSWFVersion() < 7 )
-       {
-               boost::to_lower(handler_name, _vm.getLocale());
-       }
-
-       if (get_member(_vm.getStringTable().find(handler_name), &event_handler) 
)
+       if (get_member(id.get_function_key(), &event_handler) )
        {
                call_method(event_handler, NULL, this, 0, 0);
                return true;

Index: server/button_character_instance.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/button_character_instance.cpp,v
retrieving revision 1.76
retrieving revision 1.77
diff -u -b -r1.76 -r1.77
--- server/button_character_instance.cpp        18 Jan 2008 17:48:26 -0000      
1.76
+++ server/button_character_instance.cpp        21 Jan 2008 16:02:50 -0000      
1.77
@@ -591,7 +591,7 @@
 
 
        // Call conventional attached method.
-       boost::intrusive_ptr<as_function> method = 
getUserDefinedEventHandler(event.get_function_name());
+       boost::intrusive_ptr<as_function> method = 
getUserDefinedEventHandler(event.get_function_key());
        if ( method )
        {
                call_method0(as_value(method.get()), &(get_environment()), 
this);

Index: server/character.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/character.cpp,v
retrieving revision 1.74
retrieving revision 1.75
diff -u -b -r1.74 -r1.75
--- server/character.cpp        20 Jan 2008 19:38:04 -0000      1.74
+++ server/character.cpp        21 Jan 2008 16:02:50 -0000      1.75
@@ -17,7 +17,7 @@
 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 // 
 
-/* $Id: character.cpp,v 1.74 2008/01/20 19:38:04 strk Exp $ */
+/* $Id: character.cpp,v 1.75 2008/01/21 16:02:50 strk Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -658,7 +658,7 @@
        Events::const_iterator it = _event_handlers.find(id);
        if ( it != _event_handlers.end() ) return true;
 
-       boost::intrusive_ptr<as_function> method = 
getUserDefinedEventHandler(id.get_function_name());
+       boost::intrusive_ptr<as_function> method = 
getUserDefinedEventHandler(id.get_function_key());
        if (method) return true;
 
        return false;
@@ -667,19 +667,20 @@
 boost::intrusive_ptr<as_function>
 character::getUserDefinedEventHandler(const std::string& name) const
 {
-       std::string method_name = name;
-       if ( _vm.getSWFVersion() < 7 )
-       {
-               boost::to_lower(method_name, _vm.getLocale());
-       }
+       string_table::key key = _vm.getStringTable().find(PROPNAME(name));
+       return getUserDefinedEventHandler(key);
+}
 
+boost::intrusive_ptr<as_function>
+character::getUserDefinedEventHandler(string_table::key key) const 
+{
        as_value tmp;
 
        boost::intrusive_ptr<as_function> func;
 
        // const cast is needed due to getter/setter members possibly
        // modifying this object even when only get !
-       if ( 
const_cast<character*>(this)->get_member(_vm.getStringTable().find(method_name),
 &tmp) )
+       if ( const_cast<character*>(this)->get_member(key, &tmp) )
        {
                func = tmp.to_as_function();
        }
@@ -887,8 +888,7 @@
                set_invalidated();
        }
 
-       // Backup these before messing up
-       character* prevMask = _mask;
+       // Backup this before setMaskee has a chance to change it..
        character* prevMaskee = _maskee;
 
        // If we had a previous mask unregister with it

Index: server/character.h
===================================================================
RCS file: /sources/gnash/gnash/server/character.h,v
retrieving revision 1.121
retrieving revision 1.122
diff -u -b -r1.121 -r1.122
--- server/character.h  20 Jan 2008 19:38:04 -0000      1.121
+++ server/character.h  21 Jan 2008 16:02:50 -0000      1.122
@@ -19,7 +19,7 @@
 //
 //
 
-/* $Id: character.h,v 1.121 2008/01/20 19:38:04 strk Exp $ */
+/* $Id: character.h,v 1.122 2008/01/21 16:02:50 strk Exp $ */
 
 #ifndef GNASH_CHARACTER_H
 #define GNASH_CHARACTER_H
@@ -162,6 +162,17 @@
        ///
        boost::intrusive_ptr<as_function> getUserDefinedEventHandler(const 
std::string& name) const;
 
+       /// Return a user defined event handler, if any
+       //
+       /// @param key
+       ///     Function key to fetch. 
+       ///
+       /// @return
+       ///     A function if a member with the given key exists and
+       ///     casts to an as_function. A NULL pointer otherwise.
+       ///
+       boost::intrusive_ptr<as_function> 
getUserDefinedEventHandler(string_table::key key) const;
+
        void set_event_handlers(const Events& copyfrom);
 
        /// Used to assign a name to unnamed instances

Index: server/event_id.h
===================================================================
RCS file: /sources/gnash/gnash/server/event_id.h,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -b -r1.13 -r1.14
--- server/event_id.h   20 Sep 2007 06:57:02 -0000      1.13
+++ server/event_id.h   21 Jan 2008 16:02:51 -0000      1.14
@@ -24,6 +24,7 @@
 #include "config.h"
 #endif
 
+#include "string_table.h"
 #include "tu_config.h"
 
 #include "gnash.h" // for gnash::key namespace
@@ -133,6 +134,10 @@
        /// corresponding to this event.
        const std::string& get_function_name() const;
 
+       /// Return the string_table key of a method-handler function
+       /// corresponding to this event.
+       string_table::key get_function_key() const;
+
        /// \brief
        /// Return true if this is a mouse event
        /// (triggerable with a mouse activity)

Index: server/namedStrings.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/namedStrings.cpp,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -b -r1.8 -r1.9
--- server/namedStrings.cpp     21 Jan 2008 07:07:27 -0000      1.8
+++ server/namedStrings.cpp     21 Jan 2008 16:02:51 -0000      1.9
@@ -55,12 +55,43 @@
        { "loaded", NSV::PROP_LOADED },
        { "_name", NSV::PROP_uNAME },
        { "onLoad", NSV::PROP_ON_LOAD },
+       { "onClose", NSV::PROP_ON_CLOSE },
+       { "onLoadStart", NSV::PROP_ON_LOAD_START },
+       { "onLoadError", NSV::PROP_ON_LOAD_ERROR },
+       { "onLoadProgress", NSV::PROP_ON_LOAD_PROGRESS },
+       { "onLoadInit", NSV::PROP_ON_LOAD_INIT },
+       { "onUnload", NSV::PROP_ON_UNLOAD },
+       { "onEnterFrame", NSV::PROP_ON_ENTER_FRAME },
+       { "onConstruct", NSV::PROP_ON_CONSTRUCT },
+       { "onInitialize", NSV::PROP_ON_INITIALIZE },
+       { "onData", NSV::PROP_ON_DATA },
        { "onResize", NSV::PROP_ON_RESIZE },
+       { "onPress", NSV::PROP_ON_PRESS },
+       { "onRelease", NSV::PROP_ON_RELEASE },
+       { "onReleaseOutside", NSV::PROP_ON_RELEASE_OUTSIDE },
        { "onRollOut", NSV::PROP_ON_ROLL_OUT },
        { "onRollOver", NSV::PROP_ON_ROLL_OVER },
+       { "onDragOver", NSV::PROP_ON_DRAG_OVER },
+       { "onDragOut", NSV::PROP_ON_DRAG_OUT },
+       { "onKeyPress", NSV::PROP_ON_KEY_PRESS },
+       { "onKeyDown", NSV::PROP_ON_KEY_DOWN },
+       { "onKeyUp", NSV::PROP_ON_KEY_UP },
+       { "onMouseDown", NSV::PROP_ON_MOUSE_DOWN },
+       { "onMouseUp", NSV::PROP_ON_MOUSE_UP },
+       { "onMouseMove", NSV::PROP_ON_MOUSE_MOVE },
+       { "onSetFocus", NSV::PROP_ON_SET_FOCUS },
+       { "onKillFocus", NSV::PROP_ON_KILL_FOCUS },
        { "onSelect", NSV::PROP_ON_SELECT },
        { "onStatus", NSV::PROP_ON_STATUS },
        { "onMetaData", NSV::PROP_ON_META_DATA },
+       { "onSockClose", NSV::PROP_ON_SOCK_CLOSE },
+       { "onSockConnect", NSV::PROP_ON_SOCK_CONNECT },
+       { "onSockData", NSV::PROP_ON_SOCK_DATA },
+       { "onSockXML", NSV::PROP_ON_SOCK_XML },
+       { "onXMLLoad", NSV::PROP_ON_XML_LOAD },
+       { "onXMLData", NSV::PROP_ON_XML_DATA },
+       { "parseXML", NSV::PROP_PARSE_XML },
+       { "onTimer", NSV::PROP_ON_TIMER },
        { "_parent", NSV::PROP_uPARENT },
        { "_root", NSV::PROP_uROOT },
        { "_global", NSV::PROP_uGLOBAL },

Index: server/namedStrings.h
===================================================================
RCS file: /sources/gnash/gnash/server/namedStrings.h,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -b -r1.10 -r1.11
--- server/namedStrings.h       21 Jan 2008 07:07:27 -0000      1.10
+++ server/namedStrings.h       21 Jan 2008 16:02:51 -0000      1.11
@@ -77,12 +77,43 @@
                PROP_LOADED,
                PROP_uNAME,
                PROP_ON_LOAD,
+               PROP_ON_CLOSE,
+               PROP_ON_LOAD_START,
+               PROP_ON_LOAD_ERROR,
+               PROP_ON_LOAD_PROGRESS,
+               PROP_ON_LOAD_INIT,
+               PROP_ON_UNLOAD,
+               PROP_ON_ENTER_FRAME,
+               PROP_ON_CONSTRUCT,
+               PROP_ON_INITIALIZE,
+               PROP_ON_DATA,
                PROP_ON_RESIZE,
+               PROP_ON_PRESS,
+               PROP_ON_RELEASE,
+               PROP_ON_RELEASE_OUTSIDE,
                PROP_ON_ROLL_OUT,
                PROP_ON_ROLL_OVER,
+               PROP_ON_DRAG_OVER,
+               PROP_ON_DRAG_OUT,
+               PROP_ON_KEY_PRESS,
+               PROP_ON_KEY_DOWN,
+               PROP_ON_KEY_UP,
+               PROP_ON_MOUSE_DOWN,
+               PROP_ON_MOUSE_UP,
+               PROP_ON_MOUSE_MOVE,
+               PROP_ON_SET_FOCUS,
+               PROP_ON_KILL_FOCUS,
                PROP_ON_SELECT,
                PROP_ON_STATUS,
                PROP_ON_META_DATA,
+               PROP_ON_SOCK_CLOSE,
+               PROP_ON_SOCK_CONNECT,
+               PROP_ON_SOCK_DATA,
+               PROP_ON_SOCK_XML,
+               PROP_ON_XML_LOAD,
+               PROP_ON_XML_DATA,
+               PROP_PARSE_XML,
+               PROP_ON_TIMER,
                PROP_uPARENT,
                PROP_uROOT,
                PROP_uGLOBAL,

Index: server/sprite_instance.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_instance.cpp,v
retrieving revision 1.453
retrieving revision 1.454
diff -u -b -r1.453 -r1.454
--- server/sprite_instance.cpp  21 Jan 2008 12:58:35 -0000      1.453
+++ server/sprite_instance.cpp  21 Jan 2008 16:02:51 -0000      1.454
@@ -2530,7 +2530,7 @@
   if( ! id.is_key_event ())
   {
     boost::intrusive_ptr<as_function> method = 
-      getUserDefinedEventHandler(id.get_function_name());
+      getUserDefinedEventHandler(id.get_function_key());
 
     if ( method )
     {
@@ -3495,7 +3495,7 @@
     }
 
     // Check user-defined event handlers
-    if ( getUserDefinedEventHandler(event.get_function_name()) )
+    if ( getUserDefinedEventHandler(event.get_function_key()) )
     {
       return true;
     }

Index: server/asobj/xml.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/asobj/xml.cpp,v
retrieving revision 1.65
retrieving revision 1.66
diff -u -b -r1.65 -r1.66
--- server/asobj/xml.cpp        10 Jan 2008 17:34:46 -0000      1.65
+++ server/asobj/xml.cpp        21 Jan 2008 16:02:51 -0000      1.66
@@ -17,7 +17,7 @@
 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 //
 
-/* $Id: xml.cpp,v 1.65 2008/01/10 17:34:46 strk Exp $ */
+/* $Id: xml.cpp,v 1.66 2008/01/21 16:02:51 strk Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -192,18 +192,8 @@
     // before advance() is called).  Then the onLoad event
     // is triggered.
 
-    // In ActionScript 2.0, event method names are CASE SENSITIVE.
-    // In ActionScript 1.0, event method names are CASE INSENSITIVE.
-    // TODO: move to get_function_name directly ?
-    std::string method_name1 = "onLoad";
-    if ( _vm.getSWFVersion() < 7 )
-        boost::to_lower(method_name1, _vm.getLocale());
-
-    if ( method_name1.empty() ) return;
-
-       string_table::key method_name = _vm.getStringTable().find(method_name1);
     as_value   method;
-    if (!get_member(method_name, &method) ) return;
+    if (!get_member(NSV::PROP_ON_LOAD, &method) ) return;
     if ( method.is_undefined() ) return;
     if ( ! method.is_function() ) return;
 
@@ -226,18 +216,8 @@
     // before advance() is called).  Then the onLoad event
     // is triggered.
 
-    // In ActionScript 2.0, event method names are CASE SENSITIVE.
-    // In ActionScript 1.0, event method names are CASE INSENSITIVE.
-    // TODO: move to get_function_name directly ?
-    std::string method_name1 = "onClose";
-    if ( _vm.getSWFVersion() < 7 )
-        boost::to_lower(method_name1, _vm.getLocale());
-
-    if ( method_name1.empty() ) return;
-
-       string_table::key method_name = _vm.getStringTable().find(method_name1);
     as_value   method;
-    if (! get_member(method_name, &method) ) return;
+    if (! get_member(NSV::PROP_ON_CLOSE, &method) ) return;
     if ( method.is_undefined() ) return;
     if ( ! method.is_function() ) return;
 
@@ -464,9 +444,7 @@
 
     if ( _loadThreads.empty() ) return; // nothing to do
 
-    VM& vm = getVM();
-    string_table& st = vm.getStringTable();
-    string_table::key onDataKey = st.find(PROPNAME("onData"));
+    string_table::key onDataKey = NSV::PROP_ON_DATA;
 
     for (LoadThreadList::iterator it=_loadThreads.begin();
             it != _loadThreads.end(); )
@@ -517,6 +495,7 @@
 #ifdef DEBUG_XML_LOADS
         log_debug("Clearing XML load checker interval timer");
 #endif
+       VM& vm = getVM();
         vm.getRoot().clear_interval_timer(_loadCheckerTimer);
         _loadCheckerTimer=0;
     }
@@ -551,7 +530,7 @@
         return false;
         // TODO: this is still not correct.. we should still send onData 
later...
         //as_value nullValue; nullValue.set_null();
-        //callMethod(VM::get().getStringTable().find(PROPNAME("onData")), 
nullValue);
+        //callMethod(NSV::PROP_ON_DATA, nullValue);
     }
 
     log_security(_("Loading XML file from url: '%s'"), url.str().c_str());
@@ -886,10 +865,8 @@
 {
     GNASH_REPORT_FUNCTION;
 
-    VM& vm = VM::get();
-    string_table& st = vm.getStringTable();
-    string_table::key onLoadKey = st.find(PROPNAME("onLoad"));
-    string_table::key loadedKey = st.find("loaded");
+    string_table::key onLoadKey = NSV::PROP_ON_LOAD;
+    string_table::key loadedKey = NSV::PROP_LOADED; 
 
     as_object* thisPtr = fn.this_ptr.get();
     assert(thisPtr);
@@ -901,7 +878,7 @@
 
     if ( ! src.is_null() )
     {
-        string_table::key parseXMLKey = st.find(PROPNAME("parseXML"));
+        string_table::key parseXMLKey = NSV::PROP_PARSE_XML;
         as_value tmp(true);
         thisPtr->set_member(loadedKey, tmp);
         thisPtr->callMethod(parseXMLKey, src);

Index: server/vm/action.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/vm/action.cpp,v
retrieving revision 1.30
retrieving revision 1.31
diff -u -b -r1.30 -r1.31
--- server/vm/action.cpp        10 Dec 2007 10:54:34 -0000      1.30
+++ server/vm/action.cpp        21 Jan 2008 16:02:51 -0000      1.31
@@ -45,6 +45,7 @@
 #include "StringPredicates.h"
 #include "xml.h"
 #include "xmlsocket.h"
+#include "namedStrings.h"
 
 
 #include <typeinfo>
@@ -374,6 +375,56 @@
        return s_function_names[m_id];
 }
 
+string_table::key
+event_id::get_function_key() const
+{
+       // TODO: use a case-insensitive matching
+       static string_table::key function_keys[EVENT_COUNT] =
+       {
+               0,                              // INVALID
+               NSV::PROP_ON_PRESS,             // PRESS
+               NSV::PROP_ON_RELEASE,           // RELEASE
+               NSV::PROP_ON_RELEASE_OUTSIDE,   // RELEASE_OUTSIDE
+               NSV::PROP_ON_ROLL_OVER,         // ROLL_OVER
+               NSV::PROP_ON_ROLL_OUT,          // ROLL_OUT
+               NSV::PROP_ON_DRAG_OVER,         // DRAG_OVER
+               NSV::PROP_ON_DRAG_OUT,          // DRAG_OUT
+               NSV::PROP_ON_KEY_PRESS,         // KEY_PRESS
+               NSV::PROP_ON_INITIALIZE,        // INITIALIZE
+
+               NSV::PROP_ON_LOAD,              // LOAD
+               NSV::PROP_ON_UNLOAD,            // UNLOAD
+               NSV::PROP_ON_ENTER_FRAME,       // ENTER_FRAME
+               NSV::PROP_ON_MOUSE_DOWN,        // MOUSE_DOWN
+               NSV::PROP_ON_MOUSE_UP,          // MOUSE_UP
+               NSV::PROP_ON_MOUSE_MOVE,        //  MOUSE_MOVE
+               NSV::PROP_ON_KEY_DOWN,          // KEY_DOWN
+               NSV::PROP_ON_KEY_UP,            // KEY_UP
+               NSV::PROP_ON_DATA,              // DATA
+               // These are for the MoveClipLoader ActionScript only
+               NSV::PROP_ON_LOAD_START,        // LOAD_START
+               NSV::PROP_ON_LOAD_ERROR,        // LOAD_ERROR
+               NSV::PROP_ON_LOAD_PROGRESS,     // LOAD_PROGRESS
+               NSV::PROP_ON_LOAD_INIT,         // LOAD_INIT
+               // These are for the XMLSocket ActionScript only
+               NSV::PROP_ON_SOCK_CLOSE,        // CLOSE
+               NSV::PROP_ON_SOCK_CONNECT,      // CONNECT
+               NSV::PROP_ON_SOCK_DATA,         // Data
+               NSV::PROP_ON_SOCK_XML,          // XML
+               // These are for the XML ActionScript only
+               NSV::PROP_ON_XML_LOAD,          // XML_LOAD
+               NSV::PROP_ON_XML_DATA,          // XML_DATA
+               NSV::PROP_ON_TIMER,             // setInterval Timer expired
+
+               NSV::PROP_ON_CONSTRUCT,         // onConstruct
+               NSV::PROP_ON_SET_FOCUS,         // onSetFocus
+               NSV::PROP_ON_KILL_FOCUS         // onKillFocus
+       };
+
+       assert(m_id > INVALID && m_id < EVENT_COUNT);
+       return function_keys[m_id];
+}
+
 bool
 event_id::is_mouse_event() const
 {




reply via email to

[Prev in Thread] Current Thread [Next in Thread]