package freenet.clients.http.updateableelements; import freenet.client.FetchContext; import freenet.clients.http.FProxyFetchInProgress; import freenet.clients.http.FProxyFetchResult; import freenet.clients.http.FProxyFetchTracker; import freenet.clients.http.FProxyFetchWaiter; import freenet.clients.http.FProxyToadlet; import freenet.clients.http.SimpleToadletServer; import freenet.clients.http.ToadletContext; import freenet.clients.http.complexhtmlnodes.SecondCounterNode; import freenet.keys.FreenetURI; import freenet.support.Base64; import freenet.support.HTMLNode; import freenet.support.SizeUtil; /** This pushed element renders the information box when a page is downloading on the progress page. */ public class ProgressInfoElement extends BaseUpdateableElement { private FProxyFetchTracker tracker; private final FreenetURI key; private final FetchContext fctx; private long maxSize; private NotifierFetchListener fetchListener; /** It displays more info on advanced mode */ private boolean isAdvancedMode; public ProgressInfoElement(FProxyFetchTracker tracker, FreenetURI key, FetchContext fctx, long maxSize, boolean isAdvancedMode, ToadletContext ctx, boolean pushed) { super("span", ctx); this.tracker = tracker; this.key = key; this.fctx = fctx; this.maxSize = maxSize; this.isAdvancedMode = isAdvancedMode; init(pushed); if(!pushed) return; fetchListener = new NotifierFetchListener(((SimpleToadletServer) ctx.getContainer()).pushDataManager, this); tracker.getFetchInProgress(key, maxSize, fctx).addListener(fetchListener); } @Override public void updateState(boolean initial) { children.clear(); FProxyFetchWaiter waiter = tracker.makeWaiterForFetchInProgress(key, maxSize, fctx); FProxyFetchResult fr = waiter == null ? null : waiter.getResult(); if (fr == null) { addChild("div", "No fetcher found"); return; } addChild("#", FProxyToadlet.l10n("filenameLabel")+ " "); addChild("a", "href", "/"+key.toString(false, false), key.getPreferredFilename()); if(fr.mimeType != null) addChild("br", FProxyToadlet.l10n("contentTypeLabel")+" "+fr.mimeType); if(fr.size > 0) addChild("br", "Size: "+SizeUtil.formatSize(fr.size)); if(isAdvancedMode) { addChild("br", FProxyToadlet.l10n("blocksDetail", new String[] { "fetched", "required", "total", "failed", "fatallyfailed" }, new String[] { Integer.toString(fr.fetchedBlocks), Integer.toString(fr.requiredBlocks), Integer.toString(fr.totalBlocks), Integer.toString(fr.failedBlocks), Integer.toString(fr.fatallyFailedBlocks) })); } long elapsed = System.currentTimeMillis() - fr.timeStarted; addChild("br"); addChild(new SecondCounterNode(elapsed, true, FProxyToadlet.l10n("timeElapsedLabel") + " ")); long eta = fr.eta - elapsed; if (eta > 0) { addChild("br"); addChild(new SecondCounterNode(eta, false, "ETA: ")); } if (ctx.getContainer().isFProxyJavascriptEnabled()) { HTMLNode lastRefreshNode = new HTMLNode("span", "class", "jsonly"); lastRefreshNode.addChild("br"); lastRefreshNode.addChild(new SecondCounterNode(0, true, FProxyToadlet.l10n("lastRefresh"))); addChild(lastRefreshNode); } if(fr.goneToNetwork) addChild("p", FProxyToadlet.l10n("progressDownloading")); else addChild("p", FProxyToadlet.l10n("progressCheckingStore")); if(!fr.finalizedBlocks) addChild("p", FProxyToadlet.l10n("progressNotFinalized")); if (waiter != null) { tracker.getFetchInProgress(key, maxSize, fctx).close(waiter); } if (fr != null) { tracker.getFetchInProgress(key, maxSize, fctx).close(fr); } } @Override public String getUpdaterId(String requestId) { return getId(key); } public static String getId(FreenetURI uri) { return Base64.encodeStandardUTF8(("progressinfo[URI:" + uri.toString() + "]")); } @Override public void dispose() { FProxyFetchInProgress progress = tracker.getFetchInProgress(key, maxSize, fctx); if (progress != null) { progress.removeListener(fetchListener); } } @Override public String getUpdaterType() { return UpdaterConstants.REPLACER_UPDATER; } @Override public String toString() { return "ProgressInfoElement[key:" + key + ",maxSize:" + maxSize + ",updaterId:" + getUpdaterId(null) + "]"; } }