public SearchResultsList Search(
            SearchWidgetConfiguration configuration,
            [Documentation(Name = "Query", Type = typeof(string)),
             Documentation(Name = "PageIndex", Type = typeof(int)),
             Documentation(Name = "PageSize", Type = typeof(int))]
            IDictionary options)
        {
            var provider    = Provider(configuration.ProviderId);
            var credentials = provider.Authentication;
            Dictionary <string, string> parameters;
            string openSearchUrl;

            if (options != null && options["PageIndex"] == null)
            {
                var allresults = new SearchResultsList {
                    Items = new List <SearchResult>()
                };

                int       index    = 0;
                const int maxIndex = 10;
                int       pageSize = 100;
                if (options["PageSize"] != null)
                {
                    int.TryParse(options["PageSize"].ToString(), out pageSize);
                }
                options["PageSize"] = pageSize;
                SearchResultsList current;
                do
                {
                    options["PageIndex"] = index;
                    parameters           = SearchParametersAdapter(options);
                    openSearchUrl        = Specification.ParseUrl(provider.OpenSearchUrl, parameters);
                    try
                    {
                        current = ExecuteSearch(openSearchUrl, credentials, configuration);
                        allresults.Items.AddRange(current.GetItems());
                    }
                    catch (WebException)
                    {
                        // format of xml file is invalid
                        return(allresults);
                    }
                    index++;
                }while (current.GetItems().Count >= pageSize && index < maxIndex);
                return(allresults);
            }
            parameters    = SearchParametersAdapter(options);
            openSearchUrl = Specification.ParseUrl(provider.OpenSearchUrl, parameters);
            try
            {
                SearchResultsList results = ExecuteSearch(openSearchUrl, credentials, configuration);
                //this.CurrentResults = results;
                return(results);
            }
            catch (WebException)
            {
                // format of xml file is invalid
                return(null);
            }
        }
        public string Url(
            SearchProvider provider,
            SearchWidgetConfiguration configuration,
            [Documentation(Name = "Query", Type = typeof(string)),
             Documentation(Name = "PageIndex", Type = typeof(string)),
             Documentation(Name = "PageSize", Type = typeof(string))]
            IDictionary options)
        {
            var specification = new OpenSearchSpecification(new OpenSearchV1_1());
            var parameters    = SearchParametersAdapter(options);

            return(!String.IsNullOrEmpty(provider.MoreResultsUrl) && configuration.ShowMoreResultsLink ? specification.ParseUrl(provider.MoreResultsUrl, parameters) : null);
        }
        private SearchResultsList ExecuteSearch(string url, Authentication credentials, SearchWidgetConfiguration configuration)
        {
            var xmlResponse = GetResponse(url, credentials);

            return(new SearchResultsList(xmlResponse));
        }