Index: chrome/browser/google_apis/drive_api_operations.cc |
diff --git a/chrome/browser/google_apis/drive_api_operations.cc b/chrome/browser/google_apis/drive_api_operations.cc |
index f9c75db4e79ff344b6fcf9ec90713278b7ad50cf..fdc8bf518606d41dad4041d9080889918cc8203d 100644 |
--- a/chrome/browser/google_apis/drive_api_operations.cc |
+++ b/chrome/browser/google_apis/drive_api_operations.cc |
@@ -5,6 +5,7 @@ |
#include "chrome/browser/google_apis/drive_api_operations.h" |
#include "base/bind.h" |
+#include "base/callback.h" |
#include "base/json/json_writer.h" |
#include "base/values.h" |
#include "chrome/browser/google_apis/drive_api_parser.h" |
@@ -19,26 +20,27 @@ namespace { |
const char kContentTypeApplicationJson[] = "application/json"; |
const char kDirectoryMimeType[] = "application/vnd.google-apps.folder"; |
-// Parses the JSON value to AboutResource and runs |callback| on the UI |
+// Parses the JSON value to a resource typed |T| and runs |callback| on the UI |
// thread once parsing is done. |
-void ParseAboutResourceAndRun( |
- const GetAboutResourceCallback& callback, |
+template<typename T> |
+void ParseJsonAndRun( |
+ const base::Callback<void(GDataErrorCode, scoped_ptr<T>)>& callback, |
GDataErrorCode error, |
scoped_ptr<base::Value> value) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
DCHECK(!callback.is_null()); |
- scoped_ptr<AboutResource> about_resource; |
+ scoped_ptr<T> resource; |
if (value.get()) { |
- about_resource = AboutResource::CreateFrom(*value); |
- if (!about_resource) { |
- // Failed to parse the JSON value (although the JSON value is available), |
- // so let callback know the parsing error. |
+ resource = T::CreateFrom(*value); |
+ if (!resource) { |
+ // Failed to parse the JSON value, although the JSON value is available, |
+ // so let the callback know the parsing error. |
error = GDATA_PARSE_ERROR; |
} |
} |
- callback.Run(error, about_resource.Pass()); |
+ callback.Run(error, resource.Pass()); |
} |
} // namespace |
@@ -51,7 +53,7 @@ GetAboutOperation::GetAboutOperation( |
const DriveApiUrlGenerator& url_generator, |
const GetAboutResourceCallback& callback) |
: GetDataOperation(registry, url_request_context_getter, |
- base::Bind(&ParseAboutResourceAndRun, callback)), |
+ base::Bind(&ParseJsonAndRun<AboutResource>, callback)), |
url_generator_(url_generator) { |
DCHECK(!callback.is_null()); |
} |
@@ -131,8 +133,9 @@ GetFileOperation::GetFileOperation( |
net::URLRequestContextGetter* url_request_context_getter, |
const DriveApiUrlGenerator& url_generator, |
const std::string& file_id, |
- const GetDataCallback& callback) |
- : GetDataOperation(registry, url_request_context_getter, callback), |
+ const FileResourceCallback& callback) |
+ : GetDataOperation(registry, url_request_context_getter, |
+ base::Bind(&ParseJsonAndRun<FileResource>, callback)), |
url_generator_(url_generator), |
file_id_(file_id) { |
DCHECK(!callback.is_null()); |
@@ -154,8 +157,9 @@ CreateDirectoryOperation::CreateDirectoryOperation( |
const DriveApiUrlGenerator& url_generator, |
const std::string& parent_resource_id, |
const std::string& directory_name, |
- const GetDataCallback& callback) |
- : GetDataOperation(registry, url_request_context_getter, callback), |
+ const FileResourceCallback& callback) |
+ : GetDataOperation(registry, url_request_context_getter, |
+ base::Bind(&ParseJsonAndRun<FileResource>, callback)), |
url_generator_(url_generator), |
parent_resource_id_(parent_resource_id), |
directory_name_(directory_name) { |