diff --git a/RetroShare.pro b/RetroShare.pro
index 4197db2e0..a1283a1bb 100644
--- a/RetroShare.pro
+++ b/RetroShare.pro
@@ -23,7 +23,7 @@ TEMPLATE = subdirs
SUBDIRS += openpgpsdk
openpgpsdk.file = openpgpsdk/src/openpgpsdk.pro
-rs_jsonapi {
+rs_jsonapi:isEmpty(JSONAPI_GENERATOR_EXE) {
SUBDIRS += jsonapi-generator
jsonapi-generator.file = jsonapi-generator/src/jsonapi-generator.pro
libretroshare.depends += jsonapi-generator
@@ -36,9 +36,11 @@ libretroshare.depends = openpgpsdk libbitdht
SUBDIRS += libretroshare
libretroshare.file = libretroshare/src/libretroshare.pro
-SUBDIRS += libresapi
-libresapi.file = libresapi/src/libresapi.pro
-libresapi.depends = libretroshare
+libresapi {
+ SUBDIRS += libresapi
+ libresapi.file = libresapi/src/libresapi.pro
+ libresapi.depends = libretroshare
+}
retroshare_gui {
SUBDIRS += retroshare_gui
@@ -79,6 +81,13 @@ retroshare_qml_app {
}
}
+retroshare_service {
+ SUBDIRS += retroshare_service
+ retroshare_service.file = retroshare-service/src/retroshare-service.pro
+ retroshare_service.depends = libretroshare
+ retroshare_service.target = retroshare_service
+}
+
retroshare_plugins {
SUBDIRS += plugins
plugins.file = plugins/plugins.pro
diff --git a/build_scripts/Android/prepare-toolchain-clang.sh b/build_scripts/Android/prepare-toolchain-clang.sh
new file mode 100755
index 000000000..0e9fdb7f7
--- /dev/null
+++ b/build_scripts/Android/prepare-toolchain-clang.sh
@@ -0,0 +1,334 @@
+#!/bin/bash
+
+## Define default value for variable, take two arguments, $1 variable name,
+## $2 default variable value, if the variable is not already define define it
+## with default value.
+function define_default_value()
+{
+ VAR_NAME="${1}"
+ DEFAULT_VALUE="${2}"
+
+ [ -z "${!VAR_NAME}" ] && export ${VAR_NAME}="${DEFAULT_VALUE}"
+}
+
+## You are supposed to provide the following variables according to your system setup
+define_default_value ANDROID_NDK_PATH "/opt/android-ndk/"
+define_default_value ANDROID_NDK_ARCH "arm"
+define_default_value ANDROID_PLATFORM_VER "21"
+define_default_value NATIVE_LIBS_TOOLCHAIN_PATH "${HOME}/Builds/android-toolchains/retroshare-android-${ANDROID_PLATFORM_VER}-${ANDROID_NDK_ARCH}/"
+define_default_value HOST_NUM_CPU $(nproc)
+
+define_default_value BZIP2_SOURCE_VERSION "1.0.6"
+define_default_value BZIP2_SOURCE_SHA256 a2848f34fcd5d6cf47def00461fcb528a0484d8edef8208d6d2e2909dc61d9cd
+
+define_default_value OPENSSL_SOURCE_VERSION "1.1.1"
+define_default_value OPENSSL_SOURCE_SHA256 2836875a0f89c03d0fdf483941512613a50cfb421d6fd94b9f41d7279d586a3d
+
+define_default_value SQLITE_SOURCE_YEAR "2018"
+define_default_value SQLITE_SOURCE_VERSION "3250200"
+define_default_value SQLITE_SOURCE_SHA256 da9a1484423d524d3ac793af518cdf870c8255d209e369bd6a193e9f9d0e3181
+
+define_default_value SQLCIPHER_SOURCE_VERSION "3.4.2"
+define_default_value SQLCIPHER_SOURCE_SHA256 69897a5167f34e8a84c7069f1b283aba88cdfa8ec183165c4a5da2c816cfaadb
+
+define_default_value LIBUPNP_SOURCE_VERSION "1.6.25"
+define_default_value LIBUPNP_SOURCE_SHA256 c5a300b86775435c076d58a79cc0d5a977d76027d2a7d721590729b7f369fa43
+
+define_default_value INSTALL_QT_ANDROID "false"
+define_default_value QT_VERSION "5.9.6"
+define_default_value QT_ANDROID_INSTALLER_SHA256 a214084e2295c9a9f8727e8a0131c37255bf724bfc69e80f7012ba3abeb1f763
+
+define_default_value RESTBED_SOURCE_VERSION "4.6"
+
+## $1 filename, $2 sha256 hash
+function check_sha256()
+{
+ echo ${2} "${1}" | sha256sum -c &> /dev/null
+}
+
+## $1 filename, $2 sha256 hash, $3 url
+function verified_download()
+{
+ FILENAME="$1"
+ SHA256="$2"
+ URL="$3"
+
+ check_sha256 "${FILENAME}" "${SHA256}" ||
+ {
+ rm -rf "${FILENAME}"
+
+ wget -O "${FILENAME}" "$URL" ||
+ {
+ echo "Failed downloading ${FILENAME} from $URL"
+ exit 1
+ }
+
+ check_sha256 "${FILENAME}" "${SHA256}" ||
+ {
+ echo "SHA256 mismatch for ${FILENAME} from ${URL} expected sha256 ${SHA256} got $(sha256sum ${FILENAME} | awk '{print $1}')"
+ exit 1
+ }
+ }
+}
+
+
+
+if [ "${ANDROID_NDK_ARCH}" == "x86" ]; then
+ cArch="i686"
+ eABI=""
+else
+ cArch="${ANDROID_NDK_ARCH}"
+ eABI="eabi"
+fi
+export SYSROOT="${NATIVE_LIBS_TOOLCHAIN_PATH}/sysroot/"
+export PREFIX="${SYSROOT}/usr/"
+export CC="${NATIVE_LIBS_TOOLCHAIN_PATH}/bin/${cArch}-linux-android${eABI}-clang"
+export CXX="${NATIVE_LIBS_TOOLCHAIN_PATH}/bin/${cArch}-linux-android${eABI}-clang++"
+export AR="${NATIVE_LIBS_TOOLCHAIN_PATH}/bin/${cArch}-linux-android${eABI}-ar"
+export RANLIB="${NATIVE_LIBS_TOOLCHAIN_PATH}/bin/${cArch}-linux-android${eABI}-ranlib"
+
+
+## More information available at https://android.googlesource.com/platform/ndk/+/ics-mr0/docs/STANDALONE-TOOLCHAIN.html
+build_toolchain()
+{
+ rm -rf ${NATIVE_LIBS_TOOLCHAIN_PATH}
+ ${ANDROID_NDK_PATH}/build/tools/make_standalone_toolchain.py --verbose \
+ --arch ${ANDROID_NDK_ARCH} --install-dir ${NATIVE_LIBS_TOOLCHAIN_PATH} \
+ --api ${ANDROID_PLATFORM_VER}
+}
+
+## More information available at https://gitlab.com/relan/provisioners/merge_requests/1 and http://stackoverflow.com/a/34032216
+install_qt_android()
+{
+ QT_VERSION_CODE=$(echo $QT_VERSION | tr -d .)
+ QT_INSTALL_PATH=${NATIVE_LIBS_TOOLCHAIN_PATH}/Qt
+ QT_INSTALLER="qt-unified-linux-x64-3.0.2-online.run"
+
+ verified_download $QT_INSTALLER $QT_ANDROID_INSTALLER_SHA256 \
+ http://master.qt.io/archive/online_installers/3.0/${QT_INSTALLER}
+
+ chmod a+x ${QT_INSTALLER}
+
+ QT_INSTALLER_SCRIPT="qt_installer_script.js"
+ cat << EOF > "${QT_INSTALLER_SCRIPT}"
+function Controller() {
+ installer.autoRejectMessageBoxes();
+ installer.installationFinished.connect(function() {
+ gui.clickButton(buttons.NextButton);
+ });
+
+ var welcomePage = gui.pageWidgetByObjectName("WelcomePage");
+ welcomePage.completeChanged.connect(function() {
+ if (gui.currentPageWidget().objectName == welcomePage.objectName)
+ gui.clickButton(buttons.NextButton);
+ });
+}
+
+Controller.prototype.WelcomePageCallback = function() {
+ gui.clickButton(buttons.NextButton);
+}
+
+Controller.prototype.CredentialsPageCallback = function() {
+ gui.clickButton(buttons.NextButton);
+}
+
+Controller.prototype.IntroductionPageCallback = function() {
+ gui.clickButton(buttons.NextButton);
+}
+
+Controller.prototype.TargetDirectoryPageCallback = function() {
+ gui.currentPageWidget().TargetDirectoryLineEdit.setText("$QT_INSTALL_PATH");
+ gui.clickButton(buttons.NextButton);
+}
+
+Controller.prototype.ComponentSelectionPageCallback = function() {
+ var widget = gui.currentPageWidget();
+
+ // You can get these component names by running the installer with the
+ // --verbose flag. It will then print out a resource tree.
+
+ widget.deselectComponent("qt.tools.qtcreator");
+ widget.deselectComponent("qt.tools.doc");
+ widget.deselectComponent("qt.tools.examples");
+
+ widget.selectComponent("qt.$QT_VERSION_CODE.android_armv7");
+
+ gui.clickButton(buttons.NextButton);
+}
+
+Controller.prototype.LicenseAgreementPageCallback = function() {
+ gui.currentPageWidget().AcceptLicenseRadioButton.setChecked(true);
+ gui.clickButton(buttons.NextButton);
+}
+
+Controller.prototype.StartMenuDirectoryPageCallback = function() {
+ gui.clickButton(buttons.NextButton);
+}
+
+Controller.prototype.ReadyForInstallationPageCallback = function() {
+ gui.clickButton(buttons.NextButton);
+}
+
+Controller.prototype.FinishedPageCallback = function() {
+ var checkBoxForm = gui.currentPageWidget().LaunchQtCreatorCheckBoxForm;
+ if (checkBoxForm && checkBoxForm.launchQtCreatorCheckBox)
+ checkBoxForm.launchQtCreatorCheckBox.checked = false;
+ gui.clickButton(buttons.FinishButton);
+}
+EOF
+
+QT_QPA_PLATFORM=minimal ./${QT_INSTALLER} --script ${QT_INSTALLER_SCRIPT}
+}
+
+## More information available at retroshare://file?name=Android%20Native%20Development%20Kit%20Cookbook.pdf&size=29214468&hash=0123361c1b14366ce36118e82b90faf7c7b1b136
+build_bzlib()
+{
+ B_dir="bzip2-${BZIP2_SOURCE_VERSION}"
+ rm -rf $B_dir
+
+ verified_download $B_dir.tar.gz $BZIP2_SOURCE_SHA256 \
+ http://trumpetti.atm.tut.fi/gentoo/distfiles/bzip2-${BZIP2_SOURCE_VERSION}.tar.gz
+
+ tar -xf $B_dir.tar.gz
+ cd $B_dir
+ sed -i "/^CC=.*/d" Makefile
+ sed -i "/^AR=.*/d" Makefile
+ sed -i "/^RANLIB=.*/d" Makefile
+ sed -i "/^LDFLAGS=.*/d" Makefile
+ sed -i "s/^all: libbz2.a bzip2 bzip2recover test/all: libbz2.a bzip2 bzip2recover/" Makefile
+ make -j${HOST_NUM_CPU}
+ make install PREFIX=${PREFIX}
+# sed -i "/^CC=.*/d" Makefile-libbz2_so
+# make -f Makefile-libbz2_so -j${HOST_NUM_CPU}
+# cp libbz2.so.1.0.6 ${SYSROOT}/usr/lib/libbz2.so
+ cd ..
+}
+
+## More information available at http://doc.qt.io/qt-5/opensslsupport.html
+build_openssl()
+{
+ B_dir="openssl-${OPENSSL_SOURCE_VERSION}"
+ rm -rf $B_dir
+
+ verified_download $B_dir.tar.gz $OPENSSL_SOURCE_SHA256 \
+ https://www.openssl.org/source/$B_dir.tar.gz
+
+ tar -xf $B_dir.tar.gz
+ cd $B_dir
+## We link openssl statically to avoid android silently sneaking in his own
+## version of libssl.so (we noticed this because it had some missing symbol
+## that made RS crash), the crash in some android version is only one of the
+## possible problems the fact that android insert his own binary libssl.so pose
+## non neglegible security concerns.
+ oBits="32"
+ [[ ${ANDROID_NDK_ARCH} =~ .*64.* ]] && oBits=64
+
+ ANDROID_NDK="${ANDROID_NDK_PATH}" PATH="${SYSROOT}/bin/:${PATH}" \
+ ./Configure linux-generic${oBits} --prefix="${PREFIX}" \
+ --openssldir="${SYSROOT}/etc/ssl"
+# sed -i 's/LIBNAME=$$i LIBVERSION=$(SHLIB_MAJOR).$(SHLIB_MINOR) \\/LIBNAME=$$i \\/g' Makefile
+# sed -i '/LIBCOMPATVERSIONS=";$(SHLIB_VERSION_HISTORY)" \\/d' Makefile
+ make -j${HOST_NUM_CPU}
+ make install
+# cp *.so "${SYSROOT}/usr/lib"
+ cd ..
+}
+
+build_sqlite()
+{
+ B_dir="sqlite-autoconf-${SQLITE_SOURCE_VERSION}"
+
+ verified_download $B_dir.tar.gz $SQLITE_SOURCE_SHA256 \
+ https://www.sqlite.org/${SQLITE_SOURCE_YEAR}/$B_dir.tar.gz
+
+ tar -xf $B_dir.tar.gz
+ cd $B_dir
+ ./configure --prefix="${PREFIX}" --host=${ANDROID_NDK_ARCH}-linux
+ make -j${HOST_NUM_CPU}
+ make install
+ rm -f ${PREFIX}/lib/libsqlite3.so*
+# ${CC} -shared -o libsqlite3.so -fPIC sqlite3.o -ldl
+# cp libsqlite3.so "${SYSROOT}/usr/lib"
+ cd ..
+}
+
+build_sqlcipher()
+{
+ B_dir="sqlcipher-${SQLCIPHER_SOURCE_VERSION}"
+ rm -rf $B_dir
+
+ T_file="${B_dir}.tar.gz"
+
+ verified_download $T_file $SQLCIPHER_SOURCE_SHA256 \
+ https://github.com/sqlcipher/sqlcipher/archive/v${SQLCIPHER_SOURCE_VERSION}.tar.gz
+
+ tar -xf $T_file
+ cd $B_dir
+ ./configure --build=$(sh ./config.guess) \
+ --host=${ANDROID_NDK_ARCH}-linux \
+ --prefix="${PREFIX}" --with-sysroot="${SYSROOT}" \
+ --enable-tempstore=yes \
+ --disable-tcl --disable-shared \
+ CFLAGS="-DSQLITE_HAS_CODEC" LDFLAGS="${PREFIX}/lib/libcrypto.a"
+ make -j${HOST_NUM_CPU}
+ make install
+ cd ..
+}
+
+build_libupnp()
+{
+ B_dir="libupnp-${LIBUPNP_SOURCE_VERSION}"
+ rm -rf $B_dir
+
+ verified_download $B_dir.tar.bz2 $LIBUPNP_SOURCE_SHA256 \
+ https://sourceforge.net/projects/pupnp/files/pupnp/libUPnP%20${LIBUPNP_SOURCE_VERSION}/$B_dir.tar.bz2
+
+ tar -xf $B_dir.tar.bz2
+ cd $B_dir
+## liupnp must be configured as static library because if not the linker will
+## look for libthreadutils.so.6 at runtime that cannot be packaged on android
+## as it supports only libname.so format for libraries, thus resulting in a
+## crash at startup.
+ ./configure --enable-static --disable-shared --disable-samples --prefix="${PREFIX}" --host=${ANDROID_NDK_ARCH}-linux
+ make -j${HOST_NUM_CPU}
+ make install
+ cd ..
+}
+
+build_rapidjson()
+{
+ B_dir="rapidjson-1.1.0"
+ [ -f $B_dir.tar.gz ] || wget -O $B_dir.tar.gz https://github.com/Tencent/rapidjson/archive/v1.1.0.tar.gz
+ tar -xf $B_dir.tar.gz
+ cp -r rapidjson-1.1.0/include/rapidjson/ "${PREFIX}/include/rapidjson"
+}
+
+build_restbed()
+{
+ [ -d restbed ] || git clone --depth=2000 https://github.com/Corvusoft/restbed.git
+ cd restbed
+ git fetch --tags
+ git checkout tags/${RESTBED_SOURCE_VERSION}
+ git submodule update --init dependency/asio
+ git submodule update --init dependency/catch
+ git submodule update --init dependency/kashmir
+ cd ..
+
+ rm -rf restbed-build; mkdir restbed-build ; cd restbed-build
+ cmake -DBUILD_SSL=OFF -DCMAKE_INSTALL_PREFIX=${PREFIX} -B. -H../restbed
+ make -j${HOST_NUM_CPU}
+ make install
+ cd ..
+}
+
+build_toolchain
+[ "${INSTALL_QT_ANDROID}X" != "trueX" ] || install_qt_android
+build_bzlib
+build_openssl
+build_sqlite
+build_sqlcipher
+build_libupnp
+build_rapidjson
+build_restbed
+
+echo NATIVE_LIBS_TOOLCHAIN_PATH=${NATIVE_LIBS_TOOLCHAIN_PATH}
diff --git a/libretroshare/src/libretroshare.pro b/libretroshare/src/libretroshare.pro
index 4bafccec7..3f9d13331 100644
--- a/libretroshare/src/libretroshare.pro
+++ b/libretroshare/src/libretroshare.pro
@@ -862,16 +862,19 @@ rs_gxs_trans {
rs_jsonapi {
JSONAPI_GENERATOR_SRC=$$clean_path($${RS_SRC_PATH}/jsonapi-generator/src/)
JSONAPI_GENERATOR_OUT=$$clean_path($${RS_BUILD_PATH}/jsonapi-generator/src/)
- win32 {
- CONFIG(release, debug|release) {
- JSONAPI_GENERATOR_EXE=$$clean_path($${JSONAPI_GENERATOR_OUT}/release/jsonapi-generator.exe)
+ isEmpty(JSONAPI_GENERATOR_EXE) {
+ win32 {
+ CONFIG(release, debug|release) {
+ JSONAPI_GENERATOR_EXE=$$clean_path($${JSONAPI_GENERATOR_OUT}/release/jsonapi-generator.exe)
+ }
+ CONFIG(debug, debug|release) {
+ JSONAPI_GENERATOR_EXE=$$clean_path($${JSONAPI_GENERATOR_OUT}/debug/jsonapi-generator.exe)
+ }
+ } else {
+ JSONAPI_GENERATOR_EXE=$$clean_path($${JSONAPI_GENERATOR_OUT}/jsonapi-generator)
}
- CONFIG(debug, debug|release) {
- JSONAPI_GENERATOR_EXE=$$clean_path($${JSONAPI_GENERATOR_OUT}/debug/jsonapi-generator.exe)
- }
- } else {
- JSONAPI_GENERATOR_EXE=$$clean_path($${JSONAPI_GENERATOR_OUT}/jsonapi-generator)
}
+
DOXIGEN_INPUT_DIRECTORY=$$clean_path($${PWD})
DOXIGEN_CONFIG_SRC=$$clean_path($${RS_SRC_PATH}/jsonapi-generator/src/jsonapi-generator-doxygen.conf)
DOXIGEN_CONFIG_OUT=$$clean_path($${JSONAPI_GENERATOR_OUT}/jsonapi-generator-doxygen-final.conf)
@@ -899,6 +902,7 @@ rs_jsonapi {
jsonwrappersincl.target = $${WRAPPERS_INCL_FILE}
jsonwrappersincl.commands = \
+ mkdir -p $${JSONAPI_GENERATOR_OUT}; \
cp $${DOXIGEN_CONFIG_SRC} $${DOXIGEN_CONFIG_OUT}; \
echo OUTPUT_DIRECTORY=$$shell_path($${JSONAPI_GENERATOR_OUT}) >> $${DOXIGEN_CONFIG_OUT};\
echo INPUT=$$shell_path($${DOXIGEN_INPUT_DIRECTORY}) >> $${DOXIGEN_CONFIG_OUT}; \
diff --git a/libretroshare/src/use_libretroshare.pri b/libretroshare/src/use_libretroshare.pri
index 8129f8132..64d6dbce0 100644
--- a/libretroshare/src/use_libretroshare.pri
+++ b/libretroshare/src/use_libretroshare.pri
@@ -57,9 +57,7 @@ rs_jsonapi {
QMAKE_LIBDIR *= $$clean_path($${RESTBED_BUILD_PATH}/library/)
# Using sLibs would fail as librestbed.a is generated at compile-time
LIBS *= -L$$clean_path($${RESTBED_BUILD_PATH}/library/) -lrestbed
- win32-g++ {
- LIBS += -lwsock32
- }
+ win32-g++:LIBS += -lwsock32
}
linux-* {
diff --git a/libretroshare/src/util/rsurl.cc b/libretroshare/src/util/rsurl.cc
index efaab9777..3775f8436 100644
--- a/libretroshare/src/util/rsurl.cc
+++ b/libretroshare/src/util/rsurl.cc
@@ -16,7 +16,7 @@
* along with this program. If not, see .
*/
-//#include "util/rsurl.h"
+
#include "rsurl.h"
#include
@@ -245,7 +245,7 @@ RsUrl& RsUrl::setFragment(const std::string& fragment)
if(str[i] == '%' && i < boundary)
{
- decoded << static_cast(stoi(str.substr(++i, 2), 0, 16));
+ decoded << static_cast(std::stoi(str.substr(++i, 2), 0, 16));
++i;
}
else decoded << str[i];
diff --git a/retroshare-service/src/android/.gitignore b/retroshare-service/src/android/.gitignore
new file mode 100644
index 000000000..dfe00b261
--- /dev/null
+++ b/retroshare-service/src/android/.gitignore
@@ -0,0 +1,3 @@
+*~
+gradle.properties
+local.properties
diff --git a/retroshare-service/src/android/AndroidManifest.xml b/retroshare-service/src/android/AndroidManifest.xml
new file mode 100644
index 000000000..ca062305c
--- /dev/null
+++ b/retroshare-service/src/android/AndroidManifest.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/retroshare-service/src/android/build.gradle b/retroshare-service/src/android/build.gradle
new file mode 100644
index 000000000..8affd3c0b
--- /dev/null
+++ b/retroshare-service/src/android/build.gradle
@@ -0,0 +1,57 @@
+buildscript {
+ repositories {
+ google()
+ jcenter()
+ }
+
+ dependencies {
+ classpath 'com.android.tools.build:gradle:3.0.1'
+ }
+}
+
+repositories {
+ google()
+ jcenter()
+}
+
+apply plugin: 'com.android.application'
+
+dependencies {
+ compile fileTree(dir: 'libs', include: ['*.jar'])
+}
+
+android {
+ /*******************************************************
+ * The following variables:
+ * - androidBuildToolsVersion,
+ * - androidCompileSdkVersion
+ * - qt5AndroidDir - holds the path to qt android files
+ * needed to build any Qt application
+ * on Android.
+ *
+ * are defined in gradle.properties file. This file is
+ * updated by QtCreator and androiddeployqt tools.
+ * Changing them manually might break the compilation!
+ *******************************************************/
+
+ compileSdkVersion androidCompileSdkVersion.toInteger()
+
+ buildToolsVersion androidBuildToolsVersion
+
+ sourceSets {
+ main {
+ manifest.srcFile 'AndroidManifest.xml'
+ java.srcDirs = [qt5AndroidDir + '/src', 'src', 'java']
+ aidl.srcDirs = [qt5AndroidDir + '/src', 'src', 'aidl']
+ res.srcDirs = [qt5AndroidDir + '/res', 'res']
+ resources.srcDirs = ['src']
+ renderscript.srcDirs = ['src']
+ assets.srcDirs = ['assets']
+ jniLibs.srcDirs = ['libs']
+ }
+ }
+
+ lintOptions {
+ abortOnError false
+ }
+}
diff --git a/retroshare-service/src/android/gradle/wrapper/gradle-wrapper.jar b/retroshare-service/src/android/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 000000000..f6b961fd5
Binary files /dev/null and b/retroshare-service/src/android/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/retroshare-service/src/android/gradle/wrapper/gradle-wrapper.properties b/retroshare-service/src/android/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 000000000..bf3de2183
--- /dev/null
+++ b/retroshare-service/src/android/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/retroshare-service/src/android/gradlew b/retroshare-service/src/android/gradlew
new file mode 100755
index 000000000..cccdd3d51
--- /dev/null
+++ b/retroshare-service/src/android/gradlew
@@ -0,0 +1,172 @@
+#!/usr/bin/env sh
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+ cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"
diff --git a/retroshare-service/src/android/gradlew.bat b/retroshare-service/src/android/gradlew.bat
new file mode 100644
index 000000000..f9553162f
--- /dev/null
+++ b/retroshare-service/src/android/gradlew.bat
@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/retroshare-service/src/android/res/drawable/retroshare_128x128.png b/retroshare-service/src/android/res/drawable/retroshare_128x128.png
new file mode 120000
index 000000000..9fd712c47
--- /dev/null
+++ b/retroshare-service/src/android/res/drawable/retroshare_128x128.png
@@ -0,0 +1 @@
+../../../../../data/128x128/apps/retroshare.png
\ No newline at end of file
diff --git a/retroshare-service/src/android/res/drawable/retroshare_48x48.png b/retroshare-service/src/android/res/drawable/retroshare_48x48.png
new file mode 120000
index 000000000..d22c7e812
--- /dev/null
+++ b/retroshare-service/src/android/res/drawable/retroshare_48x48.png
@@ -0,0 +1 @@
+../../../../../data/48x48/apps/retroshare.png
\ No newline at end of file
diff --git a/retroshare-service/src/android/res/values/libs.xml b/retroshare-service/src/android/res/values/libs.xml
new file mode 100644
index 000000000..4009a7785
--- /dev/null
+++ b/retroshare-service/src/android/res/values/libs.xml
@@ -0,0 +1,25 @@
+
+
+
+ - https://download.qt.io/ministro/android/qt5/qt-5.9
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/retroshare-service/src/retroshare-service.cc b/retroshare-service/src/retroshare-service.cc
new file mode 100644
index 000000000..5b4dd0e15
--- /dev/null
+++ b/retroshare-service/src/retroshare-service.cc
@@ -0,0 +1,73 @@
+/*
+ * RetroShare Service
+ * Copyright (C) 2016-2018 Gioacchino Mazzurco
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+#include
+#include
+#include
+#include
+
+#include "retroshare/rsinit.h"
+#include "retroshare/rsiface.h"
+
+#ifdef __ANDROID__
+# include "util/androiddebug.h"
+#endif
+
+#ifndef RS_JSONAPI
+# error Inconsistent build configuration retroshare_service needs rs_jsonapi
+#endif
+
+int main(int argc, char* argv[])
+{
+#ifdef __ANDROID__
+ AndroidStdIOCatcher dbg; (void) dbg;
+#endif
+
+ QCoreApplication app(argc, argv);
+
+ signal(SIGINT, QCoreApplication::exit);
+ signal(SIGTERM, QCoreApplication::exit);
+#ifdef SIGBREAK
+ signal(SIGBREAK, QCoreApplication::exit);
+#endif // ifdef SIGBREAK
+
+ RsInit::InitRsConfig();
+
+ // clumsy way to enable JSON API by default
+ if(!QCoreApplication::arguments().contains("--jsonApiPort"))
+ {
+ int argc2 = argc + 2;
+ char* argv2[argc2]; for (int i = 0; i < argc; ++i ) argv2[i] = argv[i];
+ char opt[] = "--jsonApiPort";
+ char val[] = "9092";
+ argv2[argc] = opt;
+ argv2[argc+1] = val;
+ RsInit::InitRetroShare(argc2, argv2, true);
+ }
+ else RsInit::InitRetroShare(argc, argv, true);
+
+ RsControl::earlyInitNotificationSystem();
+ rsControl->setShutdownCallback(QCoreApplication::exit);
+ QObject::connect(
+ &app, &QCoreApplication::aboutToQuit,
+ [](){
+ if(RsControl::instance()->isReady())
+ RsControl::instance()->rsGlobalShutDown(); } );
+
+ return app.exec();
+}
diff --git a/retroshare-service/src/retroshare-service.pro b/retroshare-service/src/retroshare-service.pro
new file mode 100644
index 000000000..e1911f179
--- /dev/null
+++ b/retroshare-service/src/retroshare-service.pro
@@ -0,0 +1,27 @@
+!include("../../retroshare.pri"): error("Could not include file ../../retroshare.pri")
+
+TARGET = retroshare-service
+
+QT += core
+QT -= gui
+
+!include("../../libretroshare/src/use_libretroshare.pri"):error("Including")
+
+SOURCES += retroshare-service.cc
+
+android-* {
+ ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android
+
+ DISTFILES += android/AndroidManifest.xml \
+ android/res/drawable/retroshare_128x128.png \
+ android/res/drawable/retroshare_retroshare_48x48.png
+}
+
+DISTFILES += \
+ android/AndroidManifest.xml \
+ android/gradle/wrapper/gradle-wrapper.jar \
+ android/gradlew \
+ android/res/values/libs.xml \
+ android/build.gradle \
+ android/gradle/wrapper/gradle-wrapper.properties \
+ android/gradlew.bat
diff --git a/retroshare.pri b/retroshare.pri
index 497281134..213d10832 100644
--- a/retroshare.pri
+++ b/retroshare.pri
@@ -64,6 +64,16 @@ retroshare_android_notify_service:CONFIG -= no_retroshare_android_notify_service
CONFIG *= no_retroshare_qml_app
retroshare_qml_app:CONFIG -= no_retroshare_qml_app
+# To enable RetroShare service append the following assignation to
+# qmake command line "CONFIG+=retroshare_service"
+CONFIG *= no_retroshare_service
+retroshare_service:CONFIG -= no_retroshare_service
+
+# To disable libresapi append the following assignation to qmake command line
+#"CONFIG+=no_libresapi"
+CONFIG *= libresapi
+no_libresapi:CONFIG -= libresapi
+
# To enable libresapi via local socket (unix domain socket or windows named
# pipes) append the following assignation to qmake command line
#"CONFIG+=libresapilocalserver"
@@ -144,6 +154,12 @@ CONFIG+=no_rs_deep_search
CONFIG *= rs_deep_search
no_rs_deep_search:CONFIG -= rs_deep_search
+# Specify host precompiled jsonapi-generator path, appending the following
+# assignation to qmake command line
+# 'JSONAPI_GENERATOR_EXE=/myBuildDir/jsonapi-generator'. Required for JSON API
+# cross-compiling
+#JSONAPI_GENERATOR_EXE=/myBuildDir/jsonapi-generator
+
# Specify RetroShare major version appending the following assignation to qmake
# command line 'RS_MAJOR_VERSION=0'
#RS_MAJOR_VERSION=0
@@ -299,6 +315,16 @@ defineReplace(linkDynamicLibs) {
## RS_THREAD_LIB String viariable containing the name of the multi threading
## library to use (pthread, "") it usually depend on platform.
+isEmpty(QMAKE_HOST_SPEC):QMAKE_HOST_SPEC=$$[QMAKE_SPEC]
+isEmpty(QMAKE_TARGET_SPEC):QMAKE_TARGET_SPEC=$$[QMAKE_XSPEC]
+equals(QMAKE_HOST_SPEC, $$QMAKE_TARGET_SPEC) {
+ CONFIG *= no_rs_cross_compiling
+ CONFIG -= rs_cross_compiling
+} else {
+ CONFIG *= rs_cross_compiling
+ CONFIG -= no_rs_cross_compiling
+}
+
defined(RS_MAJOR_VERSION,var):\
defined(RS_MINOR_VERSION,var):\
defined(RS_MINI_VERSION,var):\
@@ -408,6 +434,10 @@ rs_chatserver {
}
rs_jsonapi {
+ rs_cross_compiling:!exists($$JSONAPI_GENERATOR_EXE):error("Inconsistent \
+build configuration, cross-compiling JSON API requires JSONAPI_GENERATOR_EXE \
+to contain the path to an host executable jsonapi-generator")
+
DEFINES *= RS_JSONAPI
}