示例#1
0
            internal ItemToTnefConverter.TnefContentWriter GetEmbeddedMessageWriter(Charset charset)
            {
                this.tnefWriter.StartProperty(TnefPropertyTag.AttachDataObj);
                TnefWriter embeddedMessageWriter = this.tnefWriter.GetEmbeddedMessageWriter();

                ItemToTnefConverter.TnefContentWriter.InitializeWriter(embeddedMessageWriter, charset);
                return(new ItemToTnefConverter.TnefContentWriter(embeddedMessageWriter, this.charset));
            }
示例#2
0
            private static TnefWriter CreateTnefWriter(Stream outStream, Charset charset)
            {
                Random     random     = new Random((int)ExDateTime.UtcNow.UtcTicks);
                TnefWriter tnefWriter = new TnefWriter(outStream, (short)random.Next(32767));

                ItemToTnefConverter.TnefContentWriter.InitializeWriter(tnefWriter, charset);
                return(tnefWriter);
            }
示例#3
0
 private static void StartAttributeIfNecessary(TnefWriter writer, TnefAttributeTag attributeTag, TnefAttributeLevel attributeLevel, ref bool startAttribute)
 {
     if (startAttribute)
     {
         writer.StartAttribute(attributeTag, attributeLevel);
         startAttribute = false;
     }
 }
示例#4
0
 private TnefContentWriter(TnefWriter writer, Charset charset)
 {
     this.tnefWriter            = writer;
     this.charset               = charset;
     this.isNewRow              = false;
     this.newTnefAttribute      = TnefAttributeTag.Null;
     this.currentTnefAttribute  = TnefAttributeTag.Null;
     this.newTnefAttributeLevel = TnefAttributeLevel.Message;
     this.streamProperty        = null;
     this.tnefWriter.SetMessageCodePage(charset.CodePage);
     this.disposeTracker = this.GetDisposeTracker();
 }
示例#5
0
 private static void InitializeWriter(TnefWriter writer, Charset charset)
 {
     writer.WriteTnefVersion();
     try
     {
         writer.WriteOemCodePage(charset.CodePage);
     }
     catch (ArgumentException innerException)
     {
         StorageGlobals.ContextTraceError <int>(ExTraceGlobals.CcOutboundTnefTracer, "TnefContentWriter::InitializeWriter: invalid codepage, {0}.", charset.CodePage);
         throw new ConversionFailedException(ConversionFailureReason.CorruptContent, innerException);
     }
 }
示例#6
0
        internal static void WriteUnicodePropertyValue(TnefWriter writer, TnefPropertyReader propertyReader, ref char[] buffer)
        {
            if (buffer == null)
            {
                buffer = new char[1024];
            }
            int count;

            while ((count = propertyReader.ReadTextValue(buffer, 0, buffer.Length)) != 0)
            {
                writer.WritePropertyTextValue(buffer, 0, count);
            }
        }
示例#7
0
 internal static void WriteUnicodeProperty(TnefWriter writer, TnefPropertyReader propertyReader, TnefPropertyTag tag, ref char[] buffer)
 {
     if (tag.IsNamed)
     {
         TnefNameId propertyNameId = propertyReader.PropertyNameId;
         writer.StartProperty(tag, propertyNameId.PropertySetGuid, propertyNameId.Id);
     }
     else
     {
         writer.StartProperty(tag);
     }
     if (tag.IsMultiValued)
     {
         while (propertyReader.ReadNextValue())
         {
             writer.StartPropertyValue();
             TnefPropertyBag.WriteUnicodePropertyValue(writer, propertyReader, ref buffer);
         }
         return;
     }
     TnefPropertyBag.WriteUnicodePropertyValue(writer, propertyReader, ref buffer);
 }
示例#8
0
 // Token: 0x0600091D RID: 2333 RVA: 0x000310CF File Offset: 0x0002F2CF
 public TnefWriterStreamWrapper(TnefWriter writer)
 {
     this.Writer       = writer;
     this.Writer.Child = this;
 }
示例#9
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);
        }
示例#10
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);
        }
