Author: toad
Date: 2006-04-27 19:40:38 +0000 (Thu, 27 Apr 2006)
New Revision: 8587

Added:
   trunk/freenet/src/freenet/clients/http/QueueToadlet.java
   trunk/freenet/src/freenet/support/SizeUtil.java
Modified:
   trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java
   trunk/freenet/src/freenet/clients/http/FproxyToadlet.java
   trunk/freenet/src/freenet/clients/http/PageMaker.java
   trunk/freenet/src/freenet/node/Node.java
   trunk/freenet/src/freenet/node/Version.java
   trunk/freenet/src/freenet/node/fcp/ClientGet.java
   trunk/freenet/src/freenet/node/fcp/ClientPut.java
   trunk/freenet/src/freenet/node/fcp/ClientPutBase.java
   trunk/freenet/src/freenet/node/fcp/ClientPutDir.java
   trunk/freenet/src/freenet/node/fcp/ClientRequest.java
   trunk/freenet/src/freenet/node/fcp/FCPClient.java
   trunk/freenet/src/freenet/node/fcp/FCPServer.java
   trunk/freenet/src/freenet/node/fcp/SimpleProgressMessage.java
Log:
662: Add global queue display page to Fproxy.
At the moment it is read-only.

Modified: trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java    
2006-04-27 15:45:46 UTC (rev 8586)
+++ trunk/freenet/src/freenet/client/async/SimpleManifestPutter.java    
2006-04-27 19:40:38 UTC (rev 8587)
@@ -167,6 +167,8 @@
        private boolean insertedManifest;
        private ClientPutState currentMetadataInserterState;
        private final String defaultName;
+       private int numberOfFiles;
+       private long totalSize;
        private final static String[] defaultDefaultNames =
                new String[] { "index.html", "index.htm", "default.html", 
"default.htm" };

@@ -232,6 +234,8 @@
                                        }
                                        runningPutHandlers.add(ph);
                                        putHandlersWaitingForMetadata.add(ph);
+                                       numberOfFiles++;
+                                       totalSize += data.size();
                                }
                                putHandlersByName.put(name, ph);
                        }
@@ -459,4 +463,12 @@
                        add(e, after, hm);
                }
        }
+
+       public int countFiles() {
+               return numberOfFiles;
+       }
+
+       public long totalSize() {
+               return totalSize;
+       }
 }

Modified: trunk/freenet/src/freenet/clients/http/FproxyToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/FproxyToadlet.java   2006-04-27 
15:45:46 UTC (rev 8586)
+++ trunk/freenet/src/freenet/clients/http/FproxyToadlet.java   2006-04-27 
19:40:38 UTC (rev 8587)
@@ -244,6 +244,9 @@

                        DarknetConnectionsToadlet darknetToadlet = new 
DarknetConnectionsToadlet(node, client);
                        server.register(darknetToadlet, "/darknet/", true);
+                       
+                       QueueToadlet queueToadlet = new 
QueueToadlet(node.getFCPServer(), client);
+                       server.register(queueToadlet, "/queue/", true);

                } catch (IOException ioe) {
                        Logger.error(node,"Failed to start fproxy: "+ioe, ioe);

Modified: trunk/freenet/src/freenet/clients/http/PageMaker.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/PageMaker.java       2006-04-27 
15:45:46 UTC (rev 8586)
+++ trunk/freenet/src/freenet/clients/http/PageMaker.java       2006-04-27 
19:40:38 UTC (rev 8587)
@@ -82,6 +82,7 @@
                                + "<li><a href=\"/plugins/\" title=\"Configure 
Plugins\">Plugins</a></li>\n"
                                + "<li><a href=\"/config/\" title=\"Configure 
your node\">Configuration</a></li>\n"
                                + "<li><a href=\"/darknet/\" title=\"Manage 
darknet connections\">Darknet</a></li>\n"
+                               + "<li><a href=\"/queue/\" title=\"Manage 
queued requests\">Queue</a></li>\n"
                                + "</ul>\n"
                                + "</div>\n");
        }

