Categories:
Audio (13)
Biotech (29)
Bytecode (36)
Database (77)
Framework (7)
Game (7)
General (507)
Graphics (53)
I/O (35)
IDE (2)
JAR Tools (101)
JavaBeans (21)
JDBC (121)
JDK (426)
JSP (20)
Logging (108)
Mail (58)
Messaging (8)
Network (84)
PDF (97)
Report (7)
Scripting (84)
Security (32)
Server (121)
Servlet (26)
SOAP (24)
Testing (54)
Web (15)
XML (309)
Collections:
Other Resources:
What Is poi-scratchpad-5.2.3.jar?
What Is poi-scratchpad-5.2.3.jar?
✍: FYIcenter.com
poi-scratchpad-5.2.3.jar is one of the JAR files for Apache POI 5.2.3, which provides an API for Microsoft document files of Word, Excel, PowerPoint, and Visio.
poi-scratchpad-5.2.3.jar provides support for older versions of Microsoft document files like Word 97, Excel 97, PowerPoint 97, etc.
poi-scratchpad-5.2.3.jar is distributed as part of the poi-bin-5.2.3-20220909.zip download file.
JAR File Size and Download Location:
JAR name: poi-scratchpad-5.2.3.jar Target JDK version: 9 Dependency: poi.jar File name: poi-scratchpad.jar, poi-scratchpad-5.2.3.jar File size: 1897121 bytes Release date: 09-09-2022 Download: Apache POI Website
Here are Java Source Code files for poi-scratchpad-5.2.3.jar:
⏎ org/apache/poi/hsmf/datatypes/NameIdChunks.java
/* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ package org.apache.poi.hsmf.datatypes; import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.function.Consumer; import org.apache.commons.codec.digest.PureJavaCrc32; import org.apache.poi.hpsf.ClassID; import org.apache.poi.util.LittleEndian; import org.apache.poi.util.LittleEndianByteArrayInputStream; import org.apache.poi.util.StringUtil; /** * Collection of convenience chunks for the NameID part of an outlook file */ public final class NameIdChunks implements ChunkGroup { public static final String NAME = "__nameid_version1.0"; public enum PropertySetType { PS_MAPI("00020328-0000-0000-C000-000000000046"), PS_PUBLIC_STRINGS("00020329-0000-0000-C000-000000000046"), PS_INTERNET_HEADERS("00020386-0000-0000-C000-000000000046"); private final ClassID classID; PropertySetType(String uuid) { classID = new ClassID(uuid); } public ClassID getClassID() { return classID; } } public enum PredefinedPropertySet { PSETID_COMMON("00062008-0000-0000-C000-000000000046"), PSETID_ADDRESS("00062004-0000-0000-C000-000000000046"), PSETID_APPOINTMENT("00062002-0000-0000-C000-000000000046"), PSETID_MEETING("6ED8DA90-450B-101B-98DA-00AA003F1305"), PSETID_LOG("0006200A-0000-0000-C000-000000000046"), PSETID_MESSAGING("41F28F13-83F4-4114-A584-EEDB5A6B0BFF"), PSETID_NOTE("0006200E-0000-0000-C000-000000000046"), PSETID_POST_RSS("00062041-0000-0000-C000-000000000046"), PSETID_TASK("00062003-0000-0000-C000-000000000046"), PSETID_UNIFIED_MESSAGING("4442858E-A9E3-4E80-B900-317A210CC15B"), PSETID_AIR_SYNC("71035549-0739-4DCB-9163-00F0580DBBDF"), PSETID_SHARING("00062040-0000-0000-C000-000000000046"), PSETID_XML_EXTRACTED_ENTITIES("23239608-685D-4732-9C55-4C95CB4E8E33"), PSETID_ATTACHMENT("96357F7F-59E1-47D0-99A7-46515C183B54"); private final ClassID classID; PredefinedPropertySet(String uuid) { classID = new ClassID(uuid); } public ClassID getClassID() { return classID; } } private ByteChunk guidStream; private ByteChunk entryStream; private ByteChunk stringStream; /** Holds all the chunks that were found. */ private List<Chunk> allChunks = new ArrayList<>(); public Chunk[] getAll() { return allChunks.toArray(new Chunk[0]); } @Override public Chunk[] getChunks() { return getAll(); } /** * Called by the parser whenever a chunk is found. */ @Override public void record(Chunk chunk) { if (chunk.getType() == Types.BINARY) { switch (chunk.getChunkId()) { case 2: guidStream = (ByteChunk)chunk; break; case 3: entryStream = (ByteChunk)chunk; break; case 4: stringStream = (ByteChunk)chunk; break; } } allChunks.add(chunk); } /** * Used to flag that all the chunks of the NameID have now been located. */ @Override public void chunksComplete() { // Currently, we don't need to do anything special once // all the chunks have been located } /** * Get property tag id by property set GUID and string name or numerical name from named properties mapping * @param guid Property set GUID in registry format without brackets. * May be one of the PS_* or PSETID_* constants * @param name Property name in case of string named property * @param id Property id in case of numerical named property * @return Property tag which can be matched with {@link org.apache.poi.hsmf.datatypes.MAPIProperty#id} * or 0 if the property could not be found. * */ public long getPropertyTag(ClassID guid, String name, long id) { final byte[] entryStreamBytes = (entryStream == null) ? null : entryStream.getValue(); if (guidStream == null || entryStream == null || stringStream == null || guid == null || entryStreamBytes == null) { return 0; } LittleEndianByteArrayInputStream leis = new LittleEndianByteArrayInputStream(entryStreamBytes); for (int i = 0; i < entryStreamBytes.length / 8; i++) { final long nameOffset = leis.readUInt(); int guidIndex = leis.readUShort(); final int propertyKind = guidIndex & 0x01; guidIndex = guidIndex >>> 1; final int propertyIndex = leis.readUShort(); // fetch and match property GUID if (!guid.equals(getPropertyGUID(guidIndex))) { continue; } // fetch property name / stream ID final String[] propertyName = { null }; final long[] propertyNameCRC32 = { -1L }; long streamID = getStreamID(propertyKind, (int)nameOffset, guid, guidIndex, n -> propertyName[0] = n, c -> propertyNameCRC32[0] = c); if (!matchesProperty(propertyKind, nameOffset, name, propertyName[0], id)) { continue; } // find property index in matching stream entry if (propertyKind == 1 && propertyNameCRC32[0] < 0) { // skip stream entry matching and return tag from property index from entry stream // this code should not be reached return 0x8000L + propertyIndex; } return getPropertyTag(streamID, nameOffset, propertyNameCRC32[0]); } return 0; } private long getPropertyTag(long streamID, long nameOffset, long propertyNameCRC32) { for (Chunk chunk : allChunks) { if (chunk.getType() != Types.BINARY || chunk.getChunkId() != streamID) { continue; } byte[] matchChunkBytes = ((ByteChunk) chunk).getValue(); if (matchChunkBytes == null) { continue; } LittleEndianByteArrayInputStream leis = new LittleEndianByteArrayInputStream(matchChunkBytes); for (int m = 0; m < matchChunkBytes.length / 8; m++) { long nameCRC = leis.readUInt(); int matchGuidIndex = leis.readUShort(); int matchPropertyIndex = leis.readUShort(); int matchPropertyKind = matchGuidIndex & 0x01; if (nameCRC == (matchPropertyKind == 0 ? nameOffset : propertyNameCRC32)) { return 0x8000L + matchPropertyIndex; } } } return 0; } private ClassID getPropertyGUID(int guidIndex) { if (guidIndex == 1) { // predefined GUID return PropertySetType.PS_MAPI.classID; } else if (guidIndex == 2) { // predefined GUID return PropertySetType.PS_PUBLIC_STRINGS.classID; } else if (guidIndex >= 3) { // GUID from guid stream byte[] guidStreamBytes = guidStream.getValue(); int guidIndexOffset = (guidIndex - 3) * 0x10; if (guidStreamBytes.length >= guidIndexOffset + 0x10) { return new ClassID(guidStreamBytes, guidIndexOffset); } } return null; } // property set GUID matches private static boolean matchesProperty(int propertyKind, long nameOffset, String name, String propertyName, long id) { return // match property by id (propertyKind == 0 && id >= 0 && id == nameOffset) || // match property by name (propertyKind == 1 && name != null && name.equals(propertyName)); } private long getStreamID(int propertyKind, int nameOffset, ClassID guid, int guidIndex, Consumer<String> propertyNameSetter, Consumer<Long> propertyNameCRC32Setter) { if (propertyKind == 0) { // numerical named property return 0x1000L + (nameOffset ^ (guidIndex << 1)) % 0x1F; } // string named property byte[] stringBytes = stringStream.getValue(); long propertyNameCRC32 = -1; if (stringBytes.length > nameOffset) { long nameLength = LittleEndian.getUInt(stringBytes, nameOffset); if (stringBytes.length >= nameOffset + 4 + nameLength) { int nameStart = nameOffset + 4; String propertyName = new String(stringBytes, nameStart, (int) nameLength, StringUtil.UTF16LE); if (PropertySetType.PS_INTERNET_HEADERS.classID.equals(guid)) { byte[] n = propertyName.toLowerCase(Locale.ROOT).getBytes(StringUtil.UTF16LE); propertyNameCRC32 = calculateCRC32(n, 0, n.length); } else { propertyNameCRC32 = calculateCRC32(stringBytes, nameStart, (int)nameLength); } propertyNameSetter.accept(propertyName); propertyNameCRC32Setter.accept(propertyNameCRC32); } } return 0x1000 + (propertyNameCRC32 ^ ((guidIndex << 1) | 1)) % 0x1F; } /** * Calculates the CRC32 of the given bytes (conforms to RFC 1510, SSH-1). * The CRC32 calculation is similar to the standard one as demonstrated in RFC 1952, * but with the inversion (before and after the calculation) omitted. * <ul> * <li>poly: 0x04C11DB7</li> * <li>init: 0x00000000</li> * <li>xor: 0x00000000</li> * <li>revin: true</li> * <li>revout: true</li> * <li>check: 0x2DFD2D88 (CRC32 of "123456789")</li> * </ul> * * @param buf the byte array to calculate CRC32 on * @param off the offset within buf at which the CRC32 calculation will start * @param len the number of bytes on which to calculate the CRC32 * @return the CRC32 value (unsigned 32-bit integer stored in a long). * * @see <a href="http://www.zorc.breitbandkatze.de/crc.html">CRC parameter check</a> */ private static long calculateCRC32(byte[] buf, int off, int len) { PureJavaCrc32 crc = new PureJavaCrc32(); // set initial crc value to 0 crc.update( new byte[] {-1,-1,-1,-1}, 0, 4); crc.update(buf, off, len); return ~crc.getValue() & 0xFFFFFFFFL; } }
⏎ org/apache/poi/hsmf/datatypes/NameIdChunks.java
Or download all of them as a single archive file:
File name: poi-scratchpad-5.2.3-src.zip File size: 1238744 bytes Release date: 2022-09-09 Download
⇒ What Is poi-examples-5.2.3.jar?
⇐ What Is poi-excelant-5.2.3.jar?
2017-03-22, 33683👍, 0💬
Popular Posts:
JDK 11 java.sql.rowset.jmod is the JMOD file for JDK 11 SQL Rowset module. JDK 11 SQL Rowset module ...
JAX-WS is an API for building web services and clients. It is the next generation Web Services API r...
JDK 11 java.rmi.jmod is the JMOD file for JDK 11 RMI (Remote Method Invocation) module. JDK 11 RMI m...
Jaxen, Release 1.1.1, is an open source XPath library written in Java. It is adaptable to many diffe...
The JSR 105 XML Digital Signature 1.0.1 FCS implementation provides an API and implementation that a...