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.ddf;
019:
020: import org.apache.poi.util.LittleEndian;
021: import org.apache.poi.util.HexDump;
022:
023: import java.util.Arrays;
024: import java.io.ByteArrayOutputStream;
025: import java.io.IOException;
026:
027: /**
028: * A complex property differs from a simple property in that the data can not fit inside a 32 bit
029: * integer. See the specification for more detailed information regarding exactly what is
030: * stored here.
031: *
032: * @author Glen Stampoultzis
033: */
034: public class EscherComplexProperty extends EscherProperty {
035: byte[] complexData = new byte[0];
036:
037: /**
038: * Create a complex property using the property id and a byte array containing the complex
039: * data value.
040: *
041: * @param id The id consists of the property number, a flag indicating whether this is a blip id and a flag
042: * indicating that this is a complex property.
043: * @param complexData The value of this property.
044: */
045: public EscherComplexProperty(short id, byte[] complexData) {
046: super (id);
047: this .complexData = complexData;
048: }
049:
050: /**
051: * Create a complex property using the property number, a flag to indicate whether this is a
052: * blip reference and the complex property data.
053: *
054: * @param propertyNumber The property number
055: * @param isBlipId Whether this is a blip id. Should be false.
056: * @param complexData The value of this complex property.
057: */
058: public EscherComplexProperty(short propertyNumber,
059: boolean isBlipId, byte[] complexData) {
060: super (propertyNumber, true, isBlipId);
061: this .complexData = complexData;
062: }
063:
064: /**
065: * Serializes the simple part of this property. ie the first 6 bytes.
066: */
067: public int serializeSimplePart(byte[] data, int pos) {
068: LittleEndian.putShort(data, pos, getId());
069: LittleEndian.putInt(data, pos + 2, complexData.length);
070: return 6;
071: }
072:
073: /**
074: * Serializes the complex part of this property
075: *
076: * @param data The data array to serialize to
077: * @param pos The offset within data to start serializing to.
078: * @return The number of bytes serialized.
079: */
080: public int serializeComplexPart(byte[] data, int pos) {
081: System.arraycopy(complexData, 0, data, pos, complexData.length);
082: return complexData.length;
083: }
084:
085: /**
086: * Get the complex data value.
087: */
088: public byte[] getComplexData() {
089: return complexData;
090: }
091:
092: /**
093: * Determine whether this property is equal to another property.
094: *
095: * @param o The object to compare to.
096: * @return True if the objects are equal.
097: */
098: public boolean equals(Object o) {
099: if (this == o)
100: return true;
101: if (!(o instanceof EscherComplexProperty))
102: return false;
103:
104: final EscherComplexProperty escherComplexProperty = (EscherComplexProperty) o;
105:
106: if (!Arrays.equals(complexData,
107: escherComplexProperty.complexData))
108: return false;
109:
110: return true;
111: }
112:
113: /**
114: * Caclulates the number of bytes required to serialize this property.
115: *
116: * @return Number of bytes
117: */
118: public int getPropertySize() {
119: return 6 + complexData.length;
120: }
121:
122: /**
123: * Calculates a hashcode for this property.
124: */
125: public int hashCode() {
126: return getId() * 11;
127: }
128:
129: /**
130: * Retrieves the string representation for this property.
131: */
132: public String toString() {
133: String dataStr;
134: ByteArrayOutputStream b = new ByteArrayOutputStream();
135: try {
136: HexDump.dump(this .complexData, 0, b, 0);
137: dataStr = b.toString();
138: } catch (Exception e) {
139: dataStr = e.toString();
140: } finally {
141: try {
142: b.close();
143: } catch (IOException e) {
144: e.printStackTrace();
145: }
146: }
147:
148: return "propNum: " + getPropertyNumber() + ", propName: "
149: + EscherProperties.getPropertyName(getPropertyNumber())
150: + ", complex: " + isComplex() + ", blipId: "
151: + isBlipId() + ", data: "
152: + System.getProperty("line.separator") + dataStr;
153: }
154:
155: }
|