private void SubscribeForSearchComplete(OwaSearchContext searchContext) { ExTraceGlobals.NotificationsCallTracer.TraceDebug((long)this.GetHashCode(), "SearchNotificationHandler.SubscribeForSearchComplete Start"); if (base.IsDisposed) { return; } try { StoreObjectId storeObjectId = StoreId.GetStoreObjectId(searchContext.SearchFolderId); base.UserContext.LockAndReconnectMailboxSession(3000); if (base.Subscription != null) { MapiNotificationHandlerBase.DisposeXSOObjects(base.Subscription, base.UserContext); base.Subscription = null; } this.currentSearchContext = searchContext; base.Subscription = Subscription.Create(base.UserContext.MailboxSession, this.GetDefaultNotificationHandler(this.currentSearchContext), NotificationType.SearchComplete, storeObjectId); } catch (OwaLockTimeoutException ex) { ExTraceGlobals.CoreCallTracer.TraceError <string>((long)this.GetHashCode(), "User context lock timed out in SubscribeForSearchComplete. Exception: {0}", ex.Message); } finally { if (base.UserContext.MailboxSessionLockedByCurrentThread()) { base.UserContext.UnlockAndDisconnectMailboxSession(); } } }
// Token: 0x06000F5F RID: 3935 RVA: 0x0003BBE0 File Offset: 0x00039DE0 public static ItemType[] GetItemDataFromSearchFolder(OwaSearchContext searchContext, MailboxSession mailboxSession, out int totalRowCount) { List <ItemType> list = new List <ItemType>(50); totalRowCount = 0; StoreId searchFolderId = searchContext.SearchFolderId; SortBy[] searchSortBy = searchContext.SearchSortBy; using (SearchFolder searchFolder = SearchFolder.Bind(mailboxSession, searchFolderId)) { int rowCount = 25; using (QueryResult queryResult = searchFolder.ItemQuery(ItemQueryType.None, null, searchSortBy, SearchFolderItemDataRetriever.itemSearchPropertyDefinitions)) { bool flag = true; while (flag) { object[][] rows = queryResult.GetRows(rowCount, out flag); if (rows == null || rows.Length == 0) { break; } for (int i = 0; i < rows.Length; i++) { if (totalRowCount < 50) { ItemType itemFromDataRow = SearchFolderItemDataRetriever.GetItemFromDataRow(searchContext, mailboxSession, rows[i], SearchFolderItemDataRetriever.itemSearchPropertyDefinitionsOrderDictionary); list.Add(itemFromDataRow); } totalRowCount++; } } } } return(list.ToArray()); }
private static void FillItemDataInPayload(IMailboxContext userContext, OwaSearchContext searchContext, SearchNotificationPayload payload) { try { userContext.LockAndReconnectMailboxSession(3000); int serverSearchResultsRowCount = 0; if (searchContext.SearchContextType == SearchContextType.ItemSearch) { payload.MessageItems = SearchFolderItemDataRetriever.GetItemDataFromSearchFolder(searchContext, userContext.MailboxSession, out serverSearchResultsRowCount); } else if (searchContext.SearchContextType == SearchContextType.ConversationSearch) { payload.Conversations = SearchFolderConversationRetriever.GetConversationDataFromSearchFolder(searchContext, userContext.MailboxSession, out serverSearchResultsRowCount); } payload.ServerSearchResultsRowCount = serverSearchResultsRowCount; } catch (OwaLockTimeoutException ex) { ExTraceGlobals.CoreCallTracer.TraceError <string>(0L, "User context lock timed out in FillItemDataInPayload. Exception: {0}", ex.Message); } finally { if (userContext.MailboxSessionLockedByCurrentThread()) { userContext.UnlockAndDisconnectMailboxSession(); } } }
private StoreObjectId ResolveSearchFolderIdForFilteredView(StoreId inboxFolderId, OwaViewFilter viewFilter) { StoreObjectId storeObjectId = null; ExTraceGlobals.NotificationsCallTracer.TraceDebug <string>((long)this.GetHashCode(), "HierarchyNotificationHandler.ResolveSearchFolderIdForFilteredView Start. SubscriptionId: {0}", base.SubscriptionId); OwaSearchContext owaSearchContext = new OwaSearchContext(); owaSearchContext.ViewFilter = viewFilter; owaSearchContext.FolderIdToSearch = inboxFolderId; StoreObjectId defaultFolderId = base.UserContext.MailboxSession.GetDefaultFolderId(DefaultFolderType.SearchFolders); using (SearchFolder owaViewFilterSearchFolder = SearchUtil.GetOwaViewFilterSearchFolder(owaSearchContext, base.UserContext.MailboxSession, defaultFolderId, null, CallContext.Current)) { if (owaViewFilterSearchFolder == null) { throw new ArgumentNullException(string.Format("HierarchyNotificationHandler.ResolveSearchFolderIdForFilteredView null searchFolder returned for subscriptionId: {0}. ViewFilter: {1}; Source folder id: {2}", base.SubscriptionId, viewFilter, inboxFolderId.ToString())); } storeObjectId = owaViewFilterSearchFolder.StoreObjectId; ExTraceGlobals.NotificationsCallTracer.TraceDebug((long)this.GetHashCode(), "HierarchyNotificationHandler.ResolveSearchFolderIdForFilteredView found filtered-view search folder subscriptionId: {0} . ViewFilter: {1}; Source folder id: {2}, Search folder id: {3}", new object[] { base.SubscriptionId, viewFilter, inboxFolderId.ToString(), storeObjectId.ToString() }); } return(storeObjectId); }
// Token: 0x06000F5C RID: 3932 RVA: 0x0003B790 File Offset: 0x00039990 private static ConversationType GetConversationFromDataRow(OwaSearchContext searchContext, MailboxSession mailboxSession, object[] row, Dictionary <PropertyDefinition, int> orderDictionary) { ConversationType conversationType = new ConversationType(); conversationType.InstanceKey = SearchFolderDataRetrieverBase.GetItemProperty <byte[]>(row, orderDictionary[ItemSchema.InstanceKey], null); ConversationId itemProperty = SearchFolderDataRetrieverBase.GetItemProperty <ConversationId>(row, orderDictionary[ConversationItemSchema.ConversationId], null); conversationType.ConversationId = new ItemId(IdConverter.ConversationIdToEwsId(mailboxSession.MailboxGuid, itemProperty), null); conversationType.ConversationTopic = SearchFolderDataRetrieverBase.GetItemProperty <string>(row, orderDictionary[ConversationItemSchema.ConversationTopic]); conversationType.UniqueRecipients = SearchFolderDataRetrieverBase.GetItemProperty <string[]>(row, orderDictionary[ConversationItemSchema.ConversationMVTo]); conversationType.UniqueSenders = SearchFolderDataRetrieverBase.GetItemProperty <string[]>(row, orderDictionary[ConversationItemSchema.ConversationMVFrom]); conversationType.LastDeliveryTime = SearchFolderDataRetrieverBase.GetDateTimeProperty(searchContext.RequestTimeZone, row, orderDictionary[ConversationItemSchema.ConversationLastDeliveryTime]); conversationType.Categories = SearchFolderDataRetrieverBase.GetItemProperty <string[]>(row, orderDictionary[ConversationItemSchema.ConversationCategories]); if (SearchFolderDataRetrieverBase.IsPropertyDefined(row, orderDictionary[ConversationItemSchema.ConversationFlagStatus])) { FlagStatus itemProperty2 = (FlagStatus)SearchFolderDataRetrieverBase.GetItemProperty <int>(row, orderDictionary[ConversationItemSchema.ConversationFlagStatus], 0); if (itemProperty2 != FlagStatus.NotFlagged) { conversationType.FlagStatus = new FlagType { FlagStatus = itemProperty2 }.FlagStatus; } } conversationType.HasAttachments = new bool?(SearchFolderDataRetrieverBase.GetItemProperty <bool>(row, orderDictionary[ConversationItemSchema.ConversationHasAttach])); conversationType.HasIrm = new bool?(SearchFolderDataRetrieverBase.GetItemProperty <bool>(row, orderDictionary[ConversationItemSchema.ConversationHasIrm])); conversationType.MessageCount = new int?(SearchFolderDataRetrieverBase.GetItemProperty <int>(row, orderDictionary[ConversationItemSchema.ConversationMessageCount])); conversationType.GlobalMessageCount = new int?(SearchFolderDataRetrieverBase.GetItemProperty <int>(row, orderDictionary[ConversationItemSchema.ConversationGlobalMessageCount])); conversationType.UnreadCount = new int?(SearchFolderDataRetrieverBase.GetItemProperty <int>(row, orderDictionary[ConversationItemSchema.ConversationUnreadMessageCount])); conversationType.GlobalUnreadCount = new int?(SearchFolderDataRetrieverBase.GetItemProperty <int>(row, orderDictionary[ConversationItemSchema.ConversationGlobalUnreadMessageCount])); conversationType.Size = new int?(SearchFolderDataRetrieverBase.GetItemProperty <int>(row, orderDictionary[ConversationItemSchema.ConversationMessageSize])); conversationType.ItemClasses = SearchFolderDataRetrieverBase.GetItemProperty <string[]>(row, orderDictionary[ConversationItemSchema.ConversationMessageClasses]); conversationType.ImportanceString = ((ImportanceType)SearchFolderDataRetrieverBase.GetItemProperty <int>(row, orderDictionary[ConversationItemSchema.ConversationImportance], 1)).ToString(); StoreId[] itemProperty3 = SearchFolderDataRetrieverBase.GetItemProperty <StoreId[]>(row, orderDictionary[ConversationItemSchema.ConversationItemIds], new StoreId[0]); conversationType.ItemIds = Array.ConvertAll <StoreId, ItemId>(itemProperty3, (StoreId s) => new ItemId(SearchFolderDataRetrieverBase.GetEwsId(s, mailboxSession.MailboxGuid), null)); StoreId[] itemProperty4 = SearchFolderDataRetrieverBase.GetItemProperty <StoreId[]>(row, orderDictionary[ConversationItemSchema.ConversationGlobalItemIds], new StoreId[0]); conversationType.GlobalItemIds = Array.ConvertAll <StoreId, ItemId>(itemProperty4, (StoreId s) => new ItemId(SearchFolderDataRetrieverBase.GetEwsId(s, mailboxSession.MailboxGuid), null)); conversationType.LastModifiedTime = SearchFolderDataRetrieverBase.GetDateTimeProperty(searchContext.RequestTimeZone, row, orderDictionary[StoreObjectSchema.LastModifiedTime]); conversationType.Preview = SearchFolderDataRetrieverBase.GetItemProperty <string>(row, orderDictionary[ConversationItemSchema.ConversationPreview]); IconIndex itemProperty5 = (IconIndex)SearchFolderDataRetrieverBase.GetItemProperty <int>(row, orderDictionary[ConversationItemSchema.ConversationReplyForwardState]); if (itemProperty5 > (IconIndex)0) { conversationType.IconIndexString = itemProperty5.ToString(); } itemProperty5 = (IconIndex)SearchFolderDataRetrieverBase.GetItemProperty <int>(row, orderDictionary[ConversationItemSchema.ConversationGlobalReplyForwardState]); if (itemProperty5 > (IconIndex)0) { conversationType.GlobalIconIndexString = itemProperty5.ToString(); } return(conversationType); }
public void ProcessCallback(object owaContext) { OwaSearchContext owaSearchContext = owaContext as OwaSearchContext; if (owaSearchContext != null) { lock (base.SyncRoot) { base.MissedNotifications = false; base.NeedToReinitSubscriptions = false; this.SubscribeForSearchComplete(owaSearchContext); } } }
internal override void HandleNotificationInternal(Notification notif, MapiNotificationsLogEvent logEvent, object context) { if (notif == null) { return; } if ((notif.Type & NotificationType.SearchComplete) != NotificationType.SearchComplete) { ExTraceGlobals.CoreCallTracer.TraceDebug((long)this.GetHashCode(), "notification is not for search complete"); return; } OwaSearchContext localSearchContext = context as OwaSearchContext; if (localSearchContext == null) { ExTraceGlobals.CoreCallTracer.TraceDebug((long)this.GetHashCode(), "notification has not passed in context data"); throw new ArgumentNullException("context"); } ThreadPool.QueueUserWorkItem(delegate(object o) { lock (this.SyncRoot) { if (localSearchContext != this.currentSearchContext) { ExTraceGlobals.CoreCallTracer.TraceDebug((long)this.GetHashCode(), "Not sending search completed notification because the currentSearchContext and the localSearchContext are different"); return; } } SearchNotificationPayload payload = SearchNotificationHandler.SearchPayloadCreator.CreatePayLoad(this.UserContext, localSearchContext); lock (this.SyncRoot) { if (localSearchContext != this.currentSearchContext) { ExTraceGlobals.CoreCallTracer.TraceDebug((long)this.GetHashCode(), "Payload data calculated. Not sending the notification to the client because another search has been triggered"); } else { this.searchNotifier.Payload = payload; this.searchNotifier.PickupData(); } } }, null); }
// Token: 0x06000D22 RID: 3362 RVA: 0x0003109C File Offset: 0x0002F29C private void CreateSubscriptionForFilteredView() { ExTraceGlobals.NotificationsCallTracer.TraceDebug <string>((long)this.GetHashCode(), "RowNotificationHandler.CreateSubscriptionForFilteredView Start. SubscriptionId: {0}", base.SubscriptionId); OwaSearchContext owaSearchContext = new OwaSearchContext(); owaSearchContext.ViewFilter = (OwaViewFilter)SearchUtil.GetViewFilterForSearchFolder(this.viewFilter, this.clutterFilter); owaSearchContext.SearchFolderId = this.searchFolderId; owaSearchContext.FolderIdToSearch = this.folderId; owaSearchContext.RequestTimeZone = this.timeZone; owaSearchContext.FromFilter = this.fromFilter; StoreObjectId defaultFolderId = base.UserContext.MailboxSession.GetDefaultFolderId(DefaultFolderType.SearchFolders); using (SearchFolder owaViewFilterSearchFolder = SearchUtil.GetOwaViewFilterSearchFolder(owaSearchContext, base.UserContext.MailboxSession, defaultFolderId, this.sortBy, CallContext.Current)) { if (owaViewFilterSearchFolder == null) { throw new ArgumentNullException(string.Format("RowNotificationHandler::CreateSubscriptionForFilteredView - null searchFolder returned for subscriptionId: {0}. ViewFilter: {1}; Source folder id: {2}", base.SubscriptionId, this.viewFilter, this.SubscriptionParameters.FolderId.ToString())); } ExTraceGlobals.NotificationsCallTracer.TraceDebug <string, ViewFilter, string>((long)this.GetHashCode(), "RowNotificationHandler.CreateSubscriptionForFilteredView create filtered view subscriptionId: {0} . ViewFilter: {1}; Source folder id: {2}", base.SubscriptionId, this.viewFilter, this.SubscriptionParameters.FolderId); this.searchFolderId = owaSearchContext.SearchFolderId; this.CreateSubscription(owaViewFilterSearchFolder); } }
// Token: 0x06000F60 RID: 3936 RVA: 0x0003BCB8 File Offset: 0x00039EB8 private static ItemType GetItemFromDataRow(OwaSearchContext searchContext, MailboxSession mailboxSession, object[] row, Dictionary <PropertyDefinition, int> orderDictionary) { StoreId itemProperty = SearchFolderDataRetrieverBase.GetItemProperty <StoreId>(row, orderDictionary[ItemSchema.Id], null); StoreObjectId storeObjectId = StoreId.GetStoreObjectId(itemProperty); ItemType itemType = ItemType.CreateFromStoreObjectType(storeObjectId.ObjectType); itemType.ItemId = SearchFolderDataRetrieverBase.StoreIdToEwsItemId(itemProperty, new MailboxId(mailboxSession.MailboxGuid, false)); byte[] itemProperty2 = SearchFolderDataRetrieverBase.GetItemProperty <byte[]>(row, orderDictionary[ItemSchema.InstanceKey], new byte[0]); itemType.InstanceKey = itemProperty2; itemType.InstanceKeyString = Convert.ToBase64String(itemProperty2); itemType.ParentFolderId = new FolderId(SearchFolderDataRetrieverBase.GetEwsId(SearchFolderDataRetrieverBase.GetItemProperty <StoreId>(row, orderDictionary[StoreObjectSchema.ParentItemId], null), mailboxSession.MailboxGuid), null); itemType.ConversationId = new ItemId(IdConverter.ConversationIdToEwsId(mailboxSession.MailboxGuid, SearchFolderDataRetrieverBase.GetItemProperty <ConversationId>(row, orderDictionary[ItemSchema.ConversationId], null)), null); itemType.Subject = SearchFolderDataRetrieverBase.GetItemProperty <string>(row, orderDictionary[ItemSchema.Subject], string.Empty); itemType.ImportanceString = SearchFolderDataRetrieverBase.GetItemProperty <Importance>(row, orderDictionary[ItemSchema.Importance], Importance.Normal).ToString(); itemType.SensitivityString = SearchFolderDataRetrieverBase.GetItemProperty <Sensitivity>(row, orderDictionary[ItemSchema.Sensitivity], Sensitivity.Normal).ToString(); string dateTimeProperty = SearchFolderDataRetrieverBase.GetDateTimeProperty(searchContext.RequestTimeZone, row, orderDictionary[ItemSchema.ReceivedTime]); if (!string.IsNullOrEmpty(dateTimeProperty)) { itemType.DateTimeReceived = dateTimeProperty; } string dateTimeProperty2 = SearchFolderDataRetrieverBase.GetDateTimeProperty(searchContext.RequestTimeZone, row, orderDictionary[ItemSchema.SentTime]); if (!string.IsNullOrEmpty(dateTimeProperty2)) { itemType.DateTimeSent = dateTimeProperty2; } itemType.HasAttachments = new bool?(SearchFolderDataRetrieverBase.GetItemProperty <bool>(row, orderDictionary[ItemSchema.HasAttachment], false)); itemType.IsDraft = new bool?(SearchFolderDataRetrieverBase.GetItemProperty <bool>(row, orderDictionary[MessageItemSchema.IsDraft], false)); itemType.ItemClass = SearchFolderDataRetrieverBase.GetItemProperty <string>(row, orderDictionary[StoreObjectSchema.ItemClass], string.Empty); itemType.Preview = SearchFolderDataRetrieverBase.GetItemProperty <string>(row, orderDictionary[ItemSchema.Preview], string.Empty); MessageType messageType = itemType as MessageType; if (messageType != null) { Participant itemProperty3 = SearchFolderDataRetrieverBase.GetItemProperty <Participant>(row, orderDictionary[ItemSchema.From], null); if (itemProperty3 != null) { messageType.From = RowNotificationHandler.CreateRecipientFromParticipant(itemProperty3); } Participant itemProperty4 = SearchFolderDataRetrieverBase.GetItemProperty <Participant>(row, orderDictionary[ItemSchema.Sender], null); if (itemProperty4 != null) { messageType.Sender = RowNotificationHandler.CreateRecipientFromParticipant(itemProperty4); } messageType.IsRead = new bool?(SearchFolderDataRetrieverBase.GetItemProperty <bool>(row, orderDictionary[MessageItemSchema.IsRead], false)); } IconIndex itemProperty5 = SearchFolderDataRetrieverBase.GetItemProperty <IconIndex>(row, orderDictionary[ItemSchema.IconIndex], IconIndex.Default); if (itemProperty5 != IconIndex.Default) { itemType.IconIndexString = itemProperty5.ToString(); } FlagType flagType = new FlagType(); itemType.Flag = flagType; flagType.FlagStatus = SearchFolderDataRetrieverBase.GetItemProperty <FlagStatus>(row, orderDictionary[ItemSchema.FlagStatus], FlagStatus.NotFlagged); itemType.DateTimeCreated = SearchFolderDataRetrieverBase.GetDateTimeProperty(searchContext.RequestTimeZone, row, orderDictionary[StoreObjectSchema.CreationTime]); itemType.LastModifiedTime = SearchFolderDataRetrieverBase.GetDateTimeProperty(searchContext.RequestTimeZone, row, orderDictionary[StoreObjectSchema.LastModifiedTime]); itemType.Size = SearchFolderDataRetrieverBase.GetItemProperty <int?>(row, orderDictionary[ItemSchema.Size], null); itemType.DisplayTo = SearchFolderDataRetrieverBase.GetItemProperty <string>(row, orderDictionary[ItemSchema.DisplayTo], null); itemType.Categories = SearchFolderDataRetrieverBase.GetItemProperty <string[]>(row, orderDictionary[ItemSchema.Categories], null); return(itemType); }
public static SearchNotificationPayload CreatePayLoad(IMailboxContext userContext, OwaSearchContext searchContext) { SearchNotificationPayload payload = new SearchNotificationPayload(); payload.ClientId = searchContext.ClientSearchFolderIdentity; payload.IsComplete = true; payload.Source = MailboxLocation.FromMailboxContext(userContext); SearchNotificationHandler.SearchPayloadCreator.SetHighlightTerms(payload, searchContext.HighlightTerms); try { OwaDiagnostics.SendWatsonReportsForGrayExceptions(delegate() { SearchNotificationHandler.SearchPayloadCreator.FillItemDataInPayload(userContext, searchContext, payload); }); } catch (GrayException arg) { payload.ServerSearchResultsRowCount = -1; ExTraceGlobals.NotificationsCallTracer.TraceError <GrayException>(0L, "MapiNotificationHandlerBase.CreatePayLoad Unable to create payload with data for search results. exception {0}", arg); } return(payload); }