// Token: 0x0600167C RID: 5756 RVA: 0x0007F59F File Offset: 0x0007D79F
 private bool MessageAlreadyHasRecipientsExpanded(MessageItem messageItem, StorePropertyDefinition property, out GroupExpansionRecipients ger)
 {
     ger = GroupExpansionRecipients.RetrieveFromStore(messageItem, property);
     return(ger != null && ger.Recipients.Count > 0);
 }
        // Token: 0x0600167D RID: 5757 RVA: 0x0007F5C0 File Offset: 0x0007D7C0
        private DistributionGroupExpansionError ExpandGroupMemberRecipients(MessageItem messageItem, List <ADRecipient> groupRecipients, RecipientItemType recipientType, GroupExpansionRecipients groupExpansionRecipients)
        {
            DistributionGroupExpansionError result = DistributionGroupExpansionError.NoError;

            if (groupRecipients.Count > 0)
            {
                List <RecipientToIndex> collection = this.ExpandGroupMemberRecipients(messageItem, groupRecipients, recipientType, out result);
                groupExpansionRecipients.Recipients.AddRange(collection);
            }
            return(result);
        }
        // Token: 0x0600167A RID: 5754 RVA: 0x0007EF34 File Offset: 0x0007D134
        private void PerformDLExpansionOnItemRecipients(MailboxSession itemStore, MessageItem messageItem, ref bool isExpectedException)
        {
            Exception ex = null;

            try
            {
                GroupExpansionRecipients groupExpansionRecipients = null;
                if (this.MessageAlreadyHasRecipientsExpanded(messageItem, MessageItemSchema.GroupExpansionRecipients, out groupExpansionRecipients))
                {
                    RecipientDLExpansionEventBasedAssistant.Tracer.TraceDebug <StoreObjectId, string>((long)this.GetHashCode(), "Message with id: {0} and subject: '{1}' already have group recipients expanded.", messageItem.StoreObjectId, messageItem.Subject);
                    StorageGlobals.EventLogger.LogEvent(StorageEventLogConstants.Tuple_RecipientDLExpansionMessageAlreadyProcessed, null, new object[]
                    {
                        messageItem.StoreObjectId,
                        groupExpansionRecipients
                    });
                    return;
                }
                IRecipientSession  tenantOrRootOrgRecipientSession = DirectorySessionFactory.Default.GetTenantOrRootOrgRecipientSession(true, ConsistencyMode.IgnoreInvalid, itemStore.GetADSessionSettings(), 314, "PerformDLExpansionOnItemRecipients", "f:\\15.00.1497\\sources\\dev\\MailboxAssistants\\src\\assistants\\Compliance\\RecipientDLExpansionEventBasedAssistant.cs");
                List <ADRecipient> list  = new List <ADRecipient>();
                List <ADRecipient> list2 = new List <ADRecipient>();
                List <ADRecipient> list3 = new List <ADRecipient>();
                foreach (Recipient recipient in messageItem.Recipients)
                {
                    bool?flag = recipient.IsDistributionList();
                    if (flag != null && flag.Value)
                    {
                        if (recipient.RecipientItemType == RecipientItemType.To)
                        {
                            ADRecipient adrecipient = null;
                            if (recipient.Participant.TryGetADRecipient(tenantOrRootOrgRecipientSession, out adrecipient) && adrecipient != null && !list.Contains(adrecipient))
                            {
                                list.Add(adrecipient);
                            }
                        }
                        else if (recipient.RecipientItemType == RecipientItemType.Cc)
                        {
                            ADRecipient adrecipient2 = null;
                            if (recipient.Participant.TryGetADRecipient(tenantOrRootOrgRecipientSession, out adrecipient2) && adrecipient2 != null && !list2.Contains(adrecipient2))
                            {
                                list2.Add(adrecipient2);
                            }
                        }
                        else if (recipient.RecipientItemType == RecipientItemType.Bcc)
                        {
                            ADRecipient adrecipient3 = null;
                            if (recipient.Participant.TryGetADRecipient(tenantOrRootOrgRecipientSession, out adrecipient3) && adrecipient3 != null && !list3.Contains(adrecipient3))
                            {
                                list3.Add(adrecipient3);
                            }
                        }
                    }
                }
                if (list.Count > 0 || list2.Count > 0 || list3.Count > 0)
                {
                    RecipientDLExpansionPerfmon.TotalDLExpansionMessages.Increment();
                    RecipientDLExpansionPerfmon.TotalRecipientDLsInMessage.IncrementBy((long)(list.Count + list2.Count + list3.Count));
                    using (AverageTimeCounter averageTimeCounter = new AverageTimeCounter(RecipientDLExpansionPerfmon.AverageMessageDLExpansionProcessing, RecipientDLExpansionPerfmon.AverageMessageDLExpansionProcessingBase, true))
                    {
                        try
                        {
                            GroupExpansionRecipients        groupExpansionRecipients2       = new GroupExpansionRecipients();
                            DistributionGroupExpansionError distributionGroupExpansionError = DistributionGroupExpansionError.NoError;
                            distributionGroupExpansionError |= this.ExpandGroupMemberRecipients(messageItem, list, RecipientItemType.To, groupExpansionRecipients2);
                            distributionGroupExpansionError |= this.ExpandGroupMemberRecipients(messageItem, list2, RecipientItemType.Cc, groupExpansionRecipients2);
                            distributionGroupExpansionError |= this.ExpandGroupMemberRecipients(messageItem, list3, RecipientItemType.Bcc, groupExpansionRecipients2);
                            int num = 0;
                            while (num++ <= 1)
                            {
                                try
                                {
                                    groupExpansionRecipients2.SaveToStore(messageItem, MessageItemSchema.GroupExpansionRecipients);
                                    if (distributionGroupExpansionError != DistributionGroupExpansionError.NoError)
                                    {
                                        messageItem[MessageItemSchema.GroupExpansionError] = distributionGroupExpansionError;
                                    }
                                    SaveMode saveMode = SaveMode.NoConflictResolution;
                                    messageItem.Save(saveMode);
                                    break;
                                }
                                catch (TransientException ex2)
                                {
                                    RecipientDLExpansionEventBasedAssistant.Tracer.TraceError <TransientException>((long)this.GetHashCode(), "Got transient exception when trying to update the message: \r\n{0}", ex2);
                                    if (num > 1)
                                    {
                                        RecipientDLExpansionEventBasedAssistant.Tracer.TraceDebug <int>((long)this.GetHashCode(), "It still failed after retry for {0} times, so give up.", 1);
                                        throw;
                                    }
                                    if (ex2 is SaveConflictException)
                                    {
                                        RecipientDLExpansionEventBasedAssistant.Tracer.TraceDebug((long)this.GetHashCode(), "Got SaveConflictException, will reload the item and retry immediately.");
                                        StoreId     id           = messageItem.Id;
                                        MessageItem messageItem2 = Item.BindAsMessage(itemStore, id, RecipientDLExpansionEventBasedAssistant.ItemProperties);
                                        messageItem.Dispose();
                                        messageItem = messageItem2;
                                    }
                                    else
                                    {
                                        RecipientDLExpansionEventBasedAssistant.Tracer.TraceDebug <int>((long)this.GetHashCode(), "Wait for {0} milliseconds before retry again.", 30000);
                                        Thread.Sleep(30000);
                                    }
                                }
                            }
                        }
                        finally
                        {
                            averageTimeCounter.Stop();
                        }
                        goto IL_382;
                    }
                }
                RecipientDLExpansionEventBasedAssistant.Tracer.TraceWarning <StoreObjectId, string>((long)this.GetHashCode(), "Message with id: {0} and subject: '{1}' does not have any DG recipients.", messageItem.StoreObjectId, messageItem.Subject);
                StorageGlobals.EventLogger.LogEvent(StorageEventLogConstants.Tuple_RecipientDLExpansionMessageNoDLRecipients, null, new object[]
                {
                    messageItem.StoreObjectId
                });
                IL_382 :;
            }
            catch (AccessDeniedException ex3)
            {
                ex = ex3;
                isExpectedException = true;
            }
            catch (ObjectNotFoundException ex4)
            {
                ex = ex4;
                isExpectedException = true;
            }
            catch (RecoverableItemsAccessDeniedException ex5)
            {
                isExpectedException = true;
                RecipientDLExpansionEventBasedAssistant.Tracer.TraceWarning((long)this.GetHashCode(), "Can't save DL expansion list to message with id: {0} and subject: '{1}' in mailbox: {2}, tenant: {3} because update item in Dumpster is not allowed. Exception: \r\n{4}", new object[]
                {
                    messageItem.StoreObjectId,
                    messageItem.Subject,
                    itemStore.MailboxGuid,
                    itemStore.OrganizationId,
                    ex5
                });
                StorageGlobals.EventLogger.LogEvent(StorageEventLogConstants.Tuple_RecipientDLExpansionUpdateItemInDumpster, null, new object[]
                {
                    messageItem.StoreObjectId,
                    messageItem.Subject,
                    itemStore.MailboxGuid,
                    itemStore.OrganizationId,
                    ex5
                });
            }
            if (ex != null)
            {
                RecipientDLExpansionEventBasedAssistant.Tracer.TraceWarning((long)this.GetHashCode(), "Can't process message with id: {0} and subject: '{1}' in mailbox: {2}, tenant: {3} because it may no longer exist. Exception: \r\n{4}", new object[]
                {
                    messageItem.StoreObjectId,
                    messageItem.Subject,
                    itemStore.MailboxGuid,
                    itemStore.OrganizationId,
                    ex
                });
                StorageGlobals.EventLogger.LogEvent(StorageEventLogConstants.Tuple_RecipientDLExpansionMessageNoLongerExist, null, new object[]
                {
                    messageItem.StoreObjectId,
                    itemStore.MailboxGuid,
                    itemStore.OrganizationId,
                    ex
                });
            }
        }