1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file.
4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#ifndef CHROME_BROWSER_UI_APP_LIST_PROFILE_LOADER_H_
64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define CHROME_BROWSER_UI_APP_LIST_PROFILE_LOADER_H_
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/callback.h"
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/memory/weak_ptr.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace base {
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass FilePath;
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass Profile;
160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass ProfileLoaderUnittest;
170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass ProfileStore;
180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass ScopedKeepAlive;
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// This class loads profiles asynchronously and calls the provided callback once
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// the profile is ready. Only the callback for the most recent load request is
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// called, and only if the load was successful.
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch//
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// This is useful for loading profiles in response to user interaction where
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// only the latest requested profile is required.
264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// TODO(koz): Merge this into AppListServiceImpl.
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass ProfileLoader {
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public:
290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  explicit ProfileLoader(ProfileStore* profile_store);
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ~ProfileLoader();
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool IsAnyProfileLoading() const;
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void InvalidatePendingProfileLoads();
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void LoadProfileInvalidatingOtherLoads(
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const base::FilePath& profile_file_path,
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::Callback<void(Profile*)> callback);
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private:
390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  friend class ::ProfileLoaderUnittest;
400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void OnProfileLoaded(int profile_load_sequence_id,
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                       base::Callback<void(Profile*)> callback,
434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                       Profile* profile);
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void IncrementPendingProfileLoads();
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void DecrementPendingProfileLoads();
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ProfileStore* profile_store_;
490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  scoped_ptr<ScopedKeepAlive> keep_alive_;
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int profile_load_sequence_id_;
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int pending_profile_loads_;
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::WeakPtrFactory<ProfileLoader> weak_factory_;
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DISALLOW_COPY_AND_ASSIGN(ProfileLoader);
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif  // CHROME_BROWSER_UI_APP_LIST_PROFILE_LOADER_H_
59