Chromium Code Reviews| Index: content/browser/download/download_query.h |
| diff --git a/content/browser/download/download_query.h b/content/browser/download/download_query.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..252e339e44877da11125bf4ff963ee1bdd33598f |
| --- /dev/null |
| +++ b/content/browser/download/download_query.h |
| @@ -0,0 +1,166 @@ |
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#ifndef CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_QUERY_H_ |
| +#define CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_QUERY_H_ |
| +#pragma once |
| + |
| +#include <map> |
| +#include <string> |
| +#include <vector> |
| + |
| +#include "base/callback.h" |
| +#include "base/stl_util.h" |
| +#include "content/browser/download/download_item.h" |
| + |
| +namespace download_util { |
| + |
| +// Filter and sort a vector of DownloadItem*s. See also the macros at the bottom |
| +// of this file. |
| +// |
| +// DownloadQuery query; |
| +// CHECK(query.Set("startTime", 0)); |
|
asanka
2011/10/20 19:29:16
Nit: Field names aren't strings.
|
| +// bool FilterOutOddDownloads(DownloadItem* item) { |
| +// return 0 == (item->id() % 2); |
| +// } |
| +// CHECK(query.Set("filter", base::Bind(&FilterOutOddDownloads))); |
| +// CHECK(query.OrderBy("-startTime id error")); |
| +// query.Limit(20); |
| +// DownloadItems all_items, results; |
| +// query.Search(all_items.begin(), all_items.end(), &results); |
| +class DownloadQuery { |
| + public: |
| + typedef std::vector<DownloadItem*> DownloadItems; |
|
cbentzel
2011/10/20 18:18:53
Should this be DownloadItemInterface?
|
| + |
| + DownloadQuery(); |
| + ~DownloadQuery(); |
| + |
| + enum FilterFieldName { |
| + FILTER_FIELD_BYTES_RECEIVED, |
| + FILTER_FIELD_DANGER, |
| + FILTER_FIELD_DANGER_ACCEPTED, |
| + FILTER_FIELD_ENDED_AFTER, |
| + FILTER_FIELD_ENDED_BEFORE, |
| + FILTER_FIELD_END_TIME, |
| + FILTER_FIELD_ERROR, |
| + FILTER_FIELD_FILENAME, |
| + FILTER_FIELD_FILENAME_REGEX, |
| + FILTER_FIELD_FILE_SIZE, |
| + FILTER_FIELD_FILE_SIZE_GREATER, |
| + FILTER_FIELD_FILE_SIZE_LESS, |
| + FILTER_FIELD_FILTER, |
| + FILTER_FIELD_MIME, |
| + FILTER_FIELD_PAUSED, |
| + FILTER_FIELD_QUERY, |
| + FILTER_FIELD_STARTED_AFTER, |
| + FILTER_FIELD_STARTED_BEFORE, |
| + FILTER_FIELD_START_TIME, |
| + FILTER_FIELD_STATE, |
| + FILTER_FIELD_TOTAL_BYTES, |
| + FILTER_FIELD_TOTAL_BYTES_GREATER, |
| + FILTER_FIELD_TOTAL_BYTES_LESS, |
| + FILTER_FIELD_URL, |
| + FILTER_FIELD_URL_REGEX, |
| + }; |
| + |
| + // Returns false if |name| is unrecognized or if |value| is the wrong type or |
| + // malformed. Returns true and sets the filter field named |name| to |value| |
| + // otherwise. See the implementation for the type of each |name|. (DRY.) |
| + template <typename ValueType> |
| + bool Set(FilterFieldName name, const ValueType& value); |
| + |
| + enum SortFieldName { |
| + SORT_FIELD_BYTES_RECEIVED, |
| + SORT_FIELD_DANGER, |
| + SORT_FIELD_DANGER_ACCEPTED, |
| + SORT_FIELD_END_TIME, |
| + SORT_FIELD_ERROR, |
| + SORT_FIELD_FILENAME, |
| + SORT_FIELD_FILE_SIZE, |
| + SORT_FIELD_MIME, |
| + SORT_FIELD_PAUSED, |
| + SORT_FIELD_START_TIME, |
| + SORT_FIELD_STATE, |
| + SORT_FIELD_TOTAL_BYTES, |
| + SORT_FIELD_URL, |
| + }; |
| + |
| + struct OrderTerm { |
| + OrderTerm(SortFieldName field_name, bool ascending_) |
| + : name(field_name), |
| + ascending(ascending_) { |
| + } |
| + SortFieldName name; |
| + bool ascending; |
| + }; |
| + typedef std::vector<OrderTerm> OrderTerms; |
| + |
| + // Copy |order_by| so that Search() can use it to sort results. |
| + void OrderBy(const OrderTerms& order_by) { |
| + order_by_fields_.assign(order_by.begin(), order_by.end()); |
| + } |
| + |
| + // Remember to limit the size of search results to |limit|. |
| + void Limit(uint32 limit) { limit_ = limit; } |
| + |
| + // Filters DownloadItem*s from |iter| to |last| into |results|, sorts |
| + // |results|, and limits the size of |results|. |results| must be non-NULL. |
| + template <typename InputIterator> |
| + void Search(InputIterator iter, const InputIterator last, |
| + DownloadItems* results) const; |
| + |
| + // Returns true if |item| matches all set filter fields; returns false if any |
| + // filter fields have been set that the item does not match. |
| + bool Matches(const DownloadItem& item) const; |
| + |
| + // Ignore these mostly-private interfaces. |
| + class SortFieldInterface; |
| + class FilterFieldInterface; |
| + typedef std::map<SortFieldName, SortFieldInterface*> SortFields; |
| + typedef std::map<FilterFieldName, FilterFieldInterface*> FilterFields; |
| + |
| + private: |
| + void SetSortField(SortFieldName name, SortFieldInterface* field); |
| + void SetFilterField(FilterFieldName name, FilterFieldInterface* field); |
| + |
| + SortFields sort_fields_; |
| + FilterFields filter_fields_; |
| + OrderTerms order_by_fields_; |
| + uint32 limit_; |
| + STLValueDeleter<SortFields> delete_sort_fields_; |
| + STLValueDeleter<FilterFields> delete_filter_fields_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(DownloadQuery); |
| +}; |
| +} // namespace download_util |
| + |
| + |
| +// The following macros facilitate using anonymous expressions (lambdas) to |
| +// implement arbitrary filters for DownloadQuery. The parameters passed to the |
| +// second and third forms MUST be variable names and cannot be expressions or |
| +// even lvalues. |
| +// |
| +// query.Set("filter", DOWNLOAD_QUERY_FILTER2(otr, foo, |
|
asanka
2011/10/20 19:29:16
Nit: Field name isn't a string.
|
| +// item.otr() == otr && item.foo() == foo)); |
| + |
| +#define SYMCAT(X, Y) X##Y |
| +#define DOWNLOAD_QUERY_FILTER_IMPL(NAME, expr) \ |
| + ({struct NAME {static bool Filter(const DownloadItem& item) {return expr;}}; \ |
| + base::Bind(&NAME::Filter);}) |
| +#define DOWNLOAD_QUERY_FILTER1_IMPL(NAME, var0, expr) \ |
| + ({template<typename Var0Type>struct NAME {static bool Filter( \ |
| + Var0Type var0, const DownloadItem& item) {return expr;}}; \ |
| + base::Bind(&NAME::Filter, var0);}) |
| +#define DOWNLOAD_QUERY_FILTER2_IMPL(NAME, var0, var1, expr) \ |
| + ({template<typename Var0Type, Var1Type>struct NAME {static bool Filter( \ |
| + Var0Type var0, Var1Type var1, const DownloadItem& item) {return expr;}}; \ |
| + base::Bind(&NAME::Filter, var0, var1);}) |
| +#define DOWNLOAD_QUERY_FILTER(expr) DOWNLOAD_QUERY_FILTER_IMPL( \ |
| + SYMCAT(DownloadQueryFilter, __LINE__), (expr)) |
| +#define DOWNLOAD_QUERY_FILTER1(var0, expr) DOWNLOAD_QUERY_FILTER1_IMPL( \ |
| + SYMCAT(DownloadQueryFilter, __LINE__), var0, (expr)) |
| +#define DOWNLOAD_QUERY_FILTER2(var0, var1, expr) DOWNLOAD_QUERY_FILTER2_IMPL( \ |
| + SYMCAT(DownloadQueryFilter, __LINE__), var0, var1, (expr)) |
| + |
| +#endif // CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_QUERY_H_ |