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 <[email protected]> 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 <[email protected]> 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 <[email protected]> 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); _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
