// Token: 0x06000114 RID: 276 RVA: 0x00006EAC File Offset: 0x000050AC
        private static void HandleSmsMessage(MailboxSession session, Item item, MailboxData mailboxData, ConversationIndexTrackingEx indexTrackingEx)
        {
            MessageItem messageItem = item as MessageItem;

            if (messageItem == null)
            {
                SentItemsProcessor.Tracer.TraceDebug(0L, "{0}: the SMS message is not MessageItem", new object[]
                {
                    TraceContext.Get()
                });
                return;
            }
            RecipientCollection recipients = messageItem.Recipients;

            if (recipients.Count == 0)
            {
                return;
            }
            using (SmsRecipientInfoCache smsRecipientInfoCache = SmsRecipientInfoCache.Create(session, SentItemsProcessor.Tracer))
            {
                Dictionary <ConversationIndex, Recipient> dictionary = new Dictionary <ConversationIndex, Recipient>(recipients.Count);
                for (int i = recipients.Count - 1; i >= 0; i--)
                {
                    Recipient   recipient   = recipients[i];
                    Participant participant = recipient.Participant;
                    if (!(participant == null) && !string.IsNullOrEmpty(participant.EmailAddress))
                    {
                        string text = null;
                        if (string.Equals(participant.RoutingType, "MOBILE", StringComparison.OrdinalIgnoreCase))
                        {
                            text = participant.EmailAddress;
                            smsRecipientInfoCache.AddRecipient(participant);
                        }
                        else if (string.Equals(participant.RoutingType, "SMTP", StringComparison.OrdinalIgnoreCase))
                        {
                            ProxyAddress proxyAddress;
                            if (SmtpProxyAddress.TryDeencapsulate(participant.EmailAddress, out proxyAddress) && string.Equals(proxyAddress.PrefixString, "MOBILE", StringComparison.OrdinalIgnoreCase))
                            {
                                text = proxyAddress.AddressString;
                            }
                            smsRecipientInfoCache.AddRecipient(new Participant(participant.DisplayName, text, "MOBILE"));
                        }
                        if (text != null)
                        {
                            ConversationIndex conversationIndex = ConversationIndex.GenerateFromPhoneNumber(text);
                            if (!(conversationIndex == ConversationIndex.Empty))
                            {
                                recipients.RemoveAt(i);
                                if (!dictionary.ContainsKey(conversationIndex))
                                {
                                    dictionary.Add(conversationIndex, recipient);
                                }
                            }
                        }
                    }
                }
                if (recipients.Count > 0)
                {
                    messageItem.Save(SaveMode.ResolveConflicts);
                    messageItem.Load();
                }
                int num = 0;
                foreach (KeyValuePair <ConversationIndex, Recipient> keyValuePair in dictionary)
                {
                    num++;
                    AggregationBySmsItemClassProcessor.ChunkSmsConversation(XSOFactory.Default, session, keyValuePair.Key, indexTrackingEx);
                    if (num < dictionary.Count || recipients.Count > 0)
                    {
                        SentItemsProcessor.CloneSmsItem(session, messageItem, mailboxData, keyValuePair.Value, keyValuePair.Key);
                    }
                    else
                    {
                        recipients.Add(keyValuePair.Value);
                        SentItemsProcessor.SaveSmsItem(messageItem, keyValuePair.Key);
                        messageItem.Load();
                    }
                }
                smsRecipientInfoCache.Commit();
            }
        }
