public OLEProperty NewProperty(VTPropertyType vtPropertyType, uint propertyIdentifier, string propertyName = null)
        {
            //throw new NotImplementedException("API Unstable - Work in progress - Milestone 2.3.0.0");
            var op = new OLEProperty(this)
            {
                VTType             = vtPropertyType,
                PropertyIdentifier = propertyIdentifier
            };

            return(op);
        }
 public void AddProperty(OLEProperty property)
 {
     //throw new NotImplementedException("API Unstable - Work in progress - Milestone 2.3.0.0");
     properties.Add(property);
 }
        internal OLEPropertiesContainer(CFStream cfStream)
        {
            PropertySetStream pStream = new PropertySetStream();

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

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

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

            default:
                this.ContainerType = ContainerType.AppSpecific;
                break;
            }


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

            this.Context = new PropertyContext()
            {
                CodePage = pStream.PropertySet0.PropertyContext.CodePage
            };

            for (int 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)
                {
                    VTType             = p.VTType,
                    PropertyIdentifier = (uint)pStream.PropertySet0.PropertyIdentifierAndOffsets[i].PropertyIdentifier,
                    Value = p.Value
                };


                properties.Add(op);
            }

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

                UserDefinedProperties.ContainerType = ContainerType.UserDefinedProperties;

                for (int 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 = (uint)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;
            }
        }