- Add FileStreamFactory and I2PFile to deal with the problems from
the code CWD is / but the only writable directory is /data/data/net.i2p.router/files/ - still a ton of places to be fixed, will be fixed up as things get working - Load some config files from resources at startup - Fix up logging - Add reseed capability, by copying some code over from routerconsole - Deal with conflicting bouncycastle libs
This commit is contained in:
@ -3,9 +3,11 @@
|
|||||||
package="net.i2p.router"
|
package="net.i2p.router"
|
||||||
android:versionCode="1"
|
android:versionCode="1"
|
||||||
android:versionName="1.0.0">
|
android:versionName="1.0.0">
|
||||||
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<application android:label="@string/app_name">
|
<application android:label="@string/app_name">
|
||||||
<activity android:name=".I2PAndroid"
|
<activity android:name=".I2PAndroid"
|
||||||
android:label="@string/app_name">
|
android:label="@string/app_name"
|
||||||
|
android:launchMode="singleTask" >
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.MAIN" />
|
||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
@ -101,12 +101,15 @@
|
|||||||
<echo>Creating output directories if needed...</echo>
|
<echo>Creating output directories if needed...</echo>
|
||||||
<mkdir dir="${outdir}" />
|
<mkdir dir="${outdir}" />
|
||||||
<mkdir dir="${outdir-classes}" />
|
<mkdir dir="${outdir-classes}" />
|
||||||
|
<mkdir dir="${external-libs}" />
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<target name="clean">
|
<target name="clean">
|
||||||
<delete dir="${outdir}" />
|
<delete dir="${outdir}" />
|
||||||
<delete dir="${external-libs}" />
|
<delete dir="${external-libs}" />
|
||||||
<delete dir="tmp/" />
|
<delete dir="tmp/" />
|
||||||
|
<delete dir="res/drawable/" />
|
||||||
|
<delete file="res/raw/blocklist_txt" />
|
||||||
<delete file="${outdir-r}/net/i2p/router/R.java" />
|
<delete file="${outdir-r}/net/i2p/router/R.java" />
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
@ -140,7 +143,7 @@
|
|||||||
</target>
|
</target>
|
||||||
|
|
||||||
<!-- Compile this project's .java files into .class files. -->
|
<!-- Compile this project's .java files into .class files. -->
|
||||||
<target name="compile" depends="dirs, resource-src, aidl, buildrouter">
|
<target name="compile" depends="buildrouter, dirs, resource-src, aidl">
|
||||||
<javac encoding="ascii" target="1.5" debug="true" extdirs=""
|
<javac encoding="ascii" target="1.5" debug="true" extdirs=""
|
||||||
srcdir="."
|
srcdir="."
|
||||||
destdir="${outdir-classes}"
|
destdir="${outdir-classes}"
|
||||||
@ -151,18 +154,68 @@
|
|||||||
</javac>
|
</javac>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<target name="buildrouter">
|
<target name="buildrouter" depends="dirs" >
|
||||||
|
<!-- for now, we just need the ReseedHandler from routerconsole -->
|
||||||
|
<ant dir="../apps/routerconsole/java" target="compile" />
|
||||||
|
<jar destfile="${external-libs}/routerconsole.jar" >
|
||||||
|
<fileset dir="../apps/routerconsole/java/build/obj/" >
|
||||||
|
<include name="net/i2p/router/web/ContextHelper.class" />
|
||||||
|
<include name="net/i2p/router/web/ReseedHandler.class" />
|
||||||
|
<include name="net/i2p/router/web/ReseedHandler$ReseedRunner.class" />
|
||||||
|
</fileset>
|
||||||
|
</jar>
|
||||||
|
|
||||||
|
<!-- build router and core (actually the routerconsole builds these anyway) -->
|
||||||
<ant dir=".." target="buildrouter" />
|
<ant dir=".." target="buildrouter" />
|
||||||
|
|
||||||
|
<!-- router -->
|
||||||
<copy file="../build/router.jar" todir="${external-libs}" />
|
<copy file="../build/router.jar" todir="${external-libs}" />
|
||||||
|
|
||||||
|
<!-- core -->
|
||||||
<mkdir dir="tmp" />
|
<mkdir dir="tmp" />
|
||||||
<unjar src="../build/i2p.jar" dest="tmp/" />
|
<unjar src="../build/i2p.jar" dest="tmp/" />
|
||||||
<delete file="tmp/net/i2p/util/LogWriter.class" />
|
<delete file="tmp/net/i2p/util/LogWriter.class" />
|
||||||
<!-- lots of unneeded stuff, like Log* -->
|
<delete file="tmp/net/i2p/util/FileStreamFactory.class" />
|
||||||
|
<delete file="tmp/net/i2p/util/I2PFile.class" />
|
||||||
|
<!-- 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="${external-libs}/crypto.jar" >
|
||||||
|
<fileset dir="tmp/" >
|
||||||
|
<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" />
|
||||||
|
</fileset>
|
||||||
|
</jar>
|
||||||
|
<delete>
|
||||||
|
<fileset dir="tmp/" >
|
||||||
|
<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" />
|
||||||
|
</fileset>
|
||||||
|
</delete>
|
||||||
|
<!--
|
||||||
|
<delete dir="tmp/org/bouncycastle/" />
|
||||||
|
<delete file="tmp/net/i2p/crypto/HMACGenerator.class" />
|
||||||
|
-->
|
||||||
|
<delete file="tmp/org/bouncycastle/" />
|
||||||
|
<!-- lots of unneeded stuff could be deleted here -->
|
||||||
<jar destfile="${external-libs}/i2p.jar" basedir="tmp/" />
|
<jar destfile="${external-libs}/i2p.jar" basedir="tmp/" />
|
||||||
|
|
||||||
|
<!-- some resources -->
|
||||||
|
<mkdir dir="res/drawable/" />
|
||||||
|
<copy file="../apps/routerconsole/jsp/i2plogo.png" todir="res/drawable/" />
|
||||||
|
<copy file="../installer/resources/blocklist.txt" tofile="res/raw/blocklist_txt" />
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="hackcleanup">
|
||||||
|
<delete file="${external-libs}/crypto.jar" />
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<!-- Convert this project's .class files into .dex files. -->
|
<!-- Convert this project's .class files into .dex files. -->
|
||||||
<target name="dex" depends="compile">
|
<target name="dex" depends="compile, hackcleanup">
|
||||||
<echo>Converting compiled files and external libraries into ${outdir}/${dex-file}...</echo>
|
<echo>Converting compiled files and external libraries into ${outdir}/${dex-file}...</echo>
|
||||||
<apply executable="${dx}" failonerror="true" parallel="true">
|
<apply executable="${dx}" failonerror="true" parallel="true">
|
||||||
<!-- this is a bad sign that we need this -->
|
<!-- this is a bad sign that we need this -->
|
||||||
|
@ -9,5 +9,10 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="Hello World, I2PAndroid"
|
android:text="Hello World, I2PAndroid"
|
||||||
/>
|
/>
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:src="@drawable/i2plogo"
|
||||||
|
/>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
3
android/res/raw/logger_config
Normal file
3
android/res/raw/logger_config
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
logger.defaultLevel=INFO
|
||||||
|
logger.record.net.i2p.router.transport.FIFOBandwidthRefiller=ERROR
|
||||||
|
logger.record.net.i2p.stat.Rate=ERROR
|
7
android/res/raw/router_config
Normal file
7
android/res/raw/router_config
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
# initial router.config
|
||||||
|
# save memory
|
||||||
|
router.prng.buffers=2
|
||||||
|
router.decayingBloomFilterM=20
|
||||||
|
stat.full=false
|
||||||
|
# no I2CP
|
||||||
|
i2p.dummyClientFacade=true
|
@ -1,18 +1,118 @@
|
|||||||
package net.i2p.router;
|
package net.i2p.router;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.res.Resources;
|
||||||
|
import android.content.res.Resources.NotFoundException;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
import net.i2p.router.Router;
|
import net.i2p.router.Router;
|
||||||
|
import net.i2p.router.web.ReseedChecker;
|
||||||
|
import net.i2p.util.I2PFile;
|
||||||
|
|
||||||
public class I2PAndroid extends Activity
|
public class I2PAndroid extends Activity
|
||||||
{
|
{
|
||||||
|
static Context _context;
|
||||||
|
|
||||||
/** Called when the activity is first created. */
|
/** Called when the activity is first created. */
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle savedInstanceState)
|
public void onCreate(Bundle savedInstanceState)
|
||||||
{
|
{
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
setContentView(R.layout.main);
|
setContentView(R.layout.main);
|
||||||
|
|
||||||
|
_context = this; // Activity extends Context
|
||||||
|
debugStuff();
|
||||||
|
initialize();
|
||||||
|
|
||||||
Router.main(null);
|
Router.main(null);
|
||||||
|
System.err.println("Router.main finished");
|
||||||
|
|
||||||
|
ReseedChecker.checkReseed();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void onRestart()
|
||||||
|
{
|
||||||
|
System.err.println("onRestart called");
|
||||||
|
super.onRestart();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onResume()
|
||||||
|
{
|
||||||
|
System.err.println("onResume called");
|
||||||
|
super.onResume();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onPause()
|
||||||
|
{
|
||||||
|
System.err.println("onPause called");
|
||||||
|
super.onPause();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onStop()
|
||||||
|
{
|
||||||
|
System.err.println("onStop called");
|
||||||
|
super.onStop();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onDestroy()
|
||||||
|
{
|
||||||
|
System.err.println("onDestroy called");
|
||||||
|
super.onDestroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Context getContext() {
|
||||||
|
return _context;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void debugStuff() {
|
||||||
|
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"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initialize() {
|
||||||
|
// Until we can edit the router.config on the device,
|
||||||
|
// copy it from the resource every time.
|
||||||
|
// File f = new I2PFile("router.config");
|
||||||
|
// if (!f.exists()) {
|
||||||
|
copyResourceToFile(R.raw.router_config, "router.config");
|
||||||
|
copyResourceToFile(R.raw.logger_config, "logger.config");
|
||||||
|
copyResourceToFile(R.raw.blocklist_txt, "blocklist.txt");
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
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 = getResources().openRawResource(resID);
|
||||||
|
out = 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) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
37
android/src/net/i2p/router/web/ReseedChecker.java
Normal file
37
android/src/net/i2p/router/web/ReseedChecker.java
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
package net.i2p.router.web;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
import net.i2p.router.web.ReseedHandler;
|
||||||
|
import net.i2p.util.I2PFile;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copied from RouterConsoleRunner.java
|
||||||
|
*/
|
||||||
|
public class ReseedChecker {
|
||||||
|
|
||||||
|
public static void checkReseed() {
|
||||||
|
|
||||||
|
System.err.println("Checking to see if we should reseed");
|
||||||
|
// we check the i2p installation directory (.) for a flag telling us not to reseed,
|
||||||
|
// but also check the home directory for that flag too, since new users installing i2p
|
||||||
|
// don't have an installation directory that they can put the flag in yet.
|
||||||
|
File noReseedFile = new I2PFile(new I2PFile(System.getProperty("user.home")), ".i2pnoreseed");
|
||||||
|
File noReseedFileAlt1 = new I2PFile(new I2PFile(System.getProperty("user.home")), "noreseed.i2p");
|
||||||
|
File noReseedFileAlt2 = new I2PFile(".i2pnoreseed");
|
||||||
|
File noReseedFileAlt3 = new I2PFile("noreseed.i2p");
|
||||||
|
if (!noReseedFile.exists() && !noReseedFileAlt1.exists() && !noReseedFileAlt2.exists() && !noReseedFileAlt3.exists()) {
|
||||||
|
File netDb = new I2PFile("netDb");
|
||||||
|
// sure, some of them could be "my.info" or various leaseSet- files, but chances are,
|
||||||
|
// if someone has those files, they've already been seeded (at least enough to let them
|
||||||
|
// get i2p started - they can reseed later in the web console)
|
||||||
|
String names[] = (netDb.exists() ? netDb.list() : null);
|
||||||
|
if ( (names == null) || (names.length < 15) ) {
|
||||||
|
System.err.println("Yes, reseeding now");
|
||||||
|
ReseedHandler reseedHandler = new ReseedHandler();
|
||||||
|
reseedHandler.requestReseed();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
64
android/src/net/i2p/util/FileStreamFactory.java
Normal file
64
android/src/net/i2p/util/FileStreamFactory.java
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
/*
|
||||||
|
* This is free software, do as you please.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package net.i2p.util;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
|
||||||
|
import net.i2p.router.I2PAndroid;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use android static file stream methods
|
||||||
|
* gaaah:
|
||||||
|
* 1) the CWD is /
|
||||||
|
* 2) we can only access /data/data/net.i2p.router/files/
|
||||||
|
* 3) you can't change your CWD in Java
|
||||||
|
* so we have this lovely and the one in I2PFile.
|
||||||
|
*
|
||||||
|
* @author zzz
|
||||||
|
*/
|
||||||
|
public class FileStreamFactory {
|
||||||
|
private static final String DIR = "/data/data/net.i2p.router/files/";
|
||||||
|
|
||||||
|
/** hopefully no path separators in string */
|
||||||
|
public static FileInputStream getFileInputStream(String f) throws FileNotFoundException {
|
||||||
|
System.err.println("Input file-s: " + I2PAndroid.getContext().getFileStreamPath(f).getAbsolutePath());
|
||||||
|
return I2PAndroid.getContext().openFileInput(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static FileInputStream getFileInputStream(File f) throws FileNotFoundException {
|
||||||
|
System.err.println("Input file-f: " + getPath(f) +
|
||||||
|
' ' + f.getAbsolutePath());
|
||||||
|
//return I2PAndroid.getContext().openFileInput(f.getName());
|
||||||
|
return new FileInputStream(getPath(f));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** hopefully no path separators in string */
|
||||||
|
public static FileOutputStream getFileOutputStream(String f) throws FileNotFoundException {
|
||||||
|
System.err.println("Output file-s: " + I2PAndroid.getContext().getFileStreamPath(f).getAbsolutePath());
|
||||||
|
return I2PAndroid.getContext().openFileOutput(f, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static FileOutputStream getFileOutputStream(File f) throws FileNotFoundException {
|
||||||
|
System.err.println("Output file-f: " + getPath(f) +
|
||||||
|
' ' + f.getAbsolutePath());
|
||||||
|
//return I2PAndroid.getContext().openFileOutput(f.getName(), 0);
|
||||||
|
return new FileOutputStream(getPath(f));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* preserve path but convert /foo/blah to /data/data/net.i2p.router/files/foo/blah
|
||||||
|
* Although if the File arg was created with new I2PFile() then this isn't required
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private static String getPath(File f) {
|
||||||
|
String abs = f.getAbsolutePath();
|
||||||
|
if (abs.startsWith(DIR))
|
||||||
|
return abs;
|
||||||
|
return DIR + abs.substring(1); // strip extra '/'
|
||||||
|
}
|
||||||
|
}
|
29
android/src/net/i2p/util/I2PFile.java
Normal file
29
android/src/net/i2p/util/I2PFile.java
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
/*
|
||||||
|
* This is free software, do as you please.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package net.i2p.util;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gaaah:
|
||||||
|
* 1) the CWD is /
|
||||||
|
* 2) we can only access /data/data/net.i2p.router/files/
|
||||||
|
* 3) you can't change your CWD in Java
|
||||||
|
* so we have this lovely and the one in FileStreamFactory.
|
||||||
|
*
|
||||||
|
* @author zzz
|
||||||
|
*/
|
||||||
|
public class I2PFile extends File {
|
||||||
|
|
||||||
|
public I2PFile (String f) {
|
||||||
|
super("/data/data/net.i2p.router/files/" + f);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** one level deep only */
|
||||||
|
public I2PFile (File p, String f) {
|
||||||
|
super("/data/data/net.i2p.router/files/" + p.getName(), f);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -87,36 +87,44 @@ class LogWriter implements Runnable {
|
|||||||
|
|
||||||
private void writeRecord(LogRecord rec) {
|
private void writeRecord(LogRecord rec) {
|
||||||
if (rec.getThrowable() == null)
|
if (rec.getThrowable() == null)
|
||||||
log(rec.getPriority(), rec.getSourceName(), null, rec.getThreadName(), rec.getMessage());
|
log(rec.getPriority(), rec.getSource(), rec.getSourceName(), rec.getThreadName(), rec.getMessage());
|
||||||
else
|
else
|
||||||
log(rec.getPriority(), rec.getSourceName(), null, rec.getThreadName(), rec.getMessage(), rec.getThrowable());
|
log(rec.getPriority(), rec.getSource(), rec.getSourceName(), rec.getThreadName(), rec.getMessage(), rec.getThrowable());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void log(int priority, String className, String name, String threadName, String msg) {
|
public void log(int priority, Class src, String name, String threadName, String msg) {
|
||||||
if (className != null)
|
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),
|
android.util.Log.println(toAndroidLevel(priority),
|
||||||
className,
|
tag,
|
||||||
threadName + ' ' + msg);
|
'[' + threadName + "] " + msg);
|
||||||
else if (name != null)
|
} else if (name != null)
|
||||||
android.util.Log.println(toAndroidLevel(priority),
|
android.util.Log.println(toAndroidLevel(priority),
|
||||||
name,
|
name,
|
||||||
threadName + ' ' + msg);
|
'[' + threadName + "] " + msg);
|
||||||
else
|
else
|
||||||
android.util.Log.println(toAndroidLevel(priority),
|
android.util.Log.println(toAndroidLevel(priority),
|
||||||
threadName, msg);
|
threadName, msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void log(int priority, String className, String name, String threadName, String msg, Throwable t) {
|
public void log(int priority, Class src, String name, String threadName, String msg, Throwable t) {
|
||||||
if (className != null)
|
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),
|
android.util.Log.println(toAndroidLevel(priority),
|
||||||
className,
|
tag,
|
||||||
threadName + ' ' + msg +
|
'[' + threadName + "] " + msg +
|
||||||
msg + ' ' + t.toString() + ' ' + android.util.Log.getStackTraceString(t));
|
' ' + t.toString() + ' ' + android.util.Log.getStackTraceString(t));
|
||||||
else if (name != null)
|
} else if (name != null)
|
||||||
android.util.Log.println(toAndroidLevel(priority),
|
android.util.Log.println(toAndroidLevel(priority),
|
||||||
name,
|
name,
|
||||||
threadName + ' ' + msg +
|
'[' + threadName + "] " + msg +
|
||||||
msg + ' ' + t.toString() + ' ' + android.util.Log.getStackTraceString(t));
|
' ' + t.toString() + ' ' + android.util.Log.getStackTraceString(t));
|
||||||
else
|
else
|
||||||
android.util.Log.println(toAndroidLevel(priority),
|
android.util.Log.println(toAndroidLevel(priority),
|
||||||
threadName,
|
threadName,
|
||||||
|
@ -15,6 +15,8 @@ import java.util.StringTokenizer;
|
|||||||
import net.i2p.I2PAppContext;
|
import net.i2p.I2PAppContext;
|
||||||
import net.i2p.router.RouterContext;
|
import net.i2p.router.RouterContext;
|
||||||
import net.i2p.util.EepGet;
|
import net.i2p.util.EepGet;
|
||||||
|
import net.i2p.util.FileStreamFactory;
|
||||||
|
import net.i2p.util.I2PFile;
|
||||||
import net.i2p.util.I2PThread;
|
import net.i2p.util.I2PThread;
|
||||||
import net.i2p.util.Log;
|
import net.i2p.util.Log;
|
||||||
|
|
||||||
@ -250,11 +252,11 @@ public class ReseedHandler {
|
|||||||
|
|
||||||
private void writeSeed(String name, byte data[]) throws Exception {
|
private void writeSeed(String name, byte data[]) throws Exception {
|
||||||
String dirName = "netDb"; // _context.getProperty("router.networkDatabase.dbDir", "netDb");
|
String dirName = "netDb"; // _context.getProperty("router.networkDatabase.dbDir", "netDb");
|
||||||
File netDbDir = new File(dirName);
|
File netDbDir = new I2PFile(dirName);
|
||||||
if (!netDbDir.exists()) {
|
if (!netDbDir.exists()) {
|
||||||
boolean ok = netDbDir.mkdirs();
|
boolean ok = netDbDir.mkdirs();
|
||||||
}
|
}
|
||||||
FileOutputStream fos = new FileOutputStream(new File(netDbDir, "routerInfo-" + name + ".dat"));
|
FileOutputStream fos = FileStreamFactory.getFileOutputStream(new I2PFile(netDbDir, "routerInfo-" + name + ".dat"));
|
||||||
fos.write(data);
|
fos.write(data);
|
||||||
fos.close();
|
fos.close();
|
||||||
}
|
}
|
||||||
|
@ -37,6 +37,7 @@ import java.util.TreeMap;
|
|||||||
import java.util.zip.Deflater;
|
import java.util.zip.Deflater;
|
||||||
|
|
||||||
import net.i2p.util.ByteCache;
|
import net.i2p.util.ByteCache;
|
||||||
|
import net.i2p.util.FileStreamFactory;
|
||||||
import net.i2p.util.OrderedProperties;
|
import net.i2p.util.OrderedProperties;
|
||||||
import net.i2p.util.ReusableGZIPInputStream;
|
import net.i2p.util.ReusableGZIPInputStream;
|
||||||
import net.i2p.util.ReusableGZIPOutputStream;
|
import net.i2p.util.ReusableGZIPOutputStream;
|
||||||
@ -217,7 +218,7 @@ public class DataHelper {
|
|||||||
loadProps(props, file, false);
|
loadProps(props, file, false);
|
||||||
}
|
}
|
||||||
public static void loadProps(Properties props, File file, boolean forceLowerCase) throws IOException {
|
public static void loadProps(Properties props, File file, boolean forceLowerCase) throws IOException {
|
||||||
loadProps(props, new FileInputStream(file), forceLowerCase);
|
loadProps(props, FileStreamFactory.getFileInputStream(file), forceLowerCase);
|
||||||
}
|
}
|
||||||
public static void loadProps(Properties props, InputStream inStr) throws IOException {
|
public static void loadProps(Properties props, InputStream inStr) throws IOException {
|
||||||
loadProps(props, inStr, false);
|
loadProps(props, inStr, false);
|
||||||
|
36
core/java/src/net/i2p/util/FileStreamFactory.java
Normal file
36
core/java/src/net/i2p/util/FileStreamFactory.java
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* public domain
|
||||||
|
*/
|
||||||
|
|
||||||
|
package net.i2p.util;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is pulled out and replaced in the android build.
|
||||||
|
*
|
||||||
|
* @author zzz
|
||||||
|
*/
|
||||||
|
public class FileStreamFactory {
|
||||||
|
|
||||||
|
public static FileInputStream getFileInputStream(String f) throws FileNotFoundException {
|
||||||
|
return new FileInputStream(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static FileInputStream getFileInputStream(File f) throws FileNotFoundException {
|
||||||
|
return new FileInputStream(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static FileOutputStream getFileOutputStream(String f) throws FileNotFoundException {
|
||||||
|
return new FileOutputStream(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static FileOutputStream getFileOutputStream(File f) throws FileNotFoundException {
|
||||||
|
return new FileOutputStream(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
24
core/java/src/net/i2p/util/I2PFile.java
Normal file
24
core/java/src/net/i2p/util/I2PFile.java
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
/*
|
||||||
|
* public domain
|
||||||
|
*/
|
||||||
|
|
||||||
|
package net.i2p.util;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is pulled out and replaced in the android build.
|
||||||
|
*
|
||||||
|
* @author zzz
|
||||||
|
*/
|
||||||
|
public class I2PFile extends File {
|
||||||
|
|
||||||
|
public I2PFile (String f) {
|
||||||
|
super(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
public I2PFile (File p, String f) {
|
||||||
|
super(p, f);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -240,7 +240,7 @@ public class LogManager {
|
|||||||
//
|
//
|
||||||
|
|
||||||
private void loadConfig() {
|
private void loadConfig() {
|
||||||
File cfgFile = new File(_location);
|
File cfgFile = new I2PFile(_location);
|
||||||
if (!cfgFile.exists()) {
|
if (!cfgFile.exists()) {
|
||||||
if (!_alreadyNoticedMissingConfig) {
|
if (!_alreadyNoticedMissingConfig) {
|
||||||
if (_log.shouldLog(Log.WARN))
|
if (_log.shouldLog(Log.WARN))
|
||||||
@ -268,11 +268,11 @@ public class LogManager {
|
|||||||
Properties p = new Properties();
|
Properties p = new Properties();
|
||||||
FileInputStream fis = null;
|
FileInputStream fis = null;
|
||||||
try {
|
try {
|
||||||
fis = new FileInputStream(cfgFile);
|
fis = FileStreamFactory.getFileInputStream(cfgFile);
|
||||||
p.load(fis);
|
p.load(fis);
|
||||||
_configLastRead = _context.clock().now();
|
_configLastRead = _context.clock().now();
|
||||||
} catch (IOException ioe) {
|
} catch (IOException ioe) {
|
||||||
System.err.println("Error loading logger config from " + new File(_location).getAbsolutePath());
|
System.err.println("Error loading logger config from " + new I2PFile(_location).getAbsolutePath());
|
||||||
} finally {
|
} finally {
|
||||||
if (fis != null) try {
|
if (fis != null) try {
|
||||||
fis.close();
|
fis.close();
|
||||||
@ -540,7 +540,7 @@ public class LogManager {
|
|||||||
String config = createConfig();
|
String config = createConfig();
|
||||||
FileOutputStream fos = null;
|
FileOutputStream fos = null;
|
||||||
try {
|
try {
|
||||||
fos = new FileOutputStream(_location);
|
fos = FileStreamFactory.getFileOutputStream(_location);
|
||||||
fos.write(config.getBytes());
|
fos.write(config.getBytes());
|
||||||
return true;
|
return true;
|
||||||
} catch (IOException ioe) {
|
} catch (IOException ioe) {
|
||||||
|
@ -26,6 +26,7 @@ import net.i2p.data.PublicKey;
|
|||||||
import net.i2p.data.SigningPrivateKey;
|
import net.i2p.data.SigningPrivateKey;
|
||||||
import net.i2p.data.SigningPublicKey;
|
import net.i2p.data.SigningPublicKey;
|
||||||
import net.i2p.util.Clock;
|
import net.i2p.util.Clock;
|
||||||
|
import net.i2p.util.FileStreamFactory;
|
||||||
import net.i2p.util.Log;
|
import net.i2p.util.Log;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -205,12 +206,12 @@ public class KeyManager {
|
|||||||
FileInputStream in = null;
|
FileInputStream in = null;
|
||||||
try {
|
try {
|
||||||
if (exists) {
|
if (exists) {
|
||||||
out = new FileOutputStream(keyFile);
|
out = FileStreamFactory.getFileOutputStream(keyFile);
|
||||||
structure.writeBytes(out);
|
structure.writeBytes(out);
|
||||||
return structure;
|
return structure;
|
||||||
} else {
|
} else {
|
||||||
if (keyFile.exists()) {
|
if (keyFile.exists()) {
|
||||||
in = new FileInputStream(keyFile);
|
in = FileStreamFactory.getFileInputStream(keyFile);
|
||||||
structure.readBytes(in);
|
structure.readBytes(in);
|
||||||
return structure;
|
return structure;
|
||||||
} else {
|
} else {
|
||||||
|
@ -40,7 +40,9 @@ import net.i2p.router.transport.FIFOBandwidthLimiter;
|
|||||||
import net.i2p.stat.Rate;
|
import net.i2p.stat.Rate;
|
||||||
import net.i2p.stat.RateStat;
|
import net.i2p.stat.RateStat;
|
||||||
import net.i2p.stat.StatManager;
|
import net.i2p.stat.StatManager;
|
||||||
|
import net.i2p.util.FileStreamFactory;
|
||||||
import net.i2p.util.FileUtil;
|
import net.i2p.util.FileUtil;
|
||||||
|
import net.i2p.util.I2PFile;
|
||||||
import net.i2p.util.I2PThread;
|
import net.i2p.util.I2PThread;
|
||||||
import net.i2p.util.Log;
|
import net.i2p.util.Log;
|
||||||
import net.i2p.util.SimpleScheduler;
|
import net.i2p.util.SimpleScheduler;
|
||||||
@ -292,7 +294,7 @@ public class Router {
|
|||||||
}
|
}
|
||||||
Properties props = new Properties();
|
Properties props = new Properties();
|
||||||
try {
|
try {
|
||||||
File f = new File(filename);
|
File f = new I2PFile(filename);
|
||||||
if (f.canRead()) {
|
if (f.canRead()) {
|
||||||
DataHelper.loadProps(props, f);
|
DataHelper.loadProps(props, f);
|
||||||
// dont be a wanker
|
// dont be a wanker
|
||||||
@ -945,7 +947,7 @@ public class Router {
|
|||||||
public boolean saveConfig() {
|
public boolean saveConfig() {
|
||||||
FileOutputStream fos = null;
|
FileOutputStream fos = null;
|
||||||
try {
|
try {
|
||||||
fos = new FileOutputStream(_configFilename);
|
fos = FileStreamFactory.getFileOutputStream(_configFilename);
|
||||||
StringBuffer buf = new StringBuffer(8*1024);
|
StringBuffer buf = new StringBuffer(8*1024);
|
||||||
synchronized (_config) {
|
synchronized (_config) {
|
||||||
TreeSet ordered = new TreeSet(_config.keySet());
|
TreeSet ordered = new TreeSet(_config.keySet());
|
||||||
@ -1331,7 +1333,7 @@ class MarkLiveliness implements Runnable {
|
|||||||
private void ping() {
|
private void ping() {
|
||||||
FileOutputStream fos = null;
|
FileOutputStream fos = null;
|
||||||
try {
|
try {
|
||||||
fos = new FileOutputStream(_pingFile);
|
fos = FileStreamFactory.getFileOutputStream(_pingFile);
|
||||||
fos.write(("" + System.currentTimeMillis()).getBytes());
|
fos.write(("" + System.currentTimeMillis()).getBytes());
|
||||||
} catch (IOException ioe) {
|
} catch (IOException ioe) {
|
||||||
System.err.println("Error writing to ping file");
|
System.err.println("Error writing to ping file");
|
||||||
@ -1378,7 +1380,7 @@ class PersistRouterInfoJob extends JobImpl {
|
|||||||
|
|
||||||
FileOutputStream fos = null;
|
FileOutputStream fos = null;
|
||||||
try {
|
try {
|
||||||
fos = new FileOutputStream(infoFilename);
|
fos = FileStreamFactory.getFileOutputStream(infoFilename);
|
||||||
info.writeBytes(fos);
|
info.writeBytes(fos);
|
||||||
} catch (DataFormatException dfe) {
|
} catch (DataFormatException dfe) {
|
||||||
_log.error("Error rebuilding the router information", dfe);
|
_log.error("Error rebuilding the router information", dfe);
|
||||||
|
@ -26,6 +26,8 @@ import net.i2p.data.RouterInfo;
|
|||||||
import net.i2p.router.JobImpl;
|
import net.i2p.router.JobImpl;
|
||||||
import net.i2p.router.Router;
|
import net.i2p.router.Router;
|
||||||
import net.i2p.router.RouterContext;
|
import net.i2p.router.RouterContext;
|
||||||
|
import net.i2p.util.FileStreamFactory;
|
||||||
|
import net.i2p.util.I2PFile;
|
||||||
import net.i2p.util.I2PThread;
|
import net.i2p.util.I2PThread;
|
||||||
import net.i2p.util.Log;
|
import net.i2p.util.Log;
|
||||||
|
|
||||||
@ -171,11 +173,11 @@ class PersistentDataStore extends TransientDataStore {
|
|||||||
else
|
else
|
||||||
throw new IOException("We don't know how to write objects of type " + data.getClass().getName());
|
throw new IOException("We don't know how to write objects of type " + data.getClass().getName());
|
||||||
|
|
||||||
dbFile = new File(dbDir, filename);
|
dbFile = new I2PFile(dbDir, filename);
|
||||||
long dataPublishDate = getPublishDate(data);
|
long dataPublishDate = getPublishDate(data);
|
||||||
if (dbFile.lastModified() < dataPublishDate) {
|
if (dbFile.lastModified() < dataPublishDate) {
|
||||||
// our filesystem is out of date, lets replace it
|
// our filesystem is out of date, lets replace it
|
||||||
fos = new FileOutputStream(dbFile);
|
fos = FileStreamFactory.getFileOutputStream(dbFile);
|
||||||
try {
|
try {
|
||||||
data.writeBytes(fos);
|
data.writeBytes(fos);
|
||||||
fos.close();
|
fos.close();
|
||||||
@ -278,7 +280,7 @@ class PersistentDataStore extends TransientDataStore {
|
|||||||
FileInputStream fis = null;
|
FileInputStream fis = null;
|
||||||
boolean corrupt = false;
|
boolean corrupt = false;
|
||||||
try {
|
try {
|
||||||
fis = new FileInputStream(_routerFile);
|
fis = FileStreamFactory.getFileInputStream(_routerFile);
|
||||||
RouterInfo ri = new RouterInfo();
|
RouterInfo ri = new RouterInfo();
|
||||||
ri.readBytes(fis);
|
ri.readBytes(fis);
|
||||||
if (ri.getNetworkId() != Router.NETWORK_ID) {
|
if (ri.getNetworkId() != Router.NETWORK_ID) {
|
||||||
@ -312,7 +314,7 @@ class PersistentDataStore extends TransientDataStore {
|
|||||||
|
|
||||||
|
|
||||||
private File getDbDir() throws IOException {
|
private File getDbDir() throws IOException {
|
||||||
File f = new File(_dbDir);
|
File f = new I2PFile(_dbDir);
|
||||||
if (!f.exists()) {
|
if (!f.exists()) {
|
||||||
boolean created = f.mkdirs();
|
boolean created = f.mkdirs();
|
||||||
if (!created)
|
if (!created)
|
||||||
@ -362,7 +364,7 @@ class PersistentDataStore extends TransientDataStore {
|
|||||||
|
|
||||||
private void removeFile(Hash key, File dir) throws IOException {
|
private void removeFile(Hash key, File dir) throws IOException {
|
||||||
String riName = getRouterInfoName(key);
|
String riName = getRouterInfoName(key);
|
||||||
File f = new File(dir, riName);
|
File f = new I2PFile(dir, riName);
|
||||||
if (f.exists()) {
|
if (f.exists()) {
|
||||||
boolean removed = f.delete();
|
boolean removed = f.delete();
|
||||||
if (!removed)
|
if (!removed)
|
||||||
|
@ -18,6 +18,8 @@ import net.i2p.data.DataFormatException;
|
|||||||
import net.i2p.data.DataHelper;
|
import net.i2p.data.DataHelper;
|
||||||
import net.i2p.data.Hash;
|
import net.i2p.data.Hash;
|
||||||
import net.i2p.router.RouterContext;
|
import net.i2p.router.RouterContext;
|
||||||
|
import net.i2p.util.FileStreamFactory;
|
||||||
|
import net.i2p.util.I2PFile;
|
||||||
import net.i2p.util.Log;
|
import net.i2p.util.Log;
|
||||||
|
|
||||||
class ProfilePersistenceHelper {
|
class ProfilePersistenceHelper {
|
||||||
@ -61,7 +63,7 @@ class ProfilePersistenceHelper {
|
|||||||
long before = _context.clock().now();
|
long before = _context.clock().now();
|
||||||
OutputStream fos = null;
|
OutputStream fos = null;
|
||||||
try {
|
try {
|
||||||
fos = new BufferedOutputStream(new GZIPOutputStream(new FileOutputStream(f)));
|
fos = new BufferedOutputStream(new GZIPOutputStream(FileStreamFactory.getFileOutputStream(f)));
|
||||||
writeProfile(profile, fos);
|
writeProfile(profile, fos);
|
||||||
} catch (IOException ioe) {
|
} catch (IOException ioe) {
|
||||||
_log.error("Error writing profile to " + f);
|
_log.error("Error writing profile to " + f);
|
||||||
@ -264,10 +266,10 @@ class ProfilePersistenceHelper {
|
|||||||
|
|
||||||
private void loadProps(Properties props, File file) {
|
private void loadProps(Properties props, File file) {
|
||||||
try {
|
try {
|
||||||
FileInputStream fin = new FileInputStream(file);
|
FileInputStream fin = FileStreamFactory.getFileInputStream(file);
|
||||||
int c = fin.read();
|
int c = fin.read();
|
||||||
fin.close();
|
fin.close();
|
||||||
fin = new FileInputStream(file); // ghetto mark+reset
|
fin = FileStreamFactory.getFileInputStream(file); // ghetto mark+reset
|
||||||
if (c == '#') {
|
if (c == '#') {
|
||||||
// uncompressed
|
// uncompressed
|
||||||
if (_log.shouldLog(Log.INFO))
|
if (_log.shouldLog(Log.INFO))
|
||||||
@ -299,7 +301,7 @@ class ProfilePersistenceHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private File pickFile(PeerProfile profile) {
|
private File pickFile(PeerProfile profile) {
|
||||||
return new File(getProfileDir(), "profile-" + profile.getPeer().toBase64() + ".dat");
|
return new I2PFile(getProfileDir(), "profile-" + profile.getPeer().toBase64() + ".dat");
|
||||||
}
|
}
|
||||||
|
|
||||||
private File getProfileDir() {
|
private File getProfileDir() {
|
||||||
@ -315,7 +317,7 @@ class ProfilePersistenceHelper {
|
|||||||
dir = DEFAULT_PEER_PROFILE_DIR;
|
dir = DEFAULT_PEER_PROFILE_DIR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_profileDir = new File(dir);
|
_profileDir = new I2PFile(dir);
|
||||||
}
|
}
|
||||||
return _profileDir;
|
return _profileDir;
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,7 @@ import net.i2p.router.Job;
|
|||||||
import net.i2p.router.JobImpl;
|
import net.i2p.router.JobImpl;
|
||||||
import net.i2p.router.Router;
|
import net.i2p.router.Router;
|
||||||
import net.i2p.router.RouterContext;
|
import net.i2p.router.RouterContext;
|
||||||
|
import net.i2p.util.FileStreamFactory;
|
||||||
import net.i2p.util.Log;
|
import net.i2p.util.Log;
|
||||||
|
|
||||||
public class CreateRouterInfoJob extends JobImpl {
|
public class CreateRouterInfoJob extends JobImpl {
|
||||||
@ -79,13 +80,13 @@ public class CreateRouterInfoJob extends JobImpl {
|
|||||||
String infoFilename = getContext().router().getConfigSetting(Router.PROP_INFO_FILENAME);
|
String infoFilename = getContext().router().getConfigSetting(Router.PROP_INFO_FILENAME);
|
||||||
if (infoFilename == null)
|
if (infoFilename == null)
|
||||||
infoFilename = Router.PROP_INFO_FILENAME_DEFAULT;
|
infoFilename = Router.PROP_INFO_FILENAME_DEFAULT;
|
||||||
fos1 = new FileOutputStream(infoFilename);
|
fos1 = FileStreamFactory.getFileOutputStream(infoFilename);
|
||||||
info.writeBytes(fos1);
|
info.writeBytes(fos1);
|
||||||
|
|
||||||
String keyFilename = getContext().router().getConfigSetting(Router.PROP_KEYS_FILENAME);
|
String keyFilename = getContext().router().getConfigSetting(Router.PROP_KEYS_FILENAME);
|
||||||
if (keyFilename == null)
|
if (keyFilename == null)
|
||||||
keyFilename = Router.PROP_KEYS_FILENAME_DEFAULT;
|
keyFilename = Router.PROP_KEYS_FILENAME_DEFAULT;
|
||||||
fos2 = new FileOutputStream(keyFilename);
|
fos2 = FileStreamFactory.getFileOutputStream(keyFilename);
|
||||||
privkey.writeBytes(fos2);
|
privkey.writeBytes(fos2);
|
||||||
signingPrivKey.writeBytes(fos2);
|
signingPrivKey.writeBytes(fos2);
|
||||||
pubkey.writeBytes(fos2);
|
pubkey.writeBytes(fos2);
|
||||||
|
@ -21,6 +21,8 @@ import net.i2p.data.SigningPublicKey;
|
|||||||
import net.i2p.router.JobImpl;
|
import net.i2p.router.JobImpl;
|
||||||
import net.i2p.router.Router;
|
import net.i2p.router.Router;
|
||||||
import net.i2p.router.RouterContext;
|
import net.i2p.router.RouterContext;
|
||||||
|
import net.i2p.util.FileStreamFactory;
|
||||||
|
import net.i2p.util.I2PFile;
|
||||||
import net.i2p.util.Log;
|
import net.i2p.util.Log;
|
||||||
|
|
||||||
public class LoadRouterInfoJob extends JobImpl {
|
public class LoadRouterInfoJob extends JobImpl {
|
||||||
@ -62,10 +64,10 @@ public class LoadRouterInfoJob extends JobImpl {
|
|||||||
if (keyFilename == null)
|
if (keyFilename == null)
|
||||||
keyFilename = Router.PROP_KEYS_FILENAME_DEFAULT;
|
keyFilename = Router.PROP_KEYS_FILENAME_DEFAULT;
|
||||||
|
|
||||||
File rif = new File(routerInfoFile);
|
File rif = new I2PFile(routerInfoFile);
|
||||||
if (rif.exists())
|
if (rif.exists())
|
||||||
_infoExists = true;
|
_infoExists = true;
|
||||||
File rkf = new File(keyFilename);
|
File rkf = new I2PFile(keyFilename);
|
||||||
if (rkf.exists())
|
if (rkf.exists())
|
||||||
_keysExist = true;
|
_keysExist = true;
|
||||||
|
|
||||||
@ -73,14 +75,14 @@ public class LoadRouterInfoJob extends JobImpl {
|
|||||||
FileInputStream fis2 = null;
|
FileInputStream fis2 = null;
|
||||||
try {
|
try {
|
||||||
if (_infoExists) {
|
if (_infoExists) {
|
||||||
fis1 = new FileInputStream(rif);
|
fis1 = FileStreamFactory.getFileInputStream(rif);
|
||||||
info = new RouterInfo();
|
info = new RouterInfo();
|
||||||
info.readBytes(fis1);
|
info.readBytes(fis1);
|
||||||
_log.debug("Reading in routerInfo from " + rif.getAbsolutePath() + " and it has " + info.getAddresses().size() + " addresses");
|
_log.debug("Reading in routerInfo from " + rif.getAbsolutePath() + " and it has " + info.getAddresses().size() + " addresses");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_keysExist) {
|
if (_keysExist) {
|
||||||
fis2 = new FileInputStream(rkf);
|
fis2 = FileStreamFactory.getFileInputStream(rkf);
|
||||||
PrivateKey privkey = new PrivateKey();
|
PrivateKey privkey = new PrivateKey();
|
||||||
privkey.readBytes(fis2);
|
privkey.readBytes(fis2);
|
||||||
SigningPrivateKey signingPrivKey = new SigningPrivateKey();
|
SigningPrivateKey signingPrivKey = new SigningPrivateKey();
|
||||||
|
@ -25,6 +25,8 @@ import net.i2p.data.SigningPublicKey;
|
|||||||
import net.i2p.router.JobImpl;
|
import net.i2p.router.JobImpl;
|
||||||
import net.i2p.router.Router;
|
import net.i2p.router.Router;
|
||||||
import net.i2p.router.RouterContext;
|
import net.i2p.router.RouterContext;
|
||||||
|
import net.i2p.util.FileStreamFactory;
|
||||||
|
import net.i2p.util.I2PFile;
|
||||||
import net.i2p.util.Log;
|
import net.i2p.util.Log;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -93,7 +95,7 @@ public class RebuildRouterInfoJob extends JobImpl {
|
|||||||
String keyFilename = getContext().router().getConfigSetting(Router.PROP_KEYS_FILENAME);
|
String keyFilename = getContext().router().getConfigSetting(Router.PROP_KEYS_FILENAME);
|
||||||
if (keyFilename == null)
|
if (keyFilename == null)
|
||||||
keyFilename = Router.PROP_KEYS_FILENAME_DEFAULT;
|
keyFilename = Router.PROP_KEYS_FILENAME_DEFAULT;
|
||||||
File keyFile = new File(keyFilename);
|
File keyFile = new I2PFile(keyFilename);
|
||||||
|
|
||||||
if (keyFile.exists()) {
|
if (keyFile.exists()) {
|
||||||
// ok, no need to rebuild a brand new identity, just update what we can
|
// ok, no need to rebuild a brand new identity, just update what we can
|
||||||
@ -102,7 +104,7 @@ public class RebuildRouterInfoJob extends JobImpl {
|
|||||||
info = new RouterInfo();
|
info = new RouterInfo();
|
||||||
FileInputStream fis = null;
|
FileInputStream fis = null;
|
||||||
try {
|
try {
|
||||||
fis = new FileInputStream(keyFile);
|
fis = FileStreamFactory.getFileInputStream(keyFile);
|
||||||
PrivateKey privkey = new PrivateKey();
|
PrivateKey privkey = new PrivateKey();
|
||||||
privkey.readBytes(fis);
|
privkey.readBytes(fis);
|
||||||
SigningPrivateKey signingPrivKey = new SigningPrivateKey();
|
SigningPrivateKey signingPrivKey = new SigningPrivateKey();
|
||||||
@ -146,7 +148,7 @@ public class RebuildRouterInfoJob extends JobImpl {
|
|||||||
|
|
||||||
FileOutputStream fos = null;
|
FileOutputStream fos = null;
|
||||||
try {
|
try {
|
||||||
fos = new FileOutputStream(infoFilename);
|
fos = FileStreamFactory.getFileOutputStream(infoFilename);
|
||||||
info.writeBytes(fos);
|
info.writeBytes(fos);
|
||||||
} catch (DataFormatException dfe) {
|
} catch (DataFormatException dfe) {
|
||||||
_log.error("Error rebuilding the router information", dfe);
|
_log.error("Error rebuilding the router information", dfe);
|
||||||
|
@ -81,7 +81,7 @@ public class EventPumper implements Runnable {
|
|||||||
|
|
||||||
public void stopPumping() {
|
public void stopPumping() {
|
||||||
_alive = false;
|
_alive = false;
|
||||||
if (_selector.isOpen())
|
if (_selector != null &&_selector.isOpen())
|
||||||
_selector.wakeup();
|
_selector.wakeup();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user