12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/api/system_info/system_info_api.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <set>
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/lazy_instance.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/singleton.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/storage_monitor/removable_storage_observer.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/storage_monitor/storage_info.h"
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/storage_monitor/storage_monitor.h"
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/api/system_display/display_info_provider.h"
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/api/system_storage/storage_info_provider.h"
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/extensions_browser_client.h"
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/api/system_display.h"
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/api/system_storage.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/display_observer.h"
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gfx/screen.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace extensions {
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing core_api::system_storage::StorageUnitInfo;
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::BrowserThread;
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using storage_monitor::StorageMonitor;
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace system_display = core_api::system_display;
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace system_storage = core_api::system_storage;
353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool IsDisplayChangedEvent(const std::string& event_name) {
393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return event_name == system_display::OnDisplayChanged::kEventName;
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool IsSystemStorageEvent(const std::string& event_name) {
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return (event_name == system_storage::OnAttached::kEventName ||
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          event_name == system_storage::OnDetached::kEventName);
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Event router for systemInfo API. It is a singleton instance shared by
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// multiple profiles.
497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass SystemInfoEventRouter : public gfx::DisplayObserver,
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                              public storage_monitor::RemovableStorageObserver {
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static SystemInfoEventRouter* GetInstance();
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SystemInfoEventRouter();
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~SystemInfoEventRouter();
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Add/remove event listener for the |event_name| event.
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AddEventListener(const std::string& event_name);
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RemoveEventListener(const std::string& event_name);
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // gfx::DisplayObserver:
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnDisplayAdded(const gfx::Display& new_display) OVERRIDE;
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnDisplayRemoved(const gfx::Display& old_display) OVERRIDE;
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnDisplayMetricsChanged(const gfx::Display& display,
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                       uint32_t metrics) OVERRIDE;
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
68d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // RemovableStorageObserver implementation.
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void OnRemovableStorageAttached(
70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const storage_monitor::StorageInfo& info) OVERRIDE;
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void OnRemovableStorageDetached(
72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const storage_monitor::StorageInfo& info) OVERRIDE;
737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called from any thread to dispatch the systemInfo event to all extension
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // processes cross multiple profiles.
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DispatchEvent(const std::string& event_name,
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     scoped_ptr<base::ListValue> args);
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called to dispatch the systemInfo.display.onDisplayChanged event.
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnDisplayChanged();
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Used to record the event names being watched.
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::multiset<std::string> watching_event_set_;
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool has_storage_monitor_observer_;
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SystemInfoEventRouter);
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static base::LazyInstance<SystemInfoEventRouter>::Leaky
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    g_system_info_event_router = LAZY_INSTANCE_INITIALIZER;
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SystemInfoEventRouter* SystemInfoEventRouter::GetInstance() {
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return g_system_info_event_router.Pointer();
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SystemInfoEventRouter::SystemInfoEventRouter()
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : has_storage_monitor_observer_(false) {
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SystemInfoEventRouter::~SystemInfoEventRouter() {
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (has_storage_monitor_observer_) {
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    StorageMonitor* storage_monitor = StorageMonitor::GetInstance();
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (storage_monitor)
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      storage_monitor->RemoveObserver(this);
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SystemInfoEventRouter::AddEventListener(const std::string& event_name) {
111effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::UI);
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  watching_event_set_.insert(event_name);
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (watching_event_set_.count(event_name) > 1)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (IsDisplayChangedEvent(event_name)) {
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    gfx::Screen* screen = DisplayInfoProvider::Get()->GetActiveScreen();
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (screen)
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      screen->AddObserver(this);
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (IsSystemStorageEvent(event_name)) {
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!has_storage_monitor_observer_) {
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      has_storage_monitor_observer_ = true;
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      DCHECK(StorageMonitor::GetInstance()->IsInitialized());
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      StorageMonitor::GetInstance()->AddObserver(this);
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SystemInfoEventRouter::RemoveEventListener(const std::string& event_name) {
133effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::UI);
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
135b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  std::multiset<std::string>::iterator it =
136b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      watching_event_set_.find(event_name);
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (it != watching_event_set_.end()) {
138b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    watching_event_set_.erase(it);
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (watching_event_set_.count(event_name) > 0)
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return;
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
142b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (IsDisplayChangedEvent(event_name)) {
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    gfx::Screen* screen = DisplayInfoProvider::Get()->GetActiveScreen();
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (screen)
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      screen->RemoveObserver(this);
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (IsSystemStorageEvent(event_name)) {
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& other_event_name =
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        (event_name == system_storage::OnDetached::kEventName)
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            ? system_storage::OnAttached::kEventName
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            : system_storage::OnDetached::kEventName;
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (watching_event_set_.count(other_event_name) == 0) {
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      StorageMonitor::GetInstance()->RemoveObserver(this);
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      has_storage_monitor_observer_ = false;
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SystemInfoEventRouter::OnRemovableStorageAttached(
162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const storage_monitor::StorageInfo& info) {
1637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  StorageUnitInfo unit;
1647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  systeminfo::BuildStorageUnitInfo(info, &unit);
1657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<base::ListValue> args(new base::ListValue);
1667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  args->Append(unit.ToValue().release());
1673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DispatchEvent(system_storage::OnAttached::kEventName, args.Pass());
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SystemInfoEventRouter::OnRemovableStorageDetached(
171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const storage_monitor::StorageInfo& info) {
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::ListValue> args(new base::ListValue);
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string transient_id =
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      StorageMonitor::GetInstance()->GetTransientIdForDeviceId(
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          info.device_id());
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  args->AppendString(transient_id);
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DispatchEvent(system_storage::OnDetached::kEventName, args.Pass());
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void SystemInfoEventRouter::OnDisplayAdded(const gfx::Display& new_display) {
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OnDisplayChanged();
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void SystemInfoEventRouter::OnDisplayRemoved(const gfx::Display& old_display) {
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OnDisplayChanged();
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void SystemInfoEventRouter::OnDisplayMetricsChanged(const gfx::Display& display,
190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                    uint32_t metrics) {
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OnDisplayChanged();
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SystemInfoEventRouter::OnDisplayChanged() {
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::ListValue> args(new base::ListValue());
1963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DispatchEvent(system_display::OnDisplayChanged::kEventName, args.Pass());
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SystemInfoEventRouter::DispatchEvent(const std::string& event_name,
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          scoped_ptr<base::ListValue> args) {
2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ExtensionsBrowserClient::Get()->BroadcastEventToRenderers(event_name,
2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                            args.Pass());
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AddEventListener(const std::string& event_name) {
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SystemInfoEventRouter::GetInstance()->AddEventListener(event_name);
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RemoveEventListener(const std::string& event_name) {
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SystemInfoEventRouter::GetInstance()->RemoveEventListener(event_name);
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static base::LazyInstance<BrowserContextKeyedAPIFactory<SystemInfoAPI> >
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    g_factory = LAZY_INSTANCE_INITIALIZER;
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)BrowserContextKeyedAPIFactory<SystemInfoAPI>*
220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)SystemInfoAPI::GetFactoryInstance() {
2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return g_factory.Pointer();
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
224a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)SystemInfoAPI::SystemInfoAPI(content::BrowserContext* context)
225a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : browser_context_(context) {
2260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EventRouter* router = EventRouter::Get(browser_context_);
2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  router->RegisterObserver(this, system_storage::OnAttached::kEventName);
2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  router->RegisterObserver(this, system_storage::OnDetached::kEventName);
2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  router->RegisterObserver(this, system_display::OnDisplayChanged::kEventName);
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SystemInfoAPI::~SystemInfoAPI() {
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SystemInfoAPI::Shutdown() {
2360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EventRouter::Get(browser_context_)->UnregisterObserver(this);
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SystemInfoAPI::OnListenerAdded(const EventListenerInfo& details) {
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (IsSystemStorageEvent(details.event_name)) {
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    StorageMonitor::GetInstance()->EnsureInitialized(
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::Bind(&AddEventListener, details.event_name));
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  } else {
2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    AddEventListener(details.event_name);
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SystemInfoAPI::OnListenerRemoved(const EventListenerInfo& details) {
2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (IsSystemStorageEvent(details.event_name)) {
2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    StorageMonitor::GetInstance()->EnsureInitialized(
2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::Bind(&RemoveEventListener, details.event_name));
2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  } else {
2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    RemoveEventListener(details.event_name);
2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace extensions
258