blob: 87b5509158375c61b8abe819be392828c1127d89 [file] [log] [blame]
// 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 <memory>
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/single_thread_task_runner.h"
#include "base/synchronization/lock.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"
#include "components/webdata/common/web_database_service.h"
class WebDataServiceConsumer;
class WebDataRequestManager;
//////////////////////////////////////////////////////////////////////////////
//
// WebData requests
//
// Every request is processed using a request object. The object contains
// both the request parameters and the results.
//////////////////////////////////////////////////////////////////////////////
class WebDataRequest {
public:
virtual ~WebDataRequest();
// Returns the identifier for this request.
WebDataServiceBase::Handle GetHandle() const;
// Returns |true| if the request is active and |false| if the request has been
// cancelled or has already completed.
bool IsActive() const;
private:
// For access to the web request mutable state under the manager's lock.
friend class WebDataRequestManager;
// Private constructor called for WebDataRequestManager::NewRequest.
WebDataRequest(WebDataRequestManager* manager,
WebDataServiceConsumer* consumer);
// Internal debugging helper to assert that the request is active and that the
// manager's lock is held by the current thread.
void AssertThreadSafe() const;
// Retrieves the |consumer_| set in the constructor.
WebDataServiceConsumer* GetConsumer() const;
// Retrieves the original task runner of the request.
scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner() const;
// Marks the current request as inactive, either due to cancellation or
// completion.
void MarkAsInactive();
// Tracks task runner that the request originated on.
const scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
// 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 or
// completed.
WebDataRequestManager* manager_;
// The originator of the service request.
WebDataServiceConsumer* consumer_;
// Identifier for this request.
WebDataServiceBase::Handle handle_;
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();
// Factory function to create a new WebDataRequest.
std::unique_ptr<WebDataRequest> NewRequest(WebDataServiceConsumer* consumer);
// Cancel any pending request.
void CancelRequest(WebDataServiceBase::Handle h);
// Invoked by the WebDataService when |request| has been completed.
void RequestCompleted(std::unique_ptr<WebDataRequest> request,
std::unique_ptr<WDTypedResult> result);
// A debugging aid to assert that the pending_lock_ is held by the current
// thread.
void AssertLockedByCurrentThread() const;
private:
friend class base::RefCountedThreadSafe<WebDataRequestManager>;
~WebDataRequestManager();
// This will notify the consumer in whatever thread was used to create this
// request.
void RequestCompletedOnThread(std::unique_ptr<WebDataRequest> request,
std::unique_ptr<WDTypedResult> result);
// 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_;
std::map<WebDataServiceBase::Handle, WebDataRequest*> pending_requests_;
DISALLOW_COPY_AND_ASSIGN(WebDataRequestManager);
};
#endif // COMPONENTS_WEBDATA_COMMON_WEB_DATA_REQUEST_MANAGER_H__