Added: trunk/freenet/src/freenet/clients/http/QueueToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/QueueToadlet.java    2006-04-27 
15:45:46 UTC (rev 8586)
+++ trunk/freenet/src/freenet/clients/http/QueueToadlet.java    2006-04-27 
19:40:38 UTC (rev 8587)
@@ -0,0 +1,432 @@
+package freenet.clients.http;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+import java.util.Iterator;
+import java.util.LinkedList;
+
+import freenet.client.HighLevelSimpleClient;
+import freenet.keys.FreenetURI;
+import freenet.node.fcp.ClientGet;
+import freenet.node.fcp.ClientPut;
+import freenet.node.fcp.ClientPutBase;
+import freenet.node.fcp.ClientPutDir;
+import freenet.node.fcp.ClientRequest;
+import freenet.node.fcp.FCPServer;
+import freenet.support.Fields;
+import freenet.support.HTMLEncoder;
+import freenet.support.Logger;
+import freenet.support.SizeUtil;
+import freenet.support.URLEncoder;
+
+public class QueueToadlet extends Toadlet {
+
+       final FCPServer fcp;
+       
+       public QueueToadlet(FCPServer fcp, HighLevelSimpleClient client) {
+               super(client);
+               this.fcp = fcp;
+               if(fcp == null) throw new NullPointerException();
+       }
+       
+       public void handleGet(URI uri, ToadletContext ctx) 
+       throws ToadletContextClosedException, IOException, RedirectException {
+               
+               StringBuffer buf = new StringBuffer(2048);
+               
+               ctx.getPageMaker().makeHead(buf, "Queued Requests");
+               
+               // First, get the queued requests, and separate them into 
different types.
+               
+               LinkedList completedDownloadToDisk = new LinkedList();
+               LinkedList completedDownloadToTemp = new LinkedList();
+               LinkedList completedUpload = new LinkedList();
+               LinkedList completedDirUpload = new LinkedList();
+               
+               LinkedList failedDownload = new LinkedList();
+               LinkedList failedUpload = new LinkedList();
+               LinkedList failedDirUpload = new LinkedList();
+               
+               LinkedList uncompletedDownload = new LinkedList();
+               LinkedList uncompletedUpload = new LinkedList();
+               LinkedList uncompletedDirUpload = new LinkedList();
+               
+               ClientRequest[] reqs = fcp.getGlobalRequests();
+               Logger.minor(this, "Request count: "+reqs.length);
+               
+               for(int i=0;i<reqs.length;i++) {
+                       ClientRequest req = reqs[i];
+                       if(req instanceof ClientGet) {
+                               ClientGet cg = (ClientGet) req;
+                               if(cg.hasSucceeded()) {
+                                       if(cg.isDirect())
+                                               completedDownloadToTemp.add(cg);
+                                       else if(cg.isToDisk())
+                                               completedDownloadToDisk.add(cg);
+                                       else
+                                               // FIXME
+                                               Logger.error(this, "Don't know 
what to do with "+cg);
+                               } else if(cg.hasFinished()) {
+                                       failedDownload.add(cg);
+                               } else {
+                                       uncompletedDownload.add(cg);
+                               }
+                       } else if(req instanceof ClientPut) {
+                               ClientPut cp = (ClientPut) req;
+                               if(cp.hasSucceeded()) {
+                                       completedUpload.add(cp);
+                               } else if(cp.hasFinished()) {
+                                       failedUpload.add(cp);
+                               } else {
+                                       uncompletedUpload.add(cp);
+                               }
+                       } else if(req instanceof ClientPutDir) {
+                               ClientPutDir cp = (ClientPutDir) req;
+                               if(cp.hasSucceeded()) {
+                                       completedDirUpload.add(cp);
+                               } else if(cp.hasFinished()) {
+                                       failedDirUpload.add(cp);
+                               } else {
+                                       uncompletedDirUpload.add(cp);
+                               }
+                       }
+               }
+               
+               if(!(completedDownloadToTemp.isEmpty() && 
completedDownloadToDisk.isEmpty() &&
+                               completedUpload.isEmpty() && 
completedDirUpload.isEmpty())) {
+                       writeBigHeading("Completed requests", buf);
+               
+                       if(!completedDownloadToTemp.isEmpty()) {
+                               writeTableHead("Completed downloads to 
temporary space", new String[] { "Key", "Size", "Type", "Download", 
"Persistence", "Identifier" }, buf );
+                               for(Iterator i = 
completedDownloadToTemp.iterator();i.hasNext();) {
+                                       ClientGet p = (ClientGet) i.next();
+                                       writeRowStart(buf);
+                                       writeKeyCell(p.getURI(), buf);
+                                       writeSizeCell(p.getDataSize(), buf);
+                                       writeTypeCell(p.getMIMEType(), buf);
+                                       writeDownloadCell(p, buf);
+                                       writePersistenceCell(p, buf);
+                                       writeIdentifierCell(p, buf);
+                                       writeRowEnd(buf);
+                               }
+                               writeTableEnd(buf);
+                       }
+                       
+                       if(!completedDownloadToDisk.isEmpty()) {
+                               writeTableHead("Completed downloads to disk", 
new String[] { "Key", "Filename", "Size", "Type", "Download", "Persistence", 
"Identifier" }, buf);
+                               for(Iterator 
i=completedDownloadToDisk.iterator();i.hasNext();) {
+                                       ClientGet p = (ClientGet) i.next();
+                                       writeRowStart(buf);
+                                       writeKeyCell(p.getURI(), buf);
+                                       writeFilenameCell(p.getDestFilename(), 
buf);
+                                       writeSizeCell(p.getDataSize(), buf);
+                                       writeTypeCell(p.getMIMEType(), buf);
+                                       writeDownloadCell(p, buf);
+                                       writePersistenceCell(p, buf);
+                                       writeIdentifierCell(p, buf);
+                                       writeRowEnd(buf);
+                               }
+                               writeTableEnd(buf);
+                       }
+
+                       if(!completedUpload.isEmpty()) {
+                               writeTableHead("Completed uploads", new 
String[] { "Key", "Filename", "Size", "Type", "Persistence", "Identifier" }, 
buf);
+                               for(Iterator 
i=completedUpload.iterator();i.hasNext();) {
+                                       ClientPut p = (ClientPut) i.next();
+                                       writeRowStart(buf);
+                                       writeKeyCell(p.getFinalURI(), buf);
+                                       if(p.isDirect())
+                                               writeDirectCell(buf);
+                                       else
+                                               
writeFilenameCell(p.getOrigFilename(), buf);
+                                       writeSizeCell(p.getDataSize(), buf);
+                                       writeTypeCell(p.getMIMEType(), buf);
+                                       writePersistenceCell(p, buf);
+                                       writeIdentifierCell(p, buf);
+                                       writeRowEnd(buf);
+                               }
+                               writeTableEnd(buf);
+                       }
+                       
+                       if(!completedDirUpload.isEmpty()) {
+                               // FIXME include filename??
+                               writeTableHead("Completed directory uploads", 
new String[] { "Key", "Files", "Total Size", "Persistence", "Identifier" }, 
buf);
+                               for(Iterator 
i=completedUpload.iterator();i.hasNext();) {
+                                       ClientPutDir p = (ClientPutDir) 
i.next();
+                                       writeRowStart(buf);
+                                       writeKeyCell(p.getFinalURI(), buf);
+                                       writeNumberCell(p.getNumberOfFiles(), 
buf);
+                                       writeSizeCell(p.getTotalDataSize(), 
buf);
+                                       writePersistenceCell(p, buf);
+                                       writeIdentifierCell(p, buf);
+                                       writeRowEnd(buf);
+                               }
+                               writeTableEnd(buf);
+                       }
+               }
+
+               /* FIXME color-coded progress bars.
+                * It would be really nice to have a color-coded progress bar.
+                * We can then show what part is successful, what part isn't 
tried yet,
+                * what part has each different well known error code...
+                */
+               
+               if(!(failedDownload.isEmpty() && failedUpload.isEmpty())) {
+                       writeBigHeading("Failed requests", buf);
+                       if(!failedDownload.isEmpty()) {
+                               writeTableHead("Failed downloads", new String[] 
{ "Key", "Filename", "Size", "Type", "Success", "Reason", "Persistence", 
"Identifier" }, buf);
+                               for(Iterator 
i=failedDownload.iterator();i.hasNext();) {
+                                       ClientGet p = (ClientGet) i.next();
+                                       writeRowStart(buf);
+                                       writeKeyCell(p.getURI(), buf);
+                                       if(p.isDirect())
+                                               writeDirectCell(buf);
+                                       else
+                                               
writeFilenameCell(p.getDestFilename(), buf);
+                                       writeSizeCell(p.getDataSize(), buf);
+                                       writeTypeCell(p.getMIMEType(), buf);
+                                       writeSuccessFractionCell(p, buf);
+                                       writeFailureReasonCell(p, buf);
+                                       writePersistenceCell(p, buf);
+                                       writeIdentifierCell(p, buf);
+                                       writeRowEnd(buf);
+                               }
+                               writeTableEnd(buf);
+                       }
+                       
+                       if(!failedUpload.isEmpty()) {
+                               writeTableHead("Failed uploads", new String[] { 
"Key", "Filename", "Size", "Type", "Success", "Reason", "Persistence", 
"Identifier" }, buf);
+                               for(Iterator 
i=failedUpload.iterator();i.hasNext();) {
+                                       ClientPut p = (ClientPut) i.next();
+                                       writeRowStart(buf);
+                                       writeKeyCell(p.getFinalURI(), buf);
+                                       if(p.isDirect())
+                                               writeDirectCell(buf);
+                                       else
+                                               
writeFilenameCell(p.getOrigFilename(), buf);
+                                       writeSizeCell(p.getDataSize(), buf);
+                                       writeTypeCell(p.getMIMEType(), buf);
+                                       writeSuccessFractionCell(p, buf);
+                                       writeFailureReasonCell(p, buf);
+                                       writePersistenceCell(p, buf);
+                                       writeIdentifierCell(p, buf);
+                                       writeRowEnd(buf);
+                               }
+                               writeTableEnd(buf);
+                       }
+                       
+                       if(!failedDirUpload.isEmpty()) {
+                               writeTableHead("Failed directory uploads", new 
String[] { "Key", "Files", "Total Size", "Success", "Reason", "Persistence", 
"Identifier" }, buf);
+                               for(Iterator 
i=failedDirUpload.iterator();i.hasNext();) {
+                                       ClientPutDir p = (ClientPutDir) 
i.next();
+                                       writeRowStart(buf);
+                                       writeKeyCell(p.getFinalURI(), buf);
+                                       writeNumberCell(p.getNumberOfFiles(), 
buf);
+                                       writeSizeCell(p.getTotalDataSize(), 
buf);
+                                       writeSuccessFractionCell(p, buf);
+                                       writeFailureReasonCell(p, buf);
+                                       writePersistenceCell(p, buf);
+                                       writeIdentifierCell(p, buf);
+                                       writeRowEnd(buf);
+                               }
+                               writeTableEnd(buf);
+                       }
+               }
+               
+               if(!(uncompletedDownload.isEmpty() && 
uncompletedUpload.isEmpty() && 
+                               uncompletedDirUpload.isEmpty())) {
+                       writeBigHeading("Requests in progress", buf);
+                       if(!uncompletedDownload.isEmpty()) {
+                               writeTableHead("Downloads in progress", new 
String[] { "Key", "Filename", "Size", "Type", "Success", "Persistence", 
"Identifier" }, buf);
+                               for(Iterator i = 
uncompletedDownload.iterator();i.hasNext();) {
+                                       ClientGet p = (ClientGet) i.next();
+                                       writeRowStart(buf);
+                                       writeKeyCell(p.getURI(), buf);
+                                       if(p.isDirect())
+                                               writeDirectCell(buf);
+                                       else
+                                               
writeFilenameCell(p.getDestFilename(), buf);
+                                       writeSizeCell(p.getDataSize(), buf);
+                                       writeTypeCell(p.getMIMEType(), buf);
+                                       writeSuccessFractionCell(p, buf);
+                                       writePersistenceCell(p, buf);
+                                       writeIdentifierCell(p, buf);
+                                       writeRowEnd(buf);
+                               }
+                               writeTableEnd(buf);
+                       }
+                       
+                       if(!uncompletedUpload.isEmpty()) {
+                               writeTableHead("Uploads in progress", new 
String[] { "Key", "Filename", "Size", "Type", "Success", "Persistence", 
"Identifier" }, buf);
+                               for(Iterator i = 
uncompletedDownload.iterator();i.hasNext();) {
+                                       ClientPut p = (ClientPut) i.next();
+                                       writeRowStart(buf);
+                                       writeKeyCell(p.getFinalURI(), buf);
+                                       if(p.isDirect())
+                                               writeDirectCell(buf);
+                                       else
+                                               
writeFilenameCell(p.getOrigFilename(), buf);
+                                       writeSizeCell(p.getDataSize(), buf);
+                                       writeTypeCell(p.getMIMEType(), buf);
+                                       writeSuccessFractionCell(p, buf);
+                                       writePersistenceCell(p, buf);
+                                       writeIdentifierCell(p, buf);
+                                       writeRowEnd(buf);
+                               }
+                               writeTableEnd(buf);
+                       }
+                       
+                       if(!uncompletedDirUpload.isEmpty()) {
+                               writeTableHead("Directory uploads in progress", 
new String[] { "Key", "Files", "Total Size", "Success", "Persistence", 
"Identifier" }, buf);
+                               for(Iterator 
i=completedUpload.iterator();i.hasNext();) {
+                                       ClientPutDir p = (ClientPutDir) 
i.next();
+                                       writeRowStart(buf);
+                                       writeKeyCell(p.getFinalURI(), buf);
+                                       writeNumberCell(p.getNumberOfFiles(), 
buf);
+                                       writeSizeCell(p.getTotalDataSize(), 
buf);
+                                       writeSuccessFractionCell(p, buf);
+                                       writePersistenceCell(p, buf);
+                                       writeIdentifierCell(p, buf);
+                                       writeRowEnd(buf);
+                               }
+                               writeTableEnd(buf);
+                       }
+               }
+               
+               ctx.getPageMaker().makeTail(buf);
+               
+               this.writeReply(ctx, 200, "text/html", "OK", buf.toString());
+       }
+
+       
+       private void writeFailureReasonCell(ClientRequest p, StringBuffer buf) {
+               buf.append("<td>");
+               String s = p.getFailureReason();
+               if(s == null)
+                       buf.append("UNKNOWN");
+               else
+                       buf.append(s);
+               buf.append("</td>\n");
+       }
+
+       private void writeSuccessFractionCell(ClientRequest p, StringBuffer 
buf) {
+               double frac = p.getSuccessFraction();
+               if(frac < 0) {
+                       buf.append("<td>UNKNOWN</td>\n");
+               } else {
+                       buf.append("<td>");
+                       buf.append(frac * 100);
+                       buf.append("%</td>\n");
+               }
+       }
+
+       private void writeNumberCell(int numberOfFiles, StringBuffer buf) {
+               buf.append("<td>");
+               buf.append(numberOfFiles);
+               buf.append("</td>\n");
+       }
+
+       private void writeDirectCell(StringBuffer buf) {
+               buf.append("<td>DIRECT</td>\n");
+       }
+
+       private void writeFilenameCell(File destFilename, StringBuffer buf) {
+               buf.append("<td>");
+               if(destFilename == null)
+                       buf.append("NONE");
+               else
+                       buf.append(HTMLEncoder.encode(destFilename.toString()));
+               buf.append("</td>\n");
+       }
+
+       private void writeTableEnd(StringBuffer buf) {
+               buf.append("</table>");
+       }
+
+       private void writeRowEnd(StringBuffer buf) {
+               buf.append("</tr>\n");
+       }
+
+       private void writeIdentifierCell(ClientRequest p, StringBuffer buf) {
+               buf.append("<td>");
+               buf.append(HTMLEncoder.encode(p.getIdentifier()));
+               buf.append("</td>\n");
+       }
+
+       private void writePersistenceCell(ClientRequest p, StringBuffer buf) {
+               buf.append("<td>");
+               if(!p.isPersistent())
+                       buf.append("<font color=\"black\">NONE</font>");
+               else if(!p.isPersistentForever())
+                       buf.append("<font color=\"blue\">REBOOT</font>");
+               else
+                       buf.append("<font color=\"green\">FOREVER</font>");
+               buf.append("</td>\n");
+       }
+
+       private void writeDownloadCell(ClientGet p, StringBuffer buf) {
+               buf.append("<td>");
+               buf.append("FIXME");
+               buf.append("</td>");
+       }
+
+       private void writeTypeCell(String type, StringBuffer buf) {
+               buf.append("<td>");
+               if(type != null)
+                       buf.append(type);
+               else
+                       buf.append("UNKNOWN");
+               buf.append("</td>\n");
+       }
+
+       private void writeSizeCell(long dataSize, StringBuffer buf) {
+               buf.append("<td>");
+               if(dataSize >= 0)
+                       buf.append(SizeUtil.formatSize(dataSize));
+               else
+                       buf.append("UNKNOWN");
+               buf.append("</td>\n");
+       }
+
+       private void writeKeyCell(FreenetURI uri, StringBuffer buf) {
+               buf.append("<td>");
+               buf.append("<a href=\"/");
+               String u = uri.toString(false);
+               buf.append(URLEncoder.encode(u));
+               buf.append("\">");
+               // FIXME too long? maybe only show the human readable bit?
+               buf.append(HTMLEncoder.encode(u));
+               buf.append("</a></td>\n");
+       }
+
+       private void writeRowStart(StringBuffer buf) {
+               buf.append("<tr>");
+       }
+
+       private void writeTableHead(String string, String[] strings, 
StringBuffer buf) {
+               buf.append("<h2>");
+               buf.append(string);
+               buf.append("</h2>\n");
+               buf.append("<table border=\"0\">\n");
+               buf.append("<tr>");
+               for(int i=0;i<strings.length;i++) {
+                       buf.append("<th>");
+                       buf.append(strings[i]);
+                       buf.append("</th>");
+               }
+               buf.append("\n");
+       }
+
+       private void writeBigHeading(String string, StringBuffer buf) {
+               buf.append("<h1>");
+               buf.append(string);
+               buf.append("</h1>\n");
+       }
+
+       public String supportedMethods() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+}

Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java    2006-04-27 15:45:46 UTC (rev 
8586)
+++ trunk/freenet/src/freenet/node/Node.java    2006-04-27 19:40:38 UTC (rev 
8587)
@@ -1024,6 +1024,15 @@
                        throw new NodeInitException(EXIT_COULD_NOT_START_TMCI, 
"Could not start TMCI: "+e);
                }

