summaryrefslogtreecommitdiffstats
path: root/src/jogl/classes/com
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2014-09-30 23:07:50 +0200
committerSven Gothel <[email protected]>2014-09-30 23:07:50 +0200
commitbd24599b21f9787ac989e65b44dc1ba762162f22 (patch)
tree48bf52d4ebdd5e4172dd83a4d6d7f75f961c7574 /src/jogl/classes/com
parentf197d38d0ea31416645ac69cebb3f9b3544d903f (diff)
Refine Graph/Font InputStream Capabilities (commit 628509b39ea7c16210315d191860511d6be4aa69)
FontFactory Remove: - Font get(final URLConnection conn) - Font get(final InputStream stream) FontFactory Add: - [1] Font get(final InputStream stream, final int streamLen, final boolean closeStream) - Direct usage of font InputStream w/ determined length, may instantiate BufferedInputStream in case given stream doesn't support mark/reset! - [2] Font get(final InputStream stream, final boolean closeStream) - Copy font InputStream w/o determined length, resulting in BufferedInputStream supporting mark/reset! Security Related: - Only perform priviledged code on determine InputStream, _not_ when parsing the font stream itself! - Hence PrivilegedAction only happens in FontFactory's InputStream preparation. Misc: - Use Uri class
Diffstat (limited to 'src/jogl/classes/com')
-rw-r--r--src/jogl/classes/com/jogamp/graph/font/FontFactory.java108
1 files changed, 96 insertions, 12 deletions
diff --git a/src/jogl/classes/com/jogamp/graph/font/FontFactory.java b/src/jogl/classes/com/jogamp/graph/font/FontFactory.java
index cfd06cf6c..ba355f4e6 100644
--- a/src/jogl/classes/com/jogamp/graph/font/FontFactory.java
+++ b/src/jogl/classes/com/jogamp/graph/font/FontFactory.java
@@ -27,12 +27,15 @@
*/
package com.jogamp.graph.font;
+import java.io.BufferedInputStream;
import java.io.File;
+import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
-import java.net.URI;
-import java.net.URLConnection;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import com.jogamp.common.net.Uri;
import com.jogamp.common.util.IOUtil;
import com.jogamp.common.util.PropertyAccess;
import com.jogamp.common.util.ReflectionUtil;
@@ -88,32 +91,113 @@ public class FontFactory {
}
}
+ /**
+ * Creates a Font instance.
+ * @param file font file
+ * @return the new Font instance
+ * @throws IOException
+ */
public static final Font get(final File file) throws IOException {
return fontConstr.create(file);
}
- public static final Font get(final InputStream stream) throws IOException {
- return fontConstr.create(stream);
+ /**
+ * Creates a Font instance based on a determinated font stream with its given length
+ * of the font segment.
+ * <p>
+ * No explicit stream copy is performed as in {@link #get(InputStream, boolean)}
+ * due to the known {@code streamLen}.
+ * </p>
+ * @param stream font stream
+ * @param streamLen length of the font segment within this font stream
+ * @param closeStream {@code true} to close the {@code stream}
+ * @return the new Font instance
+ * @throws IOException
+ */
+ public static final Font get(final InputStream stream, final int streamLen, final boolean closeStream) throws IOException {
+ try {
+ return fontConstr.create(stream, streamLen);
+ } finally {
+ if( closeStream ) {
+ stream.close();
+ }
+ }
}
- public static final Font get(final URLConnection conn) throws IOException {
- return fontConstr.create(conn);
+ /**
+ * Creates a Font instance based on an undeterminated font stream length.
+ * <p>
+ * The font stream is temporarily copied into a temp file
+ * to gather it's size and to gain random access.
+ * The temporary file will be deleted at exit.
+ * </p>
+ * @param stream dedicated font stream
+ * @param closeStream {@code true} to close the {@code stream}
+ * @return the new Font instance
+ * @throws IOException
+ */
+ public static final Font get(final InputStream stream, final boolean closeStream) throws IOException {
+ final IOException[] ioe = { null };
+ final int[] streamLen = { 0 };
+ final File tempFile[] = { null };
+
+ final InputStream bis = AccessController.doPrivileged(new PrivilegedAction<InputStream>() {
+ @Override
+ public InputStream run() {
+ InputStream bis = null;
+ try {
+ tempFile[0] = IOUtil.createTempFile( "jogl.font", ".ttf", false);
+ streamLen[0] = IOUtil.copyStream2File(stream, tempFile[0], -1);
+ if( 0 == streamLen[0] ) {
+ throw new IOException("Font stream has zero bytes");
+ }
+ bis = new BufferedInputStream(new FileInputStream(tempFile[0]), streamLen[0]);
+ } catch (final IOException e) {
+ ioe[0] = e;
+ if( null != tempFile[0] ) {
+ tempFile[0].delete();
+ tempFile[0] = null;
+ }
+ streamLen[0] = 0;
+ } finally {
+ if( closeStream ) {
+ IOUtil.close(stream, ioe, System.err);
+ }
+ }
+ return bis;
+ } });
+ if( null != ioe[0] ) {
+ throw ioe[0];
+ }
+ if( null == bis ) {
+ throw new IOException("Could not cache font stream"); // should not be reached
+ }
+ try {
+ return fontConstr.create(bis, streamLen[0]);
+ } finally {
+ if( null != bis ) {
+ bis.close();
+ }
+ if( null != tempFile[0] ) {
+ tempFile[0].delete();
+ }
+ }
}
public static final Font get(final Class<?> context, final String fname, final boolean useTempJarCache) throws IOException {
- URLConnection conn = null;
+ InputStream stream = null;
if( useTempJarCache ) {
try {
- final URI uri = TempJarCache.getResource(fname);
- conn = null != uri ? uri.toURL().openConnection() : null;
+ final Uri uri = TempJarCache.getResourceUri(fname);
+ stream = null != uri ? uri.toURL().openConnection().getInputStream() : null;
} catch (final Exception e) {
throw new IOException(e);
}
} else {
- conn = IOUtil.getResource(context, fname);
+ stream = IOUtil.getResource(context, fname).getInputStream();
}
- if(null != conn) {
- return FontFactory.get ( conn ) ;
+ if( null != stream ) {
+ return FontFactory.get ( stream, true ) ;
}
return null;
}