예제 #1
0
            public int Compare(object o1, object o2)
            {
                EscherProperty p1 = (EscherProperty)o1;
                EscherProperty p2 = (EscherProperty)o2;

                return(p1.PropertyNumber.CompareTo(p2.PropertyNumber));
            }
        public void RemoveEscherProperty(int num)
        {
            List <EscherProperty> toRemove = new List <EscherProperty>();

            for (IEnumerator <EscherProperty> iterator = EscherProperties.GetEnumerator(); iterator.MoveNext();)
            {
                EscherProperty prop = iterator.Current;
                if (prop.PropertyNumber == num)
                {
                    //iterator.Remove();
                    toRemove.Add(prop);
                }
            }
            foreach (EscherProperty e in toRemove)
            {
                EscherProperties.Remove(e);
            }
        }
        /**
         * Set an escher property. If a property with given propId already
         * exists it is replaced.
         *
         * @param value the property to set.
         */
        public void SetEscherProperty(EscherProperty value)
        {
            List <EscherProperty> toRemove = new List <EscherProperty>();

            for (IEnumerator <EscherProperty> iterator =
                     properties.GetEnumerator(); iterator.MoveNext();)
            {
                EscherProperty prop = iterator.Current;
                if (prop.Id == value.Id)
                {
                    //iterator.Remove();
                    toRemove.Add(prop);
                }
            }
            foreach (EscherProperty e in toRemove)
            {
                EscherProperties.Remove(e);
            }
            properties.Add(value);
            SortProperties();
        }
예제 #4
0
        /// <summary>
        /// This method Serializes this escher record into a byte array
        /// </summary>
        /// <param name="offset">The offset into data
        ///  to start writing the record data to.</param>
        /// <param name="data">The byte array to Serialize to.</param>
        /// <returns>The number of bytes written.</returns>
        public override int Serialize(int offset, byte[] data, EscherSerializationListener listener)
        {
            listener.BeforeRecordSerialize(offset, RecordId, this);

            LittleEndian.PutShort(data, offset, Options);
            LittleEndian.PutShort(data, offset + 2, RecordId);
            LittleEndian.PutInt(data, offset + 4, PropertiesSize);
            int pos = offset + 8;

            for (IEnumerator iterator = properties.GetEnumerator(); iterator.MoveNext();)
            {
                EscherProperty escherProperty = (EscherProperty)iterator.Current;
                pos += escherProperty.SerializeSimplePart(data, pos);
            }
            for (IEnumerator iterator = properties.GetEnumerator(); iterator.MoveNext();)
            {
                EscherProperty escherProperty = (EscherProperty)iterator.Current;
                pos += escherProperty.SerializeComplexPart(data, pos);
            }
            listener.AfterRecordSerialize(pos, RecordId, pos - offset, this);
            return(pos - offset);
        }
예제 #5
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);
        }
예제 #6
0
 public EscherPropertyTreeNode(EscherProperty ep)
 {
     this.Record = ep;
     this.Text = ep.Name;
      this.ImageKey = "Binary";
 }
예제 #7
0
 /**
  * Add a property to this record.
  */
 public void AddEscherProperty(EscherProperty prop)
 {
     properties.Add(prop);
 }
예제 #8
0
 protected void SetPropertyValue(EscherProperty property)
 {
     _optRecord.SetEscherProperty(property);
 }
예제 #9
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 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);
        }
예제 #10
0
 /// <summary>
 /// Add a property to this record.
 /// </summary>
 /// <param name="prop">The prop.</param>
 public void AddEscherProperty(EscherProperty prop)
 {
     properties.Add(prop);
 }