+        // FCP (including persistent requests so needs to start before Fproxy)
+        try {
+                       fcpServer = FCPServer.maybeCreate(this, config);
+               } catch (IOException e) {
+                       throw new NodeInitException(EXIT_COULD_NOT_START_FCP, 
"Could not start FCP: "+e);
+               } catch (InvalidConfigValueException e) {
+                       throw new NodeInitException(EXIT_COULD_NOT_START_FCP, 
"Could not start FCP: "+e);
+               }
+        
         // Fproxy
         // FIXME this is a hack, the real way to do this is plugins
         try {
@@ -1043,15 +1052,6 @@
         server.register(pproxy, "/plugins/", true);
                 * */

-        // FCP
-        try {
-                       fcpServer = FCPServer.maybeCreate(this, config);
-               } catch (IOException e) {
-                       throw new NodeInitException(EXIT_COULD_NOT_START_FCP, 
"Could not start FCP: "+e);
-               } catch (InvalidConfigValueException e) {
-                       throw new NodeInitException(EXIT_COULD_NOT_START_FCP, 
"Could not start FCP: "+e);
-               }
-        
         // SNMP
         SNMPStarter.maybeCreate(this, config);


Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2006-04-27 15:45:46 UTC (rev 
8586)
+++ trunk/freenet/src/freenet/node/Version.java 2006-04-27 19:40:38 UTC (rev 
8587)
@@ -20,7 +20,7 @@
        public static final String protocolVersion = "1.0";

        /** The build number of the current revision */
-       private static final int buildNumber = 661;
+       private static final int buildNumber = 662;

        /** Oldest build of Fred we will talk to */
        private static final int lastGoodBuild = 591;

Modified: trunk/freenet/src/freenet/node/fcp/ClientGet.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientGet.java   2006-04-27 15:45:46 UTC 
(rev 8586)
+++ trunk/freenet/src/freenet/node/fcp/ClientGet.java   2006-04-27 19:40:38 UTC 
(rev 8587)
@@ -48,9 +48,9 @@
        /** Did the request succeed? Valid if finished. */
        private boolean succeeded;
        /** Length of the found data */
-       private long foundDataLength;
+       private long foundDataLength = -1;
        /** MIME type of the found data */
-       private String foundDataMimeType;
+       private String foundDataMimeType = null;
        /** Details of request failure */
        private GetFailedMessage getFailedMessage;
        /** Succeeded but failed to return data e.g. couldn't write to file */
@@ -398,4 +398,48 @@
                        returnBucket.free();
        }

