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