Beispiel #1
0
        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;
        }
Beispiel #2
0
        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);
                });
            }
        }