• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_CHROMEOS_POLICY_APP_PACK_UPDATER_H_
6 #define CHROME_BROWSER_CHROMEOS_POLICY_APP_PACK_UPDATER_H_
7 
8 #include <string>
9 
10 #include "base/basictypes.h"
11 #include "base/callback.h"
12 #include "base/compiler_specific.h"
13 #include "base/files/file_path.h"
14 #include "base/memory/scoped_ptr.h"
15 #include "base/memory/weak_ptr.h"
16 #include "chrome/browser/chromeos/extensions/external_cache.h"
17 #include "chrome/browser/chromeos/settings/cros_settings.h"
18 
19 namespace extensions {
20 class ExternalLoader;
21 }
22 
23 namespace net {
24 class URLRequestContextGetter;
25 }
26 
27 namespace policy {
28 
29 class AppPackExternalLoader;
30 class EnterpriseInstallAttributes;
31 
32 // The AppPackUpdater manages a set of extensions that are configured via a
33 // device policy to be locally cached and installed into the Demo user account
34 // at login time.
35 class AppPackUpdater : public chromeos::ExternalCache::Delegate {
36  public:
37   // Callback to listen for updates to the screensaver extension's path.
38   typedef base::Callback<void(const base::FilePath&)> ScreenSaverUpdateCallback;
39 
40   // The |request_context| is used for the update checks.
41   AppPackUpdater(net::URLRequestContextGetter* request_context,
42                  EnterpriseInstallAttributes* install_attributes);
43   virtual ~AppPackUpdater();
44 
45   // Returns true if the ExternalLoader for the app pack has already been
46   // created.
created_external_loader()47   bool created_external_loader() const { return created_extension_loader_; }
48 
49   // Creates an extensions::ExternalLoader that will load the crx files
50   // downloaded by the AppPackUpdater. This can be called at most once, and the
51   // caller owns the returned value.
52   extensions::ExternalLoader* CreateExternalLoader();
53 
54   // |callback| will be invoked whenever the screen saver extension's path
55   // changes. It will be invoked "soon" after this call if a valid path already
56   // exists. Subsequent calls will override the previous |callback|. A null
57   // |callback| can be used to remove a previous callback.
58   void SetScreenSaverUpdateCallback(const ScreenSaverUpdateCallback& callback);
59 
60   // If a user of one of the AppPack's extensions detects that the extension
61   // is damaged then this method can be used to remove it from the cache and
62   // retry to download it after a restart.
63   void OnDamagedFileDetected(const base::FilePath& path);
64 
65  private:
66   // Implementation of ExternalCache::Delegate:
67   virtual void OnExtensionListsUpdated(
68       const base::DictionaryValue* prefs) OVERRIDE;
69 
70   // Called when the app pack device setting changes.
71   void AppPackChanged();
72 
73   // Loads the current policy and schedules a cache update.
74   void LoadPolicy();
75 
76   // Notifies the |extension_loader_| that the cache has been updated, providing
77   // it with an updated list of app-pack extensions.
78   void UpdateExtensionLoader();
79 
80   // Sets |screen_saver_path_| and invokes |screen_saver_update_callback_| if
81   // appropriate.
82   void SetScreenSaverPath(const base::FilePath& path);
83 
84   base::WeakPtrFactory<AppPackUpdater> weak_ptr_factory_;
85 
86   // The extension ID and path of the CRX file of the screen saver extension,
87   // if it is configured by the policy. Otherwise these fields are empty.
88   std::string screen_saver_id_;
89   base::FilePath screen_saver_path_;
90 
91   // Callback to invoke whenever the screen saver's extension path changes.
92   // Can be null.
93   ScreenSaverUpdateCallback screen_saver_update_callback_;
94 
95   // The extension loader wires the AppPackUpdater to the extensions system, and
96   // makes it install the currently cached extensions.
97   bool created_extension_loader_;
98   base::WeakPtr<AppPackExternalLoader> extension_loader_;
99 
100   // For checking the device mode.
101   EnterpriseInstallAttributes* install_attributes_;
102 
103   // Extension cache.
104   chromeos::ExternalCache external_cache_;
105 
106   scoped_ptr<chromeos::CrosSettings::ObserverSubscription>
107       app_pack_subscription_;
108 
109   DISALLOW_COPY_AND_ASSIGN(AppPackUpdater);
110 };
111 
112 }  // namespace policy
113 
114 #endif  // CHROME_BROWSER_CHROMEOS_POLICY_APP_PACK_UPDATER_H_
115