Changeset b8f22bf


Ignore:
Timestamp:
Mar 13, 2009 6:56:16 PM (11 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
5022575
Parents:
5a8b3eb
Message:
  • 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
Files:
7 added
16 edited

Legend:

Unmodified
Added
Removed
  • android/AndroidManifest.xml

    r5a8b3eb rb8f22bf  
    44      android:versionCode="1"
    55      android:versionName="1.0.0">
     6    <uses-permission android:name="android.permission.INTERNET" />
    67    <application android:label="@string/app_name">
    78        <activity android:name=".I2PAndroid"
    8                   android:label="@string/app_name">
     9                  android:label="@string/app_name"
     10                  android:launchMode="singleTask" >
    911            <intent-filter>
    1012                <action android:name="android.intent.action.MAIN" />
  • android/build.xml

    r5a8b3eb rb8f22bf  
    102102        <mkdir dir="${outdir}" />
    103103        <mkdir dir="${outdir-classes}" />
     104        <mkdir dir="${external-libs}" />
    104105    </target>
    105106
     
    108109        <delete dir="${external-libs}" />
    109110        <delete dir="tmp/" />
     111        <delete dir="res/drawable/" />
     112        <delete file="res/raw/blocklist_txt" />
    110113        <delete file="${outdir-r}/net/i2p/router/R.java" />
    111114    </target>
     
    141144
    142145    <!-- Compile this project's .java files into .class files. -->
    143     <target name="compile" depends="dirs, resource-src, aidl, buildrouter">
     146    <target name="compile" depends="buildrouter, dirs, resource-src, aidl">
    144147        <javac encoding="ascii" target="1.5" debug="true" extdirs=""
    145148                srcdir="."
     
    152155    </target>
    153156
    154     <target name="buildrouter">
     157    <target name="buildrouter" depends="dirs" >
     158        <!-- for now, we just need the ReseedHandler from routerconsole -->
     159        <ant dir="../apps/routerconsole/java" target="compile" />
     160        <jar destfile="${external-libs}/routerconsole.jar" >
     161            <fileset dir="../apps/routerconsole/java/build/obj/" >
     162                <include name="net/i2p/router/web/ContextHelper.class" />
     163                <include name="net/i2p/router/web/ReseedHandler.class" />
     164                <include name="net/i2p/router/web/ReseedHandler$ReseedRunner.class" />
     165            </fileset>
     166        </jar>
     167
     168        <!-- build router and core (actually the routerconsole builds these anyway) -->
    155169        <ant dir=".." target="buildrouter" />
     170
     171        <!-- router -->
    156172        <copy file="../build/router.jar" todir="${external-libs}" />
     173
     174        <!-- core -->
    157175        <mkdir dir="tmp" />
    158176        <unjar src="../build/i2p.jar" dest="tmp/" />
    159177        <delete file="tmp/net/i2p/util/LogWriter.class" />
    160         <!-- lots of unneeded stuff, like Log* -->
     178        <delete file="tmp/net/i2p/util/FileStreamFactory.class" />
     179        <delete file="tmp/net/i2p/util/I2PFile.class" />
     180        <!-- org.bouncycastle.crypto already in android
     181             but we need a little trickery because our HMac is incompatible...
     182             and the libs aren't in the SDK to compile against??? -->
     183        <jar destfile="${external-libs}/crypto.jar" >
     184            <fileset dir="tmp/" >
     185                <include name="org/bouncycastle/crypto/Digest.class" />
     186                <include name="org/bouncycastle/crypto/Mac.class" />
     187                <include name="org/bouncycastle/crypto/digests/GeneralDigest.class" />
     188                <include name="org/bouncycastle/crypto/digests/MD5Digest.class" />
     189            </fileset>
     190        </jar>
     191        <delete>
     192            <fileset dir="tmp/" >
     193                <include name="org/bouncycastle/crypto/Digest.class" />
     194                <include name="org/bouncycastle/crypto/Mac.class" />
     195                <include name="org/bouncycastle/crypto/digests/GeneralDigest.class" />
     196                <include name="org/bouncycastle/crypto/digests/MD5Digest.class" />
     197            </fileset>
     198        </delete>
     199<!--
     200        <delete dir="tmp/org/bouncycastle/" />
     201        <delete file="tmp/net/i2p/crypto/HMACGenerator.class" />
     202-->
     203        <delete file="tmp/org/bouncycastle/" />
     204        <!-- lots of unneeded stuff could be deleted here -->
    161205        <jar destfile="${external-libs}/i2p.jar" basedir="tmp/" />
     206
     207        <!-- some resources -->
     208        <mkdir dir="res/drawable/" />
     209        <copy file="../apps/routerconsole/jsp/i2plogo.png" todir="res/drawable/" />
     210        <copy file="../installer/resources/blocklist.txt" tofile="res/raw/blocklist_txt" />
     211    </target>
     212
     213    <target name="hackcleanup">
     214        <delete file="${external-libs}/crypto.jar" />
    162215    </target>
    163216
    164217    <!-- Convert this project's .class files into .dex files. -->
    165     <target name="dex" depends="compile">
     218    <target name="dex" depends="compile, hackcleanup">
    166219        <echo>Converting compiled files and external libraries into ${outdir}/${dex-file}...</echo>
    167220        <apply executable="${dx}" failonerror="true" parallel="true">
  • android/res/layout/main.xml

    r5a8b3eb rb8f22bf  
    1010    android:text="Hello World, I2PAndroid"
    1111    />
     12<ImageView 
     13    android:layout_width="fill_parent"
     14    android:layout_height="wrap_content"
     15    android:src="@drawable/i2plogo"
     16    />
    1217</LinearLayout>
    1318
  • android/src/net/i2p/router/I2PAndroid.java

    r5a8b3eb rb8f22bf  
    22
    33import android.app.Activity;
     4import android.content.Context;
     5import android.content.res.Resources;
     6import android.content.res.Resources.NotFoundException;
    47import android.os.Bundle;
    58
     9import java.io.File;
     10import java.io.FileOutputStream;
     11import java.io.InputStream;
     12import java.io.IOException;
     13
    614import net.i2p.router.Router;
     15import net.i2p.router.web.ReseedChecker;
     16import net.i2p.util.I2PFile;
    717
    818public class I2PAndroid extends Activity
    919{
     20    static Context _context;
     21
    1022    /** Called when the activity is first created. */
    1123    @Override
     
    1426        super.onCreate(savedInstanceState);
    1527        setContentView(R.layout.main);
     28
     29        _context = this;  // Activity extends Context
     30        debugStuff();
     31        initialize();
     32
    1633        Router.main(null);
     34        System.err.println("Router.main finished");
     35
     36        ReseedChecker.checkReseed();
    1737    }
     38
     39    public void onRestart()
     40    {
     41        System.err.println("onRestart called");
     42        super.onRestart();
     43    }
     44
     45    public void onResume()
     46    {
     47        System.err.println("onResume called");
     48        super.onResume();
     49    }
     50
     51    public void onPause()
     52    {
     53        System.err.println("onPause called");
     54        super.onPause();
     55    }
     56
     57    public void onStop()
     58    {
     59        System.err.println("onStop called");
     60        super.onStop();
     61    }
     62
     63    public void onDestroy()
     64    {
     65        System.err.println("onDestroy called");
     66        super.onDestroy();
     67    }
     68
     69    public static Context getContext() {
     70        return _context;
     71    }
     72
     73    private void debugStuff() {
     74        System.err.println("java.vendor" + ": " + System.getProperty("java.vendor"));
     75        System.err.println("java.version" + ": " + System.getProperty("java.version"));
     76        System.err.println("os.arch" + ": " + System.getProperty("os.arch"));
     77        System.err.println("os.name" + ": " + System.getProperty("os.name"));
     78        System.err.println("os.version" + ": " + System.getProperty("os.version"));
     79        System.err.println("user.dir" + ": " + System.getProperty("user.dir"));
     80        System.err.println("user.home" + ": " + System.getProperty("user.home"));
     81        System.err.println("user.name" + ": " + System.getProperty("user.name"));
     82    }
     83
     84    private void initialize() {
     85        // Until we can edit the router.config on the device,
     86        // copy it from the resource every time.
     87        // File f = new I2PFile("router.config");
     88        // if (!f.exists()) {
     89            copyResourceToFile(R.raw.router_config, "router.config");
     90            copyResourceToFile(R.raw.logger_config, "logger.config");
     91            copyResourceToFile(R.raw.blocklist_txt, "blocklist.txt");
     92        // }
     93    }
     94
     95    private void copyResourceToFile(int resID, String f) {
     96        InputStream in = null;
     97        FileOutputStream out = null;
     98
     99        System.err.println("Creating file " + f + " from resource");
     100        byte buf[] = new byte[4096];
     101        try {
     102            // Context methods
     103            in = getResources().openRawResource(resID);
     104            out = openFileOutput(f, 0);
     105           
     106            int read = 0;
     107            while ( (read = in.read(buf)) != -1)
     108                out.write(buf, 0, read);
     109           
     110        } catch (IOException ioe) {
     111        } catch (Resources.NotFoundException nfe) {
     112        } finally {
     113            if (in != null) try { in.close(); } catch (IOException ioe) {}
     114            if (out != null) try { out.close(); } catch (IOException ioe) {}
     115        }
     116    }
     117   
    18118}
  • android/src/net/i2p/util/LogWriter.java

    r5a8b3eb rb8f22bf  
    8888    private void writeRecord(LogRecord rec) {
    8989        if (rec.getThrowable() == null)
    90             log(rec.getPriority(), rec.getSourceName(), null, rec.getThreadName(), rec.getMessage());
     90            log(rec.getPriority(), rec.getSource(), rec.getSourceName(), rec.getThreadName(), rec.getMessage());
    9191        else
    92             log(rec.getPriority(), rec.getSourceName(), null, rec.getThreadName(), rec.getMessage(), rec.getThrowable());
     92            log(rec.getPriority(), rec.getSource(), rec.getSourceName(), rec.getThreadName(), rec.getMessage(), rec.getThrowable());
    9393    }
    9494
    95     public void log(int priority, String className, String name, String threadName, String msg) {
    96             if (className != null)
     95    public void log(int priority, Class src, String name, String threadName, String msg) {
     96            if (src != null) {
     97                String tag = src.getName();
     98                int dot = tag.lastIndexOf(".");
     99                if (dot >= 0)
     100                    tag = tag.substring(dot + 1);
    97101                android.util.Log.println(toAndroidLevel(priority),
    98                                          className,
    99                                          threadName + ' ' + msg);
    100             else if (name != null)
     102                                         tag,
     103                                         '[' + threadName + "] " + msg);
     104            } else if (name != null)
    101105                android.util.Log.println(toAndroidLevel(priority),
    102106                                         name,
    103                                          threadName + ' ' + msg);
     107                                         '[' + threadName + "] " + msg);
    104108            else
    105109                android.util.Log.println(toAndroidLevel(priority),
     
    107111    }
    108112
    109     public void log(int priority, String className, String name, String threadName, String msg, Throwable t) {
    110             if (className != null)
     113    public void log(int priority, Class src, String name, String threadName, String msg, Throwable t) {
     114            if (src != null) {
     115                String tag = src.getName();
     116                int dot = tag.lastIndexOf(".");
     117                if (dot >= 0)
     118                    tag = tag.substring(dot + 1);
    111119                android.util.Log.println(toAndroidLevel(priority),
    112                                          className,
    113                                          threadName + ' ' + msg +
    114                                          msg + ' ' + t.toString() + ' ' + android.util.Log.getStackTraceString(t));
    115             else if (name != null)
     120                                         tag,
     121                                         '[' + threadName + "] " + msg +
     122                                         ' ' + t.toString() + ' ' + android.util.Log.getStackTraceString(t));
     123            } else if (name != null)
    116124                android.util.Log.println(toAndroidLevel(priority),
    117125                                         name,
    118                                          threadName + ' ' + msg +
    119                                          msg + ' ' + t.toString() + ' ' + android.util.Log.getStackTraceString(t));
     126                                         '[' + threadName + "] " + msg +
     127                                         ' ' + t.toString() + ' ' + android.util.Log.getStackTraceString(t));
    120128            else
    121129                android.util.Log.println(toAndroidLevel(priority),
  • apps/routerconsole/java/src/net/i2p/router/web/ReseedHandler.java

    r5a8b3eb rb8f22bf  
    1616import net.i2p.router.RouterContext;
    1717import net.i2p.util.EepGet;
     18import net.i2p.util.FileStreamFactory;
     19import net.i2p.util.I2PFile;
    1820import net.i2p.util.I2PThread;
    1921import net.i2p.util.Log;
     
    251253        private void writeSeed(String name, byte data[]) throws Exception {
    252254            String dirName = "netDb"; // _context.getProperty("router.networkDatabase.dbDir", "netDb");
    253             File netDbDir = new File(dirName);
     255            File netDbDir = new I2PFile(dirName);
    254256            if (!netDbDir.exists()) {
    255257                boolean ok = netDbDir.mkdirs();
    256258            }
    257             FileOutputStream fos = new FileOutputStream(new File(netDbDir, "routerInfo-" + name + ".dat"));
     259            FileOutputStream fos = FileStreamFactory.getFileOutputStream(new I2PFile(netDbDir, "routerInfo-" + name + ".dat"));
    258260            fos.write(data);
    259261            fos.close();
  • core/java/src/net/i2p/data/DataHelper.java

    r5a8b3eb rb8f22bf  
    3838
    3939import net.i2p.util.ByteCache;
     40import net.i2p.util.FileStreamFactory;
    4041import net.i2p.util.OrderedProperties;
    4142import net.i2p.util.ReusableGZIPInputStream;
     
    218219    }
    219220    public static void loadProps(Properties props, File file, boolean forceLowerCase) throws IOException {
    220         loadProps(props, new FileInputStream(file), forceLowerCase);
     221        loadProps(props, FileStreamFactory.getFileInputStream(file), forceLowerCase);
    221222    }
    222223    public static void loadProps(Properties props, InputStream inStr) throws IOException {
  • core/java/src/net/i2p/util/LogManager.java

    r5a8b3eb rb8f22bf  
    241241
    242242    private void loadConfig() {
    243         File cfgFile = new File(_location);
     243        File cfgFile = new I2PFile(_location);
    244244        if (!cfgFile.exists()) {
    245245            if (!_alreadyNoticedMissingConfig) {
     
    269269        FileInputStream fis = null;
    270270        try {
    271             fis = new FileInputStream(cfgFile);
     271            fis = FileStreamFactory.getFileInputStream(cfgFile);
    272272            p.load(fis);
    273273            _configLastRead = _context.clock().now();
    274274        } catch (IOException ioe) {
    275             System.err.println("Error loading logger config from " + new File(_location).getAbsolutePath());
     275            System.err.println("Error loading logger config from " + new I2PFile(_location).getAbsolutePath());
    276276        } finally {
    277277            if (fis != null) try {
     
    541541        FileOutputStream fos = null;
    542542        try {
    543             fos = new FileOutputStream(_location);
     543            fos = FileStreamFactory.getFileOutputStream(_location);
    544544            fos.write(config.getBytes());
    545545            return true;
  • router/java/src/net/i2p/router/KeyManager.java

    r5a8b3eb rb8f22bf  
    2727import net.i2p.data.SigningPublicKey;
    2828import net.i2p.util.Clock;
     29import net.i2p.util.FileStreamFactory;
    2930import net.i2p.util.Log;
    3031
     
    206207            try {
    207208                if (exists) {
    208                     out = new FileOutputStream(keyFile);
     209                    out = FileStreamFactory.getFileOutputStream(keyFile);
    209210                    structure.writeBytes(out);
    210211                    return structure;
    211212                } else {
    212213                    if (keyFile.exists()) {
    213                         in = new FileInputStream(keyFile);
     214                        in = FileStreamFactory.getFileInputStream(keyFile);
    214215                        structure.readBytes(in);
    215216                        return structure;
  • router/java/src/net/i2p/router/Router.java

    r5a8b3eb rb8f22bf  
    4141import net.i2p.stat.RateStat;
    4242import net.i2p.stat.StatManager;
     43import net.i2p.util.FileStreamFactory;
    4344import net.i2p.util.FileUtil;
     45import net.i2p.util.I2PFile;
    4446import net.i2p.util.I2PThread;
    4547import net.i2p.util.Log;
     
    293295        Properties props = new Properties();
    294296        try {
    295             File f = new File(filename);
     297            File f = new I2PFile(filename);
    296298            if (f.canRead()) {
    297299                DataHelper.loadProps(props, f);
     
    946948        FileOutputStream fos = null;
    947949        try {
    948             fos = new FileOutputStream(_configFilename);
     950            fos = FileStreamFactory.getFileOutputStream(_configFilename);
    949951            StringBuffer buf = new StringBuffer(8*1024);
    950952            synchronized (_config) {
     
    13321334        FileOutputStream fos = null;
    13331335        try {
    1334             fos = new FileOutputStream(_pingFile);
     1336            fos = FileStreamFactory.getFileOutputStream(_pingFile);
    13351337            fos.write(("" + System.currentTimeMillis()).getBytes());
    13361338        } catch (IOException ioe) {
     
    13791381        FileOutputStream fos = null;
    13801382        try {
    1381             fos = new FileOutputStream(infoFilename);
     1383            fos = FileStreamFactory.getFileOutputStream(infoFilename);
    13821384            info.writeBytes(fos);
    13831385        } catch (DataFormatException dfe) {
  • router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java

    r5a8b3eb rb8f22bf  
    2727import net.i2p.router.Router;
    2828import net.i2p.router.RouterContext;
     29import net.i2p.util.FileStreamFactory;
     30import net.i2p.util.I2PFile;
    2931import net.i2p.util.I2PThread;
    3032import net.i2p.util.Log;
     
    172174                throw new IOException("We don't know how to write objects of type " + data.getClass().getName());
    173175
    174             dbFile = new File(dbDir, filename);
     176            dbFile = new I2PFile(dbDir, filename);
    175177            long dataPublishDate = getPublishDate(data);
    176178            if (dbFile.lastModified() < dataPublishDate) {
    177179                // our filesystem is out of date, lets replace it
    178                 fos = new FileOutputStream(dbFile);
     180                fos = FileStreamFactory.getFileOutputStream(dbFile);
    179181                try {
    180182                    data.writeBytes(fos);
     
    279281                boolean corrupt = false;
    280282                try {
    281                     fis = new FileInputStream(_routerFile);
     283                    fis = FileStreamFactory.getFileInputStream(_routerFile);
    282284                    RouterInfo ri = new RouterInfo();
    283285                    ri.readBytes(fis);
     
    313315   
    314316    private File getDbDir() throws IOException {
    315         File f = new File(_dbDir);
     317        File f = new I2PFile(_dbDir);
    316318        if (!f.exists()) {
    317319            boolean created = f.mkdirs();
     
    363365    private void removeFile(Hash key, File dir) throws IOException {
    364366        String riName = getRouterInfoName(key);
    365         File f = new File(dir, riName);
     367        File f = new I2PFile(dir, riName);
    366368        if (f.exists()) {
    367369            boolean removed = f.delete();
  • router/java/src/net/i2p/router/peermanager/ProfilePersistenceHelper.java

    r5a8b3eb rb8f22bf  
    1919import net.i2p.data.Hash;
    2020import net.i2p.router.RouterContext;
     21import net.i2p.util.FileStreamFactory;
     22import net.i2p.util.I2PFile;
    2123import net.i2p.util.Log;
    2224
     
    6264        OutputStream fos = null;
    6365        try {
    64             fos = new BufferedOutputStream(new GZIPOutputStream(new FileOutputStream(f)));
     66            fos = new BufferedOutputStream(new GZIPOutputStream(FileStreamFactory.getFileOutputStream(f)));
    6567            writeProfile(profile, fos);
    6668        } catch (IOException ioe) {
     
    265267    private void loadProps(Properties props, File file) {
    266268        try {
    267             FileInputStream fin = new FileInputStream(file);
     269            FileInputStream fin = FileStreamFactory.getFileInputStream(file);
    268270            int c = fin.read();
    269271            fin.close();
    270             fin = new FileInputStream(file); // ghetto mark+reset
     272            fin = FileStreamFactory.getFileInputStream(file); // ghetto mark+reset
    271273            if (c == '#') {
    272274                // uncompressed
     
    300302   
    301303    private File pickFile(PeerProfile profile) {
    302         return new File(getProfileDir(), "profile-" + profile.getPeer().toBase64() + ".dat");
     304        return new I2PFile(getProfileDir(), "profile-" + profile.getPeer().toBase64() + ".dat");
    303305    }
    304306   
     
    316318                }
    317319            }
    318             _profileDir = new File(dir);
     320            _profileDir = new I2PFile(dir);
    319321        }
    320322        return _profileDir;
  • router/java/src/net/i2p/router/startup/CreateRouterInfoJob.java

    r5a8b3eb rb8f22bf  
    2626import net.i2p.router.Router;
    2727import net.i2p.router.RouterContext;
     28import net.i2p.util.FileStreamFactory;
    2829import net.i2p.util.Log;
    2930
     
    8081            if (infoFilename == null)
    8182                infoFilename = Router.PROP_INFO_FILENAME_DEFAULT;
    82             fos1 = new FileOutputStream(infoFilename);
     83            fos1 = FileStreamFactory.getFileOutputStream(infoFilename);
    8384            info.writeBytes(fos1);
    8485           
     
    8687            if (keyFilename == null)
    8788                keyFilename = Router.PROP_KEYS_FILENAME_DEFAULT;
    88             fos2 = new FileOutputStream(keyFilename);
     89            fos2 = FileStreamFactory.getFileOutputStream(keyFilename);
    8990            privkey.writeBytes(fos2);
    9091            signingPrivKey.writeBytes(fos2);
  • router/java/src/net/i2p/router/startup/LoadRouterInfoJob.java

    r5a8b3eb rb8f22bf  
    2222import net.i2p.router.Router;
    2323import net.i2p.router.RouterContext;
     24import net.i2p.util.FileStreamFactory;
     25import net.i2p.util.I2PFile;
    2426import net.i2p.util.Log;
    2527
     
    6365            keyFilename = Router.PROP_KEYS_FILENAME_DEFAULT;
    6466       
    65         File rif = new File(routerInfoFile);
     67        File rif = new I2PFile(routerInfoFile);
    6668        if (rif.exists())
    6769            _infoExists = true;
    68         File rkf = new File(keyFilename);
     70        File rkf = new I2PFile(keyFilename);
    6971        if (rkf.exists())
    7072            _keysExist = true;
     
    7476        try {
    7577            if (_infoExists) {
    76                 fis1 = new FileInputStream(rif);
     78                fis1 = FileStreamFactory.getFileInputStream(rif);
    7779                info = new RouterInfo();
    7880                info.readBytes(fis1);
     
    8183           
    8284            if (_keysExist) {
    83                 fis2 = new FileInputStream(rkf);
     85                fis2 = FileStreamFactory.getFileInputStream(rkf);
    8486                PrivateKey privkey = new PrivateKey();
    8587                privkey.readBytes(fis2);
  • router/java/src/net/i2p/router/startup/RebuildRouterInfoJob.java

    r5a8b3eb rb8f22bf  
    2626import net.i2p.router.Router;
    2727import net.i2p.router.RouterContext;
     28import net.i2p.util.FileStreamFactory;
     29import net.i2p.util.I2PFile;
    2830import net.i2p.util.Log;
    2931
     
    9496        if (keyFilename == null)
    9597            keyFilename = Router.PROP_KEYS_FILENAME_DEFAULT;
    96         File keyFile = new File(keyFilename);
     98        File keyFile = new I2PFile(keyFilename);
    9799       
    98100        if (keyFile.exists()) {
     
    103105                FileInputStream fis = null;
    104106                try {
    105                     fis = new FileInputStream(keyFile);
     107                    fis = FileStreamFactory.getFileInputStream(keyFile);
    106108                    PrivateKey privkey = new PrivateKey();
    107109                    privkey.readBytes(fis);
     
    147149            FileOutputStream fos = null;
    148150            try {
    149                 fos = new FileOutputStream(infoFilename);
     151                fos = FileStreamFactory.getFileOutputStream(infoFilename);
    150152                info.writeBytes(fos);
    151153            } catch (DataFormatException dfe) {
  • router/java/src/net/i2p/router/transport/ntcp/EventPumper.java

    r5a8b3eb rb8f22bf  
    8282    public void stopPumping() {
    8383        _alive = false;
    84         if (_selector.isOpen())
     84        if (_selector != null &&_selector.isOpen())
    8585            _selector.wakeup();
    8686    }
Note: See TracChangeset for help on using the changeset viewer.