+       public boolean hasSucceeded() {
+               return succeeded;
+       }
+
+       public boolean isDirect() {
+               return this.returnType == ClientGetMessage.RETURN_TYPE_DIRECT;
+       }
+
+       public boolean isToDisk() {
+               return this.returnType == ClientGetMessage.RETURN_TYPE_DISK;
+       }
+
+       public FreenetURI getURI() {
+               return uri;
+       }
+
+       public long getDataSize() {
+               return foundDataLength;
+       }
+
+       public String getMIMEType() {
+               return foundDataMimeType;
+       }
+
+       public File getDestFilename() {
+               return targetFile;
+       }
+
+       public double getSuccessFraction() {
+               if(progressPending != null) {
+                       return progressPending.getFraction();
+               } else
+                       return -1;
+       }
+
+       public String getFailureReason() {
+               if(getFailedMessage == null)
+                       return null;
+               String s = getFailedMessage.shortCodeDescription;
+               if(getFailedMessage.extraDescription != null)
+                       s += ": "+getFailedMessage.extraDescription;
+               return s;
+       }
+
 }

Modified: trunk/freenet/src/freenet/node/fcp/ClientPut.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientPut.java   2006-04-27 15:45:46 UTC 
(rev 8586)
+++ trunk/freenet/src/freenet/node/fcp/ClientPut.java   2006-04-27 19:40:38 UTC 
(rev 8587)
@@ -172,5 +172,31 @@
        protected String getTypeName() {
                return "PUT";
        }
