// Copyright 2012 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. // Chromium settings and storage represent user-selected preferences and // information and MUST not be extracted, overwritten or modified except // through Chromium defined APIs. #ifndef COMPONENTS_WEBDATA_COMMON_WEB_DATA_REQUEST_MANAGER_H__ #define COMPONENTS_WEBDATA_COMMON_WEB_DATA_REQUEST_MANAGER_H__ #include <map> #include "base/memory/ref_counted.h" #include "base/synchronization/lock.h" #include "components/webdata/common/web_database_service.h" #include "components/webdata/common/web_data_results.h" #include "components/webdata/common/web_data_service_base.h" #include "components/webdata/common/web_data_service_consumer.h" class WebDataService; class WebDataServiceConsumer; class WebDataRequestManager; namespace base { class MessageLoop; } ////////////////////////////////////////////////////////////////////////////// // // Webdata requests // // Every request is processed using a request object. The object contains // both the request parameters and the results. ////////////////////////////////////////////////////////////////////////////// class WebDataRequest { public: WebDataRequest(WebDataServiceConsumer* consumer, WebDataRequestManager* manager); virtual ~WebDataRequest(); WebDataServiceBase::Handle GetHandle() const; // Retrieves the |consumer_| set in the constructor. WebDataServiceConsumer* GetConsumer() const; // Retrieves the original message loop the of the request. base::MessageLoop* GetMessageLoop() const; // Returns |true| if the request was cancelled via the |Cancel()| method. bool IsCancelled() const; // This can be invoked from any thread. From this point we assume that // our consumer_ reference is invalid. void Cancel(); // Invoked when the request has been completed. void OnComplete(); // The result is owned by the request. void SetResult(scoped_ptr<WDTypedResult> r); // Transfers ownership pof result to caller. Should only be called once per // result. scoped_ptr<WDTypedResult> GetResult(); private: // Used to notify manager if request is cancelled. Uses a raw ptr instead of // a ref_ptr so that it can be set to NULL when a request is cancelled. WebDataRequestManager* manager_; // Tracks loop that the request originated on. base::MessageLoop* message_loop_; // Identifier for this request. WebDataServiceBase::Handle handle_; // A lock to protect against simultaneous cancellations of the request. // Cancellation affects both the |cancelled_| flag and |consumer_|. mutable base::Lock cancel_lock_; bool cancelled_; // The originator of the service request. WebDataServiceConsumer* consumer_; scoped_ptr<WDTypedResult> result_; DISALLOW_COPY_AND_ASSIGN(WebDataRequest); }; ////////////////////////////////////////////////////////////////////////////// // // Webdata Request Manager // // Tracks all WebDataRequests for a WebDataService. // // Note: This is an internal interface, not to be used outside of webdata/ ////////////////////////////////////////////////////////////////////////////// class WebDataRequestManager : public base::RefCountedThreadSafe<WebDataRequestManager> { public: WebDataRequestManager(); // Cancel any pending request. void CancelRequest(WebDataServiceBase::Handle h); // Invoked by the WebDataService when |request| has been completed. void RequestCompleted(scoped_ptr<WebDataRequest> request); // Register the request as a pending request. void RegisterRequest(WebDataRequest* request); // Return the next request handle. int GetNextRequestHandle(); private: friend class base::RefCountedThreadSafe<WebDataRequestManager>; ~WebDataRequestManager(); // This will notify the consumer in whatever thread was used to create this // request. void RequestCompletedOnThread(scoped_ptr<WebDataRequest> request); // A lock to protect pending requests and next request handle. base::Lock pending_lock_; // Next handle to be used for requests. Incremented for each use. WebDataServiceBase::Handle next_request_handle_; typedef std::map<WebDataServiceBase::Handle, WebDataRequest*> RequestMap; RequestMap pending_requests_; DISALLOW_COPY_AND_ASSIGN(WebDataRequestManager); }; #endif // COMPONENTS_WEBDATA_COMMON_WEB_DATA_REQUEST_MANAGER_H__