package freenet.node; import freenet.support.Logger; import freenet.support.TimeUtil; /** * Represents an insert. * @author Matthew Toseland <toad@amphibian.dyndns.org> (0xE43DA450) */ public class InsertTag extends UIDTag { final boolean ssk; enum START { LOCAL, REMOTE } final START start; private Throwable handlerThrew; private boolean senderStarted; private boolean senderFinished; InsertTag(boolean ssk, START start, PeerNode source, boolean realTimeFlag, long uid, Node node) { super(source, realTimeFlag, uid, node); this.start = start; this.ssk = ssk; } public synchronized void startedSender() { senderStarted = true; } public void finishedSender() { boolean noRecordUnlock; synchronized(this) { senderFinished = true; if(!mustUnlock()) return; noRecordUnlock = this.noRecordUnlock; } innerUnlock(noRecordUnlock); } @Override protected synchronized boolean mustUnlock() { if(senderStarted && !senderFinished) return false; return super.mustUnlock(); } public synchronized void handlerThrew(Throwable t) { handlerThrew = t; } @Override public void logStillPresent(Long uid) { StringBuffer sb = new StringBuffer(); sb.append("Still present after ").append(TimeUtil.formatTime(age())); sb.append(" : ").append(uid).append(" : start=").append(start); sb.append(" ssk=").append(ssk); sb.append(" thrown=").append(handlerThrew); sb.append(" : "); sb.append(super.toString()); if(handlerThrew != null) Logger.error(this, sb.toString(), handlerThrew); else Logger.error(this, sb.toString()); } @Override public synchronized int expectedTransfersIn(boolean ignoreLocalVsRemote, int outwardTransfersPerInsert, boolean forAccept) { if(!accepted) return 0; return ((!isLocal()) || ignoreLocalVsRemote) ? 1 : 0; } @Override public synchronized int expectedTransfersOut(boolean ignoreLocalVsRemote, int outwardTransfersPerInsert, boolean forAccept) { if(!accepted) return 0; if(notRoutedOnwards) return 0; else return outwardTransfersPerInsert; } @Override public boolean isSSK() { return ssk; } @Override public boolean isInsert() { return true; } @Override public boolean isOfferReply() { return false; } }