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

Unified Diff: chrome/browser/chromeos/gdata/gdata_files.cc

Issue 10829277: GDataFileSystem is no longer a friend of GDataDirectory. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: NotifyAndRunFileMoveCallback needs to accept null callback 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/gdata/gdata_files.cc
===================================================================
--- chrome/browser/chromeos/gdata/gdata_files.cc (revision 151579)
+++ chrome/browser/chromeos/gdata/gdata_files.cc (working copy)
@@ -5,7 +5,6 @@
#include "chrome/browser/chromeos/gdata/gdata_files.h"
#include <leveldb/db.h>
-#include <vector>
#include "base/message_loop_proxy.h"
#include "base/platform_file.h"
@@ -254,6 +253,8 @@
}
void GDataDirectory::AddEntry(GDataEntry* entry) {
+ DCHECK(!entry->parent());
+
// The entry name may have been changed due to prior name de-duplication.
// We need to first restore the file name based on the title before going
// through name de-duplication again when it is added to another directory.
@@ -296,14 +297,18 @@
bool GDataDirectory::TakeOverEntries(GDataDirectory* dir) {
for (GDataFileCollection::iterator iter = dir->child_files_.begin();
iter != dir->child_files_.end(); ++iter) {
- AddEntry(iter->second);
+ GDataEntry* entry = iter->second;
+ entry->SetParent(NULL);
+ AddEntry(entry);
}
dir->child_files_.clear();
for (GDataDirectoryCollection::iterator iter =
dir->child_directories_.begin();
iter != dir->child_directories_.end(); ++iter) {
- AddEntry(iter->second);
+ GDataEntry* entry = iter->second;
+ entry->SetParent(NULL);
+ AddEntry(entry);
}
dir->child_directories_.clear();
return true;
@@ -355,6 +360,8 @@
// Then delete it from tree.
child_files_.erase(base_name);
child_directories_.erase(base_name);
+
+ entry->SetParent(NULL);
}
void GDataDirectory::RemoveChildren() {
@@ -563,12 +570,27 @@
root_.reset();
}
+void GDataDirectoryService::AddEntryToDirectory(
+ GDataDirectory* directory,
+ GDataEntry* new_entry,
+ const FileMoveCallback& callback) {
+ DCHECK(directory);
+ DCHECK(new_entry);
+ DCHECK(!callback.is_null());
+
+ directory->AddEntry(new_entry);
+ DVLOG(1) << "AddEntryToDirectory " << new_entry->GetFilePath().value();
+ base::MessageLoopProxy::current()->PostTask(FROM_HERE,
+ base::Bind(callback, GDATA_FILE_OK, new_entry->GetFilePath()));
+}
+
void GDataDirectoryService::MoveEntryToDirectory(
const FilePath& directory_path,
GDataEntry* entry,
const FileMoveCallback& callback) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
DCHECK(entry);
+ DCHECK(!callback.is_null());
if (entry->parent())
entry->parent()->RemoveChild(entry);
@@ -585,12 +607,24 @@
moved_file_path = entry->GetFilePath();
error = GDATA_FILE_OK;
}
- if (!callback.is_null()) {
- base::MessageLoopProxy::current()->PostTask(
- FROM_HERE, base::Bind(callback, error, moved_file_path));
- }
+ DVLOG(1) << "MoveEntryToDirectory " << moved_file_path.value();
+ base::MessageLoopProxy::current()->PostTask(
+ FROM_HERE, base::Bind(callback, error, moved_file_path));
}
+void GDataDirectoryService::RemoveEntryFromParent(
+ GDataEntry* entry,
+ const FileMoveCallback& callback) {
+ GDataDirectory* parent = entry->parent();
+ DCHECK(parent);
+ DCHECK(!callback.is_null());
+ DVLOG(1) << "RemoveEntryFromParent " << entry->GetFilePath().value();
+
+ parent->RemoveEntry(entry);
+ base::MessageLoopProxy::current()->PostTask(FROM_HERE,
+ base::Bind(callback, GDATA_FILE_OK, parent->GetFilePath()));
+}
+
void GDataDirectoryService::AddEntryToResourceMap(GDataEntry* entry) {
// GDataFileSystem has already locked.
DVLOG(1) << "AddEntryToResourceMap " << entry->resource_id();
@@ -734,6 +768,50 @@
}
}
+void GDataDirectoryService::RefreshDirectory(
+ const std::string& directory_resource_id,
+ const ResourceMap& file_map,
+ const FileMoveCallback& callback) {
+ DCHECK(!callback.is_null());
+ GetEntryByResourceIdAsync(
+ directory_resource_id,
+ base::Bind(&GDataDirectoryService::RefreshDirectoryInternal,
+ file_map,
+ callback));
+}
+
+// static
+void GDataDirectoryService::RefreshDirectoryInternal(
+ const ResourceMap& file_map,
+ const FileMoveCallback& callback,
+ GDataEntry* directory_entry) {
+ DCHECK(!callback.is_null());
+
+ if (!directory_entry) {
+ callback.Run(GDATA_FILE_ERROR_NOT_FOUND, FilePath());
+ return;
+ }
+
+ GDataDirectory* directory = directory_entry->AsGDataDirectory();
+ if (!directory) {
+ callback.Run(GDATA_FILE_ERROR_NOT_A_DIRECTORY, FilePath());
+ return;
+ }
+
+ directory->RemoveChildFiles();
+ // Add files from file_map.
+ for (ResourceMap::const_iterator it = file_map.begin();
+ it != file_map.end(); ++it) {
+ scoped_ptr<GDataEntry> entry(it->second);
+ // Skip if it's not a file (i.e. directory).
+ if (!entry->AsGDataFile())
+ continue;
+ directory->AddEntry(entry.release());
+ }
+
+ callback.Run(GDATA_FILE_OK, directory->GetFilePath());
+}
+
void GDataDirectoryService::InitFromDB(
const FilePath& db_path,
base::SequencedTaskRunner* blocking_task_runner,
« no previous file with comments | « chrome/browser/chromeos/gdata/gdata_files.h ('k') | chrome/browser/chromeos/gdata/gdata_wapi_feed_processor.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698