static void write(Sttb sttb, HWPFOutputStream tableStream) throws IOException { final int headerSize = sttb.cDataLength == 2 ? 6 : 8; byte[] header = new byte[headerSize]; LittleEndian.putShort(header, 0, (short) 0xffff); if (sttb.data == null || sttb.data.length == 0) { if (sttb.cDataLength == 4) { LittleEndian.putInt(header, 2, 0); LittleEndian.putUShort(header, 6, sttb.cbExtra); tableStream.write(header); return; } LittleEndian.putUShort(header, 2, 0); LittleEndian.putUShort(header, 4, sttb.cbExtra); tableStream.write(header); return; } if (sttb.cDataLength == 4) { LittleEndian.putInt(header, 2, sttb.data.length); LittleEndian.putUShort(header, 6, sttb.cbExtra); tableStream.write(header); } else { LittleEndian.putUShort(header, 2, sttb.data.length); LittleEndian.putUShort(header, 4, sttb.cbExtra); tableStream.write(header); } for (int i = 0; i < sttb.data.length; i++) { String entry = sttb.data[i]; if (entry == null) { // is it correct? tableStream.write(new byte[] {-1, 0}); continue; } byte[] buf = new byte[entry.length() * 2 + sttb.cbExtra + 2]; LittleEndian.putShort(buf, 0, (short) entry.length()); StringUtil.putUnicodeLE(entry, buf, 2); if (sttb.extraData != null && i < sttb.extraData.length && sttb.extraData[i] != null) System.arraycopy( sttb.extraData[i], 0, buf, entry.length() * 2, Math.min(sttb.extraData[i].length, sttb.cbExtra)); tableStream.write(buf); } }
public void serialize(LittleEndianOutput out) { _range.serialize(out); _guid.serialize(out); out.writeInt(0x00000002); // TODO const out.writeInt(_linkOpts); if ((_linkOpts & HLINK_LABEL) != 0) { out.writeInt(_label.length()); StringUtil.putUnicodeLE(_label, out); } if ((_linkOpts & HLINK_TARGET_FRAME) != 0) { out.writeInt(_targetFrame.length()); StringUtil.putUnicodeLE(_targetFrame, out); } if ((_linkOpts & HLINK_URL) != 0 && (_linkOpts & HLINK_UNC_PATH) != 0) { out.writeInt(_address.length()); StringUtil.putUnicodeLE(_address, out); } if ((_linkOpts & HLINK_URL) != 0 && (_linkOpts & HLINK_UNC_PATH) == 0) { _moniker.serialize(out); if (URL_MONIKER.equals(_moniker)) { if (_uninterpretedTail == null) { out.writeInt(_address.length() * 2); StringUtil.putUnicodeLE(_address, out); } else { out.writeInt(_address.length() * 2 + TAIL_SIZE); StringUtil.putUnicodeLE(_address, out); writeTail(_uninterpretedTail, out); } } else if (FILE_MONIKER.equals(_moniker)) { out.writeShort(_fileOpts); out.writeInt(_shortFilename.length()); StringUtil.putCompressedUnicode(_shortFilename, out); writeTail(_uninterpretedTail, out); if (_address == null) { out.writeInt(0); } else { int addrLen = _address.length() * 2; out.writeInt(addrLen + 6); out.writeInt(addrLen); out.writeShort(0x0003); // TODO const StringUtil.putUnicodeLE(_address, out); } } } if ((_linkOpts & HLINK_PLACE) != 0) { out.writeInt(_textMark.length()); StringUtil.putUnicodeLE(_textMark, out); } }
protected void serialize(ContinuableRecordOutput out) { int dataSize = getDataSize(); out.writeContinueIfRequired(8); out.writeShort(reserved); out.writeShort(dataSize); out.writeShort(formattingFontIndex); out.writeShort(formattingOptions); out.writeContinueIfRequired(6); out.writeShort(numberOfRuns); out.writeShort(phoneticText.length()); out.writeShort(phoneticText.length()); out.writeContinueIfRequired(phoneticText.length() * 2); StringUtil.putUnicodeLE(phoneticText, out); for (int i = 0; i < phRuns.length; i++) { phRuns[i].serialize(out); } out.write(extraData); }
public void serialize(LittleEndianOutput out) { int formulaSize = field_2_refPtg == null ? field_2_unknownFormulaData.length : field_2_refPtg.getSize(); int idOffset = getStreamIDOffset(formulaSize); int dataSize = getDataSize(idOffset); out.writeShort(sid); out.writeShort(dataSize); out.writeShort(idOffset); out.writeShort(formulaSize); out.writeInt(field_1_unknown_int); int pos = 12; if (field_2_refPtg == null) { out.write(field_2_unknownFormulaData); } else { field_2_refPtg.write(out); } pos += formulaSize; int stringLen; if (field_4_ole_classname == null) { // don't write 0x03, stringLen, flag, text stringLen = 0; } else { out.writeByte(0x03); pos += 1; stringLen = field_4_ole_classname.length(); out.writeShort(stringLen); pos += 2; if (stringLen > 0) { out.writeByte(field_3_unicode_flag ? 0x01 : 0x00); pos += 1; if (field_3_unicode_flag) { StringUtil.putUnicodeLE(field_4_ole_classname, out); pos += stringLen * 2; } else { StringUtil.putCompressedUnicode(field_4_ole_classname, out); pos += stringLen; } } } // pad to next 2-byte boundary (requires 0 or 1 bytes) switch (idOffset - (pos - 6)) { // 6 for 3 shorts: sid, dataSize, idOffset case 1: out.writeByte(field_4_unknownByte == null ? 0x00 : field_4_unknownByte.intValue()); pos++; case 0: break; default: throw new IllegalStateException("Bad padding calculation (" + idOffset + ", " + pos + ")"); } if (field_5_stream_id != null) { out.writeInt(field_5_stream_id.intValue()); pos += 4; } out.write(field_6_unknown); }