Author: toad
Date: 2008-06-17 18:17:29 +0000 (Tue, 17 Jun 2008)
New Revision: 20410

Modified:
   branches/db4o/freenet/src/freenet/clients/http/QueueToadlet.java
   branches/db4o/freenet/src/freenet/node/fcp/FCPClient.java
   branches/db4o/freenet/src/freenet/node/fcp/FCPServer.java
Log:
Rewrite the /queue/<URI> handling.

Modified: branches/db4o/freenet/src/freenet/clients/http/QueueToadlet.java
===================================================================
--- branches/db4o/freenet/src/freenet/clients/http/QueueToadlet.java    
2008-06-17 18:03:30 UTC (rev 20409)
+++ branches/db4o/freenet/src/freenet/clients/http/QueueToadlet.java    
2008-06-17 18:17:29 UTC (rev 20410)
@@ -29,6 +29,7 @@
 import com.db4o.ObjectContainer;

 import freenet.client.DefaultMIMETypes;
+import freenet.client.FetchResult;
 import freenet.client.HighLevelSimpleClient;
 import freenet.client.MetadataUnresolvedException;
 import freenet.client.async.ClientContext;
@@ -447,20 +448,13 @@
                                FreenetURI key = new FreenetURI(requestPath);

                                /* locate request */
-                               ClientRequest[] clientRequests = 
fcp.getGlobalRequests();
-                               for (int requestIndex = 0, requestCount = 
clientRequests.length; requestIndex < requestCount; requestIndex++) {
-                                       ClientRequest clientRequest = 
clientRequests[requestIndex];
-                                       if (clientRequest.hasFinished() && 
(clientRequest instanceof ClientGet)) {
-                                               ClientGet clientGet = 
(ClientGet) clientRequest;
-                                               if 
(clientGet.getURI().equals(key)) {
-                                                       Bucket data = 
clientGet.getBucket();
-                                                       String mimeType = 
clientGet.getMIMEType();
-                                                       String 
requestedMimeType = request.getParam("type", null);
-                                                       String forceString = 
request.getParam("force");
-                                                       
FProxyToadlet.handleDownload(ctx, data, ctx.getBucketFactory(), mimeType, 
requestedMimeType, forceString, request.isParameterSet("forcedownload"), 
"/queue/", key, "", "/queue/", false, ctx);
-                                                       return;
-                                               }
-                                       }
+                               FetchResult result = 
fcp.getCompletedRequestBlocking(key);
+                               if(result != null) {
+                                       Bucket data = result.asBucket();
+                                       String mimeType = result.getMimeType();
+                                       String requestedMimeType = 
request.getParam("type", null);
+                                       String forceString = 
request.getParam("force");
+                                       FProxyToadlet.handleDownload(ctx, data, 
ctx.getBucketFactory(), mimeType, requestedMimeType, forceString, 
request.isParameterSet("forcedownload"), "/queue/", key, "", "/queue/", false, 
ctx);
                                }
                        } catch (MalformedURLException mue1) {
                        }

Modified: branches/db4o/freenet/src/freenet/node/fcp/FCPClient.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/fcp/FCPClient.java   2008-06-17 
18:03:30 UTC (rev 20409)
+++ branches/db4o/freenet/src/freenet/node/fcp/FCPClient.java   2008-06-17 
18:17:29 UTC (rev 20410)
@@ -11,6 +11,7 @@
 import freenet.client.async.ClientContext;
 import freenet.client.async.DBJob;
 import freenet.client.async.DBJobRunner;
+import freenet.keys.FreenetURI;
 import freenet.node.RequestClient;
 import freenet.support.Logger;
 import freenet.support.io.NativeThread;
@@ -361,4 +362,13 @@
                        req.delete(container);
                }
        }
+
+       public ClientGet getCompletedRequest(FreenetURI key, ObjectContainer 
container) {
+               // FIXME speed this up with another hashmap or something.
+               for(int i=0;i<completedUnackedRequests.size();i++) {
+                       ClientGet getter = (ClientGet) 
completedUnackedRequests.get(i);
+                       if(getter.getURI().equals(key)) return getter;
+               }
+               return null;
+       }
 }

Modified: branches/db4o/freenet/src/freenet/node/fcp/FCPServer.java
===================================================================
--- branches/db4o/freenet/src/freenet/node/fcp/FCPServer.java   2008-06-17 
18:03:30 UTC (rev 20409)
+++ branches/db4o/freenet/src/freenet/node/fcp/FCPServer.java   2008-06-17 
18:17:29 UTC (rev 20410)
@@ -25,8 +25,10 @@

 import com.db4o.ObjectContainer;

+import freenet.client.ClientMetadata;
 import freenet.client.DefaultMIMETypes;
 import freenet.client.FetchContext;
+import freenet.client.FetchResult;
 import freenet.client.HighLevelSimpleClient;
 import freenet.client.InsertContext;
 import freenet.client.async.ClientContext;
@@ -931,4 +933,53 @@
                }
        }

+       public FetchResult getCompletedRequestBlocking(final FreenetURI key) {
+               ClientGet get = globalRebootClient.getCompletedRequest(key, 
null);
+               if(get != null) {
+                       // FIXME race condition with free() - arrange 
refcounting for the data to prevent this
+                       return new FetchResult(new 
ClientMetadata(get.getMIMEType()), get.getBucket());
+               }
+               
+               class OutputWrapper {
+                       FetchResult result;
+                       boolean done;
+               }
+               
+               final OutputWrapper ow = new OutputWrapper();
+               
+               core.clientContext.jobRunner.queue(new DBJob() {
+
+                       public void run(ObjectContainer container, 
ClientContext context) {
+                               FetchResult result = null;
+                               try {
+                                       ClientGet get = 
globalForeverClient.getCompletedRequest(key, container);
+                                       if(get != null) {
+                                               result = new FetchResult(new 
ClientMetadata(get.getMIMEType()), get.getBucket());
+                                       }
+                               } finally {
+                                       synchronized(ow) {
+                                               ow.result = result;
+                                               ow.done = true;
+                                               ow.notifyAll();
+                                       }
+                               }
+                       }
+                       
+               }, NativeThread.HIGH_PRIORITY, false);
+               
+               synchronized(ow) {
+                       while(true) {
+                               if(ow.done) {
+                                       return ow.result;
+                               } else {
+                                       try {
+                                               ow.wait();
+                                       } catch (InterruptedException e) {
+                                               // Ignore
+                                       }
+                               }
+                       }
+               }
+       }
+
 }


Reply via email to