예제 #2
0
        public void Aggregate(ICorePropertyBag item, bool shouldSearchForDuplicatedMessage, out IStorePropertyBag parentItem, out ConversationIndex newIndex, out ConversationIndex.FixupStage stage)
        {
            newIndex = ConversationIndex.Empty;
            stage    = ConversationIndex.FixupStage.Unknown;
            string valueOrDefault = item.GetValueOrDefault <string>(InternalSchema.ItemClass, string.Empty);

            parentItem = null;
            if (!string.IsNullOrEmpty(valueOrDefault))
            {
                if (ObjectClass.IsMeetingMessage(valueOrDefault))
                {
                    if (AggregationByItemClassReferencesSubjectProcessor.FixupMeetingMessage(this.xsoFactory, this.session, new AggregationByItemClassReferencesSubjectProcessor.PropertyDefinitionListConstructorDelegate(this.GetSearchPropertyDefinitions), item, ref newIndex, ref stage, out parentItem))
                    {
                        return;
                    }
                }
                else if (ObjectClass.IsSmsMessage(valueOrDefault))
                {
                    AggregationBySmsItemClassProcessor aggregationBySmsItemClassProcessor = new AggregationBySmsItemClassProcessor(this.xsoFactory, this.session, this.indexTrackingEx);
                    aggregationBySmsItemClassProcessor.Aggregate(item, out newIndex, out stage);
                    return;
                }
            }
            ConversationIndex conversationIndex;
            bool flag = ConversationIndex.TryCreate(item.TryGetProperty(ItemSchema.ConversationIndex) as byte[], out conversationIndex);

            if (this.indexTrackingEx != null)
            {
                if (flag)
                {
                    this.indexTrackingEx.Trace(conversationIndex);
                }
                else
                {
                    this.indexTrackingEx.Trace("II", "<invalid>");
                }
            }
            if (AggregationByItemClassReferencesSubjectProcessor.SearchByReferences(this.xsoFactory, this.session, item, this.indexTrackingEx, shouldSearchForDuplicatedMessage, out parentItem, this.GetSearchPropertyDefinitions(null)))
            {
                bool flag2 = false;
                if (shouldSearchForDuplicatedMessage)
                {
                    string a    = item.TryGetProperty(ItemSchema.InternetMessageId) as string;
                    string text = parentItem.TryGetProperty(ItemSchema.InternetMessageId) as string;
                    flag2 = (!string.IsNullOrEmpty(text) && string.Equals(a, text, StringComparison.OrdinalIgnoreCase));
                }
                if (flag2)
                {
                    this.CalculateBasedOnMessageWithSameInternetMessageId(item, parentItem, out stage, out newIndex);
                }
                else
                {
                    this.CalculateBasedOnReferenceMessage(item, parentItem, out stage, out newIndex);
                }
            }
            string text2 = item.TryGetProperty(ItemSchema.NormalizedSubject) as string;

            if (stage == ConversationIndex.FixupStage.Unknown)
            {
                if (string.IsNullOrEmpty(item.GetValueOrDefault <string>(ItemSchema.SubjectPrefix)) && flag)
                {
                    if (conversationIndex.Components.Count > 1)
                    {
                        byte[]    incomingConversationIdBytes = ConversationId.Create(conversationIndex.Guid).GetBytes();
                        int       conversationIdHash          = (int)AllItemsFolderHelper.GetHashValue(incomingConversationIdBytes);
                        Stopwatch stopwatch = Stopwatch.StartNew();
                        parentItem = this.xsoFactory.RunQueryOnAllItemsFolder <IStorePropertyBag>(this.session, AllItemsFolderHelper.SupportedSortBy.ConversationIdHash, conversationIdHash, null, delegate(QueryResult queryResult)
                        {
                            IStorePropertyBag[] propertyBags;
                            byte[] array;
                            do
                            {
                                propertyBags = queryResult.GetPropertyBags(1);
                                if (propertyBags == null || propertyBags.Length != 1)
                                {
                                    goto IL_69;
                                }
                                int?num = propertyBags[0].TryGetProperty(ItemSchema.ConversationIdHash) as int?;
                                if (num == null || num.Value != conversationIdHash)
                                {
                                    goto IL_69;
                                }
                                array = (propertyBags[0].TryGetProperty(InternalSchema.MapiConversationId) as byte[]);
                            }while (array == null || !Util.CompareByteArray(incomingConversationIdBytes, array));
                            return(propertyBags[0]);

                            IL_69:
                            return(null);
                        }, this.GetSearchPropertyDefinitions(new StorePropertyDefinition[]
                        {
                            InternalSchema.MapiConversationId,
                            ItemSchema.ConversationIdHash
                        }));
                        stopwatch.Stop();
                        if (this.indexTrackingEx != null)
                        {
                            this.indexTrackingEx.Trace("SBCID", stopwatch.ElapsedMilliseconds.ToString());
                        }
                        if (parentItem != null && !ConversationIndex.CompareTopics(parentItem.TryGetProperty(ItemSchema.ConversationTopic) as string, text2))
                        {
                            newIndex = ConversationIndex.CreateNew();
                            stage    = ConversationIndex.FixupStage.H11;
                            if (this.indexTrackingEx != null)
                            {
                                string text3 = parentItem.TryGetProperty(ItemSchema.InternetMessageId) as string;
                                if (text3 != null)
                                {
                                    this.indexTrackingEx.Trace("S3", text3);
                                }
                            }
                        }
                    }
                    if (stage == ConversationIndex.FixupStage.Unknown)
                    {
                        newIndex = conversationIndex;
                        bool flag3 = parentItem != null;
                        if (flag3)
                        {
                            bool?flag4 = parentItem.TryGetProperty(ItemSchema.ConversationIndexTracking) as bool?;
                            stage = ((flag4 == null || !flag4.Value) ? ConversationIndex.FixupStage.L1 : ConversationIndex.FixupStage.H14);
                        }
                        else
                        {
                            stage = ConversationIndex.FixupStage.H4;
                        }
                    }
                }
                else
                {
                    if (string.IsNullOrEmpty(item.GetValueOrDefault <string>(ItemSchema.InReplyTo, string.Empty)) && string.IsNullOrEmpty(item.GetValueOrDefault <string>(ItemSchema.InternetReferences, string.Empty)) && string.IsNullOrEmpty(item.GetValueOrDefault <string>(ItemSchema.SubjectPrefix)) && !flag)
                    {
                        TopicHashCache topicHashCache = TopicHashCache.Load(this.xsoFactory, this.session, 50);
                        if (string.IsNullOrEmpty(text2) || !topicHashCache.Contains(AllItemsFolderHelper.GetHashValue(text2)))
                        {
                            newIndex = ConversationIndex.CreateNew();
                            stage    = ConversationIndex.FixupStage.H12;
                        }
                    }
                    bool flag5;
                    bool flag6;
                    if (stage == ConversationIndex.FixupStage.Unknown && AggregationByItemClassReferencesSubjectProcessor.SearchByTopic(this.xsoFactory, this.session, item, this.indexTrackingEx, out parentItem, out flag5, out flag6, this.GetSearchPropertyDefinitions(new StorePropertyDefinition[]
                    {
                        ItemSchema.ReceivedTime,
                        ItemSchema.InReplyTo,
                        ItemSchema.InternetReferences
                    })))
                    {
                        if (this.indexTrackingEx != null)
                        {
                            string text4 = parentItem.TryGetProperty(ItemSchema.InternetMessageId) as string;
                            if (text4 != null)
                            {
                                this.indexTrackingEx.Trace("S2", text4);
                            }
                        }
                        bool?flag7 = parentItem.TryGetProperty(ItemSchema.ConversationIndexTracking) as bool?;
                        bool flag8 = flag7 == null || !flag7.Value;
                        if (flag5)
                        {
                            newIndex = conversationIndex;
                            stage    = (flag8 ? ConversationIndex.FixupStage.L1 : ConversationIndex.FixupStage.H5);
                        }
                        else
                        {
                            ConversationIndex conversationIndex2;
                            bool flag9 = ConversationIndex.TryCreate(parentItem.TryGetProperty(ItemSchema.ConversationIndex) as byte[], out conversationIndex2);
                            if (flag6)
                            {
                                ExDateTime?valueAsNullable = item.GetValueAsNullable <ExDateTime>(ItemSchema.SentTime);
                                newIndex = ((valueAsNullable != null) ? ConversationIndex.Create(conversationIndex2.Guid, valueAsNullable.Value) : ConversationIndex.Create(conversationIndex2.Guid));
                                stage    = (flag8 ? ConversationIndex.FixupStage.L1 : ConversationIndex.FixupStage.H6);
                            }
                            else
                            {
                                object obj             = parentItem.TryGetProperty(ItemSchema.ReceivedTime);
                                string valueOrDefault2 = item.GetValueOrDefault <string>(ItemSchema.SubjectPrefix);
                                if (obj != null && obj is ExDateTime)
                                {
                                    ExDateTime dt       = (ExDateTime)obj;
                                    TimeSpan   timeSpan = ExDateTime.Now - dt;
                                    if (timeSpan.TotalHours >= -72.0 && timeSpan.TotalHours <= 72.0 && flag9)
                                    {
                                        if (flag)
                                        {
                                            newIndex = conversationIndex.UpdateGuid(conversationIndex2.Guid);
                                            stage    = (flag8 ? ConversationIndex.FixupStage.L1 : ConversationIndex.FixupStage.H9);
                                        }
                                        else if (!string.IsNullOrEmpty(valueOrDefault2))
                                        {
                                            ExDateTime?valueAsNullable2 = item.GetValueAsNullable <ExDateTime>(ItemSchema.SentTime);
                                            if (valueAsNullable2 != null)
                                            {
                                                newIndex = ConversationIndex.Create(conversationIndex2.Guid, valueAsNullable2.Value);
                                            }
                                            else
                                            {
                                                newIndex = ConversationIndex.Create(conversationIndex2.Guid);
                                            }
                                            stage = (flag8 ? ConversationIndex.FixupStage.L1 : ConversationIndex.FixupStage.H6);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            if (stage == ConversationIndex.FixupStage.Unknown)
            {
                if (!string.IsNullOrEmpty(item.GetValueOrDefault <string>(ItemSchema.SubjectPrefix)))
                {
                    TopicHashCache topicHashCache2 = TopicHashCache.Load(this.xsoFactory, this.session, 50);
                    uint           hashValue       = AllItemsFolderHelper.GetHashValue(text2);
                    topicHashCache2.Add(hashValue);
                    TopicHashCache.Save(topicHashCache2, this.xsoFactory, this.session);
                    if (this.indexTrackingEx != null)
                    {
                        this.indexTrackingEx.Trace("THA", hashValue.ToString());
                    }
                }
                if (flag)
                {
                    newIndex = conversationIndex;
                    stage    = ConversationIndex.FixupStage.H7;
                    return;
                }
                newIndex = ConversationIndex.CreateNew();
                stage    = ConversationIndex.FixupStage.H8;
            }
        }