summaryrefslogtreecommitdiff
path: root/xmerge/source/wordsmith/java/org/openoffice/xmerge/converter/xml/sxw/wordsmith/WSEncoder.java
diff options
context:
space:
mode:
Diffstat (limited to 'xmerge/source/wordsmith/java/org/openoffice/xmerge/converter/xml/sxw/wordsmith/WSEncoder.java')
-rw-r--r--xmerge/source/wordsmith/java/org/openoffice/xmerge/converter/xml/sxw/wordsmith/WSEncoder.java212
1 files changed, 212 insertions, 0 deletions
diff --git a/xmerge/source/wordsmith/java/org/openoffice/xmerge/converter/xml/sxw/wordsmith/WSEncoder.java b/xmerge/source/wordsmith/java/org/openoffice/xmerge/converter/xml/sxw/wordsmith/WSEncoder.java
new file mode 100644
index 000000000000..15cf4ed36544
--- /dev/null
+++ b/xmerge/source/wordsmith/java/org/openoffice/xmerge/converter/xml/sxw/wordsmith/WSEncoder.java
@@ -0,0 +1,212 @@
+/*************************************************************************
+ *
+ * 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
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.xmerge.converter.xml.sxw.wordsmith;
+
+import java.io.ByteArrayOutputStream;
+import java.io.DataOutputStream;
+import java.io.*;
+import java.io.UnsupportedEncodingException;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Vector;
+
+import org.openoffice.xmerge.converter.palm.*;
+
+/**
+ * This class is used by {@link
+ * org.openoffice.xmerge.converter.xml.sxw.wordsmith.DocumentDeserializerImpl
+ * DocumentDeserializerImpl} to encode the WordSmith format.
+ *
+ * @author David Proulx
+ */
+
+// DJP: replace 4096 w/ a defined constant
+
+final class WSEncoder {
+
+ /* DJP: These should probably go somewhere else! */
+ /** Constant for uncompressed version. */
+ public static final short UNCOMPRESSED = 1;
+
+ /** Constant for compressed version. */
+ public static final short COMPRESSED = 2;
+
+ /** Constant used for spare fields. */
+ public static final int SPARE = 0;
+
+ /* WordSmith Header information. */
+ private short version;
+ private int textLen;
+ private short maxRecSize;
+ private int textRecCount = 0;
+
+
+ /* WordSmith document elements. */
+ WseHeader header = null;
+ WseFontTable ft = null;
+ WseColorTable ct = null;
+ private Vector elements; // paragraphs & text runs
+
+ /* Totals for the WordSmith document. */
+ int nrParagraphs = 0;
+ int nrAtoms = 0;
+ int nrChars = 0;
+
+
+ /**
+ * Default constructor creates a header and
+ * a text buffer for holding all the text in
+ * the WordSmith database.
+ */
+ WSEncoder() {
+ version = 1;
+ textLen = 0;
+ maxRecSize = 4096;
+ elements = new Vector();
+ }
+
+
+ /**
+ * This method adds a new element to the WordSmith document.
+ *
+ * @param elem WordSmith document element to add
+ */
+ void addElement(Wse elem) {
+ if (elem.getClass() == WseHeader.class)
+ header = (WseHeader)elem;
+ else if (elem.getClass() == WseFontTable.class)
+ ft = (WseFontTable)elem;
+ else if (elem.getClass() == WseColorTable.class)
+ ct = (WseColorTable)elem;
+ else
+ elements.addElement(elem);
+ }
+
+
+ /**
+ * This method encodes the information given to
+ * an array of palm Records in the WordSmith database format.
+ *
+ * @return <code>Record</code> array holding WordSmith contents.
+ *
+ * @throws IOException If any I/O error occurs.
+ */
+ Record[] getRecords() throws IOException {
+
+ Vector allRecs = new Vector();
+ int nElements = elements.size();
+
+ // Count up the number of paragraphs, atoms, and characters.
+ int currElement = 0;
+ while (currElement < nElements) {
+ Wse e = (Wse)elements.elementAt(currElement++);
+ if (e.getClass() == WsePara.class)
+ nrParagraphs++;
+ if (e.getClass() == WseTextRun.class) {
+ nrAtoms++;
+ nrChars += ((WseTextRun)e).getText().length();
+ }
+ }
+
+ byte[] currRec = new byte[4096];
+ int currRecLen = 0;
+
+ // This code assumes that the WordSmith header, font table,
+ // and color table total less than 4096 bytes.
+ header = new WseHeader(nrParagraphs, nrAtoms, nrChars, ft, ct);
+ System.arraycopy(header.getBytes(), 0,
+ currRec, currRecLen, header.getByteCount());
+ currRecLen += header.getByteCount();
+
+ if (ft != null) {
+ System.arraycopy(ft.getBytes(), 0, currRec, currRecLen,
+ ft.getByteCount());
+ currRecLen += ft.getByteCount();
+ }
+ if (ct != null) {
+ System.arraycopy(ct.getBytes(), 0, currRec, currRecLen,
+ ct.getByteCount());
+ currRecLen += ct.getByteCount();
+ }
+
+ currElement = 0;
+ while (currElement < nElements) {
+ Wse e = (Wse)elements.elementAt(currElement++);
+ int length = e.getByteCount();
+ if ((length + currRecLen) <= 4096) {
+ System.arraycopy(e.getBytes(), 0, currRec, currRecLen, length);
+ currRecLen += length;
+ } else {
+ // Copy in enough to get to full size, then create a
+ // new Record and add it to the Vector.
+ int firstPartLen = 4096 - currRecLen;
+ System.arraycopy(e.getBytes(), 0, currRec, currRecLen,
+ firstPartLen);
+ Record r = new Record(currRec);
+ allRecs.addElement(r);
+
+ // Put the remainder at the beginning of the next record
+ currRecLen = 0;
+ System.arraycopy(e.getBytes(), firstPartLen, currRec,
+ currRecLen, length - firstPartLen);
+ currRecLen += length - firstPartLen;
+ }
+ }
+
+ // Processed all the elements. Write out any remaining partial record.
+ if (currRecLen > 0) {
+ byte[] partial = new byte[currRecLen];
+ System.arraycopy(currRec, 0, partial, 0, currRecLen);
+ Record rr = new Record(partial);
+ allRecs.addElement(rr);
+ }
+
+
+ // Record 0 is the WordSmith header. Do it last since it
+ // contains totals for the entire document. It goes
+ // before everything else.
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ DataOutputStream dos = new DataOutputStream(bos);
+ dos.writeShort(version);
+ dos.writeShort(0);
+ dos.writeInt(textLen);
+ dos.writeShort(allRecs.size());
+ dos.writeShort(maxRecSize);
+ dos.writeInt(0);
+ allRecs.insertElementAt(new Record(bos.toByteArray()), 0);
+
+ // Convert Vector of Records to an array and return it.
+ int nRecs = allRecs.size();
+ Record recs[] = new Record[nRecs];
+ for (int i = 0; i < nRecs; i++)
+ recs[i] = (Record)allRecs.elementAt(i);
+ return recs;
+ }
+
+}
+