/************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2000, 2010 Oracle and/or its affiliates.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenOffice.org is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice.org. If not, see
* Provides functionality to encode a One needs to create one Sample usage: Write out a PDB into the given First, write out the header data by using the
* The RecordList section contains a list of
* PalmDB
object
* into a PDB formatted file given a file OutputStream
.
* This class is only used by the PalmDB
object.PdbEncoder
object per
* PalmDB
object to be encoded. This class keeps
* the PDB header data and functionality in the PdbHeader
* class.
*
* @author Herbie Ong
* @see PalmDB
* @see Record
*/
public final class PdbEncoder {
/** PDB header. */
private PdbHeader header = null;
/** the PalmDB object. */
private PalmDB db = null;
/**
* The pattern for unique_id=0x00BABE(start).
*/
private final static int START_UNIQUE_ID = 0x00BABE;
/**
* Constructor.
*
* @param db The
* PdbEncoder encoder = new PdbEncoder(palmDB, "STRW", "data");
* encoder.write(new FileOutputStream("sample.pdb"));
*
PalmDB
to be encoded.
*/
public PdbEncoder(PalmDB db) {
header = new PdbHeader();
header.version = db.getVersion();
header.attribute = db.getAttribute();
this.db = db;
header.pdbName = db.getPDBNameBytes();
header.creatorID = db.getCreatorID();
header.typeID = db.getTypeID();
// set the following dates to current date
Date date = new Date();
header.creationDate = (date.getTime() / 1000) + PdbUtil.TIME_DIFF;
header.modificationDate = header.creationDate;
header.numRecords = db.getRecordCount();
}
/**
* OutputStream
.PdbHeader
write
method. Next,
* calculate the RecordList section and write it out.
* Lastly, write out the bytes corresponding to each
* Record
.Record
index info, where each Record
* index info contains:
*
Record
from the
* top of the PDB.Record
attribute.Record
ID.
There should be a total of header.numRecords
* of Record
index info
OutputStream
to write out PDB.
*
* @throws IOException If I/O error occurs.
*/
public void write(OutputStream os) throws IOException {
BufferedOutputStream bos = new BufferedOutputStream(os);
DataOutputStream dos = new DataOutputStream(bos);
// write out the PDB header
header.write(dos);
if (header.numRecords > 0) {
// compute for recOffset[]
int recOffset[] = new int[header.numRecords];
byte recAttr[] = new byte[header.numRecords];
// first recOffset will be at PdbUtil.HEADER_SIZE + all the
// record indices (@ 8 bytes each)
recOffset[0] = PdbUtil.HEADER_SIZE + (header.numRecords * 8);
int lastIndex = header.numRecords - 1;
for (int i = 0; i < lastIndex; i++) {
Record rec = db.getRecord(i);
int size = rec.getSize();
recAttr[i] = rec.getAttributes();
recOffset[i+1] = recOffset[i] + size;
}
// grab the last record's attribute.
Record lastRec = db.getRecord(lastIndex);
recAttr[lastIndex] = lastRec.getAttributes();
int uid = START_UNIQUE_ID;
for (int i = 0; i < header.numRecords; i++) {
// write out each record offset
dos.writeInt(recOffset[i]);
// write out record attribute (recAttr) and
// unique ID (uid) in 4 bytes (int) chunk.
// unique ID's have to be unique, thus
// increment each time.
int attr = (((int) recAttr[i]) << 24 );
attr |= uid;
dos.writeInt(attr);
uid++;
}
// write out the raw records
for (int i = 0; i < header.numRecords; i++) {
Record rec = db.getRecord(i);
byte bytes[] = rec.getBytes();
dos.write(bytes);
}
} else {
// placeholder bytes if there are no records in the list.
dos.writeShort(0);
}
dos.flush();
}
}