git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1882820 13f79535-47bb-0310-9956-ffa450edef68tags/before_ooxml_3rd_edition
@@ -44,7 +44,7 @@ final class StaticFontMetrics { | |||
private static final Map<String, FontDetails> fontDetailsMap = new HashMap<>(); | |||
private StaticFontMetrics() {} | |||
/** | |||
* Retrieves the fake font details for a given font. | |||
* | |||
@@ -84,7 +84,7 @@ final class StaticFontMetrics { | |||
// If not, check with the font style added | |||
String fontHeight = FontDetails.buildFontHeightProperty(fontName); | |||
String styleHeight = FontDetails.buildFontHeightProperty(fontName + "." + fontStyle); | |||
if (fontMetricsProps.get(fontHeight) == null | |||
&& fontMetricsProps.get(styleHeight) != null) { | |||
// Need to add on the style to the font name | |||
@@ -99,7 +99,7 @@ final class StaticFontMetrics { | |||
} | |||
return fontDetails; | |||
} | |||
private static Properties loadMetrics() throws IOException { | |||
// Check to see if the font metric file was specified | |||
// as a system property | |||
@@ -117,26 +117,19 @@ final class StaticFontMetrics { | |||
LOGGER.log(POILogger.WARN, "Can't access font.metrics.filename system property", e); | |||
} | |||
InputStream metricsIn = null; | |||
try { | |||
if (propFile != null) { | |||
metricsIn = new FileInputStream(propFile); | |||
} else { | |||
// Use the built-in font metrics file off the classpath | |||
metricsIn = FontDetails.class.getResourceAsStream("/font_metrics.properties"); | |||
if (metricsIn == null) { | |||
String err = "font_metrics.properties not found in classpath"; | |||
throw new IOException(err); | |||
} | |||
} | |||
try (InputStream metricsIn = (propFile != null) | |||
? new FileInputStream(propFile) | |||
: FontDetails.class.getResourceAsStream("/font_metrics.properties") | |||
) { | |||
// Use the built-in font metrics file off the classpath | |||
if (metricsIn == null) { | |||
String err = "font_metrics.properties not found in classpath"; | |||
throw new IOException(err); | |||
} | |||
Properties props = new Properties(); | |||
props.load(metricsIn); | |||
return props; | |||
} finally { | |||
if (metricsIn != null) { | |||
metricsIn.close(); | |||
} | |||
} | |||
} | |||
} |
@@ -175,10 +175,11 @@ public class CryptoAPIDecryptor extends Decryptor { | |||
ByteArrayOutputStream bos = new ByteArrayOutputStream(); | |||
IOUtils.copy(dis, bos); | |||
dis.close(); | |||
CryptoAPIDocumentInputStream sbis = new CryptoAPIDocumentInputStream(this, bos.toByteArray()); | |||
LittleEndianInputStream leis = new LittleEndianInputStream(sbis); | |||
POIFSFileSystem fsOut = null; | |||
try { | |||
try ( | |||
CryptoAPIDocumentInputStream sbis = new CryptoAPIDocumentInputStream(this, bos.toByteArray()); | |||
LittleEndianInputStream leis = new LittleEndianInputStream(sbis) | |||
) { | |||
int streamDescriptorArrayOffset = (int) leis.readUInt(); | |||
/* int streamDescriptorArraySize = (int) */ leis.readUInt(); | |||
long skipN = streamDescriptorArrayOffset - 8L; | |||
@@ -207,9 +208,9 @@ public class CryptoAPIDecryptor extends Decryptor { | |||
for (StreamDescriptorEntry entry : entries) { | |||
sbis.seek(entry.streamOffset); | |||
sbis.setBlock(entry.block); | |||
InputStream is = new BoundedInputStream(sbis, entry.streamSize); | |||
fsOut.createDocument(is, entry.streamName); | |||
is.close(); | |||
try (InputStream is = new BoundedInputStream(sbis, entry.streamSize)) { | |||
fsOut.createDocument(is, entry.streamName); | |||
} | |||
} | |||
} catch (Exception e) { | |||
IOUtils.closeQuietly(fsOut); | |||
@@ -220,9 +221,6 @@ public class CryptoAPIDecryptor extends Decryptor { | |||
} else { | |||
throw new IOException("summary entries can't be read", e); | |||
} | |||
} finally { | |||
IOUtils.closeQuietly(leis); | |||
IOUtils.closeQuietly(sbis); | |||
} | |||
return fsOut; | |||
} |
@@ -42,8 +42,8 @@ import org.apache.poi.poifs.filesystem.DocumentInputStream; | |||
import org.apache.poi.poifs.filesystem.DocumentNode; | |||
import org.apache.poi.poifs.filesystem.Entry; | |||
import org.apache.poi.poifs.filesystem.FileMagic; | |||
import org.apache.poi.poifs.filesystem.POIFSFileSystem; | |||
import org.apache.poi.poifs.filesystem.OfficeXmlFileException; | |||
import org.apache.poi.poifs.filesystem.POIFSFileSystem; | |||
import org.apache.poi.poifs.macros.Module.ModuleType; | |||
import org.apache.poi.util.CodePageUtil; | |||
import org.apache.poi.util.HexDump; | |||
@@ -64,7 +64,7 @@ import org.apache.poi.util.StringUtil; | |||
* module for an example of how to do this. Patches that make macro | |||
* extraction from .ppt more elegant are welcomed! | |||
* </p> | |||
* | |||
* | |||
* @since 3.15-beta2 | |||
*/ | |||
public class VBAMacroReader implements Closeable { | |||
@@ -76,7 +76,7 @@ public class VBAMacroReader implements Closeable { | |||
protected static final String VBA_PROJECT_POIFS = "VBA"; | |||
private POIFSFileSystem fs; | |||
public VBAMacroReader(InputStream rstream) throws IOException { | |||
InputStream is = FileMagic.prepareToCheckMagic(rstream); | |||
FileMagic fm = FileMagic.valueOf(is); | |||
@@ -86,7 +86,7 @@ public class VBAMacroReader implements Closeable { | |||
openOOXML(is); | |||
} | |||
} | |||
public VBAMacroReader(File file) throws IOException { | |||
try { | |||
this.fs = new POIFSFileSystem(file); | |||
@@ -97,7 +97,7 @@ public class VBAMacroReader implements Closeable { | |||
public VBAMacroReader(POIFSFileSystem fs) { | |||
this.fs = fs; | |||
} | |||
private void openOOXML(InputStream zipFile) throws IOException { | |||
try(ZipInputStream zis = new ZipInputStream(zipFile)) { | |||
ZipEntry zipEntry; | |||
@@ -119,7 +119,7 @@ public class VBAMacroReader implements Closeable { | |||
} | |||
throw new IllegalArgumentException("No VBA project found"); | |||
} | |||
public void close() throws IOException { | |||
fs.close(); | |||
fs = null; | |||
@@ -145,7 +145,7 @@ public class VBAMacroReader implements Closeable { | |||
} | |||
/** | |||
* Reads all macros from all modules of the opened office file. | |||
* Reads all macros from all modules of the opened office file. | |||
* @return All the macros and their contents | |||
* | |||
* @since 3.15-beta2 | |||
@@ -158,7 +158,7 @@ public class VBAMacroReader implements Closeable { | |||
} | |||
return moduleSources; | |||
} | |||
protected static class ModuleImpl implements Module { | |||
Integer offset; | |||
byte[] buf; | |||
@@ -180,7 +180,7 @@ public class VBAMacroReader implements Closeable { | |||
protected static class ModuleMap extends HashMap<String, ModuleImpl> { | |||
Charset charset = StringUtil.WIN_1252; // default charset | |||
} | |||
/** | |||
* Recursively traverses directory structure rooted at <tt>dir</tt>. | |||
* For each macro module that is found, the module's name and code are | |||
@@ -204,13 +204,13 @@ public class VBAMacroReader implements Closeable { | |||
} | |||
} | |||
} | |||
/** | |||
* reads module from DIR node in input stream and adds it to the modules map for decompression later | |||
* on the second pass through this function, the module will be decompressed | |||
* | |||
* | |||
* Side-effects: adds a new module to the module map or sets the buf field on the module | |||
* to the decompressed stream contents (the VBA code for one module) | |||
* | |||
@@ -237,7 +237,7 @@ public class VBAMacroReader implements Closeable { | |||
stream.close(); | |||
} | |||
} | |||
private static void readModuleFromDocumentStream(DocumentNode documentNode, String name, ModuleMap modules) throws IOException { | |||
ModuleImpl module = modules.get(name); | |||
// TODO Refactor this to fetch dir then do the rest | |||
@@ -256,34 +256,28 @@ public class VBAMacroReader implements Closeable { | |||
} | |||
//try the general case, where module.offset is accurate | |||
InputStream decompressed = null; | |||
InputStream compressed = new DocumentInputStream(documentNode); | |||
try { | |||
try (InputStream compressed = new DocumentInputStream(documentNode)) { | |||
// we know the offset already, so decompress immediately on-the-fly | |||
trySkip(compressed, module.offset); | |||
decompressed = new RLEDecompressingInputStream(compressed); | |||
module.read(decompressed); | |||
try (InputStream decompressed = new RLEDecompressingInputStream(compressed)) { | |||
module.read(decompressed); | |||
} | |||
return; | |||
} catch (IllegalArgumentException | IllegalStateException e) { | |||
} finally { | |||
IOUtils.closeQuietly(compressed); | |||
IOUtils.closeQuietly(decompressed); | |||
} | |||
//bad module.offset, try brute force | |||
compressed = new DocumentInputStream(documentNode); | |||
; | |||
byte[] decompressedBytes; | |||
try { | |||
try (InputStream compressed = new DocumentInputStream(documentNode)) { | |||
decompressedBytes = findCompressedStreamWBruteForce(compressed); | |||
} finally { | |||
IOUtils.closeQuietly(compressed); | |||
} | |||
if (decompressedBytes != null) { | |||
module.read(new ByteArrayInputStream(decompressedBytes)); | |||
} | |||
} | |||
} | |||
/** | |||
@@ -305,7 +299,7 @@ public class VBAMacroReader implements Closeable { | |||
} | |||
} | |||
} | |||
// Constants from MS-OVBA: https://msdn.microsoft.com/en-us/library/office/cc313094(v=office.12).aspx | |||
private static final int STREAMNAME_RESERVED = 0x0032; | |||
private static final int PROJECT_CONSTANTS_RESERVED = 0x003C; | |||
@@ -319,7 +313,7 @@ public class VBAMacroReader implements Closeable { | |||
* <tt>macroDir</tt> into <tt>modules</tt>. | |||
* | |||
* @since 3.15-beta2 | |||
*/ | |||
*/ | |||
protected void readMacros(DirectoryNode macroDir, ModuleMap modules) throws IOException { | |||
//bug59858 shows that dirstream may not be in this directory (\MBD00082648\_VBA_PROJECT_CUR\VBA ENTRY NAME) | |||
//but may be in another directory (\_VBA_PROJECT_CUR\VBA ENTRY NAME) | |||
@@ -333,7 +327,7 @@ public class VBAMacroReader implements Closeable { | |||
for (Entry entry : macroDir) { | |||
if (! (entry instanceof DocumentNode)) { continue; } | |||
String name = entry.getName(); | |||
DocumentNode document = (DocumentNode)entry; | |||
@@ -50,7 +50,6 @@ import javax.xml.crypto.MarshalException; | |||
import org.apache.poi.poifs.crypt.dsig.SignatureConfig; | |||
import org.apache.poi.poifs.crypt.dsig.SignatureInfo; | |||
import org.apache.poi.poifs.crypt.dsig.services.RevocationData; | |||
import org.apache.poi.util.IOUtils; | |||
import org.apache.poi.util.POILogFactory; | |||
import org.apache.poi.util.POILogger; | |||
import org.apache.xml.security.c14n.Canonicalizer; | |||
@@ -315,18 +314,12 @@ public class XAdESXLSignatureFacet implements SignatureFacet { | |||
return null; | |||
} | |||
try { | |||
ASN1InputStream asn1IS1 = null, asn1IS2 = null; | |||
try { | |||
asn1IS1 = new ASN1InputStream(crlNumberExtensionValue); | |||
ASN1OctetString octetString = (ASN1OctetString)asn1IS1.readObject(); | |||
byte[] octets = octetString.getOctets(); | |||
asn1IS2 = new ASN1InputStream(octets); | |||
ASN1Integer integer = (ASN1Integer)asn1IS2.readObject(); | |||
try (ASN1InputStream asn1IS1 = new ASN1InputStream(crlNumberExtensionValue)) { | |||
ASN1OctetString octetString = (ASN1OctetString)asn1IS1.readObject(); | |||
byte[] octets = octetString.getOctets(); | |||
try (ASN1InputStream asn1IS2 = new ASN1InputStream(octets)) { | |||
ASN1Integer integer = (ASN1Integer) asn1IS2.readObject(); | |||
return integer.getPositiveValue(); | |||
} finally { | |||
IOUtils.closeQuietly(asn1IS2); | |||
IOUtils.closeQuietly(asn1IS1); | |||
} | |||
} catch (IOException e) { | |||
throw new RuntimeException("I/O error: " + e.getMessage(), e); |
@@ -72,55 +72,45 @@ public final class ChunkFactory { | |||
* of all the different possible chunk commands. | |||
*/ | |||
private void processChunkParseCommands() throws IOException { | |||
String line; | |||
InputStream cpd = null; | |||
BufferedReader inp = null; | |||
try { | |||
cpd = ChunkFactory.class.getResourceAsStream(chunkTableName); | |||
try (InputStream cpd = ChunkFactory.class.getResourceAsStream(chunkTableName)) { | |||
if(cpd == null) { | |||
throw new IllegalStateException("Unable to find HDGF chunk definition on the classpath - " + chunkTableName); | |||
} | |||
inp = new BufferedReader(new InputStreamReader(cpd, LocaleUtil.CHARSET_1252)); | |||
while( (line = inp.readLine()) != null ) { | |||
if (line.isEmpty() || "# \t".contains(line.substring(0,1))) { | |||
continue; | |||
} | |||
// Start xxx | |||
if(!line.matches("^start [0-9]+$")) { | |||
throw new IllegalStateException("Expecting start xxx, found " + line); | |||
} | |||
int chunkType = Integer.parseInt(line.substring(6)); | |||
ArrayList<CommandDefinition> defsL = new ArrayList<>(); | |||
// Data entries | |||
while( (line = inp.readLine()) != null ) { | |||
if (line.startsWith("end")) { | |||
break; | |||
} | |||
StringTokenizer st = new StringTokenizer(line, " "); | |||
int defType = Integer.parseInt(st.nextToken()); | |||
int offset = Integer.parseInt(st.nextToken()); | |||
String name = st.nextToken("\uffff").substring(1); | |||
CommandDefinition def = new CommandDefinition(defType,offset,name); | |||
defsL.add(def); | |||
} | |||
CommandDefinition[] defs = defsL.toArray(new CommandDefinition[0]); | |||
// Add to the map | |||
chunkCommandDefinitions.put(chunkType, defs); | |||
} | |||
} finally { | |||
if (inp != null) { | |||
inp.close(); | |||
} | |||
if (cpd != null) { | |||
cpd.close(); | |||
} | |||
try (BufferedReader inp = new BufferedReader(new InputStreamReader(cpd, LocaleUtil.CHARSET_1252))) { | |||
String line; | |||
while ((line = inp.readLine()) != null) { | |||
if (line.isEmpty() || "# \t".contains(line.substring(0, 1))) { | |||
continue; | |||
} | |||
// Start xxx | |||
if (!line.matches("^start [0-9]+$")) { | |||
throw new IllegalStateException("Expecting start xxx, found " + line); | |||
} | |||
int chunkType = Integer.parseInt(line.substring(6)); | |||
ArrayList<CommandDefinition> defsL = new ArrayList<>(); | |||
// Data entries | |||
while ((line = inp.readLine()) != null) { | |||
if (line.startsWith("end")) { | |||
break; | |||
} | |||
StringTokenizer st = new StringTokenizer(line, " "); | |||
int defType = Integer.parseInt(st.nextToken()); | |||
int offset = Integer.parseInt(st.nextToken()); | |||
String name = st.nextToken("\uffff").substring(1); | |||
CommandDefinition def = new CommandDefinition(defType, offset, name); | |||
defsL.add(def); | |||
} | |||
CommandDefinition[] defs = defsL.toArray(new CommandDefinition[0]); | |||
// Add to the map | |||
chunkCommandDefinitions.put(chunkType, defs); | |||
} | |||
} | |||
} | |||
} | |||
@@ -173,16 +173,11 @@ public final class HSLFSlideShowImpl extends POIDocument implements Closeable { | |||
* Constructs a new, empty, Powerpoint document. | |||
*/ | |||
public static HSLFSlideShowImpl create() { | |||
InputStream is = HSLFSlideShowImpl.class.getResourceAsStream("/org/apache/poi/hslf/data/empty.ppt"); | |||
if (is == null) { | |||
throw new HSLFException("Missing resource 'empty.ppt'"); | |||
} | |||
try { | |||
try { | |||
return new HSLFSlideShowImpl(is); | |||
} finally { | |||
is.close(); | |||
try (InputStream is = HSLFSlideShowImpl.class.getResourceAsStream("/org/apache/poi/hslf/data/empty.ppt")) { | |||
if (is == null) { | |||
throw new HSLFException("Missing resource 'empty.ppt'"); | |||
} | |||
return new HSLFSlideShowImpl(is); | |||
} catch (IOException e) { | |||
throw new HSLFException(e); | |||
} |