Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / components / storage_monitor / storage_info.cc
1 // Copyright 2014 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 "components/storage_monitor/storage_info.h"
6
7 #include "base/logging.h"
8 #include "base/strings/utf_string_conversions.h"
9 #include "components/storage_monitor/media_storage_util.h"
10 #include "ui/base/l10n/l10n_util.h"
11 #include "ui/base/text/bytes_formatting.h"
12
13 namespace {
14
15 // Prefix constants for different device id spaces.
16 const char kRemovableMassStorageWithDCIMPrefix[] = "dcim:";
17 const char kRemovableMassStorageNoDCIMPrefix[] = "nodcim:";
18 const char kFixedMassStoragePrefix[] = "path:";
19 const char kMtpPtpPrefix[] = "mtp:";
20 const char kMacImageCapturePrefix[] = "ic:";
21 const char kITunesPrefix[] = "itunes:";
22 const char kPicasaPrefix[] = "picasa:";
23 const char kIPhotoPrefix[] = "iphoto:";
24
25 base::string16 GetDisplayNameForDevice(uint64 storage_size_in_bytes,
26                                        const base::string16& name) {
27   DCHECK(!name.empty());
28   return (storage_size_in_bytes == 0) ?
29       name :
30       ui::FormatBytes(storage_size_in_bytes) + base::ASCIIToUTF16(" ") + name;
31 }
32
33 base::string16 GetFullProductName(const base::string16& vendor_name,
34                                   const base::string16& model_name) {
35   if (vendor_name.empty() && model_name.empty())
36     return base::string16();
37
38   base::string16 product_name;
39   if (vendor_name.empty())
40     product_name = model_name;
41   else if (model_name.empty())
42     product_name = vendor_name;
43   else if (!vendor_name.empty() && !model_name.empty())
44     product_name = vendor_name + base::UTF8ToUTF16(", ") + model_name;
45
46   return product_name;
47 }
48
49 }  // namespace
50
51 namespace storage_monitor {
52
53 StorageInfo::StorageInfo() : total_size_in_bytes_(0) {
54 }
55
56 StorageInfo::StorageInfo(const std::string& device_id_in,
57                          const base::FilePath::StringType& device_location,
58                          const base::string16& label,
59                          const base::string16& vendor,
60                          const base::string16& model,
61                          uint64 size_in_bytes)
62     : device_id_(device_id_in),
63       location_(device_location),
64       storage_label_(label),
65       vendor_name_(vendor),
66       model_name_(model),
67       total_size_in_bytes_(size_in_bytes) {
68 }
69
70 StorageInfo::~StorageInfo() {
71 }
72
73 // static
74 std::string StorageInfo::MakeDeviceId(Type type, const std::string& unique_id) {
75   DCHECK(!unique_id.empty());
76   switch (type) {
77     case REMOVABLE_MASS_STORAGE_WITH_DCIM:
78       return std::string(kRemovableMassStorageWithDCIMPrefix) + unique_id;
79     case REMOVABLE_MASS_STORAGE_NO_DCIM:
80       return std::string(kRemovableMassStorageNoDCIMPrefix) + unique_id;
81     case FIXED_MASS_STORAGE:
82       return std::string(kFixedMassStoragePrefix) + unique_id;
83     case MTP_OR_PTP:
84       return std::string(kMtpPtpPrefix) + unique_id;
85     case MAC_IMAGE_CAPTURE:
86       return std::string(kMacImageCapturePrefix) + unique_id;
87     case ITUNES:
88       return std::string(kITunesPrefix) + unique_id;
89     case PICASA:
90       return std::string(kPicasaPrefix) + unique_id;
91     case IPHOTO:
92       return std::string(kIPhotoPrefix) + unique_id;
93   }
94   NOTREACHED();
95   return std::string();
96 }
97
98 // static
99 bool StorageInfo::CrackDeviceId(const std::string& device_id,
100                                 Type* type, std::string* unique_id) {
101   size_t prefix_length = device_id.find_first_of(':');
102   std::string prefix = prefix_length != std::string::npos
103                            ? device_id.substr(0, prefix_length + 1)
104                            : std::string();
105
106   Type found_type;
107   if (prefix == kRemovableMassStorageWithDCIMPrefix) {
108     found_type = REMOVABLE_MASS_STORAGE_WITH_DCIM;
109   } else if (prefix == kRemovableMassStorageNoDCIMPrefix) {
110     found_type = REMOVABLE_MASS_STORAGE_NO_DCIM;
111   } else if (prefix == kFixedMassStoragePrefix) {
112     found_type = FIXED_MASS_STORAGE;
113   } else if (prefix == kMtpPtpPrefix) {
114     found_type = MTP_OR_PTP;
115   } else if (prefix == kMacImageCapturePrefix) {
116     found_type = MAC_IMAGE_CAPTURE;
117   } else if (prefix == kITunesPrefix) {
118     found_type = ITUNES;
119   } else if (prefix == kPicasaPrefix) {
120     found_type = PICASA;
121   } else if (prefix == kIPhotoPrefix) {
122     found_type = IPHOTO;
123   } else {
124     NOTREACHED();
125     return false;
126   }
127   if (type)
128     *type = found_type;
129
130   if (unique_id)
131     *unique_id = device_id.substr(prefix_length + 1);
132   return true;
133 }
134
135 // static
136 bool StorageInfo::IsMediaDevice(const std::string& device_id) {
137   Type type;
138   return CrackDeviceId(device_id, &type, NULL) &&
139       (type == REMOVABLE_MASS_STORAGE_WITH_DCIM || type == MTP_OR_PTP ||
140        type == MAC_IMAGE_CAPTURE);
141 }
142
143 // static
144 bool StorageInfo::IsRemovableDevice(const std::string& device_id) {
145   Type type;
146   return CrackDeviceId(device_id, &type, NULL) &&
147          (type == REMOVABLE_MASS_STORAGE_WITH_DCIM ||
148           type == REMOVABLE_MASS_STORAGE_NO_DCIM ||
149           type == MTP_OR_PTP ||
150           type == MAC_IMAGE_CAPTURE);
151 }
152
153 // static
154 bool StorageInfo::IsMassStorageDevice(const std::string& device_id) {
155   Type type;
156   return CrackDeviceId(device_id, &type, NULL) &&
157          (type == REMOVABLE_MASS_STORAGE_WITH_DCIM ||
158           type == REMOVABLE_MASS_STORAGE_NO_DCIM ||
159           type == FIXED_MASS_STORAGE ||
160           type == ITUNES ||
161           type == IPHOTO ||
162           type == PICASA);
163 }
164
165 // static
166 bool StorageInfo::IsITunesDevice(const std::string& device_id) {
167   Type type;
168   return CrackDeviceId(device_id, &type, NULL) && type == ITUNES;
169 }
170
171 // static
172 bool StorageInfo::IsIPhotoDevice(const std::string& device_id) {
173   Type type;
174   return CrackDeviceId(device_id, &type, NULL) && type == IPHOTO;
175 }
176
177 // static
178 bool StorageInfo::IsPicasaDevice(const std::string& device_id) {
179   Type type;
180   return CrackDeviceId(device_id, &type, NULL) && type == PICASA;
181 }
182
183 // static
184 bool StorageInfo::IsMTPDevice(const std::string& device_id) {
185   Type type;
186   return CrackDeviceId(device_id, &type, NULL) && type == MTP_OR_PTP;
187 }
188
189 base::string16 StorageInfo::GetDisplayName(bool with_size) const {
190   return GetDisplayNameWithOverride(base::string16(), with_size);
191 }
192
193 base::string16 StorageInfo::GetDisplayNameWithOverride(
194     const base::string16& override_display_name, bool with_size) const {
195   if (!IsRemovableDevice(device_id_)) {
196     if (!storage_label_.empty())
197       return storage_label_;
198     return base::FilePath(location_).LossyDisplayName();
199   }
200
201   base::string16 name = override_display_name;
202   if (name.empty())
203     name = storage_label_;
204   if (name.empty())
205     name = GetFullProductName(vendor_name_, model_name_);
206   if (name.empty())
207     name = base::ASCIIToUTF16("Unlabeled device");
208
209   if (with_size)
210     name = GetDisplayNameForDevice(total_size_in_bytes_, name);
211   return name;
212 }
213
214 }  // namespace storage_monitor