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 { /** * the main test method that builds up the connection and runs the test */ 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 { /** says that the quit message has been received from the target application */ public static boolean quitHandled = false; /** * holds any caught exception so the main/test case can see them */ public Throwable threadFailedWithException = null; /** the thread's constructor */ 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); } } }