Пример #1
0
        private bool WriteModifiedProperty(TnefWriter writer, TnefReader reader, TnefPropertyTag propertyTag, object value, bool forceUnicode, ref bool startAttribute, byte[] scratchBuffer)
        {
            TnefPropertyReader   propertyReader       = reader.PropertyReader;
            TnefAttributeTag     attributeTag         = reader.AttributeTag;
            TnefAttributeLevel   attributeLevel       = reader.AttributeLevel;
            StoragePropertyValue storagePropertyValue = value as StoragePropertyValue;

            if (storagePropertyValue != null)
            {
                if (this.attachmentData != null && this.attachmentData.EmbeddedMessage != null && propertyReader.IsEmbeddedMessage)
                {
                    using (TnefReader embeddedMessageReader = propertyReader.GetEmbeddedMessageReader())
                    {
                        TnefPropertyBag.StartAttributeIfNecessary(writer, attributeTag, attributeLevel, ref startAttribute);
                        writer.StartProperty(propertyTag);
                        EmailMessage    embeddedMessage = this.attachmentData.EmbeddedMessage;
                        PureTnefMessage pureTnefMessage = embeddedMessage.PureTnefMessage;
                        Charset         textCharset     = pureTnefMessage.TextCharset;
                        using (TnefWriter embeddedMessageWriter = writer.GetEmbeddedMessageWriter(textCharset.CodePage))
                        {
                            pureTnefMessage.WriteMessage(embeddedMessageReader, embeddedMessageWriter, scratchBuffer);
                        }
                        return(true);
                    }
                }
                using (Stream readStream = storagePropertyValue.GetReadStream())
                {
                    int num = readStream.Read(scratchBuffer, 0, scratchBuffer.Length);
                    if (num > 0)
                    {
                        propertyTag = storagePropertyValue.PropertyTag;
                        if (propertyTag.ValueTnefType == TnefPropertyType.Unicode && TnefPropertyBag.IsLegacyAttribute(attributeTag))
                        {
                            return(false);
                        }
                        TnefPropertyBag.StartAttributeIfNecessary(writer, attributeTag, attributeLevel, ref startAttribute);
                        writer.StartProperty(propertyTag);
                        do
                        {
                            writer.WritePropertyRawValue(scratchBuffer, 0, num);
                            num = readStream.Read(scratchBuffer, 0, scratchBuffer.Length);
                        }while (num > 0);
                    }
                    return(true);
                }
            }
            if (propertyTag.ValueTnefType == TnefPropertyType.String8 && forceUnicode)
            {
                if (TnefPropertyBag.IsLegacyAttribute(attributeTag))
                {
                    return(false);
                }
                TnefPropertyBag.StartAttributeIfNecessary(writer, attributeTag, attributeLevel, ref startAttribute);
                writer.WriteProperty(propertyTag.ToUnicode(), value);
            }
            else
            {
                TnefPropertyBag.StartAttributeIfNecessary(writer, attributeTag, attributeLevel, ref startAttribute);
                writer.WriteProperty(propertyTag, value);
            }
            return(true);
        }
