forked from I2P_Developers/i2p.i2p
merge of '97672ae2bf487e93c095bb1d142c3df1a2f3d7d7'
and 'a81e35f3ea0e85227f834ec3bd4c40c7c18291f8'
This commit is contained in:
@@ -1,29 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
package="net.i2p.android.router"
|
|
||||||
android.versionCode="0"
|
|
||||||
android.versionName="0.0.0"
|
|
||||||
android:installLocation="preferExternal"
|
|
||||||
>
|
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
|
||||||
|
|
||||||
<!-- 3 = 1.5, 2 = 1.1, 1 = 1.0; would probably work with 1 but don't have a 1.0 SDK to test against -->
|
|
||||||
<!-- 3 required for NDK -->
|
|
||||||
<uses-sdk android:minSdkVersion="3" />
|
|
||||||
|
|
||||||
<application android:label="@string/app_name"
|
|
||||||
android:icon="@drawable/ic_launcher_itoopie" >
|
|
||||||
<service android:name=".service.RouterService"
|
|
||||||
android:label="@string/app_name"
|
|
||||||
android:icon="@drawable/ic_launcher_itoopie" />
|
|
||||||
<activity android:name=".activity.MainActivity"
|
|
||||||
android:label="@string/app_name"
|
|
||||||
android:icon="@drawable/ic_launcher_itoopie"
|
|
||||||
android:launchMode="singleTask" >
|
|
||||||
<intent-filter>
|
|
||||||
<action android:name="android.intent.action.MAIN" />
|
|
||||||
<category android:name="android.intent.category.LAUNCHER" />
|
|
||||||
</intent-filter>
|
|
||||||
</activity>
|
|
||||||
</application>
|
|
||||||
</manifest>
|
|
@@ -1,58 +0,0 @@
|
|||||||
These instructions are for a recent Android SDK (1.6 or later)..
|
|
||||||
Should also still work with a 1.5 SDK.
|
|
||||||
The build file is not compatible with the 1.1 SDK any more.
|
|
||||||
These instructions were last updated for SDK Tools Version 11 with
|
|
||||||
SDK Platform-tools Version 5, June 2011.
|
|
||||||
|
|
||||||
#Download the SDK from http://developer.android.com/sdk/index.html
|
|
||||||
#Unzip the android SDK in ../../
|
|
||||||
#So then the android tools will be in ../../android-sdk-linux_86/tools/
|
|
||||||
#
|
|
||||||
# Run the GUI updater, which you must do to get an SDK Platform:
|
|
||||||
../../android-sdk-linux_86/tools/android &
|
|
||||||
|
|
||||||
# now go to the available packages tab, check the box and click refresh,
|
|
||||||
# and download an SDK Platform
|
|
||||||
# Since I2P is configured to run on 1.1 or higher
|
|
||||||
# (API 2) download that one. Otherwise you must change the
|
|
||||||
# target in default.properties from android-2 to andriod-x
|
|
||||||
# where x is the API version.
|
|
||||||
|
|
||||||
# To run the debugger (ddms) you also need to download the
|
|
||||||
# "Android SDK Platform-Tools" package from the GUI updater.
|
|
||||||
|
|
||||||
# create a file local.properties with the following line (without the leading # of course):
|
|
||||||
# sdk.dir=/path/to/your/android-sdk-linux_86
|
|
||||||
# The old property was sdk-location=/path/to/your/android-sdk-linux_86
|
|
||||||
# but it changed in more recent tools.
|
|
||||||
|
|
||||||
# DO NOT create a new project or anything. It's all set up right here for you.
|
|
||||||
|
|
||||||
# Create the android 1.5 (API 3) virtual device
|
|
||||||
# (don't make a custom hardware profile)
|
|
||||||
# A AVD created with the 1.5 SDK will not work with the newer tools
|
|
||||||
../../android-sdk-linux_86/tools/android create avd --name i2p --target 3
|
|
||||||
|
|
||||||
#then run the emulator:
|
|
||||||
../../android-sdk-linux_86/tools/emulator -avd i2p &
|
|
||||||
|
|
||||||
# or to talk to a real phone in debug mode:
|
|
||||||
adb kill-server
|
|
||||||
sudo adb start-server
|
|
||||||
adb devices
|
|
||||||
|
|
||||||
#then wait a couple minutes until the emulator is up
|
|
||||||
#then install the I2P app
|
|
||||||
ant install
|
|
||||||
|
|
||||||
#then run the debugger
|
|
||||||
../../android-sdk-linux_86/tools/ddms &
|
|
||||||
|
|
||||||
#to rebuild and reinstall to emulator or phone:
|
|
||||||
ant reinstall
|
|
||||||
|
|
||||||
# Now click on the I2P icon on your phone!
|
|
||||||
|
|
||||||
#other helpful commands
|
|
||||||
../../android-sdk-linux_86/platform-tools/adb shell
|
|
||||||
../../android-sdk-linux_86/platform-tools/adb pull /some/file/on/emulator some-local-dir/
|
|
@@ -1 +0,0 @@
|
|||||||
application-package=net.i2p.router
|
|
@@ -1,210 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
- Portions copied and modified from Android SDK
|
|
||||||
- Copyright (c) 2005-2008, The Android Open Source Project
|
|
||||||
- Apache 2.0 license
|
|
||||||
- See ../licenses/LICENSE-Apache2.0.txt
|
|
||||||
-->
|
|
||||||
|
|
||||||
<project name="I2PAndroid" default="help">
|
|
||||||
|
|
||||||
<!-- The local.properties file is created and updated by the 'android' tool.
|
|
||||||
It contain the path to the SDK. It should *NOT* be checked in in Version
|
|
||||||
Control Systems. -->
|
|
||||||
<property file="local.properties"/>
|
|
||||||
|
|
||||||
<!-- The build.properties file can be created by you and is never touched
|
|
||||||
by the 'android' tool. This is the place to change some of the default property values
|
|
||||||
used by the Ant rules.
|
|
||||||
Here are some properties you may want to change/update:
|
|
||||||
|
|
||||||
application-package
|
|
||||||
the name of your application package as defined in the manifest. Used by the
|
|
||||||
'uninstall' rule.
|
|
||||||
source-folder
|
|
||||||
the name of the source folder. Default is 'src'.
|
|
||||||
out-folder
|
|
||||||
the name of the output folder. Default is 'bin'.
|
|
||||||
|
|
||||||
Properties related to the SDK location or the project target should be updated
|
|
||||||
using the 'android' tool with the 'update' action.
|
|
||||||
|
|
||||||
This file is an integral part of the build system for your application and
|
|
||||||
should be checked in in Version Control Systems.
|
|
||||||
|
|
||||||
-->
|
|
||||||
<property file="build.properties"/>
|
|
||||||
<!-- set the old name to the new name -->
|
|
||||||
<property name="sdk-location" value="${sdk.dir}" />
|
|
||||||
|
|
||||||
<!-- The default.properties file is created and updated by the 'android' tool, as well
|
|
||||||
as ADT.
|
|
||||||
This file is an integral part of the build system for your application and
|
|
||||||
should be checked in in Version Control Systems. -->
|
|
||||||
<property file="default.properties"/>
|
|
||||||
|
|
||||||
<!-- Custom Android task to deal with the project target, and import the proper rules.
|
|
||||||
This requires ant 1.6.0 or above. -->
|
|
||||||
<path id="android.antlibs">
|
|
||||||
<pathelement path="${sdk-location}/tools/lib/anttasks.jar" />
|
|
||||||
<pathelement path="${sdk-location}/tools/lib/sdklib.jar" />
|
|
||||||
<pathelement path="${sdk-location}/tools/lib/androidprefs.jar" />
|
|
||||||
<pathelement path="${sdk-location}/tools/lib/apkbuilder.jar" />
|
|
||||||
<pathelement path="${sdk-location}/tools/lib/jarutils.jar" />
|
|
||||||
</path>
|
|
||||||
|
|
||||||
<taskdef name="setup"
|
|
||||||
classname="com.android.ant.SetupTask"
|
|
||||||
classpathref="android.antlibs"/>
|
|
||||||
|
|
||||||
<!-- Execute the Android Setup task that will setup some properties specific to the target,
|
|
||||||
and import the rules files.
|
|
||||||
To customize the rules, copy/paste them below the task, and disable import by setting
|
|
||||||
the import attribute to false:
|
|
||||||
<setup import="false" />
|
|
||||||
|
|
||||||
This will ensure that the properties are setup correctly but that your customized
|
|
||||||
targets are used.
|
|
||||||
-->
|
|
||||||
<setup import="true" />
|
|
||||||
|
|
||||||
<echo>Ignore warning about SDK version</echo>
|
|
||||||
<!--
|
|
||||||
================================================================================
|
|
||||||
New I2P rules
|
|
||||||
================================================================================
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!-- overrides of those in main_rules.xml -->
|
|
||||||
|
|
||||||
<target name="-pre-build" depends="copy-i2p-resources, incrementBuild" />
|
|
||||||
|
|
||||||
<target name="-pre-compile" depends="buildrouter" />
|
|
||||||
|
|
||||||
<target name="-post-compile" depends="hackcleanup, jbigi" />
|
|
||||||
|
|
||||||
<!-- new rules -->
|
|
||||||
|
|
||||||
<target name="buildrouter" depends="-dirs" >
|
|
||||||
<!-- build router and core -->
|
|
||||||
<ant dir=".." target="buildrouter" />
|
|
||||||
|
|
||||||
<!-- router -->
|
|
||||||
<copy file="../build/router.jar" todir="${jar.libs.dir}" />
|
|
||||||
|
|
||||||
<!-- core -->
|
|
||||||
|
|
||||||
<!-- org.bouncycastle.crypto already in android
|
|
||||||
but we need a little trickery because our HMac is incompatible...
|
|
||||||
and the libs aren't in the SDK to compile against??? -->
|
|
||||||
<jar destfile="${jar.libs.dir}/crypto.jar" >
|
|
||||||
<zipfileset src="../build/i2p.jar" >
|
|
||||||
<include name="org/bouncycastle/crypto/Digest.class" />
|
|
||||||
<include name="org/bouncycastle/crypto/Mac.class" />
|
|
||||||
<include name="org/bouncycastle/crypto/digests/GeneralDigest.class" />
|
|
||||||
<include name="org/bouncycastle/crypto/digests/MD5Digest.class" />
|
|
||||||
</zipfileset >
|
|
||||||
</jar>
|
|
||||||
|
|
||||||
<!-- lots of unneeded stuff could be deleted here -->
|
|
||||||
<jar destfile="${jar.libs.dir}/i2p.jar" >
|
|
||||||
<zipfileset src="../build/i2p.jar" >
|
|
||||||
<exclude name="net/i2p/util/LogWriter.class" />
|
|
||||||
<exclude name="net/i2p/util/SecureDirectory.class" />
|
|
||||||
<exclude name="net/i2p/util/SecureFile.class" />
|
|
||||||
<exclude name="net/i2p/util/SecureFileOutputStream.class" />
|
|
||||||
<exclude name="org/bouncycastle/crypto/Digest.class" />
|
|
||||||
<exclude name="org/bouncycastle/crypto/Mac.class" />
|
|
||||||
<exclude name="org/bouncycastle/crypto/digests/GeneralDigest.class" />
|
|
||||||
<exclude name="org/bouncycastle/crypto/digests/MD5Digest.class" />
|
|
||||||
</zipfileset >
|
|
||||||
</jar>
|
|
||||||
</target>
|
|
||||||
|
|
||||||
<!-- some resources -->
|
|
||||||
<target name="copy-i2p-resources" depends="-dirs" >
|
|
||||||
<copy file="../installer/resources/themes/console/images/i2plogo.png" todir="res/drawable/" />
|
|
||||||
<copy file="../installer/resources/blocklist.txt" tofile="res/raw/blocklist_txt" />
|
|
||||||
</target>
|
|
||||||
|
|
||||||
<target name="hackcleanup">
|
|
||||||
<delete file="${jar.libs.dir}/crypto.jar" />
|
|
||||||
</target>
|
|
||||||
|
|
||||||
<target name="jbigi">
|
|
||||||
<exec executable="sh" osfamily="unix" failonerror="true">
|
|
||||||
<arg value="-c" />
|
|
||||||
<arg value="jni/build.sh" />
|
|
||||||
</exec>
|
|
||||||
<copy file="jni/libjbigi.so" todir="${native.libs.dir}/armeabi" />
|
|
||||||
</target>
|
|
||||||
|
|
||||||
<target name="incrementBuild">
|
|
||||||
<buildnumber file="scripts/build.number" />
|
|
||||||
<exec executable="sh" osfamily="unix" failonerror="true">
|
|
||||||
<arg value="-c" />
|
|
||||||
<arg value="scripts/setversion.sh" />
|
|
||||||
</exec>
|
|
||||||
<!-- this loads my.version.code and my.version.name -->
|
|
||||||
<property file="scripts/version.properties" />
|
|
||||||
</target>
|
|
||||||
|
|
||||||
<!-- install now does both -->
|
|
||||||
<target name="reinstall" depends="install" />
|
|
||||||
|
|
||||||
<target name="distclean" depends="clean">
|
|
||||||
<delete dir="${jar.libs.dir}" verbose="${verbose}" />
|
|
||||||
<delete file="res/drawable/i2plogo.png" verbose="${verbose}"/>
|
|
||||||
<delete file="res/raw/blocklist_txt" verbose="${verbose}" />
|
|
||||||
<delete dir="jni/build/" verbose="${verbose}" />
|
|
||||||
<delete file="jni/libjbigi.so" verbose="${verbose}" />
|
|
||||||
<delete file="scripts/build.number" verbose="${verbose}" />
|
|
||||||
<delete file="scripts/version.properties" verbose="${verbose}" />
|
|
||||||
</target>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
================================================================================
|
|
||||||
From here down copied from SDK tools/ant/main_rules.xml from Tools version 11
|
|
||||||
and then modified
|
|
||||||
================================================================================
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!-- not necessary to copy if setup import="true" -->
|
|
||||||
|
|
||||||
|
|
||||||
<!--
|
|
||||||
override this because the ant task com.android.ant.AaptExecLoopTask has issues:
|
|
||||||
a) it uses version.code which main_rules sets to "" and
|
|
||||||
b) it can't set versionName via the aapt task, have to use the aapt command line
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!-- Puts the project's resources into the output package file
|
|
||||||
This actually can create multiple resource package in case
|
|
||||||
Some custom apk with specific configuration have been
|
|
||||||
declared in default.properties.
|
|
||||||
-->
|
|
||||||
<target name="-package-resources">
|
|
||||||
<echo>Packaging resources</echo>
|
|
||||||
<exec executable="${aapt}" failonerror="true" >
|
|
||||||
<arg value="package" />
|
|
||||||
<arg value="--version-code" />
|
|
||||||
<arg value="${my.version.code}" />
|
|
||||||
<arg value="--version-name" />
|
|
||||||
<arg value="${my.version.name}" />
|
|
||||||
<arg value="-f" />
|
|
||||||
<arg value="-m" />
|
|
||||||
<arg value="-M" />
|
|
||||||
<arg value="AndroidManifest.xml" />
|
|
||||||
<arg value="-I" />
|
|
||||||
<arg value="${android.jar}" />
|
|
||||||
<arg value="-S" />
|
|
||||||
<arg value="${resource.absolute.dir}" />
|
|
||||||
<arg value="-J" />
|
|
||||||
<arg value="${gen.absolute.dir}" />
|
|
||||||
<arg value="-F" />
|
|
||||||
<arg value="${out.absolute.dir}/${resource.package.file.name}" />
|
|
||||||
</exec>
|
|
||||||
</target>
|
|
||||||
|
|
||||||
</project>
|
|
@@ -1,11 +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 use,
|
|
||||||
# "build.properties", and override values to adapt the script to your
|
|
||||||
# project structure.
|
|
||||||
|
|
||||||
# Project target.
|
|
||||||
target=android-8
|
|
@@ -1,83 +0,0 @@
|
|||||||
#
|
|
||||||
# build GMP and libjbigi.so using the Android tools directly
|
|
||||||
#
|
|
||||||
|
|
||||||
# uncomment to skip
|
|
||||||
# exit 0
|
|
||||||
|
|
||||||
THISDIR=$(realpath $(dirname $(which $0)))
|
|
||||||
cd $THISDIR
|
|
||||||
export NDK=$(realpath ../../../android-ndk-r5b/)
|
|
||||||
|
|
||||||
#
|
|
||||||
# API level, must match that in ../AndroidManifest.xml
|
|
||||||
#
|
|
||||||
LEVEL=3
|
|
||||||
ARCH=arm
|
|
||||||
export SYSROOT=$NDK/platforms/android-$LEVEL/arch-$ARCH/
|
|
||||||
export AABI=arm-linux-androideabi-4.4.3
|
|
||||||
export SYSTEM=linux-x86
|
|
||||||
export BINPREFIX=arm-linux-androideabi-
|
|
||||||
export CC="$NDK/toolchains/$AABI/prebuilt/$SYSTEM/bin/${BINPREFIX}gcc --sysroot=$SYSROOT"
|
|
||||||
|
|
||||||
#echo "CC is $CC"
|
|
||||||
|
|
||||||
JBIGI=$(realpath ../../core/c/jbigi)
|
|
||||||
GMPVER=4.3.2
|
|
||||||
GMP=$JBIGI/gmp-$GMPVER
|
|
||||||
|
|
||||||
if [ ! -d $GMP ]
|
|
||||||
then
|
|
||||||
echo "Source dir for GMP version $GMPVER not found in $GMP"
|
|
||||||
echo "Install it there or change GMPVER and/or GMP in this script"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
LIBFILE=$PWD/libjbigi.so
|
|
||||||
if [ -f $LIBFILE ]
|
|
||||||
then
|
|
||||||
echo "$LIBFILE exists, nothing to do here"
|
|
||||||
echo "If you wish to force a recompile, delete it"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
mkdir -p build
|
|
||||||
cd build
|
|
||||||
|
|
||||||
# we must set both build and host, so that the configure
|
|
||||||
# script will set cross_compile=yes, so that it
|
|
||||||
# won't attempt to run the a.out files
|
|
||||||
if [ ! -f config.status ]
|
|
||||||
then
|
|
||||||
echo "Configuring GMP..."
|
|
||||||
$GMP/configure --with-pic --build=x86-none-linux --host=armv5-eabi-linux || exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Building GMP..."
|
|
||||||
make || exit 1
|
|
||||||
|
|
||||||
export JAVA_HOME=$(dirname $(dirname $(realpath $(which javac))))
|
|
||||||
if [ ! -f "$JAVA_HOME/include/jni.h" ]; then
|
|
||||||
echo "Cannot find jni.h! Looked in '$JAVA_HOME/include/jni.h'"
|
|
||||||
echo "Please set JAVA_HOME to a java home that has the JNI"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
COMPILEFLAGS="-fPIC -Wall"
|
|
||||||
INCLUDES="-I. -I$JBIGI/jbigi/include -I$JAVA_HOME/include -I$JAVA_HOME/include/linux"
|
|
||||||
LINKFLAGS="-shared -Wl,-soname,libjbigi.so,--fix-cortex-a8"
|
|
||||||
|
|
||||||
echo "Building jbigi lib that is statically linked to GMP"
|
|
||||||
STATICLIBS=".libs/libgmp.a"
|
|
||||||
|
|
||||||
echo "Compiling C code..."
|
|
||||||
rm -f jbigi.o $LIBFILE
|
|
||||||
echo "$CC -c $COMPILEFLAGS $INCLUDES $JBIGI/jbigi/src/jbigi.c"
|
|
||||||
$CC -c $COMPILEFLAGS $INCLUDES $JBIGI/jbigi/src/jbigi.c || exit 1
|
|
||||||
echo "$CC $LINKFLAGS $INCLUDES $INCLUDELIBS -o $LIBFILE jbigi.o $STATICLIBS"
|
|
||||||
$CC $LINKFLAGS $INCLUDES $INCLUDELIBS -o $LIBFILE jbigi.o $STATICLIBS || exit 1
|
|
||||||
|
|
||||||
ls -l $LIBFILE || exit 1
|
|
||||||
|
|
||||||
|
|
||||||
echo 'Built successfully'
|
|
Binary file not shown.
Before Width: | Height: | Size: 2.6 KiB |
@@ -1,18 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:orientation="vertical"
|
|
||||||
android:layout_width="fill_parent"
|
|
||||||
android:layout_height="fill_parent"
|
|
||||||
>
|
|
||||||
<TextView
|
|
||||||
android:layout_width="fill_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="Hello World, I2PAndroid"
|
|
||||||
/>
|
|
||||||
<ImageView
|
|
||||||
android:layout_width="fill_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:src="@drawable/i2plogo"
|
|
||||||
/>
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
@@ -1,8 +0,0 @@
|
|||||||
logger.defaultLevel=INFO
|
|
||||||
logger.record.net.i2p.router.peerManager.ProfileOrganizer=WARN
|
|
||||||
logger.record.net.i2p.router.transport=WARN
|
|
||||||
logger.record.net.i2p.router.transport.FIFOBandwidthRefiller=ERROR
|
|
||||||
logger.record.net.i2p.stat.Rate=ERROR
|
|
||||||
logger.record.net.i2p.util.LogManager=WARN
|
|
||||||
logger.record.net.i2p.util.LogWriter=WARN
|
|
||||||
logger.record.net.i2p.util.NativeBigInteger=DEBUG
|
|
@@ -1,52 +0,0 @@
|
|||||||
# initial router.config
|
|
||||||
# temp directory
|
|
||||||
i2p.dir.temp=/data/data/net.i2p.router/files/tmp
|
|
||||||
i2p.dir.pid=/data/data/net.i2p.router/files/tmp
|
|
||||||
# save memory
|
|
||||||
prng.buffers=2
|
|
||||||
router.decayingBloomFilterM=20
|
|
||||||
stat.full=false
|
|
||||||
#
|
|
||||||
# Don't run NTP client, the phone should have a valid time
|
|
||||||
#
|
|
||||||
time.disabled=true
|
|
||||||
#
|
|
||||||
# no I2CP
|
|
||||||
#
|
|
||||||
i2p.dummyClientFacade=true
|
|
||||||
i2cp.disableInterface=true
|
|
||||||
#
|
|
||||||
##### Tunnels
|
|
||||||
#
|
|
||||||
router.inboundPool.backupQuantity=0
|
|
||||||
router.inboundPool.length=2
|
|
||||||
router.inboundPool.lengthVariance=0
|
|
||||||
router.inboundPool.quantity=2
|
|
||||||
router.outboundPool.backupQuantity=0
|
|
||||||
router.outboundPool.length=2
|
|
||||||
router.outboundPool.lengthVariance=0
|
|
||||||
router.outboundPool.quantity=2
|
|
||||||
router.maxParticipatingTunnels=0
|
|
||||||
router.sharePercentage=10
|
|
||||||
#
|
|
||||||
##### Transport
|
|
||||||
#
|
|
||||||
i2np.bandwidth.inboundKBytesPerSecond=100
|
|
||||||
i2np.bandwidth.outboundKBytesPerSecond=30
|
|
||||||
#
|
|
||||||
# NTCP
|
|
||||||
#
|
|
||||||
#i2np.ntcp.enable=false
|
|
||||||
i2np.ntcp.maxConnections=12
|
|
||||||
#
|
|
||||||
# UDP disabled for now
|
|
||||||
#
|
|
||||||
i2np.udp.enable=false
|
|
||||||
i2np.udp.maxConnections=12
|
|
||||||
#
|
|
||||||
# no COMM at all!!!
|
|
||||||
#i2p.vmCommSystem=true
|
|
||||||
#
|
|
||||||
# not on android
|
|
||||||
i2np.upnp.enable=false
|
|
||||||
routerconsole.geoip.enable=false
|
|
@@ -1,4 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<resources>
|
|
||||||
<string name="app_name">I2P</string>
|
|
||||||
</resources>
|
|
@@ -1,59 +0,0 @@
|
|||||||
#
|
|
||||||
# Get the version number and fix up AndroidManifest.xml
|
|
||||||
# Public domain
|
|
||||||
#
|
|
||||||
THISDIR=$(realpath $(dirname $(which $0)))
|
|
||||||
cd $THISDIR
|
|
||||||
MANIFEST=../AndroidManifest.xml
|
|
||||||
TMP=AndroidManifest.xml.tmp
|
|
||||||
|
|
||||||
CORE=`grep 'public final static String VERSION' ../../core/java/src/net/i2p/CoreVersion.java | \
|
|
||||||
cut -d '"' -f 2`
|
|
||||||
|
|
||||||
MAJOR=`echo $CORE | cut -d '.' -f 1`
|
|
||||||
MINOR=`echo $CORE | cut -d '.' -f 2`
|
|
||||||
RELEASE=`echo $CORE | cut -d '.' -f 3`
|
|
||||||
|
|
||||||
ROUTERBUILD=$((`grep 'public final static long BUILD' ../../router/java/src/net/i2p/router/RouterVersion.java | \
|
|
||||||
cut -d '=' -f 2 | \
|
|
||||||
cut -d ';' -f 1`))
|
|
||||||
|
|
||||||
ANDROIDBUILD=`grep 'build.number' build.number | \
|
|
||||||
cut -d '=' -f 2`
|
|
||||||
|
|
||||||
SDK=`grep 'android:minSdkVersion' $MANIFEST | \
|
|
||||||
cut -d '"' -f 2`
|
|
||||||
|
|
||||||
# don't let build number get too long
|
|
||||||
VERSIONSTRING="${CORE}-${ROUTERBUILD}_b$(($ANDROIDBUILD % 256))-SDK$SDK"
|
|
||||||
|
|
||||||
#
|
|
||||||
# Android version code is an integer.
|
|
||||||
# So we have 31 bits.
|
|
||||||
# MAJOR 4 bits 0-15
|
|
||||||
# MINOR 8 bits 0-255
|
|
||||||
# RELEASE 8 bits 0-255
|
|
||||||
# ROUTERBUILD 8 bits 0-255
|
|
||||||
# ANDROIDBUILD 3 bits 0-7
|
|
||||||
#
|
|
||||||
# Note that ANDROIDBUILD is modded % 8, it will wrap,
|
|
||||||
# beware of that if you release multiple builds using the
|
|
||||||
# same ROUTERBUILD, or clear it if you update ROUTERBUILD
|
|
||||||
#
|
|
||||||
VERSIONINT=$(( \
|
|
||||||
(($MAJOR % 16) << 27) + \
|
|
||||||
(($MINOR % 256) << 19) + \
|
|
||||||
(($RELEASE % 256) << 11) + \
|
|
||||||
(($ROUTERBUILD % 256) << 3) + \
|
|
||||||
($ANDROIDBUILD % 8) \
|
|
||||||
))
|
|
||||||
|
|
||||||
echo "Android version: '$VERSIONSTRING' (${VERSIONINT})"
|
|
||||||
echo "my.version.name=${VERSIONSTRING}" > version.properties
|
|
||||||
echo "my.version.code=${VERSIONINT}" >> version.properties
|
|
||||||
|
|
||||||
SUBST='s/android.versionCode="[0-9]"/android.versionCode="'${VERSIONINT}'"/'
|
|
||||||
sed "$SUBST" < $MANIFEST > $TMP
|
|
||||||
SUBST='s/android.versionName="[^"]*"/android.versionName="'${VERSIONSTRING}'"/'
|
|
||||||
sed "$SUBST" < $TMP > $MANIFEST
|
|
||||||
rm -f $TMP
|
|
@@ -1,65 +0,0 @@
|
|||||||
package net.i2p.android.router.activity;
|
|
||||||
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.content.ComponentName;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.os.Bundle;
|
|
||||||
|
|
||||||
public abstract class I2PActivityBase extends Activity {
|
|
||||||
protected String _myDir;
|
|
||||||
|
|
||||||
/** Called when the activity is first created. */
|
|
||||||
@Override
|
|
||||||
public void onCreate(Bundle savedInstanceState)
|
|
||||||
{
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
_myDir = getFilesDir().getAbsolutePath();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onRestart()
|
|
||||||
{
|
|
||||||
System.err.println(this + " onRestart called");
|
|
||||||
super.onRestart();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onStart()
|
|
||||||
{
|
|
||||||
System.err.println(this + " onStart called");
|
|
||||||
super.onStart();
|
|
||||||
Intent intent = new Intent();
|
|
||||||
intent.setClassName(this, "net.i2p.android.router.service.RouterService");
|
|
||||||
System.err.println(this + " calling startService");
|
|
||||||
ComponentName name = startService(intent);
|
|
||||||
System.err.println(this + " got from startService: " + name);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onResume()
|
|
||||||
{
|
|
||||||
System.err.println(this + " onResume called");
|
|
||||||
super.onResume();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onPause()
|
|
||||||
{
|
|
||||||
System.err.println(this + " onPause called");
|
|
||||||
super.onPause();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onStop()
|
|
||||||
{
|
|
||||||
System.err.println(this + " onStop called");
|
|
||||||
super.onStop();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onDestroy()
|
|
||||||
{
|
|
||||||
System.err.println(this + "onDestroy called");
|
|
||||||
super.onDestroy();
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,16 +0,0 @@
|
|||||||
package net.i2p.android.router.activity;
|
|
||||||
|
|
||||||
import android.os.Bundle;
|
|
||||||
|
|
||||||
import net.i2p.android.router.R;
|
|
||||||
|
|
||||||
public class MainActivity extends I2PActivityBase {
|
|
||||||
|
|
||||||
/** Called when the activity is first created. */
|
|
||||||
@Override
|
|
||||||
public void onCreate(Bundle savedInstanceState)
|
|
||||||
{
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
setContentView(R.layout.main);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,134 +0,0 @@
|
|||||||
package net.i2p.android.router.service;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.pm.PackageInfo;
|
|
||||||
import android.content.pm.PackageManager;
|
|
||||||
import android.content.res.Resources;
|
|
||||||
import android.content.res.Resources.NotFoundException;
|
|
||||||
import android.os.Build;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileOutputStream;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Properties;
|
|
||||||
|
|
||||||
import net.i2p.android.router.R;
|
|
||||||
import net.i2p.data.DataHelper;
|
|
||||||
import net.i2p.router.Router;
|
|
||||||
import net.i2p.router.RouterContext;
|
|
||||||
import net.i2p.router.RouterLaunch;
|
|
||||||
import net.i2p.util.OrderedProperties;
|
|
||||||
import net.i2p.util.NativeBigInteger;
|
|
||||||
|
|
||||||
class Init {
|
|
||||||
|
|
||||||
private final Context ctx;
|
|
||||||
private final String myDir;
|
|
||||||
|
|
||||||
public Init(Context c) {
|
|
||||||
ctx = c;
|
|
||||||
myDir = c.getFilesDir().getAbsolutePath();
|
|
||||||
}
|
|
||||||
|
|
||||||
void debugStuff() {
|
|
||||||
System.err.println("java.io.tmpdir" + ": " + System.getProperty("java.io.tmpdir"));
|
|
||||||
System.err.println("java.vendor" + ": " + System.getProperty("java.vendor"));
|
|
||||||
System.err.println("java.version" + ": " + System.getProperty("java.version"));
|
|
||||||
System.err.println("os.arch" + ": " + System.getProperty("os.arch"));
|
|
||||||
System.err.println("os.name" + ": " + System.getProperty("os.name"));
|
|
||||||
System.err.println("os.version" + ": " + System.getProperty("os.version"));
|
|
||||||
System.err.println("user.dir" + ": " + System.getProperty("user.dir"));
|
|
||||||
System.err.println("user.home" + ": " + System.getProperty("user.home"));
|
|
||||||
System.err.println("user.name" + ": " + System.getProperty("user.name"));
|
|
||||||
System.err.println("getFilesDir()" + ": " + myDir);
|
|
||||||
System.err.println("Package" + ": " + ctx.getPackageName());
|
|
||||||
System.err.println("Version" + ": " + getOurVersion());
|
|
||||||
System.err.println("MODEL" + ": " + Build.MODEL);
|
|
||||||
System.err.println("DISPLAY" + ": " + Build.DISPLAY);
|
|
||||||
System.err.println("VERSION" + ": " + Build.VERSION.RELEASE);
|
|
||||||
System.err.println("SDK" + ": " + Build.VERSION.SDK);
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getOurVersion() {
|
|
||||||
PackageManager pm = ctx.getPackageManager();
|
|
||||||
String us = ctx.getPackageName();
|
|
||||||
try {
|
|
||||||
PackageInfo pi = pm.getPackageInfo(us, 0);
|
|
||||||
System.err.println("VersionCode" + ": " + pi.versionCode);
|
|
||||||
if (pi.versionName != null)
|
|
||||||
return pi.versionName;
|
|
||||||
} catch (Exception e) {}
|
|
||||||
return "??";
|
|
||||||
}
|
|
||||||
|
|
||||||
void initialize() {
|
|
||||||
mergeResourceToFile(R.raw.router_config, "router.config");
|
|
||||||
mergeResourceToFile(R.raw.logger_config, "logger.config");
|
|
||||||
copyResourceToFile(R.raw.blocklist_txt, "blocklist.txt");
|
|
||||||
|
|
||||||
// Set up the locations so Router and WorkingDir can find them
|
|
||||||
System.setProperty("i2p.dir.base", myDir);
|
|
||||||
System.setProperty("i2p.dir.config", myDir);
|
|
||||||
System.setProperty("wrapper.logfile", myDir + "/wrapper.log");
|
|
||||||
}
|
|
||||||
|
|
||||||
private void copyResourceToFile(int resID, String f) {
|
|
||||||
InputStream in = null;
|
|
||||||
FileOutputStream out = null;
|
|
||||||
|
|
||||||
System.err.println("Creating file " + f + " from resource");
|
|
||||||
byte buf[] = new byte[4096];
|
|
||||||
try {
|
|
||||||
// Context methods
|
|
||||||
in = ctx.getResources().openRawResource(resID);
|
|
||||||
out = ctx.openFileOutput(f, 0);
|
|
||||||
|
|
||||||
int read = 0;
|
|
||||||
while ( (read = in.read(buf)) != -1)
|
|
||||||
out.write(buf, 0, read);
|
|
||||||
|
|
||||||
} catch (IOException ioe) {
|
|
||||||
} catch (Resources.NotFoundException nfe) {
|
|
||||||
} finally {
|
|
||||||
if (in != null) try { in.close(); } catch (IOException ioe) {}
|
|
||||||
if (out != null) try { out.close(); } catch (IOException ioe) {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Load defaults from resource,
|
|
||||||
* then add props from file,
|
|
||||||
* and write back
|
|
||||||
*/
|
|
||||||
private void mergeResourceToFile(int resID, String f) {
|
|
||||||
InputStream in = null;
|
|
||||||
InputStream fin = null;
|
|
||||||
|
|
||||||
byte buf[] = new byte[4096];
|
|
||||||
try {
|
|
||||||
Properties props = new OrderedProperties();
|
|
||||||
in = ctx.getResources().openRawResource(resID);
|
|
||||||
DataHelper.loadProps(props, in);
|
|
||||||
|
|
||||||
try {
|
|
||||||
fin = ctx.openFileInput(f);
|
|
||||||
DataHelper.loadProps(props, fin);
|
|
||||||
System.err.println("Merging resource into file " + f);
|
|
||||||
} catch (IOException ioe) {
|
|
||||||
System.err.println("Creating file " + f + " from resource");
|
|
||||||
} finally {
|
|
||||||
if (fin != null) try { fin.close(); } catch (IOException ioe) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
DataHelper.storeProps(props, ctx.getFileStreamPath(f));
|
|
||||||
} catch (IOException ioe) {
|
|
||||||
} catch (Resources.NotFoundException nfe) {
|
|
||||||
} finally {
|
|
||||||
if (in != null) try { in.close(); } catch (IOException ioe) {}
|
|
||||||
if (fin != null) try { fin.close(); } catch (IOException ioe) {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@@ -1,137 +0,0 @@
|
|||||||
package net.i2p.android.router.service;
|
|
||||||
|
|
||||||
import android.app.Service;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.os.IBinder;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import net.i2p.android.router.R;
|
|
||||||
import net.i2p.router.Router;
|
|
||||||
import net.i2p.router.RouterContext;
|
|
||||||
import net.i2p.router.RouterLaunch;
|
|
||||||
import net.i2p.util.NativeBigInteger;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Runs the router
|
|
||||||
*/
|
|
||||||
public class RouterService extends Service {
|
|
||||||
private RouterContext _context;
|
|
||||||
private String _myDir;
|
|
||||||
private int _state;
|
|
||||||
private Thread _starterThread;
|
|
||||||
private StatusBar _statusBar;
|
|
||||||
private final Object _stateLock = new Object();
|
|
||||||
|
|
||||||
private static final int STATE_INIT = 0;
|
|
||||||
private static final int STATE_STARTING = 1;
|
|
||||||
private static final int STATE_RUNNING = 2;
|
|
||||||
private static final int STATE_STOPPING = 3;
|
|
||||||
private static final int STATE_STOPPED = 4;
|
|
||||||
|
|
||||||
private static final String MARKER = "************************************** ";
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreate() {
|
|
||||||
System.err.println(this + " onCreate called" +
|
|
||||||
" Current state is: " + _state);
|
|
||||||
|
|
||||||
_myDir = getFilesDir().getAbsolutePath();
|
|
||||||
Init init = new Init(this);
|
|
||||||
init.debugStuff();
|
|
||||||
init.initialize();
|
|
||||||
_statusBar = new StatusBar(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int onStartCommand(Intent intent, int flags, int startId) {
|
|
||||||
System.err.println(this + " onStart called" +
|
|
||||||
"Current state is: " + _state);
|
|
||||||
synchronized (_stateLock) {
|
|
||||||
if (_state != STATE_INIT)
|
|
||||||
return START_STICKY;
|
|
||||||
_statusBar.update("I2P is starting up");
|
|
||||||
_state = STATE_STARTING;
|
|
||||||
_starterThread = new Thread(new Starter());
|
|
||||||
_starterThread.start();
|
|
||||||
}
|
|
||||||
return START_STICKY;
|
|
||||||
}
|
|
||||||
|
|
||||||
private class Starter implements Runnable {
|
|
||||||
public void run() {
|
|
||||||
System.err.println(MARKER + this + " starter thread");
|
|
||||||
NativeBigInteger.main(null);
|
|
||||||
RouterLaunch.main(null);
|
|
||||||
synchronized (_stateLock) {
|
|
||||||
if (_state != STATE_STARTING)
|
|
||||||
return;
|
|
||||||
_state = STATE_RUNNING;
|
|
||||||
List contexts = RouterContext.listContexts();
|
|
||||||
if ( (contexts == null) || (contexts.isEmpty()) )
|
|
||||||
throw new IllegalStateException("No contexts. This is usually because the router is either starting up or shutting down.");
|
|
||||||
_statusBar.update("I2P is running");
|
|
||||||
_context = (RouterContext)contexts.get(0);
|
|
||||||
_context.router().setKillVMOnEnd(false);
|
|
||||||
_context.addShutdownTask(new ShutdownHook());
|
|
||||||
_starterThread = null;
|
|
||||||
}
|
|
||||||
System.err.println("Router.main finished");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public IBinder onBind(Intent intent)
|
|
||||||
{
|
|
||||||
System.err.println("onBind called" +
|
|
||||||
"Current state is: " + _state);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onDestroy() {
|
|
||||||
System.err.println("onDestroy called" +
|
|
||||||
"Current state is: " + _state);
|
|
||||||
synchronized (_stateLock) {
|
|
||||||
if (_state == STATE_STARTING)
|
|
||||||
_starterThread.interrupt();
|
|
||||||
if (_state == STATE_STARTING || _state == STATE_RUNNING) {
|
|
||||||
_state = STATE_STOPPING;
|
|
||||||
// should this be in a thread?
|
|
||||||
_statusBar.update("I2P is stopping");
|
|
||||||
Thread stopperThread = new Thread(new Stopper());
|
|
||||||
stopperThread.start();
|
|
||||||
} else if (_state != STATE_STOPPING) {
|
|
||||||
_statusBar.off(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class Stopper implements Runnable {
|
|
||||||
public void run() {
|
|
||||||
System.err.println(MARKER + this + " stopper thread");
|
|
||||||
_context.router().shutdown(Router.EXIT_HARD);
|
|
||||||
_statusBar.off(RouterService.this);
|
|
||||||
System.err.println("shutdown complete");
|
|
||||||
synchronized (_stateLock) {
|
|
||||||
_state = STATE_STOPPED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class ShutdownHook implements Runnable {
|
|
||||||
public void run() {
|
|
||||||
System.err.println(this + " shutdown hook" +
|
|
||||||
"Current state is: " + _state);
|
|
||||||
synchronized (_stateLock) {
|
|
||||||
if (_state == STATE_STARTING || _state == STATE_RUNNING) {
|
|
||||||
_state = STATE_STOPPED;
|
|
||||||
_statusBar.off(RouterService.this);
|
|
||||||
stopSelf();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,45 +0,0 @@
|
|||||||
package net.i2p.android.router.service;
|
|
||||||
|
|
||||||
import android.app.Notification;
|
|
||||||
import android.app.NotificationManager;
|
|
||||||
import android.app.PendingIntent;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
|
|
||||||
import net.i2p.android.router.R;
|
|
||||||
import net.i2p.android.router.activity.MainActivity;
|
|
||||||
|
|
||||||
public class StatusBar {
|
|
||||||
|
|
||||||
private final Context ctx;
|
|
||||||
private final Intent intent;
|
|
||||||
private final Notification notif;
|
|
||||||
private final NotificationManager mgr;
|
|
||||||
|
|
||||||
private static final int ID = 1;
|
|
||||||
|
|
||||||
StatusBar(Context cx) {
|
|
||||||
ctx = cx;
|
|
||||||
String ns = Context.NOTIFICATION_SERVICE;
|
|
||||||
mgr = (NotificationManager)ctx.getSystemService(ns);
|
|
||||||
|
|
||||||
int icon = R.drawable.ic_launcher_itoopie;
|
|
||||||
String text = "Starting I2P";
|
|
||||||
long now = System.currentTimeMillis();
|
|
||||||
notif = new Notification(icon, text, now);
|
|
||||||
notif.flags |= Notification.FLAG_ONGOING_EVENT | Notification.FLAG_NO_CLEAR;
|
|
||||||
intent = new Intent(ctx, MainActivity.class);
|
|
||||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void update(String details) {
|
|
||||||
String title = "I2P Status";
|
|
||||||
PendingIntent pi = PendingIntent.getActivity(ctx, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
|
|
||||||
notif.setLatestEventInfo(ctx, title, details, pi);
|
|
||||||
mgr.notify(ID, notif);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void off(Context ctx) {
|
|
||||||
mgr.cancel(ID);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,174 +0,0 @@
|
|||||||
package net.i2p.util;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* public domain
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileOutputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.OutputStream;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Queue;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* bridge to android logging
|
|
||||||
*
|
|
||||||
* @author zzz
|
|
||||||
*/
|
|
||||||
class LogWriter implements Runnable {
|
|
||||||
private final static long CONFIG_READ_ITERVAL = 10 * 1000;
|
|
||||||
private long _lastReadConfig = 0;
|
|
||||||
private long _numBytesInCurrentFile = 0;
|
|
||||||
private OutputStream _currentOut; // = System.out
|
|
||||||
private int _rotationNum = -1;
|
|
||||||
private String _logFilenamePattern;
|
|
||||||
private File _currentFile;
|
|
||||||
private LogManager _manager;
|
|
||||||
|
|
||||||
private boolean _write;
|
|
||||||
|
|
||||||
private LogWriter() { // nop
|
|
||||||
}
|
|
||||||
|
|
||||||
public LogWriter(LogManager manager) {
|
|
||||||
_manager = manager;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void stopWriting() {
|
|
||||||
_write = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void run() {
|
|
||||||
_write = true;
|
|
||||||
try {
|
|
||||||
while (_write) {
|
|
||||||
flushRecords();
|
|
||||||
rereadConfig();
|
|
||||||
}
|
|
||||||
System.err.println("Done writing");
|
|
||||||
} catch (Exception e) {
|
|
||||||
System.err.println("Error writing the logs: " + e.getMessage());
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void flushRecords() { flushRecords(true); }
|
|
||||||
public void flushRecords(boolean shouldWait) {
|
|
||||||
try {
|
|
||||||
// zero copy, drain the manager queue directly
|
|
||||||
Queue<LogRecord> records = _manager.getQueue();
|
|
||||||
if (records == null) return;
|
|
||||||
if (!records.isEmpty()) {
|
|
||||||
LogRecord rec;
|
|
||||||
while ((rec = records.poll()) != null) {
|
|
||||||
writeRecord(rec);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
if (_currentOut != null)
|
|
||||||
_currentOut.flush();
|
|
||||||
} catch (IOException ioe) {
|
|
||||||
//if (++_diskFullMessageCount < MAX_DISKFULL_MESSAGES)
|
|
||||||
System.err.println("Error writing the router log - disk full? " + ioe);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Throwable t) {
|
|
||||||
t.printStackTrace();
|
|
||||||
} finally {
|
|
||||||
if (shouldWait) {
|
|
||||||
try {
|
|
||||||
synchronized (this) {
|
|
||||||
this.wait(10*1000);
|
|
||||||
}
|
|
||||||
} catch (InterruptedException ie) { // nop
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public String currentFile() {
|
|
||||||
return _currentFile != null ? _currentFile.getAbsolutePath() : "uninitialized";
|
|
||||||
}
|
|
||||||
|
|
||||||
private void rereadConfig() {
|
|
||||||
long now = Clock.getInstance().now();
|
|
||||||
if (now - _lastReadConfig > CONFIG_READ_ITERVAL) {
|
|
||||||
_manager.rereadConfig();
|
|
||||||
_lastReadConfig = now;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void writeRecord(LogRecord rec) {
|
|
||||||
if (rec.getThrowable() == null)
|
|
||||||
log(rec.getPriority(), rec.getSource(), rec.getSourceName(), rec.getThreadName(), rec.getMessage());
|
|
||||||
else
|
|
||||||
log(rec.getPriority(), rec.getSource(), rec.getSourceName(), rec.getThreadName(), rec.getMessage(), rec.getThrowable());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void log(int priority, Class src, String name, String threadName, String msg) {
|
|
||||||
if (src != null) {
|
|
||||||
String tag = src.getName();
|
|
||||||
int dot = tag.lastIndexOf(".");
|
|
||||||
if (dot >= 0)
|
|
||||||
tag = tag.substring(dot + 1);
|
|
||||||
android.util.Log.println(toAndroidLevel(priority),
|
|
||||||
tag,
|
|
||||||
'[' + threadName + "] " + msg);
|
|
||||||
} else if (name != null)
|
|
||||||
android.util.Log.println(toAndroidLevel(priority),
|
|
||||||
name,
|
|
||||||
'[' + threadName + "] " + msg);
|
|
||||||
else
|
|
||||||
android.util.Log.println(toAndroidLevel(priority),
|
|
||||||
threadName, msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void log(int priority, Class src, String name, String threadName, String msg, Throwable t) {
|
|
||||||
if (src != null) {
|
|
||||||
String tag = src.getName();
|
|
||||||
int dot = tag.lastIndexOf(".");
|
|
||||||
if (dot >= 0)
|
|
||||||
tag = tag.substring(dot + 1);
|
|
||||||
android.util.Log.println(toAndroidLevel(priority),
|
|
||||||
tag,
|
|
||||||
'[' + threadName + "] " + msg +
|
|
||||||
' ' + t.toString() + ' ' + android.util.Log.getStackTraceString(t));
|
|
||||||
} else if (name != null)
|
|
||||||
android.util.Log.println(toAndroidLevel(priority),
|
|
||||||
name,
|
|
||||||
'[' + threadName + "] " + msg +
|
|
||||||
' ' + t.toString() + ' ' + android.util.Log.getStackTraceString(t));
|
|
||||||
else
|
|
||||||
android.util.Log.println(toAndroidLevel(priority),
|
|
||||||
threadName,
|
|
||||||
msg + ' ' + t.toString() + ' ' + android.util.Log.getStackTraceString(t));
|
|
||||||
}
|
|
||||||
|
|
||||||
private static int toAndroidLevel(int level) {
|
|
||||||
switch (level) {
|
|
||||||
case Log.DEBUG:
|
|
||||||
return android.util.Log.DEBUG;
|
|
||||||
case Log.INFO:
|
|
||||||
return android.util.Log.INFO;
|
|
||||||
case Log.WARN:
|
|
||||||
return android.util.Log.WARN;
|
|
||||||
case Log.ERROR:
|
|
||||||
case Log.CRIT:
|
|
||||||
default:
|
|
||||||
return android.util.Log.ERROR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final String replace(String pattern, int num) {
|
|
||||||
char c[] = pattern.toCharArray();
|
|
||||||
StringBuffer buf = new StringBuffer();
|
|
||||||
for (int i = 0; i < c.length; i++) {
|
|
||||||
if ( (c[i] != '#') && (c[i] != '@') )
|
|
||||||
buf.append(c[i]);
|
|
||||||
else
|
|
||||||
buf.append(num);
|
|
||||||
}
|
|
||||||
return buf.toString();
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,22 +0,0 @@
|
|||||||
package net.i2p.util;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* setXXX() not available until API level 9 (Platform Version 2.3)
|
|
||||||
* @since 0.8.7
|
|
||||||
*/
|
|
||||||
public class SecureDirectory extends File {
|
|
||||||
|
|
||||||
public SecureDirectory(String pathname) {
|
|
||||||
super(pathname);
|
|
||||||
}
|
|
||||||
|
|
||||||
public SecureDirectory(String parent, String child) {
|
|
||||||
super(parent, child);
|
|
||||||
}
|
|
||||||
|
|
||||||
public SecureDirectory(File parent, String child) {
|
|
||||||
super(parent, child);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,22 +0,0 @@
|
|||||||
package net.i2p.util;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* setXXX() not available until API level 9 (Platform Version 2.3)
|
|
||||||
* @since 0.8.7
|
|
||||||
*/
|
|
||||||
public class SecureFile extends SecureDirectory {
|
|
||||||
|
|
||||||
public SecureFile(String pathname) {
|
|
||||||
super(pathname);
|
|
||||||
}
|
|
||||||
|
|
||||||
public SecureFile(String parent, String child) {
|
|
||||||
super(parent, child);
|
|
||||||
}
|
|
||||||
|
|
||||||
public SecureFile(File parent, String child) {
|
|
||||||
super(parent, child);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,53 +0,0 @@
|
|||||||
package net.i2p.util;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileNotFoundException;
|
|
||||||
import java.io.FileOutputStream;
|
|
||||||
|
|
||||||
import net.i2p.I2PAppContext;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* setXXX() not available until API level 9 (Platform Version 2.3)
|
|
||||||
* @since 0.8.7
|
|
||||||
*/
|
|
||||||
public class SecureFileOutputStream extends FileOutputStream {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* super()
|
|
||||||
*/
|
|
||||||
public SecureFileOutputStream(String file) throws FileNotFoundException {
|
|
||||||
super(file);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* super()
|
|
||||||
*/
|
|
||||||
public SecureFileOutputStream(String file, boolean append) throws FileNotFoundException {
|
|
||||||
super(file, append);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* super()
|
|
||||||
*/
|
|
||||||
public SecureFileOutputStream(File file) throws FileNotFoundException {
|
|
||||||
super(file);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* super()
|
|
||||||
*/
|
|
||||||
public SecureFileOutputStream(File file, boolean append) throws FileNotFoundException {
|
|
||||||
super(file, append);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @return false */
|
|
||||||
static boolean canSetPerms() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* noop
|
|
||||||
*/
|
|
||||||
public static void setPerms(File f) {
|
|
||||||
}
|
|
||||||
}
|
|
Binary file not shown.
Reference in New Issue
Block a user