コード例 #1
0
        /// <summary>
        /// Create new properties from a byte array.
        /// </summary>
        /// <param name="data">The byte array containing the property</param>
        /// <param name="offset">The starting offset into the byte array</param>
        /// <param name="numProperties">The new properties</param>
        /// <returns></returns>
        public IList CreateProperties(byte[] data, int offset, short numProperties)
        {
            IList results = new ArrayList();

            int pos = offset;

            //        while ( bytesRemaining >= 6 )
            for (int i = 0; i < numProperties; i++)
            {
                short propId;
                int   propData;
                propId   = LittleEndian.GetShort(data, pos);
                propData = LittleEndian.GetInt(data, pos + 2);
                short propNumber = (short)(propId & (short)0x3FFF);
                bool  isComplex  = (propId & unchecked ((short)0x8000)) != 0;
                bool  isBlipId   = (propId & (short)0x4000) != 0;

                byte propertyType = EscherProperties.GetPropertyType((short)propNumber);
                if (propertyType == EscherPropertyMetaData.TYPE_bool)
                {
                    results.Add(new EscherBoolProperty(propId, propData));
                }
                else if (propertyType == EscherPropertyMetaData.TYPE_RGB)
                {
                    results.Add(new EscherRGBProperty(propId, propData));
                }
                else if (propertyType == EscherPropertyMetaData.TYPE_SHAPEPATH)
                {
                    results.Add(new EscherShapePathProperty(propId, propData));
                }
                else
                {
                    if (!isComplex)
                    {
                        results.Add(new EscherSimpleProperty(propId, propData));
                    }
                    else
                    {
                        if (propertyType == EscherPropertyMetaData.TYPE_ARRAY)
                        {
                            results.Add(new EscherArrayProperty(propId, new byte[propData]));
                        }
                        else
                        {
                            results.Add(new EscherComplexProperty(propId, new byte[propData]));
                        }
                    }
                }
                pos += 6;
                //            bytesRemaining -= 6 + complexBytes;
            }

            // Get complex data
            for (IEnumerator iterator = results.GetEnumerator(); iterator.MoveNext();)
            {
                EscherProperty p = (EscherProperty)iterator.Current;
                if (p is EscherComplexProperty)
                {
                    if (p is EscherArrayProperty)
                    {
                        pos += ((EscherArrayProperty)p).SetArrayData(data, pos);
                    }
                    else
                    {
                        byte[] complexData = ((EscherComplexProperty)p).ComplexData;
                        Array.Copy(data, pos, complexData, 0, complexData.Length);
                        pos += complexData.Length;
                    }
                }
            }

            return(results);
        }
コード例 #2
0
ファイル: EscherPropertyFactory.cs プロジェクト: zzy092/npoi
        /// <summary>
        /// Create new properties from a byte array.
        /// </summary>
        /// <param name="data">The byte array containing the property</param>
        /// <param name="offset">The starting offset into the byte array</param>
        /// <param name="numProperties">The new properties</param>
        /// <returns></returns>
        public List <EscherProperty> CreateProperties(byte[] data, int offset, short numProperties)
        {
            List <EscherProperty> results = new List <EscherProperty>();

            int pos = offset;

            for (int i = 0; i < numProperties; i++)
            {
                short propId;
                int   propData;
                propId   = LittleEndian.GetShort(data, pos);
                propData = LittleEndian.GetInt(data, pos + 2);
                short propNumber = (short)(propId & (short)0x3FFF);
                bool  isComplex  = (propId & unchecked ((short)0x8000)) != 0;

                byte propertyType = EscherProperties.GetPropertyType((short)propNumber);
                if (propertyType == EscherPropertyMetaData.TYPE_BOOL)
                {
                    results.Add(new EscherBoolProperty(propId, propData));
                }
                else if (propertyType == EscherPropertyMetaData.TYPE_RGB)
                {
                    results.Add(new EscherRGBProperty(propId, propData));
                }
                else if (propertyType == EscherPropertyMetaData.TYPE_SHAPEPATH)
                {
                    results.Add(new EscherShapePathProperty(propId, propData));
                }
                else
                {
                    if (!isComplex)
                    {
                        results.Add(new EscherSimpleProperty(propId, propData));
                    }
                    else
                    {
                        if (propertyType == EscherPropertyMetaData.TYPE_ARRAY)
                        {
                            results.Add(new EscherArrayProperty(propId, new byte[propData]));
                        }
                        else
                        {
                            results.Add(new EscherComplexProperty(propId, new byte[propData]));
                        }
                    }
                }
                pos += 6;
            }

            // Get complex data
            for (IEnumerator iterator = results.GetEnumerator(); iterator.MoveNext();)
            {
                EscherProperty p = (EscherProperty)iterator.Current;
                if (p is EscherComplexProperty)
                {
                    if (p is EscherArrayProperty)
                    {
                        pos += ((EscherArrayProperty)p).SetArrayData(data, pos);
                    }
                    else
                    {
                        byte[] complexData = ((EscherComplexProperty)p).ComplexData;
                        int    leftover    = data.Length - pos;
                        if (leftover < complexData.Length)
                        {
                            throw new InvalidOperationException("Could not read complex escher property, lenght was " + complexData.Length + ", but had only " +
                                                                leftover + " bytes left");
                        }
                        Array.Copy(data, pos, complexData, 0, complexData.Length);
                        pos += complexData.Length;
                    }
                }
            }

            return(results);
        }