-       
+
+       public boolean hasSucceeded() {
+               return succeeded;
+       }
+
+       public FreenetURI getFinalURI() {
+               return generatedURI;
+       }
+
+       public boolean isDirect() {
+               return uploadFrom == ClientPutMessage.UPLOAD_FROM_DIRECT;
+       }
+
+       public File getOrigFilename() {
+               if(uploadFrom != ClientPutMessage.UPLOAD_FROM_DISK)
+                       return null;
+               return origFilename;
+       }
+
+       public long getDataSize() {
+               return data.size();
+       }
+
+       public String getMIMEType() {
+               return clientMetadata.getMIMEType();
+       }
+
 }

Modified: trunk/freenet/src/freenet/node/fcp/ClientPutBase.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientPutBase.java       2006-04-27 
15:45:46 UTC (rev 8586)
+++ trunk/freenet/src/freenet/node/fcp/ClientPutBase.java       2006-04-27 
19:40:38 UTC (rev 8587)
@@ -41,7 +41,7 @@
         */
        private PutFailedMessage putFailedMessage;
        /** URI generated for the insert. */
-       private FreenetURI generatedURI;
+       protected FreenetURI generatedURI;
        // This could be a SimpleProgress, or it could be started/finished 
compression.
        // Not that important, so not saved on persistence.
        // Probably saving it would conflict with later changes (full 
