• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 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 #include "chrome/browser/extensions/api/system_storage/storage_info_provider.h"
6 
7 #include "base/stl_util.h"
8 #include "base/strings/utf_string_conversions.h"
9 #include "base/sys_info.h"
10 #include "base/threading/sequenced_worker_pool.h"
11 #include "components/storage_monitor/storage_info.h"
12 #include "components/storage_monitor/storage_monitor.h"
13 #include "content/public/browser/browser_thread.h"
14 
15 using storage_monitor::StorageInfo;
16 using storage_monitor::StorageMonitor;
17 
18 namespace extensions {
19 
20 using content::BrowserThread;
21 using api::system_storage::StorageUnitInfo;
22 using api::system_storage::STORAGE_UNIT_TYPE_FIXED;
23 using api::system_storage::STORAGE_UNIT_TYPE_REMOVABLE;
24 
25 namespace systeminfo {
26 
BuildStorageUnitInfo(const StorageInfo & info,StorageUnitInfo * unit)27 void BuildStorageUnitInfo(const StorageInfo& info,
28                           StorageUnitInfo* unit) {
29   unit->id = StorageMonitor::GetInstance()->GetTransientIdForDeviceId(
30                  info.device_id());
31   unit->name = base::UTF16ToUTF8(info.GetDisplayName(false));
32   // TODO(hmin): Might need to take MTP device into consideration.
33   unit->type = StorageInfo::IsRemovableDevice(info.device_id()) ?
34       STORAGE_UNIT_TYPE_REMOVABLE : STORAGE_UNIT_TYPE_FIXED;
35   unit->capacity = static_cast<double>(info.total_size_in_bytes());
36 }
37 
38 }  // namespace systeminfo
39 
40 // Static member intialization.
41 base::LazyInstance<scoped_refptr<StorageInfoProvider> >
42     StorageInfoProvider::provider_ = LAZY_INSTANCE_INITIALIZER;
43 
StorageInfoProvider()44 StorageInfoProvider::StorageInfoProvider() {
45 }
46 
~StorageInfoProvider()47 StorageInfoProvider::~StorageInfoProvider() {
48 }
49 
storage_unit_info_list() const50 const StorageUnitInfoList& StorageInfoProvider::storage_unit_info_list() const {
51   return info_;
52 }
53 
InitializeForTesting(scoped_refptr<StorageInfoProvider> provider)54 void StorageInfoProvider::InitializeForTesting(
55     scoped_refptr<StorageInfoProvider> provider) {
56   DCHECK(provider.get() != NULL);
57   provider_.Get() = provider;
58 }
59 
PrepareQueryOnUIThread()60 void StorageInfoProvider::PrepareQueryOnUIThread() {
61   // Get all available storage devices before invoking |QueryInfo()|.
62   GetAllStoragesIntoInfoList();
63 }
64 
InitializeProvider(const base::Closure & do_query_info_callback)65 void StorageInfoProvider::InitializeProvider(
66     const base::Closure& do_query_info_callback) {
67   DCHECK_CURRENTLY_ON(BrowserThread::UI);
68   // Register the |do_query_info_callback| callback to StorageMonitor.
69   // See the comments of StorageMonitor::EnsureInitialized about when the
70   // callback gets run.
71   StorageMonitor::GetInstance()->EnsureInitialized(do_query_info_callback);
72 }
73 
QueryInfo()74 bool StorageInfoProvider::QueryInfo() {
75   DCHECK(BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread());
76   // No info to query since we get all available storage devices' info in
77   // |PrepareQueryOnUIThread()|.
78   return true;
79 }
80 
GetAllStoragesIntoInfoList()81 void StorageInfoProvider::GetAllStoragesIntoInfoList() {
82   info_.clear();
83   std::vector<StorageInfo> storage_list =
84       StorageMonitor::GetInstance()->GetAllAvailableStorages();
85 
86   for (std::vector<StorageInfo>::const_iterator it = storage_list.begin();
87        it != storage_list.end(); ++it) {
88     linked_ptr<StorageUnitInfo> unit(new StorageUnitInfo());
89     systeminfo::BuildStorageUnitInfo(*it, unit.get());
90     info_.push_back(unit);
91   }
92 }
93 
GetStorageFreeSpaceFromTransientIdOnFileThread(const std::string & transient_id)94 double StorageInfoProvider::GetStorageFreeSpaceFromTransientIdOnFileThread(
95     const std::string& transient_id) {
96   DCHECK_CURRENTLY_ON(BrowserThread::FILE);
97   std::vector<StorageInfo> storage_list =
98       StorageMonitor::GetInstance()->GetAllAvailableStorages();
99 
100   std::string device_id =
101       StorageMonitor::GetInstance()->GetDeviceIdForTransientId(
102           transient_id);
103 
104   // Lookup the matched storage info by |device_id|.
105   for (std::vector<StorageInfo>::const_iterator it =
106        storage_list.begin();
107        it != storage_list.end(); ++it) {
108     if (device_id == it->device_id())
109       return static_cast<double>(base::SysInfo::AmountOfFreeDiskSpace(
110                                       base::FilePath(it->location())));
111   }
112 
113   return -1;
114 }
115 
116 // static
Get()117 StorageInfoProvider* StorageInfoProvider::Get() {
118   if (provider_.Get().get() == NULL)
119     provider_.Get() = new StorageInfoProvider();
120   return provider_.Get();
121 }
122 
123 }  // namespace extensions
124