diff options
author | Jeff Sharkey <jsharkey@android.com> | 2013-02-21 17:45:16 -0800 |
---|---|---|
committer | Jeff Sharkey <jsharkey@android.com> | 2013-02-21 17:52:34 -0800 |
commit | 479bd643981271fb0edf756ae5915e44a7352c4d (patch) | |
tree | db3ebc4bb28345500906392e2ec76d4d7be36dde | |
parent | 9cae0a9616b1b71eac7e762d198fe1da47fea901 (diff) | |
download | Terminal-479bd643981271fb0edf756ae5915e44a7352c4d.tar.gz |
Split init() and run().
Also switch to ScopedCharArrayRW.
Change-Id: I1e22a166c48ba7209e624fc49bee8618e9b36f0d
-rw-r--r-- | jni/com_android_terminal_Terminal.cpp | 80 | ||||
-rw-r--r-- | src/com/android/terminal/Terminal.java | 22 | ||||
-rw-r--r-- | src/com/android/terminal/TerminalActivity.java | 2 | ||||
-rw-r--r-- | src/com/android/terminal/TerminalView.java | 5 |
4 files changed, 53 insertions, 56 deletions
diff --git a/jni/com_android_terminal_Terminal.cpp b/jni/com_android_terminal_Terminal.cpp index 4a3fecb..7545a35 100644 --- a/jni/com_android_terminal_Terminal.cpp +++ b/jni/com_android_terminal_Terminal.cpp @@ -20,7 +20,8 @@ #include "forkpty.h" #include "jni.h" #include "JNIHelp.h" -#include <ScopedLocalRef.h> +#include "ScopedLocalRef.h" +#include "ScopedPrimitiveArray.h" #include <fcntl.h> #include <stdio.h> @@ -74,8 +75,9 @@ public: Terminal(jobject callbacks, int rows, int cols); ~Terminal(); + int run(); + size_t write(const char *bytes, size_t len); - int readLoop(); int resize(short unsigned int rows, short unsigned int cols); int getCell(VTermPos pos, VTermScreenCell* cell); @@ -244,7 +246,15 @@ Terminal::Terminal(jobject callbacks, int rows, int cols) : vterm_screen_enable_altscreen(mVts, 1); vterm_screen_set_callbacks(mVts, &cb, this); vterm_screen_set_damage_merge(mVts, VTERM_DAMAGE_SCROLL); + vterm_screen_reset(mVts, 1); +} +Terminal::~Terminal() { + close(mMasterFd); + vterm_free(mVt); +} + +int Terminal::run() { /* None of the docs about termios explain how to construct a new one of * these, so this is largely a guess */ struct termios termios = { @@ -300,48 +310,30 @@ Terminal::Terminal(jobject callbacks, int rows, int cols) : _exit(1); } - vterm_set_size(mVt, rows, cols); - vterm_screen_flush_damage(mVts); - - vterm_screen_reset(mVts, 1); -} - -Terminal::~Terminal() { - close(mMasterFd); - vterm_free(mVt); -} - -size_t Terminal::write(const char *bytes, size_t len) { - return ::write(mMasterFd, bytes, len); -} - -int Terminal::readLoop() { while (1) { char buffer[4096]; ssize_t bytes = ::read(mMasterFd, buffer, sizeof buffer); ALOGD("Read %d bytes:", bytes); - if (bytes == -1 && errno == EAGAIN) { - continue; - } - if (bytes == 0 || (bytes == -1 && errno == EIO)) { - return 0; + if (bytes == 0) { + ALOGD("read() found EOF"); + break; } - if (bytes < 0) { - ALOGD("read() failed: %s", strerror(errno)); + if (bytes == -1) { + ALOGE("read() failed: %s", strerror(errno)); return 1; } - // TODO: remove this verbose dumping - for (int i = 0; i < bytes; i++) { - ALOGD(" %02x", buffer[i]); - } - vterm_push_bytes(mVt, buffer, bytes); } + return 1; } +size_t Terminal::write(const char *bytes, size_t len) { + return ::write(mMasterFd, bytes, len); +} + int Terminal::resize(short unsigned int rows, short unsigned int cols) { ALOGD("resize(%d, %d)", rows, cols); // TODO: wait for resize event to propegate back from shell? @@ -378,16 +370,9 @@ static jint com_android_terminal_Terminal_nativeInit(JNIEnv* env, jclass clazz, return reinterpret_cast<jint>(new Terminal(env->NewGlobalRef(callbacks), rows, cols)); } -static void com_android_terminal_Terminal_nativeWrite(JNIEnv* env, - jclass clazz, jint ptr) { +static jint com_android_terminal_Terminal_nativeRun(JNIEnv* env, jclass clazz, jint ptr) { Terminal* term = reinterpret_cast<Terminal*>(ptr); - // const char *bytes, size_t len - term->write(NULL, 0); -} - -static jint com_android_terminal_Terminal_nativeReadLoop(JNIEnv* env, jclass clazz, jint ptr) { - Terminal* term = reinterpret_cast<Terminal*>(ptr); - return term->readLoop(); + return term->run(); } static jint com_android_terminal_Terminal_nativeResize(JNIEnv* env, @@ -401,8 +386,10 @@ static jint com_android_terminal_Terminal_nativeGetCellRun(JNIEnv* env, Terminal* term = reinterpret_cast<Terminal*>(ptr); jcharArray dataArray = (jcharArray) env->GetObjectField(run, cellRunDataField); - jchar* data = env->GetCharArrayElements(dataArray, 0); - int dataLen = env->GetArrayLength(dataArray); + ScopedCharArrayRW data(env, dataArray); + if (data.get() == NULL) { + return -1; + } VTermScreenCell cell; memset(&cell, 0, sizeof(VTermScreenCell)); @@ -412,8 +399,8 @@ static jint com_android_terminal_Terminal_nativeGetCellRun(JNIEnv* env, .col = col, }; - int dataSize = 0; - int colSize = 0; + unsigned int dataSize = 0; + unsigned int colSize = 0; while (pos.col < term->getCols()) { int res = term->getCell(pos, &cell); @@ -426,10 +413,10 @@ static jint com_android_terminal_Terminal_nativeGetCellRun(JNIEnv* env, // TODO: support full UTF-32 characters // for testing, 0x00020000 should become 0xD840 0xDC00 - int size = 1; + unsigned int size = 1; // Only include cell chars if they fit into run - if (dataSize + size <= dataLen) { + if (dataSize + size <= data.size()) { data[dataSize] = cell.chars[0]; dataSize += size; colSize += cell.width; @@ -439,7 +426,6 @@ static jint com_android_terminal_Terminal_nativeGetCellRun(JNIEnv* env, } } - env->ReleaseCharArrayElements(dataArray, data, 0); env->SetIntField(run, cellRunDataSizeField, dataSize); env->SetIntField(run, cellRunColSizeField, colSize); @@ -458,7 +444,7 @@ static jint com_android_terminal_Terminal_nativeGetCols(JNIEnv* env, jclass claz static JNINativeMethod gMethods[] = { { "nativeInit", "(Lcom/android/terminal/TerminalCallbacks;II)I", (void*)com_android_terminal_Terminal_nativeInit }, - { "nativeReadLoop", "(I)I", (void*)com_android_terminal_Terminal_nativeReadLoop }, + { "nativeRun", "(I)I", (void*)com_android_terminal_Terminal_nativeRun }, { "nativeResize", "(III)I", (void*)com_android_terminal_Terminal_nativeResize }, { "nativeGetCellRun", "(IIILcom/android/terminal/Terminal$CellRun;)I", (void*)com_android_terminal_Terminal_nativeGetCellRun }, { "nativeGetRows", "(I)I", (void*)com_android_terminal_Terminal_nativeGetRows }, diff --git a/src/com/android/terminal/Terminal.java b/src/com/android/terminal/Terminal.java index dfd370b..c2e9749 100644 --- a/src/com/android/terminal/Terminal.java +++ b/src/com/android/terminal/Terminal.java @@ -22,6 +22,8 @@ import android.graphics.Color; * Single terminal session backed by a pseudo terminal on the local device. */ public class Terminal { + private static final String TAG = "Terminal"; + static { System.loadLibrary("jni_terminal"); } @@ -52,6 +54,8 @@ public class Terminal { } private final int mNativePtr; + private final Thread mThread; + private TerminalClient mClient; private final TerminalCallbacks mCallbacks = new TerminalCallbacks() { @@ -74,14 +78,19 @@ public class Terminal { public Terminal() { mNativePtr = nativeInit(mCallbacks, 25, 80); - - // TODO: move all I/O into separate method; init should only be object setup - new Thread(new Runnable() { + mThread = new Thread(TAG) { @Override public void run() { - nativeReadLoop(mNativePtr); + nativeRun(mNativePtr); } - }).start(); + }; + } + + /** + * Start thread which internally forks and manages the pseudo terminal. + */ + public void start() { + mThread.start(); } public void setClient(TerminalClient client) { @@ -109,7 +118,8 @@ public class Terminal { } private static native int nativeInit(TerminalCallbacks callbacks, int rows, int cols); - private static native int nativeReadLoop(int ptr); + private static native int nativeRun(int ptr); + private static native int nativeResize(int ptr, int rows, int cols); private static native int nativeGetCellRun(int ptr, int row, int col, CellRun run); private static native int nativeGetRows(int ptr); diff --git a/src/com/android/terminal/TerminalActivity.java b/src/com/android/terminal/TerminalActivity.java index 601fd98..bef1859 100644 --- a/src/com/android/terminal/TerminalActivity.java +++ b/src/com/android/terminal/TerminalActivity.java @@ -28,6 +28,8 @@ public class TerminalActivity extends Activity { super.onCreate(savedInstanceState); final Terminal term = new Terminal(); + term.start(); + final TerminalView view = new TerminalView(this, term); setContentView(view); diff --git a/src/com/android/terminal/TerminalView.java b/src/com/android/terminal/TerminalView.java index 33b651b..eb4f063 100644 --- a/src/com/android/terminal/TerminalView.java +++ b/src/com/android/terminal/TerminalView.java @@ -20,13 +20,12 @@ import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; -import android.graphics.Typeface; import android.graphics.Paint.FontMetrics; import android.graphics.Rect; -import android.view.View; - +import android.graphics.Typeface; import android.os.SystemClock; import android.util.Log; +import android.view.View; import com.android.terminal.Terminal.TerminalClient; |