package i2p.susi.webmail.pop3;
import i2p.susi.debug.Debug;
import i2p.susi.webmail.WebMail;
import i2p.susi.util.Config;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import net.i2p.I2PAppContext;
import net.i2p.util.I2PAppThread;
import net.i2p.util.ConcurrentHashSet;
import net.i2p.util.SimpleTimer2;
/**
* Check for new mail periodically
*
* @since 0.9.13
*/
class BackgroundChecker {
private final POP3MailBox mailbox;
private final Set<String> toDelete;
private final SimpleTimer2.TimedEvent timer;
private volatile boolean isChecking;
private volatile boolean isDead;
private static final int DEFAULT_CHECK_MINUTES = 3*60;
private static final int MIN_CHECK_MINUTES = 15;
// short for testing
//private static final long MIN_IDLE = 10*60*1000;
private static final long MIN_IDLE = 30*60*1000;
// short for testing
//private static final long MIN_SINCE = 10*60*1000;
private static final long MIN_SINCE = 60*60*1000;
public BackgroundChecker(POP3MailBox mailbox) {
this.mailbox = mailbox;
toDelete = new ConcurrentHashSet<String>();
timer = new Checker();
}
public Collection<String> getQueued() {
List<String> rv = new ArrayList<String>(toDelete);
return rv;
}
public void cancel() {
isDead = true;
timer.cancel();
}
private static long getCheckTime() {
int minutes = DEFAULT_CHECK_MINUTES;
String con = Config.getProperty(WebMail.CONFIG_CHECK_MINUTES);
if (con != null) {
try {
int mins = Integer.parseInt(con);
// allow shorter for testing
if (mins < MIN_CHECK_MINUTES && Debug.getLevel() != Debug.DEBUG)
mins = MIN_CHECK_MINUTES;
minutes = mins;
} catch (NumberFormatException nfe) {}
}
return minutes * 60 * 1000L;
}
private class Checker extends SimpleTimer2.TimedEvent {
public Checker() {
super(I2PAppContext.getGlobalContext().simpleTimer2(), getCheckTime());
}
public void timeReached() {
if (isDead)
return;
if (!mailbox.isConnected() && !isChecking) {
long idle = System.currentTimeMillis() - mailbox.getLastActivity();
long last = System.currentTimeMillis() - mailbox.getLastChecked();
if (idle >= MIN_IDLE && last >= MIN_SINCE) {
Debug.debug(Debug.DEBUG, "Threading check for mail after " +
idle + " ms idle and " + last + " since last check");
Thread t = new Getter();
isChecking = true;
t.start();
} else {
Debug.debug(Debug.DEBUG, "Not checking after " +
idle + " ms idle and " + last + " since last check");
}
} else {
Debug.debug(Debug.DEBUG, "Not checking, still connected");
}
schedule(getCheckTime());
}
}
private class Getter extends I2PAppThread {
public Getter() {
super("Susimail-Getter");
}
public void run() {
try {
if (mailbox.connectToServer()) {
int found = mailbox.getNumMails();
if (found > 0) {
Debug.debug(Debug.DEBUG, "Found " + found + " mails, calling listener");
// may not really be new
mailbox.foundNewMail();
}
}
} finally {
isChecking = false;
if (!isDead)
timer.schedule(getCheckTime());
}
}
}
}