From 7e0cba1c76f7086cd636c16f8ff324cb77ebfdef Mon Sep 17 00:00:00 2001 From: Riza Sulistyo Date: Thu, 28 Jul 2016 08:50:08 +0000 Subject: Re #1945 (misc): Add pjsua2 sample app using javafx. git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@5402 74dad513-b988-da41-8d7b-12977e46ad98 --- pjsip-apps/src/swig/java/Makefile | 5 + pjsip-apps/src/swig/java/sample2.java | 167 ++++++++++++++++++++++++++++++++++ 2 files changed, 172 insertions(+) create mode 100644 pjsip-apps/src/swig/java/sample2.java (limited to 'pjsip-apps/src') diff --git a/pjsip-apps/src/swig/java/Makefile b/pjsip-apps/src/swig/java/Makefile index e1e12b4d..2230670d 100644 --- a/pjsip-apps/src/swig/java/Makefile +++ b/pjsip-apps/src/swig/java/Makefile @@ -192,6 +192,8 @@ $(MY_PACKAGE_PATH)/test.class: test.java $(MY_PACKAGE_PATH)/sample.class: sample.java $(MY_JAVAC) -d $(OUT_DIR) -classpath "$(OUT_DIR)" sample.java + @# Build javafx sample app + @# $(MY_JAVAC) -d $(OUT_DIR) -classpath "$(OUT_DIR)" sample2.java test: @# Need to specify classpath and library path, alternatively, @@ -203,6 +205,9 @@ sample: @# they can be set via CLASSPATH and java.library.path env settings $(MY_JAVA) -cp "$(OUT_DIR)" -Djava.library.path="$(OUT_DIR)" \ org.pjsip.pjsua2.app.sample + @# This is for sample2 app + @# $(MY_JAVA) -cp "$(OUT_DIR)" -Djava.library.path="$(OUT_DIR)" \ + @# org.pjsip.pjsua2.app.sample2 install: uninstall: diff --git a/pjsip-apps/src/swig/java/sample2.java b/pjsip-apps/src/swig/java/sample2.java new file mode 100644 index 00000000..b5b3d761 --- /dev/null +++ b/pjsip-apps/src/swig/java/sample2.java @@ -0,0 +1,167 @@ +/* $Id$ */ +/* + * Copyright (C) 2013 Teluu Inc. (http://www.teluu.com) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +package org.pjsip.pjsua2.app; + +import java.io.IOException; +import org.pjsip.pjsua2.*; +import org.pjsip.pjsua2.app.*; +import javafx.application.Application; +import javafx.event.ActionEvent; +import javafx.event.EventHandler; +import javafx.scene.Scene; +import javafx.scene.layout.StackPane; +import javafx.stage.Stage; +import com.sun.javafx.tk.TKStage; +import java.lang.reflect.Method; + +class MyObserver implements MyAppObserver { + private static MyCall currentCall = null; + + @Override + public void notifyRegState(pjsip_status_code code, String reason, int expiration) {} + + @Override + public void notifyIncomingCall(MyCall call) { + /* Auto answer. */ + CallOpParam call_param = new CallOpParam(); + call_param.setStatusCode(pjsip_status_code.PJSIP_SC_OK); + try { + currentCall = call; + currentCall.answer(call_param); + } catch (Exception e) { + System.out.println(e); + return; + } + } + + @Override + public void notifyCallMediaState(MyCall call) { + } + + public void notifyCallState(MyCall call) { + if (currentCall == null || call.getId() != currentCall.getId()) + return; + + CallInfo ci; + try { + ci = call.getInfo(); + } catch (Exception e) { + ci = null; + } + if (ci.getState() == pjsip_inv_state.PJSIP_INV_STATE_DISCONNECTED) { + currentCall = null; + } else if (ci.getState() == pjsip_inv_state.PJSIP_INV_STATE_CONFIRMED) { + if (ci.getSetting().getVideoCount() != 0) { + System.out.println("Changing video window using " + sample2.hwnd); + // Change window + VideoWindowHandle vidWH = new VideoWindowHandle(); + vidWH.getHandle().setWindow(sample2.hwnd); + try { + currentCall.vidWin.setWindow(vidWH); + } catch (Exception e) { + System.out.println(e); + } + } + } + } + + @Override + public void notifyBuddyState(MyBuddy buddy) {} +} + +class MyThread extends Thread { + private static MyApp app = new MyApp(); + private static MyAppObserver observer = new MyObserver(); + private static MyAccount account = null; + private static AccountConfig accCfg = null; + + public void run() { + try { + app.init(observer, ".", true); + } catch (Exception e) { + System.out.println(e); + app.deinit(); + System.exit(-1); + } + + if (app.accList.size() == 0) { + accCfg = new AccountConfig(); + accCfg.setIdUri("sip:localhost"); + accCfg.getVideoConfig().setAutoTransmitOutgoing(true); + accCfg.getVideoConfig().setAutoShowIncoming(true); + account = app.addAcc(accCfg); + } else { + account = app.accList.get(0); + accCfg = account.cfg; + } + + try { + account.modify(accCfg); + } catch (Exception e) {} + + while (!Thread.currentThread().isInterrupted()) { + MyApp.ep.libHandleEvents(10); + try { + Thread.currentThread().sleep(50); + } catch (InterruptedException ie) { + break; + } + } + app.deinit(); + } +} + +public class sample2 extends Application { + public static long hwnd; + private static Thread myThread = new MyThread(); + + private static long getWindowPointer(Stage stage) { + try { + TKStage tkStage = stage.impl_getPeer(); + Method getPlatformWindow = tkStage.getClass().getDeclaredMethod("getPlatformWindow" ); + getPlatformWindow.setAccessible(true); + Object platformWindow = getPlatformWindow.invoke(tkStage); + Method getNativeHandle = platformWindow.getClass().getMethod( "getNativeHandle" ); + getNativeHandle.setAccessible(true); + return (long)getNativeHandle.invoke(platformWindow); + } catch (Throwable e) { + System.err.println("Error getting Window Pointer"); + return 0; + } + } + + @Override + public void start(Stage primaryStage) { + primaryStage.setTitle("Pjsua2 javafx sample"); + StackPane root = new StackPane(); + primaryStage.setScene(new Scene(root, 300, 250)); + primaryStage.show(); + hwnd = getWindowPointer(primaryStage); + myThread.start(); + } + @Override + public void stop() throws Exception { + myThread.interrupt(); + myThread.join(); + } + public static void main(String argv[]) { + launch(argv); + } +} \ No newline at end of file -- cgit v1.2.3