persistence at
@@ -228,4 +228,22 @@

        protected abstract String getTypeName();

+       public double getSuccessFraction() {
+               if(progressMessage != null) {
+                       if(progressMessage instanceof SimpleProgressMessage)
+                               return 
((SimpleProgressMessage)progressMessage).getFraction();
+                       else return 0;
+               } else
+                       return -1;
+       }
+
+       public String getFailureReason() {
+               if(putFailedMessage == null)
+                       return null;
+               String s = putFailedMessage.shortCodeDescription;
+               if(putFailedMessage.extraDescription != null)
+                       s += ": "+putFailedMessage.extraDescription;
+               return s;
+       }
+       
 }

Modified: trunk/freenet/src/freenet/node/fcp/ClientPutDir.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientPutDir.java        2006-04-27 
15:45:46 UTC (rev 8586)
+++ trunk/freenet/src/freenet/node/fcp/ClientPutDir.java        2006-04-27 
19:40:38 UTC (rev 8587)
@@ -25,6 +25,8 @@
        private final HashMap manifestElements;
        private final SimpleManifestPutter putter;
        private final String defaultName;
+       private final long totalSize;
+       private final int numberOfFiles;

        public ClientPutDir(FCPConnectionHandler handler, ClientPutDirMessage 
message, 
                        HashMap manifestElements) throws 
