OLD | NEW |
| (Empty) |
1 // Copyright 2012 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 // Chromium settings and storage represent user-selected preferences and | |
6 // information and MUST not be extracted, overwritten or modified except | |
7 // through Chromium defined APIs. | |
8 | |
9 #ifndef CHROME_BROWSER_WEBDATA_WEB_DATA_REQUEST_MANAGER_H__ | |
10 #define CHROME_BROWSER_WEBDATA_WEB_DATA_REQUEST_MANAGER_H__ | |
11 | |
12 #include <map> | |
13 | |
14 #include "base/memory/ref_counted.h" | |
15 #include "base/synchronization/lock.h" | |
16 #include "chrome/browser/api/webdata/web_data_results.h" | |
17 #include "chrome/browser/api/webdata/web_data_service_base.h" | |
18 #include "chrome/browser/api/webdata/web_data_service_consumer.h" | |
19 | |
20 class WebDataService; | |
21 class WebDataServiceConsumer; | |
22 class WebDataRequestManager; | |
23 | |
24 namespace base { | |
25 class MessageLoop; | |
26 } | |
27 | |
28 ////////////////////////////////////////////////////////////////////////////// | |
29 // | |
30 // Webdata requests | |
31 // | |
32 // Every request is processed using a request object. The object contains | |
33 // both the request parameters and the results. | |
34 ////////////////////////////////////////////////////////////////////////////// | |
35 class WebDataRequest { | |
36 public: | |
37 WebDataRequest(WebDataServiceConsumer* consumer, | |
38 WebDataRequestManager* manager); | |
39 | |
40 virtual ~WebDataRequest(); | |
41 | |
42 WebDataServiceBase::Handle GetHandle() const; | |
43 | |
44 // Retrieves the |consumer_| set in the constructor. | |
45 WebDataServiceConsumer* GetConsumer() const; | |
46 | |
47 // Retrieves the original message loop the of the request. | |
48 base::MessageLoop* GetMessageLoop() const; | |
49 | |
50 // Returns |true| if the request was cancelled via the |Cancel()| method. | |
51 bool IsCancelled() const; | |
52 | |
53 // This can be invoked from any thread. From this point we assume that | |
54 // our consumer_ reference is invalid. | |
55 void Cancel(); | |
56 | |
57 // Invoked when the request has been completed. | |
58 void OnComplete(); | |
59 | |
60 // The result is owned by the request. | |
61 void SetResult(scoped_ptr<WDTypedResult> r); | |
62 | |
63 // Transfers ownership pof result to caller. Should only be called once per | |
64 // result. | |
65 scoped_ptr<WDTypedResult> GetResult(); | |
66 | |
67 private: | |
68 // Used to notify manager if request is cancelled. Uses a raw ptr instead of | |
69 // a ref_ptr so that it can be set to NULL when a request is cancelled. | |
70 WebDataRequestManager* manager_; | |
71 | |
72 // Tracks loop that the request originated on. | |
73 base::MessageLoop* message_loop_; | |
74 | |
75 // Identifier for this request. | |
76 WebDataServiceBase::Handle handle_; | |
77 | |
78 // A lock to protect against simultaneous cancellations of the request. | |
79 // Cancellation affects both the |cancelled_| flag and |consumer_|. | |
80 mutable base::Lock cancel_lock_; | |
81 bool cancelled_; | |
82 | |
83 // The originator of the service request. | |
84 WebDataServiceConsumer* consumer_; | |
85 | |
86 scoped_ptr<WDTypedResult> result_; | |
87 | |
88 DISALLOW_COPY_AND_ASSIGN(WebDataRequest); | |
89 }; | |
90 | |
91 ////////////////////////////////////////////////////////////////////////////// | |
92 // | |
93 // Webdata Request Manager | |
94 // | |
95 // Tracks all WebDataRequests for a WebDataService. | |
96 // | |
97 // Note: This is an internal interface, not to be used outside of webdata/ | |
98 ////////////////////////////////////////////////////////////////////////////// | |
99 class WebDataRequestManager | |
100 : public base::RefCountedThreadSafe<WebDataRequestManager> { | |
101 public: | |
102 WebDataRequestManager(); | |
103 | |
104 // Cancel any pending request. | |
105 void CancelRequest(WebDataServiceBase::Handle h); | |
106 | |
107 // Invoked by the WebDataService when |request| has been completed. | |
108 void RequestCompleted(scoped_ptr<WebDataRequest> request); | |
109 | |
110 // Register the request as a pending request. | |
111 void RegisterRequest(WebDataRequest* request); | |
112 | |
113 // Return the next request handle. | |
114 int GetNextRequestHandle(); | |
115 | |
116 private: | |
117 friend class base::RefCountedThreadSafe<WebDataRequestManager>; | |
118 | |
119 ~WebDataRequestManager(); | |
120 | |
121 // This will notify the consumer in whatever thread was used to create this | |
122 // request. | |
123 void RequestCompletedOnThread(scoped_ptr<WebDataRequest> request); | |
124 | |
125 // A lock to protect pending requests and next request handle. | |
126 base::Lock pending_lock_; | |
127 | |
128 // Next handle to be used for requests. Incremented for each use. | |
129 WebDataServiceBase::Handle next_request_handle_; | |
130 | |
131 typedef std::map<WebDataServiceBase::Handle, WebDataRequest*> RequestMap; | |
132 RequestMap pending_requests_; | |
133 | |
134 DISALLOW_COPY_AND_ASSIGN(WebDataRequestManager); | |
135 }; | |
136 | |
137 #endif // CHROME_BROWSER_WEBDATA_WEB_DATA_REQUEST_MANAGER_H__ | |
OLD | NEW |