[Development] Loading the keyframe data, using HTTP Range headers to load only the desired part of the .fbk file. In this revision, the data then cannot be parsed correctly because RfbProto expects RFB initialization sequence which is absent in keyframes.

git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@2609 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/java/src/com/tightvnc/rfbplayer/FbsConnection.java b/java/src/com/tightvnc/rfbplayer/FbsConnection.java
index f53e555..20b0154 100644
--- a/java/src/com/tightvnc/rfbplayer/FbsConnection.java
+++ b/java/src/com/tightvnc/rfbplayer/FbsConnection.java
@@ -191,7 +191,34 @@
    */
   private FbsInputStream openFbsFile(FbsEntryPoint entryPoint)
       throws IOException {
-    return null;
+
+    // Make sure the protocol is HTTP.
+    if (!fbkURL.getProtocol().equalsIgnoreCase("http") ||
+        !fbsURL.getProtocol().equalsIgnoreCase("http")) {
+      return null;
+    }
+
+    // Prepare URLConnection to the right part of the .fbk file.
+    URLConnection fbkConn = fbkURL.openConnection();
+    long firstByteOffset = entryPoint.key_fpos;
+    long lastByteOffset = entryPoint.key_fpos + entryPoint.key_size - 1;
+    String rangeSpec = "bytes=" + firstByteOffset + "-" + lastByteOffset;
+    System.err.println("Range: " + rangeSpec);
+    fbkConn.setRequestProperty("Range", rangeSpec);
+    fbkConn.connect();
+    DataInputStream is = new DataInputStream(fbkConn.getInputStream());
+
+    // Load keyframe data from the .fbk file.
+    int keyDataSize = is.readInt();
+    byte[] keyData = new byte[keyDataSize];
+    is.readFully(keyData);
+    is.close();
+
+    // Open the FBS stream.
+    URLConnection fbsConn = fbsURL.openConnection();
+    fbsConn.connect();
+    return new FbsInputStream(fbsConn.getInputStream(), entryPoint.timestamp,
+                              keyData, entryPoint.fbs_skip);
   }
 
 }
diff --git a/java/src/com/tightvnc/rfbplayer/FbsInputStream.java b/java/src/com/tightvnc/rfbplayer/FbsInputStream.java
index 68bf8de..db02a1d 100644
--- a/java/src/com/tightvnc/rfbplayer/FbsInputStream.java
+++ b/java/src/com/tightvnc/rfbplayer/FbsInputStream.java
@@ -43,7 +43,7 @@
   protected int bufferPos;
 
   /** The number of bytes to skip in the beginning of the next data block. */
-  protected int nextBlockOffset;
+  protected long nextBlockOffset;
 
   protected Observer obs;
 
@@ -95,7 +95,7 @@
    *    from <code>in</code>.
    */
   FbsInputStream(InputStream in, long timeOffset, byte[] buffer,
-                 int nextBlockOffset) {
+                 long nextBlockOffset) {
 
     this.in = in;
     startTime = System.currentTimeMillis() - timeOffset;