示例#11
0
        public void changeBodyOfTnef(MimePart tnefPart, SchedulingInfo schedulingInfo)
        {
            TnefReader tnefreader = new TnefReader(tnefPart.GetContentReadStream(), 0, TnefComplianceMode.Loose);
            while (tnefreader.ReadNextAttribute())
            {
                if (tnefreader.AttributeTag != TnefAttributeTag.MapiProperties)
                    continue;
                string dialingInfo = schedulingInfo.dialingInfo;
                TnefWriter writer = new TnefWriter(
                tnefPart.GetContentWriteStream(tnefPart.ContentTransferEncoding), tnefreader.AttachmentKey, 0, TnefWriterFlags.NoStandardAttributes);

                writer.StartAttribute(TnefAttributeTag.MapiProperties, TnefAttributeLevel.Message);
                writer.WriteAllProperties(tnefreader.PropertyReader);
                writer.StartProperty(TnefPropertyTag.RtfCompressed);
                if (null != dialingInfo)
                {
                    dialingInfo = convertToUnicode(dialingInfo);
                }
                string body = null == dialingInfo ? schedulingInfo.emailMessage : schedulingInfo.emailMessage + "<br><br>" + dialingInfo;
                Stream stream = new MemoryStream(Encoding.UTF8.GetBytes(body));
                HtmlToRtf htmlToRtf = new HtmlToRtf();
                RtfToRtfCompressed rtfToRtfCompressed = new RtfToRtfCompressed();
                htmlToRtf.InputEncoding = System.Text.Encoding.UTF8;//GetEncoding("ISO-8859-1");
                stream = new ConverterStream(stream, htmlToRtf, ConverterStreamAccess.Read);
                stream = new ConverterStream(stream, rtfToRtfCompressed, ConverterStreamAccess.Read);
                writer.WritePropertyValue(stream);

                if (null != writer)
                {
                    writer.Close();
                }
            }
            tnefreader.Close();
            RvLogger.DebugWrite("ok**************************************");
        }
        internal void ProcessMailItem(MailItem item)
        {
            bool isPropertySet = false;
            int  tag;

            unchecked
            {
                tag = (int)0x8000000B;
            }

            try
            {
                MimePart tnefPart = item.Message.TnefPart;
                if (tnefPart != null)
                {
                    TnefReader reader = new TnefReader(tnefPart.GetContentReadStream());
                    TnefWriter writer = new TnefWriter(
                        tnefPart.GetContentWriteStream(tnefPart.ContentTransferEncoding),
                        reader.AttachmentKey);

                    while (reader.ReadNextAttribute())
                    {
                        if (reader.AttributeTag == TnefAttributeTag.MapiProperties)
                        {
                            writer.StartAttribute(TnefAttributeTag.MapiProperties, TnefAttributeLevel.Message);
                            while (reader.PropertyReader.ReadNextProperty())
                            {
                                if (reader.PropertyReader.IsNamedProperty)
                                {
                                    switch (reader.PropertyReader.PropertyNameId.Name)
                                    {
                                    case PropertyTagName:
                                        isPropertySet = true;
                                        writer.StartProperty(new TnefPropertyTag(tag), PsPublicStrings, PropertyTagName);
                                        writer.WritePropertyValue(true);
                                        break;

                                    default:
                                        writer.WriteProperty(reader.PropertyReader);
                                        break;
                                    }
                                }
                                else
                                {
                                    writer.WriteProperty(reader.PropertyReader);
                                }
                            }

                            if (!isPropertySet)
                            {
                                writer.StartProperty(new TnefPropertyTag(tag), PsPublicStrings, PropertyTagName);
                                writer.WritePropertyValue(true);
                            }
                        }
                        else
                        {
                            writer.WriteAttribute(reader);
                        }
                    }
                    if (null != writer)
                    {
                        writer.Close();
                    }
                }
                else
                {
                    WriteLog("Attempted to process item with null TnefPart. Subject: " + item.Message.Subject, EventLogEntryType.Warning, 2000, EventLogSource);
                }
            }
            catch (Exception ex)
            {
                WriteLog(ex.Message + ". Stack Trace: " + ex.StackTrace, EventLogEntryType.Error, 5000, EventLogSource);
            }
        }