]> source.dussan.org Git - tigervnc.git/commitdiff
[Development] Added support for new "Index" parameter which sets URL prefix of .fbi...
authorConstantin Kaplinsky <const@tightvnc.com>
Fri, 20 Jun 2008 05:17:39 +0000 (05:17 +0000)
committerConstantin Kaplinsky <const@tightvnc.com>
Fri, 20 Jun 2008 05:17:39 +0000 (05:17 +0000)
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@2598 3789f03b-4d11-0410-bbf8-ca57d06f2519

java/src/com/tightvnc/rfbplayer/FbsConnection.java
java/src/com/tightvnc/rfbplayer/RfbPlayer.java

index 34f957679394308c1555bbf50e9da3b70bcc5b4b..66e12c75cda5a583f5d5a735f6058478f56e8ab5 100644 (file)
@@ -36,17 +36,24 @@ public class FbsConnection {
   FbsConnection(String fbsLocation, String indexLocationPrefix, Applet applet)
       throws MalformedURLException {
 
+    // Construct URLs from strings.
     URL base = null;
     if (applet != null) {
       base = applet.getCodeBase();
     }
     fbsURL = new URL(base, fbsLocation);
-    fbiURL = null;
-    fbkURL = null;
+    fbiURL = fbkURL = null;
     if (indexLocationPrefix != null) {
-      fbiURL = new URL(base, indexLocationPrefix + ".fbi");
-      fbkURL = new URL(base, indexLocationPrefix + ".fbk");
+      try {
+        fbiURL = new URL(base, indexLocationPrefix + ".fbi");
+        fbkURL = new URL(base, indexLocationPrefix + ".fbk");
+      } catch (MalformedURLException e) {
+        fbiURL = fbkURL = null;
+      }
     }
+
+    // Try to load the .fbi index file.
+    loadIndex();
   }
 
   FbsInputStream connect(long timeOffset) throws IOException {
@@ -57,4 +64,48 @@ public class FbsConnection {
     return fbs;
   }
 
+  private void loadIndex() {
+    // Loading .fbi makes sense only if both .fbi and .fbk files are available.
+    if (fbiURL != null && fbkURL != null) {
+      try {
+        // Connect.
+        URLConnection connection = fbiURL.openConnection();
+        connection.connect();
+        DataInputStream is = new DataInputStream(connection.getInputStream());
+
+        // Check file signature.
+        byte[] b = new byte[12];
+        is.readFully(b);
+        if (b[0] != 'F' || b[1] != 'B' || b[2] != 'I' || b[3] != ' ' ||
+            b[4] != '0' || b[5] != '0' || b[6] != '1' || b[7] != '.' ||
+            b[8] < '0' || b[8] > '9' || b[9] < '0' || b[9] > '9' ||
+            b[10] < '0' || b[10] > '9' || b[11] != '\n') {
+          System.err.println("Warning: bad .fbi file data, not using index");
+          fbiURL = null;
+        }
+
+        // Load index from the .fbi file.
+        // FIXME: Real loading is not implemented yet.
+        int numRecords = 0;
+        try {
+          while (true) {
+            is.readInt();
+            is.readInt();
+            is.readInt();
+            is.readInt();
+            is.readInt();
+            numRecords++;
+          }
+        } catch (EOFException e) {
+        } catch (IOException e) {
+          System.err.println("Warning: Index data may be incomplete");
+        }
+        System.err.println("Loaded index data, " + numRecords + " records");
+      } catch (IOException e) {
+        System.err.println("Warning: I/O exception while loading index: " + e);
+        System.err.println("Warning: failed to load .fbi, not using index");
+      }
+    }
+  }
+
 }
index 6516fb892707db131a5775aed0332119cab574d7..1a0e17932eff07efea51df001ac554c1dbb8df26 100644 (file)
@@ -64,6 +64,7 @@ public class RfbPlayer extends java.applet.Applet
   VncCanvas vc;
 
   String sessionURL;
+  String idxPrefix;
   long initialTimeOffset;
   double playbackSpeed;
   boolean autoPlay;
@@ -129,7 +130,7 @@ public class RfbPlayer extends java.applet.Applet
 
     try {
       java.applet.Applet applet = (inAnApplet) ? this : null;
-      FbsConnection conn = new FbsConnection(sessionURL, null, applet);
+      FbsConnection conn = new FbsConnection(sessionURL, idxPrefix, applet);
       fbs = conn.connect(initialTimeOffset);
       rfb = new RfbProto(fbs);
 
@@ -271,6 +272,7 @@ public class RfbPlayer extends java.applet.Applet
   public void readParameters() {
 
     sessionURL = readParameter("URL", true);
+    idxPrefix = readParameter("Index", false);
 
     initialTimeOffset = readLongParameter("Position", 0);
     if (initialTimeOffset < 0)