diff --git a/android/Makefile b/android/Makefile index adb9174..28c41f8 100644 --- a/android/Makefile +++ b/android/Makefile @@ -82,5 +82,5 @@ sigs.txt: bin/classes/$(CLASSPATH)/lib3270.class jni/lib3270jni.h: bin/classes/$(CLASSPATH)/lib3270.class @echo " GEN `basename $@`" - @$(JAVAH) -o $@ -classpath bin/classes $(subst /,.,$(CLASSPATH)).lib3270 + @$(JAVAH) -o $@ -classpath $(ANDROIDSDK)/platforms/android-15/android.jar:bin/classes $(subst /,.,$(CLASSPATH)).lib3270 diff --git a/android/jni/main.cpp b/android/jni/main.cpp index 840ee49..84ae351 100644 --- a/android/jni/main.cpp +++ b/android/jni/main.cpp @@ -30,6 +30,16 @@ #include #include +/*--[ Structs ]--------------------------------------------------------------------------------------*/ + + typedef struct _timer + { + size_t sz; + bool enabled; + H3270 * session; + void (*proc)(H3270 *session); + } TIMER; + /*--[ Globals ]--------------------------------------------------------------------------------------*/ const char *java_class_name = "br/com/bb/pw3270/lib3270"; @@ -116,6 +126,73 @@ static int write_buffer(H3270 *session, unsigned const char *buf, int len) return rc; } +static void * add_timeout(unsigned long interval_ms, H3270 *session, void (*proc)(H3270 *session)) +{ + if(session->widget) + { + JNIEnv * env = ((INFO *) session->widget)->env; + jobject obj = ((INFO *) session->widget)->obj; + jclass cls = env->GetObjectClass(obj); + jmethodID mid = env->GetMethodID(cls, "newTimer", "(JI)V"); + TIMER * timer = (TIMER *) lib3270_malloc(sizeof(TIMER)); + + timer->sz = sizeof(timer); + timer->enabled = true; + timer->session = session; + timer->proc = proc; + + __android_log_print(ANDROID_LOG_VERBOSE, PACKAGE_NAME, "Timer ID %08lx created",(unsigned long) timer); + + env->CallVoidMethod(obj,mid, (jlong) timer, (jint) interval_ms); + + } + else + { + __android_log_print(ANDROID_LOG_VERBOSE, PACKAGE_NAME, "Can set timer, no jni env for active session"); + } + + +} + +static void remove_timeout(void *timer) +{ + if(timer == NULL || ((TIMER *) timer)->sz != sizeof(TIMER)) + { + __android_log_print(ANDROID_LOG_VERBOSE, PACKAGE_NAME, "Invalid timer ID %08lx",(unsigned long) timer); + return; + } + + __android_log_print(ANDROID_LOG_VERBOSE, PACKAGE_NAME, "Removing timeout %d",(int) timer); + ((TIMER *) timer)->enabled = false; + +} + +JNIEXPORT void JNICALL Java_br_com_bb_pw3270_lib3270_timerFinish(JNIEnv *env, jobject obj, jlong id) +{ + TIMER *timer = (TIMER *) id; + + if(timer == NULL) + { + __android_log_print(ANDROID_LOG_VERBOSE, PACKAGE_NAME, "Unexpected call to %s: No timer ID",__FUNCTION__); + return; + } + + if(timer->sz != sizeof(TIMER)) + { + __android_log_print(ANDROID_LOG_VERBOSE, PACKAGE_NAME, + "Invalid timer ID %08lx in %s (sz=%d, expected=%d)",(unsigned long) timer, + __FUNCTION__,timer->sz,sizeof(timer)); + return; + } + + if(timer->enabled) + timer->proc(timer->session); + + lib3270_free(timer); +} + + + JNIEXPORT jint JNICALL Java_br_com_bb_pw3270_lib3270_init(JNIEnv *env, jclass obj) { H3270 * session = lib3270_session_new(""); @@ -123,6 +200,7 @@ JNIEXPORT jint JNICALL Java_br_com_bb_pw3270_lib3270_init(JNIEnv *env, jclass ob __android_log_print(ANDROID_LOG_VERBOSE, PACKAGE_NAME, "Initializing session %p",session); lib3270_set_popup_handler(popuphandler); + lib3270_register_time_handlers(add_timeout,remove_timeout); session->write = write_buffer; session->changed = changed; diff --git a/android/lib3270NDK.cbp b/android/lib3270NDK.cbp index 45f933a..22e7a4e 100644 --- a/android/lib3270NDK.cbp +++ b/android/lib3270NDK.cbp @@ -36,6 +36,7 @@ + @@ -57,6 +58,7 @@ + diff --git a/android/src/br/com/bb/pw3270/lib3270.java b/android/src/br/com/bb/pw3270/lib3270.java index aaf0759..2aa2f89 100644 --- a/android/src/br/com/bb/pw3270/lib3270.java +++ b/android/src/br/com/bb/pw3270/lib3270.java @@ -3,27 +3,29 @@ package br.com.bb.pw3270; import java.lang.Thread; import android.os.Handler; import android.os.Message; +import android.os.CountDownTimer; import android.util.Log; import javax.net.SocketFactory; import java.net.Socket; import javax.net.ssl.SSLSocketFactory; import java.io.DataInputStream; import java.io.DataOutputStream; +import java.util.Vector; public class lib3270 { private NetworkThread mainloop; private static final String TAG = "lib3270"; - private boolean changed; - private boolean connected = false; + private boolean changed; + private boolean connected = false; - DataOutputStream outData = null; - DataInputStream inData = null; + DataOutputStream outData = null; + DataInputStream inData = null; - private String hostname = "3270.df.bb"; - private int port = 8023; - private boolean ssl = false; + private String hostname = "3270.df.bb"; + private int port = 8023; + private boolean ssl = false; static { @@ -40,6 +42,34 @@ public class lib3270 mainloop = null; } + private class timer extends CountDownTimer + { + private long id; + private lib3270 terminal; + + timer(lib3270 session, long timer_id, int msec) + { + super(msec,msec); + + terminal = session; + id = timer_id; + + Log.d(TAG,"Timer " + id + " set to " + msec + " ms"); + + this.start(); + } + + public void onTick(long millisUntilFinished) + { + } + + public void onFinish() + { + Log.d(TAG,"Timer " + id + " finished"); + terminal.timerFinish(id); + } + + } private class popupMessageInfo { public String title; @@ -372,6 +402,14 @@ public class lib3270 public native boolean isConnected(); public native boolean isTerminalReady(); + // Timers + protected void newTimer(long id, int msec) + { + new timer(this,id,msec); + } + + private native void timerFinish(long id); + // Keyboard actions public native void sendEnter(); public native void sendPFkey(int id); diff --git a/src/include/lib3270.h b/src/include/lib3270.h index 95b579a..e898286 100644 --- a/src/include/lib3270.h +++ b/src/include/lib3270.h @@ -590,6 +590,15 @@ int LIB3270_EXPORT lib3270_register_handlers(const struct lib3270_callbacks *cbk); /** + * Register time handlers. + * + * @param add Callback for adding a timeout + * @param rm Callback for removing a timeout + * + */ + void LIB3270_EXPORT lib3270_register_time_handlers(void * (*add)(unsigned long interval_ms, H3270 *session, void (*proc)(H3270 *session)), void (*rm)(void *timer)); + + /** * Get program message. * * @see LIB3270_MESSAGE diff --git a/src/include/lib3270/session.h b/src/include/lib3270/session.h index e698152..cd5f430 100644 --- a/src/include/lib3270/session.h +++ b/src/include/lib3270/session.h @@ -241,7 +241,7 @@ unsigned char hisopts[LIB3270_TELNET_N_OPTS]; // kybd.c - unsigned int kybdlock; + unsigned int kybdlock; /**< keyboard lock state */ unsigned char aid; /**< current attention ID */ void * unlock_id; time_t unlock_delay_time; diff --git a/src/lib3270/iocalls.c b/src/lib3270/iocalls.c index bc34380..18c590d 100644 --- a/src/lib3270/iocalls.c +++ b/src/lib3270/iocalls.c @@ -614,6 +614,16 @@ void remove_input_calls(H3270 *session) } } +LIB3270_EXPORT void lib3270_register_time_handlers(void * (*add)(unsigned long interval_ms, H3270 *session, void (*proc)(H3270 *session)), void (*rm)(void *timer)) +{ + if(add) + add_timeout = add; + + if(rm) + remove_timeout = rm; + +} + LIB3270_EXPORT int lib3270_register_handlers(const struct lib3270_callbacks *cbk) { if(!cbk) @@ -622,11 +632,7 @@ LIB3270_EXPORT int lib3270_register_handlers(const struct lib3270_callbacks *cbk if(cbk->sz != sizeof(struct lib3270_callbacks)) return EINVAL; - if(cbk->AddTimeOut) - add_timeout = cbk->AddTimeOut; - - if(cbk->RemoveTimeOut) - remove_timeout = cbk->RemoveTimeOut; + lib3270_register_time_handlers(cbk->AddTimeOut,cbk->RemoveTimeOut); if(cbk->AddInput) add_input = cbk->AddInput; diff --git a/src/lib3270/kybdc.h b/src/lib3270/kybdc.h index 3c49da8..6a26324 100644 --- a/src/lib3270/kybdc.h +++ b/src/lib3270/kybdc.h @@ -19,39 +19,57 @@ #ifndef KYBDC_H_INCLUDED -#define KYBDC_H_INCLUDED - -/* keyboard lock states */ -// LIB3270_INTERNAL unsigned int kybdlock; -#define KL_OERR_MASK 0x000f -#define KL_OERR_PROTECTED 1 -#define KL_OERR_NUMERIC 2 -#define KL_OERR_OVERFLOW 3 -#define KL_OERR_DBCS 4 -#define KL_NOT_CONNECTED 0x0010 -#define KL_AWAITING_FIRST 0x0020 -#define KL_OIA_TWAIT 0x0040 -#define KL_OIA_LOCKED 0x0080 -#define KL_DEFERRED_UNLOCK 0x0100 -#define KL_ENTER_INHIBIT 0x0200 -#define KL_SCROLLED 0x0400 -#define KL_OIA_MINUS 0x0800 - - -/* other functions */ -LIB3270_INTERNAL void add_xk(KeySym key, KeySym assoc); -LIB3270_INTERNAL void clear_xks(void); -LIB3270_INTERNAL void do_reset(H3270 *session, Boolean explicit); -LIB3270_INTERNAL void hex_input(char *s); -LIB3270_INTERNAL void kybdlock_clr(H3270 *session, unsigned int bits, const char *cause); -LIB3270_INTERNAL void kybd_inhibit(H3270 *session, Boolean inhibit); -LIB3270_INTERNAL void kybd_init(void); -LIB3270_INTERNAL int kybd_prime(void); -LIB3270_INTERNAL void kybd_scroll_lock(Boolean lock); -LIB3270_INTERNAL Boolean run_ta(void); -LIB3270_INTERNAL int state_from_keymap(char keymap[32]); -LIB3270_INTERNAL void kybd_connect(H3270 *session, int connected, void *dunno); -LIB3270_INTERNAL void kybd_in3270(H3270 *session, int in3270 unused, void *dunno); + #define KYBDC_H_INCLUDED + + /* keyboard lock states */ + typedef enum lib3270_kl_state + { + LIB3270_KL_OERR_MASK = 0x000f, + LIB3270_KL_OERR_PROTECTED = 0x0001, + LIB3270_KL_OERR_NUMERIC = 0x0002, + LIB3270_KL_OERR_OVERFLOW = 0x0003, + LIB3270_KL_OERR_DBCS = 0x0004, + LIB3270_KL_NOT_CONNECTED = 0x0010, + LIB3270_KL_AWAITING_FIRST = 0x0020, + LIB3270_KL_OIA_TWAIT = 0x0040, + LIB3270_KL_OIA_LOCKED = 0x0080, + LIB3270_KL_DEFERRED_UNLOCK = 0x0100, + LIB3270_KL_ENTER_INHIBIT = 0x0200, + LIB3270_KL_SCROLLED = 0x0400, + LIB3270_KL_OIA_MINUS = 0x0800 + + } LIB3270_KL_STATE; + + #define KL_OERR_MASK LIB3270_KL_OERR_MASK + #define KL_OERR_PROTECTED LIB3270_KL_OERR_PROTECTED + #define KL_OERR_NUMERIC LIB3270_KL_OERR_NUMERIC + #define KL_OERR_OVERFLOW LIB3270_KL_OERR_OVERFLOW + #define KL_OERR_DBCS LIB3270_KL_OERR_DBCS + #define KL_NOT_CONNECTED LIB3270_KL_NOT_CONNECTED + #define KL_AWAITING_FIRST LIB3270_KL_AWAITING_FIRST + #define KL_OIA_TWAIT LIB3270_KL_OIA_TWAIT + #define KL_OIA_LOCKED LIB3270_KL_OIA_LOCKED + #define KL_DEFERRED_UNLOCK LIB3270_KL_DEFERRED_UNLOCK + #define KL_ENTER_INHIBIT LIB3270_KL_ENTER_INHIBIT + #define KL_SCROLLED LIB3270_KL_SCROLLED + #define KL_OIA_MINUS LIB3270_KL_OIA_MINUS + + + + /* other functions */ + LIB3270_INTERNAL void add_xk(KeySym key, KeySym assoc); + LIB3270_INTERNAL void clear_xks(void); + LIB3270_INTERNAL void do_reset(H3270 *session, Boolean explicit); + LIB3270_INTERNAL void hex_input(char *s); + LIB3270_INTERNAL void kybdlock_clr(H3270 *session, unsigned int bits, const char *cause); + LIB3270_INTERNAL void kybd_inhibit(H3270 *session, Boolean inhibit); + LIB3270_INTERNAL void kybd_init(void); + LIB3270_INTERNAL int kybd_prime(void); + LIB3270_INTERNAL void kybd_scroll_lock(Boolean lock); + LIB3270_INTERNAL Boolean run_ta(void); + LIB3270_INTERNAL int state_from_keymap(char keymap[32]); + LIB3270_INTERNAL void kybd_connect(H3270 *session, int connected, void *dunno); + LIB3270_INTERNAL void kybd_in3270(H3270 *session, int in3270 unused, void *dunno); #endif /* KYBDC_H_INCLUDED */ -- libgit2 0.21.2