Upstream version 10.38.222.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / extensions / api / system_storage / storage_info_provider.cc
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
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
44 StorageInfoProvider::StorageInfoProvider() {
45 }
46
47 StorageInfoProvider::~StorageInfoProvider() {
48 }
49
50 const StorageUnitInfoList& StorageInfoProvider::storage_unit_info_list() const {
51   return info_;
52 }
53
54 void StorageInfoProvider::InitializeForTesting(
55     scoped_refptr<StorageInfoProvider> provider) {
56   DCHECK(provider.get() != NULL);
57   provider_.Get() = provider;
58 }
59
60 void StorageInfoProvider::PrepareQueryOnUIThread() {
61   // Get all available storage devices before invoking |QueryInfo()|.
62   GetAllStoragesIntoInfoList();
63 }
64
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
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
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
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
117 StorageInfoProvider* StorageInfoProvider::Get() {
118   if (provider_.Get().get() == NULL)
119     provider_.Get() = new StorageInfoProvider();
120   return provider_.Get();
121 }
122
123 }  // namespace extensions