/// <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); }
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; } }
//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); }