123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286 |
- /* ====================================================================
- 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.hssf.record;
-
- import java.util.Collections;
- import java.util.LinkedHashMap;
- import java.util.Map;
- import java.util.function.Supplier;
-
- import org.apache.poi.util.LittleEndianOutput;
-
- /**
- * Somewhat of a misnomer, its used for the beginning of a set of records that
- * have a particular purpose or subject. Used in sheets and workbooks.
- */
- public final class BOFRecord extends StandardRecord {
- /**
- * for BIFF8 files the BOF is 0x809. For earlier versions see
- * {@link #biff2_sid} {@link #biff3_sid} {@link #biff4_sid}
- * {@link #biff5_sid}
- */
- public static final short sid = 0x809;
- // SIDs from earlier BIFF versions
- public static final short biff2_sid = 0x009;
- public static final short biff3_sid = 0x209;
- public static final short biff4_sid = 0x409;
- public static final short biff5_sid = 0x809;
-
- /** suggested default (0x0600 - BIFF8) */
- public static final int VERSION = 0x0600;
- /** suggested default 0x10d3 */
- public static final int BUILD = 0x10d3;
- /** suggested default 0x07CC (1996) */
- public static final int BUILD_YEAR = 0x07CC; // 1996
- /** suggested default for a normal sheet (0x41) */
- public static final int HISTORY_MASK = 0x41;
-
- public static final int TYPE_WORKBOOK = 0x05;
- public static final int TYPE_VB_MODULE = 0x06;
- public static final int TYPE_WORKSHEET = 0x10;
- public static final int TYPE_CHART = 0x20;
- public static final int TYPE_EXCEL_4_MACRO = 0x40;
- public static final int TYPE_WORKSPACE_FILE = 0x100;
-
- private int field_1_version;
- private int field_2_type;
- private int field_3_build;
- private int field_4_year;
- private int field_5_history;
- private int field_6_rversion;
-
- /**
- * Constructs an empty BOFRecord with no fields set.
- */
- public BOFRecord() {}
-
- public BOFRecord(BOFRecord other) {
- super(other);
- field_1_version = other.field_1_version;
- field_2_type = other.field_2_type;
- field_3_build = other.field_3_build;
- field_4_year = other.field_4_year;
- field_5_history = other.field_5_history;
- field_6_rversion = other.field_6_rversion;
- }
-
- private BOFRecord(int type) {
- field_1_version = VERSION;
- field_2_type = type;
- field_3_build = BUILD;
- field_4_year = BUILD_YEAR;
- field_5_history = 0x01;
- field_6_rversion = VERSION;
- }
-
- public static BOFRecord createSheetBOF() {
- return new BOFRecord(TYPE_WORKSHEET);
- }
-
- public BOFRecord(RecordInputStream in) {
- field_1_version = in.readShort();
- field_2_type = in.readShort();
-
- // Some external tools don't generate all of
- // the remaining fields
- if (in.remaining() >= 2) {
- field_3_build = in.readShort();
- }
- if (in.remaining() >= 2) {
- field_4_year = in.readShort();
- }
- if (in.remaining() >= 4) {
- field_5_history = in.readInt();
- }
- if (in.remaining() >= 4) {
- field_6_rversion = in.readInt();
- }
- }
-
- /**
- * Version number - for BIFF8 should be 0x06
- * @see #VERSION
- * @param version version to be set
- */
- public void setVersion(int version) {
- field_1_version = version;
- }
-
- /**
- * type of object this marks
- * @see #TYPE_WORKBOOK
- * @see #TYPE_VB_MODULE
- * @see #TYPE_WORKSHEET
- * @see #TYPE_CHART
- * @see #TYPE_EXCEL_4_MACRO
- * @see #TYPE_WORKSPACE_FILE
- * @param type type to be set
- */
- public void setType(int type) {
- field_2_type = type;
- }
-
- /**
- * build that wrote this file
- * @see #BUILD
- * @param build build number to set
- */
- public void setBuild(int build) {
- field_3_build = build;
- }
-
- /**
- * Year of the build that wrote this file
- * @see #BUILD_YEAR
- * @param year build year to set
- */
- public void setBuildYear(int year) {
- field_4_year = year;
- }
-
- /**
- * set the history bit mask (not very useful)
- * @see #HISTORY_MASK
- * @param bitmask bitmask to set for the history
- */
- public void setHistoryBitMask(int bitmask) {
- field_5_history = bitmask;
- }
-
- /**
- * set the minimum version required to read this file
- *
- * @see #VERSION
- * @param version version to set
- */
- public void setRequiredVersion(int version) {
- field_6_rversion = version;
- }
-
- /**
- * Version number - for BIFF8 should be 0x06
- * @see #VERSION
- * @return version number of the generator of this file
- */
- public int getVersion() {
- return field_1_version;
- }
-
- /**
- * type of object this marks
- * @see #TYPE_WORKBOOK
- * @see #TYPE_VB_MODULE
- * @see #TYPE_WORKSHEET
- * @see #TYPE_CHART
- * @see #TYPE_EXCEL_4_MACRO
- * @see #TYPE_WORKSPACE_FILE
- * @return type of object
- */
- public int getType() {
- return field_2_type;
- }
-
- /**
- * get the build that wrote this file
- * @see #BUILD
- * @return short build number of the generator of this file
- */
- public int getBuild() {
- return field_3_build;
- }
-
- /**
- * Year of the build that wrote this file
- * @see #BUILD_YEAR
- * @return short build year of the generator of this file
- */
- public int getBuildYear() {
- return field_4_year;
- }
-
- /**
- * get the history bit mask (not very useful)
- * @see #HISTORY_MASK
- * @return int bitmask showing the history of the file (who cares!)
- */
- public int getHistoryBitMask() {
- return field_5_history;
- }
-
- /**
- * get the minimum version required to read this file
- *
- * @see #VERSION
- * @return int least version that can read the file
- */
- public int getRequiredVersion() {
- return field_6_rversion;
- }
-
- private String getTypeName() {
- switch(field_2_type) {
- case TYPE_CHART: return "chart";
- case TYPE_EXCEL_4_MACRO: return "excel 4 macro";
- case TYPE_VB_MODULE: return "vb module";
- case TYPE_WORKBOOK: return "workbook";
- case TYPE_WORKSHEET: return "worksheet";
- case TYPE_WORKSPACE_FILE: return "workspace file";
- }
- return "#error unknown type#";
- }
-
- public void serialize(LittleEndianOutput out) {
- out.writeShort(getVersion());
- out.writeShort(getType());
- out.writeShort(getBuild());
- out.writeShort(getBuildYear());
- out.writeInt(getHistoryBitMask());
- out.writeInt(getRequiredVersion());
- }
-
- protected int getDataSize() {
- return 16;
- }
-
- public short getSid(){
- return sid;
- }
-
- @Override
- public BOFRecord copy() {
- return new BOFRecord(this);
- }
-
- @Override
- public HSSFRecordTypes getGenericRecordType() {
- return HSSFRecordTypes.BOF;
- }
-
- @Override
- public Map<String, Supplier<?>> getGenericProperties() {
- final Map<String,Supplier<?>> m = new LinkedHashMap<>();
- m.put("version", this::getVersion);
- m.put("type", this::getType);
- m.put("typeName", this::getTypeName);
- m.put("build", this::getBuild);
- m.put("buildYear", this::getBuildYear);
- m.put("history", this::getHistoryBitMask);
- m.put("requiredVersion", this::getRequiredVersion);
- return Collections.unmodifiableMap(m);
- }
- }
|