blob: 20b4c57c5da9cd1eedb7c13fa68add6602d434eb [file] [log] [blame]
/**************************************************************
*
* 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.openoffice.xmerge.converter.palm;
import java.io.OutputStream;
import java.io.InputStream;
import java.io.DataOutputStream;
import java.io.DataInputStream;
import java.io.IOException;
/**
* <p>Contains the raw bytes for a <code>Record</code> in a PDB.</p>
*
* <p>Note that it is not associated with a <code>Record</code> number
* or ID.</p>
*
* @author Akhil Arora, Herbie Ong
* @see PalmDocument
* @see PalmDB
*/
public final class Record {
/** <code>Record</code> <code>byte</code> array. */
private byte[] data;
/** <code>Record</code> attributes. */
private byte attributes = 0;
/**
* Default constructor.
*/
public Record() {
data = new byte[0];
}
/**
* <p>Constructor to create a <code>Record</code> filled with
* bytes.</p>
*
* <p>Note that this does not check for 64k <code>Record</code>
* sizes. User of this class must check for that.</p>
*
* @param d <code>byte</code> array contents for this object.
*/
public Record(byte[] d) {
this(d, (byte) 0);
}
/**
* <p>Constructor to create a <code>Record</code> filled with
* bytes and assign <code>Record</code> attributes.</p>
*
* <p>Note that this does not check for 64k <code>Record</code>
* sizes. User of this class must check for that.</p>
*
* @param d <code>byte</code> array contents for this object.
* @param attrs <code>Record</code> attributes.
*/
public Record(byte[] d, byte attrs) {
data = new byte[d.length];
attributes = attrs;
System.arraycopy(d, 0, data, 0, d.length);
}
/**
* This method returns the number of bytes in this object.
*
* @return Number of bytes in this object.
*/
public int getSize() {
return data.length;
}
/**
* This method returns the contents of this <code>Object</code>.
*
* @return Contents in <code>byte</code> array
*/
public byte[] getBytes() {
return data;
}
/**
* <p>This method returns the <code>Record</code> attributes.</p>
*
* <blockquote><pre>
* <code>Record</code> attributes consists of (from high to low bit)
*
* delete (1) - dirty (1) - busy (1) - secret (1) - category (4)
* </pre></blockquote>
*
* @return <code>Record</code> attribute.
*/
public byte getAttributes() {
return attributes;
}
/**
* Write out the <code>Record</code> attributes and
* <code>Record</code> length followed by the data in this
* <code>Record</code> object.
*
* @param out The <code>OutputStream</code> to write the object.
*
* @throws IOException If any I/O error occurs.
*/
public void write(OutputStream outs) throws IOException {
DataOutputStream out = new DataOutputStream(outs);
out.writeByte(attributes);
out.writeShort(data.length);
out.write(data);
}
/**
* Read the necessary data to create a PDB from
* the <code>InputStream</code>.
*
* @param in The <code>InputStream</code> to read data from
* in order to restore the <code>object</code>.
*
* @throws IOException If any I/O error occurs.
*/
public void read(InputStream ins) throws IOException {
DataInputStream in = new DataInputStream(ins);
attributes = in.readByte();
int len = in.readUnsignedShort();
data = new byte[len];
in.readFully(data);
}
/**
* <p>Override equals method of <code>Object</code>.</p>
*
* <p>Two <code>Record</code> objects are equal if they contain
* the same bytes in the array and the same attributes.</p>
*
* <p>This is used primarily for testing purposes only for now.</p>
*
* @param obj A <code>Record</code> object to compare with
*
* @return true if obj is equal, otherwise false.
*/
public boolean equals(Object obj) {
boolean bool = false;
if (obj instanceof Record) {
Record rec = (Record) obj;
checkLabel: {
if (rec.getAttributes() != attributes) {
break checkLabel;
}
if (rec.getSize() == data.length) {
for (int i = 0; i < data.length; i++) {
if (data[i] != rec.data[i]) {
break checkLabel;
}
}
bool = true;
}
}
}
return bool;
}
}