public static IAsyncResult BeginSearch <T>(GoogleSearchRequest request, int resultCount, AsyncCallback callback, object state)
        {
            var searchAsyncResult = new SearchAsyncResult <T>(state);

            RunSearch(searchAsyncResult, request, 0, resultCount, callback);

            return(searchAsyncResult);
        }
예제 #2
0
        internal List <TResult> Search <T, TResult>(GoogleSearchRequest request, int resultCount)
            where T : TResult
        {
            this.SetValueTo(request);

            var list = SearchUtility.Search <T>(request, resultCount);

            return(list.ConvertAll(item => (TResult)item));
        }
        private static void RunSearch <T>(SearchAsyncResult <T> searchAsyncResult, GoogleSearchRequest request, int start, int restCount, AsyncCallback callback)
        {
            if (restCount > 0)
            {
                var resultSize = restCount > 4 ? ResultSize.Large : ResultSize.Small;

                BeginGetResponseData(
                    request,
                    start,
                    resultSize,
                    ar =>
                {
                    try
                    {
                        ISearchData <T> searchData;
                        try
                        {
                            searchData = EndGetResponseData <T>(ar);
                        }
                        catch (GoogleServiceException ex)
                        {
                            if (ex.ResponseStatus == ResponseStatusConstant.OutOfRangeStatus)
                            {
                                FinishSearch(searchAsyncResult, callback);
                                return;
                            }

                            throw;
                        }

                        var count = Math.Min(searchData.Results.Length, restCount);

                        if (count == 0)
                        {
                            FinishSearch(searchAsyncResult, callback);
                        }
                        else
                        {
                            searchAsyncResult.Result.AddRange(searchData.Results.Take(count));

                            RunSearch(searchAsyncResult, request, start + count, restCount - count, callback);
                        }
                    }
                    catch (Exception ex)
                    {
                        searchAsyncResult.Exception = ex;
                        FinishSearch(searchAsyncResult, callback);
                    }
                },
                    null);
            }
            else
            {
                FinishSearch(searchAsyncResult, callback);
            }
        }
        public static List <T> Search <T>(GoogleSearchRequest request, int resultCount)
        {
            var start     = 0;
            var results   = new List <T>();
            var restCount = resultCount;

            while (restCount > 0)
            {
                ISearchData <T> searchData;
                try
                {
                    if (restCount > 4)
                    {
                        searchData = GetResponseData <T>(request, start, ResultSize.Large);
                    }
                    else
                    {
                        searchData = GetResponseData <T>(request, start, ResultSize.Small);
                    }
                }
                catch (GoogleServiceException ex)
                {
                    if (ex.ResponseStatus == ResponseStatusConstant.OutOfRangeStatus)
                    {
                        return(results);
                    }

                    throw;
                }

                var count = searchData.Results.Length;
                if (count == 0)
                {
                    break;
                }

                if (count <= restCount)
                {
                    results.AddRange(searchData.Results);
                }
                else
                {
                    count = restCount;
                    for (var i = 0; i < count; ++i)
                    {
                        results.Add(searchData.Results[i]);
                    }
                }

                start     += count;
                restCount -= count;
            }

            return(results);
        }
 private static ISearchData <T> GetResponseData <T>(GoogleSearchRequest request, int start, string resultSize)
 {
     ResetRequest(request, start, resultSize);
     return(RequestUtility.GetResponseData <SearchData <T> >(request));
 }
 private static void ResetRequest(GoogleSearchRequest request, int start, string resultSize)
 {
     request.Reset();
     request.Start      = start;
     request.ResultSize = resultSize;
 }
 private static IAsyncResult BeginGetResponseData(GoogleSearchRequest request, int start, string resultSize, AsyncCallback callback, object state)
 {
     ResetRequest(request, start, resultSize);
     return(RequestUtility.BeginGetResponseData(request, callback, state));
 }
예제 #8
0
        internal IAsyncResult BeginSearch <T>(GoogleSearchRequest request, int resultCount, AsyncCallback callback, object state)
        {
            this.SetValueTo(request);

            return(SearchUtility.BeginSearch <T>(request, resultCount, callback, state));
        }