001: /* ====================================================================
002: Licensed to the Apache Software Foundation (ASF) under one or more
003: contributor license agreements. See the NOTICE file distributed with
004: this work for additional information regarding copyright ownership.
005: The ASF licenses this file to You under the Apache License, Version 2.0
006: (the "License"); you may not use this file except in compliance with
007: the License. You may obtain a copy of the License at
008:
009: http://www.apache.org/licenses/LICENSE-2.0
010:
011: Unless required by applicable law or agreed to in writing, software
012: distributed under the License is distributed on an "AS IS" BASIS,
013: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: See the License for the specific language governing permissions and
015: limitations under the License.
016: ==================================================================== */
017:
018: package org.apache.poi.hslf.record;
019:
020: import java.io.IOException;
021: import java.io.OutputStream;
022:
023: import org.apache.poi.util.LittleEndian;
024:
025: /**
026: * The atom that holds metadata on a specific embedded object in the document.
027: *
028: * <!--
029: * 0 sint4 followColorScheme This field indicates how the object follows the color scheme. Valid values are:
030: * 0 - doesn't follow the color scheme
031: * 1 - follows the entire color scheme
032: * 2 - follows the text and background scheme
033: *
034: * 4 bool1 cantLockServerB Set if the embedded server can not be locked
035: * 5 bool1 noSizeToServerB Set if don't need to send the dimension to the embedded object
036: * 6 Bool1 isTable Set if the object is a Word table
037: * -->
038: *
039: * @author Daniel Noll
040: */
041: public class ExEmbedAtom extends RecordAtom {
042:
043: /**
044: * Embedded document does not follow the color scheme.
045: */
046: public static final int DOES_NOT_FOLLOW_COLOR_SCHEME = 0;
047:
048: /**
049: * Embedded document follows the entire color scheme.
050: */
051: public static final int FOLLOWS_ENTIRE_COLOR_SCHEME = 1;
052:
053: /**
054: * Embedded document follows the text and background scheme.
055: */
056: public static final int FOLLOWS_TEXT_AND_BACKGROUND_SCHEME = 2;
057:
058: /**
059: * Record header.
060: */
061: private byte[] _header;
062:
063: /**
064: * Record data.
065: */
066: private byte[] _data;
067:
068: /**
069: * Constructs a brand new embedded object atom record.
070: */
071: protected ExEmbedAtom() {
072: _header = new byte[8];
073: _data = new byte[7];
074:
075: LittleEndian.putShort(_header, 2, (short) getRecordType());
076: LittleEndian.putInt(_header, 4, _data.length);
077:
078: // It is fine for the other values to be zero
079: }
080:
081: /**
082: * Constructs the embedded object atom record from its source data.
083: *
084: * @param source the source data as a byte array.
085: * @param start the start offset into the byte array.
086: * @param len the length of the slice in the byte array.
087: */
088: protected ExEmbedAtom(byte[] source, int start, int len) {
089: // Get the header.
090: _header = new byte[8];
091: System.arraycopy(source, start, _header, 0, 8);
092:
093: // Get the record data.
094: _data = new byte[len - 8];
095: System.arraycopy(source, start + 8, _data, 0, len - 8);
096:
097: // Must be at least 4 bytes long
098: if (_data.length < 7) {
099: throw new IllegalArgumentException(
100: "The length of the data for a ExEmbedAtom must be at least 4 bytes, but was only "
101: + _data.length);
102: }
103: }
104:
105: /**
106: * Gets whether the object follows the color scheme.
107: *
108: * @return one of {@link #DOES_NOT_FOLLOW_COLOR_SCHEME},
109: * {@link #FOLLOWS_ENTIRE_COLOR_SCHEME}, or
110: * {@link #FOLLOWS_TEXT_AND_BACKGROUND_SCHEME}.
111: */
112: public int getFollowColorScheme() {
113: return LittleEndian.getInt(_data, 0);
114: }
115:
116: /**
117: * Gets whether the embedded server cannot be locked.
118: *
119: * @return {@code true} if the embedded server cannot be locked.
120: */
121: public boolean getCantLockServerB() {
122: return _data[4] != 0;
123: }
124:
125: /**
126: * Gets whether it is not required to send the dimensions to the embedded object.
127: *
128: * @return {@code true} if the embedded server does not require the object dimensions.
129: */
130: public boolean getNoSizeToServerB() {
131: return _data[5] != 0;
132: }
133:
134: /**
135: * Getswhether the object is a Word table.
136: *
137: * @return {@code true} if the object is a Word table.
138: */
139: public boolean getIsTable() {
140: return _data[6] != 0;
141: }
142:
143: /**
144: * Gets the record type.
145: * @return the record type.
146: */
147: public long getRecordType() {
148: return RecordTypes.ExEmbedAtom.typeID;
149: }
150:
151: /**
152: * Write the contents of the record back, so it can be written
153: * to disk
154: *
155: * @param out the output stream to write to.
156: * @throws IOException if an error occurs.
157: */
158: public void writeOut(OutputStream out) throws IOException {
159: out.write(_header);
160: out.write(_data);
161: }
162:
163: }
|