/// <summary>
        /// Return the current <see cref="T:OpenMcdf.CFStream">CFStream</see> object
        /// as a OLE properties Stream.
        /// </summary>
        /// <param name="cfStream"></param>
        /// <returns>A <see cref="T:OpenMcdf.OLEProperties.PropertySetStream">OLE Propertie stream</see></returns>
        public static OLEProperties.PropertySetStream AsOLEProperties(this CFStream cfStream)
        {
            var result = new OLEProperties.PropertySetStream();

            result.Read(new BinaryReader(new StreamDecorator(cfStream)));
            return(result);
        }
Esempio n. 2
0
        internal OLEPropertiesContainer(CFStream cfStream)
        {
            var pStream = new PropertySetStream();

            this.cfStream = cfStream;
            pStream       = new PropertySetStream();
            pStream.Read(new BinaryReader(new StreamDecorator(cfStream)));

            switch (pStream.FMTID0.ToString("B").ToUpperInvariant())
            {
            case "{F29F85E0-4FF9-1068-AB91-08002B27B3D9}":
                ContainerType = ContainerType.SummaryInfo;
                break;

            case "{D5CDD502-2E9C-101B-9397-08002B2CF9AE}":
                ContainerType = ContainerType.DocumentSummaryInfo;
                break;

            default:
                ContainerType = ContainerType.AppSpecific;
                break;
            }


            PropertyNames = (Dictionary <uint, string>)pStream.PropertySet0.Properties
                            .FirstOrDefault(p => p.PropertyType == PropertyType.DictionaryProperty);

            Context = new PropertyContext
            {
                CodePage = pStream.PropertySet0.PropertyContext.CodePage
            };

            for (var i = 0; i < pStream.PropertySet0.Properties.Count; i++)
            {
                if (pStream.PropertySet0.PropertyIdentifierAndOffsets[i].PropertyIdentifier == 0)
                {
                    continue;
                }
                //if (pStream.PropertySet0.PropertyIdentifierAndOffsets[i].PropertyIdentifier == 1) continue;
                //if (pStream.PropertySet0.PropertyIdentifierAndOffsets[i].PropertyIdentifier == 0x80000000) continue;

                var p   = (ITypedPropertyValue)pStream.PropertySet0.Properties[i];
                var poi = pStream.PropertySet0.PropertyIdentifierAndOffsets[i];

                var op = new OLEProperty(this);

                op.VTType             = p.VTType;
                op.PropertyIdentifier = pStream.PropertySet0.PropertyIdentifierAndOffsets[i].PropertyIdentifier;
                op.Value = p.Value;


                properties.Add(op);
            }

            if (pStream.NumPropertySets == 2)
            {
                UserDefinedProperties =
                    new OLEPropertiesContainer(Context.CodePage, ContainerType.UserDefinedProperties);
                HasUserDefinedProperties = true;

                UserDefinedProperties.ContainerType = ContainerType.UserDefinedProperties;

                for (var i = 0; i < pStream.PropertySet1.Properties.Count; i++)
                {
                    if (pStream.PropertySet1.PropertyIdentifierAndOffsets[i].PropertyIdentifier == 0)
                    {
                        continue;
                    }
                    //if (pStream.PropertySet1.PropertyIdentifierAndOffsets[i].PropertyIdentifier == 1) continue;
                    if (pStream.PropertySet1.PropertyIdentifierAndOffsets[i].PropertyIdentifier == 0x80000000)
                    {
                        continue;
                    }

                    var p   = (ITypedPropertyValue)pStream.PropertySet1.Properties[i];
                    var poi = pStream.PropertySet1.PropertyIdentifierAndOffsets[i];

                    var op = new OLEProperty(UserDefinedProperties);

                    op.VTType             = p.VTType;
                    op.PropertyIdentifier = pStream.PropertySet1.PropertyIdentifierAndOffsets[i].PropertyIdentifier;
                    op.Value = p.Value;

                    UserDefinedProperties.properties.Add(op);
                }

                UserDefinedProperties.PropertyNames = (Dictionary <uint, string>)pStream.PropertySet1.Properties
                                                      .Where(p => p.PropertyType == PropertyType.DictionaryProperty).FirstOrDefault()?.Value;
            }
        }
Esempio n. 3
0
        //public void AddProperty(OLEProperty property)
        //{
        //    throw new NotImplementedException("API Unstable - Work in progress - Milestone 2.3.0.0");
        //    properties.Add(property);
        //}

        //public void RemoveProperty(uint propertyIdentifier)
        //{
        //    throw new NotImplementedException("API Unstable - Work in progress - Milestone 2.3.0.0");
        //    var toRemove = properties.Where(o => o.PropertyIdentifier == propertyIdentifier).FirstOrDefault();

        //    if (toRemove != null)
        //        properties.Remove(toRemove);
        //}


        public void Save(CFStream cfStream)
        {
            //throw new NotImplementedException("API Unstable - Work in progress - Milestone 2.3.0.0");
            //properties.Sort((a, b) => a.PropertyIdentifier.CompareTo(b.PropertyIdentifier));

            Stream s  = new StreamDecorator(cfStream);
            var    bw = new BinaryWriter(s);

            var ps = new PropertySetStream
            {
                ByteOrder        = 0xFFFE,
                Version          = 0,
                SystemIdentifier = 0x00020006,
                CLSID            = Guid.Empty,

                NumPropertySets = 1,

                FMTID0 = ContainerType == ContainerType.SummaryInfo
                    ? new Guid("{F29F85E0-4FF9-1068-AB91-08002B27B3D9}")
                    : new Guid("{D5CDD502-2E9C-101B-9397-08002B2CF9AE}"),
                Offset0 = 0,

                FMTID1  = Guid.Empty,
                Offset1 = 0,

                PropertySet0 = new PropertySet
                {
                    NumProperties = (uint)Properties.Count(),
                    PropertyIdentifierAndOffsets = new List <PropertyIdentifierAndOffset>(),
                    Properties      = new List <IProperty>(),
                    PropertyContext = Context
                }
            };

            foreach (var op in Properties)
            {
                var p = PropertyFactory.Instance.NewProperty(op.VTType, Context.CodePage);
                p.Value = op.Value;
                ps.PropertySet0.Properties.Add(p);
                ps.PropertySet0.PropertyIdentifierAndOffsets.Add(new PropertyIdentifierAndOffset
                {
                    PropertyIdentifier = op.PropertyIdentifier, Offset = 0
                });
            }

            ps.PropertySet0.NumProperties = (uint)Properties.Count();

            if (HasUserDefinedProperties)
            {
                ps.NumPropertySets = 2;

                ps.PropertySet1 = new PropertySet
                {
                    NumProperties = (uint)UserDefinedProperties.Properties.Count(),
                    PropertyIdentifierAndOffsets = new List <PropertyIdentifierAndOffset>(),
                    Properties      = new List <IProperty>(),
                    PropertyContext = UserDefinedProperties.Context
                };

                ps.FMTID1  = new Guid("{D5CDD502-2E9C-101B-9397-08002B2CF9AE}");
                ps.Offset1 = 0;

                foreach (var op in Properties)
                {
                    var p = PropertyFactory.Instance.NewProperty(op.VTType, ps.PropertySet1.PropertyContext.CodePage);
                    p.Value = op.Value;
                    ps.PropertySet1.Properties.Add(p);
                    ps.PropertySet1.PropertyIdentifierAndOffsets.Add(new PropertyIdentifierAndOffset
                    {
                        PropertyIdentifier = op.PropertyIdentifier, Offset = 0
                    });
                }
            }


            ps.Write(bw);
        }