aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--build-android/.gitignore3
-rw-r--r--build-android/README.md11
-rwxr-xr-xbuild-android/build.sh71
-rw-r--r--build-android/jni/Android.mk64
-rw-r--r--src/core/basetypes/MCArray.cpp5
-rw-r--r--src/core/basetypes/MCHTMLCleaner.cpp4
-rw-r--r--src/core/basetypes/MCLibetpan.cpp3
-rw-r--r--src/core/basetypes/MCLibetpan.h1
-rw-r--r--src/core/basetypes/MCRange.cpp4
-rw-r--r--src/core/basetypes/MCString.cpp24
-rw-r--r--src/core/nntp/MCNNTPSession.cpp9
-rw-r--r--src/core/zip/MCZip.cpp1
-rw-r--r--src/core/zip/MiniZip/ioapi.c2
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