IdentifierCollisionException {
@@ -40,7 +42,14 @@
                } catch (InserterException e) {
                        onFailure(e, null);
                        p = null;
-               } 
+               }
+               if(p != null) {
+                       numberOfFiles = p.countFiles();
+                       totalSize = p.totalSize();
+               } else {
+                       numberOfFiles = -1;
+                       totalSize = -1;
+               }
                putter = p;
                if(persistenceType != PERSIST_CONNECTION)
                        client.register(this);
@@ -51,6 +60,8 @@
                SimpleFieldSet files = fs.subset("Files");
                defaultName = fs.get("DefaultName");
                // Flattened for disk, sort out afterwards
+               int fileCount = 0;
+               long size = 0;
                Vector v = new Vector();
                for(int i=0;;i++) {
                        String num = Integer.toString(i);
@@ -62,7 +73,7 @@
                                throw new PersistenceParseException("No Name on 
"+i);
                        String contentTypeOverride = 
subset.get("Metadata.ContentType");
                        String uploadFrom = subset.get("UploadFrom");
-                       Bucket data;
+                       Bucket data = null;
                        Logger.minor(this, "Parsing "+i);
                        Logger.minor(this, "UploadFrom="+uploadFrom);
                        ManifestElement me;
@@ -79,6 +90,7 @@
                                        data = null;
                                }
                                me = new ManifestElement(name, data, 
contentTypeOverride, sz);
+                               fileCount++;
                        } else if(uploadFrom.equalsIgnoreCase("disk")) {
                                long sz = 
Long.parseLong(subset.get("DataLength"));
                                // Disk
@@ -92,12 +104,15 @@
                                }
                                data = new FileBucket(ff, true, false, false, 
false);
                                me = new ManifestElement(name, data, 
contentTypeOverride, sz);
+                               fileCount++;
                        } else if(uploadFrom.equalsIgnoreCase("redirect")) {
                                FreenetURI targetURI = new 
FreenetURI(subset.get("TargetURI"));
                                me = new ManifestElement(name, targetURI, 
contentTypeOverride);
                        } else
                                throw new PersistenceParseException("Don't know 
UploadFrom="+uploadFrom);
                        v.add(me);
+                       if(data != null && data.size() > 0)
+                               size += data.size();
                }
                manifestElements = SimpleManifestPutter.unflatten(v);
                SimpleManifestPutter p = null;
@@ -110,6 +125,8 @@
                        p = null;
                }
                putter = p;
+               numberOfFiles = fileCount;
+               totalSize = size;
                if(!finished)
                        start();
        }
@@ -206,4 +223,25 @@
                return "PUTDIR";
        }

+       public boolean hasSucceeded() {
+               return succeeded;
+       }
+
+       public FreenetURI getFinalURI() {
+               return generatedURI;
+       }
+
+       public boolean isDirect() {
+               // TODO Auto-generated method stub
+               return false;
+       }
+
+       public int getNumberOfFiles() {
+               return numberOfFiles;
+       }
+
+       public long getTotalDataSize() {
+               return totalSize;
+       }
+
 }

