From: Nick Burch Date: Sun, 5 Feb 2006 18:36:59 +0000 (+0000) Subject: CString support X-Git-Tag: REL_3_0_ALPHA3~190 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=e12f883eb77aabc8dc26d649d269f660a87330df;p=poi.git CString support git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@375074 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/CString.java b/src/scratchpad/src/org/apache/poi/hslf/record/CString.java new file mode 100644 index 0000000000..df2fad1848 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hslf/record/CString.java @@ -0,0 +1,98 @@ +package org.apache.poi.hslf.record; + +import java.io.IOException; +import java.io.OutputStream; + +import org.apache.poi.util.LittleEndian; +import org.apache.poi.util.StringUtil; + +/** + * A CString (type 4026). Holds a unicode string, and the first two bytes + * of the record header normally encode the count. Typically attached to + * some complex sequence of records, eg Commetns. + * + * @author Nick Burch + */ + +public class CString extends RecordAtom { + private byte[] _header; + private static long _type = 4026l; + + /** The bytes that make up the text */ + private byte[] _text; + + /** Grabs the text. */ + public String getText() { + return StringUtil.getFromUnicodeLE(_text); + } + + /** Updates the text in the Atom. */ + public void setText(String text) { + // Convert to little endian unicode + _text = new byte[text.length()*2]; + StringUtil.putUnicodeLE(text,_text,0); + + // Update the size (header bytes 5-8) + LittleEndian.putInt(_header,4,_text.length); + } + + /** + * Grabs the count, from the first two bytes of the header. + * The meaning of the count is specific to the type of the parent record + */ + public int getCount() { + return (int)LittleEndian.getShort(_header); + } + + /** + * Sets the count + * The meaning of the count is specific to the type of the parent record + */ + public void setCount(int count) { + LittleEndian.putShort(_header, (short)count); + } + + /* *************** record code follows ********************** */ + + /** + * For the CStrubg Atom + */ + protected CString(byte[] source, int start, int len) { + // Sanity Checking + if(len < 8) { len = 8; } + + // Get the header + _header = new byte[8]; + System.arraycopy(source,start,_header,0,8); + + // Grab the text + _text = new byte[len-8]; + System.arraycopy(source,start+8,_text,0,len-8); + } + /** + * Create an empty CString + */ + public CString() { + // 0 length header + _header = new byte[] { 0, 0, 0xBA-256, 0x0f, 0, 0, 0, 0 }; + // Empty text + _text = new byte[0]; + } + + /** + * We are of type 4026 + */ + public long getRecordType() { return _type; } + + /** + * Write the contents of the record back, so it can be written + * to disk + */ + public void writeOut(OutputStream out) throws IOException { + // Header - size or type unchanged + out.write(_header); + + // Write out our text + out.write(_text); + } +}