package com.jacob.test.events; import com.jacob.activeX.ActiveXComponent; import com.jacob.activeX.ActiveXDispatchEvents; import com.jacob.com.ComThread; import com.jacob.com.Dispatch; import com.jacob.com.Variant; import com.jacob.test.BaseTestCase; /** * This test runs fine against jdk 1.4 and 1.5 * * This demonstrates the new event handling code in jacob 1.7 * This example will open up IE and print out some of the events * it listens to as it havigates to web sites. * contributed by Niels Olof Bouvin mailto:n.o.bouvin@daimi.au.dk * and Henning Jae jehoej@daimi.au.dk *
* May need to run with some command line options (including from inside Eclipse). * Look in the docs area at the Jacob usage document for command line options. */ public class IETestActiveXProxy extends BaseTestCase { public void testIEActiveProxyCallback() { // this line starts the pump but it runs fine without it ComThread.startMainSTA(); // remove this line and it dies ///ComThread.InitMTA(true); IETestActiveProxyThread aThread = new IETestActiveProxyThread(); aThread.start(); while (aThread.isAlive()){ try { Thread.sleep(1000); } catch (InterruptedException e) { // doen with the sleep //e.printStackTrace(); } } System.out.println("Main: Thread quit, about to quit main sta in thread " +Thread.currentThread().getName()); // this line only does someting if startMainSTA() was called ComThread.quitMainSTA(); System.out.println("Main: did quit main sta in thread " +Thread.currentThread().getName()); if (aThread.threadFailedWithException != null){ fail("caught an unexpected exception "+aThread.threadFailedWithException); } } } class IETestActiveProxyThread extends Thread { public static boolean quitHandled = false; /** * holds any caught exception so the main/test case can see them */ public Throwable threadFailedWithException = null; public IETestActiveProxyThread(){ super(); } public void run() { // this used to be 5 seconds but sourceforge is slow int delay = 5000; // msec // paired with statement below that blows up ComThread.InitMTA(); ActiveXComponent ie = new ActiveXComponent("InternetExplorer.Application"); try { Dispatch.put(ie, "Visible", new Variant(true)); Dispatch.put(ie, "AddressBar", new Variant(true)); System.out.println("IETestActiveProxyThread: " + Dispatch.get(ie, "Path")); Dispatch.put(ie, "StatusText", new Variant("My Status Text")); System.out.println("IETestActiveProxyThread: About to hookup event listener"); IEEventsActiveProxy ieE = new IEEventsActiveProxy(); new ActiveXDispatchEvents(ie, ieE,"InternetExplorer.Application.1"); System.out.println("IETestActiveProxyThread: Did hookup event listener"); /// why is this here? Was there some other code here in the past? Variant optional = new Variant(); optional.putNoParam(); System.out.println("IETestActiveProxyThread: About to call navigate to sourceforge"); Dispatch.call(ie, "Navigate", new Variant("http://sourceforge.net/projects/jacob-project")); System.out.println("IETestActiveProxyThread: Did call navigate to sourceforge"); try { Thread.sleep(delay); } catch (Exception e) {} System.out.println("IETestActiveProxyThread: About to call navigate to yahoo"); Dispatch.call(ie, "Navigate", new Variant("http://groups.yahoo.com/group/jacob-project")); System.out.println("IETestActiveProxyThread: Did call navigate to yahoo"); try { Thread.sleep(delay); } catch (Exception e) {} } catch (Exception e) { threadFailedWithException = e; e.printStackTrace(); } catch (Throwable re){ threadFailedWithException = re; re.printStackTrace(); } finally { System.out.println("IETestActiveProxyThread: About to send Quit"); ie.invoke("Quit", new Variant[] {}); System.out.println("IETestActiveProxyThread: Did send Quit"); } // this blows up when it tries to release a DispatchEvents object // I think this is because there is still one event we should get back // "OnQuit" that will came after we have released the thread pool // this is probably messed up because DispatchEvent object will have been // freed before the callback // commenting out ie.invoke(quit...) causes this to work without error // this code tries to wait until the quit has been handled but that doesn't work System.out.println("IETestActiveProxyThread: Waiting until we've received the quit callback"); while (!quitHandled){ try { Thread.sleep(delay/5);} catch (InterruptedException e) {} } System.out.println("IETestActiveProxyThread: Received the quit callback"); // wait a little while for it to end //try {Thread.sleep(delay); } catch (InterruptedException e) {} System.out.println("IETestActiveProxyThread: about to call ComThread.Release in thread " + Thread.currentThread().getName()); ComThread.Release(); } /** * The events class must be publicly accessable for reflection to work. * The list of available events is located at http://msdn2.microsoft.com/en-us/library/aa768280.aspx */ public class IEEventsActiveProxy { public void BeforeNavigate2(Dispatch pDisp, String url, Integer flags, String targetFrameName, Variant postData, String headers, Boolean cancel) { System.out.println("IEEventsActiveProxy Received ("+Thread.currentThread().getName()+"): BeforeNavigate2 "+url); } public void CommandStateChange(Integer command, Boolean enable) { System.out.println("IEEventsActiveProxy Received ("+Thread.currentThread().getName()+"): CommandStateChange "+command); } public void DocumentComplete(Dispatch pDisp, String url) { System.out.println("IEEventsActiveProxy Received ("+Thread.currentThread().getName()+"): DocumentComplete "+url); } public void DownloadBegin() { System.out.println("IEEventsActiveProxy Received ("+Thread.currentThread().getName()+"): DownloadBegin "); } public void DownloadComplete() { System.out.println("IEEventsActiveProxy Received ("+Thread.currentThread().getName()+"): DownloadComplete "); } public void NavigateComplete2(Dispatch pDisp, String url) { System.out.println("IEEventsActiveProxy Received ("+Thread.currentThread().getName()+"): NavigateComplete "+url); } public void NavigateError(Dispatch pDispatch, String url, String targetFrameName, Integer statusCode, Boolean Cancel) { System.out.println("IEEvents Received ("+Thread.currentThread().getName()+"): NavigateError "+statusCode); } public void NewWindow2(Dispatch pDisp, Boolean cancel) { System.out.println("IEEventsActiveProxy Received ("+Thread.currentThread().getName()+"): NewWindow2 "+pDisp); } public void OnFullScreen(Boolean fullScreen) { System.out.println("IEEventsActiveProxy Received ("+Thread.currentThread().getName()+"): OnFullScreen "+fullScreen); } public void OnMenuBar(Boolean menuBar) { System.out.println("IEEventsActiveProxy Received ("+Thread.currentThread().getName()+"): OnMenuBar "+menuBar); } public void OnQuit() { System.out.println("IEEventsActiveProxy Received ("+Thread.currentThread().getName()+"): OnQuit "); IETestActiveProxyThread.quitHandled = true; } public void OnStatusBar(Boolean statusBar) { System.out.println("IEEventsActiveProxy Received ("+Thread.currentThread().getName()+"): OnStatusBar "+statusBar); } public void OnTheaterMode(Boolean theaterMode) { System.out.println("IEEventsActiveProxy Received ("+Thread.currentThread().getName()+"): OnTheaterMode "+theaterMode); } public void OnToolBar(Boolean onToolBar) { System.out.println("IEEventsActiveProxy Received ("+Thread.currentThread().getName()+"): OnToolBar "+onToolBar); } public void OnVisible(Boolean onVisible) { System.out.println("IEEventsActiveProxy Received ("+Thread.currentThread().getName()+"): onVisible "+ onVisible); } public void ProgressChange() { System.out.println("IEEventsActiveProxy Received ("+Thread.currentThread().getName()+"): ProgressChange "); } public void PropertyChange() { System.out.println("IEEventsActiveProxy Received ("+Thread.currentThread().getName()+"): PropertyChange "); } public void SetSecureLockIcon(Integer secureLockIcon) { System.out.println("IEEvents Received ("+Thread.currentThread().getName()+"): setSecureLockIcon "+secureLockIcon); } public void StatusTextChange() { System.out.println("IEEventsActiveProxy Received ("+Thread.currentThread().getName()+"): StatusTextChange "); } public void TitleChange() { System.out.println("IEEventsActiveProxy Received ("+Thread.currentThread().getName()+"): TitleChange "); } public void WindowClosing(Boolean isChildWindow) { System.out.println("IEEvents Received ("+Thread.currentThread().getName()+"): WindowClosing "+isChildWindow); } } }