Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(17)

Side by Side Diff: content/browser/download/download_query.h

Issue 7825035: Implement chrome.experimental.downloads.search() (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: merge Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(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_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698