Modified: trunk/freenet/src/freenet/node/fcp/ClientRequest.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientRequest.java       2006-04-27 
15:45:46 UTC (rev 8586)
+++ trunk/freenet/src/freenet/node/fcp/ClientRequest.java       2006-04-27 
19:40:38 UTC (rev 8587)
@@ -214,4 +214,8 @@
         * Get a SimpleFieldSet representing this request.
         */
        public abstract SimpleFieldSet getFieldSet() throws IOException;
+
+       public abstract double getSuccessFraction();
+
+       public abstract String getFailureReason();
 }

Modified: trunk/freenet/src/freenet/node/fcp/FCPClient.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/FCPClient.java   2006-04-27 15:45:46 UTC 
(rev 8586)
+++ trunk/freenet/src/freenet/node/fcp/FCPClient.java   2006-04-27 19:40:38 UTC 
(rev 8587)
@@ -163,12 +163,12 @@
                return !(runningPersistentRequests.isEmpty() && 
completedUnackedRequests.isEmpty());
        }

-       public void addPersistentRequests(Vector v) {
+       public void addPersistentRequests(Vector v, boolean onlyForever) {
                synchronized(this) {
                        Iterator i = runningPersistentRequests.iterator();
                        while(i.hasNext()) {
                                ClientRequest req = (ClientRequest) i.next();
-                               if(req.isPersistentForever())
+                               if(req.isPersistentForever() || !onlyForever)
                                        v.add(req);
                        }
                        Object[] unacked = completedUnackedRequests.toArray();

Modified: trunk/freenet/src/freenet/node/fcp/FCPServer.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/FCPServer.java   2006-04-27 15:45:46 UTC 
(rev 8586)
+++ trunk/freenet/src/freenet/node/fcp/FCPServer.java   2006-04-27 19:40:38 UTC 
(rev 8587)
@@ -502,11 +502,17 @@
                        Iterator i = clientsByName.values().iterator();
                        while(i.hasNext()) {
                                FCPClient client = (FCPClient) (i.next());
-                               client.addPersistentRequests(v);
+                               client.addPersistentRequests(v, true);
                        }
-                       globalClient.addPersistentRequests(v);
+                       globalClient.addPersistentRequests(v, true);
                }
                return (ClientRequest[]) v.toArray(new ClientRequest[v.size()]);
        }

+       public ClientRequest[] getGlobalRequests() {
+               Vector v = new Vector();
+               globalClient.addPersistentRequests(v, false);
+               return (ClientRequest[]) v.toArray(new ClientRequest[v.size()]);
+       }
+
 }

Modified: trunk/freenet/src/freenet/node/fcp/SimpleProgressMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/SimpleProgressMessage.java       
2006-04-27 15:45:46 UTC (rev 8586)
+++ trunk/freenet/src/freenet/node/fcp/SimpleProgressMessage.java       
2006-04-27 19:40:38 UTC (rev 8587)
@@ -34,4 +34,8 @@
                throw new 
MessageInvalidException(ProtocolErrorMessage.INVALID_MESSAGE, "SimpleProgress 
goes from server to client not the other way around", ident);
        }

+       public double getFraction() {
+               return (double) event.fetchedBlocks / (double) 
event.totalBlocks;
+       }
+
 }

Added: trunk/freenet/src/freenet/support/SizeUtil.java
===================================================================
--- trunk/freenet/src/freenet/support/SizeUtil.java     2006-04-27 15:45:46 UTC 
(rev 8586)
+++ trunk/freenet/src/freenet/support/SizeUtil.java     2006-04-27 19:40:38 UTC 
(rev 8587)
@@ -0,0 +1,32 @@
+package freenet.support;
+
+/**
+ * Size formatting utility.
+ */
+public class SizeUtil {
+
+       public static String formatSize(long sz) {
+               // First determine suffix
+               
+               String suffixes = "kMGTPEZY";
+               long s = 1;
+               int i;
+               for(i=0;i<suffixes.length();i++) {
+                       s *= 1000;
+                       if(s > sz) {
+                               break;
+                               // Smaller than multiplier [i] - use the 
previous one
+                       }
+               }
+               
+               s /= 1000; // we use the previous unit
+               double mantissa = (double)sz / (double)s;
+               String o = Double.toString(mantissa);
+               if(o.indexOf('.') > -1 && o.indexOf('E') == -1 && o.length() > 
4)
+                       o = o.substring(0, 4);
+               if(i > 0) o += suffixes.charAt(i-1);
+               o += "B";
+               return o;
+       }
+
+}


Reply via email to