Index: chrome/browser/google_apis/fake_drive_service.cc |
diff --git a/chrome/browser/google_apis/fake_drive_service.cc b/chrome/browser/google_apis/fake_drive_service.cc |
index b0c48febcf68ef5cdde713d88fa1aa0c3dd40791..aa531bc2ff92ce6623e134c0172633726f991288 100644 |
--- a/chrome/browser/google_apis/fake_drive_service.cc |
+++ b/chrome/browser/google_apis/fake_drive_service.cc |
@@ -25,6 +25,11 @@ using content::BrowserThread; |
namespace google_apis { |
namespace { |
+ |
+// Rel property of upload link in the entries dictionary value. |
+const char kUploadUrlRel[] = |
+ "http://schemas.google.com/g/2005#resumable-create-media"; |
+ |
// Returns true if a resource entry matches with the search query. |
// Supports queries consist of following format. |
// - Phrases quoted by double/single quotes |
@@ -777,12 +782,112 @@ void FakeDriveService::InitiateUpload( |
const InitiateUploadCallback& callback) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
DCHECK(!callback.is_null()); |
-} |
-void FakeDriveService::ResumeUpload(const ResumeUploadParams& params, |
- const UploadRangeCallback& callback) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- DCHECK(!callback.is_null()); |
+ if (offline_) { |
+ MessageLoop::current()->PostTask( |
+ FROM_HERE, |
+ base::Bind(callback, GDATA_NO_CONNECTION, GURL())); |
+ return; |
+ } |
+ |
+ DictionaryValue* entry = FindEntryByUploadUrl(params.upload_location); |
+ if (!entry) { |
+ MessageLoop::current()->PostTask( |
+ FROM_HERE, |
+ base::Bind(callback, HTTP_NOT_FOUND, GURL())); |
+ return; |
+ } |
+ |
+ if (params.upload_mode == UPLOAD_EXISTING_FILE) { |
+ std::string etag; |
+ entry->GetString("gd$etag", &etag); |
+ if (params.etag != etag) { |
+ MessageLoop::current()->PostTask( |
+ FROM_HERE, |
+ base::Bind(callback, HTTP_PRECONDITION, GURL())); |
+ return; |
+ } |
+ MessageLoop::current()->PostTask( |
+ FROM_HERE, |
+ base::Bind(callback, HTTP_SUCCESS, params.upload_location)); |
+ return; |
+ } |
+ |
+ // If the title was set, the upload_location is the location of the parent |
+ // directory of the file that will be uploaded. The file does not yet exist |
+ // and it must be created. Its title will be the passed title param. |
+ std::string parent_resource_id; |
+ entry->GetString("gd$resourceId.$t", &parent_resource_id); |
+ |
+ std::string resource_id = GetNewResourceId(); |
+ GURL upload_url = GURL("https://xxx/upload/" + resource_id); |
+ |
+ scoped_ptr<base::DictionaryValue> new_entry(new base::DictionaryValue); |
+ // Set the resource ID and the title |
+ new_entry->SetString("gd$resourceId.$t", resource_id); |
+ new_entry->SetString("title.$t", params.title); |
+ new_entry->SetString("docs$filename", params.title); |
+ new_entry->SetString("docs$size", "0"); |
+ new_entry->SetString("docs$md5Checksum.$t", |
+ "3b4385ebefec6e743574c76bbd0575de"); |
+ |
+ // Add "category" which sets the resource type to file. |
+ base::ListValue* categories = new base::ListValue; |
+ base::DictionaryValue* category = new base::DictionaryValue; |
+ category->SetString("label", "test/foo"); |
+ category->SetString("scheme", "http://schemas.google.com/g/2005#kind"); |
+ category->SetString("term", "http://schemas.google.com/docs/2007#file"); |
+ categories->Append(category); |
+ new_entry->Set("category", categories); |
+ |
+ // Add "content" which sets the content URL. |
+ base::DictionaryValue* content = new base::DictionaryValue; |
+ content->SetString("src", "https://xxx/content/" + resource_id); |
+ content->SetString("type", params.content_type); |
+ new_entry->Set("content", content); |
+ |
+ // Add "link" which sets the parent URL, the edit URL and the upload URL. |
+ base::ListValue* links = new base::ListValue; |
+ if (parent_resource_id != GetRootResourceId()) { |
+ base::DictionaryValue* parent_link = new base::DictionaryValue; |
+ parent_link->SetString("href", GetFakeLinkUrl(parent_resource_id).spec()); |
+ parent_link->SetString("rel", |
+ "http://schemas.google.com/docs/2007#parent"); |
+ links->Append(parent_link); |
+ } |
+ |
+ base::DictionaryValue* edit_link = new base::DictionaryValue; |
+ edit_link->SetString("href", "https://xxx/edit/" + resource_id); |
+ edit_link->SetString("rel", "edit"); |
+ links->Append(edit_link); |
+ |
+ base::DictionaryValue* upload_link = new base::DictionaryValue; |
+ upload_link->SetString("href", upload_url.spec()); |
+ upload_link->SetString("rel", kUploadUrlRel); |
+ links->Append(upload_link); |
+ new_entry->Set("link", links); |
+ |
+ AddNewChangestamp(new_entry.get()); |
+ |
+ base::DictionaryValue* resource_list_dict = NULL; |
+ base::ListValue* entries = NULL; |
+ if (!resource_list_value_->GetAsDictionary(&resource_list_dict)) { |
+ MessageLoop::current()->PostTask( |
+ FROM_HERE, |
+ base::Bind(callback, HTTP_NOT_FOUND, GURL())); |
+ return; |
+ } |
+ |
+ // If there are no entries, prepare an empty entry to add. |
+ if (!resource_list_dict->HasKey("entry")) |
+ resource_list_dict->Set("entry", new ListValue); |
+ |
+ if (resource_list_dict->GetList("entry", &entries)) |
+ entries->Append(new_entry.release()); |
+ |
+ MessageLoop::current()->PostTask( |
+ FROM_HERE, |
+ base::Bind(callback, HTTP_SUCCESS, upload_url)); |
} |
void FakeDriveService::GetUploadStatus( |
@@ -795,6 +900,65 @@ void FakeDriveService::GetUploadStatus( |
DCHECK(!callback.is_null()); |
} |
+void FakeDriveService::ResumeUpload(const ResumeUploadParams& params, |
+ const UploadRangeCallback& callback) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ DCHECK(!callback.is_null()); |
+ |
+ scoped_ptr<ResourceEntry> result_entry; |
+ |
+ if (offline_) { |
+ MessageLoop::current()->PostTask( |
+ FROM_HERE, |
+ base::Bind(callback, |
+ UploadRangeResponse(GDATA_NO_CONNECTION, |
+ params.start_position, |
+ params.end_position), |
+ base::Passed(&result_entry))); |
+ return; |
+ } |
+ |
+ DictionaryValue* entry = NULL; |
+ entry = FindEntryByUploadUrl(params.upload_location); |
+ if (!entry) { |
+ MessageLoop::current()->PostTask( |
+ FROM_HERE, |
+ base::Bind(callback, |
+ UploadRangeResponse(HTTP_NOT_FOUND, |
+ params.start_position, |
+ params.end_position), |
+ base::Passed(&result_entry))); |
+ return; |
+ } |
+ |
+ entry->SetString("docs$size.$t", base::Int64ToString(params.end_position)); |
+ |
+ if (params.content_length != params.end_position) { |
+ MessageLoop::current()->PostTask( |
+ FROM_HERE, |
+ base::Bind(callback, |
+ UploadRangeResponse(HTTP_RESUME_INCOMPLETE, |
+ params.start_position, |
+ params.end_position), |
+ base::Passed(&result_entry))); |
+ return; |
+ } |
+ |
+ result_entry = ResourceEntry::CreateFrom(*entry).Pass(); |
+ |
+ GDataErrorCode return_code = HTTP_SUCCESS; |
+ if (params.upload_mode == UPLOAD_NEW_FILE) |
+ return_code = HTTP_CREATED; |
+ |
+ MessageLoop::current()->PostTask( |
+ FROM_HERE, |
+ base::Bind(callback, |
+ UploadRangeResponse(return_code, |
+ params.start_position, |
+ params.end_position), |
+ base::Passed(&result_entry))); |
+} |
+ |
void FakeDriveService::AuthorizeApp(const GURL& edit_url, |
const std::string& app_id, |
const AuthorizeAppCallback& callback) { |
@@ -848,6 +1012,42 @@ base::DictionaryValue* FakeDriveService::FindEntryByContentUrl( |
return NULL; |
} |
+base::DictionaryValue* FakeDriveService::FindEntryByUploadUrl( |
+ const GURL& upload_url) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ |
+ base::DictionaryValue* resource_list_dict = NULL; |
+ base::ListValue* entries = NULL; |
+ // Go through entries and return the one that matches |upload_url|. |
+ if (resource_list_value_->GetAsDictionary(&resource_list_dict) && |
+ resource_list_dict->GetList("entry", &entries)) { |
+ for (size_t i = 0; i < entries->GetSize(); ++i) { |
+ base::DictionaryValue* entry = NULL; |
+ base::ListValue* links = NULL; |
+ if (entries->GetDictionary(i, &entry) && |
+ entry->GetList("link", &links) && |
+ links) { |
+ for (size_t link_index = 0; |
+ link_index < links->GetSize(); |
+ ++link_index) { |
+ base::DictionaryValue* link = NULL; |
+ std::string rel; |
+ std::string found_upload_url; |
+ if (links->GetDictionary(link_index, &link) && |
+ link && link->GetString("rel", &rel) && |
+ rel == kUploadUrlRel && |
+ link->GetString("href", &found_upload_url) && |
+ GURL(found_upload_url) == upload_url) { |
+ return entry; |
+ } |
+ } |
+ } |
+ } |
+ } |
+ |
+ return NULL; |
+} |
+ |
std::string FakeDriveService::GetNewResourceId() { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |