[Libreoffice-commits] .: 3 commits - android/Bootstrap android/qa sal/android
Tor Lillqvist
tml at kemper.freedesktop.org
Wed Jan 11 15:28:50 PST 2012
android/Bootstrap/src/org/libreoffice/android/Bootstrap.java | 21 +
android/qa/sc/Makefile | 23 +
android/qa/sc/fonts.conf | 130 +++++++++++
sal/android/lo-bootstrap.c | 118 +++++++++
4 files changed, 282 insertions(+), 10 deletions(-)
New commits:
commit 2042da484765a029e0545a530e3d9a6f38218821
Author: Tor Lillqvist <tlillqvist at suse.com>
Date: Thu Jan 12 01:26:09 2012 +0200
Include .res files, a fonts.conf, and other hacking
diff --git a/android/qa/sc/Makefile b/android/qa/sc/Makefile
index c400c72..3a9faad 100644
--- a/android/qa/sc/Makefile
+++ b/android/qa/sc/Makefile
@@ -125,23 +125,32 @@ copy-stuff:
# Then the shared GNU C++ library
$(call COPY,$(NDK_HOME)/sources/cxx-stl/gnu-libstdc++/libs/armeabi-v7a/libgnustl_shared.so)
#
-# Then other "assets". Let the directory structure under assets mimic
-# that under solver for now.
+# Then other "assets" that can be left in the .apk. Let the directory
+# structure under assets mimic that under solver or workdir for now.
mkdir -p assets/bin assets/lib assets/xml/ure
cp $(OUTDIR)/bin/udkapi.rdb assets/bin
cp $(OUTDIR)/bin/types.rdb assets/bin
cp $(OUTDIR)/xml/ure/services.rdb assets/xml/ure
+# For some reason the vnd.sun.star.expand:$LO_LIB_DIR doesn't seem to work, it expands to empty!?
+# So just hardcode the known APP_DATA_PATH for now...
for F in framework/util/fwk i18npool/util/i18npool sfx2/util/sfx unoxml/source/service/unoxml configmgr/source/configmgr; do \
mkdir -p assets/ComponentTarget/`dirname $$F`; \
- cp $(WORKDIR)/ComponentTarget/$$F.component assets/ComponentTarget/`dirname $$F`; \
+ sed -e 's!uri="vnd.sun.star.expand:$$LO_LIB_DIR/!uri="$(APP_DATA_PATH)/lib/!' <$(WORKDIR)/ComponentTarget/$$F.component >assets/ComponentTarget/$$F.component; \
done
for F in ucb1 ucpfile1; do \
- cp $(OUTDIR)/xml/$$F.component assets/xml; \
+ sed -e 's!uri="vnd.sun.star.expand:$$LO_LIB_DIR/!uri="$(APP_DATA_PATH)/lib/!' <$(OUTDIR)/xml/$$F.component > assets/xml/$$F.component; \
done
cp -R $(OUTDIR)/xml/registry assets/xml
for F in uno_services uno_types; do \
- sed -e 's!uri="./!uri="$(APP_DATA_PATH)/lib/!g' <$(SRC_ROOT)/testtools/$(INPATH)/lib/$${F}.rdb >assets/lib/$${F}.rdb; \
+ sed -e 's!uri="./!uri="$(APP_DATA_PATH)/lib/!g' <$(SRC_ROOT)/testtools/$(INPATH)/lib/$$F.rdb >assets/lib/$$F.rdb; \
done
+# Then assets that are unpacked at run-time into the app's data directory.
+ mkdir -p assets/unpack/bin
+ for F in $(OUTDIR)/bin/*.res; do \
+ cp $$F assets/unpack/bin; \
+ done
+ mkdir -p assets/unpack/etc/fonts
+ cp fonts.conf assets/unpack/etc/fonts
#
# Then gdbserver and gdb.setup so that we can debug with ndk-gdb.
#
@@ -162,9 +171,9 @@ uninstall:
adb uninstall $(APP_PACKAGE)
run:
- echo "$(APP_DATA_PATH)/lib/libtest_sc_ucalc.so --headless --protector libunoexceptionprotector.so unoexceptionprotector '-env:CONFIGURATION_LAYERS=xcsxcu:file:///assets/xml/registry' '-env:UNO_TYPES=file:///assets/bin/udkapi.rdb file:///assets/bin/types.rdb' '-env:UNO_SERVICES=file:///assets/xml/ure/services.rdb file:///assets/ComponentTarget/framework/util/fwk.component file:///assets/ComponentTarget/i18npool/util/i18npool.component file:///assets/ComponentTarget/sfx2/util/sfx.component file:///assets/ComponentTarget/unoxml/source/service/unoxml.component file:///assets/ComponentTarget/configmgr/source/configmgr.component file:///assets/xml/ucb1.component file:///assets/xml/ucpfile1.component' -env:URE_INTERNAL_LIB_DIR=file://$(APP_DATA_PATH)/lib -env:LO_LIB_DIR=file://$(APP_DATA_PATH)/lib" >cmdline
+ echo "STAR_RESOURCEPATH=$(APP_DATA_PATH)/bin FONTCONFIG_FILE=$(APP_DATA_PATH)/etc/fonts/fonts.conf $(APP_DATA_PATH)/lib/libtest_sc_ucalc.so --headless --protector libunoexceptionprotector.so unoexceptionprotector '-env:CONFIGURATION_LAYERS=xcsxcu:file:///assets/xml/registry' '-env:UNO_TYPES=file:///assets/bin/udkapi.rdb file:///assets/bin/types.rdb' '-env:UNO_SERVICES=file:///assets/xml/ure/services.rdb file:///assets/ComponentTarget/framework/util/fwk.component file:///assets/ComponentTarget/i18npool/util/i18npool.component file:///assets/ComponentTarget/sfx2/util/sfx.component file:///assets/ComponentTarget/unoxml/source/service/unoxml.component file:///assets/ComponentTarget/configmgr/source/configmgr.component file:///assets/xml/ucb1.component file:///assets/xml/ucpfile1.component' -env:URE_INTERNAL_LIB_DIR=file://$(APP_DATA_PATH)/lib -env:LO_LIB_DIR=file://$(APP_DATA_PATH)/lib" >cmdline
adb push cmdline $(APP_DATA_PATH)/cmdline
- adb shell am start -n $(APP_PACKAGE)/$(BOOTSTRAP) -e lo-main-library libcppunittester -e lo-main-indirect-cmdline "$(APP_DATA_PATH)/cmdline"
+ adb shell am start -n $(APP_PACKAGE)/$(BOOTSTRAP) -e lo-main-library libcppunittester -e lo-main-indirect-cmdline "$(APP_DATA_PATH)/cmdline"
clean:
ant clean
diff --git a/android/qa/sc/fonts.conf b/android/qa/sc/fonts.conf
new file mode 100644
index 0000000..73e8a35
--- /dev/null
+++ b/android/qa/sc/fonts.conf
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
+<!-- /etc/fonts/fonts.conf file to configure system font access -->
+<fontconfig>
+
+<!-- Font directory list -->
+
+ <dir>/system/fonts</dir>
+
+<!--
+ Accept deprecated 'mono' alias, replacing it with 'monospace'
+-->
+ <match target="pattern">
+ <test qual="any" name="family">
+ <string>mono</string>
+ </test>
+ <edit name="family" mode="assign">
+ <string>monospace</string>
+ </edit>
+ </match>
+
+<!--
+ Accept alternate 'sans serif' spelling, replacing it with 'sans-serif'
+-->
+ <match target="pattern">
+ <test qual="any" name="family">
+ <string>sans serif</string>
+ </test>
+ <edit name="family" mode="assign">
+ <string>sans-serif</string>
+ </edit>
+ </match>
+
+<!--
+ Accept deprecated 'sans' alias, replacing it with 'sans-serif'
+-->
+ <match target="pattern">
+ <test qual="any" name="family">
+ <string>sans</string>
+ </test>
+ <edit name="family" mode="assign">
+ <string>sans-serif</string>
+ </edit>
+ </match>
+
+<!--
+ Load local system customization file
+-->
+ <include ignore_missing="yes">conf.d</include>
+
+<!-- Font cache directory list -->
+
+ <!-- NO THANKS -->
+
+ <config>
+<!--
+ These are the default Unicode chars that are expected to be blank
+ in fonts. All other blank chars are assumed to be broken and
+ won't appear in the resulting charsets
+ -->
+ <blank>
+ <int>0x0020</int> <!-- SPACE -->
+ <int>0x00A0</int> <!-- NO-BREAK SPACE -->
+ <int>0x00AD</int> <!-- SOFT HYPHEN -->
+ <int>0x034F</int> <!-- COMBINING GRAPHEME JOINER -->
+ <int>0x0600</int> <!-- ARABIC NUMBER SIGN -->
+ <int>0x0601</int> <!-- ARABIC SIGN SANAH -->
+ <int>0x0602</int> <!-- ARABIC FOOTNOTE MARKER -->
+ <int>0x0603</int> <!-- ARABIC SIGN SAFHA -->
+ <int>0x06DD</int> <!-- ARABIC END OF AYAH -->
+ <int>0x070F</int> <!-- SYRIAC ABBREVIATION MARK -->
+ <int>0x115F</int> <!-- HANGUL CHOSEONG FILLER -->
+ <int>0x1160</int> <!-- HANGUL JUNGSEONG FILLER -->
+ <int>0x1680</int> <!-- OGHAM SPACE MARK -->
+ <int>0x17B4</int> <!-- KHMER VOWEL INHERENT AQ -->
+ <int>0x17B5</int> <!-- KHMER VOWEL INHERENT AA -->
+ <int>0x180E</int> <!-- MONGOLIAN VOWEL SEPARATOR -->
+ <int>0x2000</int> <!-- EN QUAD -->
+ <int>0x2001</int> <!-- EM QUAD -->
+ <int>0x2002</int> <!-- EN SPACE -->
+ <int>0x2003</int> <!-- EM SPACE -->
+ <int>0x2004</int> <!-- THREE-PER-EM SPACE -->
+ <int>0x2005</int> <!-- FOUR-PER-EM SPACE -->
+ <int>0x2006</int> <!-- SIX-PER-EM SPACE -->
+ <int>0x2007</int> <!-- FIGURE SPACE -->
+ <int>0x2008</int> <!-- PUNCTUATION SPACE -->
+ <int>0x2009</int> <!-- THIN SPACE -->
+ <int>0x200A</int> <!-- HAIR SPACE -->
+ <int>0x200B</int> <!-- ZERO WIDTH SPACE -->
+ <int>0x200C</int> <!-- ZERO WIDTH NON-JOINER -->
+ <int>0x200D</int> <!-- ZERO WIDTH JOINER -->
+ <int>0x200E</int> <!-- LEFT-TO-RIGHT MARK -->
+ <int>0x200F</int> <!-- RIGHT-TO-LEFT MARK -->
+ <int>0x2028</int> <!-- LINE SEPARATOR -->
+ <int>0x2029</int> <!-- PARAGRAPH SEPARATOR -->
+ <int>0x202A</int> <!-- LEFT-TO-RIGHT EMBEDDING -->
+ <int>0x202B</int> <!-- RIGHT-TO-LEFT EMBEDDING -->
+ <int>0x202C</int> <!-- POP DIRECTIONAL FORMATTING -->
+ <int>0x202D</int> <!-- LEFT-TO-RIGHT OVERRIDE -->
+ <int>0x202E</int> <!-- RIGHT-TO-LEFT OVERRIDE -->
+ <int>0x202F</int> <!-- NARROW NO-BREAK SPACE -->
+ <int>0x205F</int> <!-- MEDIUM MATHEMATICAL SPACE -->
+ <int>0x2060</int> <!-- WORD JOINER -->
+ <int>0x2061</int> <!-- FUNCTION APPLICATION -->
+ <int>0x2062</int> <!-- INVISIBLE TIMES -->
+ <int>0x2063</int> <!-- INVISIBLE SEPARATOR -->
+ <int>0x206A</int> <!-- INHIBIT SYMMETRIC SWAPPING -->
+ <int>0x206B</int> <!-- ACTIVATE SYMMETRIC SWAPPING -->
+ <int>0x206C</int> <!-- INHIBIT ARABIC FORM SHAPING -->
+ <int>0x206D</int> <!-- ACTIVATE ARABIC FORM SHAPING -->
+ <int>0x206E</int> <!-- NATIONAL DIGIT SHAPES -->
+ <int>0x206F</int> <!-- NOMINAL DIGIT SHAPES -->
+ <int>0x2800</int> <!-- BRAILLE PATTERN BLANK -->
+ <int>0x3000</int> <!-- IDEOGRAPHIC SPACE -->
+ <int>0x3164</int> <!-- HANGUL FILLER -->
+ <int>0xFEFF</int> <!-- ZERO WIDTH NO-BREAK SPACE -->
+ <int>0xFFA0</int> <!-- HALFWIDTH HANGUL FILLER -->
+ <int>0xFFF9</int> <!-- INTERLINEAR ANNOTATION ANCHOR -->
+ <int>0xFFFA</int> <!-- INTERLINEAR ANNOTATION SEPARATOR -->
+ <int>0xFFFB</int> <!-- INTERLINEAR ANNOTATION TERMINATOR -->
+ </blank>
+<!--
+ Rescan configuration every 30 seconds when FcFontSetList is called
+ -->
+ <rescan>
+ <int>30</int>
+ </rescan>
+ </config>
+
+</fontconfig>
commit 420f3f8a5c0d6cd61face7935f1c894f8e62516d
Author: Tor Lillqvist <tlillqvist at suse.com>
Date: Thu Jan 12 01:25:22 2012 +0200
Add setting environment variables
diff --git a/android/Bootstrap/src/org/libreoffice/android/Bootstrap.java b/android/Bootstrap/src/org/libreoffice/android/Bootstrap.java
index f8331ac..9e21056 100644
--- a/android/Bootstrap/src/org/libreoffice/android/Bootstrap.java
+++ b/android/Bootstrap/src/org/libreoffice/android/Bootstrap.java
@@ -38,6 +38,7 @@ import android.util.Log;
import fi.iki.tml.CommandLine;
import java.io.File;
+import java.util.Arrays;
import java.util.Scanner;
// We override NativeActivity so that we can get at the intent of the
@@ -130,14 +131,28 @@ public class Bootstrap extends NativeActivity
if (cmdLine == null)
cmdLine = "/data/data/org.libreoffice.android/lib/libqa_sal_types.so";
}
- // argv[0] will be replaced by android_main() in lo-bootstrap.c by the
- // pathname of the mainLibrary.
- cmdLine = "dummy-program-name " + cmdLine;
Log.i(TAG, String.format("cmdLine=%s", cmdLine));
String[] argv = CommandLine.split(cmdLine);
+ // Handle env var assignments in the command line. Actually
+ // not sure if this works, are environments per-thread in
+ // Android? This code runs in a different thread than that in
+ // which lo_main etc will run.
+ while (argv.length > 0 &&
+ argv[0].matches("[A-Z_]+=.*")) {
+ putenv(argv[0]);
+ argv = Arrays.copyOfRange(argv, 1, argv.length-1);
+ }
+
+ // argv[0] will be replaced by android_main() in lo-bootstrap.c by the
+ // pathname of the mainLibrary.
+ String[] newargv = new String[argv.length + 1];
+ newargv[0] = "dummy-program-name";
+ System.arraycopy(argv, 0, newargv, 1, argv.length);
+ argv = newargv;
+
// Load the LO "program" here and look up lo_main
int loLib = dlopen(mainLibrary);
commit 4a8666cc68a4659b22a6f78c04065efb7bd2a0f9
Author: Tor Lillqvist <tlillqvist at suse.com>
Date: Thu Jan 12 01:24:49 2012 +0200
Add unpacking of files from assets/unpack to the data dir
diff --git a/sal/android/lo-bootstrap.c b/sal/android/lo-bootstrap.c
index ad1a3e8..c827ea9 100644
--- a/sal/android/lo-bootstrap.c
+++ b/sal/android/lo-bootstrap.c
@@ -71,6 +71,7 @@ struct engine {
};
static struct android_app *app;
+static const char *data_dir;
static const char **library_locations;
static void *apk_file;
static int apk_file_size;
@@ -475,6 +476,8 @@ Java_org_libreoffice_android_Bootstrap_setup__Ljava_lang_String_2Ljava_lang_Stri
dataDirPath = (*env)->GetStringUTFChars(env, dataDir, NULL);
+ data_dir = strdup(dataDirPath);
+
lib_dir = malloc(strlen(dataDirPath) + 5);
strcpy(lib_dir, dataDirPath);
strcat(lib_dir, "/lib");
@@ -1312,6 +1315,119 @@ patch_libgnustl_shared(void)
&replacement_method_before_arm);
}
+#define UNPACK_TREE "/assets/unpack"
+
+static int
+mkdir_p(const char *dirname)
+{
+ char *p = malloc(strlen(dirname) + 1);
+ const char *q = dirname + 1;
+ const char *slash;
+
+ do {
+ slash = strchr(q, '/');
+ if (slash == NULL)
+ slash = q + strlen(q);
+ memcpy(p, dirname, slash-dirname);
+ p[slash-dirname] = '\0';
+ if (mkdir(p, 0700) == -1 && errno != EEXIST) {
+ LOGE("mkdir_p: Could not create %s: %s", p, strerror(errno));
+ free(p);
+ return 0;
+ }
+ if (*slash)
+ q = slash + 1;
+ } while (*slash);
+
+ free(p);
+ return 1;
+}
+
+static void
+extract_files(const char *prefix)
+{
+ lo_apk_dir *tree = lo_apk_opendir(prefix);
+ struct dirent *dent;
+
+ if (tree == NULL)
+ return;
+
+ while ((dent = lo_apk_readdir(tree)) != NULL) {
+ if (strcmp(dent->d_name, ".") == 0 ||
+ strcmp(dent->d_name, "..") == 0)
+ continue;
+
+ if (dent->d_type == DT_DIR) {
+ char *subdir = malloc(strlen(prefix) + 1 + strlen(dent->d_name) + 1);
+ strcpy(subdir, prefix);
+ strcat(subdir, "/");
+ strcat(subdir, dent->d_name);
+ extract_files(subdir);
+ free(subdir);
+ } else {
+ char *filename;
+ char *newfilename;
+ const char *apkentry;
+ size_t size;
+ struct stat st;
+ FILE *f;
+
+ filename = malloc(strlen(prefix) + 1 + strlen(dent->d_name) + 1);
+ strcpy(filename, prefix);
+ strcat(filename, "/");
+ strcat(filename, dent->d_name);
+
+ apkentry = lo_apkentry(filename, &size);
+ if (apkentry == NULL) {
+ LOGE("extract_files: Could not find %s in .apk", newfilename);
+ free(filename);
+ continue;
+ }
+
+ newfilename = malloc(strlen(data_dir) + 1 + strlen(prefix) - sizeof(UNPACK_TREE) + 1 + strlen(dent->d_name) + 1);
+ strcpy(newfilename, data_dir);
+ strcat(newfilename, "/");
+ strcat(newfilename, prefix + sizeof(UNPACK_TREE));
+
+ if (!mkdir_p(newfilename)) {
+ free(filename);
+ free(newfilename);
+ continue;
+ }
+
+ strcat(newfilename, "/");
+ strcat(newfilename, dent->d_name);
+
+ if (stat(newfilename, &st) == 0 &&
+ st.st_size == size) {
+ free(filename);
+ free(newfilename);
+ continue;
+ }
+
+ f = fopen(newfilename, "w");
+ if (f == NULL) {
+ LOGE("extract_files: Could not open %s for writing: %s", newfilename, strerror(errno));
+ free(filename);
+ free(newfilename);
+ continue;
+ }
+
+ if (fwrite(apkentry, size, 1, f) != 1) {
+ LOGE("extract_files: Could not write %d bytes to %s: %s", size, newfilename, strerror(errno));
+ }
+
+ LOGI("extract_files: Copied %s to %s: %d bytes", filename, newfilename, size);
+
+ fclose(f);
+
+ free(filename);
+ free(newfilename);
+ }
+ }
+ lo_apk_closedir(tree);
+}
+
__attribute__ ((visibility("default")))
void
Java_org_libreoffice_android_Bootstrap_patch_libgnustl_shared(JNIEnv* env,
@@ -1352,6 +1468,8 @@ android_main(struct android_app* state)
patch_libgnustl_shared();
+ extract_files(UNPACK_TREE);
+
lo_main(lo_main_argc, lo_main_argv);
exit(0);
More information about the Libreoffice-commits
mailing list