Home | History | Annotate | Download | only in policy
      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.
     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