[Scummvm-git-logs] scummvm master -> b41c5f1952e2ecab2a982e26ce6c2fbfe89794a6

antoniou79 a.antoniou79 at gmail.com
Sat Jul 18 12:14:06 UTC 2020


This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
0efce44e81 ANDROID: Clean up the text conversion code
b41c5f1952 ANDROID: Implement OSystem::convertEncoding()


Commit: 0efce44e811ed42b6f8160f9018ffcb22569b8b4
    https://github.com/scummvm/scummvm/commit/0efce44e811ed42b6f8160f9018ffcb22569b8b4
Author: Cameron Cawley (ccawley2011 at gmail.com)
Date: 2020-07-18T15:14:01+03:00

Commit Message:
ANDROID: Clean up the text conversion code

Changed paths:
    backends/platform/android/android.cpp
    backends/platform/android/jni-android.cpp
    backends/platform/android/jni-android.h
    backends/platform/android/org/scummvm/scummvm/ScummVM.java
    backends/platform/android/org/scummvm/scummvm/ScummVMActivity.java


diff --git a/backends/platform/android/android.cpp b/backends/platform/android/android.cpp
index 5869fd0094..e693eb74c9 100644
--- a/backends/platform/android/android.cpp
+++ b/backends/platform/android/android.cpp
@@ -526,7 +526,7 @@ Common::String OSystem_Android::getSystemLanguage() const {
 }
 
 bool OSystem_Android::openUrl(const Common::String &url) {
-	return JNI::openUrl(url.c_str());
+	return JNI::openUrl(url);
 }
 
 bool OSystem_Android::hasTextInClipboard() {
diff --git a/backends/platform/android/jni-android.cpp b/backends/platform/android/jni-android.cpp
index ed87ba8682..ab34c0ee8f 100644
--- a/backends/platform/android/jni-android.cpp
+++ b/backends/platform/android/jni-android.cpp
@@ -116,9 +116,7 @@ const JNINativeMethod JNI::_natives[] = {
 	{ "pushEvent", "(IIIIIII)V",
 		(void *)JNI::pushEvent },
 	{ "setPause", "(Z)V",
-		(void *)JNI::setPause },
-	{ "getCurrentCharset", "()Ljava/lang/String;",
-		(void *)JNI::getCurrentCharset }
+		(void *)JNI::setPause }
 };
 
 JNI::JNI() {
@@ -227,24 +225,16 @@ void JNI::getDPI(float *values) {
 	env->DeleteLocalRef(array);
 }
 
-void JNI::displayMessageOnOSD(const char *msg) {
+void JNI::displayMessageOnOSD(const Common::String &msg) {
 	// called from common/osd_message_queue, method: OSDMessageQueue::pollEvent()
 	JNIEnv *env = JNI::getEnv();
-	Common::String fromEncoding = "ISO-8859-1";
-#ifdef USE_TRANSLATION
-	if (TransMan.getCurrentCharset() != "ASCII") {
-		fromEncoding = TransMan.getCurrentCharset();
-	}
-#endif
-	Common::Encoding converter("UTF-8", fromEncoding.c_str());
 
-	const char *utf8Msg = converter.convert(msg, converter.stringLength(msg, fromEncoding) );
-	if (utf8Msg == nullptr) {
+	jstring java_msg = convertToJString(env, msg, getCurrentCharset());
+	if (java_msg == nullptr) {
 		// Show a placeholder indicative of the translation error instead of silent failing
-		utf8Msg = "?";
+		java_msg = env->NewStringUTF("?");
 		LOGE("Failed to convert message to UTF-8 for OSD!");
 	}
-	jstring java_msg = env->NewStringUTF(utf8Msg);
 
 	env->CallVoidMethod(_jobj, _MID_displayMessageOnOSD, java_msg);
 
@@ -258,10 +248,10 @@ void JNI::displayMessageOnOSD(const char *msg) {
 	env->DeleteLocalRef(java_msg);
 }
 
-bool JNI::openUrl(const char *url) {
+bool JNI::openUrl(const Common::String &url) {
 	bool success = true;
 	JNIEnv *env = JNI::getEnv();
-	jstring javaUrl = env->NewStringUTF(url);
+	jstring javaUrl = env->NewStringUTF(url.c_str());
 
 	env->CallVoidMethod(_jobj, _MID_openUrl, javaUrl);
 
@@ -295,7 +285,7 @@ bool JNI::hasTextInClipboard() {
 Common::String JNI::getTextFromClipboard() {
 	JNIEnv *env = JNI::getEnv();
 
-	jbyteArray javaText = (jbyteArray)env->CallObjectMethod(_jobj, _MID_getTextFromClipboard);
+	jstring javaText = (jstring)env->CallObjectMethod(_jobj, _MID_getTextFromClipboard);
 
 	if (env->ExceptionCheck()) {
 		LOGE("Failed to retrieve text from the clipboard");
@@ -306,20 +296,15 @@ Common::String JNI::getTextFromClipboard() {
 		return Common::String();
 	}
 
-	int len = env->GetArrayLength(javaText);
-	char* buf = new char[len];
-	env->GetByteArrayRegion(javaText, 0, len, reinterpret_cast<jbyte*>(buf));
-	Common::String text(buf, len);
-	delete[] buf;
+	Common::String text = convertFromJString(env, javaText, getCurrentCharset());
+	env->DeleteLocalRef(javaText);
 
 	return text;
 }
 
 bool JNI::setTextInClipboard(const Common::String &text) {
 	JNIEnv *env = JNI::getEnv();
-
-	jbyteArray javaText = env->NewByteArray(text.size());
-	env->SetByteArrayRegion(javaText, 0, text.size(), reinterpret_cast<const jbyte*>(text.c_str()));
+	jstring javaText = convertToJString(env, text, getCurrentCharset());
 
 	bool success = env->CallBooleanMethod(_jobj, _MID_setTextInClipboard, javaText);
 
@@ -350,9 +335,9 @@ bool JNI::isConnectionLimited() {
 	return limited;
 }
 
-void JNI::setWindowCaption(const char *caption) {
+void JNI::setWindowCaption(const Common::String &caption) {
 	JNIEnv *env = JNI::getEnv();
-	jstring java_caption = env->NewStringUTF(caption);
+	jstring java_caption = convertToJString(env, caption, "ISO-8859-1");
 
 	env->CallVoidMethod(_jobj, _MID_setWindowCaption, java_caption);
 
@@ -544,8 +529,8 @@ void JNI::create(JNIEnv *env, jobject self, jobject asset_manager,
 	FIND_METHOD(, displayMessageOnOSD, "(Ljava/lang/String;)V");
 	FIND_METHOD(, openUrl, "(Ljava/lang/String;)V");
 	FIND_METHOD(, hasTextInClipboard, "()Z");
-	FIND_METHOD(, getTextFromClipboard, "()[B");
-	FIND_METHOD(, setTextInClipboard, "([B)Z");
+	FIND_METHOD(, getTextFromClipboard, "()Ljava/lang/String;");
+	FIND_METHOD(, setTextInClipboard, "(Ljava/lang/String;)Z");
 	FIND_METHOD(, isConnectionLimited, "()Z");
 	FIND_METHOD(, showVirtualKeyboard, "(Z)V");
 	FIND_METHOD(, showKeyboardControl, "(Z)V");
@@ -711,14 +696,40 @@ void JNI::setPause(JNIEnv *env, jobject self, jboolean value) {
 	}
 }
 
-jstring JNI::getCurrentCharset(JNIEnv *env, jobject self) {
+Common::String JNI::getCurrentCharset() {
 #ifdef USE_TRANSLATION
 	if (TransMan.getCurrentCharset() != "ASCII") {
-//		LOGD("getCurrentCharset: %s", TransMan.getCurrentCharset().c_str());
-		return env->NewStringUTF(TransMan.getCurrentCharset().c_str());
+		return TransMan.getCurrentCharset();
 	}
 #endif
-	return env->NewStringUTF("ISO-8859-1");
+	return "ISO-8859-1";
+}
+
+jstring JNI::convertToJString(JNIEnv *env, const Common::String &str, const Common::String &from) {
+	Common::Encoding converter("UTF-8", from.c_str());
+	char *utf8Str = converter.convert(str.c_str(), converter.stringLength(str.c_str(), from));
+	if (utf8Str == nullptr)
+		return nullptr;
+
+	jstring jstr = env->NewStringUTF(utf8Str);
+	free(utf8Str);
+
+	return jstr;
+}
+
+Common::String JNI::convertFromJString(JNIEnv *env, const jstring &jstr, const Common::String &to) {
+	const char *utf8Str = env->GetStringUTFChars(jstr, 0);
+	if (!utf8Str)
+		return Common::String();
+
+	Common::Encoding converter(to.c_str(), "UTF-8");
+	char *asciiStr = converter.convert(utf8Str, env->GetStringUTFLength(jstr));
+	env->ReleaseStringUTFChars(jstr, utf8Str);
+
+	Common::String str(asciiStr);
+	free(asciiStr);
+
+	return str;
 }
 
 Common::Array<Common::String> JNI::getAllStorageLocations() {
diff --git a/backends/platform/android/jni-android.h b/backends/platform/android/jni-android.h
index 6f034a9169..ff81d61478 100644
--- a/backends/platform/android/jni-android.h
+++ b/backends/platform/android/jni-android.h
@@ -57,10 +57,10 @@ public:
 
 	static void setReadyForEvents(bool ready);
 
-	static void setWindowCaption(const char *caption);
+	static void setWindowCaption(const Common::String &caption);
 	static void getDPI(float *values);
-	static void displayMessageOnOSD(const char *msg);
-	static bool openUrl(const char *url);
+	static void displayMessageOnOSD(const Common::String &msg);
+	static bool openUrl(const Common::String &url);
 	static bool hasTextInClipboard();
 	static Common::String getTextFromClipboard();
 	static bool setTextInClipboard(const Common::String &text);
@@ -139,7 +139,10 @@ private:
 							int arg2, int arg3, int arg4, int arg5, int arg6);
 	static void setPause(JNIEnv *env, jobject self, jboolean value);
 
-	static jstring getCurrentCharset(JNIEnv *env, jobject self);
+	static Common::String getCurrentCharset();
+
+	static jstring convertToJString(JNIEnv *env, const Common::String &str, const Common::String &from);
+	static Common::String convertFromJString(JNIEnv *env, const jstring &jstr, const Common::String &to);
 
 	static PauseToken _pauseToken;
 };
diff --git a/backends/platform/android/org/scummvm/scummvm/ScummVM.java b/backends/platform/android/org/scummvm/scummvm/ScummVM.java
index 34349d4606..e50c1e986a 100644
--- a/backends/platform/android/org/scummvm/scummvm/ScummVM.java
+++ b/backends/platform/android/org/scummvm/scummvm/ScummVM.java
@@ -49,15 +49,14 @@ public abstract class ScummVM implements SurfaceHolder.Callback, Runnable {
 	// Feed an event to ScummVM.  Safe to call from other threads.
 	final public native void pushEvent(int type, int arg1, int arg2, int arg3,
 										int arg4, int arg5, int arg6);
-	final public native String getCurrentCharset();
 
 	// Callbacks from C++ peer instance
 	abstract protected void getDPI(float[] values);
 	abstract protected void displayMessageOnOSD(String msg);
 	abstract protected void openUrl(String url);
 	abstract protected boolean hasTextInClipboard();
-	abstract protected byte[] getTextFromClipboard();
-	abstract protected boolean setTextInClipboard(byte[] text);
+	abstract protected String getTextFromClipboard();
+	abstract protected boolean setTextInClipboard(String text);
 	abstract protected boolean isConnectionLimited();
 	abstract protected void setWindowCaption(String caption);
 	abstract protected void showVirtualKeyboard(boolean enable);
diff --git a/backends/platform/android/org/scummvm/scummvm/ScummVMActivity.java b/backends/platform/android/org/scummvm/scummvm/ScummVMActivity.java
index 0ef1d0b5b1..0202057d42 100644
--- a/backends/platform/android/org/scummvm/scummvm/ScummVMActivity.java
+++ b/backends/platform/android/org/scummvm/scummvm/ScummVMActivity.java
@@ -88,7 +88,6 @@ public class ScummVMActivity extends Activity {
 		@Override
 		protected void displayMessageOnOSD(final String msg) {
 			if (msg != null) {
-				Log.i(LOG_TAG, "MessageOnOSD: " + msg + " " + getCurrentCharset());
 				runOnUiThread(new Runnable() {
 					public void run() {
 						Toast.makeText(ScummVMActivity.this, msg, Toast.LENGTH_SHORT).show();
@@ -108,33 +107,17 @@ public class ScummVMActivity extends Activity {
 		}
 
 		@Override
-		protected byte[] getTextFromClipboard() {
+		protected String getTextFromClipboard() {
 			CharSequence text = _clipboard.getText();
 			if (text != null) {
-				String encoding = getCurrentCharset();
-				byte[] out;
-				Log.d(LOG_TAG, String.format("Converting from UTF-8 to %s", encoding));
-				try {
-					out = text.toString().getBytes(encoding);
-				} catch (java.io.UnsupportedEncodingException e) {
-					out = text.toString().getBytes();
-				}
-				return out;
+				return text.toString();
 			}
 			return null;
 		}
 
 		@Override
-		protected boolean setTextInClipboard(byte[] text) {
-			String encoding = getCurrentCharset();
-			String out;
-			Log.d(LOG_TAG, String.format("Converting from %s to UTF-8", encoding));
-			try {
-				out = new String(text, encoding);
-			} catch (java.io.UnsupportedEncodingException e) {
-				out = new String(text);
-			}
-			_clipboard.setText(out);
+		protected boolean setTextInClipboard(String text) {
+			_clipboard.setText(text);
 			return true;
 		}
 


Commit: b41c5f1952e2ecab2a982e26ce6c2fbfe89794a6
    https://github.com/scummvm/scummvm/commit/b41c5f1952e2ecab2a982e26ce6c2fbfe89794a6
Author: Cameron Cawley (ccawley2011 at gmail.com)
Date: 2020-07-18T15:14:01+03:00

Commit Message:
ANDROID: Implement OSystem::convertEncoding()

Changed paths:
    backends/platform/android/android.cpp
    backends/platform/android/android.h
    backends/platform/android/jni-android.cpp
    backends/platform/android/jni-android.h
    backends/platform/android/org/scummvm/scummvm/ScummVM.java
    backends/platform/android/org/scummvm/scummvm/ScummVMActivity.java


diff --git a/backends/platform/android/android.cpp b/backends/platform/android/android.cpp
index e693eb74c9..1671497c4c 100644
--- a/backends/platform/android/android.cpp
+++ b/backends/platform/android/android.cpp
@@ -553,4 +553,8 @@ Common::String OSystem_Android::getSystemProperty(const char *name) const {
 	return Common::String(value, len);
 }
 
+char *OSystem_Android::convertEncoding(const char *to, const char *from, const char *string, size_t length) {
+	return JNI::convertEncoding(to, from, string, length);
+}
+
 #endif
diff --git a/backends/platform/android/android.h b/backends/platform/android/android.h
index 7fc90d4f96..90fedfb9f4 100644
--- a/backends/platform/android/android.h
+++ b/backends/platform/android/android.h
@@ -139,6 +139,7 @@ public:
 	virtual bool setTextInClipboard(const Common::String &text);
 	virtual bool isConnectionLimited();
 	virtual Common::String getSystemLanguage() const;
+	virtual char *convertEncoding(const char *to, const char *from, const char *string, size_t length);
 };
 
 #endif
diff --git a/backends/platform/android/jni-android.cpp b/backends/platform/android/jni-android.cpp
index ab34c0ee8f..225cb4c2a1 100644
--- a/backends/platform/android/jni-android.cpp
+++ b/backends/platform/android/jni-android.cpp
@@ -87,6 +87,7 @@ jmethodID JNI::_MID_setWindowCaption = 0;
 jmethodID JNI::_MID_showVirtualKeyboard = 0;
 jmethodID JNI::_MID_showKeyboardControl = 0;
 jmethodID JNI::_MID_getSysArchives = 0;
+jmethodID JNI::_MID_convertEncoding = 0;
 jmethodID JNI::_MID_getAllStorageLocations = 0;
 jmethodID JNI::_MID_initSurface = 0;
 jmethodID JNI::_MID_deinitSurface = 0;
@@ -408,6 +409,36 @@ void JNI::addSysArchivesToSearchSet(Common::SearchSet &s, int priority) {
 	}
 }
 
+char *JNI::convertEncoding(const char *to, const char *from, const char *string, size_t length) {
+	JNIEnv *env = JNI::getEnv();
+
+	jstring javaTo = env->NewStringUTF(to);
+	jstring javaFrom = env->NewStringUTF(from);
+	jbyteArray javaString = env->NewByteArray(length);
+	env->SetByteArrayRegion(javaString, 0, length, reinterpret_cast<const jbyte*>(string));
+
+	jbyteArray javaOut = (jbyteArray)env->CallObjectMethod(_jobj, _MID_convertEncoding, javaTo, javaFrom, javaString);
+
+	if (!javaOut || env->ExceptionCheck()) {
+		LOGE("Failed to convert text from %s to %s", from, to);
+
+		env->ExceptionDescribe();
+		env->ExceptionClear();
+
+		return nullptr;
+	}
+
+	int outLength = env->GetArrayLength(javaOut);
+	char *buf = (char *)malloc(outLength + 1);
+	if (!buf)
+		return nullptr;
+
+	env->GetByteArrayRegion(javaOut, 0, outLength, reinterpret_cast<jbyte *>(buf));
+	buf[outLength] = 0;
+
+	return buf;
+}
+
 bool JNI::initSurface() {
 	JNIEnv *env = JNI::getEnv();
 
@@ -536,6 +567,7 @@ void JNI::create(JNIEnv *env, jobject self, jobject asset_manager,
 	FIND_METHOD(, showKeyboardControl, "(Z)V");
 	FIND_METHOD(, getSysArchives, "()[Ljava/lang/String;");
 	FIND_METHOD(, getAllStorageLocations, "()[Ljava/lang/String;");
+	FIND_METHOD(, convertEncoding, "(Ljava/lang/String;Ljava/lang/String;[B)[B");
 	FIND_METHOD(, initSurface, "()Ljavax/microedition/khronos/egl/EGLSurface;");
 	FIND_METHOD(, deinitSurface, "()V");
 
diff --git a/backends/platform/android/jni-android.h b/backends/platform/android/jni-android.h
index ff81d61478..c9e7999529 100644
--- a/backends/platform/android/jni-android.h
+++ b/backends/platform/android/jni-android.h
@@ -68,6 +68,7 @@ public:
 	static void showVirtualKeyboard(bool enable);
 	static void showKeyboardControl(bool enable);
 	static void addSysArchivesToSearchSet(Common::SearchSet &s, int priority);
+	static char *convertEncoding(const char *to, const char *from, const char *string, size_t length);
 
 	static inline bool haveSurface();
 	static inline bool swapBuffers();
@@ -108,6 +109,7 @@ private:
 	static jmethodID _MID_showVirtualKeyboard;
 	static jmethodID _MID_showKeyboardControl;
 	static jmethodID _MID_getSysArchives;
+	static jmethodID _MID_convertEncoding;
 	static jmethodID _MID_getAllStorageLocations;
 	static jmethodID _MID_initSurface;
 	static jmethodID _MID_deinitSurface;
diff --git a/backends/platform/android/org/scummvm/scummvm/ScummVM.java b/backends/platform/android/org/scummvm/scummvm/ScummVM.java
index e50c1e986a..22cf3fceca 100644
--- a/backends/platform/android/org/scummvm/scummvm/ScummVM.java
+++ b/backends/platform/android/org/scummvm/scummvm/ScummVM.java
@@ -15,6 +15,7 @@ import javax.microedition.khronos.egl.EGLDisplay;
 import javax.microedition.khronos.egl.EGLSurface;
 
 import java.io.File;
+import java.io.UnsupportedEncodingException;
 import java.util.LinkedHashMap;
 import java.util.List;
 
@@ -62,6 +63,7 @@ public abstract class ScummVM implements SurfaceHolder.Callback, Runnable {
 	abstract protected void showVirtualKeyboard(boolean enable);
 	abstract protected void showKeyboardControl(boolean enable);
 	abstract protected String[] getSysArchives();
+	abstract protected byte[] convertEncoding(String to, String from, byte[] string) throws UnsupportedEncodingException;
 	abstract protected String[] getAllStorageLocations();
 
 	public ScummVM(AssetManager asset_manager, SurfaceHolder holder) {
diff --git a/backends/platform/android/org/scummvm/scummvm/ScummVMActivity.java b/backends/platform/android/org/scummvm/scummvm/ScummVMActivity.java
index 0202057d42..0b470b5d06 100644
--- a/backends/platform/android/org/scummvm/scummvm/ScummVMActivity.java
+++ b/backends/platform/android/org/scummvm/scummvm/ScummVMActivity.java
@@ -32,6 +32,7 @@ import java.io.FileInputStream;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.IOException;
+import java.io.UnsupportedEncodingException;
 import java.util.List;
 
 public class ScummVMActivity extends Activity {
@@ -164,6 +165,12 @@ public class ScummVMActivity extends Activity {
 			return new String[0];
 		}
 
+		@Override
+		protected byte[] convertEncoding(String to, String from, byte[] string) throws UnsupportedEncodingException {
+			String str = new String(string, from);
+			return str.getBytes(to);
+		}
+
 		@Override
 		protected String[] getAllStorageLocations() {
 			if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M




More information about the Scummvm-git-logs mailing list