diff options
49 files changed, 146 insertions, 1405 deletions
diff --git a/Android/.classpath b/Android/.classpath deleted file mode 100644 index a4763d1ee..000000000 --- a/Android/.classpath +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<classpath> - <classpathentry kind="src" path="src"/> - <classpathentry kind="src" path="gen"/> - <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/> - <classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/> - <classpathentry kind="output" path="bin/classes"/> -</classpath> diff --git a/Android/.project b/Android/.project deleted file mode 100644 index ad960717b..000000000 --- a/Android/.project +++ /dev/null @@ -1,33 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<projectDescription> - <name>MCServer</name> - <comment></comment> - <projects> - </projects> - <buildSpec> - <buildCommand> - <name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name> - <arguments> - </arguments> - </buildCommand> - <buildCommand> - <name>com.android.ide.eclipse.adt.PreCompilerBuilder</name> - <arguments> - </arguments> - </buildCommand> - <buildCommand> - <name>org.eclipse.jdt.core.javabuilder</name> - <arguments> - </arguments> - </buildCommand> - <buildCommand> - <name>com.android.ide.eclipse.adt.ApkBuilder</name> - <arguments> - </arguments> - </buildCommand> - </buildSpec> - <natures> - <nature>com.android.ide.eclipse.adt.AndroidNature</nature> - <nature>org.eclipse.jdt.core.javanature</nature> - </natures> -</projectDescription> diff --git a/Android/.settings/org.eclipse.jdt.core.prefs b/Android/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index f77b31c2d..000000000 --- a/Android/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 -org.eclipse.jdt.core.compiler.compliance=1.5 -org.eclipse.jdt.core.compiler.source=1.5 diff --git a/Android/AndroidManifest.xml b/Android/AndroidManifest.xml deleted file mode 100644 index 0a2cc8380..000000000 --- a/Android/AndroidManifest.xml +++ /dev/null @@ -1,27 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="com.mcserver" - android:versionCode="3" - android:versionName="r1375" > - - <uses-permission android:name="android.permission.INTERNET" /> - <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> - <uses-permission android:name="android.permission.READ_LOGS"/> - - <uses-sdk android:minSdkVersion="10" /> - - <application - android:icon="@drawable/ic_launcher" - android:label="@string/app_name" > - <activity - android:name=".MCServerActivity" - android:label="@string/app_name" > - <intent-filter> - <action android:name="android.intent.action.MAIN" /> - - <category android:name="android.intent.category.LAUNCHER" /> - </intent-filter> - </activity> - </application> - -</manifest>
\ No newline at end of file diff --git a/Android/assets/basedir/Plugins/README.txt b/Android/assets/basedir/Plugins/README.txt deleted file mode 100644 index 1c8259eda..000000000 --- a/Android/assets/basedir/Plugins/README.txt +++ /dev/null @@ -1,2 +0,0 @@ -Put all pre-packaged plugins in here such as Core. -The user will be able to install each plugin in here separately.
\ No newline at end of file diff --git a/Android/assets/basedir/README.txt b/Android/assets/basedir/README.txt deleted file mode 100644 index 784d10fc7..000000000 --- a/Android/assets/basedir/README.txt +++ /dev/null @@ -1,10 +0,0 @@ -Put all pre-packaged settings/preferences and license files in here. -Such as: - -settings.example.ini -groups.example.ini -users.example.ini -webadmin.example.ini -Lua-LICENSE.txt -MersenneTwister-LICENSE.txt -etc.etc
\ No newline at end of file diff --git a/Android/assets/basedir/webadmin/README.txt b/Android/assets/basedir/webadmin/README.txt deleted file mode 100644 index 96090fd33..000000000 --- a/Android/assets/basedir/webadmin/README.txt +++ /dev/null @@ -1 +0,0 @@ -Put pre-packaged webadmin template in here
\ No newline at end of file diff --git a/Android/gen/com/mcserver/BuildConfig.java b/Android/gen/com/mcserver/BuildConfig.java deleted file mode 100644 index e40837927..000000000 --- a/Android/gen/com/mcserver/BuildConfig.java +++ /dev/null @@ -1,6 +0,0 @@ -/** Automatically generated file. DO NOT MODIFY */ -package com.mcserver; - -public final class BuildConfig { - public final static boolean DEBUG = true; -}
\ No newline at end of file diff --git a/Android/gen/com/mcserver/R.java b/Android/gen/com/mcserver/R.java deleted file mode 100644 index cbb9e653a..000000000 --- a/Android/gen/com/mcserver/R.java +++ /dev/null @@ -1,39 +0,0 @@ -/* AUTO-GENERATED FILE. DO NOT MODIFY. - * - * This class was automatically generated by the - * aapt tool from the resource data it found. It - * should not be modified by hand. - */ - -package com.mcserver; - -public final class R { - public static final class attr { - } - public static final class drawable { - public static final int ic_launcher=0x7f020000; - } - public static final class id { - public static final int configure_server=0x7f050003; - public static final int ip_address=0x7f050005; - public static final int listView1=0x7f050006; - public static final int server_status_text=0x7f050004; - public static final int start_server=0x7f050002; - public static final int stop_server=0x7f050001; - public static final int textView2=0x7f050000; - } - public static final class layout { - public static final int list_item=0x7f030000; - public static final int main=0x7f030001; - } - public static final class string { - public static final int app_name=0x7f040001; - public static final int configure=0x7f040007; - public static final int hello=0x7f040000; - public static final int mcserver_is_not_running=0x7f040005; - public static final int mcserver_is_running=0x7f040004; - public static final int start=0x7f040002; - public static final int stop=0x7f040003; - public static final int your_ip=0x7f040006; - } -} diff --git a/Android/jni/Android.mk b/Android/jni/Android.mk deleted file mode 100644 index ce142d446..000000000 --- a/Android/jni/Android.mk +++ /dev/null @@ -1,44 +0,0 @@ -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) -LOCAL_MODULE := mcserver - - - -LOCAL_SRC_FILES := $(shell find ../lib/polarssl ../lib/lua ../lib/jsoncpp ../lib/zlib ../src ../lib/tolua++ ../lib/iniFile ../lib/expat ../lib/md5 ../lib/sqlite ../lib/luaexpat '(' -name '*.cpp' -o -name '*.c' ')') -LOCAL_SRC_FILES := $(filter-out %SquirrelFunctions.cpp %SquirrelBindings.cpp %cPlugin_Squirrel.cpp %cSquirrelCommandBinder.cpp %minigzip.c %lua.c %tolua.c %toluabind.c %LeakFinder.cpp %StackWalker.cpp %example.c,$(LOCAL_SRC_FILES)) -LOCAL_SRC_FILES := $(patsubst %.cpp,../%.cpp,$(LOCAL_SRC_FILES)) -LOCAL_SRC_FILES := $(patsubst %.c,../%.c,$(LOCAL_SRC_FILES)) -LOCAL_SRC_FILES += app-android.cpp ToJava.cpp - -LOCAL_CFLAGS := -DANDROID_NDK \ - -O3 \ - -funroll-loops \ - -mfloat-abi=softfp -mfpu=neon \ - -fexceptions \ - - -LOCAL_STATIC_LIBRARIES := cpufeatures - -LOCAL_C_INCLUDES := ../src \ - ../src/packets \ - ../src/items \ - ../src/blocks \ - ../lib/tolua++/src/lib \ - ../lib/lua/src \ - ../lib/zlib-1.2.7 \ - ../lib/iniFile \ - ../lib/tolua++/include \ - ../lib/jsoncpp/include \ - ../lib/jsoncpp/src/lib_json \ - ../lib/expat/ \ - ../lib/md5/ \ - ../lib/sqlite/ \ - ../lib/luaexpat/ \ - .. \ - - -LOCAL_LDLIBS := -ldl -llog - -include $(BUILD_SHARED_LIBRARY) -$(call import-module,cpufeatures) diff --git a/Android/jni/Application.mk b/Android/jni/Application.mk deleted file mode 100644 index e00c8b5e2..000000000 --- a/Android/jni/Application.mk +++ /dev/null @@ -1,7 +0,0 @@ -# Build both ARMv5TE and ARMv7-A machine code. -APP_MODULES := mcserver -# APP_ABI := armeabi armeabi-v7a -#APP_STL := stlport_static - -APP_STL := gnustl_static -APP_CPPFLAGS := -frtti
\ No newline at end of file diff --git a/Android/jni/ToJava.cpp b/Android/jni/ToJava.cpp deleted file mode 100644 index 8db22dd1d..000000000 --- a/Android/jni/ToJava.cpp +++ /dev/null @@ -1,3 +0,0 @@ -#include "Globals.h" - -#include "ToJava.h"
\ No newline at end of file diff --git a/Android/jni/ToJava.h b/Android/jni/ToJava.h deleted file mode 100644 index 11979c847..000000000 --- a/Android/jni/ToJava.h +++ /dev/null @@ -1,59 +0,0 @@ -#pragma once - -#include <jni.h> -#include <android/log.h> -extern JNIEnv* g_CurrentJNIEnv; -extern JavaVM* g_JavaVM; -extern jobject g_JavaThread; -//extern jobject g_JavaActivity; - -//__android_log_vprint(ANDROID_LOG_ERROR,"MCServer", a_Format, argList); - -static void CallJavaFunction_Void_String( jobject a_Object, const std::string & a_FunctionName, const std::string & a_StringParam ) -{ - JNIEnv * oldEnv = g_CurrentJNIEnv; - int status = g_JavaVM->AttachCurrentThread(&g_CurrentJNIEnv, NULL); - __android_log_print(ANDROID_LOG_ERROR,"MCServer", "STATUS: %i old: %p new: %p", status, oldEnv, g_CurrentJNIEnv ); - jstring str = g_CurrentJNIEnv->NewStringUTF( a_StringParam.c_str() ); - - - //__android_log_print(ANDROID_LOG_ERROR,"MCServer", "JNIEnv: %i Object: %i", g_CurrentJNIEnv, a_Object ); - jclass cls = g_CurrentJNIEnv->GetObjectClass( a_Object ); - //__android_log_print(ANDROID_LOG_ERROR,"MCServer", "jclass: %i", cls ); - jmethodID mid = g_CurrentJNIEnv->GetMethodID( cls, a_FunctionName.c_str(), "(Ljava/lang/String;)V"); // void a_FunctionName( String ) - //__android_log_print(ANDROID_LOG_ERROR,"MCServer", "jmethodID: %i", mid ); - if (mid != 0) - { - - __android_log_print(ANDROID_LOG_ERROR,"MCServer", "Going to call right NOW! %s", a_FunctionName.c_str() ); - g_CurrentJNIEnv->CallVoidMethod( a_Object, mid, str ); - } - else - { - __android_log_print(ANDROID_LOG_ERROR,"MCServer", "It was 0, derp" ); - } - - if( oldEnv != g_CurrentJNIEnv ) - { - g_JavaVM->DetachCurrentThread(); - } -} - - -static void CallJavaFunction_Void_Void( jobject a_Object, const std::string & a_FunctionName ) -{ - //__android_log_print(ANDROID_LOG_ERROR,"MCServer", "JNIEnv: %i Object: %i", g_CurrentJNIEnv, a_Object ); - jclass cls = g_CurrentJNIEnv->GetObjectClass( a_Object ); - //__android_log_print(ANDROID_LOG_ERROR,"MCServer", "jclass: %i", cls ); - jmethodID mid = g_CurrentJNIEnv->GetMethodID( cls, a_FunctionName.c_str(), "()V"); // void a_FunctionName( String ) - //__android_log_print(ANDROID_LOG_ERROR,"MCServer", "jmethodID: %i", mid ); - if (mid != 0) - { - //__android_log_print(ANDROID_LOG_ERROR,"MCServer", "Going to call right NOW! %s", a_FunctionName.c_str() ); - g_CurrentJNIEnv->CallVoidMethod( a_Object, mid ); - } - else - { - __android_log_print(ANDROID_LOG_ERROR,"MCServer", "It was 0, derp" ); - } -}
\ No newline at end of file diff --git a/Android/jni/app-android.cpp b/Android/jni/app-android.cpp deleted file mode 100644 index 386f1b90e..000000000 --- a/Android/jni/app-android.cpp +++ /dev/null @@ -1,130 +0,0 @@ -#include "Globals.h" - -#include <jni.h> -#include <sys/time.h> -#include <time.h> -#include <stdint.h> - -#include <stdlib.h> -#include <math.h> -#include <float.h> -#include <assert.h> - -#include "OSSupport/CriticalSection.h" -#include "OSSupport/File.h" -#include "ToJava.h" - -#include "Root.h" -#include "WebAdmin.h" - -#include <android/log.h> - -#ifdef _WIN32 // For IntelliSense parsing -typedef void jobject; -typedef int jint; -typedef bool jboolean; -typedef void JavaVM; -typedef void JNIEnv; -#endif - -cCriticalSection g_CriticalSection; - -JNIEnv* g_CurrentJNIEnv = 0; -jobject g_JavaThread = 0; -JavaVM* g_JavaVM = 0; -//jobject g_JavaActivity = 0; - -cRoot * pRoot = NULL; - - -class cMainThread : - public cIsThread -{ -public: - cMainThread() : - cIsThread("cMainThread") - { - //Start(); - __android_log_print(ANDROID_LOG_ERROR,"MCServer", "%s", "cMainThread"); - } - - void Stop(void) - { - m_ShouldTerminate = true; - Wait(); - } - -protected: - - virtual void Execute(void) override - { - __android_log_print(ANDROID_LOG_ERROR,"MCServer", "%s", "Execute"); - pRoot = new cRoot(); - pRoot->Start(); - delete pRoot; - } - -} ; - -cMainThread * pMainThread = NULL; - -jint JNI_OnLoad(JavaVM* vm, void* reserved) -{ - //__android_log_print(ANDROID_LOG_ERROR,"MCServer", "%s", "JNI_OnLoad JNI_OnLoad JNI_OnLoad JNI_OnLoad"); - g_JavaVM = vm; - return JNI_VERSION_1_4; -} - -/* Called when program/activity is created */ -extern "C" void Java_com_mcserver_MCServerActivity_NativeOnCreate( JNIEnv* env, jobject thiz ) -{ - g_CriticalSection.Lock(); - g_CurrentJNIEnv = env; - g_JavaThread = thiz; - //__android_log_print(ANDROID_LOG_ERROR,"MCServer", "%s", "Logging from C++!"); - g_CriticalSection.Unlock(); - - cFile::CreateFolder("/sdcard/mcserver"); - - pRoot = new cRoot(); - pRoot->Start(); - delete pRoot; pRoot = NULL; -} - - - - - -extern "C" void Java_com_mcserver_MCServerActivity_NativeCleanUp( JNIEnv* env, jobject thiz ) -{ - g_CriticalSection.Lock(); - g_CurrentJNIEnv = env; - g_JavaThread = thiz; - g_CriticalSection.Unlock(); - - __android_log_print(ANDROID_LOG_ERROR,"MCServer", "pRoot: %p", pRoot); - if( pRoot != NULL ) - { - pRoot->QueueExecuteConsoleCommand("stop"); - } -} - - - - -extern "C" jboolean Java_com_mcserver_MCServerActivity_NativeIsServerRunning( JNIEnv* env, jobject thiz ) -{ - return pRoot != NULL; -} - - - - -extern "C" jint Java_com_mcserver_MCServerActivity_NativeGetWebAdminPort( JNIEnv* env, jobject thiz ) -{ - if( pRoot != NULL && pRoot->GetWebAdmin() != NULL ) - { - return atoi(pRoot->GetWebAdmin()->GetIPv4Ports().c_str()); - } - return 0; -} diff --git a/Android/proguard-project.txt b/Android/proguard-project.txt deleted file mode 100644 index f2fe1559a..000000000 --- a/Android/proguard-project.txt +++ /dev/null @@ -1,20 +0,0 @@ -# To enable ProGuard in your project, edit project.properties -# to define the proguard.config property as described in that file. -# -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in ${sdk.dir}/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the ProGuard -# include property in project.properties. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} diff --git a/Android/project.properties b/Android/project.properties deleted file mode 100644 index 7a6518b77..000000000 --- a/Android/project.properties +++ /dev/null @@ -1,14 +0,0 @@ -# This file is automatically generated by Android Tools. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must be checked in Version Control Systems. -# -# To customize properties used by the Ant build system edit -# "ant.properties", and override values to adapt the script to your -# project structure. -# -# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): -#proguard.config=${sdk.dir}\tools\proguard\proguard-android.txt:proguard-project.txt - -# Project target. -target=android-12 diff --git a/Android/res/drawable-hdpi/ic_launcher.png b/Android/res/drawable-hdpi/ic_launcher.png Binary files differdeleted file mode 100644 index d8a74a2d8..000000000 --- a/Android/res/drawable-hdpi/ic_launcher.png +++ /dev/null diff --git a/Android/res/drawable-ldpi/ic_launcher.png b/Android/res/drawable-ldpi/ic_launcher.png Binary files differdeleted file mode 100644 index 5fa7251f8..000000000 --- a/Android/res/drawable-ldpi/ic_launcher.png +++ /dev/null diff --git a/Android/res/drawable-mdpi/ic_launcher.png b/Android/res/drawable-mdpi/ic_launcher.png Binary files differdeleted file mode 100644 index 0e3af7c05..000000000 --- a/Android/res/drawable-mdpi/ic_launcher.png +++ /dev/null diff --git a/Android/res/drawable-xhdpi/ic_launcher.png b/Android/res/drawable-xhdpi/ic_launcher.png Binary files differdeleted file mode 100644 index 60b19df2d..000000000 --- a/Android/res/drawable-xhdpi/ic_launcher.png +++ /dev/null diff --git a/Android/res/layout/list_item.xml b/Android/res/layout/list_item.xml deleted file mode 100644 index e77da47db..000000000 --- a/Android/res/layout/list_item.xml +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<TextView xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent" > - - -</TextView>
\ No newline at end of file diff --git a/Android/res/layout/main.xml b/Android/res/layout/main.xml deleted file mode 100644 index 4ff238d80..000000000 --- a/Android/res/layout/main.xml +++ /dev/null @@ -1,61 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="fill_parent" - android:layout_height="fill_parent" - android:gravity="center_horizontal" - android:orientation="vertical" > - - <TextView - android:id="@+id/textView2" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="@string/app_name" - android:textAppearance="?android:attr/textAppearanceLarge" /> -
- <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" > -
- <Button - android:id="@+id/stop_server" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_weight="1" - android:enabled="true" - android:text="@string/stop" /> -
- <Button - android:id="@+id/start_server" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_weight="1" - android:text="@string/start" /> -
- <Button - android:id="@+id/configure_server" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_weight="1" - android:text="@string/configure" /> - - </LinearLayout> - - <TextView - android:id="@+id/server_status_text" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="@string/mcserver_is_not_running" - android:textAppearance="?android:attr/textAppearanceMedium" /> - - <TextView - android:id="@+id/ip_address" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="@string/your_ip" /> - <ListView - android:id="@+id/listView1" - android:layout_width="match_parent" - android:layout_height="wrap_content" > - </ListView> - -</LinearLayout>
\ No newline at end of file diff --git a/Android/res/values-pl/strings.xml b/Android/res/values-pl/strings.xml deleted file mode 100644 index 74c8044d8..000000000 --- a/Android/res/values-pl/strings.xml +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - - <string name="hello">Hello World, MCServerActivity!</string> - <string name="app_name">MCServer</string> - <string name="start">Start</string> - <string name="stop">Stop</string> - <string name="mcserver_is_running">MCServer jest włączony</string> - <string name="mcserver_is_not_running">MCServer jest wyłączony</string> - <string name="your_ip">Twoje IP …</string> - <string name="configure">Ustawienia</string> - -</resources> diff --git a/Android/res/values/strings.xml b/Android/res/values/strings.xml deleted file mode 100644 index 9eb81d653..000000000 --- a/Android/res/values/strings.xml +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - - <string name="hello">Hello World, MCServerActivity!</string> - <string name="app_name">MCServer</string> - <string name="start">Start</string> - <string name="stop">Stop</string> - <string name="mcserver_is_running">MCServer is running</string> - <string name="mcserver_is_not_running">MCServer is not running</string> - <string name="your_ip">Your IP …</string> - <string name="configure">Configure</string> - -</resources>
\ No newline at end of file diff --git a/Android/src/com/mcserver/MCServerActivity.java b/Android/src/com/mcserver/MCServerActivity.java deleted file mode 100644 index 8a9846ca1..000000000 --- a/Android/src/com/mcserver/MCServerActivity.java +++ /dev/null @@ -1,302 +0,0 @@ -package com.mcserver; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.InetAddress; -import java.net.NetworkInterface; -import java.net.SocketException; -import java.util.ArrayList; -import java.util.Enumeration; - -import android.app.Activity; -import android.content.Intent; -import android.graphics.Color; -import android.net.Uri; -import android.os.Bundle; -import android.util.Log; -import android.view.KeyEvent; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.widget.ArrayAdapter; -import android.widget.Button; -import android.widget.ListView; -import android.widget.TextView; - -public class MCServerActivity extends Activity { - MainThread mThread = null; - Thread ServerStatusThread = null; - boolean mbExiting = false; - boolean mbEnabledLogging = false; - - ArrayList<String> mLogList = new ArrayList<String>(); - ArrayAdapter<String> mAdapter; - - MCServerInstaller mInstaller = null; - - final private int MENU_REINSTALL = 0; - - /** Called when the activity is first created. */ - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.main); - - //Log.e("MCServer", "p id: " + android.os.Process.myPid() ); - - - ((Button)findViewById(R.id.start_server)).setOnClickListener( new View.OnClickListener() { - public void onClick(View v) { - mbEnabledLogging = true; - if( mThread == null || mThread.isAlive() == false ) { - mThread = new MainThread( (MCServerActivity)v.getContext() ); - mThread.start(); - } - } - }); - - ((Button)findViewById(R.id.stop_server)).setOnClickListener( new View.OnClickListener() { - public void onClick(View v) { - mbEnabledLogging = true; - NativeCleanUp(); - } - }); - - ((Button)findViewById(R.id.configure_server)).setOnClickListener( new View.OnClickListener() { - public void onClick(View v) { - Intent myIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://localhost:" + NativeGetWebAdminPort() + "/webadmin/")); - startActivity( myIntent ); - } - }); - - - - ListView lv = (ListView)this.findViewById(R.id.listView1); - mAdapter = new ArrayAdapter<String>(this, - R.layout.list_item, - mLogList); - lv.setAdapter(mAdapter); - - - mLogList.add("---- LOG ----"); - - ServerStatusThread = new Thread( new Runnable() { - public void run() { - for(;;) - { - try { - runOnUiThread( new Runnable() { - public void run() { - UpdateServerStatus(); - } - }); - Thread.sleep(1000); - } catch (InterruptedException e) { - } - } - } - }); - ServerStatusThread.start(); - - - - - - - - Thread loggerThread = new Thread( new Runnable() { - public void run() { - Process process = null; - - try { - process = Runtime.getRuntime().exec("logcat -v raw *:s MCServer ");// Verbose filter - } catch (IOException e) { - } - - BufferedReader reader = null; - - try { - InputStreamReader isr = new InputStreamReader(process.getInputStream()); - reader = new BufferedReader( isr ); - - String line; - - while( mbExiting == false ) { - line = reader.readLine(); - if( mbEnabledLogging == true && line != null ) - { - AddToLog( line ); - } - } - - Log.i("MCServer", "Prepping thread for termination"); - reader.close(); - process.destroy(); - process = null; - reader = null; - } catch (IOException e) { - } - } - }); - loggerThread.start(); - - ((TextView)findViewById(R.id.ip_address)).setText("Connect to: " + getLocalIpAddress()); - - - mInstaller = new MCServerInstaller(this); - if( mInstaller.NeedsUpdate() ) - { - mInstaller.ShowFirstRunDialog(); - } - } - - - - public String getLocalIpAddress() { - try { - for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { - NetworkInterface intf = en.nextElement(); - for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) { - InetAddress inetAddress = enumIpAddr.nextElement(); - if (!inetAddress.isLoopbackAddress()) { - return inetAddress.getHostAddress().toString(); - } - } - } - } catch (SocketException ex) { - Log.e("MCServer", ex.toString()); - } - return null; - } - - - - public void UpdateServerStatus() - { - if( NativeIsServerRunning() ) { - ((TextView)findViewById(R.id.server_status_text)).setText(R.string.mcserver_is_running); - ((TextView)findViewById(R.id.server_status_text)).setTextColor(Color.GREEN); - ((Button)findViewById(R.id.stop_server)).setEnabled(true); - ((Button)findViewById(R.id.start_server)).setEnabled(false); - ((Button)findViewById(R.id.configure_server)).setEnabled(true); - } else { - ((TextView)findViewById(R.id.server_status_text)).setText(R.string.mcserver_is_not_running); - ((TextView)findViewById(R.id.server_status_text)).setTextColor(Color.RED); - ((Button)findViewById(R.id.stop_server)).setEnabled(false); - ((Button)findViewById(R.id.start_server)).setEnabled(true); - ((Button)findViewById(R.id.configure_server)).setEnabled(false); - } - } - - - - - - public boolean onKeyDown(int keyCode, KeyEvent event) { - if(keyCode==KeyEvent.KEYCODE_BACK) - { - //android.os.Process.killProcess(android.os.Process.myPid()); - NativeCleanUp(); - return super.onKeyDown(keyCode, event); - } - return false; - } - - - - - public void onDestroy() { - mbExiting = true; - super.onDestroy(); - } - - - - - - public void AddToLog( final String logMessage ) { - final ListView lv = ((ListView)findViewById(R.id.listView1)); - lv.post(new Runnable() { - public void run() { - //final boolean bAutoscroll = lv.getLastVisiblePosition() >= mAdapter.getCount() - 1 ? true : false; - - mLogList.add(logMessage); - while( mLogList.size() > 100 ) // only allow 100 messages in the list, otherwise it might slow the GUI down - { - mLogList.remove(0); - } - mAdapter.notifyDataSetChanged(); - - - // Autoscroll detection is dodgy - //if( bAutoscroll ) - { - lv.setSelection(mAdapter.getCount() - 1); - } - } - }); - } - - - - - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - menu.add(0, MENU_REINSTALL, 0, "Reinstall MCServer" ); - return super.onCreateOptionsMenu(menu); - } - - - - - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - - switch( item.getItemId() ) - { - case MENU_REINSTALL: - mInstaller.ShowPluginInstallDialog(true); - return true; - } - return false; - } - - - - - - static { - System.loadLibrary("mcserver"); - } - - - public native void NativeOnCreate(); - public native void NativeCleanUp(); - public native boolean NativeIsServerRunning(); - public native int NativeGetWebAdminPort(); - -} - - -class MainThread extends Thread { - MCServerActivity mContext = null; - int numlogs = 0; - - MainThread( MCServerActivity aContext ) { - mContext = aContext; - } - - public void run() { - mContext.NativeOnCreate(); - } - -} - - - - - - diff --git a/Android/src/com/mcserver/MCServerInstaller.java b/Android/src/com/mcserver/MCServerInstaller.java deleted file mode 100644 index 5a865a602..000000000 --- a/Android/src/com/mcserver/MCServerInstaller.java +++ /dev/null @@ -1,432 +0,0 @@ -package com.mcserver; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.ArrayList; - -import android.app.AlertDialog; -import android.app.ProgressDialog; -import android.content.DialogInterface; -import android.content.SharedPreferences; -import android.content.pm.PackageManager.NameNotFoundException; -import android.content.res.AssetManager; -import android.os.AsyncTask; -import android.os.Environment; -import android.util.Log; - -public class MCServerInstaller { - private MCServerActivity mContext; - final private String BaseDirectory = "basedir"; - final private String PluginDirectory = "Plugins"; - - final public String SHARED_PREFS_NAME = "MCSERVER_PREFS"; - final public String PREF_IS_INSTALLED = "IS_INSTALLED"; - final public String PREF_LAST_VERSION = "LAST_VERSION"; - private SharedPreferences mSettings = null; - - int thisVersion; - - MCServerInstaller( MCServerActivity activity ) - { - mContext = activity; - - mSettings = mContext.getSharedPreferences( SHARED_PREFS_NAME, 0); - - try { - this.thisVersion = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0).versionCode; - } catch (NameNotFoundException e) { - Log.e("MCServer", "Could not read version code from manifest!"); - e.printStackTrace(); - this.thisVersion = -1; - } - } - - - public boolean IsInstalled() - { - return mSettings.getBoolean(PREF_IS_INSTALLED, false); - } - - - public boolean NeedsUpdate() - { - Log.i("MCServer", "thisVersion: " + this.thisVersion + " pref: " + mSettings.getInt(PREF_LAST_VERSION, 0)); - return mSettings.getInt(PREF_LAST_VERSION, 0) != this.thisVersion; - } - - - public ArrayList<String> FindFoldersInPath(String path) - { - ArrayList<String> allFolders = new ArrayList<String>(); - AssetManager am = mContext.getAssets(); - try { - String[] allPlugins = am.list(path); - for(String pluginName : allPlugins) - { - InputStream istr = null; - try - { - istr = am.open(path + "/" + pluginName); - } catch( java.io.FileNotFoundException e ) { - // It seems to be a folder :D - allFolders.add(pluginName); - continue; - } - istr.close(); - } - } catch (IOException e) { - e.printStackTrace(); - } - - return allFolders; - } - - - - - public void ExpandAssets( String path ) - { - AssetManager am = mContext.getAssets(); - try { - String[] getAssets = am.list(path); - for(String assetName : getAssets) - { - //Log.e("MCServer", path + "/" + imgName); - - InputStream istr = null; - try - { - istr = am.open(path + "/" + assetName); - } catch( java.io.FileNotFoundException e ) { - //Log.e("MCServer", "Could not open" + path + "/" + imgName ); - ExpandAssets(path + "/" + assetName); - continue; - } - - String outPath = Environment.getExternalStorageDirectory().getPath() + "/mcserver/" + path + "/" + assetName; - //Log.e("MCServer", "outPath: " + outPath ); - File f = new File( outPath ); - - f.getParentFile().mkdirs(); - f.createNewFile(); - OutputStream ostr = new FileOutputStream(f); - - byte[] buffer = new byte[1024]; - int length; - while ((length = istr.read(buffer))>0) - { - ostr.write(buffer, 0, length); - } - ostr.flush(); - ostr.close(); - istr.close(); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - - - void ShowFirstRunDialog() - { - AlertDialog.Builder builder = new AlertDialog.Builder(mContext); - //builder.setTitle("blaa"); - builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - } - }); - builder.setMessage("It seems this is the first time you are running MCServer on your Android device or it has been updated! This app comes with a couple of pre-packaged plugins, please take a moment to select the plugins you would like to install."); - builder.setCancelable(false); - AlertDialog dialog = builder.create(); - dialog.show(); - - dialog.setOnDismissListener( new DialogInterface.OnDismissListener(){ - public void onDismiss(DialogInterface dialog) { - ShowPluginInstallDialog(false); - } - }); - } - - - public void ShowPluginInstallDialog(boolean bCancelable) - { - final ArrayList<String> allPlugins = FindFoldersInPath( BaseDirectory + "/" + PluginDirectory ); - final CharSequence[] items = allPlugins.toArray(new CharSequence[allPlugins.size()]); - final boolean[] selected = new boolean[items.length]; - for( int i = 0; i < items.length; ++i ) - { - if( items[i].toString().contains("Core") ) - { // Select the core plugin by default - selected[i] = true; - items[i] = items[i] + " (Recommended)"; - } - } - - AlertDialog.Builder builder = new AlertDialog.Builder(mContext); - builder.setTitle("Plugins to install"); - builder.setCancelable(bCancelable); - builder.setMultiChoiceItems(items, selected, new DialogInterface.OnMultiChoiceClickListener() { - public void onClick(DialogInterface dialog, int which, boolean isChecked) { - selected[which] = isChecked; - } - }); - builder.setPositiveButton("Install", new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - ArrayList<String> toInstall = new ArrayList<String>(); - for( int i = 0; i < selected.length; ++i ) - { - if( selected[i] ) - { - toInstall.add(allPlugins.get(i)); - } - } - InstallPlugins(toInstall); - } - }); - - AlertDialog dialog2 = builder.create(); - dialog2.show(); - } - - - void InstallPlugins( final ArrayList<String> plugins ) - { - new AsyncTask<Void, Integer, Boolean>() - { - ProgressDialog progressDialog; - - @Override - protected void onPreExecute() - { - /* - * This is executed on UI thread before doInBackground(). It is - * the perfect place to show the progress dialog. - */ - progressDialog = ProgressDialog.show(mContext, "", "Installing..."); - - } - - @Override - protected Boolean doInBackground(Void... params) - { - if (params == null) - { - return false; - } - try - { - /* - * This is run on a background thread, so we can sleep here - * or do whatever we want without blocking UI thread. A more - * advanced use would download chunks of fixed size and call - * publishProgress(); - */ - for( int i = 0; i < plugins.size(); ++i ) - { - this.publishProgress((int)(i / (float)plugins.size() * 100), i); - InstallSinglePlugin(PluginDirectory + "/" + plugins.get(i)); - } - - this.publishProgress( 100, -1 ); - InstallExampleSettings(); - - this.publishProgress( 100, -2 ); - InstallWebAdmin(); - - } - catch (Exception e) - { - Log.e("tag", e.getMessage()); - /* - * The task failed - */ - return false; - } - - /* - * The task succeeded - */ - return true; - } - - protected void onProgressUpdate(Integer... progress) - { - progressDialog.setProgress(progress[0]); - if( progress[1] > -1 ) - { - progressDialog.setMessage("Installing " + plugins.get(progress[1]) + "..." ); - } - else if( progress[1] == -1 ) - { - progressDialog.setMessage("Installing default settings..."); - } - else if( progress[1] == -2 ) - { - progressDialog.setMessage("Installing WebAdmin..."); - } - } - - @Override - protected void onPostExecute(Boolean result) - { - progressDialog.dismiss(); - /* - * Update here your view objects with content from download. It - * is save to dismiss dialogs, update views, etc., since we are - * working on UI thread. - */ - AlertDialog.Builder b = new AlertDialog.Builder(mContext); - b.setTitle(android.R.string.dialog_alert_title); - if (result) - { - b.setMessage("Install succeeded"); - - SharedPreferences.Editor editor = mSettings.edit(); - editor.putBoolean(PREF_IS_INSTALLED, true); - editor.putInt(PREF_LAST_VERSION, thisVersion); - editor.commit(); - } - else - { - b.setMessage("Install failed"); - } - b.setPositiveButton(android.R.string.ok, - new DialogInterface.OnClickListener() - { - public void onClick(DialogInterface dialog, int which) - { - dialog.dismiss(); - } - }); - b.create().show(); - } - }.execute(); - } - - - void InstallExampleSettings() - { - AssetManager am = mContext.getAssets(); - try { - String[] allFiles = am.list(BaseDirectory); - for(String fileName : allFiles) - { - InputStream istr = null; - try - { - istr = am.open(BaseDirectory + "/" + fileName); - } catch( java.io.FileNotFoundException e ) { - // Must be a folder :D - continue; - } - - String outPath = Environment.getExternalStorageDirectory().getPath() + "/mcserver/" + fileName; - Log.i("MCServer", "outPath: " + outPath ); - File f = new File( outPath ); - - f.getParentFile().mkdirs(); - f.createNewFile(); - OutputStream ostr = new FileOutputStream(f); - - byte[] buffer = new byte[1024]; - int length; - while ((length = istr.read(buffer))>0) - { - ostr.write(buffer, 0, length); - } - ostr.flush(); - ostr.close(); - istr.close(); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - - - void InstallWebAdmin() - { - AssetManager am = mContext.getAssets(); - try { - String[] allFiles = am.list(BaseDirectory + "/webadmin"); - for(String fileName : allFiles) - { - InputStream istr = null; - try - { - istr = am.open(BaseDirectory + "/webadmin/" + fileName); - } catch( java.io.FileNotFoundException e ) { - // Must be a folder :D - continue; - } - - String outPath = Environment.getExternalStorageDirectory().getPath() + "/mcserver/webadmin/" + fileName; - Log.i("MCServer", "outPath: " + outPath ); - File f = new File( outPath ); - - f.getParentFile().mkdirs(); - f.createNewFile(); - OutputStream ostr = new FileOutputStream(f); - - byte[] buffer = new byte[1024]; - int length; - while ((length = istr.read(buffer))>0) - { - ostr.write(buffer, 0, length); - } - ostr.flush(); - ostr.close(); - istr.close(); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - - - void InstallSinglePlugin( String path ) - { - AssetManager am = mContext.getAssets(); - try { - String[] getImages = am.list(BaseDirectory + "/" + path); - for(String imgName : getImages) - { - Log.i("MCServer", path + "/" + imgName); - - InputStream istr = null; - try - { - istr = am.open(BaseDirectory + "/" + path + "/" + imgName); - } catch( java.io.FileNotFoundException e ) { - Log.i("MCServer", "Could not open" + path + "/" + imgName ); - InstallSinglePlugin(path + "/" + imgName); - continue; - } - - String outPath = Environment.getExternalStorageDirectory().getPath() + "/mcserver/" + path + "/" + imgName; - Log.i("MCServer", "outPath: " + outPath ); - File f = new File( outPath ); - - f.getParentFile().mkdirs(); - f.createNewFile(); - OutputStream ostr = new FileOutputStream(f); - - byte[] buffer = new byte[1024]; - int length; - while ((length = istr.read(buffer))>0) - { - ostr.write(buffer, 0, length); - } - ostr.flush(); - ostr.close(); - istr.close(); - } - } catch (IOException e) { - e.printStackTrace(); - } - } -} diff --git a/CMakeLists.txt b/CMakeLists.txt index 0b1ac6096..169f06e71 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -98,11 +98,11 @@ endif() if(MSVC OR MSVC_IDE) if( MSVC_VERSION LESS 1700 ) # VC10- / VS2010- message(FATAL_ERROR "The project requires C++11 features. " - "You need at least Visual Studio 11 (Microsoft Visual Studio 2012), " - "with Microsoft Visual C++ Compiler Nov 2012 CTP (v120_CTP_Nov2012).") + "You need at least Visual Studio 11 (Microsoft Visual Studio 2012), " + "with Microsoft Visual C++ Compiler Nov 2012 CTP (v120_CTP_Nov2012).") elseif( MSVC_VERSION EQUAL 1700 ) # VC11 / VS2012 message( "VC11: using Microsoft Visual Studio 2012 " - "with Microsoft Visual C++ Compiler Nov 2012 CTP (v120_CTP_Nov2012)" ) + "with Microsoft Visual C++ Compiler Nov 2012 CTP (v120_CTP_Nov2012)" ) set(CMAKE_GENERATOR_TOOLSET "v120_CTP_Nov2012" CACHE STRING "Platform Toolset" FORCE) else() # VC12+, assuming C++11 supported. endif() @@ -111,14 +111,14 @@ endif() set(BUILD_TOOLS OFF CACHE BOOL "") set(SELF_TEST OFF CACHE BOOL "") -# Check whether Lua 5.1 can be used: +# Check whether Lua can be used: if (NOT(DISABLE_SYSTEM_LUA)) include(CheckLua.cmake) - if(HAS_LUA_INTERPRETER AND ("${LUA_INTERPRETER_VERSION}" STREQUAL "5.1")) - message(STATUS "Lua 5.1 has been found in your system and will be used for the build.") + if(HAS_LUA_INTERPRETER) + message(STATUS "Lua has been found in your system and will be used for the build.") set(USE_SYSTEM_LUA 1) else() - message(STATUS "Lua 5.1 has NOT been found in your system, the build will use its own Lua implementation.") + message(STATUS "Lua has NOT been found in your system, the build will use its own Lua implementation.") unset(USE_SYSTEM_LUA) endif() else() @@ -140,7 +140,6 @@ if(${BUILD_UNSTABLE_TOOLS}) add_subdirectory(Tools/GeneratorPerformanceTest/) endif() -include(CheckCXXCompilerFlag) include(SetFlags.cmake) set_flags() set_lib_flags() @@ -151,7 +150,6 @@ if (WIN32) add_definitions(-DLUA_BUILD_AS_DLL) endif() - # The Expat library is linked in statically, make the source files aware of that: add_definitions(-DXML_STATIC) @@ -166,7 +164,7 @@ endif() # Build all dependent libraries as static: SET(CMAKE_BUILD_STATIC_LIBRARIES ON) - +#### @@ -196,40 +194,40 @@ set(JSONCPP_WITH_PKGCONFIG_SUPPORT OFF CACHE BOOL "Generate and install .pc file link_directories(lib/jsoncpp/src/lib_json) # Check that the libraries are present: -if (NOT EXISTS ${CMAKE_SOURCE_DIR}/lib/SQLiteCpp/CMakeLists.txt) +if (NOT EXISTS ${PROJECT_SOURCE_DIR}/lib/SQLiteCpp/CMakeLists.txt) message(FATAL_ERROR "SQLiteCpp is missing in folder lib/SQLiteCpp. Have you initialized the submodules / downloaded the extra libraries?") endif() -if (NOT EXISTS ${CMAKE_SOURCE_DIR}/lib/polarssl/CMakeLists.txt) +if (NOT EXISTS ${PROJECT_SOURCE_DIR}/lib/polarssl/CMakeLists.txt) message(FATAL_ERROR "PolarSSL is missing in folder lib/polarssl. Have you initialized the submodules / downloaded the extra libraries?") endif() -if (NOT EXISTS ${CMAKE_SOURCE_DIR}/lib/libevent/CMakeLists.txt) +if (NOT EXISTS ${PROJECT_SOURCE_DIR}/lib/libevent/CMakeLists.txt) message(FATAL_ERROR "LibEvent is missing in folder lib/libevent. Have you initialized and updated the submodules / downloaded the extra libraries?") endif() -if (NOT EXISTS ${CMAKE_SOURCE_DIR}/lib/jsoncpp/CMakeLists.txt) +if (NOT EXISTS ${PROJECT_SOURCE_DIR}/lib/jsoncpp/CMakeLists.txt) message(FATAL_ERROR "JsonCPP is missing in folder lib/jsoncpp. Have you initialized and updated the submodules / downloaded the extra libraries?") endif() -if (NOT EXISTS ${CMAKE_SOURCE_DIR}/lib/cmake-coverage/CodeCoverage.cmake) +if (NOT EXISTS ${PROJECT_SOURCE_DIR}/lib/cmake-coverage/CodeCoverage.cmake) message(FATAL_ERROR "cmake-coverage is missing in folder lib/cmake-coverage. Have you initialized and updated the submodules / downloaded the extra libraries?") endif() -if (NOT EXISTS ${CMAKE_SOURCE_DIR}/lib/expat/CMakeLists.txt) +if (NOT EXISTS ${PROJECT_SOURCE_DIR}/lib/expat/CMakeLists.txt) message(FATAL_ERROR "expat is missing in folder lib/expat. Have you initialized and updated the submodules / downloaded the extra libraries?") endif() -if (NOT EXISTS ${CMAKE_SOURCE_DIR}/lib/lua/CMakeLists.txt) +if (NOT EXISTS ${PROJECT_SOURCE_DIR}/lib/lua/CMakeLists.txt) message(FATAL_ERROR "lua is missing in folder lib/lua. Have you initialized and updated the submodules / downloaded the extra libraries?") endif() -if (NOT EXISTS ${CMAKE_SOURCE_DIR}/lib/luaexpat/CMakeLists.txt) +if (NOT EXISTS ${PROJECT_SOURCE_DIR}/lib/luaexpat/CMakeLists.txt) message(FATAL_ERROR "luaexpat is missing in folder lib/luaexpat. Have you initialized and updated the submodules / downloaded the extra libraries?") endif() -if (NOT EXISTS ${CMAKE_SOURCE_DIR}/lib/luaproxy/CMakeLists.txt) +if (NOT EXISTS ${PROJECT_SOURCE_DIR}/lib/luaproxy/CMakeLists.txt) message(FATAL_ERROR "luaproxy is missing in folder lib/luaproxy. Have you initialized and updated the submodules / downloaded the extra libraries?") endif() -if (NOT EXISTS ${CMAKE_SOURCE_DIR}/lib/sqlite/CMakeLists.txt) +if (NOT EXISTS ${PROJECT_SOURCE_DIR}/lib/sqlite/CMakeLists.txt) message(FATAL_ERROR "sqlite is missing in folder lib/sqlite. Have you initialized and updated the submodules / downloaded the extra libraries?") endif() -if (NOT EXISTS ${CMAKE_SOURCE_DIR}/lib/tolua++/CMakeLists.txt) +if (NOT EXISTS ${PROJECT_SOURCE_DIR}/lib/tolua++/CMakeLists.txt) message(FATAL_ERROR "tolua++ is missing in folder lib/tolua++. Have you initialized and updated the submodules / downloaded the extra libraries?") endif() -if (NOT EXISTS ${CMAKE_SOURCE_DIR}/lib/zlib/CMakeLists.txt) +if (NOT EXISTS ${PROJECT_SOURCE_DIR}/lib/zlib/CMakeLists.txt) message(FATAL_ERROR "zlib is missing in folder lib/zlib. Have you initialized and updated the submodules / downloaded the extra libraries?") endif() @@ -263,19 +261,18 @@ if (WIN32) add_subdirectory(lib/luaproxy/) endif() - # We use EXCLUDE_FROM_ALL so that only the explicit dependencies are used # (PolarSSL also has test and example programs in their CMakeLists.txt, we don't want those) include(lib/polarssl.cmake EXCLUDE_FROM_ALL) set_exe_flags() -add_subdirectory (src) +add_subdirectory(src) if(${SELF_TEST}) message("Tests enabled") enable_testing() - add_subdirectory (tests) + add_subdirectory(tests) endif() # Put projects into solution folders in MSVC: diff --git a/SetFlags.cmake b/SetFlags.cmake index 357cb9e7c..7ccba4f72 100644 --- a/SetFlags.cmake +++ b/SetFlags.cmake @@ -86,7 +86,13 @@ macro(set_flags) else() add_flags_cxx("-pthread") endif() - + elseif (ANDROID) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14") + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -std=c++14") + set(CMAKE_CXX_FLAGS_COVERAGE "${CMAKE_CXX_FLAGS_COVERAGE} -std=c++14") + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -std=c++14") + + add_flags_cxx("-fsigned-char") else() # Let gcc / clang know that we're compiling a multi-threaded app: if (${UNIX}) @@ -300,6 +306,7 @@ macro(set_exe_flags) endif() endif() add_flags_cxx("-Wno-error=unused-command-line-argument") + add_flags_cxx("-Wno-documentation-unknown-command") endif() endif() diff --git a/android/.gitignore b/android/.gitignore new file mode 100644 index 000000000..a9446f022 --- /dev/null +++ b/android/.gitignore @@ -0,0 +1,5 @@ +/Cuberite/ +/CMakeFiles/ +/lua_native-prefix/ +/tolua_native-prefix/ +CMakeCache.txt
\ No newline at end of file diff --git a/android/CMakeLists.txt b/android/CMakeLists.txt new file mode 100644 index 000000000..849b24d04 --- /dev/null +++ b/android/CMakeLists.txt @@ -0,0 +1,32 @@ +# Build command: +# cmake . -DCMAKE_SYSTEM_NAME=Android -DCMAKE_SYSTEM_VERSION=16 -DCMAKE_BUILD_TYPE=Release -DCMAKE_ANDROID_ARCH_ABI=armeabi -DNATIVE_TOLUA_GENERATOR="" -DCMAKE_ANDROID_NDK="" +# -G "MinGW Makefiles" -DCMAKE_MAKE_PROGRAM="" may also be required on Windows + +cmake_minimum_required (VERSION 3.7) +project(Cuberite) + +# Set up Android parameters +add_definitions(-DANDROID) +set(ANDROID TRUE) +set(CMAKE_POSITION_INDEPENDENT_CODE TRUE) +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fPIE -pie") + +# We're crosscompiling for Android +set(NO_NATIVE_OPTIMIZATION TRUE) + +# SYSTEM flag to silence warnings for external headers +include_directories(SYSTEM + ../lib/ + ../src/ + ../lib/jsoncpp/include/ + ../lib/polarssl/include/ + ../lib/sqlitecpp/include/ + ../lib/sqlitecpp/sqlite3/ + ../lib/libevent/include/ +) + +# Disable some compiler warnings (the lazy way out) +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-double-promotion") + +# Build the rest of the server +add_subdirectory(../ Cuberite) diff --git a/lib/libevent b/lib/libevent -Subproject 3e2c10a7b3b795ce594b3cb2d0e232632e642c7 +Subproject 1a9d45c3391b4592d53a3e274d515f86e409c0c diff --git a/lib/lua b/lib/lua -Subproject 966e06975699f51022474b39629dbad9c0fcf0b +Subproject 7dfee332d4766424eff2780d569c89ce69ddc60 diff --git a/lib/tolua++ b/lib/tolua++ -Subproject 5d69f56b06fdfe1e67cd2572083abb863ec3b70 +Subproject c4cb9a5c6079ffa2e03b8e7533dc7175a19f25a diff --git a/src/Bindings/CMakeLists.txt b/src/Bindings/CMakeLists.txt index 640fd60fa..c4fae1148 100644 --- a/src/Bindings/CMakeLists.txt +++ b/src/Bindings/CMakeLists.txt @@ -159,7 +159,7 @@ set_source_files_properties(${BINDING_OUTPUTS} PROPERTIES GENERATED TRUE) set_source_files_properties(${CMAKE_SOURCE_DIR}/src/Bindings/Bindings.cpp PROPERTIES COMPILE_FLAGS -Wno-error) if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") - set_source_files_properties(${CMAKE_SOURCE_DIR}/src/Bindings/Bindings.cpp PROPERTIES COMPILE_FLAGS ${COMPILE_FLAGS} "-Wno-old-style-cast -Wno-missing-prototypes") + set_source_files_properties(Bindings.cpp PROPERTIES COMPILE_FLAGS ${COMPILE_FLAGS} "-Wno-old-style-cast -Wno-missing-prototypes") set_source_files_properties(LuaWindow.cpp PROPERTIES COMPILE_FLAGS "-Wno-error=switch-enum") endif() diff --git a/src/ByteBuffer.cpp b/src/ByteBuffer.cpp index 6cfb66f9a..1a4dc8bb8 100644 --- a/src/ByteBuffer.cpp +++ b/src/ByteBuffer.cpp @@ -22,27 +22,6 @@ Unfortunately it is very slow, so it is disabled even for regular DEBUG builds. -// Try to determine endianness: -#if ( \ - defined(__i386__) || defined(__alpha__) || \ - defined(__ia64) || defined(__ia64__) || \ - defined(_M_IX86) || defined(_M_IA64) || \ - defined(_M_ALPHA) || defined(__amd64) || \ - defined(__amd64__) || defined(_M_AMD64) || \ - defined(__x86_64) || defined(__x86_64__) || \ - defined(_M_X64) || defined(__bfin__) || \ - defined(__ARMEL__) || defined(__AARCH64EL__) || \ - (defined(_WIN32) && defined(__ARM__) && defined(_MSC_VER)) \ -) - #define IS_LITTLE_ENDIAN -#elif ( \ - defined (__ARMEB__) || defined(__sparc) || defined(__powerpc__) || defined(__POWERPC__) \ -) - #define IS_BIG_ENDIAN -#else - #error Cannot determine endianness of this platform -#endif - // If a string sent over the protocol is larger than this, a warning is emitted to the console #define MAX_STRING_SIZE (512 KiB) @@ -754,22 +733,6 @@ bool cByteBuffer::WriteVarUTF8String(const AString & a_Value) -bool cByteBuffer::WriteLEInt32(Int32 a_Value) -{ - CHECK_THREAD - CheckValid(); - #ifdef IS_LITTLE_ENDIAN - return WriteBuf(reinterpret_cast<const char *>(&a_Value), 4); - #else - int Value = ((a_Value >> 24) & 0xff) | ((a_Value >> 16) & 0xff00) | ((a_Value >> 8) & 0xff0000) | (a_Value & 0xff000000); - return WriteBuf(reinterpret_cast<const char *>(&Value), 4); - #endif -} - - - - - bool cByteBuffer::WritePosition64(Int32 a_BlockX, Int32 a_BlockY, Int32 a_BlockZ) { CHECK_THREAD diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ac1c8138b..0bb1e442a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -290,9 +290,6 @@ foreach(arg ${ALLFILES}) endforeach() FILE(WRITE "AllFiles.lst" "${ALLFILESLINES}") - -set(EXECUTABLE Cuberite) - if (MSVC) get_directory_property(BINDING_OUTPUTS DIRECTORY "Bindings" DEFINITION BINDING_OUTPUTS) get_directory_property(BINDING_DEPENDENCIES DIRECTORY "Bindings" DEFINITION BINDING_DEPENDENCIES) @@ -324,46 +321,45 @@ if (MSVC) endif() endif() -add_executable(${EXECUTABLE} ${SOURCE}) +add_executable(${CMAKE_PROJECT_NAME} ${SOURCE}) # Output the executable into the $/Server folder, so that it has access to external resources: -set(EXECUTABLE_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/Server) -SET_TARGET_PROPERTIES(${EXECUTABLE} PROPERTIES +SET_TARGET_PROPERTIES(${CMAKE_PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_SOURCE_DIR}/Server RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_SOURCE_DIR}/Server RUNTIME_OUTPUT_DIRECTORY_DEBUGPROFILE ${CMAKE_SOURCE_DIR}/Server RUNTIME_OUTPUT_DIRECTORY_RELEASEPROFILE ${CMAKE_SOURCE_DIR}/Server ) - # Make the debug executable have a "_debug" suffix -SET_TARGET_PROPERTIES(${EXECUTABLE} PROPERTIES DEBUG_POSTFIX "_debug") +SET_TARGET_PROPERTIES(${CMAKE_PROJECT_NAME} PROPERTIES DEBUG_POSTFIX "_debug") # Make the profiled executables have a "_profile" postfix -SET_TARGET_PROPERTIES(${EXECUTABLE} PROPERTIES DEBUGPROFILE_POSTFIX "_debug_profile") -SET_TARGET_PROPERTIES(${EXECUTABLE} PROPERTIES RELEASEPROFILE_POSTFIX "_profile") +SET_TARGET_PROPERTIES(${CMAKE_PROJECT_NAME} PROPERTIES DEBUGPROFILE_POSTFIX "_debug_profile") +SET_TARGET_PROPERTIES(${CMAKE_PROJECT_NAME} PROPERTIES RELEASEPROFILE_POSTFIX "_profile") # Precompiled headers (2nd part) if (MSVC) SET_TARGET_PROPERTIES( - ${EXECUTABLE} PROPERTIES COMPILE_FLAGS "/Yu\"Globals.h\"" + ${CMAKE_PROJECT_NAME} PROPERTIES COMPILE_FLAGS "/Yu\"Globals.h\"" OBJECT_DEPENDS "$(IntDir)/$(TargetName.pch)" ) endif () if (NOT MSVC) - target_link_libraries(${EXECUTABLE} + target_link_libraries(${CMAKE_PROJECT_NAME} OSSupport HTTPServer Bindings Items Blocks Noise Protocol Generating WorldStorage Mobs Entities Simulator IncrementalRedstoneSimulator BlockEntities UI PolarSSL++ ) endif () + if (WIN32) - target_link_libraries(${EXECUTABLE} expat tolualib ws2_32.lib Psapi.lib) + target_link_libraries(${CMAKE_PROJECT_NAME} expat tolualib ws2_32.lib Psapi.lib) endif() if (${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD") @@ -371,7 +367,7 @@ if (${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD") add_flags_lnk(-L/usr/ports/devel) endif() -target_link_libraries(${EXECUTABLE} luaexpat jsoncpp_lib_static mbedtls zlib sqlite lua SQLiteCpp event_core event_extra) +target_link_libraries(${CMAKE_PROJECT_NAME} luaexpat jsoncpp_lib_static mbedtls zlib sqlite lua SQLiteCpp event_core event_extra) # Create a folder for Bindings' documentation: FILE(MAKE_DIRECTORY "Bindings/docs") diff --git a/src/ClientHandle.h b/src/ClientHandle.h index e6982d546..8b6a78127 100644 --- a/src/ClientHandle.h +++ b/src/ClientHandle.h @@ -55,7 +55,7 @@ class cClientHandle // tolua_export { // tolua_export public: // tolua_export - #if defined(ANDROID_NDK) + #if defined(ANDROID) static const int DEFAULT_VIEW_DISTANCE = 4; // The default ViewDistance (used when no value is set in Settings.ini) #else static const int DEFAULT_VIEW_DISTANCE = 10; diff --git a/src/FurnaceRecipe.cpp b/src/FurnaceRecipe.cpp index 2c20eec0f..d1082b63f 100644 --- a/src/FurnaceRecipe.cpp +++ b/src/FurnaceRecipe.cpp @@ -6,7 +6,7 @@ #include <fstream> -#define FURNACE_RECIPE_FILE "furnace.txt" +#define FURNACE_RECIPE_FILE FILE_IO_PREFIX "furnace.txt" @@ -70,6 +70,10 @@ void cFurnaceRecipe::ReloadRecipes(void) LineNum++; if (ParsingLine.empty()) { + // There is a problem here on Android. Text files transferred from another OS may have a newline representation Android's implementation of getline doesn't expect + // Thus, part of a newline may be left in ParsingLine. ::empty() thus thinks the string isn't empty, and the below code outputs interesting errors since it was passed a nearly empty string + // Ref: http://stackoverflow.com/questions/6089231/getting-std-ifstream-to-handle-lf-cr-and-crlf + // TODO: There is a solution in the above reference, but it isn't very pretty. Fix it somehow. continue; } diff --git a/src/LoggerListeners.cpp b/src/LoggerListeners.cpp index 1d6d9c6ce..91f166bda 100644 --- a/src/LoggerListeners.cpp +++ b/src/LoggerListeners.cpp @@ -8,14 +8,12 @@ #if defined(_WIN32) #include <io.h> // Needed for _isatty(), not available on Linux #include <time.h> -#elif defined(__linux) && !defined(ANDROID_NDK) +#elif defined(__linux) #include <unistd.h> // Needed for isatty() on Linux -#elif defined(ANDROID_NDK) - #include <android/log.h> #endif -#if defined(_WIN32) || (defined (__linux) && !defined(ANDROID_NDK)) +#if defined(_WIN32) || defined (__linux) class cColouredConsoleListener : public cLogger::cListener { @@ -107,7 +105,7 @@ -#elif defined (__linux) && !defined(ANDROID_NDK) +#elif defined (__linux) @@ -154,46 +152,6 @@ } }; - - -#elif defined(ANDROID_NDK) - - - - class cAndroidConsoleListener - : public cLogger::cListener - { - public: - virtual void Log(AString a_Message, cLogger::eLogLevel a_LogLevel) override - { - android_LogPriority AndroidLogLevel; - switch (a_LogLevel) - { - case cLogger::llRegular: - { - AndroidLogLevel = ANDROID_LOG_VERBOSE; - break; - } - case cLogger::llInfo: - { - AndroidLogLevel = ANDROID_LOG_INFO; - break; - } - case cLogger::llWarning: - { - AndroidLogLevel = ANDROID_LOG_WARNING; - break; - } - case cLogger::llError: - { - AndroidLogLevel = ANDROID_LOG_ERROR; - break; - } - } - __android_log_print(AndroidLogLevel, "Cuberite", "%s", a_Message.c_str()); - } - }; - #endif @@ -273,8 +231,7 @@ std::unique_ptr<cLogger::cListener> MakeConsoleListener(bool a_IsService) { return cpp14::make_unique<cVanillaCPPConsoleListener>(); } - - #elif defined (__linux) && !defined(ANDROID_NDK) + #elif defined (__linux) && !defined(ANDROID) // TODO: lookup terminal in terminfo if (isatty(fileno(stdout))) { @@ -306,7 +263,7 @@ public: bool Open() { // Assume creation succeeds, as the API does not provide a way to tell if the folder exists. - cFile::CreateFolder(FILE_IO_PREFIX + AString("logs")); + cFile::CreateFolder(FILE_IO_PREFIX "logs"); bool success = m_File.Open( FILE_IO_PREFIX + Printf( "logs/LOG_%d.txt", diff --git a/src/OSSupport/CMakeLists.txt b/src/OSSupport/CMakeLists.txt index 876b4f789..22699f7cd 100644 --- a/src/OSSupport/CMakeLists.txt +++ b/src/OSSupport/CMakeLists.txt @@ -43,12 +43,4 @@ endif() if(NOT MSVC) add_library(OSSupport ${SRCS} ${HDRS}) - - if(UNIX) - if(NOT APPLE) - target_link_libraries(OSSupport rt) - endif() - - target_link_libraries(OSSupport pthread event_core event_extra) - endif() endif() diff --git a/src/OSSupport/Errors.cpp b/src/OSSupport/Errors.cpp index a05650111..004cbaccc 100644 --- a/src/OSSupport/Errors.cpp +++ b/src/OSSupport/Errors.cpp @@ -22,7 +22,7 @@ AString GetOSErrorString( int a_ErrNo) // According to http://linux.die.net/man/3/strerror_r there are two versions of strerror_r(): - #if defined(__GLIBC__) && defined( _GNU_SOURCE) && !defined(ANDROID_NDK) // GNU version of strerror_r() + #if defined(__GLIBC__) && defined( _GNU_SOURCE) && !defined(ANDROID) // GNU version of strerror_r() char * res = strerror_r( errno, buffer, ARRAYCOUNT(buffer)); if (res != nullptr) diff --git a/src/OSSupport/File.cpp b/src/OSSupport/File.cpp index a59f599ae..062161144 100644 --- a/src/OSSupport/File.cpp +++ b/src/OSSupport/File.cpp @@ -653,9 +653,13 @@ unsigned cFile::GetLastModificationTime(const AString & a_FileName) { return 0; } - #ifdef _WIN32 + #if defined(_WIN32) // Windows returns times in local time already return static_cast<unsigned>(st.st_mtime); + #elif defined(ANDROID) + // Identical to Linux below, but st_mtime is an unsigned long, so cast is needed: + auto Time = static_cast<time_t>(st.st_mtime); + return static_cast<unsigned>(mktime(localtime(&Time))); #else // Linux returns UTC time, convert to local timezone: return static_cast<unsigned>(mktime(localtime(&st.st_mtime))); diff --git a/src/OSSupport/NetworkInterfaceEnum.cpp b/src/OSSupport/NetworkInterfaceEnum.cpp index d3a254c23..439710c38 100644 --- a/src/OSSupport/NetworkInterfaceEnum.cpp +++ b/src/OSSupport/NetworkInterfaceEnum.cpp @@ -7,10 +7,10 @@ #include "Network.h" #include "event2/util.h" -#ifdef _WIN32 +#if defined(_WIN32) #include <IPHlpApi.h> #pragma comment(lib, "IPHLPAPI.lib") -#else // _WIN32 +#elif !defined(ANDROID) // _WIN32 #include <sys/types.h> #include <ifaddrs.h> #include <netinet/in.h> @@ -21,7 +21,7 @@ -#ifdef _WIN32 +#if defined(_WIN32) /** Converts the SOCKET_ADDRESS structure received from the OS into an IP address string. */ static AString PrintAddress(SOCKET_ADDRESS & a_Addr) @@ -50,7 +50,7 @@ static AString PrintAddress(SOCKET_ADDRESS & a_Addr) return IP; } -#else // _WIN32 +#elif !defined(ANDROID) // _WIN32 static AString PrintAddress(ifaddrs * InterfaceAddress) { @@ -82,7 +82,7 @@ static AString PrintAddress(ifaddrs * InterfaceAddress) } } -#endif // else _WIN32 +#endif // else !ANDROID @@ -92,7 +92,7 @@ AStringVector cNetwork::EnumLocalIPAddresses(void) { AStringVector res; - #ifdef _WIN32 + #if defined(_WIN32) // Query the OS for all adapters' addresses: char buffer[64 KiB]; // A buffer backing the address list @@ -129,7 +129,7 @@ AStringVector cNetwork::EnumLocalIPAddresses(void) } // for pUnicast } // for pCurrAddresses - #else // _WIN32 + #elif !defined(ANDROID) // _WIN32 struct ifaddrs * ifAddrStruct = nullptr; getifaddrs(&ifAddrStruct); diff --git a/src/OSSupport/NetworkSingleton.cpp b/src/OSSupport/NetworkSingleton.cpp index dcf17bccb..3a8dbbdc7 100644 --- a/src/OSSupport/NetworkSingleton.cpp +++ b/src/OSSupport/NetworkSingleton.cpp @@ -13,6 +13,11 @@ #include "IPLookup.h" #include "HostnameLookup.h" +#ifdef ANDROID + // For DNS server retrieval + #include <sys/system_properties.h> +#endif + @@ -89,6 +94,16 @@ void cNetworkSingleton::Initialise(void) abort(); } + #ifdef ANDROID + char PropertyBuffer[PROP_VALUE_MAX]; + + __system_property_get("net.dns1", PropertyBuffer); + evdns_base_nameserver_ip_add(m_DNSBase, PropertyBuffer); + + __system_property_get("net.dns2", PropertyBuffer); + evdns_base_nameserver_ip_add(m_DNSBase, PropertyBuffer); + #endif + // Create the event loop thread: m_HasTerminated = false; m_EventLoopThread = std::thread(RunEventLoop, this); diff --git a/src/OSSupport/StackTrace.cpp b/src/OSSupport/StackTrace.cpp index 030566065..c84e2cbca 100644 --- a/src/OSSupport/StackTrace.cpp +++ b/src/OSSupport/StackTrace.cpp @@ -7,7 +7,7 @@ #include "StackTrace.h" #ifdef _WIN32 #include "../StackWalker.h" -#else +#elif !defined(ANDROID) // The Android NDK has no execinfo header #ifdef __GLIBC__ #include <execinfo.h> #endif @@ -32,7 +32,7 @@ void PrintStackTrace(void) } } sw; sw.ShowCallstack(); - #else + #elif !defined(ANDROID) #ifdef __GLIBC__ // Use the backtrace() function to get and output the stackTrace: // Code adapted from https://stackoverflow.com/questions/77005/how-to-generate-a-stacktrace-when-my-gcc-c-app-crashes diff --git a/src/Root.cpp b/src/Root.cpp index 55e149511..206bddfbc 100644 --- a/src/Root.cpp +++ b/src/Root.cpp @@ -207,18 +207,16 @@ void cRoot::Start(std::unique_ptr<cSettingsRepositoryInterface> a_OverridesRepo) { m_WebAdmin->Start(); - #if !defined(ANDROID_NDK) - LOGD("Starting InputThread..."); - try - { - m_InputThreadRunFlag.test_and_set(); - m_InputThread = std::thread(InputThread, std::ref(*this)); - } - catch (std::system_error & a_Exception) - { - LOGERROR("cRoot::Start (std::thread) error %i: could not construct input thread; %s", a_Exception.code().value(), a_Exception.what()); - } - #endif + LOGD("Starting InputThread..."); + try + { + m_InputThreadRunFlag.test_and_set(); + m_InputThread = std::thread(InputThread, std::ref(*this)); + } + catch (std::system_error & a_Exception) + { + LOGERROR("cRoot::Start (std::thread) error %i: could not construct input thread; %s", a_Exception.code().value(), a_Exception.what()); + } LOG("Startup complete, took %ldms!", static_cast<long int>(std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now() - BeginTime).count())); diff --git a/src/StringUtils.cpp b/src/StringUtils.cpp index 521aa79f4..81999a35d 100644 --- a/src/StringUtils.cpp +++ b/src/StringUtils.cpp @@ -5,10 +5,6 @@ #include "Globals.h" -#if defined(ANDROID_NDK) -#include <ctype.h> -#endif - #ifdef _MSC_VER // Under MSVC, link to WinSock2 (needed by RawBEToUTF8's byteswapping) #pragma comment(lib, "ws2_32.lib") diff --git a/src/World.cpp b/src/World.cpp index eafd44ce0..e02ca7964 100644 --- a/src/World.cpp +++ b/src/World.cpp @@ -354,10 +354,10 @@ bool cWorld::SetSpawn(double a_X, double a_Y, double a_Z) void cWorld::InitializeSpawn(void) { // For the debugging builds, don't make the server build too much world upon start: - #if defined(_DEBUG) || defined(ANDROID_NDK) - const int DefaultViewDist = 9; + #if defined(_DEBUG) || defined(ANDROID) + const int DefaultViewDist = 9; #else - const int DefaultViewDist = 20; // Always prepare an area 20 chunks across, no matter what the actual cClientHandle::VIEWDISTANCE is + const int DefaultViewDist = 20; // Always prepare an area 20 chunks across, no matter what the actual cClientHandle::VIEWDISTANCE is #endif // _DEBUG if (!m_IsSpawnExplicitlySet) diff --git a/src/main.cpp b/src/main.cpp index 6061602d7..83056bf61 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -8,6 +8,20 @@ #include <csignal> #include <stdlib.h> +#ifdef ANDROID + // Workaround for Android NDK builds that do not support std::to_string + namespace std + { + template <typename T> + std::string to_string(T Value) + { + std::ostringstream TempStream; + TempStream << Value; + return TempStream.str(); + } + } +#endif + #ifdef _MSC_VER #include <dbghelp.h> #endif // _MSC_VER @@ -223,14 +237,11 @@ static void UniversalMain(std::unique_ptr<cSettingsRepositoryInterface> a_Overri // Initialize LibEvent: cNetworkSingleton::Get().Initialise(); - #if !defined(ANDROID_NDK) try - #endif { cRoot Root; Root.Start(std::move(a_OverridesRepo)); } - #if !defined(ANDROID_NDK) catch (std::exception & e) { LOGERROR("Standard exception: %s", e.what()); @@ -239,7 +250,6 @@ static void UniversalMain(std::unique_ptr<cSettingsRepositoryInterface> a_Overri { LOGERROR("Unknown exception!"); } - #endif // Shutdown all of LibEvent: cNetworkSingleton::Get().Terminate(); |