OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "webkit/browser/fileapi/obfuscated_file_util.h" | 5 #include "webkit/browser/fileapi/obfuscated_file_util.h" |
6 | 6 |
7 #include <queue> | 7 #include <queue> |
8 #include <string> | 8 #include <string> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
11 #include "base/file_util.h" | 11 #include "base/file_util.h" |
12 #include "base/format_macros.h" | 12 #include "base/format_macros.h" |
13 #include "base/logging.h" | 13 #include "base/logging.h" |
14 #include "base/message_loop.h" | 14 #include "base/message_loop.h" |
15 #include "base/stl_util.h" | 15 #include "base/stl_util.h" |
16 #include "base/stringprintf.h" | 16 #include "base/stringprintf.h" |
17 #include "base/strings/string_number_conversions.h" | 17 #include "base/strings/string_number_conversions.h" |
18 #include "base/strings/sys_string_conversions.h" | 18 #include "base/strings/sys_string_conversions.h" |
19 #include "base/utf_string_conversions.h" | 19 #include "base/utf_string_conversions.h" |
20 #include "googleurl/src/gurl.h" | 20 #include "googleurl/src/gurl.h" |
21 #include "webkit/base/origin_url_conversions.h" | 21 #include "webkit/base/origin_url_conversions.h" |
22 #include "webkit/browser/fileapi/file_observers.h" | 22 #include "webkit/browser/fileapi/file_observers.h" |
23 #include "webkit/browser/fileapi/file_system_context.h" | 23 #include "webkit/browser/fileapi/file_system_context.h" |
24 #include "webkit/browser/fileapi/file_system_operation_context.h" | 24 #include "webkit/browser/fileapi/file_system_operation_context.h" |
25 #include "webkit/browser/fileapi/file_system_url.h" | 25 #include "webkit/browser/fileapi/file_system_url.h" |
26 #include "webkit/browser/fileapi/native_file_util.h" | 26 #include "webkit/browser/fileapi/native_file_util.h" |
| 27 #include "webkit/browser/fileapi/sandbox_isolated_origin_database.h" |
27 #include "webkit/browser/fileapi/sandbox_mount_point_provider.h" | 28 #include "webkit/browser/fileapi/sandbox_mount_point_provider.h" |
| 29 #include "webkit/browser/fileapi/sandbox_origin_database.h" |
28 #include "webkit/browser/fileapi/syncable/syncable_file_system_util.h" | 30 #include "webkit/browser/fileapi/syncable/syncable_file_system_util.h" |
29 #include "webkit/common/fileapi/file_system_util.h" | 31 #include "webkit/common/fileapi/file_system_util.h" |
30 #include "webkit/quota/quota_manager.h" | 32 #include "webkit/quota/quota_manager.h" |
31 | 33 |
32 // Example of various paths: | 34 // Example of various paths: |
33 // void ObfuscatedFileUtil::DoSomething(const FileSystemURL& url) { | 35 // void ObfuscatedFileUtil::DoSomething(const FileSystemURL& url) { |
34 // base::FilePath virtual_path = url.path(); | 36 // base::FilePath virtual_path = url.path(); |
35 // base::FilePath local_path = GetLocalFilePath(url); | 37 // base::FilePath local_path = GetLocalFilePath(url); |
36 // | 38 // |
37 // NativeFileUtil::DoSomething(local_path); | 39 // NativeFileUtil::DoSomething(local_path); |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
203 | 205 |
204 FileId current_file_id_; | 206 FileId current_file_id_; |
205 base::PlatformFileInfo current_platform_file_info_; | 207 base::PlatformFileInfo current_platform_file_info_; |
206 }; | 208 }; |
207 | 209 |
208 class ObfuscatedOriginEnumerator | 210 class ObfuscatedOriginEnumerator |
209 : public ObfuscatedFileUtil::AbstractOriginEnumerator { | 211 : public ObfuscatedFileUtil::AbstractOriginEnumerator { |
210 public: | 212 public: |
211 typedef SandboxOriginDatabase::OriginRecord OriginRecord; | 213 typedef SandboxOriginDatabase::OriginRecord OriginRecord; |
212 ObfuscatedOriginEnumerator( | 214 ObfuscatedOriginEnumerator( |
213 SandboxOriginDatabase* origin_database, | 215 SandboxOriginDatabaseInterface* origin_database, |
214 const base::FilePath& base_file_path) | 216 const base::FilePath& base_file_path) |
215 : base_file_path_(base_file_path) { | 217 : base_file_path_(base_file_path) { |
216 if (origin_database) | 218 if (origin_database) |
217 origin_database->ListAllOrigins(&origins_); | 219 origin_database->ListAllOrigins(&origins_); |
218 } | 220 } |
219 | 221 |
220 virtual ~ObfuscatedOriginEnumerator() {} | 222 virtual ~ObfuscatedOriginEnumerator() {} |
221 | 223 |
222 // Returns the next origin. Returns empty if there are no more origins. | 224 // Returns the next origin. Returns empty if there are no more origins. |
223 virtual GURL Next() OVERRIDE { | 225 virtual GURL Next() OVERRIDE { |
224 OriginRecord record; | 226 OriginRecord record; |
225 if (!origins_.empty()) { | 227 if (!origins_.empty()) { |
226 record = origins_.back(); | 228 record = origins_.back(); |
227 origins_.pop_back(); | 229 origins_.pop_back(); |
228 } | 230 } |
229 current_ = record; | 231 current_ = record; |
230 return webkit_base::GetOriginURLFromIdentifier(UTF8ToUTF16(record.origin)); | 232 return webkit_base::GetOriginURLFromIdentifier(UTF8ToUTF16(record.origin)); |
231 } | 233 } |
232 | 234 |
233 // Returns the current origin's information. | 235 // Returns the current origin's information. |
234 virtual bool HasFileSystemType(FileSystemType type) const OVERRIDE { | 236 virtual bool HasFileSystemType(FileSystemType type) const OVERRIDE { |
235 if (current_.path.empty()) | 237 if (current_.path.empty()) |
236 return false; | 238 return false; |
237 base::FilePath::StringType type_string = | 239 base::FilePath::StringType type_string = |
238 ObfuscatedFileUtil::GetDirectoryNameForType(type); | 240 ObfuscatedFileUtil::GetDirectoryNameForType(type); |
239 if (type_string.empty()) { | 241 if (type_string.empty()) { |
240 NOTREACHED(); | 242 NOTREACHED(); |
241 return false; | 243 return false; |
242 } | 244 } |
243 base::FilePath path = base_file_path_.Append(current_.path).Append(type_stri
ng); | 245 base::FilePath path = |
| 246 base_file_path_.Append(current_.path).Append(type_string); |
244 return file_util::DirectoryExists(path); | 247 return file_util::DirectoryExists(path); |
245 } | 248 } |
246 | 249 |
247 private: | 250 private: |
248 std::vector<OriginRecord> origins_; | 251 std::vector<OriginRecord> origins_; |
249 OriginRecord current_; | 252 OriginRecord current_; |
250 base::FilePath base_file_path_; | 253 base::FilePath base_file_path_; |
251 }; | 254 }; |
252 | 255 |
253 ObfuscatedFileUtil::ObfuscatedFileUtil( | 256 ObfuscatedFileUtil::ObfuscatedFileUtil( |
| 257 quota::SpecialStoragePolicy* special_storage_policy, |
254 const base::FilePath& file_system_directory) | 258 const base::FilePath& file_system_directory) |
255 : file_system_directory_(file_system_directory) { | 259 : special_storage_policy_(special_storage_policy), |
| 260 file_system_directory_(file_system_directory) { |
256 } | 261 } |
257 | 262 |
258 ObfuscatedFileUtil::~ObfuscatedFileUtil() { | 263 ObfuscatedFileUtil::~ObfuscatedFileUtil() { |
259 DropDatabases(); | 264 DropDatabases(); |
260 } | 265 } |
261 | 266 |
262 PlatformFileError ObfuscatedFileUtil::CreateOrOpen( | 267 PlatformFileError ObfuscatedFileUtil::CreateOrOpen( |
263 FileSystemOperationContext* context, | 268 FileSystemOperationContext* context, |
264 const FileSystemURL& url, int file_flags, | 269 const FileSystemURL& url, int file_flags, |
265 PlatformFile* file_handle, bool* created) { | 270 PlatformFile* file_handle, bool* created) { |
(...skipping 608 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
874 } | 879 } |
875 | 880 |
876 if (error_code) | 881 if (error_code) |
877 *error_code = error; | 882 *error_code = error; |
878 return path; | 883 return path; |
879 } | 884 } |
880 | 885 |
881 bool ObfuscatedFileUtil::DeleteDirectoryForOriginAndType( | 886 bool ObfuscatedFileUtil::DeleteDirectoryForOriginAndType( |
882 const GURL& origin, FileSystemType type) { | 887 const GURL& origin, FileSystemType type) { |
883 base::PlatformFileError error = base::PLATFORM_FILE_OK; | 888 base::PlatformFileError error = base::PLATFORM_FILE_OK; |
884 base::FilePath origin_type_path = GetDirectoryForOriginAndType(origin, type, f
alse, | 889 base::FilePath origin_type_path = GetDirectoryForOriginAndType( |
885 &error); | 890 origin, type, false, &error); |
886 if (origin_type_path.empty()) | 891 if (origin_type_path.empty()) |
887 return true; | 892 return true; |
888 | 893 |
889 if (error != base::PLATFORM_FILE_ERROR_NOT_FOUND) { | 894 if (error != base::PLATFORM_FILE_ERROR_NOT_FOUND) { |
890 // TODO(dmikurube): Consider the return value of DestroyDirectoryDatabase. | 895 // TODO(dmikurube): Consider the return value of DestroyDirectoryDatabase. |
891 // We ignore its error now since 1) it doesn't matter the final result, and | 896 // We ignore its error now since 1) it doesn't matter the final result, and |
892 // 2) it always returns false in Windows because of LevelDB's | 897 // 2) it always returns false in Windows because of LevelDB's |
893 // implementation. | 898 // implementation. |
894 // Information about failure would be useful for debugging. | 899 // Information about failure would be useful for debugging. |
895 DestroyDirectoryDatabase(origin, type); | 900 DestroyDirectoryDatabase(origin, type); |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
968 UTF16ToUTF8(webkit_base::GetOriginIdentifierFromURL(origin)) + | 973 UTF16ToUTF8(webkit_base::GetOriginIdentifierFromURL(origin)) + |
969 type_string; | 974 type_string; |
970 DirectoryMap::iterator iter = directories_.find(key); | 975 DirectoryMap::iterator iter = directories_.find(key); |
971 if (iter != directories_.end()) { | 976 if (iter != directories_.end()) { |
972 SandboxDirectoryDatabase* database = iter->second; | 977 SandboxDirectoryDatabase* database = iter->second; |
973 directories_.erase(iter); | 978 directories_.erase(iter); |
974 delete database; | 979 delete database; |
975 } | 980 } |
976 | 981 |
977 PlatformFileError error = base::PLATFORM_FILE_OK; | 982 PlatformFileError error = base::PLATFORM_FILE_OK; |
978 base::FilePath path = GetDirectoryForOriginAndType(origin, type, false, &error
); | 983 base::FilePath path = GetDirectoryForOriginAndType( |
| 984 origin, type, false, &error); |
979 if (path.empty() || error == base::PLATFORM_FILE_ERROR_NOT_FOUND) | 985 if (path.empty() || error == base::PLATFORM_FILE_ERROR_NOT_FOUND) |
980 return true; | 986 return true; |
981 return SandboxDirectoryDatabase::DestroyDatabase(path); | 987 return SandboxDirectoryDatabase::DestroyDatabase(path); |
982 } | 988 } |
983 | 989 |
984 // static | 990 // static |
985 int64 ObfuscatedFileUtil::ComputeFilePathCost(const base::FilePath& path) { | 991 int64 ObfuscatedFileUtil::ComputeFilePathCost(const base::FilePath& path) { |
986 return UsageForPath(VirtualPath::BaseName(path).value().size()); | 992 return UsageForPath(VirtualPath::BaseName(path).value().size()); |
987 } | 993 } |
988 | 994 |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1041 const base::FilePath& src_file_path, | 1047 const base::FilePath& src_file_path, |
1042 const GURL& dest_origin, | 1048 const GURL& dest_origin, |
1043 FileSystemType dest_type, | 1049 FileSystemType dest_type, |
1044 FileInfo* dest_file_info, int file_flags, PlatformFile* handle) { | 1050 FileInfo* dest_file_info, int file_flags, PlatformFile* handle) { |
1045 if (handle) | 1051 if (handle) |
1046 *handle = base::kInvalidPlatformFileValue; | 1052 *handle = base::kInvalidPlatformFileValue; |
1047 SandboxDirectoryDatabase* db = GetDirectoryDatabase( | 1053 SandboxDirectoryDatabase* db = GetDirectoryDatabase( |
1048 dest_origin, dest_type, true); | 1054 dest_origin, dest_type, true); |
1049 | 1055 |
1050 PlatformFileError error = base::PLATFORM_FILE_OK; | 1056 PlatformFileError error = base::PLATFORM_FILE_OK; |
1051 base::FilePath root = GetDirectoryForOriginAndType(dest_origin, dest_type, fal
se, | 1057 base::FilePath root = GetDirectoryForOriginAndType( |
1052 &error); | 1058 dest_origin, dest_type, false, &error); |
1053 if (error != base::PLATFORM_FILE_OK) | 1059 if (error != base::PLATFORM_FILE_OK) |
1054 return error; | 1060 return error; |
1055 | 1061 |
1056 base::FilePath dest_local_path; | 1062 base::FilePath dest_local_path; |
1057 error = GenerateNewLocalPath(db, context, dest_origin, dest_type, | 1063 error = GenerateNewLocalPath(db, context, dest_origin, dest_type, |
1058 &dest_local_path); | 1064 &dest_local_path); |
1059 if (error != base::PLATFORM_FILE_OK) | 1065 if (error != base::PLATFORM_FILE_OK) |
1060 return error; | 1066 return error; |
1061 | 1067 |
1062 bool created = false; | 1068 bool created = false; |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1113 return base::PLATFORM_FILE_ERROR_FAILED; | 1119 return base::PLATFORM_FILE_ERROR_FAILED; |
1114 } | 1120 } |
1115 TouchDirectory(db, dest_file_info->parent_id); | 1121 TouchDirectory(db, dest_file_info->parent_id); |
1116 | 1122 |
1117 return base::PLATFORM_FILE_OK; | 1123 return base::PLATFORM_FILE_OK; |
1118 } | 1124 } |
1119 | 1125 |
1120 base::FilePath ObfuscatedFileUtil::DataPathToLocalPath( | 1126 base::FilePath ObfuscatedFileUtil::DataPathToLocalPath( |
1121 const GURL& origin, FileSystemType type, const base::FilePath& data_path) { | 1127 const GURL& origin, FileSystemType type, const base::FilePath& data_path) { |
1122 PlatformFileError error = base::PLATFORM_FILE_OK; | 1128 PlatformFileError error = base::PLATFORM_FILE_OK; |
1123 base::FilePath root = GetDirectoryForOriginAndType(origin, type, false, &error
); | 1129 base::FilePath root = GetDirectoryForOriginAndType( |
| 1130 origin, type, false, &error); |
1124 if (error != base::PLATFORM_FILE_OK) | 1131 if (error != base::PLATFORM_FILE_OK) |
1125 return base::FilePath(); | 1132 return base::FilePath(); |
1126 return root.Append(data_path); | 1133 return root.Append(data_path); |
1127 } | 1134 } |
1128 | 1135 |
1129 // TODO(ericu): How to do the whole validation-without-creation thing? | 1136 // TODO(ericu): How to do the whole validation-without-creation thing? |
1130 // We may not have quota even to create the database. | 1137 // We may not have quota even to create the database. |
1131 // Ah, in that case don't even get here? | 1138 // Ah, in that case don't even get here? |
1132 // Still doesn't answer the quota issue, though. | 1139 // Still doesn't answer the quota issue, though. |
1133 SandboxDirectoryDatabase* ObfuscatedFileUtil::GetDirectoryDatabase( | 1140 SandboxDirectoryDatabase* ObfuscatedFileUtil::GetDirectoryDatabase( |
1134 const GURL& origin, FileSystemType type, bool create) { | 1141 const GURL& origin, FileSystemType type, bool create) { |
1135 std::string type_string = GetFileSystemTypeString(type); | 1142 std::string type_string = GetFileSystemTypeString(type); |
1136 if (type_string.empty()) { | 1143 if (type_string.empty()) { |
1137 LOG(WARNING) << "Unknown filesystem type requested:" << type; | 1144 LOG(WARNING) << "Unknown filesystem type requested:" << type; |
1138 return NULL; | 1145 return NULL; |
1139 } | 1146 } |
1140 std::string key = | 1147 std::string key = |
1141 UTF16ToUTF8(webkit_base::GetOriginIdentifierFromURL(origin)) + | 1148 UTF16ToUTF8(webkit_base::GetOriginIdentifierFromURL(origin)) + |
1142 type_string; | 1149 type_string; |
1143 DirectoryMap::iterator iter = directories_.find(key); | 1150 DirectoryMap::iterator iter = directories_.find(key); |
1144 if (iter != directories_.end()) { | 1151 if (iter != directories_.end()) { |
1145 MarkUsed(); | 1152 MarkUsed(); |
1146 return iter->second; | 1153 return iter->second; |
1147 } | 1154 } |
1148 | 1155 |
1149 PlatformFileError error = base::PLATFORM_FILE_OK; | 1156 PlatformFileError error = base::PLATFORM_FILE_OK; |
1150 base::FilePath path = GetDirectoryForOriginAndType(origin, type, create, &erro
r); | 1157 base::FilePath path = GetDirectoryForOriginAndType( |
| 1158 origin, type, create, &error); |
1151 if (error != base::PLATFORM_FILE_OK) { | 1159 if (error != base::PLATFORM_FILE_OK) { |
1152 LOG(WARNING) << "Failed to get origin+type directory: " << path.value(); | 1160 LOG(WARNING) << "Failed to get origin+type directory: " << path.value(); |
1153 return NULL; | 1161 return NULL; |
1154 } | 1162 } |
1155 MarkUsed(); | 1163 MarkUsed(); |
1156 SandboxDirectoryDatabase* database = new SandboxDirectoryDatabase(path); | 1164 SandboxDirectoryDatabase* database = new SandboxDirectoryDatabase(path); |
1157 directories_[key] = database; | 1165 directories_[key] = database; |
1158 return database; | 1166 return database; |
1159 } | 1167 } |
1160 | 1168 |
1161 base::FilePath ObfuscatedFileUtil::GetDirectoryForOrigin( | 1169 base::FilePath ObfuscatedFileUtil::GetDirectoryForOrigin( |
1162 const GURL& origin, bool create, base::PlatformFileError* error_code) { | 1170 const GURL& origin, bool create, base::PlatformFileError* error_code) { |
| 1171 if (special_storage_policy_ && |
| 1172 special_storage_policy_->HasIsolatedStorage(origin)) { |
| 1173 CHECK(isolated_origin_.is_empty() || isolated_origin_ == origin) |
| 1174 << "multiple origins for an isolated site: " |
| 1175 << isolated_origin_.spec() << " vs " << origin.spec(); |
| 1176 isolated_origin_ = origin; |
| 1177 } |
| 1178 |
1163 if (!InitOriginDatabase(create)) { | 1179 if (!InitOriginDatabase(create)) { |
1164 if (error_code) { | 1180 if (error_code) { |
1165 *error_code = create ? | 1181 *error_code = create ? |
1166 base::PLATFORM_FILE_ERROR_FAILED : | 1182 base::PLATFORM_FILE_ERROR_FAILED : |
1167 base::PLATFORM_FILE_ERROR_NOT_FOUND; | 1183 base::PLATFORM_FILE_ERROR_NOT_FOUND; |
1168 } | 1184 } |
1169 return base::FilePath(); | 1185 return base::FilePath(); |
1170 } | 1186 } |
1171 base::FilePath directory_name; | 1187 base::FilePath directory_name; |
1172 std::string id = UTF16ToUTF8(webkit_base::GetOriginIdentifierFromURL(origin)); | 1188 std::string id = UTF16ToUTF8(webkit_base::GetOriginIdentifierFromURL(origin)); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1227 } | 1243 } |
1228 | 1244 |
1229 void ObfuscatedFileUtil::DropDatabases() { | 1245 void ObfuscatedFileUtil::DropDatabases() { |
1230 origin_database_.reset(); | 1246 origin_database_.reset(); |
1231 STLDeleteContainerPairSecondPointers( | 1247 STLDeleteContainerPairSecondPointers( |
1232 directories_.begin(), directories_.end()); | 1248 directories_.begin(), directories_.end()); |
1233 directories_.clear(); | 1249 directories_.clear(); |
1234 } | 1250 } |
1235 | 1251 |
1236 bool ObfuscatedFileUtil::InitOriginDatabase(bool create) { | 1252 bool ObfuscatedFileUtil::InitOriginDatabase(bool create) { |
1237 if (!origin_database_) { | 1253 if (origin_database_) |
1238 if (!create && !file_util::DirectoryExists(file_system_directory_)) | 1254 return true; |
1239 return false; | 1255 |
1240 if (!file_util::CreateDirectory(file_system_directory_)) { | 1256 if (!create && !file_util::DirectoryExists(file_system_directory_)) |
1241 LOG(WARNING) << "Failed to create FileSystem directory: " << | 1257 return false; |
1242 file_system_directory_.value(); | 1258 if (!file_util::CreateDirectory(file_system_directory_)) { |
1243 return false; | 1259 LOG(WARNING) << "Failed to create FileSystem directory: " << |
1244 } | 1260 file_system_directory_.value(); |
| 1261 return false; |
| 1262 } |
| 1263 |
| 1264 if (!isolated_origin_.is_empty()) { |
| 1265 DCHECK(special_storage_policy_->HasIsolatedStorage(isolated_origin_)); |
1245 origin_database_.reset( | 1266 origin_database_.reset( |
1246 new SandboxOriginDatabase(file_system_directory_)); | 1267 new SandboxIsolatedOriginDatabase( |
| 1268 UTF16ToUTF8(webkit_base::GetOriginIdentifierFromURL( |
| 1269 isolated_origin_)), |
| 1270 file_system_directory_)); |
| 1271 return true; |
1247 } | 1272 } |
| 1273 |
| 1274 origin_database_.reset( |
| 1275 new SandboxOriginDatabase(file_system_directory_)); |
1248 return true; | 1276 return true; |
1249 } | 1277 } |
1250 | 1278 |
1251 PlatformFileError ObfuscatedFileUtil::GenerateNewLocalPath( | 1279 PlatformFileError ObfuscatedFileUtil::GenerateNewLocalPath( |
1252 SandboxDirectoryDatabase* db, | 1280 SandboxDirectoryDatabase* db, |
1253 FileSystemOperationContext* context, | 1281 FileSystemOperationContext* context, |
1254 const GURL& origin, | 1282 const GURL& origin, |
1255 FileSystemType type, | 1283 FileSystemType type, |
1256 base::FilePath* local_path) { | 1284 base::FilePath* local_path) { |
1257 DCHECK(local_path); | 1285 DCHECK(local_path); |
1258 int64 number; | 1286 int64 number; |
1259 if (!db || !db->GetNextInteger(&number)) | 1287 if (!db || !db->GetNextInteger(&number)) |
1260 return base::PLATFORM_FILE_ERROR_FAILED; | 1288 return base::PLATFORM_FILE_ERROR_FAILED; |
1261 | 1289 |
1262 PlatformFileError error = base::PLATFORM_FILE_OK; | 1290 PlatformFileError error = base::PLATFORM_FILE_OK; |
1263 base::FilePath new_local_path = GetDirectoryForOriginAndType(origin, type, | 1291 base::FilePath new_local_path = GetDirectoryForOriginAndType( |
1264 false, &error); | 1292 origin, type, false, &error); |
1265 if (error != base::PLATFORM_FILE_OK) | 1293 if (error != base::PLATFORM_FILE_OK) |
1266 return base::PLATFORM_FILE_ERROR_FAILED; | 1294 return base::PLATFORM_FILE_ERROR_FAILED; |
1267 | 1295 |
1268 // We use the third- and fourth-to-last digits as the directory. | 1296 // We use the third- and fourth-to-last digits as the directory. |
1269 int64 directory_number = number % 10000 / 100; | 1297 int64 directory_number = number % 10000 / 100; |
1270 new_local_path = new_local_path.AppendASCII( | 1298 new_local_path = new_local_path.AppendASCII( |
1271 base::StringPrintf("%02" PRId64, directory_number)); | 1299 base::StringPrintf("%02" PRId64, directory_number)); |
1272 | 1300 |
1273 error = NativeFileUtil::CreateDirectory( | 1301 error = NativeFileUtil::CreateDirectory( |
1274 new_local_path, false /* exclusive */, false /* recursive */); | 1302 new_local_path, false /* exclusive */, false /* recursive */); |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1356 // If truncating we need to update the usage. | 1384 // If truncating we need to update the usage. |
1357 if (error == base::PLATFORM_FILE_OK && delta) { | 1385 if (error == base::PLATFORM_FILE_OK && delta) { |
1358 UpdateUsage(context, url, delta); | 1386 UpdateUsage(context, url, delta); |
1359 context->change_observers()->Notify( | 1387 context->change_observers()->Notify( |
1360 &FileChangeObserver::OnModifyFile, MakeTuple(url)); | 1388 &FileChangeObserver::OnModifyFile, MakeTuple(url)); |
1361 } | 1389 } |
1362 return error; | 1390 return error; |
1363 } | 1391 } |
1364 | 1392 |
1365 } // namespace fileapi | 1393 } // namespace fileapi |
OLD | NEW |