Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(221)

Side by Side Diff: chrome/browser/chromeos/gdata/gdata_file_system.cc

Issue 10827211: Replace GDataDirectory::TakeEntry with GDataDirectoryService::AddEntryToDirectory. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: better tests Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 "chrome/browser/chromeos/gdata/gdata_file_system.h" 5 #include "chrome/browser/chromeos/gdata/gdata_file_system.h"
6 6
7 #include <set> 7 #include <set>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 1049 matching lines...) Expand 10 before | Expand all | Expand 10 after
1060 1060
1061 documents_service_->CopyDocument(resource_id, new_name, 1061 documents_service_->CopyDocument(resource_id, new_name,
1062 base::Bind(&GDataFileSystem::OnCopyDocumentCompleted, 1062 base::Bind(&GDataFileSystem::OnCopyDocumentCompleted,
1063 ui_weak_ptr_, 1063 ui_weak_ptr_,
1064 dir_path, 1064 dir_path,
1065 callback)); 1065 callback));
1066 } 1066 }
1067 1067
1068 void GDataFileSystem::Rename(const FilePath& file_path, 1068 void GDataFileSystem::Rename(const FilePath& file_path,
1069 const FilePath::StringType& new_name, 1069 const FilePath::StringType& new_name,
1070 const FilePathUpdateCallback& callback) { 1070 const FileMoveCallback& callback) {
1071 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1071 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1072 1072
1073 // It is a no-op if the file is renamed to the same name. 1073 // It is a no-op if the file is renamed to the same name.
1074 if (file_path.BaseName().value() == new_name) { 1074 if (file_path.BaseName().value() == new_name) {
1075 if (!callback.is_null()) { 1075 if (!callback.is_null()) {
1076 MessageLoop::current()->PostTask( 1076 MessageLoop::current()->PostTask(
1077 FROM_HERE, base::Bind(callback, GDATA_FILE_OK, file_path)); 1077 FROM_HERE, base::Bind(callback, GDATA_FILE_OK, file_path));
1078 } 1078 }
1079 return; 1079 return;
1080 } 1080 }
1081 1081
1082 // Get the edit URL of an entry at |file_path|. 1082 // Get the edit URL of an entry at |file_path|.
1083 directory_service_->GetEntryInfoByPath( 1083 directory_service_->GetEntryInfoByPath(
1084 file_path, 1084 file_path,
1085 base::Bind( 1085 base::Bind(
1086 &GDataFileSystem::RenameAfterGetEntryInfo, 1086 &GDataFileSystem::RenameAfterGetEntryInfo,
1087 ui_weak_ptr_, 1087 ui_weak_ptr_,
1088 file_path, 1088 file_path,
1089 new_name, 1089 new_name,
1090 callback)); 1090 callback));
1091 } 1091 }
1092 1092
1093 void GDataFileSystem::RenameAfterGetEntryInfo( 1093 void GDataFileSystem::RenameAfterGetEntryInfo(
1094 const FilePath& file_path, 1094 const FilePath& file_path,
1095 const FilePath::StringType& new_name, 1095 const FilePath::StringType& new_name,
1096 const FilePathUpdateCallback& callback, 1096 const FileMoveCallback& callback,
1097 GDataFileError error, 1097 GDataFileError error,
1098 scoped_ptr<GDataEntryProto> entry_proto) { 1098 scoped_ptr<GDataEntryProto> entry_proto) {
1099 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1099 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1100 1100
1101 if (error != GDATA_FILE_OK) { 1101 if (error != GDATA_FILE_OK) {
1102 if (!callback.is_null()) 1102 if (!callback.is_null())
1103 callback.Run(error, file_path); 1103 callback.Run(error, file_path);
1104 return; 1104 return;
1105 } 1105 }
1106 DCHECK(entry_proto.get()); 1106 DCHECK(entry_proto.get());
1107 1107
1108 // Drop the .g<something> extension from |new_name| if the file being 1108 // Drop the .g<something> extension from |new_name| if the file being
1109 // renamed is a hosted document and |new_name| has the same .g<something> 1109 // renamed is a hosted document and |new_name| has the same .g<something>
1110 // extension as the file. 1110 // extension as the file.
1111 FilePath::StringType file_name = new_name; 1111 FilePath::StringType file_name = new_name;
1112 if (entry_proto->has_file_specific_info() && 1112 if (entry_proto->has_file_specific_info() &&
1113 entry_proto->file_specific_info().is_hosted_document()) { 1113 entry_proto->file_specific_info().is_hosted_document()) {
1114 FilePath new_file(file_name); 1114 FilePath new_file(file_name);
1115 if (new_file.Extension() == 1115 if (new_file.Extension() ==
1116 entry_proto->file_specific_info().document_extension()) { 1116 entry_proto->file_specific_info().document_extension()) {
1117 file_name = new_file.RemoveExtension().value(); 1117 file_name = new_file.RemoveExtension().value();
1118 } 1118 }
1119 } 1119 }
1120 1120
1121 documents_service_->RenameResource( 1121 documents_service_->RenameResource(
1122 GURL(entry_proto->edit_url()), 1122 GURL(entry_proto->edit_url()),
1123 file_name, 1123 file_name,
1124 base::Bind(&GDataFileSystem::OnRenameResourceCompleted, 1124 base::Bind(&GDataFileSystem::RenameFileOnFileSystem,
1125 ui_weak_ptr_, 1125 ui_weak_ptr_,
1126 file_path, 1126 file_path,
1127 file_name, 1127 file_name,
1128 callback)); 1128 callback));
1129 } 1129 }
1130 1130
1131 void GDataFileSystem::Move(const FilePath& src_file_path, 1131 void GDataFileSystem::Move(const FilePath& src_file_path,
1132 const FilePath& dest_file_path, 1132 const FilePath& dest_file_path,
1133 const FileOperationCallback& callback) { 1133 const FileOperationCallback& callback) {
1134 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI) || 1134 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI) ||
(...skipping 26 matching lines...) Expand all
1161 if (error != GDATA_FILE_OK) { 1161 if (error != GDATA_FILE_OK) {
1162 if (!callback.is_null()) { 1162 if (!callback.is_null()) {
1163 MessageLoop::current()->PostTask(FROM_HERE, 1163 MessageLoop::current()->PostTask(FROM_HERE,
1164 base::Bind(callback, error)); 1164 base::Bind(callback, error));
1165 } 1165 }
1166 return; 1166 return;
1167 } 1167 }
1168 1168
1169 // If the file/directory is moved to the same directory, just rename it. 1169 // If the file/directory is moved to the same directory, just rename it.
1170 if (src_file_path.DirName() == dest_parent_path) { 1170 if (src_file_path.DirName() == dest_parent_path) {
1171 FilePathUpdateCallback final_file_path_update_callback = 1171 FileMoveCallback final_file_path_update_callback =
1172 base::Bind(&GDataFileSystem::OnFilePathUpdated, 1172 base::Bind(&GDataFileSystem::OnFilePathUpdated,
1173 ui_weak_ptr_, 1173 ui_weak_ptr_,
1174 callback); 1174 callback);
1175 1175
1176 Rename(src_file_path, dest_file_path.BaseName().value(), 1176 Rename(src_file_path, dest_file_path.BaseName().value(),
1177 final_file_path_update_callback); 1177 final_file_path_update_callback);
1178 return; 1178 return;
1179 } 1179 }
1180 1180
1181 // Otherwise, the move operation involves three steps: 1181 // Otherwise, the move operation involves three steps:
1182 // 1. Renames the file at |src_file_path| to basename(|dest_file_path|) 1182 // 1. Renames the file at |src_file_path| to basename(|dest_file_path|)
1183 // within the same directory. The rename operation is a no-op if 1183 // within the same directory. The rename operation is a no-op if
1184 // basename(|src_file_path|) equals to basename(|dest_file_path|). 1184 // basename(|src_file_path|) equals to basename(|dest_file_path|).
1185 // 2. Removes the file from its parent directory (the file is not deleted), 1185 // 2. Removes the file from its parent directory (the file is not deleted),
1186 // which effectively moves the file to the root directory. 1186 // which effectively moves the file to the root directory.
1187 // 3. Adds the file to the parent directory of |dest_file_path|, which 1187 // 3. Adds the file to the parent directory of |dest_file_path|, which
1188 // effectively moves the file from the root directory to the parent 1188 // effectively moves the file from the root directory to the parent
1189 // directory of |dest_file_path|. 1189 // directory of |dest_file_path|.
1190 FilePathUpdateCallback add_file_to_directory_callback = 1190 FileMoveCallback add_file_to_directory_callback =
1191 base::Bind(&GDataFileSystem::AddEntryToDirectory, 1191 base::Bind(&GDataFileSystem::AddEntryToDirectory,
1192 ui_weak_ptr_, 1192 ui_weak_ptr_,
1193 dest_file_path.DirName(), 1193 dest_file_path.DirName(),
1194 callback); 1194 callback);
1195 1195
1196 FilePathUpdateCallback remove_file_from_directory_callback = 1196 FileMoveCallback remove_file_from_directory_callback =
1197 base::Bind(&GDataFileSystem::RemoveEntryFromDirectory, 1197 base::Bind(&GDataFileSystem::RemoveEntryFromDirectory,
1198 ui_weak_ptr_, 1198 ui_weak_ptr_,
1199 src_file_path.DirName(), 1199 src_file_path.DirName(),
1200 add_file_to_directory_callback); 1200 add_file_to_directory_callback);
1201 1201
1202 Rename(src_file_path, dest_file_path.BaseName().value(), 1202 Rename(src_file_path, dest_file_path.BaseName().value(),
1203 remove_file_from_directory_callback); 1203 remove_file_from_directory_callback);
1204 } 1204 }
1205 1205
1206 void GDataFileSystem::AddEntryToDirectory( 1206 void GDataFileSystem::AddEntryToDirectory(
(...skipping 28 matching lines...) Expand all
1235 entry->edit_url(), 1235 entry->edit_url(),
1236 base::Bind(&GDataFileSystem::OnAddEntryToDirectoryCompleted, 1236 base::Bind(&GDataFileSystem::OnAddEntryToDirectoryCompleted,
1237 ui_weak_ptr_, 1237 ui_weak_ptr_,
1238 callback, 1238 callback,
1239 file_path, 1239 file_path,
1240 dir_path)); 1240 dir_path));
1241 } 1241 }
1242 1242
1243 void GDataFileSystem::RemoveEntryFromDirectory( 1243 void GDataFileSystem::RemoveEntryFromDirectory(
1244 const FilePath& dir_path, 1244 const FilePath& dir_path,
1245 const FilePathUpdateCallback& callback, 1245 const FileMoveCallback& callback,
1246 GDataFileError error, 1246 GDataFileError error,
1247 const FilePath& file_path) { 1247 const FilePath& file_path) {
1248 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1248 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1249 1249
1250 GDataEntry* entry = directory_service_->FindEntryByPathSync(file_path); 1250 GDataEntry* entry = directory_service_->FindEntryByPathSync(file_path);
1251 GDataEntry* dir = directory_service_->FindEntryByPathSync(dir_path); 1251 GDataEntry* dir = directory_service_->FindEntryByPathSync(dir_path);
1252 if (error == GDATA_FILE_OK) { 1252 if (error == GDATA_FILE_OK) {
1253 if (!entry || !dir) { 1253 if (!entry || !dir) {
1254 error = GDATA_FILE_ERROR_NOT_FOUND; 1254 error = GDATA_FILE_ERROR_NOT_FOUND;
1255 } else { 1255 } else {
1256 if (!dir->AsGDataDirectory()) 1256 if (!dir->AsGDataDirectory())
1257 error = GDATA_FILE_ERROR_NOT_A_DIRECTORY; 1257 error = GDATA_FILE_ERROR_NOT_A_DIRECTORY;
1258 } 1258 }
1259 } 1259 }
1260 1260
1261 // Returns if there is an error or |dir_path| is the root directory. 1261 // Returns if there is an error or |dir_path| is the root directory.
1262 if (error != GDATA_FILE_OK || 1262 if (error != GDATA_FILE_OK ||
1263 dir->resource_id() == kGDataRootDirectoryResourceId) { 1263 dir->resource_id() == kGDataRootDirectoryResourceId) {
1264 if (!callback.is_null()) { 1264 if (!callback.is_null()) {
1265 MessageLoop::current()->PostTask(FROM_HERE, 1265 MessageLoop::current()->PostTask(FROM_HERE,
1266 base::Bind(callback, error, file_path)); 1266 base::Bind(callback, error, file_path));
1267 } 1267 }
1268 return; 1268 return;
1269 } 1269 }
1270 1270
1271 documents_service_->RemoveResourceFromDirectory( 1271 documents_service_->RemoveResourceFromDirectory(
1272 dir->content_url(), 1272 dir->content_url(),
1273 entry->edit_url(), 1273 entry->edit_url(),
1274 entry->resource_id(), 1274 entry->resource_id(),
1275 base::Bind(&GDataFileSystem::OnRemoveEntryFromDirectoryCompleted, 1275 base::Bind(&GDataFileSystem::RemoveEntryFromDirectoryOnFileSystem,
1276 ui_weak_ptr_, 1276 ui_weak_ptr_,
1277 callback, 1277 callback,
1278 file_path, 1278 file_path,
1279 dir_path)); 1279 dir_path));
1280 } 1280 }
1281 1281
1282 void GDataFileSystem::Remove(const FilePath& file_path, 1282 void GDataFileSystem::Remove(const FilePath& file_path,
1283 bool is_recursive, 1283 bool is_recursive,
1284 const FileOperationCallback& callback) { 1284 const FileOperationCallback& callback) {
1285 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI) || 1285 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI) ||
(...skipping 710 matching lines...) Expand 10 before | Expand all | Expand 10 after
1996 scoped_ptr<GDataEntry> entry(it->second); 1996 scoped_ptr<GDataEntry> entry(it->second);
1997 // Skip if it's not a file (i.e. directory). 1997 // Skip if it's not a file (i.e. directory).
1998 if (!entry->AsGDataFile()) 1998 if (!entry->AsGDataFile())
1999 continue; 1999 continue;
2000 directory->AddEntry(entry.release()); 2000 directory->AddEntry(entry.release());
2001 } 2001 }
2002 2002
2003 // Note that there may be no change in the directory, but it's expensive to 2003 // Note that there may be no change in the directory, but it's expensive to
2004 // check if the new metadata matches the existing one, so we just always 2004 // check if the new metadata matches the existing one, so we just always
2005 // notify that the directory is changed. 2005 // notify that the directory is changed.
2006 FOR_EACH_OBSERVER(GDataFileSystemInterface::Observer, 2006 OnDirectoryChanged(directory_path);
2007 observers_, OnDirectoryChanged(directory_path));
2008 DVLOG(1) << "Directory refreshed: " << directory_path.value(); 2007 DVLOG(1) << "Directory refreshed: " << directory_path.value();
2009 } 2008 }
2010 2009
2011 void GDataFileSystem::UpdateFileByResourceId( 2010 void GDataFileSystem::UpdateFileByResourceId(
2012 const std::string& resource_id, 2011 const std::string& resource_id,
2013 const FileOperationCallback& callback) { 2012 const FileOperationCallback& callback) {
2014 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI) || 2013 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI) ||
2015 BrowserThread::CurrentlyOn(BrowserThread::IO)); 2014 BrowserThread::CurrentlyOn(BrowserThread::IO));
2016 RunTaskOnUIThread( 2015 RunTaskOnUIThread(
2017 base::Bind(&GDataFileSystem::UpdateFileByResourceIdOnUIThread, 2016 base::Bind(&GDataFileSystem::UpdateFileByResourceIdOnUIThread,
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after
2388 int root_feed_changestamp) { 2387 int root_feed_changestamp) {
2389 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 2388 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
2390 2389
2391 return feed_loader_->UpdateFromFeed(feed_list, 2390 return feed_loader_->UpdateFromFeed(feed_list,
2392 start_changestamp, 2391 start_changestamp,
2393 root_feed_changestamp); 2392 root_feed_changestamp);
2394 } 2393 }
2395 2394
2396 void GDataFileSystem::OnFilePathUpdated(const FileOperationCallback& callback, 2395 void GDataFileSystem::OnFilePathUpdated(const FileOperationCallback& callback,
2397 GDataFileError error, 2396 GDataFileError error,
2398 const FilePath& file_path) { 2397 const FilePath& /* file_path */) {
2399 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 2398 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
2400 if (!callback.is_null()) 2399 if (!callback.is_null())
2401 callback.Run(error); 2400 callback.Run(error);
2402 } 2401 }
2403 2402
2404 void GDataFileSystem::OnRenameResourceCompleted(
2405 const FilePath& file_path,
2406 const FilePath::StringType& new_name,
2407 const FilePathUpdateCallback& callback,
2408 GDataErrorCode status,
2409 const GURL& document_url) {
2410 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
2411
2412 FilePath updated_file_path;
2413 GDataFileError error = util::GDataToGDataFileError(status);
2414 if (error == GDATA_FILE_OK)
2415 error = RenameFileOnFilesystem(file_path, new_name, &updated_file_path);
2416
2417 if (!callback.is_null())
2418 callback.Run(error, updated_file_path);
2419 }
2420
2421 void GDataFileSystem::OnCopyDocumentCompleted( 2403 void GDataFileSystem::OnCopyDocumentCompleted(
2422 const FilePath& dir_path, 2404 const FilePath& dir_path,
2423 const FileOperationCallback& callback, 2405 const FileOperationCallback& callback,
2424 GDataErrorCode status, 2406 GDataErrorCode status,
2425 scoped_ptr<base::Value> data) { 2407 scoped_ptr<base::Value> data) {
2426 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 2408 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
2427 2409
2428 GDataFileError error = util::GDataToGDataFileError(status); 2410 GDataFileError error = util::GDataToGDataFileError(status);
2429 if (error != GDATA_FILE_OK) { 2411 if (error != GDATA_FILE_OK) {
2430 if (!callback.is_null()) 2412 if (!callback.is_null())
2431 callback.Run(error); 2413 callback.Run(error);
2432 2414
2433 return; 2415 return;
2434 } 2416 }
2435 2417
2436 scoped_ptr<DocumentEntry> doc_entry(DocumentEntry::ExtractAndParse(*data)); 2418 scoped_ptr<DocumentEntry> doc_entry(DocumentEntry::ExtractAndParse(*data));
2437 if (!doc_entry.get()) { 2419 if (!doc_entry.get()) {
2438 if (!callback.is_null()) 2420 if (!callback.is_null())
2439 callback.Run(GDATA_FILE_ERROR_FAILED); 2421 callback.Run(GDATA_FILE_ERROR_FAILED);
2440 2422
2441 return; 2423 return;
2442 } 2424 }
2443 2425
2444 GDataEntry* entry = GDataEntry::FromDocumentEntry( 2426 GDataEntry* entry = GDataEntry::FromDocumentEntry(
2445 directory_service_->root(), doc_entry.get(), directory_service_.get()); 2427 NULL, doc_entry.get(), directory_service_.get());
2446 if (!entry) { 2428 if (!entry) {
2447 if (!callback.is_null()) 2429 if (!callback.is_null())
2448 callback.Run(GDATA_FILE_ERROR_FAILED); 2430 callback.Run(GDATA_FILE_ERROR_FAILED);
2449 2431
2450 return; 2432 return;
2451 } 2433 }
2452 2434
2453 // |entry| was added in the root directory on the server, so we should 2435 // |entry| was added in the root directory on the server, so we should
2454 // first add it to |root_| to mirror the state and then move it to the 2436 // first add it to |root_| to mirror the state and then move it to the
2455 // destination directory by AddEntryToDirectory(). 2437 // destination directory by AddEntryToDirectory().
2456 directory_service_->root()->AddEntry(entry); 2438 directory_service_->root()->AddEntry(entry);
2457 AddEntryToDirectory(dir_path, callback, GDATA_FILE_OK, entry->GetFilePath()); 2439 AddEntryToDirectory(dir_path, callback, GDATA_FILE_OK, entry->GetFilePath());
2458 } 2440 }
2459 2441
2460 void GDataFileSystem::OnAddEntryToDirectoryCompleted( 2442 void GDataFileSystem::OnAddEntryToDirectoryCompleted(
2461 const FileOperationCallback& callback, 2443 const FileOperationCallback& callback,
2462 const FilePath& file_path, 2444 const FilePath& file_path,
2463 const FilePath& dir_path, 2445 const FilePath& dir_path,
2464 GDataErrorCode status, 2446 GDataErrorCode status,
2465 const GURL& document_url) { 2447 const GURL& document_url) {
2466 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 2448 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
2467 2449
2468 GDataFileError error = util::GDataToGDataFileError(status); 2450 GDataFileError error = util::GDataToGDataFileError(status);
2469 if (error == GDATA_FILE_OK) { 2451 if (error == GDATA_FILE_OK) {
2470 GDataEntry* entry = directory_service_->FindEntryByPathSync(file_path); 2452 GDataEntry* entry = directory_service_->FindEntryByPathSync(file_path);
2471 if (entry) { 2453 if (entry) {
2472 DCHECK_EQ(directory_service_->root(), entry->parent()); 2454 DCHECK_EQ(directory_service_->root(), entry->parent());
2473 error = AddEntryToDirectoryOnFilesystem(entry, dir_path); 2455 directory_service_->MoveEntryToDirectory(dir_path, entry,
2456 base::Bind(
2457 &GDataFileSystem::OnMoveEntryToDirectoryWithFileOperationCallback,
2458 ui_weak_ptr_,
2459 callback));
2460 return;
2474 } else { 2461 } else {
2475 error = GDATA_FILE_ERROR_NOT_FOUND; 2462 error = GDATA_FILE_ERROR_NOT_FOUND;
2476 } 2463 }
2477 } 2464 }
2478 2465
2479 if (!callback.is_null()) 2466 if (!callback.is_null())
2480 callback.Run(error); 2467 callback.Run(error);
2481 } 2468 }
2482 2469
2483 void GDataFileSystem::OnRemoveEntryFromDirectoryCompleted(
2484 const FilePathUpdateCallback& callback,
2485 const FilePath& file_path,
2486 const FilePath& dir_path,
2487 GDataErrorCode status,
2488 const GURL& document_url) {
2489 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
2490
2491 FilePath updated_file_path = file_path;
2492 GDataFileError error = util::GDataToGDataFileError(status);
2493 if (error == GDATA_FILE_OK)
2494 error = RemoveEntryFromDirectoryOnFilesystem(file_path, dir_path,
2495 &updated_file_path);
2496
2497 if (!callback.is_null())
2498 callback.Run(error, updated_file_path);
2499 }
2500
2501 void GDataFileSystem::OnRemovedDocument( 2470 void GDataFileSystem::OnRemovedDocument(
2502 const FileOperationCallback& callback, 2471 const FileOperationCallback& callback,
2503 const FilePath& file_path, 2472 const FilePath& file_path,
2504 GDataErrorCode status, 2473 GDataErrorCode status,
2505 const GURL& document_url) { 2474 const GURL& document_url) {
2506 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 2475 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
2507 2476
2508 GDataFileError error = util::GDataToGDataFileError(status); 2477 GDataFileError error = util::GDataToGDataFileError(status);
2509 2478
2510 if (error == GDATA_FILE_OK) 2479 if (error == GDATA_FILE_OK)
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
2614 } 2583 }
2615 } 2584 }
2616 2585
2617 void GDataFileSystem::OnDownloadStoredToCache(GDataFileError error, 2586 void GDataFileSystem::OnDownloadStoredToCache(GDataFileError error,
2618 const std::string& resource_id, 2587 const std::string& resource_id,
2619 const std::string& md5) { 2588 const std::string& md5) {
2620 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 2589 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
2621 // Nothing much to do here for now. 2590 // Nothing much to do here for now.
2622 } 2591 }
2623 2592
2624 GDataFileError GDataFileSystem::RenameFileOnFilesystem( 2593 void GDataFileSystem::RenameFileOnFileSystem(
2625 const FilePath& file_path, 2594 const FilePath& file_path,
2626 const FilePath::StringType& new_name, 2595 const FilePath::StringType& new_name,
2627 FilePath* updated_file_path) { 2596 const FileMoveCallback& callback,
2597 GDataErrorCode status,
2598 const GURL& document_url) {
2628 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 2599 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
2629 DCHECK(updated_file_path); 2600
2601 const GDataFileError error = util::GDataToGDataFileError(status);
2602 if (error != GDATA_FILE_OK) {
2603 if (!callback.is_null())
2604 callback.Run(error, FilePath());
2605 return;
2606 }
2630 2607
2631 GDataEntry* entry = directory_service_->FindEntryByPathSync(file_path); 2608 GDataEntry* entry = directory_service_->FindEntryByPathSync(file_path);
2632 if (!entry) 2609 if (!entry) {
2633 return GDATA_FILE_ERROR_NOT_FOUND; 2610 if (!callback.is_null())
2611 callback.Run(GDATA_FILE_ERROR_NOT_FOUND, FilePath());
2612 return;
2613 }
2634 2614
2635 DCHECK(entry->parent()); 2615 DCHECK(entry->parent());
2636 entry->set_title(new_name); 2616 entry->set_title(new_name);
2637 // After changing the title of the entry, call TakeFile() to remove the 2617 // After changing the title of the entry, call MoveEntryToDirectory() to
2638 // entry from its parent directory and then add it back in order to go 2618 // remove the entry from its parent directory and then add it back in order to
2639 // through the file name de-duplication. 2619 // go through the file name de-duplication.
2640 // TODO(achuith/satorux/zel): This code is fragile. The title has been 2620 // TODO(achuith/satorux/zel): This code is fragile. The title has been
2641 // changed, but not the file_name. TakeEntry removes the child based on the 2621 // changed, but not the file_name. MoveEntryToDirectory calls RemoveChild to
2642 // old file_name, and then re-adds the child by first assigning the new title 2622 // remove the child based on the old file_name, and then re-adds the child by
2643 // to file_name. http://crbug.com/30157 2623 // first assigning the new title to file_name. http://crbug.com/30157
2644 if (!entry->parent()->TakeEntry(entry)) 2624 directory_service_->MoveEntryToDirectory(
2645 return GDATA_FILE_ERROR_FAILED; 2625 entry->parent()->GetFilePath(),
2646 2626 entry,
2647 *updated_file_path = entry->GetFilePath(); 2627 base::Bind(&GDataFileSystem::OnMoveEntryToDirectoryWithFileMoveCallback,
2648 2628 ui_weak_ptr_,
2649 FOR_EACH_OBSERVER(GDataFileSystemInterface::Observer, observers_, 2629 callback));
2650 OnDirectoryChanged(updated_file_path->DirName()));
2651 return GDATA_FILE_OK;
2652 } 2630 }
2653 2631
2654 GDataFileError GDataFileSystem::AddEntryToDirectoryOnFilesystem( 2632 void GDataFileSystem::RemoveEntryFromDirectoryOnFileSystem(
2655 GDataEntry* entry, const FilePath& dir_path) { 2633 const FileMoveCallback& callback,
2634 const FilePath& file_path,
2635 const FilePath& dir_path,
2636 GDataErrorCode status,
2637 const GURL& document_url) {
2656 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 2638 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
2657 DCHECK(entry);
2658 2639
2659 GDataEntry* dir_entry = directory_service_->FindEntryByPathSync(dir_path); 2640 const GDataFileError error = util::GDataToGDataFileError(status);
2660 if (!dir_entry) 2641 if (error != GDATA_FILE_OK) {
2661 return GDATA_FILE_ERROR_NOT_FOUND; 2642 if (!callback.is_null())
2643 callback.Run(error, FilePath());
2644 return;
2645 }
2662 2646
2663 GDataDirectory* dir = dir_entry->AsGDataDirectory(); 2647 GDataEntry* entry = directory_service_->FindEntryByPathSync(file_path);
2664 if (!dir) 2648 if (!entry) {
2665 return GDATA_FILE_ERROR_NOT_A_DIRECTORY; 2649 if (!callback.is_null())
2650 callback.Run(GDATA_FILE_ERROR_NOT_FOUND, FilePath());
2651 return;
2652 }
2666 2653
2667 if (!dir->TakeEntry(entry)) 2654 directory_service_->MoveEntryToDirectory(
2668 return GDATA_FILE_ERROR_FAILED; 2655 directory_service_->root()->GetFilePath(),
2669 2656 entry,
2670 FOR_EACH_OBSERVER(GDataFileSystemInterface::Observer, observers_, 2657 base::Bind(&GDataFileSystem::OnMoveEntryToDirectoryWithFileMoveCallback,
2671 OnDirectoryChanged(dir_path)); 2658 ui_weak_ptr_,
2672 return GDATA_FILE_OK; 2659 callback));
2673 } 2660 }
2674 2661
2675 GDataFileError GDataFileSystem::RemoveEntryFromDirectoryOnFilesystem( 2662 void GDataFileSystem::OnMoveEntryToDirectoryWithFileMoveCallback(
2676 const FilePath& file_path, const FilePath& dir_path, 2663 const FileMoveCallback& callback,
2677 FilePath* updated_file_path) { 2664 GDataFileError error,
2678 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 2665 const FilePath& moved_file_path) {
2679 DCHECK(updated_file_path); 2666 if (error == GDATA_FILE_OK)
2667 OnDirectoryChanged(moved_file_path.DirName());
2680 2668
2681 GDataEntry* entry = directory_service_->FindEntryByPathSync(file_path); 2669 if (!callback.is_null())
2682 if (!entry) 2670 callback.Run(error, moved_file_path);
2683 return GDATA_FILE_ERROR_NOT_FOUND; 2671 }
2684 2672
2685 GDataEntry* dir = directory_service_->FindEntryByPathSync(dir_path); 2673 void GDataFileSystem::OnMoveEntryToDirectoryWithFileOperationCallback(
satorux1 2012/08/10 21:04:16 The two callers of FindEntryByPathSync() were remo
2686 if (!dir) 2674 const FileOperationCallback& callback,
2687 return GDATA_FILE_ERROR_NOT_FOUND; 2675 GDataFileError error,
2676 const FilePath& moved_file_path) {
2677 if (error == GDATA_FILE_OK)
2678 OnDirectoryChanged(moved_file_path.DirName());
2688 2679
2689 if (!dir->AsGDataDirectory()) 2680 if (!callback.is_null())
2690 return GDATA_FILE_ERROR_NOT_A_DIRECTORY; 2681 callback.Run(error);
2691
2692 DCHECK_EQ(dir->AsGDataDirectory(), entry->parent());
2693
2694 if (!directory_service_->root()->TakeEntry(entry))
2695 return GDATA_FILE_ERROR_FAILED;
2696
2697 *updated_file_path = entry->GetFilePath();
2698
2699 FOR_EACH_OBSERVER(GDataFileSystemInterface::Observer, observers_,
2700 OnDirectoryChanged(updated_file_path->DirName()));
2701 return GDATA_FILE_OK;
2702 } 2682 }
2703 2683
2704 GDataFileError GDataFileSystem::RemoveEntryFromFileSystem( 2684 GDataFileError GDataFileSystem::RemoveEntryFromFileSystem(
2705 const FilePath& file_path) { 2685 const FilePath& file_path) {
2706 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 2686 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
2707 2687
2708 std::string resource_id; 2688 std::string resource_id;
2709 GDataFileError error = RemoveEntryFromGData(file_path, &resource_id); 2689 GDataFileError error = RemoveEntryFromGData(file_path, &resource_id);
2710 if (error != GDATA_FILE_OK) 2690 if (error != GDATA_FILE_OK)
2711 return error; 2691 return error;
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
2782 return GDATA_FILE_ERROR_FAILED; 2762 return GDATA_FILE_ERROR_FAILED;
2783 2763
2784 // Check if parent is a directory since in theory since this is a callback 2764 // Check if parent is a directory since in theory since this is a callback
2785 // something could in the meantime have nuked the parent dir and created a 2765 // something could in the meantime have nuked the parent dir and created a
2786 // file with the exact same name. 2766 // file with the exact same name.
2787 GDataDirectory* parent_dir = entry->AsGDataDirectory(); 2767 GDataDirectory* parent_dir = entry->AsGDataDirectory();
2788 if (!parent_dir) 2768 if (!parent_dir)
2789 return GDATA_FILE_ERROR_FAILED; 2769 return GDATA_FILE_ERROR_FAILED;
2790 2770
2791 GDataEntry* new_entry = GDataEntry::FromDocumentEntry( 2771 GDataEntry* new_entry = GDataEntry::FromDocumentEntry(
2792 parent_dir, doc_entry.get(), directory_service_.get()); 2772 NULL, doc_entry.get(), directory_service_.get());
2793 if (!new_entry) 2773 if (!new_entry)
2794 return GDATA_FILE_ERROR_FAILED; 2774 return GDATA_FILE_ERROR_FAILED;
2795 2775
2796 parent_dir->AddEntry(new_entry); 2776 parent_dir->AddEntry(new_entry);
2797 2777
2798 FOR_EACH_OBSERVER(GDataFileSystemInterface::Observer, observers_, 2778 OnDirectoryChanged(directory_path);
2799 OnDirectoryChanged(directory_path));
2800 return GDATA_FILE_OK; 2779 return GDATA_FILE_OK;
2801 } 2780 }
2802 2781
2803 GDataFileSystem::FindMissingDirectoryResult 2782 GDataFileSystem::FindMissingDirectoryResult
2804 GDataFileSystem::FindFirstMissingParentDirectory( 2783 GDataFileSystem::FindFirstMissingParentDirectory(
2805 const FilePath& directory_path, 2784 const FilePath& directory_path,
2806 GURL* last_dir_content_url, 2785 GURL* last_dir_content_url,
2807 FilePath* first_missing_parent_path) { 2786 FilePath* first_missing_parent_path) {
2808 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 2787 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
2809 2788
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
2850 return GDATA_FILE_ERROR_ACCESS_DENIED; 2829 return GDATA_FILE_ERROR_ACCESS_DENIED;
2851 2830
2852 // If it's a file (only files have resource id), get its resource id so that 2831 // If it's a file (only files have resource id), get its resource id so that
2853 // we can remove it after releasing the auto lock. 2832 // we can remove it after releasing the auto lock.
2854 if (entry->AsGDataFile()) 2833 if (entry->AsGDataFile())
2855 *resource_id = entry->AsGDataFile()->resource_id(); 2834 *resource_id = entry->AsGDataFile()->resource_id();
2856 2835
2857 GDataDirectory* parent_dir = entry->parent(); 2836 GDataDirectory* parent_dir = entry->parent();
2858 parent_dir->RemoveEntry(entry); 2837 parent_dir->RemoveEntry(entry);
2859 2838
2860 FOR_EACH_OBSERVER(GDataFileSystemInterface::Observer, observers_, 2839 OnDirectoryChanged(parent_dir->GetFilePath());
2861 OnDirectoryChanged(parent_dir->GetFilePath()));
2862 return GDATA_FILE_OK; 2840 return GDATA_FILE_OK;
2863 } 2841 }
2864 2842
2865 void GDataFileSystem::AddUploadedFile( 2843 void GDataFileSystem::AddUploadedFile(
2866 UploadMode upload_mode, 2844 UploadMode upload_mode,
2867 const FilePath& virtual_dir_path, 2845 const FilePath& virtual_dir_path,
2868 scoped_ptr<DocumentEntry> entry, 2846 scoped_ptr<DocumentEntry> entry,
2869 const FilePath& file_content_path, 2847 const FilePath& file_content_path,
2870 GDataCache::FileOperationType cache_operation, 2848 GDataCache::FileOperationType cache_operation,
2871 const base::Closure& callback) { 2849 const base::Closure& callback) {
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
2907 virtual_dir_path); 2885 virtual_dir_path);
2908 if (!dir_entry) 2886 if (!dir_entry)
2909 return; 2887 return;
2910 2888
2911 GDataDirectory* parent_dir = dir_entry->AsGDataDirectory(); 2889 GDataDirectory* parent_dir = dir_entry->AsGDataDirectory();
2912 if (!parent_dir) 2890 if (!parent_dir)
2913 return; 2891 return;
2914 2892
2915 scoped_ptr<GDataEntry> new_entry( 2893 scoped_ptr<GDataEntry> new_entry(
2916 GDataEntry::FromDocumentEntry( 2894 GDataEntry::FromDocumentEntry(
2917 parent_dir, entry.get(), directory_service_.get())); 2895 NULL, entry.get(), directory_service_.get()));
2918 if (!new_entry.get()) 2896 if (!new_entry.get())
2919 return; 2897 return;
2920 2898
2921 if (upload_mode == UPLOAD_EXISTING_FILE) { 2899 if (upload_mode == UPLOAD_EXISTING_FILE) {
2922 // Remove an existing entry, which should be present. 2900 // Remove an existing entry, which should be present.
2923 const std::string& resource_id = new_entry->resource_id(); 2901 const std::string& resource_id = new_entry->resource_id();
2924 directory_service_->GetEntryByResourceIdAsync(resource_id, 2902 directory_service_->GetEntryByResourceIdAsync(resource_id,
2925 base::Bind(&RemoveStaleEntryOnUpload, resource_id, parent_dir)); 2903 base::Bind(&RemoveStaleEntryOnUpload, resource_id, parent_dir));
2926 } 2904 }
2927 2905
2928 GDataFile* file = new_entry->AsGDataFile(); 2906 GDataFile* file = new_entry->AsGDataFile();
2929 DCHECK(file); 2907 DCHECK(file);
2930 const std::string& resource_id = file->resource_id(); 2908 const std::string& resource_id = file->resource_id();
2931 const std::string& md5 = file->file_md5(); 2909 const std::string& md5 = file->file_md5();
2932 parent_dir->AddEntry(new_entry.release()); 2910 parent_dir->AddEntry(new_entry.release());
2933 2911
2934 FOR_EACH_OBSERVER(GDataFileSystemInterface::Observer, observers_, 2912 OnDirectoryChanged(virtual_dir_path);
2935 OnDirectoryChanged(virtual_dir_path));
2936 2913
2937 if (upload_mode == UPLOAD_NEW_FILE) { 2914 if (upload_mode == UPLOAD_NEW_FILE) {
2938 // Add the file to the cache if we have uploaded a new file. 2915 // Add the file to the cache if we have uploaded a new file.
2939 cache_->StoreOnUIThread(resource_id, 2916 cache_->StoreOnUIThread(resource_id,
2940 md5, 2917 md5,
2941 file_content_path, 2918 file_content_path,
2942 cache_operation, 2919 cache_operation,
2943 base::Bind(&OnCacheUpdatedForAddUploadedFile, 2920 base::Bind(&OnCacheUpdatedForAddUploadedFile,
2944 callback_runner.Release())); 2921 callback_runner.Release()));
2945 } else if (upload_mode == UPLOAD_EXISTING_FILE) { 2922 } else if (upload_mode == UPLOAD_EXISTING_FILE) {
(...skipping 467 matching lines...) Expand 10 before | Expand all | Expand 10 after
3413 } 3390 }
3414 3391
3415 PlatformFileInfoProto entry_file_info; 3392 PlatformFileInfoProto entry_file_info;
3416 GDataEntry::ConvertPlatformFileInfoToProto(*file_info, &entry_file_info); 3393 GDataEntry::ConvertPlatformFileInfoToProto(*file_info, &entry_file_info);
3417 *entry_proto->mutable_file_info() = entry_file_info; 3394 *entry_proto->mutable_file_info() = entry_file_info;
3418 if (!callback.is_null()) 3395 if (!callback.is_null())
3419 callback.Run(GDATA_FILE_OK, entry_proto.Pass()); 3396 callback.Run(GDATA_FILE_OK, entry_proto.Pass());
3420 } 3397 }
3421 3398
3422 } // namespace gdata 3399 } // namespace gdata
OLDNEW
« no previous file with comments | « chrome/browser/chromeos/gdata/gdata_file_system.h ('k') | chrome/browser/chromeos/gdata/gdata_files.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698