public PictureDescriptor(byte[] _dataStream, int startOffset) { this.lcb = LittleEndian.GetInt(_dataStream, startOffset + LCB_OFFSET); this.cbHeader = LittleEndian.GetUShort(_dataStream, startOffset + CBHEADER_OFFSET); this.mfp_mm = LittleEndian.GetUShort(_dataStream, startOffset + MFP_MM_OFFSET); this.mfp_xExt = LittleEndian.GetUShort(_dataStream, startOffset + MFP_XEXT_OFFSET); this.mfp_yExt = LittleEndian.GetUShort(_dataStream, startOffset + MFP_YEXT_OFFSET); this.mfp_hMF = LittleEndian.GetUShort(_dataStream, startOffset + MFP_HMF_OFFSET); this.offset14 = LittleEndian.GetByteArray(_dataStream, startOffset + 0x0E, 14); this.dxaGoal = LittleEndian.GetShort(_dataStream, startOffset + DXAGOAL_OFFSET); this.dyaGoal = LittleEndian.GetShort(_dataStream, startOffset + DYAGOAL_OFFSET); this.mx = LittleEndian.GetShort(_dataStream, startOffset + MX_OFFSET); this.my = LittleEndian.GetShort(_dataStream, startOffset + MY_OFFSET); this.dxaCropLeft = LittleEndian.GetShort(_dataStream, startOffset + DXACROPLEFT_OFFSET); this.dyaCropTop = LittleEndian.GetShort(_dataStream, startOffset + DYACROPTOP_OFFSET); this.dxaCropRight = LittleEndian.GetShort(_dataStream, startOffset + DXACROPRIGHT_OFFSET); this.dyaCropBottom = LittleEndian.GetShort(_dataStream, startOffset + DYACROPBOTTOM_OFFSET); }
public ComplexFileTable(byte[] documentStream, byte[] tableStream, int offset, int fcMin) { //skips through the prms before we reach the piece table. These contain data //for actual fast saved files List <SprmBuffer> sprmBuffers = new List <SprmBuffer>(); //skips through the prms before we reach the piece table. These contain data //for actual fast saved files while (tableStream[offset] == GRPPRL_TYPE) { offset++; int size = LittleEndian.GetShort(tableStream, offset); offset += LittleEndianConsts.SHORT_SIZE; byte[] bs = LittleEndian.GetByteArray(tableStream, offset, size); offset += size; SprmBuffer sprmBuffer = new SprmBuffer(bs, false, 0); sprmBuffers.Add(sprmBuffer); } this._grpprls = sprmBuffers.ToArray(); if (tableStream[offset] != TEXT_PIECE_TABLE_TYPE) { throw new IOException("The text piece table is corrupted"); } int pieceTableSize = LittleEndian.GetInt(tableStream, ++offset); offset += LittleEndianConsts.INT_SIZE; _tpt = new TextPieceTable(documentStream, tableStream, offset, pieceTableSize, fcMin); }
public Blob(byte[] data, int offset) { int size = LittleEndian.GetInt(data, offset); if (size == 0) { _value = new byte[0]; return; } _value = LittleEndian.GetByteArray(data, offset + LittleEndian.INT_SIZE, size); }
/** * Read constructor. * * @param data byte array containing a DConRef Record, including the header. */ public DConRefRecord(byte[] data) { int offset = 0; if (!(LittleEndian.GetShort(data, offset) == DConRefRecord.sid)) { throw new RecordFormatException("incompatible sid."); } offset += LittleEndian.SHORT_SIZE; //length = LittleEndian.GetShort(data, offset); offset += LittleEndian.SHORT_SIZE; firstRow = LittleEndian.GetUShort(data, offset); offset += LittleEndian.SHORT_SIZE; lastRow = LittleEndian.GetUShort(data, offset); offset += LittleEndian.SHORT_SIZE; firstCol = LittleEndian.GetUByte(data, offset); offset += LittleEndian.BYTE_SIZE; lastCol = LittleEndian.GetUByte(data, offset); offset += LittleEndian.BYTE_SIZE; charCount = LittleEndian.GetUShort(data, offset); offset += LittleEndian.SHORT_SIZE; if (charCount < 2) { throw new RecordFormatException("Character count must be >= 2"); } charType = LittleEndian.GetUByte(data, offset); offset += LittleEndian.BYTE_SIZE; //7 bits reserved + 1 bit type /* * bytelength is the length of the string in bytes, which depends on whether the string is * made of single- or double-byte chars. This is given by charType, which equals 0 if * single-byte, 1 if double-byte. */ int byteLength = charCount * ((charType & 1) + 1); path = LittleEndian.GetByteArray(data, offset, byteLength); offset += byteLength; /* * If it's a self reference, the last one or two bytes (depending on char type) are the * unused field. Not sure If i need to bother with this... */ if (path[0] == 0x02) { _unused = LittleEndian.GetByteArray(data, offset, (charType + 1)); } }
public CodePageString(byte[] data, int startOffset) { int offset = startOffset; Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); int size = LittleEndian.GetInt(data, offset); offset += LittleEndianConsts.INT_SIZE; _value = LittleEndian.GetByteArray(data, offset, size); if (size != 0 && _value[size - 1] != 0) { // TODO Some files, such as TestVisioWithCodepage.vsd, are currently // triggering this for values that don't look like codepages // See Bug #52258 for details Console.WriteLine("CodePageString started at offset #" + offset + " is not NULL-terminated"); // throw new IllegalPropertySetDataException( // "CodePageString started at offset #" + offset // + " is not NULL-terminated" ); } }
public ClipboardData(byte[] data, int offset) { int size = LittleEndian.GetInt(data, offset); if (size < 4) { //logger.log( POILogger.WARN, "ClipboardData at offset ", // Integer.valueOf( offset ), " size less than 4 bytes " // + "(doesn't even have format field!). " // + "Setting to format == 0 and hope for the best" ); _format = 0; _value = new byte[0]; return; } _format = LittleEndian.GetInt(data, offset + LittleEndian.INT_SIZE); _value = LittleEndian.GetByteArray(data, offset + LittleEndian.INT_SIZE * 2, size - LittleEndian.INT_SIZE); }
public UnicodeString(byte[] data, int offset) { int length = LittleEndian.GetInt(data, offset); if (length == 0) { _value = new byte[0]; return; } _value = LittleEndian.GetByteArray(data, offset + LittleEndian.INT_SIZE, length * 2); if (_value[length * 2 - 1] != 0 || _value[length * 2 - 2] != 0) { throw new IllegalPropertySetDataException( "UnicodeString started at offset #" + offset + " is not NULL-terminated"); } }
public CodePageString(byte[] data, int startOffset) { int offset = startOffset; int size = LittleEndian.GetInt(data, offset); offset += LittleEndian.INT_SIZE; _value = LittleEndian.GetByteArray(data, offset, size); if (_value[size - 1] != 0) { // TODO Some files, such as TestVisioWithCodepage.vsd, are currently // triggering this for values that don't look like codepages // See Bug #52258 for details //logger.log(POILogger.WARN, "CodePageString started at offset #" + offset // + " is not NULL-terminated" ); // throw new IllegalPropertySetDataException( // "CodePageString started at offset #" + offset // + " is not NULL-terminated" ); } }
public UnicodeString(byte[] data, int offset) { int length = LittleEndian.GetInt(data, offset); int dataOffset = offset + LittleEndian.INT_SIZE; if (!validLength(length, data, dataOffset)) { // If the length looks wrong, this might be because the offset is sometimes expected // to be on a 4 byte boundary. Try checking with that if so, rather than blowing up with // and ArrayIndexOutOfBoundsException below bool valid = false; int past4byte = offset % 4; if (past4byte != 0) { offset = offset + past4byte; length = LittleEndian.GetInt(data, offset); dataOffset = offset + LittleEndian.INT_SIZE; valid = validLength(length, data, dataOffset); } if (!valid) { throw new IllegalPropertySetDataException( "UnicodeString started at offset #" + offset + " is not NULL-terminated"); } } if (length == 0) { _value = new byte[0]; return; } _value = LittleEndian.GetByteArray(data, dataOffset, length * 2); }
public Date(byte[] data, int offset) { _value = LittleEndian.GetByteArray(data, offset, SIZE); }
public int ReadValue(byte[] data, int offset) { switch (_type) { case Variant.VT_EMPTY: case Variant.VT_NULL: _value = null; return(0); case Variant.VT_I2: _value = LittleEndian.GetShort(data, offset); return(4); case Variant.VT_I4: _value = LittleEndian.GetInt(data, offset); return(4); case Variant.VT_R4: _value = LittleEndian.GetShort(data, offset); return(4); case Variant.VT_R8: _value = LittleEndian.GetDouble(data, offset); return(8); case Variant.VT_CY: _value = new Currency(data, offset); return(Currency.SIZE); case Variant.VT_DATE: _value = new Date(data, offset); return(Date.SIZE); case Variant.VT_BSTR: _value = new CodePageString(data, offset); return(((CodePageString)_value).Size); case Variant.VT_ERROR: _value = LittleEndian.GetUInt(data, offset); return(4); case Variant.VT_BOOL: _value = new VariantBool(data, offset); return(VariantBool.SIZE); case Variant.VT_DECIMAL: _value = new Decimal(data, offset); return(Decimal.SIZE); case Variant.VT_I1: _value = data[offset]; return(1); case Variant.VT_UI1: _value = LittleEndian.GetUByte(data, offset); return(2); case Variant.VT_UI2: _value = LittleEndian.GetUShort(data, offset); return(4); case Variant.VT_UI4: _value = LittleEndian.GetUInt(data, offset); return(4); case Variant.VT_I8: _value = LittleEndian.GetLong(data, offset); return(8); case Variant.VT_UI8: _value = LittleEndian.GetByteArray(data, offset, 8); return(8); case Variant.VT_INT: _value = LittleEndian.GetInt(data, offset); return(4); case Variant.VT_UINT: _value = LittleEndian.GetUInt(data, offset); return(4); case Variant.VT_LPSTR: _value = new CodePageString(data, offset); return(((CodePageString)_value).Size); case Variant.VT_LPWSTR: _value = new UnicodeString(data, offset); return(((UnicodeString)_value).Size); case Variant.VT_FILETIME: _value = new Filetime(data, offset); return(Filetime.SIZE); case Variant.VT_BLOB: _value = new Blob(data, offset); return(((Blob)_value).Size); case Variant.VT_STREAM: case Variant.VT_STORAGE: case Variant.VT_STREAMED_OBJECT: case Variant.VT_STORED_OBJECT: _value = new IndirectPropertyName(data, offset); return(((IndirectPropertyName)_value).Size); case Variant.VT_BLOB_OBJECT: _value = new Blob(data, offset); return(((Blob)_value).Size); case Variant.VT_CF: _value = new ClipboardData(data, offset); return(((ClipboardData)_value).Size); case Variant.VT_CLSID: _value = new GUID(data, offset); return(GUID.SIZE); case Variant.VT_VERSIONED_STREAM: _value = new VersionedStream(data, offset); return(((VersionedStream)_value).Size); case Variant.VT_VECTOR | Variant.VT_I2: case Variant.VT_VECTOR | Variant.VT_I4: case Variant.VT_VECTOR | Variant.VT_R4: case Variant.VT_VECTOR | Variant.VT_R8: case Variant.VT_VECTOR | Variant.VT_CY: case Variant.VT_VECTOR | Variant.VT_DATE: case Variant.VT_VECTOR | Variant.VT_BSTR: case Variant.VT_VECTOR | Variant.VT_ERROR: case Variant.VT_VECTOR | Variant.VT_BOOL: case Variant.VT_VECTOR | Variant.VT_VARIANT: case Variant.VT_VECTOR | Variant.VT_I1: case Variant.VT_VECTOR | Variant.VT_UI1: case Variant.VT_VECTOR | Variant.VT_UI2: case Variant.VT_VECTOR | Variant.VT_UI4: case Variant.VT_VECTOR | Variant.VT_I8: case Variant.VT_VECTOR | Variant.VT_UI8: case Variant.VT_VECTOR | Variant.VT_LPSTR: case Variant.VT_VECTOR | Variant.VT_LPWSTR: case Variant.VT_VECTOR | Variant.VT_FILETIME: case Variant.VT_VECTOR | Variant.VT_CF: case Variant.VT_VECTOR | Variant.VT_CLSID: _value = new Vector((short)(_type & 0x0FFF)); return(((Vector)_value).Read(data, offset)); case Variant.VT_ARRAY | Variant.VT_I2: case Variant.VT_ARRAY | Variant.VT_I4: case Variant.VT_ARRAY | Variant.VT_R4: case Variant.VT_ARRAY | Variant.VT_R8: case Variant.VT_ARRAY | Variant.VT_CY: case Variant.VT_ARRAY | Variant.VT_DATE: case Variant.VT_ARRAY | Variant.VT_BSTR: case Variant.VT_ARRAY | Variant.VT_ERROR: case Variant.VT_ARRAY | Variant.VT_BOOL: case Variant.VT_ARRAY | Variant.VT_VARIANT: case Variant.VT_ARRAY | Variant.VT_DECIMAL: case Variant.VT_ARRAY | Variant.VT_I1: case Variant.VT_ARRAY | Variant.VT_UI1: case Variant.VT_ARRAY | Variant.VT_UI2: case Variant.VT_ARRAY | Variant.VT_UI4: case Variant.VT_ARRAY | Variant.VT_INT: case Variant.VT_ARRAY | Variant.VT_UINT: _value = new Array(); return(((Array)_value).Read(data, offset)); default: throw new InvalidOperationException( "Unknown (possibly, incorrect) TypedPropertyValue type: " + _type); } }