public void Search() { if (_lastDocumentsRequest != null) { _lastDocumentsRequest.Cancel(); } var text = Text.Trim(); if (string.IsNullOrEmpty(text)) { LazyItems.Clear(); Items.Clear(); Status = string.IsNullOrEmpty(Text) ? AppResources.SearchAmongYourFiles : AppResources.NoResults; return; } SearchDocumentsRequest nextDocumentsRequest; if (!_searchResultsCache.TryGetValue(text, out nextDocumentsRequest)) { IList <TLMessageBase> source; if (_lastDocumentsRequest != null && text.IndexOf(_lastDocumentsRequest.Text, StringComparison.OrdinalIgnoreCase) != -1) { source = _lastDocumentsRequest.Source; } else { source = _source; } nextDocumentsRequest = new SearchDocumentsRequest(CurrentItem.ToInputPeer(), text, source); } IsWorking = true; nextDocumentsRequest.ProcessAsync(results => Telegram.Api.Helpers.Execute.BeginOnUIThread(() => { if (nextDocumentsRequest.IsCanceled) { return; } Status = results.Count > 0 ? string.Empty : Status; Items.Clear(); LazyItems.Clear(); for (var i = 0; i < results.Count; i++) { if (i < 6) { Items.Add((TLMessage)results[i]); } else { LazyItems.Add((TLMessage)results[i]); } } IsWorking = false; NotifyOfPropertyChange(() => IsEmptyList); if (LazyItems.Count > 0) { PopulateItems(() => ProcessGlobalSearch(nextDocumentsRequest)); } else { ProcessGlobalSearch(nextDocumentsRequest); } })); _searchResultsCache[nextDocumentsRequest.Text] = nextDocumentsRequest; _lastDocumentsRequest = nextDocumentsRequest; }
private void ProcessGlobalSearch(SearchDocumentsRequest nextDocumentsRequest) { if (nextDocumentsRequest.GlobalResults != null) { if (nextDocumentsRequest.GlobalResults.Count > 0) { BeginOnUIThread(() => { if (nextDocumentsRequest.IsCanceled) { return; } foreach (var result in nextDocumentsRequest.GlobalResults) { Items.Add((TLMessage)result); } NotifyOfPropertyChange(() => IsEmptyList); Status = Items.Count > 0 ? string.Empty : AppResources.NoResults; }); } } else { IsWorking = true; MTProtoService.SearchAsync( nextDocumentsRequest.InputPeer, new TLString(nextDocumentsRequest.Text), null, InputMessageFilter, new TLInt(0), new TLInt(0), new TLInt(0), new TLInt(0), new TLInt(100), new TLInt(0), result => { IsWorking = false; nextDocumentsRequest.GlobalResults = new List <TLMessageBase>(result.Messages.Count); foreach (var message in result.Messages) { if (nextDocumentsRequest.ResultsIndex == null || !nextDocumentsRequest.ResultsIndex.ContainsKey(message.Index)) { nextDocumentsRequest.GlobalResults.Add(message); } } BeginOnUIThread(() => { if (nextDocumentsRequest.IsCanceled) { return; } if (nextDocumentsRequest.GlobalResults.Count > 0) { foreach (var message in nextDocumentsRequest.GlobalResults) { Items.Add((TLMessage)message); } NotifyOfPropertyChange(() => IsEmptyList); } Status = Items.Count > 0 ? string.Empty : AppResources.NoResults; }); }, error => { IsWorking = false; if (TLRPCError.CodeEquals(error, ErrorCode.BAD_REQUEST) && TLRPCError.TypeEquals(error, ErrorType.QUERY_TOO_SHORT)) { nextDocumentsRequest.GlobalResults = new List <TLMessageBase>(); } else if (TLRPCError.CodeEquals(error, ErrorCode.FLOOD)) { nextDocumentsRequest.GlobalResults = new List <TLMessageBase>(); BeginOnUIThread(() => MessageBox.Show(AppResources.FloodWaitString + Environment.NewLine + "(" + error.Message + ")", AppResources.Error, MessageBoxButton.OK)); } Execute.ShowDebugMessage("messages.search error " + error); }); } }