private List <string> GetTargetUsers(MessageItem item, Participant[] participantsOnOriginalMessage, IWorkingSetPublisherPerformanceTracker performanceTracker) { List <string> list = new List <string>(this.groupsCache[item.Session.MailboxGuid].TargetUsers.Count); Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); if (this.groupsCache[item.Session.MailboxGuid].TargetUsers.Count > 0) { foreach (string text in this.groupsCache[item.Session.MailboxGuid].TargetUsers) { Participant participant = new Participant.Builder { EmailAddress = text, RoutingType = "EX" }.ToParticipant(); if (participant.ExistIn(participantsOnOriginalMessage)) { performanceTracker.IncrementParticipantsSkippedInPublishedMessage(); } else { list.Add(text); performanceTracker.IncrementParticipantsAddedToPublishedMessage(); } } } stopwatch.Stop(); performanceTracker.DedupeParticipantsMilliseconds = stopwatch.ElapsedMilliseconds; return(list); }
public bool EscalateItem(IMessageItem item, IMailboxSession mailboxSession, out bool isTransientError, bool isFromYammer = false) { Util.ThrowOnNullArgument(item, "item"); Util.ThrowOnNullArgument(mailboxSession, "mailboxSession"); isTransientError = false; string yammerEscalateAddress; List <string> escalatedUsersList = this.GetEscalatedUsersList(mailboxSession, out yammerEscalateAddress); bool flag = GroupEscalation.ShouldEscalateToYammer(isFromYammer, yammerEscalateAddress, item.ClassName); if (escalatedUsersList.Count < 1 && !flag) { GroupEscalation.Tracer.TraceDebug((long)this.GetHashCode(), "GroupEscalation.EscalateItem: Skipping Escalation as there are no users in need to escalate"); return(true); } bool result = false; IExtensibleLogger logger = GroupEscalateItemDiagnosticsFrameFactory.Default.CreateLogger(mailboxSession.MailboxGuid, mailboxSession.OrganizationId); IGroupEscalateItemPerformanceTracker groupEscalateItemPerformanceTracker = GroupEscalateItemDiagnosticsFrameFactory.Default.CreatePerformanceTracker(mailboxSession); using (GroupEscalateItemDiagnosticsFrameFactory.Default.CreateDiagnosticsFrame("XSO", "EscalateItem", logger, groupEscalateItemPerformanceTracker)) { try { if (item.From != null) { groupEscalateItemPerformanceTracker.OriginalMessageSender = (item.From.EmailAddress ?? string.Empty); groupEscalateItemPerformanceTracker.OriginalMessageSenderRecipientType = ((item.From.Origin != null) ? item.From.Origin.ToString() : string.Empty); groupEscalateItemPerformanceTracker.OriginalMessageClass = (item.ClassName ?? string.Empty); groupEscalateItemPerformanceTracker.OriginalMessageId = ((item.Id != null) ? item.Id.ToBase64String() : string.Empty); groupEscalateItemPerformanceTracker.OriginalInternetMessageId = (item.InternetMessageId ?? string.Empty); } StoreObjectId escalationFolderId = GroupEscalation.GetEscalationFolderId(mailboxSession); using (IMessageItem messageItem = this.CreateEscalationMessage(mailboxSession, escalationFolderId, item)) { ExDateTime?valueOrDefault = item.PropertyBag.GetValueOrDefault <ExDateTime?>(ItemSchema.SentTime); if (valueOrDefault != null) { messageItem[InternalSchema.OriginalSentTimeForEscalation] = valueOrDefault; } else { this.TraceAndLogError(logger, "EscalateItem", "GroupEscalation.EscalateItem: Couldn't find client submit time."); } IExchangePrincipal mailboxOwner = mailboxSession.MailboxOwner; Participant participant = new Participant(mailboxOwner); if (!ObjectClass.IsMeetingMessage(messageItem.ClassName)) { messageItem.Sender = participant; } messageItem.SuppressAllAutoResponses(); messageItem.IsGroupEscalationMessage = true; Participant[] array = new Participant[messageItem.Recipients.Count]; int num = 0; foreach (Recipient recipient in messageItem.Recipients) { recipient[ItemSchema.Responsibility] = false; array[num] = recipient.Participant; num++; } groupEscalateItemPerformanceTracker.ParticipantsInOriginalMessage = array.Length; List <Participant> list = new List <Participant>(array); Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); if (!participant.ExistIn(array)) { Recipient recipient2 = messageItem.Recipients.Add(participant, RecipientItemType.To); list.Add(participant); recipient2[ItemSchema.Responsibility] = false; groupEscalateItemPerformanceTracker.IsGroupParticipantAddedToParticipants = true; } stopwatch.Stop(); groupEscalateItemPerformanceTracker.EnsureGroupParticipantAddedMilliseconds = stopwatch.ElapsedMilliseconds; stopwatch.Reset(); stopwatch.Start(); bool flag2 = false; foreach (string emailAddress in escalatedUsersList) { Participant participant2 = new Participant.Builder { EmailAddress = emailAddress, RoutingType = "EX" }.ToParticipant(); if (!participant2.ExistIn(array)) { Recipient recipient3 = messageItem.Recipients.Add(participant2, RecipientItemType.Bcc); recipient3[ItemSchema.Responsibility] = true; flag2 = true; groupEscalateItemPerformanceTracker.IncrementParticipantsAddedToEscalatedMessage(); } else { groupEscalateItemPerformanceTracker.IncrementParticipantsSkippedInEscalatedMessage(); } } stopwatch.Stop(); groupEscalateItemPerformanceTracker.DedupeParticipantsMilliseconds = stopwatch.ElapsedMilliseconds; groupEscalateItemPerformanceTracker.HasEscalatedUser = flag2; if (!flag2 && !flag) { GroupEscalation.Tracer.TraceDebug((long)this.GetHashCode(), "GroupEscalation.EscalateItem: Skipping Escalation as there are no additional users in need to escalate"); return(true); } messageItem.MarkRecipientAsSubmitted(list.ToArray()); if (flag) { this.EscalateMessageToYammer(mailboxSession, logger, groupEscalateItemPerformanceTracker, yammerEscalateAddress, flag2, escalationFolderId, messageItem); } if (flag2) { this.InsertUnsubscribeLinkToBody(groupEscalateItemPerformanceTracker, logger, mailboxOwner, item, messageItem); this.SendEscalateMessage(messageItem); } result = true; } } catch (StoragePermanentException arg) { this.TraceAndLogError(logger, "EscalateItem", string.Format("GroupEscalation.EscalateItem: Escalation failed. Got store permanent exception: {0}", arg)); } catch (StorageTransientException arg2) { this.TraceAndLogError(logger, "EscalateItem", string.Format("GroupEscalation.EscalateItem: Escalation failed. Got store transient exception: {0}", arg2)); isTransientError = true; } catch (Exception arg3) { this.TraceAndLogError(logger, "EscalateItem", string.Format("GroupEscalation.EscalateItem: Escalation failed. Got exception: {0}", arg3)); throw; } } return(result); }