Author: toad
Date: 2008-12-12 16:42:55 +0000 (Fri, 12 Dec 2008)
New Revision: 24272

Modified:
   trunk/freenet/src/freenet/node/updater/NodeUpdater.java
Log:
Parse the manifest, identify the recommended and required ext versions for an 
update.


Modified: trunk/freenet/src/freenet/node/updater/NodeUpdater.java
===================================================================
--- trunk/freenet/src/freenet/node/updater/NodeUpdater.java     2008-12-12 
16:29:42 UTC (rev 24271)
+++ trunk/freenet/src/freenet/node/updater/NodeUpdater.java     2008-12-12 
16:42:55 UTC (rev 24272)
@@ -1,9 +1,16 @@
 package freenet.node.updater;
 
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.DataInputStream;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.net.MalformedURLException;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
 
 import freenet.client.FetchContext;
 import freenet.client.FetchException;
@@ -23,6 +30,7 @@
 import freenet.support.Logger;
 import freenet.support.api.Bucket;
 import freenet.support.io.BucketTools;
+import freenet.support.io.Closer;
 import freenet.support.io.FileBucket;
 
 public class NodeUpdater implements ClientCallback, USKCallback {
@@ -240,6 +248,63 @@
                        System.out.println("Found " + (extUpdate ? "ext " : "") 
+ fetchedVersion);
                        if(fetchedVersion > currentVersion)
                                Logger.normal(this, "Found version " + 
fetchedVersion + ", setting up a new UpdatedVersionAvailableUserAlert");
+                       if(!extUpdate) {
+                               int requiredExt = -1;
+                               int recommendedExt = -1;
+                               InputStream is = null;
+                               try {
+                                       is = result.asBucket().getInputStream();
+                                       ZipInputStream zis = new 
ZipInputStream(is);
+                                       ZipEntry ze;
+                                       while(true) {
+                                               ze = zis.getNextEntry();
+                                               if(ze == null) break;
+                                               if(ze.isDirectory()) continue;
+                                               String name = ze.getName();
+                                               
+                                               
if(name.equals("META-INF/MANIFEST.MF")) {
+                                                       long size = 
ze.getSize();
+                                                       if(logMINOR) 
Logger.minor(this, "Manifest size: "+size);
+                                                       if(size > 
MAX_MANIFEST_SIZE) {
+                                                               
Logger.error(this, "Manifest is too big: "+size+" bytes, limit is 
"+MAX_MANIFEST_SIZE);
+                                                               break;
+                                                       }
+                                                       byte[] buf = new 
byte[(int) size];
+                                                       DataInputStream dis = 
new DataInputStream(zis);
+                                                       dis.readFully(buf);
+                                                       ByteArrayInputStream 
bais = new ByteArrayInputStream(buf);
+                                                       InputStreamReader isr = 
new InputStreamReader(bais, "UTF-8");
+                                                       BufferedReader br = new 
BufferedReader(isr);
+                                                       String line;
+                                                       while((line = 
br.readLine()) != null) {
+                                                               
if(line.startsWith(REQUIRED_EXT_PREFIX)) {
+                                                                       
requiredExt = Integer.parseInt(line.substring(REQUIRED_EXT_PREFIX.length()));
+                                                               } else 
if(line.startsWith(RECOMMENDED_EXT_PREFIX)) {
+                                                                       
recommendedExt = 
Integer.parseInt(line.substring(RECOMMENDED_EXT_PREFIX.length()));
+                                                               }
+                                                       }
+                                               } else {
+                                                       zis.closeEntry();
+                                               }
+                                       }
+                               } catch (IOException e) {
+                                       Logger.error(this, "IOException trying 
to read manifest on update");
+                               } catch (Throwable t) {
+                                       Logger.error(this, "Failed to parse 
update manifest: "+t, t);
+                                       requiredExt = recommendedExt = -1;
+                               } finally {
+                                       Closer.close(is);
+                               }
+                               if(requiredExt != -1) {
+                                       System.err.println("Required ext 
version: "+requiredExt);
+                                       Logger.normal(this, "Required ext 
version: "+requiredExt);
+                               }
+                               if(recommendedExt != -1) {
+                                       System.err.println("Recommended ext 
version: "+recommendedExt);
+                                       Logger.normal(this, "Recommended ext 
version: "+recommendedExt);
+                               }
+                               
+                       }
                        this.cg = null;
                        if(this.result != null)
                                this.result.asBucket().free();
@@ -247,6 +312,10 @@
                }
                manager.onDownloadedNewJar(extUpdate);
        }
+       
+       private static final String REQUIRED_EXT_PREFIX = 
"Required-Ext-Version: ";
+       private static final String RECOMMENDED_EXT_PREFIX = 
"Recommended-Ext-Version: ";
+       private static final int MAX_MANIFEST_SIZE = 1024*1024;
 
        public void onFailure(FetchException e, ClientGetter state) {
                logMINOR = Logger.shouldLog(Logger.MINOR, this);

_______________________________________________
cvs mailing list
[email protected]
http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs

Reply via email to