Пример #2
0
        internal bool Write(TnefReader reader, TnefWriter writer, TnefAttributeLevel level, bool dropRecipientTable, bool forceUnicode, byte[] scratchBuffer)
        {
            IDictionary <TnefPropertyTag, object> dictionary = null;

            char[] array = null;
            bool   result;

            for (;;)
            {
                TnefPropertyReader propertyReader = reader.PropertyReader;
                if (0 >= propertyReader.PropertyCount)
                {
                    goto IL_37A;
                }
                TnefAttributeTag   attributeTag   = reader.AttributeTag;
                TnefAttributeLevel attributeLevel = reader.AttributeLevel;
                bool flag = true;
                while (propertyReader.ReadNextProperty())
                {
                    TnefPropertyTag propertyTag = propertyReader.PropertyTag;
                    if (TnefPropertyType.Null != propertyTag.ValueTnefType)
                    {
                        if (propertyReader.IsNamedProperty)
                        {
                            TnefNameId  propertyNameId = propertyReader.PropertyNameId;
                            TnefNameTag key            = new TnefNameTag(propertyNameId, propertyTag.ValueTnefType);
                            int         num;
                            if (this.supportedNamedProperties.TryGetValue(key, out num) && this.properties[num].IsDirty)
                            {
                                object obj = this[propertyNameId];
                                if (obj != null)
                                {
                                    TnefPropertyBag.StartAttributeIfNecessary(writer, attributeTag, attributeLevel, ref flag);
                                    writer.StartProperty(propertyTag, propertyNameId.PropertySetGuid, propertyNameId.Id);
                                    writer.WritePropertyValue(obj);
                                    continue;
                                }
                                continue;
                            }
                        }
                        else
                        {
                            TnefPropertyId id = propertyTag.Id;
                            int            num2;
                            if (this.supportedProperties.TryGetValue(propertyTag, out num2) && this.properties[num2].IsDirty && (this.attachmentData == null || this.attachmentData.EmbeddedMessage == null || TnefAttributeLevel.Attachment != level || TnefAttributeTag.AttachData != attributeTag || TnefPropertyId.AttachData != id))
                            {
                                object obj = this[id];
                                if (obj == null)
                                {
                                    continue;
                                }
                                if (!this.WriteModifiedProperty(writer, reader, propertyTag, obj, forceUnicode, ref flag, scratchBuffer))
                                {
                                    if (dictionary == null)
                                    {
                                        dictionary = new Dictionary <TnefPropertyTag, object>(TnefPropertyBag.PropertyTagComparer);
                                    }
                                    if (!dictionary.ContainsKey(propertyTag))
                                    {
                                        dictionary.Add(propertyTag, obj);
                                        continue;
                                    }
                                    continue;
                                }
                                else
                                {
                                    if (dictionary != null && dictionary.ContainsKey(propertyTag))
                                    {
                                        dictionary.Remove(propertyTag);
                                        continue;
                                    }
                                    continue;
                                }
                            }
                        }
                        if (propertyTag.ValueTnefType == TnefPropertyType.String8 && forceUnicode)
                        {
                            if (!TnefPropertyBag.IsLegacyAttribute(attributeTag))
                            {
                                TnefPropertyBag.StartAttributeIfNecessary(writer, attributeTag, attributeLevel, ref flag);
                                TnefPropertyBag.WriteUnicodeProperty(writer, propertyReader, propertyTag.ToUnicode(), ref array);
                            }
                        }
                        else if (propertyTag.IsTnefTypeValid)
                        {
                            TnefPropertyBag.StartAttributeIfNecessary(writer, attributeTag, attributeLevel, ref flag);
                            writer.WriteProperty(propertyReader);
                        }
                    }
                }
                if ((TnefAttributeTag.MapiProperties == attributeTag && level == TnefAttributeLevel.Message) || (TnefAttributeTag.Attachment == attributeTag && level == TnefAttributeLevel.Attachment))
                {
                    if (this.newProperties != null)
                    {
                        foreach (KeyValuePair <TnefPropertyTag, object> keyValuePair in this.newProperties)
                        {
                            object obj = keyValuePair.Value;
                            if (obj != null)
                            {
                                this.WriteModifiedProperty(writer, reader, keyValuePair.Key, obj, forceUnicode, ref flag, scratchBuffer);
                            }
                        }
                    }
                    if (dictionary != null)
                    {
                        foreach (KeyValuePair <TnefPropertyTag, object> keyValuePair2 in dictionary)
                        {
                            this.WriteModifiedProperty(writer, reader, keyValuePair2.Key, keyValuePair2.Value, forceUnicode, ref flag, scratchBuffer);
                        }
                    }
                    if (this.newNamedProperties != null)
                    {
                        using (IEnumerator <KeyValuePair <TnefNameTag, object> > enumerator3 = this.newNamedProperties.GetEnumerator())
                        {
                            while (enumerator3.MoveNext())
                            {
                                KeyValuePair <TnefNameTag, object> keyValuePair3 = enumerator3.Current;
                                object obj = keyValuePair3.Value;
                                if (obj != null)
                                {
                                    TnefPropertyTag tag = new TnefPropertyTag((TnefPropertyId)(-32768), keyValuePair3.Key.Type);
                                    if (forceUnicode)
                                    {
                                        tag = tag.ToUnicode();
                                    }
                                    TnefPropertyBag.StartAttributeIfNecessary(writer, attributeTag, attributeLevel, ref flag);
                                    writer.StartProperty(tag, keyValuePair3.Key.Id.PropertySetGuid, keyValuePair3.Key.Id.Id);
                                    writer.WritePropertyValue(obj);
                                }
                            }
                            goto IL_3AC;
                        }
                        goto IL_37A;
                    }
                }
IL_3AC:
                if (!(result = reader.ReadNextAttribute()) || level != reader.AttributeLevel || TnefAttributeTag.AttachRenderData == reader.AttributeTag)
                {
                    break;
                }
                continue;
IL_37A:
                if (level != TnefAttributeLevel.Message || TnefAttributeTag.RecipientTable != reader.AttributeTag)
                {
                    writer.WriteAttribute(reader);
                    goto IL_3AC;
                }
                if (!dropRecipientTable)
                {
                    this.parentMessage.WriteRecipients(reader.PropertyReader, writer, ref array);
                    goto IL_3AC;
                }
                goto IL_3AC;
            }
            return(result);
        }