diff options
-rw-r--r-- | build-android/.gitignore | 3 | ||||
-rw-r--r-- | build-android/README.md | 11 | ||||
-rwxr-xr-x | build-android/build.sh | 71 | ||||
-rw-r--r-- | build-android/jni/Android.mk | 64 | ||||
-rw-r--r-- | src/core/basetypes/MCArray.cpp | 5 | ||||
-rw-r--r-- | src/core/basetypes/MCHTMLCleaner.cpp | 4 | ||||
-rw-r--r-- | src/core/basetypes/MCLibetpan.cpp | 3 | ||||
-rw-r--r-- | src/core/basetypes/MCLibetpan.h | 1 | ||||
-rw-r--r-- | src/core/basetypes/MCRange.cpp | 4 | ||||
-rw-r--r-- | src/core/basetypes/MCString.cpp | 24 | ||||
-rw-r--r-- | src/core/nntp/MCNNTPSession.cpp | 9 | ||||
-rw-r--r-- | src/core/zip/MCZip.cpp | 1 | ||||
-rw-r--r-- | src/core/zip/MiniZip/ioapi.c | 2 |
13 files changed, 194 insertions, 8 deletions
diff --git a/build-android/.gitignore b/build-android/.gitignore new file mode 100644 index 00000000..725c6cf4 --- /dev/null +++ b/build-android/.gitignore @@ -0,0 +1,3 @@ +third-party +include +mailcore2-android-*.zip diff --git a/build-android/README.md b/build-android/README.md new file mode 100644 index 00000000..03d415b1 --- /dev/null +++ b/build-android/README.md @@ -0,0 +1,11 @@ +## Build instruction for Android ## + +``` +$ export ANDROID_NDK=/path/to/android-ndk +$ cd build-android +$ ./build.sh +``` + +It will produce the following binaries: + +- mailcore2-android-*version*.zip diff --git a/build-android/build.sh b/build-android/build.sh new file mode 100755 index 00000000..8851314f --- /dev/null +++ b/build-android/build.sh @@ -0,0 +1,71 @@ +#!/bin/sh + +build_version=1 +ANDROID_PLATFORM=android-21 +archs="armeabi armeabi-v7a x86 x86_64" +package_name=mailcore2-android +ctemplate_build_version=1 +icu4c_build_version=1 +libetpan_build_version=1 +libxml2_build_version=1 +uchardet_build_version=1 +tidy_html5_build_version=1 +openssl_build_version=1 + +current_dir="`pwd`" + +if test "x$ANDROID_NDK" = x ; then + echo should set ANDROID_NDK before running this script. + exit 1 +fi + +function download_dep { + name="$1" + version="$2" + if test ! -f "$current_dir/third-party/$name-$version.zip" ; then + if curl -f -O "http://d.etpan.org/mailcore2-deps/$name/$name-$version.zip" ; then + unzip "$name-$version.zip" + else + echo Could not download $name-$version.zip + exit 1 + fi + fi +} + +function build { + rm -rf "$current_dir/obj" + + cd "$current_dir/jni" + $ANDROID_NDK/ndk-build TARGET_PLATFORM=$ANDROID_PLATFORM TARGET_ARCH_ABI=$TARGET_ARCH_ABI \ + CTEMPLATE_PATH=$current_dir/third-party/ctemplate-android-1 \ + ICU4C_PATH=$current_dir/third-party/icu4c-android-1 \ + LIBETPAN_PATH=$current_dir/third-party/libetpan-android-1 \ + LIBXML2_PATH=$current_dir/third-party/libxml2-android-1 \ + UCHARDET_PATH=$current_dir/third-party/uchardet-android-1 \ + TIDY_HTML5_PATH=$current_dir/third-party/tidy-html5-android-1 \ + OPENSSL_PATH=$current_dir/third-party/openssl-android-1 + + mkdir -p "$current_dir/$package_name-$build_version/libs/$TARGET_ARCH_ABI" + cp "$current_dir/obj/local/$TARGET_ARCH_ABI/libMailCore.a" "$current_dir/$package_name-$build_version/libs/$TARGET_ARCH_ABI" + rm -rf "$current_dir/obj" +} + +mkdir -p "$current_dir/third-party" +cd "$current_dir/third-party" +download_dep "ctemplate-android" $ctemplate_build_version +download_dep "icu4c-android" $icu4c_build_version +download_dep "libetpan-android" $libetpan_build_version +download_dep "libxml2-android" $libxml2_build_version +download_dep "uchardet-android" $uchardet_build_version +download_dep "tidy-html5-android" $tidy_html5_build_version +download_dep "openssl-android" $openssl_build_version + +# Start building. +for arch in $archs ; do + TARGET_ARCH_ABI=$arch + build +done + +cd "$current_dir" +zip -qry "$package_name-$build_version.zip" "$package_name-$build_version" +rm -rf "$package_name-$build_version" diff --git a/build-android/jni/Android.mk b/build-android/jni/Android.mk new file mode 100644 index 00000000..dee660ec --- /dev/null +++ b/build-android/jni/Android.mk @@ -0,0 +1,64 @@ +CURRENT_DIR := $(call my-dir) + +include $(CLEAR_VARS) + +LOCAL_MODULE := MailCore + +src_dir := $(CURRENT_DIR)/../../src +subdirs = \ + core \ + core/basetypes \ + core/abstract \ + core/imap \ + core/nntp \ + core/pop \ + core/provider \ + core/renderer \ + core/rfc822 \ + core/security \ + core/smtp \ + core/zip \ + core/zip/MiniZip +LOCAL_C_INCLUDES := \ + $(CURRENT_DIR)/../include \ + $(CTEMPLATE_PATH)/include \ + $(ICU4C_PATH)/include \ + $(LIBETPAN_PATH)/include \ + $(LIBXML2_PATH)/include \ + $(UCHARDET_PATH)/include \ + $(TIDY_HTML5_PATH)/include \ + $(OPENSSL_PATH)/include \ + $(ANDROID_NDK)/sources/cxx-stl/llvm-libc++/libcxx/include \ + $(ANDROID_NDK)/sources/cxx-stl/llvm-libc++abi/libcxxabi/include \ + $(addprefix $(src_dir)/, $(subdirs)) +core_excludes = MCWin32.cpp MCStringWin32.cpp MCMainThreadWin32.cpp MCMainThreadGTK.cpp +core_src_files := $(filter-out \ + $(addprefix $(src_dir)/core/basetypes/, $(core_excludes)), \ + $(wildcard $(src_dir)/core/basetypes/*.cpp) $(wildcard $(src_dir)/core/basetypes/*.c)) +abstract_src_files := $(wildcard $(src_dir)/core/abstract/*.cpp) +imap_src_files := $(wildcard $(src_dir)/core/imap/*.cpp) +nntp_src_files := $(wildcard $(src_dir)/core/nntp/*.cpp) +pop_src_files := $(wildcard $(src_dir)/core/pop/*.cpp) +provider_src_files := $(wildcard $(src_dir)/core/provider/*.cpp) +renderer_src_files := $(wildcard $(src_dir)/core/renderer/*.cpp) +rfc822_src_files := $(wildcard $(src_dir)/core/rfc822/*.cpp) +security_src_files := $(wildcard $(src_dir)/core/security/*.cpp) +smtp_src_files := $(wildcard $(src_dir)/core/smtp/*.cpp) +zip_src_files := $(wildcard $(src_dir)/core/zip/*.cpp) +minizip_src_files := \ + $(src_dir)/core/zip/MiniZip/ioapi.c \ + $(src_dir)/core/zip/MiniZip/unzip.c \ + $(src_dir)/core/zip/MiniZip/zip.c +async_imap_src_files := $(wildcard $(src_dir)/async/imap/*.cpp) +async_nntp_src_files := $(wildcard $(src_dir)/async/nntp/*.cpp) +async_pop_src_files := $(wildcard $(src_dir)/async/pop/*.cpp) +async_smtp_src_files := $(wildcard $(src_dir)/async/smtp/*.cpp) + +LOCAL_SRC_FILES := $(core_src_files) $(abstract_src_files) $(imap_src_files) $(nntp_src_files) \ + $(pop_src_files) $(provider_src_files) $(renderer_src_files) $(rfc822_src_files) \ + $(security_src_files) $(smtp_src_files) $(zip_src_files) $(minizip_src_files) \ + $(async_imap_src_files) $(async_nntp_src_files) $(async_pop_src_files) $(async_smtp_src_files) +LOCAL_CPPFLAGS := -frtti +LOCAL_CFLAGS := -DNOCRYPT + +include $(BUILD_STATIC_LIBRARY) diff --git a/src/core/basetypes/MCArray.cpp b/src/core/basetypes/MCArray.cpp index 9fa69ccb..d1d02a26 100644 --- a/src/core/basetypes/MCArray.cpp +++ b/src/core/basetypes/MCArray.cpp @@ -10,6 +10,7 @@ #include "MCLog.h" #include "MCUtils.h" #include "MCIterator.h" +#include "MCAndroid.h" using namespace mailcore; @@ -232,6 +233,10 @@ void Array::sortArray(int (* compare)(void * a, void * b, void * context), void sizeof(*carray_data(mArray)), (int(*)(void *, const void *, const void *)) sortCompare, &data); +#elif defined(ANDROID) || defined(__ANDROID__) + android_qsort_r(carray_data(mArray), carray_count(mArray), + sizeof(* carray_data(mArray)), &data, + (int (*)(void *, const void *, const void *)) sortCompare); #else qsort_r(carray_data(mArray), carray_count(mArray), sizeof(* carray_data(mArray)), diff --git a/src/core/basetypes/MCHTMLCleaner.cpp b/src/core/basetypes/MCHTMLCleaner.cpp index 81145c9e..f3ff9c21 100644 --- a/src/core/basetypes/MCHTMLCleaner.cpp +++ b/src/core/basetypes/MCHTMLCleaner.cpp @@ -11,6 +11,10 @@ #include "MCString.h" #include "MCData.h" +#if defined(ANDROID) || defined(__ANDROID__) +typedef unsigned long ulong; +#endif + #include <tidy.h> #include <buffio.h> diff --git a/src/core/basetypes/MCLibetpan.cpp b/src/core/basetypes/MCLibetpan.cpp index 51a27430..91806110 100644 --- a/src/core/basetypes/MCLibetpan.cpp +++ b/src/core/basetypes/MCLibetpan.cpp @@ -16,7 +16,6 @@ using namespace mailcore; -static time_t mkgmtime(struct tm * tmp); static int tmcomp(struct tm * atmp, struct tm * btmp); INITIALIZE(Libetpan) @@ -178,7 +177,7 @@ static int tmcomp(struct tm * atmp, struct tm * btmp) return result; } -static time_t mkgmtime(struct tm * tmp) +time_t mailcore::mkgmtime(struct tm * tmp) { int dir; int bits; diff --git a/src/core/basetypes/MCLibetpan.h b/src/core/basetypes/MCLibetpan.h index 41024137..4e3bfe97 100644 --- a/src/core/basetypes/MCLibetpan.h +++ b/src/core/basetypes/MCLibetpan.h @@ -19,6 +19,7 @@ namespace mailcore { time_t timestampFromIMAPDate(struct mailimap_date_time * date_time); struct mailimf_date_time * dateFromTimestamp(time_t timeval); struct mailimap_date_time * imapDateFromTimestamp(time_t timeval); + time_t mkgmtime(struct tm * tmp); } diff --git a/src/core/basetypes/MCRange.cpp b/src/core/basetypes/MCRange.cpp index d99e3dec..fb6b3486 100644 --- a/src/core/basetypes/MCRange.cpp +++ b/src/core/basetypes/MCRange.cpp @@ -12,6 +12,10 @@ #include <sys/param.h> #endif +#if defined(ANDROID) || defined(__ANDROID__) +#include "MCAndroid.h" +#endif + using namespace mailcore; Range mailcore::RangeEmpty = {UINT64_MAX, 0}; diff --git a/src/core/basetypes/MCString.cpp b/src/core/basetypes/MCString.cpp index b3beeb40..90d7b227 100644 --- a/src/core/basetypes/MCString.cpp +++ b/src/core/basetypes/MCString.cpp @@ -13,7 +13,7 @@ #include <unicode/ucnv.h> #include <unicode/utypes.h> #endif -#ifndef _MSC_VER +#if !defined(_MSC_VER) && !defined(ANDROID) && !defined(__ANDROID__) #include <uuid/uuid.h> #endif #include <pthread.h> @@ -1384,6 +1384,26 @@ String * String::extractedSubjectAndKeepBracket(bool keepBracket) return str; } +#if defined(ANDROID) || defined(__ANDROID__) + +String * String::uuidString() +{ + char buffer[38]; + FILE * f = fopen("/proc/sys/kernel/random/uuid", "r"); + if (f == NULL) { + return NULL; + } + if (fgets(buffer, sizeof(buffer), f) == NULL) { + fclose(f); + return NULL; + } + buffer[38] = 0; + fclose(f); + return String::stringWithUTF8Characters(buffer); +} + +#else + #ifndef _MSC_VER String * String::uuidString() { @@ -1400,6 +1420,8 @@ String * String::uuidString() } #endif +#endif + unsigned int String::replaceOccurrencesOfString(String * occurrence, String * replacement) { unsigned int count; diff --git a/src/core/nntp/MCNNTPSession.cpp b/src/core/nntp/MCNNTPSession.cpp index 4f50f46e..44765a3e 100644 --- a/src/core/nntp/MCNNTPSession.cpp +++ b/src/core/nntp/MCNNTPSession.cpp @@ -17,6 +17,7 @@ #include "MCMessageHeader.h" #include "MCConnectionLoggerUtils.h" #include "MCCertificateUtils.h" +#include "MCLibetpan.h" #define NNTP_DEFAULT_PORT 119 #define NNTPS_DEFAULT_PORT 563 @@ -504,21 +505,21 @@ time_t NNTPSession::fetchServerDate(ErrorCode * pError) { loginIfNeeded(pError); if (* pError != ErrorNone) { - return NULL; + return (time_t) -1; } r = newsnntp_date(mNNTP, &time); if (r == NEWSNNTP_ERROR_STREAM) { * pError = ErrorConnection; - return NULL; + return (time_t) -1; } else if (r != NEWSNNTP_NO_ERROR) { * pError = ErrorServerDate; - return NULL; + return (time_t) -1; } - result = timegm(&time); + result = mkgmtime(&time); * pError = ErrorNone; return result; diff --git a/src/core/zip/MCZip.cpp b/src/core/zip/MCZip.cpp index 6e700732..620aeb06 100644 --- a/src/core/zip/MCZip.cpp +++ b/src/core/zip/MCZip.cpp @@ -8,6 +8,7 @@ #include <sys/types.h> #ifndef _MSC_VER #include <dirent.h> +#include <unistd.h> #endif #include <sys/stat.h> #include <time.h> diff --git a/src/core/zip/MiniZip/ioapi.c b/src/core/zip/MiniZip/ioapi.c index 9b04a2a8..58c8fc64 100644 --- a/src/core/zip/MiniZip/ioapi.c +++ b/src/core/zip/MiniZip/ioapi.c @@ -16,7 +16,7 @@ #include "ioapi.h" -#ifdef __APPLE__ +#if defined(__APPLE__) || defined(ANDROID) || defined(__ANDROID__) #define off64_t off_t #define fopen64 fopen #define ftello64 ftello |