mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-06-07 13:35:00 +00:00
FS-4745 --resolve
This commit is contained in:
parent
efcd5656fb
commit
43dfc70327
@ -1,13 +1,8 @@
|
|||||||
<configuration name="java.conf" description="Java Plug-Ins">
|
<configuration name="java.conf" description="Java Plug-Ins">
|
||||||
<!-- Path to the Java 1.6 virtual machine to use -->
|
<javavm path="/opt/jdk1.6.0_04/jre/lib/amd64/server/libjvm.so"/>
|
||||||
<javavm path="/usr/java/jdk1.6.0/jre/lib/i386/client/libjvm.so"/>
|
|
||||||
<!-- Options to pass to Java -->
|
|
||||||
<options>
|
<options>
|
||||||
<!-- Your class path (make sure freeswitch.jar is on it) -->
|
<option value="-Djava.class.path=$${base_dir}/scripts/freeswitch.jar:$${base_dir}/scripts/example.jar"/>
|
||||||
<option value="-Djava.class.path=$${base_dir}/scripts/freeswitch.jar"/>
|
<option value="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:8000"/>
|
||||||
<!-- Enable remote debugging -->
|
|
||||||
<option value="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=127.0.0.1:8000"/>
|
|
||||||
</options>
|
</options>
|
||||||
<startup class="net/cog/fs/system/Control" method="startup" arg="start up arg"/>
|
<startup class="org/freeswitch/example/ApplicationLauncher" method="startup"/>
|
||||||
<shutdown class="net/cog/fs/system/Control" method="shutdown" arg="shutdown arg"/>
|
|
||||||
</configuration>
|
</configuration>
|
||||||
|
@ -1,5 +1,35 @@
|
|||||||
#include "freeswitch_java.h"
|
#include "freeswitch_java.h"
|
||||||
|
|
||||||
|
jobject originate_state_handler;
|
||||||
|
|
||||||
|
SWITCH_DECLARE(void) setOriginateStateHandler(jobject stateHandler)
|
||||||
|
{
|
||||||
|
JNIEnv *env = NULL;
|
||||||
|
jint envStatus = javaVM->GetEnv((void**)&env, JNI_VERSION_1_4);
|
||||||
|
if ( envStatus != JNI_OK ) {
|
||||||
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error getting JNIEnv!\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( stateHandler != NULL && originate_state_handler != NULL ) {
|
||||||
|
const char* errorMessage = "Originate state handler is already registered";
|
||||||
|
jclass exceptionClass = env->FindClass("java/util/TooManyListenersException");
|
||||||
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, errorMessage);
|
||||||
|
env->ThrowNew(exceptionClass, errorMessage);
|
||||||
|
} else if ( stateHandler == NULL && originate_state_handler != NULL ) {
|
||||||
|
env->DeleteGlobalRef(originate_state_handler);
|
||||||
|
originate_state_handler = NULL;
|
||||||
|
} else {
|
||||||
|
originate_state_handler = env->NewGlobalRef(stateHandler);
|
||||||
|
if ( originate_state_handler == NULL ) {
|
||||||
|
const char* errorMessage = "Unable to create global reference for state handler";
|
||||||
|
jclass exceptionClass = env->FindClass("java/lang/OutOfMemoryError");
|
||||||
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, errorMessage);
|
||||||
|
env->ThrowNew(exceptionClass, errorMessage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
JavaSession::JavaSession() : CoreSession()
|
JavaSession::JavaSession() : CoreSession()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -328,3 +358,152 @@ done:
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch_status_t originate_handler_method(switch_core_session_t *session, const char* method) {
|
||||||
|
if ( originate_state_handler != NULL ) {
|
||||||
|
JNIEnv *env = NULL;
|
||||||
|
bool needDetach = false;
|
||||||
|
|
||||||
|
jint envStatus = javaVM->GetEnv((void**)&env, JNI_VERSION_1_4);
|
||||||
|
if ( envStatus == JNI_EDETACHED ) {
|
||||||
|
envStatus = javaVM->AttachCurrentThread((void**)&env, NULL);
|
||||||
|
if ( envStatus == JNI_OK ) needDetach = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( envStatus != JNI_OK ) {
|
||||||
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error getting JNIEnv!\n");
|
||||||
|
return SWITCH_STATUS_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
jclass handlerClass = env->GetObjectClass(originate_state_handler);
|
||||||
|
if ( handlerClass == NULL ) {
|
||||||
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error getting handler class!\n");
|
||||||
|
if ( needDetach ) javaVM->DetachCurrentThread();
|
||||||
|
return SWITCH_STATUS_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
jint result = SWITCH_STATUS_FALSE;
|
||||||
|
jmethodID handlerMethod = env->GetMethodID(handlerClass, method, "(Ljava/lang/String;)I");
|
||||||
|
if ( handlerMethod != NULL ) {
|
||||||
|
char *uuid = switch_core_session_get_uuid(session);
|
||||||
|
jstring javaUuid = env->NewStringUTF(uuid);
|
||||||
|
result = env->CallIntMethod(originate_state_handler, handlerMethod, javaUuid);
|
||||||
|
env->DeleteLocalRef(javaUuid);
|
||||||
|
}
|
||||||
|
|
||||||
|
env->DeleteLocalRef(handlerClass);
|
||||||
|
if ( needDetach ) javaVM->DetachCurrentThread();
|
||||||
|
return (switch_status_t)result;
|
||||||
|
}
|
||||||
|
|
||||||
|
return SWITCH_STATUS_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch_status_t originate_on_init(switch_core_session_t *session) {
|
||||||
|
return originate_handler_method(session, "onInit");
|
||||||
|
}
|
||||||
|
|
||||||
|
switch_status_t originate_on_routing(switch_core_session_t *session) {
|
||||||
|
return originate_handler_method(session, "onRouting");
|
||||||
|
}
|
||||||
|
|
||||||
|
switch_status_t originate_on_execute(switch_core_session_t *session) {
|
||||||
|
return originate_handler_method(session, "onExecute");
|
||||||
|
}
|
||||||
|
|
||||||
|
switch_status_t originate_on_hangup(switch_core_session_t *session) {
|
||||||
|
if ( originate_state_handler != NULL ) {
|
||||||
|
JNIEnv *env = NULL;
|
||||||
|
bool needDetach = false;
|
||||||
|
|
||||||
|
jint envStatus = javaVM->GetEnv((void**)&env, JNI_VERSION_1_4);
|
||||||
|
if ( envStatus == JNI_EDETACHED ) {
|
||||||
|
envStatus = javaVM->AttachCurrentThread((void**)&env, NULL);
|
||||||
|
if ( envStatus == JNI_OK ) needDetach = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( envStatus != JNI_OK ) {
|
||||||
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error getting JNIEnv!\n");
|
||||||
|
return SWITCH_STATUS_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
jclass handlerClass = env->GetObjectClass(originate_state_handler);
|
||||||
|
if ( handlerClass == NULL ) {
|
||||||
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error getting handler class!\n");
|
||||||
|
if ( needDetach ) javaVM->DetachCurrentThread();
|
||||||
|
return SWITCH_STATUS_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
jint result = SWITCH_STATUS_FALSE;
|
||||||
|
jmethodID handlerMethod = env->GetMethodID(handlerClass, "onHangup", "(Ljava/lang/String;Ljava/lang/String;)I");
|
||||||
|
if ( handlerMethod != NULL ) {
|
||||||
|
switch_channel_t *channel = switch_core_session_get_channel(session);
|
||||||
|
const char *uuid = switch_core_session_get_uuid(session);
|
||||||
|
const char *cause = switch_channel_cause2str(switch_channel_get_cause(channel));
|
||||||
|
jstring javaUuid = env->NewStringUTF(uuid);
|
||||||
|
jstring javaCause = env->NewStringUTF(cause);
|
||||||
|
result = env->CallIntMethod(originate_state_handler, handlerMethod, javaUuid, javaCause);
|
||||||
|
env->DeleteLocalRef(javaUuid);
|
||||||
|
env->DeleteLocalRef(javaCause);
|
||||||
|
}
|
||||||
|
|
||||||
|
env->DeleteLocalRef(handlerClass);
|
||||||
|
if ( needDetach ) javaVM->DetachCurrentThread();
|
||||||
|
return (switch_status_t)result;
|
||||||
|
}
|
||||||
|
|
||||||
|
return SWITCH_STATUS_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch_status_t originate_on_exchange_media(switch_core_session_t *session) {
|
||||||
|
return originate_handler_method(session, "onExchangeMedia");
|
||||||
|
}
|
||||||
|
|
||||||
|
switch_status_t originate_on_soft_execute(switch_core_session_t *session) {
|
||||||
|
return originate_handler_method(session, "onSoftExecute");
|
||||||
|
}
|
||||||
|
|
||||||
|
switch_status_t originate_on_consume_media(switch_core_session_t *session) {
|
||||||
|
return originate_handler_method(session, "onConsumeMedia");
|
||||||
|
}
|
||||||
|
|
||||||
|
switch_status_t originate_on_hibernate(switch_core_session_t *session) {
|
||||||
|
return originate_handler_method(session, "onHibernate");
|
||||||
|
}
|
||||||
|
|
||||||
|
switch_status_t originate_on_reset(switch_core_session_t *session) {
|
||||||
|
return originate_handler_method(session, "onReset");
|
||||||
|
}
|
||||||
|
|
||||||
|
switch_status_t originate_on_park(switch_core_session_t *session) {
|
||||||
|
return originate_handler_method(session, "onPark");
|
||||||
|
}
|
||||||
|
|
||||||
|
switch_status_t originate_on_reporting(switch_core_session_t *session) {
|
||||||
|
return originate_handler_method(session, "onReporting");
|
||||||
|
}
|
||||||
|
|
||||||
|
switch_status_t originate_on_destroy(switch_core_session_t *session) {
|
||||||
|
return originate_handler_method(session, "onDestroy");
|
||||||
|
}
|
||||||
|
|
||||||
|
switch_state_handler_table_t originate_state_handlers = {
|
||||||
|
/*.on_init */ &originate_on_init,
|
||||||
|
/*.on_routing */ &originate_on_routing,
|
||||||
|
/*.on_execute */ &originate_on_execute,
|
||||||
|
/*.on_hangup */ &originate_on_hangup,
|
||||||
|
/*.on_exchange_media */ &originate_on_exchange_media,
|
||||||
|
/*.on_soft_execute */ &originate_on_soft_execute,
|
||||||
|
/*.on_consume_media */ &originate_on_consume_media,
|
||||||
|
/*.on_hibernate */ &originate_on_hibernate,
|
||||||
|
/*.on_reset */ &originate_on_reset,
|
||||||
|
/*.on_park */ &originate_on_park,
|
||||||
|
/*.on_reporting */ &originate_on_reporting,
|
||||||
|
/*.on_destroy */ &originate_on_destroy
|
||||||
|
};
|
||||||
|
|
||||||
|
int JavaSession::originate(JavaSession* aleg, char* destination, int timeout) {
|
||||||
|
switch_state_handler_table_t *stateHandlers = NULL;
|
||||||
|
if ( originate_state_handler != NULL ) stateHandlers = &originate_state_handlers;
|
||||||
|
return CoreSession::originate(aleg, destination, timeout, stateHandlers);
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -6,6 +6,16 @@
|
|||||||
|
|
||||||
extern JavaVM *javaVM;
|
extern JavaVM *javaVM;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
SWITCH_DECLARE(void) setOriginateStateHandler(jobject stateHandler);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
class JavaSession:public CoreSession {
|
class JavaSession:public CoreSession {
|
||||||
public:
|
public:
|
||||||
JavaSession();
|
JavaSession();
|
||||||
@ -19,6 +29,7 @@ class JavaSession:public CoreSession {
|
|||||||
void setHangupHook(jobject hangupHook);
|
void setHangupHook(jobject hangupHook);
|
||||||
virtual void check_hangup_hook();
|
virtual void check_hangup_hook();
|
||||||
virtual switch_status_t run_dtmf_callback(void *input, switch_input_type_t itype);
|
virtual switch_status_t run_dtmf_callback(void *input, switch_input_type_t itype);
|
||||||
|
int originate(JavaSession* aleg, char* destination, int timeout);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
%include ../../../../swig_common.i
|
%include ../../../../swig_common.i
|
||||||
/** insert the following includes into generated code so it compiles */
|
/** insert the following includes into generated code so it compiles */
|
||||||
%{
|
%{
|
||||||
|
#include "switch.h"
|
||||||
#include "switch_cpp.h"
|
#include "switch_cpp.h"
|
||||||
#include "freeswitch_java.h"
|
#include "freeswitch_java.h"
|
||||||
%}
|
%}
|
||||||
@ -53,7 +54,11 @@
|
|||||||
%typemap(javain) char *terminator "$javainput"
|
%typemap(javain) char *terminator "$javainput"
|
||||||
%typemap(freearg) char *terminator ""
|
%typemap(freearg) char *terminator ""
|
||||||
|
|
||||||
|
#define SWITCH_DECLARE(type) type
|
||||||
|
%javamethodmodifiers CoreSession::originate(CoreSession *, char *, int, switch_state_handler_table_t *) "protected";
|
||||||
|
%javaexception ("java.util.TooManyListenersException") setOriginateStateHandler(jobject);
|
||||||
|
%typemap(jtype) jobject stateHandler "org.freeswitch.StateHandler"
|
||||||
|
%typemap(jstype) jobject stateHandler "org.freeswitch.StateHandler"
|
||||||
|
|
||||||
%include "enums.swg"
|
%include "enums.swg"
|
||||||
%include switch_swigable_cpp.h
|
%include switch_swigable_cpp.h
|
||||||
|
@ -0,0 +1,15 @@
|
|||||||
|
package org.freeswitch.example;
|
||||||
|
|
||||||
|
import org.freeswitch.swig.freeswitch;
|
||||||
|
|
||||||
|
public class ApplicationLauncher {
|
||||||
|
|
||||||
|
public static final void startup(String arg) {
|
||||||
|
try {
|
||||||
|
freeswitch.setOriginateStateHandler(OriginateStateHandler.getInstance());
|
||||||
|
} catch (Exception e) {
|
||||||
|
freeswitch.console_log("err", "Error registering originate state handler");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
package org.freeswitch.example;
|
||||||
|
|
||||||
|
import org.freeswitch.StateHandler.OnHangupHandler;
|
||||||
|
|
||||||
|
public class OriginateStateHandler implements OnHangupHandler {
|
||||||
|
|
||||||
|
private static OriginateStateHandler instance = null;
|
||||||
|
|
||||||
|
public static final OriginateStateHandler getInstance() {
|
||||||
|
if ( instance == null ) instance = new OriginateStateHandler();
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
private OriginateStateHandler() {
|
||||||
|
// hide constructor
|
||||||
|
}
|
||||||
|
|
||||||
|
public int onHangup(String uuid, String cause) {
|
||||||
|
return 1; // SWITCH_STATUS_FALSE
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,54 @@
|
|||||||
|
package org.freeswitch;
|
||||||
|
|
||||||
|
public interface StateHandler {
|
||||||
|
|
||||||
|
public interface OnInitHandler extends StateHandler {
|
||||||
|
public int onInit(String uuid);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static interface OnRoutingHandler extends StateHandler {
|
||||||
|
public int onRouting(String uuid);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static interface OnExecuteHandler extends StateHandler {
|
||||||
|
public int onExecute(String uuid);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static interface OnHangupHandler extends StateHandler {
|
||||||
|
public int onHangup(String uuid, String cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static interface OnExchangeMediaHandler extends StateHandler {
|
||||||
|
public int onExchangeMedia(String uuid);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static interface OnSoftExecuteHandler extends StateHandler {
|
||||||
|
public int onSoftExecute(String uuid);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static interface OnConsumeMediaHandler extends StateHandler {
|
||||||
|
public int onConsumeMedia(String uuid);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static interface OnHibernateHandler extends StateHandler {
|
||||||
|
public int onHibernate(String uuid);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static interface OnResetHandler extends StateHandler {
|
||||||
|
public int onReset(String uuid);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static interface OnParkHandler extends StateHandler {
|
||||||
|
public int onPark(String uuid);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static interface OnReportingHandler extends StateHandler {
|
||||||
|
public int onReporting(String uuid);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static interface OnDestroyHandler extends StateHandler {
|
||||||
|
public int onDestroy(String uuid);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user