From 4aec73e1edfdd743828c0172a66f655223100c38 Mon Sep 17 00:00:00 2001 From: suke Date: Fri, 25 Jul 2008 11:49:28 +0000 Subject: [PATCH] * ext/win32ole/win32ole.c (Init_win32ole): add WIN32OLE_EVENT#off_event. * test/win32ole/test_win32ole_event.rb: ditto. * test/win32ole/test_win32ole_event.rb: some refactoring. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@18214 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 9 +++ ext/win32ole/win32ole.c | 49 ++++++++++++++- test/win32ole/test_win32ole_event.rb | 90 ++++++++++++++++------------ 3 files changed, 110 insertions(+), 38 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3965fb1e70..3f70215c80 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +Fri Jul 25 20:43:57 2008 Masaki Suketa + + * ext/win32ole/win32ole.c (Init_win32ole): add + WIN32OLE_EVENT#off_event. + + * test/win32ole/test_win32ole_event.rb: ditto. + + * test/win32ole/test_win32ole_event.rb: some refactoring. + Fri Jul 25 19:50:49 2008 Nobuyoshi Nakada * regint.c (xmalloc, xrealloc, xfree): not to use ruby managed memory. diff --git a/ext/win32ole/win32ole.c b/ext/win32ole/win32ole.c index 388ecfaed6..5443c15008 100644 --- a/ext/win32ole/win32ole.c +++ b/ext/win32ole/win32ole.c @@ -118,7 +118,7 @@ #define WC2VSTR(x) ole_wc2vstr((x), TRUE) -#define WIN32OLE_VERSION "1.2.7" +#define WIN32OLE_VERSION "1.2.8" typedef HRESULT (STDAPICALLTYPE FNCOCREATEINSTANCEEX) (REFCLSID, IUnknown*, DWORD, COSERVERINFO*, DWORD, MULTI_QI*); @@ -499,6 +499,7 @@ static VALUE foleparam_default(VALUE self); static VALUE foleparam_inspect(VALUE self); static long ole_search_event_at(VALUE ary, VALUE ev); static VALUE ole_search_event(VALUE ary, VALUE ev, BOOL *is_default); +static void ole_delete_event(VALUE ary, VALUE ev); static void hash2ptr_dispparams(VALUE hash, ITypeInfo *pTypeInfo, DISPID dispid, DISPPARAMS *pdispparams); static VALUE hash2result(VALUE hash); static void ary2ptr_dispparams(VALUE ary, DISPPARAMS *pdispparams); @@ -517,6 +518,7 @@ static void add_event_call_back(VALUE obj, VALUE event, VALUE data); static VALUE ev_on_event(int argc, VALUE *argv, VALUE self, VALUE is_ary_arg); static VALUE fev_on_event(int argc, VALUE *argv, VALUE self); static VALUE fev_on_event_with_outargs(int argc, VALUE *argv, VALUE self); +static VALUE fev_off_event(int argc, VALUE *argv, VALUE self); static VALUE fev_unadvise(VALUE self); static VALUE evs_push(VALUE ev); static VALUE evs_delete(long i); @@ -7433,6 +7435,16 @@ ole_search_event(VALUE ary, VALUE ev, BOOL *is_default) return def_event; } +static void +ole_delete_event(VALUE ary, VALUE ev) +{ + long at = -1; + at = ole_search_event_at(ary, ev); + if (at >= 0) { + rb_ary_delete_at(ary, at); + } +} + static void hash2ptr_dispparams(VALUE hash, ITypeInfo *pTypeInfo, DISPID dispid, DISPPARAMS *pdispparams) { @@ -8165,6 +8177,40 @@ fev_on_event_with_outargs(int argc, VALUE *argv, VALUE self) return ev_on_event(argc, argv, self, Qtrue); } +/* + * call-seq: + * WIN32OLE_EVENT#off_event([event]) + * + * removes the callback of event. + * + * ie = WIN32OLE.new('InternetExplorer.Application') + * ev = WIN32OLE_EVENT.new(ie) + * ev.on_event('BeforeNavigate2') {|*args| + * args.last[6] = true + * } + * ... + * ev.off_event('BeforeNavigate2') + * ... + */ +static VALUE +fev_off_event(int argc, VALUE *argv, VALUE self) +{ + VALUE event = Qnil; + VALUE events; + + rb_secure(4); + rb_scan_args(argc, argv, "01", &event); + if(!NIL_P(event)) { + Check_SafeStr(event); + } + events = rb_ivar_get(self, id_events); + if (NIL_P(events)) { + return Qnil; + } + ole_delete_event(events, event); + return Qnil; +} + /* * call-seq: * WIN32OLE_EVENT#unadvise -> nil @@ -8854,6 +8900,7 @@ Init_win32ole() rb_define_method(cWIN32OLE_EVENT, "initialize", fev_initialize, -1); rb_define_method(cWIN32OLE_EVENT, "on_event", fev_on_event, -1); rb_define_method(cWIN32OLE_EVENT, "on_event_with_outargs", fev_on_event_with_outargs, -1); + rb_define_method(cWIN32OLE_EVENT, "off_event", fev_off_event, -1); rb_define_method(cWIN32OLE_EVENT, "unadvise", fev_unadvise, 0); cWIN32OLE_VARIANT = rb_define_class("WIN32OLE_VARIANT", rb_cObject); diff --git a/test/win32ole/test_win32ole_event.rb b/test/win32ole/test_win32ole_event.rb index 62b5402a7c..6ab165bd67 100644 --- a/test/win32ole/test_win32ole_event.rb +++ b/test/win32ole/test_win32ole_event.rb @@ -17,9 +17,17 @@ if defined?(WIN32OLE_EVENT) dummy_path end + def message_loop + WIN32OLE_EVENT.message_loop + sleep 0.1 + end + def setup + WIN32OLE_EVENT.message_loop @ie = WIN32OLE.new("InternetExplorer.Application") + message_loop @ie.visible = true + message_loop @event = "" @event2 = "" @event3 = "" @@ -43,8 +51,7 @@ if defined?(WIN32OLE_EVENT) while @ie.busy WIN32OLE_EVENT.new(@ie) GC.start - WIN32OLE_EVENT.message_loop - sleep 0.1 + message_loop end assert_match(/BeforeNavigate/, @event) assert_match(/NavigateComplete/, @event) @@ -57,7 +64,7 @@ if defined?(WIN32OLE_EVENT) while @ie.busy WIN32OLE_EVENT.new(@ie, 'DWebBrowserEvents') GC.start - sleep 0.1 + message_loop end assert_match(/BeforeNavigate/, @event) assert_match(/NavigateComplete/, @event) @@ -69,8 +76,7 @@ if defined?(WIN32OLE_EVENT) ev.on_event('BeforeNavigate') {|*args| handler2} @ie.navigate("file:///#{@f}") while @ie.busy - WIN32OLE_EVENT.message_loop - sleep 0.1 + message_loop end assert_equal("handler2", @event2) end @@ -81,8 +87,7 @@ if defined?(WIN32OLE_EVENT) ev.on_event {|*args| handler2} @ie.navigate("file:///#{@f}") while @ie.busy - WIN32OLE_EVENT.message_loop - sleep 0.1 + message_loop end assert_equal("handler2", @event2) end @@ -94,8 +99,7 @@ if defined?(WIN32OLE_EVENT) ev.on_event('NavigateComplete'){|*args| handler3(*args)} @ie.navigate("file:///#{@f}") while @ie.busy - WIN32OLE_EVENT.message_loop - sleep 0.1 + message_loop end assert(@event3!="") assert("handler2", @event2) @@ -107,8 +111,7 @@ if defined?(WIN32OLE_EVENT) ev.on_event('NavigateComplete'){|*args| handler3(*args)} @ie.navigate("file:///#{@f}") while @ie.busy - WIN32OLE_EVENT.message_loop - sleep 0.1 + message_loop end assert_match(/BeforeNavigate/, @event) assert(/NavigateComplete/ !~ @event) @@ -120,16 +123,14 @@ if defined?(WIN32OLE_EVENT) ev.on_event {|*args| default_handler(*args)} @ie.navigate("file:///#{@f}") while @ie.busy - WIN32OLE_EVENT.message_loop - sleep 0.1 + message_loop end assert_match(/BeforeNavigate/, @event) ev.unadvise @event = "" @ie.navigate("file:///#{@f}") while @ie.busy - WIN32OLE_EVENT.message_loop - sleep 0.1 + message_loop end assert_equal("", @event); assert_raise(WIN32OLERuntimeError) { @@ -158,8 +159,7 @@ if defined?(WIN32OLE_EVENT) bl = @ie.locationURL @ie.navigate("file:///#{@f}") while @ie.busy - sleep 0.1 - WIN32OLE_EVENT.message_loop + message_loop end assert_equal(bl, @ie.locationURL) end @@ -172,8 +172,7 @@ if defined?(WIN32OLE_EVENT) bl = @ie.locationURL @ie.navigate("file:///#{@f}") while @ie.busy - sleep 0.1 - WIN32OLE_EVENT.message_loop + message_loop end assert_equal(bl, @ie.locationURL) end @@ -186,8 +185,7 @@ if defined?(WIN32OLE_EVENT) bl = @ie.locationURL @ie.navigate("file:///#{@f}") while @ie.busy - sleep 0.1 - WIN32OLE_EVENT.message_loop + message_loop end assert_equal(bl, @ie.locationURL) end @@ -200,8 +198,7 @@ if defined?(WIN32OLE_EVENT) bl = @ie.locationURL @ie.navigate("file:///#{@f}") while @ie.busy - sleep 0.1 - WIN32OLE_EVENT.message_loop + message_loop end assert_equal(bl, @ie.locationURL) end @@ -214,8 +211,7 @@ if defined?(WIN32OLE_EVENT) bl = @ie.locationURL @ie.navigate("file:///#{@f}") while @ie.busy - sleep 0.1 - WIN32OLE_EVENT.message_loop + message_loop end assert_equal(bl, @ie.locationURL) end @@ -228,12 +224,35 @@ if defined?(WIN32OLE_EVENT) bl = @ie.locationURL @ie.navigate("file:///#{@f}") while @ie.busy - sleep 0.1 - WIN32OLE_EVENT.message_loop + message_loop end assert_equal(bl, @ie.locationURL) end + def test_off_event + ev = WIN32OLE_EVENT.new(@ie) + ev.on_event{handler1} + ev.off_event + @ie.navigate("file:///#{@f}") + while @ie.busy + message_loop + end + WIN32OLE_EVENT.message_loop + assert_equal("", @event2) + end + + def test_off_event_arg + ev = WIN32OLE_EVENT.new(@ie) + ev.on_event('BeforeNavigate2'){handler1} + ev.off_event('BeforeNavigate2') + @ie.navigate("file:///#{@f}") + while @ie.busy + message_loop + end + WIN32OLE_EVENT.message_loop + assert_equal("", @event2) + end + def handler1 @event2 = "handler1" end @@ -248,21 +267,18 @@ if defined?(WIN32OLE_EVENT) def teardown @ie.quit - WIN32OLE_EVENT.message_loop @ie = nil - WIN32OLE_EVENT.message_loop - sleep 0.1 + i = 0 begin - File.unlink(@f) + i += 1 + File.unlink(@f) if i < 10 rescue Errno::EACCES - WIN32OLE_EVENT.message_loop - sleep 0.1 - File.unlink(@f) + message_loop + retry end - + message_loop GC.start - WIN32OLE_EVENT.message_loop - sleep 0.1 + message_loop end end end