Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }
Example #4
0
        /**
         * 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" );
            }
        }
Example #6
0
        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);
        }
Example #7
0
        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");
            }
        }
Example #8
0
        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" );
            }
        }
Example #9
0
        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);
        }
Example #10
0
 public Date(byte[] data, int offset)
 {
     _value = LittleEndian.GetByteArray(data, offset, SIZE);
 }
Example #11
0
        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);
            }
        }