List <ReplayAction> IDestinationMailbox.GetActions(string replaySyncState, int maxNumberOfActions) { MrsTracer.Provider.Function("StorageDestinationMailbox.GetActions", new object[0]); base.VerifyMailboxConnection(VerifyMailboxConnectionFlags.None); IActionsSource actionsSource = new StorageActionsSource((MailboxSession)base.StoreSession); StorageActionWatermark storageActionWatermark; if ((storageActionWatermark = StorageActionWatermark.Deserialize(replaySyncState)) == null) { storageActionWatermark = new StorageActionWatermark { TimeStamp = DateTime.UtcNow.AddHours(-1.0) }; } IActionWatermark watermark = storageActionWatermark; List <ReplayAction> list = new List <ReplayAction>(maxNumberOfActions); foreach (ReplayAction item in actionsSource.ReadActions(watermark)) { if (list.Count == maxNumberOfActions) { break; } list.Add(item); } return(list); }
IEnumerable <ReplayAction> IActionsSource.ReadActions(IActionWatermark watermark) { MrsTracer.Provider.Function("StorageActionsSource.ReadActions", new object[0]); IActivityLog activityLog = ActivityLogFactory.Current.Bind(this.mailboxSession); List <ReplayAction> actionsIndescendingOrder = new List <ReplayAction>(100); foreach (Activity activity in activityLog.Query()) { if (activity.ClientId.LoggedViaServerSideInstrumentation) { IActionWatermark actionWatermark = new StorageActionWatermark(activity); if (watermark != null && watermark.CompareTo(actionWatermark) >= 0) { break; } ReplayAction replayAction = this.TryConvertToAction(activity, actionWatermark); if (replayAction != null) { actionsIndescendingOrder.Add(replayAction); } } } for (int index = actionsIndescendingOrder.Count - 1; index >= 0; index--) { yield return(actionsIndescendingOrder[index]); } yield break; }
private ReplayAction TryConvertToAction(Activity activity, IActionWatermark watermark) { ActivityId id = activity.Id; switch (id) { case ActivityId.Move: if (IdConverter.IsMessageId(activity.ItemId)) { byte[] array; byte[] itemAndFolderId = StorageActionsSource.GetItemAndFolderId(activity.ItemId, out array); byte[] prevFolderId; StorageActionsSource.GetItemAndFolderId(activity.PreviousItemId, out prevFolderId); DefaultFolderType defaultFolderType = this.mailboxSession.IsDefaultFolderType(StoreObjectId.FromProviderSpecificId(array, StoreObjectType.Folder)); if (defaultFolderType == DefaultFolderType.RecoverableItemsDeletions || defaultFolderType == DefaultFolderType.RecoverableItemsPurges) { return(new DeleteAction(itemAndFolderId, array, prevFolderId, watermark.SerializeToString())); } return(new MoveAction(itemAndFolderId, array, prevFolderId, watermark.SerializeToString())); } break; case ActivityId.Flag: { byte[] array; byte[] itemAndFolderId = StorageActionsSource.GetItemAndFolderId(activity.ItemId, out array); return(new FlagAction(itemAndFolderId, array, watermark.SerializeToString())); } case ActivityId.FlagComplete: { byte[] array; byte[] itemAndFolderId = StorageActionsSource.GetItemAndFolderId(activity.ItemId, out array); return(new FlagCompleteAction(itemAndFolderId, array, watermark.SerializeToString())); } case ActivityId.FlagCleared: { byte[] array; byte[] itemAndFolderId = StorageActionsSource.GetItemAndFolderId(activity.ItemId, out array); return(new FlagClearAction(itemAndFolderId, array, watermark.SerializeToString())); } case ActivityId.Categorize: case ActivityId.InspectorDisplayStart: case ActivityId.InspectorDisplayEnd: break; case ActivityId.MarkAsRead: { byte[] array; byte[] itemAndFolderId = StorageActionsSource.GetItemAndFolderId(activity.ItemId, out array); return(new MarkAsReadAction(itemAndFolderId, array, watermark.SerializeToString())); } case ActivityId.MarkAsUnread: { byte[] array; byte[] itemAndFolderId = StorageActionsSource.GetItemAndFolderId(activity.ItemId, out array); return(new MarkAsUnReadAction(itemAndFolderId, array, watermark.SerializeToString())); } default: switch (id) { case ActivityId.RemoteSend: { string[] recipients; byte[] mimeData = this.GetMimeData(activity.ItemId, out recipients); byte[] array; byte[] itemAndFolderId = StorageActionsSource.GetItemAndFolderId(activity.ItemId, out array); return(new SendAction(itemAndFolderId, array, watermark.SerializeToString()) { Data = mimeData, Recipients = recipients }); } case ActivityId.CreateCalendarEvent: { byte[] array; byte[] itemAndFolderId = StorageActionsSource.GetItemAndFolderId(activity.ItemId, out array); IList <Event> exceptionalOccurrences; IList <string> deletedOccurrences; Event calendarEventData = this.GetCalendarEventData(activity, out exceptionalOccurrences, out deletedOccurrences); if (calendarEventData == null) { return(null); } return(new CreateCalendarEventAction(itemAndFolderId, array, watermark.SerializeToString(), calendarEventData, exceptionalOccurrences, deletedOccurrences)); } case ActivityId.UpdateCalendarEvent: { byte[] array; byte[] itemAndFolderId = StorageActionsSource.GetItemAndFolderId(activity.ItemId, out array); IList <Event> exceptionalOccurrences2; IList <string> deletedOccurrences2; Event calendarEventData2 = this.GetCalendarEventData(activity, out exceptionalOccurrences2, out deletedOccurrences2); if (calendarEventData2 == null) { return(null); } return(new UpdateCalendarEventAction(itemAndFolderId, array, watermark.SerializeToString(), calendarEventData2, exceptionalOccurrences2, deletedOccurrences2)); } } break; } return(null); }