/** This method will Read a byte from the current record*/ public int Read() { CheckRecordPosition(LittleEndianConstants.BYTE_SIZE); _currentDataOffset += LittleEndianConstants.BYTE_SIZE; pos += LittleEndianConstants.BYTE_SIZE; return(_dataInput.ReadByte()); }
/** * @param ris the RecordInputstream to read the record from */ public NameCommentRecord(RecordInputStream ris) { LittleEndianInput in1 = ris; field_1_record_type = in1.ReadShort(); field_2_frt_cell_ref_flag = in1.ReadShort(); field_3_reserved = in1.ReadLong(); int field_4_name_length = in1.ReadShort(); int field_5_comment_length = in1.ReadShort(); in1.ReadByte(); //spurious NUL field_6_name_text = StringUtil.ReadCompressedUnicode(in1, field_4_name_length); in1.ReadByte(); //spurious NUL field_7_comment_text = StringUtil.ReadCompressedUnicode(in1, field_5_comment_length); }
private static object ReadAConstantValue(LittleEndianInput in1) { byte grbit = (byte)in1.ReadByte(); switch (grbit) { case TYPE_EMPTY: in1.ReadLong(); // 8 byte 'not used' field return(EMPTY_REPRESENTATION); case TYPE_NUMBER: return(in1.ReadDouble()); case TYPE_STRING: return(StringUtil.ReadUnicodeString(in1)); case TYPE_BOOLEAN: return(ReadBoolean(in1)); case TYPE_ERROR_CODE: int errCode = in1.ReadUShort(); // next 6 bytes are Unused in1.ReadUShort(); in1.ReadInt(); return(ErrorConstant.ValueOf(errCode)); } throw new Exception("Unknown grbit value (" + grbit + ")"); }
public static Ptg CreatePtg(LittleEndianInput in1) { byte id = (byte)in1.ReadByte(); if (id < 0x20) { return(CreateBasePtg(id, in1)); } Ptg retval = CreateClassifiedPtg(id, in1); if (id > 0x60) { retval.PtgClass = CLASS_ARRAY; } else if (id > 0x40) { retval.PtgClass = CLASS_VALUE; } else { retval.PtgClass = CLASS_REF; } return(retval); }
public ArrayPtg(LittleEndianInput in1) { field_1_reserved = new byte[RESERVED_FIELD_LEN]; // TODO - Add ReadFully method to RecordInputStream for (int i = 0; i < RESERVED_FIELD_LEN; i++) { field_1_reserved[i] = (byte)in1.ReadByte(); } }
/** * InputStream <tt>in</tt> is expected to contain: * <ol> * <li>byte is16BitFlag</li> * <li>byte[]/char[] characterData</li> * </ol> * For this encoding, the is16BitFlag is always present even if nChars==0. * <br/> * This method should be used when the nChars field is <em>not</em> stored * as a ushort immediately before the is16BitFlag. Otherwise, {@link * #readUnicodeString(LittleEndianInput)} can be used. */ public static String ReadUnicodeString(LittleEndianInput in1, int nChars) { byte is16Bit = (byte)in1.ReadByte(); if ((is16Bit & 0x01) == 0) { return(ReadCompressedUnicode(in1, nChars)); } return(ReadUnicodeLE(in1, nChars)); }
public LbsDropData(LittleEndianInput in1) { _wStyle = in1.ReadUShort(); _cLine = in1.ReadUShort(); _dxMin = in1.ReadUShort(); _str = StringUtil.ReadUnicodeString(in1); if (StringUtil.GetEncodedSize(_str) % 2 != 0) { _unused = (byte)in1.ReadByte(); } }
/** * InputStream <tt>in</tt> is expected to contain: * <ol> * <li>ushort nChars</li> * <li>byte is16BitFlag</li> * <li>byte[]/char[] characterData</li> * </ol> * For this encoding, the is16BitFlag is always present even if nChars==0. */ public static String ReadUnicodeString(LittleEndianInput in1) { int nChars = in1.ReadUShort(); byte flag = (byte)in1.ReadByte(); if ((flag & 0x01) == 0) { return(ReadCompressedUnicode(in1, nChars)); } return(ReadUnicodeLE(in1, nChars)); }
/** Create a StringPtg from a stream */ public StringPtg(LittleEndianInput in1) { int field_1_length = in1.ReadUByte(); field_2_options = (byte)in1.ReadByte(); _is16bitUnicode = (field_2_options & 0x01) != 0; if (_is16bitUnicode) { field_3_string = StringUtil.ReadUnicodeLE(in1, field_1_length); } else { field_3_string = StringUtil.ReadCompressedUnicode(in1, field_1_length); } }
/**Creates new function pointer from a byte array * usually called while Reading an excel file. */ public FuncVarPtg(LittleEndianInput in1) { field_1_num_args = (byte)in1.ReadByte(); field_2_fnc_index = in1.ReadShort(); FunctionMetadata fm = FunctionMetadataRegistry.GetFunctionByIndex(field_2_fnc_index); if (fm == null) { // Happens only as a result of a call to FormulaParser.Parse(), with a non-built-in function name returnClass = Ptg.CLASS_VALUE; paramClass = new byte[] { Ptg.CLASS_VALUE }; } else { returnClass = fm.ReturnClassCode; paramClass = fm.ParameterClassCodes; } }
public AttrPtg(LittleEndianInput in1) { field_1_options = (byte)in1.ReadByte(); field_2_data = in1.ReadShort(); if (IsOptimizedChoose) { int nCases = field_2_data; int[] jumpTable = new int[nCases]; for (int i = 0; i < jumpTable.Length; i++) { jumpTable[i] = in1.ReadUShort(); } _jumpTable = jumpTable; _chooseFuncOffset = in1.ReadUShort(); } else { _jumpTable = null; _chooseFuncOffset = -1; } }
public AttrPtg(LittleEndianInput in1) { field_1_options =(byte)in1.ReadByte(); field_2_data = in1.ReadShort(); if (IsOptimizedChoose) { int nCases = field_2_data; int[] jumpTable = new int[nCases]; for (int i = 0; i < jumpTable.Length; i++) { jumpTable[i] = in1.ReadUShort(); } _jumpTable = jumpTable; _chooseFuncOffset = in1.ReadUShort(); } else { _jumpTable = null; _chooseFuncOffset = -1; } }
private static object ReadAConstantValue(LittleEndianInput in1) { byte grbit = (byte)in1.ReadByte(); switch (grbit) { case TYPE_EMPTY: in1.ReadLong(); // 8 byte 'not used' field return EMPTY_REPRESENTATION; case TYPE_NUMBER: return in1.ReadDouble(); case TYPE_STRING: return StringUtil.ReadUnicodeString(in1); case TYPE_BOOLEAN: return ReadBoolean(in1); case TYPE_ERROR_CODE: int errCode = in1.ReadUShort(); // next 6 bytes are Unused in1.ReadUShort(); in1.ReadInt(); return ErrorConstant.ValueOf(errCode); } throw new Exception("Unknown grbit value (" + grbit + ")"); }
public BoolPtg(LittleEndianInput in1) { field_1_value = (in1.ReadByte() == 1); }
/** * InputStream <tt>in</tt> is expected to contain: * <ol> * <li>byte is16BitFlag</li> * <li>byte[]/char[] characterData</li> * </ol> * For this encoding, the is16BitFlag is always present even if nChars==0. * <br/> * This method should be used when the nChars field is <em>not</em> stored * as a ushort immediately before the is16BitFlag. Otherwise, {@link * #readUnicodeString(LittleEndianInput)} can be used. */ public static String ReadUnicodeString(LittleEndianInput in1, int nChars) { byte is16Bit = (byte)in1.ReadByte(); if ((is16Bit & 0x01) == 0) { return ReadCompressedUnicode(in1, nChars); } return ReadUnicodeLE(in1, nChars); }
/** * InputStream <tt>in</tt> is expected to contain: * <ol> * <li>ushort nChars</li> * <li>byte is16BitFlag</li> * <li>byte[]/char[] characterData</li> * </ol> * For this encoding, the is16BitFlag is always present even if nChars==0. */ public static String ReadUnicodeString(LittleEndianInput in1) { int nChars = in1.ReadUShort(); byte flag = (byte)in1.ReadByte(); if ((flag & 0x01) == 0) { return ReadCompressedUnicode(in1, nChars); } return ReadUnicodeLE(in1, nChars); }
public ErrPtg(LittleEndianInput in1) : this(in1.ReadByte()) { }
/** * @param in the stream to read data from * @param cbFContinued the seconf short in the record header * @param cmoOt the Containing Obj's {@link CommonObjectDataSubRecord#field_1_objectType} */ public LbsDataSubRecord(LittleEndianInput in1, int cbFContinued, int cmoOt) { _cbFContinued = cbFContinued; int encodedTokenLen = in1.ReadUShort(); if (encodedTokenLen > 0) { int formulaSize = in1.ReadUShort(); _unknownPreFormulaInt = in1.ReadInt(); Ptg[] ptgs = Ptg.ReadTokens(formulaSize, in1); if (ptgs.Length != 1) { throw new RecordFormatException("Read " + ptgs.Length + " tokens but expected exactly 1"); } _linkPtg = ptgs[0]; switch (encodedTokenLen - formulaSize - 6) { case 1: _unknownPostFormulaByte = (byte)in1.ReadByte(); break; case 0: _unknownPostFormulaByte = null; break; default: throw new RecordFormatException("Unexpected leftover bytes"); } } _cLines = in1.ReadUShort(); _iSel = in1.ReadUShort(); _flags = in1.ReadUShort(); _idEdit = in1.ReadUShort(); // From [MS-XLS].pdf 2.5.147 FtLbsData: // This field MUST exist if and only if the Containing Obj?s cmo.ot is equal to 0x14. if (cmoOt == 0x14) { _dropData = new LbsDropData(in1); } // From [MS-XLS].pdf 2.5.147 FtLbsData: // This array MUST exist if and only if the fValidPlex flag (0x2) is set if ((_flags & 0x2) != 0) { _rgLines = new String[_cLines]; for (int i = 0; i < _cLines; i++) { _rgLines[i] = StringUtil.ReadUnicodeString(in1); } } // bits 5-6 in the _flags specify the type // of selection behavior this list control is expected to support // From [MS-XLS].pdf 2.5.147 FtLbsData: // This array MUST exist if and only if the wListType field is not equal to 0. if (((_flags >> 4) & 0x2) != 0) { _bsels = new bool[_cLines]; for (int i = 0; i < _cLines; i++) { _bsels[i] = in1.ReadByte() == 1; } } }
/** * Constructs an EmbeddedObjectRef record and Sets its fields appropriately. * * @param in the record input stream. */ public EmbeddedObjectRefSubRecord(LittleEndianInput in1, int size) { // Much guess-work going on here due to lack of any documentation. // See similar source code in OOO: // http://lxr.go-oo.org/source/sc/sc/source/filter/excel/xiescher.cxx // 1223 void XclImpOleObj::ReadPictFmla( XclImpStream& rStrm, sal_uInt16 nRecSize ) int streamIdOffset = in1.ReadShort(); // OOO calls this 'nFmlaLen' int remaining = size - LittleEndianConstants.SHORT_SIZE; int dataLenAfterFormula = remaining - streamIdOffset; int formulaSize = in1.ReadUShort(); remaining -= LittleEndianConstants.SHORT_SIZE; field_1_unknown_int = in1.ReadInt(); remaining -= LittleEndianConstants.INT_SIZE; byte[] formulaRawBytes = ReadRawData(in1, formulaSize); remaining -= formulaSize; field_2_refPtg = ReadRefPtg(formulaRawBytes); if (field_2_refPtg == null) { // common case // field_2_n16 seems to be 5 here // The formula almost looks like tTbl but the row/column values seem like garbage. field_2_unknownFormulaData = formulaRawBytes; } else { field_2_unknownFormulaData = null; } int stringByteCount; if (remaining >= dataLenAfterFormula + 3) { int tag = in1.ReadByte(); stringByteCount = LittleEndianConstants.BYTE_SIZE; if (tag != 0x03) { throw new RecordFormatException("Expected byte 0x03 here"); } int nChars = in1.ReadUShort(); stringByteCount += LittleEndianConstants.SHORT_SIZE; if (nChars > 0) { // OOO: the 4th way Xcl stores a unicode string: not even a Grbit byte present if Length 0 field_3_unicode_flag = (in1.ReadByte() & 0x01) != 0; stringByteCount += LittleEndianConstants.BYTE_SIZE; if (field_3_unicode_flag) { field_4_ole_classname = StringUtil.ReadUnicodeLE(in1,nChars); stringByteCount += nChars * 2; } else { field_4_ole_classname = StringUtil.ReadCompressedUnicode(in1,nChars); stringByteCount += nChars; } } else { field_4_ole_classname = ""; } } else { field_4_ole_classname = null; stringByteCount = 0; } remaining -= stringByteCount; // Pad to next 2-byte boundary if (((stringByteCount + formulaSize) % 2) != 0) { int b = in1.ReadByte(); remaining -= LittleEndianConstants.BYTE_SIZE; if (field_2_refPtg != null && field_4_ole_classname == null) { field_4_unknownByte = (byte)b; } } int nUnexpectedPadding = remaining - dataLenAfterFormula; if (nUnexpectedPadding > 0) { Console.WriteLine("Discarding " + nUnexpectedPadding + " unexpected padding bytes "); ReadRawData(in1, nUnexpectedPadding); remaining -= nUnexpectedPadding; } // Fetch the stream ID if (dataLenAfterFormula >= 4) { field_5_stream_id = in1.ReadInt(); remaining -= LittleEndianConstants.INT_SIZE; } else { field_5_stream_id = null; } field_6_unknown = ReadRawData(in1, remaining); }
public int ReadByte() { _currentDataOffset += LittleEndianConstants.BYTE_SIZE; return(_le.ReadByte()); }
public static Ptg CreatePtg(LittleEndianInput in1) { byte id = (byte)in1.ReadByte(); if (id < 0x20) { return CreateBasePtg(id, in1); } Ptg retval = CreateClassifiedPtg(id, in1); if (id > 0x60) { retval.PtgClass = CLASS_ARRAY; } else if (id > 0x40) { retval.PtgClass = CLASS_VALUE; } else { retval.PtgClass = CLASS_REF; } return retval; }
/** * Constructs an EmbeddedObjectRef record and Sets its fields appropriately. * * @param in the record input stream. */ public EmbeddedObjectRefSubRecord(LittleEndianInput in1, int size) { // Much guess-work going on here due to lack of any documentation. // See similar source code in OOO: // http://lxr.go-oo.org/source/sc/sc/source/filter/excel/xiescher.cxx // 1223 void XclImpOleObj::ReadPictFmla( XclImpStream& rStrm, sal_uInt16 nRecSize ) int streamIdOffset = in1.ReadShort(); // OOO calls this 'nFmlaLen' int remaining = size - LittleEndianConstants.SHORT_SIZE; int dataLenAfterFormula = remaining - streamIdOffset; int formulaSize = in1.ReadUShort(); remaining -= LittleEndianConstants.SHORT_SIZE; field_1_unknown_int = in1.ReadInt(); remaining -= LittleEndianConstants.INT_SIZE; byte[] formulaRawBytes = ReadRawData(in1, formulaSize); remaining -= formulaSize; field_2_refPtg = ReadRefPtg(formulaRawBytes); if (field_2_refPtg == null) { // common case // field_2_n16 seems to be 5 here // The formula almost looks like tTbl but the row/column values seem like garbage. field_2_unknownFormulaData = formulaRawBytes; } else { field_2_unknownFormulaData = null; } int stringByteCount; if (remaining >= dataLenAfterFormula + 3) { int tag = in1.ReadByte(); stringByteCount = LittleEndianConstants.BYTE_SIZE; if (tag != 0x03) { throw new RecordFormatException("Expected byte 0x03 here"); } int nChars = in1.ReadUShort(); stringByteCount += LittleEndianConstants.SHORT_SIZE; if (nChars > 0) { // OOO: the 4th way Xcl stores a unicode string: not even a Grbit byte present if Length 0 field_3_unicode_flag = (in1.ReadByte() & 0x01) != 0; stringByteCount += LittleEndianConstants.BYTE_SIZE; if (field_3_unicode_flag) { field_4_ole_classname = StringUtil.ReadUnicodeLE(in1, nChars); stringByteCount += nChars * 2; } else { field_4_ole_classname = StringUtil.ReadCompressedUnicode(in1, nChars); stringByteCount += nChars; } } else { field_4_ole_classname = ""; } } else { field_4_ole_classname = null; stringByteCount = 0; } remaining -= stringByteCount; // Pad to next 2-byte boundary if (((stringByteCount + formulaSize) % 2) != 0) { int b = in1.ReadByte(); remaining -= LittleEndianConstants.BYTE_SIZE; if (field_2_refPtg != null && field_4_ole_classname == null) { field_4_unknownByte = (byte)b; } } int nUnexpectedPadding = remaining - dataLenAfterFormula; if (nUnexpectedPadding > 0) { Console.WriteLine("Discarding " + nUnexpectedPadding + " unexpected padding bytes "); ReadRawData(in1, nUnexpectedPadding); remaining -= nUnexpectedPadding; } // Fetch the stream ID if (dataLenAfterFormula >= 4) { field_5_stream_id = in1.ReadInt(); remaining -= LittleEndianConstants.INT_SIZE; } else { field_5_stream_id = null; } field_6_unknown = ReadRawData(in1, remaining); }
public LbsDropData(LittleEndianInput in1) { _wStyle = in1.ReadUShort(); _cLine = in1.ReadUShort(); _dxMin = in1.ReadUShort(); _str = StringUtil.ReadUnicodeString(in1); if(StringUtil.GetEncodedSize(_str) % 2 != 0){ _unused = (byte)in1.ReadByte(); } }