1// Copyright (c) 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#ifndef CHROME_BROWSER_PROFILES_PROFILE_SHORTCUT_MANAGER_WIN_H_
6#define CHROME_BROWSER_PROFILES_PROFILE_SHORTCUT_MANAGER_WIN_H_
7
8#include "base/callback.h"
9#include "chrome/browser/profiles/profile_shortcut_manager.h"
10#include "content/public/browser/notification_observer.h"
11#include "content/public/browser/notification_registrar.h"
12
13class BrowserDistribution;
14
15// Internal free-standing functions that are exported here for testing.
16namespace profiles {
17namespace internal {
18
19// Returns the full path to the profile icon file.
20base::FilePath GetProfileIconPath(const base::FilePath& profile_path);
21
22// Returns the default shortcut filename for the given profile name,
23// given |distribution|. Returns a filename appropriate for a
24// single-user installation if |profile_name| is empty.
25base::string16 GetShortcutFilenameForProfile(const base::string16& profile_name,
26                                             BrowserDistribution* distribution);
27
28// Returns the command-line flags to launch Chrome with the given profile.
29base::string16 CreateProfileShortcutFlags(const base::FilePath& profile_path);
30
31}  // namespace internal
32}  // namespace profiles
33
34class ProfileShortcutManagerWin : public ProfileShortcutManager,
35                                  public ProfileInfoCacheObserver,
36                                  public content::NotificationObserver {
37 public:
38  // Specifies whether only the existing shortcut should be updated, a new
39  // shortcut should be created if none exist, or only the icon for this profile
40  // should be created in the profile directory.
41  enum CreateOrUpdateMode {
42    UPDATE_EXISTING_ONLY,
43    CREATE_WHEN_NONE_FOUND,
44    CREATE_OR_UPDATE_ICON_ONLY,
45  };
46  // Specifies whether non-profile shortcuts should be updated.
47  enum NonProfileShortcutAction {
48    IGNORE_NON_PROFILE_SHORTCUTS,
49    UPDATE_NON_PROFILE_SHORTCUTS,
50  };
51
52  explicit ProfileShortcutManagerWin(ProfileManager* manager);
53  virtual ~ProfileShortcutManagerWin();
54
55  // ProfileShortcutManager implementation:
56  virtual void CreateOrUpdateProfileIcon(
57      const base::FilePath& profile_path) OVERRIDE;
58  virtual void CreateProfileShortcut(
59      const base::FilePath& profile_path) OVERRIDE;
60  virtual void RemoveProfileShortcuts(
61      const base::FilePath& profile_path) OVERRIDE;
62  virtual void HasProfileShortcuts(
63      const base::FilePath& profile_path,
64      const base::Callback<void(bool)>& callback) OVERRIDE;
65  virtual void GetShortcutProperties(const base::FilePath& profile_path,
66                                     base::CommandLine* command_line,
67                                     base::string16* name,
68                                     base::FilePath* icon_path) OVERRIDE;
69
70  // ProfileInfoCacheObserver implementation:
71  virtual void OnProfileAdded(const base::FilePath& profile_path) OVERRIDE;
72  virtual void OnProfileWasRemoved(
73      const base::FilePath& profile_path,
74      const base::string16& profile_name) OVERRIDE;
75  virtual void OnProfileNameChanged(
76      const base::FilePath& profile_path,
77      const base::string16& old_profile_name) OVERRIDE;
78  virtual void OnProfileAvatarChanged(
79      const base::FilePath& profile_path) OVERRIDE;
80
81  // content::NotificationObserver implementation:
82  virtual void Observe(int type,
83                       const content::NotificationSource& source,
84                       const content::NotificationDetails& details) OVERRIDE;
85
86 private:
87  // Gives the profile path of an alternate profile than |profile_path|.
88  // Must only be called when the number profiles is 2.
89  base::FilePath GetOtherProfilePath(const base::FilePath& profile_path);
90
91  // Creates or updates shortcuts for the profile at |profile_path| according
92  // to the specified |create_mode| and |action|. This will always involve
93  // creating or updating the icon file for this profile.
94  void CreateOrUpdateShortcutsForProfileAtPath(
95      const base::FilePath& profile_path,
96      CreateOrUpdateMode create_mode,
97      NonProfileShortcutAction action);
98
99  ProfileManager* profile_manager_;
100
101  content::NotificationRegistrar registrar_;
102
103  DISALLOW_COPY_AND_ASSIGN(ProfileShortcutManagerWin);
104};
105
106#endif  // CHROME_BROWSER_PROFILES_PROFILE_SHORTCUT_MANAGER_WIN_H_
107