Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_QUERY_H_ | |
| 6 #define CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_QUERY_H_ | |
| 7 #pragma once | |
| 8 | |
| 9 #include <map> | |
| 10 #include <string> | |
| 11 #include <vector> | |
| 12 | |
| 13 #include "base/callback.h" | |
| 14 #include "base/stl_util.h" | |
| 15 #include "content/browser/download/download_item.h" | |
| 16 | |
| 17 namespace download_util { | |
| 18 | |
| 19 // Filter and sort a vector of DownloadItem*s. See also the macros at the bottom | |
| 20 // of this file. | |
| 21 // | |
| 22 // DownloadQuery query; | |
| 23 // CHECK(query.Set("startTime", 0)); | |
|
asanka
2011/10/20 19:29:16
Nit: Field names aren't strings.
| |
| 24 // bool FilterOutOddDownloads(DownloadItem* item) { | |
| 25 // return 0 == (item->id() % 2); | |
| 26 // } | |
| 27 // CHECK(query.Set("filter", base::Bind(&FilterOutOddDownloads))); | |
| 28 // CHECK(query.OrderBy("-startTime id error")); | |
| 29 // query.Limit(20); | |
| 30 // DownloadItems all_items, results; | |
| 31 // query.Search(all_items.begin(), all_items.end(), &results); | |
| 32 class DownloadQuery { | |
| 33 public: | |
| 34 typedef std::vector<DownloadItem*> DownloadItems; | |
|
cbentzel
2011/10/20 18:18:53
Should this be DownloadItemInterface?
| |
| 35 | |
| 36 DownloadQuery(); | |
| 37 ~DownloadQuery(); | |
| 38 | |
| 39 enum FilterFieldName { | |
| 40 FILTER_FIELD_BYTES_RECEIVED, | |
| 41 FILTER_FIELD_DANGER, | |
| 42 FILTER_FIELD_DANGER_ACCEPTED, | |
| 43 FILTER_FIELD_ENDED_AFTER, | |
| 44 FILTER_FIELD_ENDED_BEFORE, | |
| 45 FILTER_FIELD_END_TIME, | |
| 46 FILTER_FIELD_ERROR, | |
| 47 FILTER_FIELD_FILENAME, | |
| 48 FILTER_FIELD_FILENAME_REGEX, | |
| 49 FILTER_FIELD_FILE_SIZE, | |
| 50 FILTER_FIELD_FILE_SIZE_GREATER, | |
| 51 FILTER_FIELD_FILE_SIZE_LESS, | |
| 52 FILTER_FIELD_FILTER, | |
| 53 FILTER_FIELD_MIME, | |
| 54 FILTER_FIELD_PAUSED, | |
| 55 FILTER_FIELD_QUERY, | |
| 56 FILTER_FIELD_STARTED_AFTER, | |
| 57 FILTER_FIELD_STARTED_BEFORE, | |
| 58 FILTER_FIELD_START_TIME, | |
| 59 FILTER_FIELD_STATE, | |
| 60 FILTER_FIELD_TOTAL_BYTES, | |
| 61 FILTER_FIELD_TOTAL_BYTES_GREATER, | |
| 62 FILTER_FIELD_TOTAL_BYTES_LESS, | |
| 63 FILTER_FIELD_URL, | |
| 64 FILTER_FIELD_URL_REGEX, | |
| 65 }; | |
| 66 | |
| 67 // Returns false if |name| is unrecognized or if |value| is the wrong type or | |
| 68 // malformed. Returns true and sets the filter field named |name| to |value| | |
| 69 // otherwise. See the implementation for the type of each |name|. (DRY.) | |
| 70 template <typename ValueType> | |
| 71 bool Set(FilterFieldName name, const ValueType& value); | |
| 72 | |
| 73 enum SortFieldName { | |
| 74 SORT_FIELD_BYTES_RECEIVED, | |
| 75 SORT_FIELD_DANGER, | |
| 76 SORT_FIELD_DANGER_ACCEPTED, | |
| 77 SORT_FIELD_END_TIME, | |
| 78 SORT_FIELD_ERROR, | |
| 79 SORT_FIELD_FILENAME, | |
| 80 SORT_FIELD_FILE_SIZE, | |
| 81 SORT_FIELD_MIME, | |
| 82 SORT_FIELD_PAUSED, | |
| 83 SORT_FIELD_START_TIME, | |
| 84 SORT_FIELD_STATE, | |
| 85 SORT_FIELD_TOTAL_BYTES, | |
| 86 SORT_FIELD_URL, | |
| 87 }; | |
| 88 | |
| 89 struct OrderTerm { | |
| 90 OrderTerm(SortFieldName field_name, bool ascending_) | |
| 91 : name(field_name), | |
| 92 ascending(ascending_) { | |
| 93 } | |
| 94 SortFieldName name; | |
| 95 bool ascending; | |
| 96 }; | |
| 97 typedef std::vector<OrderTerm> OrderTerms; | |
| 98 | |
| 99 // Copy |order_by| so that Search() can use it to sort results. | |
| 100 void OrderBy(const OrderTerms& order_by) { | |
| 101 order_by_fields_.assign(order_by.begin(), order_by.end()); | |
| 102 } | |
| 103 | |
| 104 // Remember to limit the size of search results to |limit|. | |
| 105 void Limit(uint32 limit) { limit_ = limit; } | |
| 106 | |
| 107 // Filters DownloadItem*s from |iter| to |last| into |results|, sorts | |
| 108 // |results|, and limits the size of |results|. |results| must be non-NULL. | |
| 109 template <typename InputIterator> | |
| 110 void Search(InputIterator iter, const InputIterator last, | |
| 111 DownloadItems* results) const; | |
| 112 | |
| 113 // Returns true if |item| matches all set filter fields; returns false if any | |
| 114 // filter fields have been set that the item does not match. | |
| 115 bool Matches(const DownloadItem& item) const; | |
| 116 | |
| 117 // Ignore these mostly-private interfaces. | |
| 118 class SortFieldInterface; | |
| 119 class FilterFieldInterface; | |
| 120 typedef std::map<SortFieldName, SortFieldInterface*> SortFields; | |
| 121 typedef std::map<FilterFieldName, FilterFieldInterface*> FilterFields; | |
| 122 | |
| 123 private: | |
| 124 void SetSortField(SortFieldName name, SortFieldInterface* field); | |
| 125 void SetFilterField(FilterFieldName name, FilterFieldInterface* field); | |
| 126 | |
| 127 SortFields sort_fields_; | |
| 128 FilterFields filter_fields_; | |
| 129 OrderTerms order_by_fields_; | |
| 130 uint32 limit_; | |
| 131 STLValueDeleter<SortFields> delete_sort_fields_; | |
| 132 STLValueDeleter<FilterFields> delete_filter_fields_; | |
| 133 | |
| 134 DISALLOW_COPY_AND_ASSIGN(DownloadQuery); | |
| 135 }; | |
| 136 } // namespace download_util | |
| 137 | |
| 138 | |
| 139 // The following macros facilitate using anonymous expressions (lambdas) to | |
| 140 // implement arbitrary filters for DownloadQuery. The parameters passed to the | |
| 141 // second and third forms MUST be variable names and cannot be expressions or | |
| 142 // even lvalues. | |
| 143 // | |
| 144 // query.Set("filter", DOWNLOAD_QUERY_FILTER2(otr, foo, | |
|
asanka
2011/10/20 19:29:16
Nit: Field name isn't a string.
| |
| 145 // item.otr() == otr && item.foo() == foo)); | |
| 146 | |
| 147 #define SYMCAT(X, Y) X##Y | |
| 148 #define DOWNLOAD_QUERY_FILTER_IMPL(NAME, expr) \ | |
| 149 ({struct NAME {static bool Filter(const DownloadItem& item) {return expr;}}; \ | |
| 150 base::Bind(&NAME::Filter);}) | |
| 151 #define DOWNLOAD_QUERY_FILTER1_IMPL(NAME, var0, expr) \ | |
| 152 ({template<typename Var0Type>struct NAME {static bool Filter( \ | |
| 153 Var0Type var0, const DownloadItem& item) {return expr;}}; \ | |
| 154 base::Bind(&NAME::Filter, var0);}) | |
| 155 #define DOWNLOAD_QUERY_FILTER2_IMPL(NAME, var0, var1, expr) \ | |
| 156 ({template<typename Var0Type, Var1Type>struct NAME {static bool Filter( \ | |
| 157 Var0Type var0, Var1Type var1, const DownloadItem& item) {return expr;}}; \ | |
| 158 base::Bind(&NAME::Filter, var0, var1);}) | |
| 159 #define DOWNLOAD_QUERY_FILTER(expr) DOWNLOAD_QUERY_FILTER_IMPL( \ | |
| 160 SYMCAT(DownloadQueryFilter, __LINE__), (expr)) | |
| 161 #define DOWNLOAD_QUERY_FILTER1(var0, expr) DOWNLOAD_QUERY_FILTER1_IMPL( \ | |
| 162 SYMCAT(DownloadQueryFilter, __LINE__), var0, (expr)) | |
| 163 #define DOWNLOAD_QUERY_FILTER2(var0, var1, expr) DOWNLOAD_QUERY_FILTER2_IMPL( \ | |
| 164 SYMCAT(DownloadQueryFilter, __LINE__), var0, var1, (expr)) | |
| 165 | |
| 166 #endif // CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_QUERY_H_ | |
| OLD | NEW |