Commit 8223b6f76b61a2d193a7a38da5de924c53b3752d
1 parent
2b74680a
Exists in
master
and in
5 other branches
Implementando temporização pelas funções do java
Showing
8 changed files
with
198 additions
and
47 deletions
Show diff stats
android/Makefile
... | ... | @@ -82,5 +82,5 @@ sigs.txt: bin/classes/$(CLASSPATH)/lib3270.class |
82 | 82 | |
83 | 83 | jni/lib3270jni.h: bin/classes/$(CLASSPATH)/lib3270.class |
84 | 84 | @echo " GEN `basename $@`" |
85 | - @$(JAVAH) -o $@ -classpath bin/classes $(subst /,.,$(CLASSPATH)).lib3270 | |
85 | + @$(JAVAH) -o $@ -classpath $(ANDROIDSDK)/platforms/android-15/android.jar:bin/classes $(subst /,.,$(CLASSPATH)).lib3270 | |
86 | 86 | ... | ... |
android/jni/main.cpp
... | ... | @@ -30,6 +30,16 @@ |
30 | 30 | #include <lib3270/popup.h> |
31 | 31 | #include <lib3270/internals.h> |
32 | 32 | |
33 | +/*--[ Structs ]--------------------------------------------------------------------------------------*/ | |
34 | + | |
35 | + typedef struct _timer | |
36 | + { | |
37 | + size_t sz; | |
38 | + bool enabled; | |
39 | + H3270 * session; | |
40 | + void (*proc)(H3270 *session); | |
41 | + } TIMER; | |
42 | + | |
33 | 43 | /*--[ Globals ]--------------------------------------------------------------------------------------*/ |
34 | 44 | |
35 | 45 | 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) |
116 | 126 | return rc; |
117 | 127 | } |
118 | 128 | |
129 | +static void * add_timeout(unsigned long interval_ms, H3270 *session, void (*proc)(H3270 *session)) | |
130 | +{ | |
131 | + if(session->widget) | |
132 | + { | |
133 | + JNIEnv * env = ((INFO *) session->widget)->env; | |
134 | + jobject obj = ((INFO *) session->widget)->obj; | |
135 | + jclass cls = env->GetObjectClass(obj); | |
136 | + jmethodID mid = env->GetMethodID(cls, "newTimer", "(JI)V"); | |
137 | + TIMER * timer = (TIMER *) lib3270_malloc(sizeof(TIMER)); | |
138 | + | |
139 | + timer->sz = sizeof(timer); | |
140 | + timer->enabled = true; | |
141 | + timer->session = session; | |
142 | + timer->proc = proc; | |
143 | + | |
144 | + __android_log_print(ANDROID_LOG_VERBOSE, PACKAGE_NAME, "Timer ID %08lx created",(unsigned long) timer); | |
145 | + | |
146 | + env->CallVoidMethod(obj,mid, (jlong) timer, (jint) interval_ms); | |
147 | + | |
148 | + } | |
149 | + else | |
150 | + { | |
151 | + __android_log_print(ANDROID_LOG_VERBOSE, PACKAGE_NAME, "Can set timer, no jni env for active session"); | |
152 | + } | |
153 | + | |
154 | + | |
155 | +} | |
156 | + | |
157 | +static void remove_timeout(void *timer) | |
158 | +{ | |
159 | + if(timer == NULL || ((TIMER *) timer)->sz != sizeof(TIMER)) | |
160 | + { | |
161 | + __android_log_print(ANDROID_LOG_VERBOSE, PACKAGE_NAME, "Invalid timer ID %08lx",(unsigned long) timer); | |
162 | + return; | |
163 | + } | |
164 | + | |
165 | + __android_log_print(ANDROID_LOG_VERBOSE, PACKAGE_NAME, "Removing timeout %d",(int) timer); | |
166 | + ((TIMER *) timer)->enabled = false; | |
167 | + | |
168 | +} | |
169 | + | |
170 | +JNIEXPORT void JNICALL Java_br_com_bb_pw3270_lib3270_timerFinish(JNIEnv *env, jobject obj, jlong id) | |
171 | +{ | |
172 | + TIMER *timer = (TIMER *) id; | |
173 | + | |
174 | + if(timer == NULL) | |
175 | + { | |
176 | + __android_log_print(ANDROID_LOG_VERBOSE, PACKAGE_NAME, "Unexpected call to %s: No timer ID",__FUNCTION__); | |
177 | + return; | |
178 | + } | |
179 | + | |
180 | + if(timer->sz != sizeof(TIMER)) | |
181 | + { | |
182 | + __android_log_print(ANDROID_LOG_VERBOSE, PACKAGE_NAME, | |
183 | + "Invalid timer ID %08lx in %s (sz=%d, expected=%d)",(unsigned long) timer, | |
184 | + __FUNCTION__,timer->sz,sizeof(timer)); | |
185 | + return; | |
186 | + } | |
187 | + | |
188 | + if(timer->enabled) | |
189 | + timer->proc(timer->session); | |
190 | + | |
191 | + lib3270_free(timer); | |
192 | +} | |
193 | + | |
194 | + | |
195 | + | |
119 | 196 | JNIEXPORT jint JNICALL Java_br_com_bb_pw3270_lib3270_init(JNIEnv *env, jclass obj) |
120 | 197 | { |
121 | 198 | H3270 * session = lib3270_session_new(""); |
... | ... | @@ -123,6 +200,7 @@ JNIEXPORT jint JNICALL Java_br_com_bb_pw3270_lib3270_init(JNIEnv *env, jclass ob |
123 | 200 | __android_log_print(ANDROID_LOG_VERBOSE, PACKAGE_NAME, "Initializing session %p",session); |
124 | 201 | |
125 | 202 | lib3270_set_popup_handler(popuphandler); |
203 | + lib3270_register_time_handlers(add_timeout,remove_timeout); | |
126 | 204 | |
127 | 205 | session->write = write_buffer; |
128 | 206 | session->changed = changed; | ... | ... |
android/lib3270NDK.cbp
... | ... | @@ -36,6 +36,7 @@ |
36 | 36 | <Unit filename="../src/include/lib3270/actions.h" /> |
37 | 37 | <Unit filename="../src/include/lib3270/html.h" /> |
38 | 38 | <Unit filename="../src/include/lib3270/internals.h" /> |
39 | + <Unit filename="../src/include/lib3270/session.h" /> | |
39 | 40 | <Unit filename="../src/lib3270/html.c"> |
40 | 41 | <Option compilerVar="CC" /> |
41 | 42 | </Unit> |
... | ... | @@ -57,6 +58,7 @@ |
57 | 58 | <Unit filename="jni/lib3270jni.h" /> |
58 | 59 | <Unit filename="jni/main.cpp" /> |
59 | 60 | <Unit filename="jni/misc.cpp" /> |
61 | + <Unit filename="src/br/com/bb/pw3270/PW3270Activity.java" /> | |
60 | 62 | <Unit filename="src/br/com/bb/pw3270/lib3270.java" /> |
61 | 63 | <Extensions> |
62 | 64 | <code_completion /> | ... | ... |
android/src/br/com/bb/pw3270/lib3270.java
... | ... | @@ -3,27 +3,29 @@ package br.com.bb.pw3270; |
3 | 3 | import java.lang.Thread; |
4 | 4 | import android.os.Handler; |
5 | 5 | import android.os.Message; |
6 | +import android.os.CountDownTimer; | |
6 | 7 | import android.util.Log; |
7 | 8 | import javax.net.SocketFactory; |
8 | 9 | import java.net.Socket; |
9 | 10 | import javax.net.ssl.SSLSocketFactory; |
10 | 11 | import java.io.DataInputStream; |
11 | 12 | import java.io.DataOutputStream; |
13 | +import java.util.Vector; | |
12 | 14 | |
13 | 15 | public class lib3270 |
14 | 16 | { |
15 | 17 | private NetworkThread mainloop; |
16 | 18 | private static final String TAG = "lib3270"; |
17 | 19 | |
18 | - private boolean changed; | |
19 | - private boolean connected = false; | |
20 | + private boolean changed; | |
21 | + private boolean connected = false; | |
20 | 22 | |
21 | - DataOutputStream outData = null; | |
22 | - DataInputStream inData = null; | |
23 | + DataOutputStream outData = null; | |
24 | + DataInputStream inData = null; | |
23 | 25 | |
24 | - private String hostname = "3270.df.bb"; | |
25 | - private int port = 8023; | |
26 | - private boolean ssl = false; | |
26 | + private String hostname = "3270.df.bb"; | |
27 | + private int port = 8023; | |
28 | + private boolean ssl = false; | |
27 | 29 | |
28 | 30 | static |
29 | 31 | { |
... | ... | @@ -40,6 +42,34 @@ public class lib3270 |
40 | 42 | mainloop = null; |
41 | 43 | } |
42 | 44 | |
45 | + private class timer extends CountDownTimer | |
46 | + { | |
47 | + private long id; | |
48 | + private lib3270 terminal; | |
49 | + | |
50 | + timer(lib3270 session, long timer_id, int msec) | |
51 | + { | |
52 | + super(msec,msec); | |
53 | + | |
54 | + terminal = session; | |
55 | + id = timer_id; | |
56 | + | |
57 | + Log.d(TAG,"Timer " + id + " set to " + msec + " ms"); | |
58 | + | |
59 | + this.start(); | |
60 | + } | |
61 | + | |
62 | + public void onTick(long millisUntilFinished) | |
63 | + { | |
64 | + } | |
65 | + | |
66 | + public void onFinish() | |
67 | + { | |
68 | + Log.d(TAG,"Timer " + id + " finished"); | |
69 | + terminal.timerFinish(id); | |
70 | + } | |
71 | + | |
72 | + } | |
43 | 73 | private class popupMessageInfo |
44 | 74 | { |
45 | 75 | public String title; |
... | ... | @@ -372,6 +402,14 @@ public class lib3270 |
372 | 402 | public native boolean isConnected(); |
373 | 403 | public native boolean isTerminalReady(); |
374 | 404 | |
405 | + // Timers | |
406 | + protected void newTimer(long id, int msec) | |
407 | + { | |
408 | + new timer(this,id,msec); | |
409 | + } | |
410 | + | |
411 | + private native void timerFinish(long id); | |
412 | + | |
375 | 413 | // Keyboard actions |
376 | 414 | public native void sendEnter(); |
377 | 415 | public native void sendPFkey(int id); | ... | ... |
src/include/lib3270.h
... | ... | @@ -590,6 +590,15 @@ |
590 | 590 | int LIB3270_EXPORT lib3270_register_handlers(const struct lib3270_callbacks *cbk); |
591 | 591 | |
592 | 592 | /** |
593 | + * Register time handlers. | |
594 | + * | |
595 | + * @param add Callback for adding a timeout | |
596 | + * @param rm Callback for removing a timeout | |
597 | + * | |
598 | + */ | |
599 | + void LIB3270_EXPORT lib3270_register_time_handlers(void * (*add)(unsigned long interval_ms, H3270 *session, void (*proc)(H3270 *session)), void (*rm)(void *timer)); | |
600 | + | |
601 | + /** | |
593 | 602 | * Get program message. |
594 | 603 | * |
595 | 604 | * @see LIB3270_MESSAGE | ... | ... |
src/include/lib3270/session.h
... | ... | @@ -241,7 +241,7 @@ |
241 | 241 | unsigned char hisopts[LIB3270_TELNET_N_OPTS]; |
242 | 242 | |
243 | 243 | // kybd.c |
244 | - unsigned int kybdlock; | |
244 | + unsigned int kybdlock; /**< keyboard lock state */ | |
245 | 245 | unsigned char aid; /**< current attention ID */ |
246 | 246 | void * unlock_id; |
247 | 247 | time_t unlock_delay_time; | ... | ... |
src/lib3270/iocalls.c
... | ... | @@ -614,6 +614,16 @@ void remove_input_calls(H3270 *session) |
614 | 614 | } |
615 | 615 | } |
616 | 616 | |
617 | +LIB3270_EXPORT void lib3270_register_time_handlers(void * (*add)(unsigned long interval_ms, H3270 *session, void (*proc)(H3270 *session)), void (*rm)(void *timer)) | |
618 | +{ | |
619 | + if(add) | |
620 | + add_timeout = add; | |
621 | + | |
622 | + if(rm) | |
623 | + remove_timeout = rm; | |
624 | + | |
625 | +} | |
626 | + | |
617 | 627 | LIB3270_EXPORT int lib3270_register_handlers(const struct lib3270_callbacks *cbk) |
618 | 628 | { |
619 | 629 | if(!cbk) |
... | ... | @@ -622,11 +632,7 @@ LIB3270_EXPORT int lib3270_register_handlers(const struct lib3270_callbacks *cbk |
622 | 632 | if(cbk->sz != sizeof(struct lib3270_callbacks)) |
623 | 633 | return EINVAL; |
624 | 634 | |
625 | - if(cbk->AddTimeOut) | |
626 | - add_timeout = cbk->AddTimeOut; | |
627 | - | |
628 | - if(cbk->RemoveTimeOut) | |
629 | - remove_timeout = cbk->RemoveTimeOut; | |
635 | + lib3270_register_time_handlers(cbk->AddTimeOut,cbk->RemoveTimeOut); | |
630 | 636 | |
631 | 637 | if(cbk->AddInput) |
632 | 638 | add_input = cbk->AddInput; | ... | ... |
src/lib3270/kybdc.h
... | ... | @@ -19,39 +19,57 @@ |
19 | 19 | |
20 | 20 | #ifndef KYBDC_H_INCLUDED |
21 | 21 | |
22 | -#define KYBDC_H_INCLUDED | |
23 | - | |
24 | -/* keyboard lock states */ | |
25 | -// LIB3270_INTERNAL unsigned int kybdlock; | |
26 | -#define KL_OERR_MASK 0x000f | |
27 | -#define KL_OERR_PROTECTED 1 | |
28 | -#define KL_OERR_NUMERIC 2 | |
29 | -#define KL_OERR_OVERFLOW 3 | |
30 | -#define KL_OERR_DBCS 4 | |
31 | -#define KL_NOT_CONNECTED 0x0010 | |
32 | -#define KL_AWAITING_FIRST 0x0020 | |
33 | -#define KL_OIA_TWAIT 0x0040 | |
34 | -#define KL_OIA_LOCKED 0x0080 | |
35 | -#define KL_DEFERRED_UNLOCK 0x0100 | |
36 | -#define KL_ENTER_INHIBIT 0x0200 | |
37 | -#define KL_SCROLLED 0x0400 | |
38 | -#define KL_OIA_MINUS 0x0800 | |
39 | - | |
40 | - | |
41 | -/* other functions */ | |
42 | -LIB3270_INTERNAL void add_xk(KeySym key, KeySym assoc); | |
43 | -LIB3270_INTERNAL void clear_xks(void); | |
44 | -LIB3270_INTERNAL void do_reset(H3270 *session, Boolean explicit); | |
45 | -LIB3270_INTERNAL void hex_input(char *s); | |
46 | -LIB3270_INTERNAL void kybdlock_clr(H3270 *session, unsigned int bits, const char *cause); | |
47 | -LIB3270_INTERNAL void kybd_inhibit(H3270 *session, Boolean inhibit); | |
48 | -LIB3270_INTERNAL void kybd_init(void); | |
49 | -LIB3270_INTERNAL int kybd_prime(void); | |
50 | -LIB3270_INTERNAL void kybd_scroll_lock(Boolean lock); | |
51 | -LIB3270_INTERNAL Boolean run_ta(void); | |
52 | -LIB3270_INTERNAL int state_from_keymap(char keymap[32]); | |
53 | -LIB3270_INTERNAL void kybd_connect(H3270 *session, int connected, void *dunno); | |
54 | -LIB3270_INTERNAL void kybd_in3270(H3270 *session, int in3270 unused, void *dunno); | |
22 | + #define KYBDC_H_INCLUDED | |
23 | + | |
24 | + /* keyboard lock states */ | |
25 | + typedef enum lib3270_kl_state | |
26 | + { | |
27 | + LIB3270_KL_OERR_MASK = 0x000f, | |
28 | + LIB3270_KL_OERR_PROTECTED = 0x0001, | |
29 | + LIB3270_KL_OERR_NUMERIC = 0x0002, | |
30 | + LIB3270_KL_OERR_OVERFLOW = 0x0003, | |
31 | + LIB3270_KL_OERR_DBCS = 0x0004, | |
32 | + LIB3270_KL_NOT_CONNECTED = 0x0010, | |
33 | + LIB3270_KL_AWAITING_FIRST = 0x0020, | |
34 | + LIB3270_KL_OIA_TWAIT = 0x0040, | |
35 | + LIB3270_KL_OIA_LOCKED = 0x0080, | |
36 | + LIB3270_KL_DEFERRED_UNLOCK = 0x0100, | |
37 | + LIB3270_KL_ENTER_INHIBIT = 0x0200, | |
38 | + LIB3270_KL_SCROLLED = 0x0400, | |
39 | + LIB3270_KL_OIA_MINUS = 0x0800 | |
40 | + | |
41 | + } LIB3270_KL_STATE; | |
42 | + | |
43 | + #define KL_OERR_MASK LIB3270_KL_OERR_MASK | |
44 | + #define KL_OERR_PROTECTED LIB3270_KL_OERR_PROTECTED | |
45 | + #define KL_OERR_NUMERIC LIB3270_KL_OERR_NUMERIC | |
46 | + #define KL_OERR_OVERFLOW LIB3270_KL_OERR_OVERFLOW | |
47 | + #define KL_OERR_DBCS LIB3270_KL_OERR_DBCS | |
48 | + #define KL_NOT_CONNECTED LIB3270_KL_NOT_CONNECTED | |
49 | + #define KL_AWAITING_FIRST LIB3270_KL_AWAITING_FIRST | |
50 | + #define KL_OIA_TWAIT LIB3270_KL_OIA_TWAIT | |
51 | + #define KL_OIA_LOCKED LIB3270_KL_OIA_LOCKED | |
52 | + #define KL_DEFERRED_UNLOCK LIB3270_KL_DEFERRED_UNLOCK | |
53 | + #define KL_ENTER_INHIBIT LIB3270_KL_ENTER_INHIBIT | |
54 | + #define KL_SCROLLED LIB3270_KL_SCROLLED | |
55 | + #define KL_OIA_MINUS LIB3270_KL_OIA_MINUS | |
56 | + | |
57 | + | |
58 | + | |
59 | + /* other functions */ | |
60 | + LIB3270_INTERNAL void add_xk(KeySym key, KeySym assoc); | |
61 | + LIB3270_INTERNAL void clear_xks(void); | |
62 | + LIB3270_INTERNAL void do_reset(H3270 *session, Boolean explicit); | |
63 | + LIB3270_INTERNAL void hex_input(char *s); | |
64 | + LIB3270_INTERNAL void kybdlock_clr(H3270 *session, unsigned int bits, const char *cause); | |
65 | + LIB3270_INTERNAL void kybd_inhibit(H3270 *session, Boolean inhibit); | |
66 | + LIB3270_INTERNAL void kybd_init(void); | |
67 | + LIB3270_INTERNAL int kybd_prime(void); | |
68 | + LIB3270_INTERNAL void kybd_scroll_lock(Boolean lock); | |
69 | + LIB3270_INTERNAL Boolean run_ta(void); | |
70 | + LIB3270_INTERNAL int state_from_keymap(char keymap[32]); | |
71 | + LIB3270_INTERNAL void kybd_connect(H3270 *session, int connected, void *dunno); | |
72 | + LIB3270_INTERNAL void kybd_in3270(H3270 *session, int in3270 unused, void *dunno); | |
55 | 73 | |
56 | 74 | |
57 | 75 | #endif /* KYBDC_H_INCLUDED */ | ... | ... |