[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