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

Unified Diff: trunk/src/google_apis/drive/drive_api_requests.cc

Issue 449323002: Revert 288017 "Parse Drive API responses all at once in the bloc..." (Closed) Base URL: svn://svn.chromium.org/chrome/
Patch Set: Created 6 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
« no previous file with comments | « trunk/src/google_apis/drive/drive_api_requests.h ('k') | trunk/src/google_apis/drive/gdata_wapi_requests.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: trunk/src/google_apis/drive/drive_api_requests.cc
===================================================================
--- trunk/src/google_apis/drive/drive_api_requests.cc (revision 288215)
+++ trunk/src/google_apis/drive/drive_api_requests.cc (working copy)
@@ -11,6 +11,7 @@
#include "base/sequenced_task_runner.h"
#include "base/task_runner_util.h"
#include "base/values.h"
+#include "google_apis/drive/drive_api_parser.h"
#include "google_apis/drive/request_sender.h"
#include "google_apis/drive/request_util.h"
#include "google_apis/drive/time_util.h"
@@ -22,6 +23,70 @@
const char kContentTypeApplicationJson[] = "application/json";
const char kParentLinkKind[] = "drive#fileLink";
+// Parses the JSON value to a resource typed |T| and runs |callback| on the UI
+// thread once parsing is done.
+template<typename T>
+void ParseJsonAndRun(
+ const base::Callback<void(GDataErrorCode, scoped_ptr<T>)>& callback,
+ GDataErrorCode error,
+ scoped_ptr<base::Value> value) {
+ DCHECK(!callback.is_null());
+
+ scoped_ptr<T> resource;
+ if (value) {
+ 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, resource.Pass());
+}
+
+// Thin adapter of T::CreateFrom.
+template<typename T>
+scoped_ptr<T> ParseJsonOnBlockingPool(scoped_ptr<base::Value> value) {
+ return T::CreateFrom(*value);
+}
+
+// Runs |callback| with given |error| and |value|. If |value| is null,
+// overwrites |error| to GDATA_PARSE_ERROR.
+template<typename T>
+void ParseJsonOnBlockingPoolAndRunAfterBlockingPoolTask(
+ const base::Callback<void(GDataErrorCode, scoped_ptr<T>)>& callback,
+ GDataErrorCode error, scoped_ptr<T> value) {
+ if (!value)
+ error = GDATA_PARSE_ERROR;
+ callback.Run(error, value.Pass());
+}
+
+// Parses the JSON value to a resource typed |T| and runs |callback| on
+// blocking pool, and then run on the current thread.
+// TODO(hidehiko): Move this and ParseJsonAndRun defined above into base with
+// merging the tasks running on blocking pool into one.
+template<typename T>
+void ParseJsonOnBlockingPoolAndRun(
+ scoped_refptr<base::TaskRunner> blocking_task_runner,
+ const base::Callback<void(GDataErrorCode, scoped_ptr<T>)>& callback,
+ GDataErrorCode error,
+ scoped_ptr<base::Value> value) {
+ DCHECK(!callback.is_null());
+
+ if (!value) {
+ callback.Run(error, scoped_ptr<T>());
+ return;
+ }
+
+ base::PostTaskAndReplyWithResult(
+ blocking_task_runner,
+ FROM_HERE,
+ base::Bind(&ParseJsonOnBlockingPool<T>, base::Passed(&value)),
+ base::Bind(&ParseJsonOnBlockingPoolAndRunAfterBlockingPoolTask<T>,
+ callback, error));
+}
+
// Parses the JSON value to FileResource instance and runs |callback| on the
// UI thread once parsing is done.
// This is customized version of ParseJsonAndRun defined above to adapt the
@@ -61,16 +126,17 @@
namespace drive {
-//============================ DriveApiPartialFieldRequest ====================
+//============================ DriveApiDataRequest ===========================
-DriveApiPartialFieldRequest::DriveApiPartialFieldRequest(
- RequestSender* sender) : UrlFetchRequestBase(sender) {
+DriveApiDataRequest::DriveApiDataRequest(RequestSender* sender,
+ const GetDataCallback& callback)
+ : GetDataRequest(sender, callback) {
}
-DriveApiPartialFieldRequest::~DriveApiPartialFieldRequest() {
+DriveApiDataRequest::~DriveApiDataRequest() {
}
-GURL DriveApiPartialFieldRequest::GetURL() const {
+GURL DriveApiDataRequest::GetURL() const {
GURL url = GetURLInternal();
if (!fields_.empty())
url = net::AppendOrReplaceQueryParameter(url, "fields", fields_);
@@ -83,7 +149,9 @@
RequestSender* sender,
const DriveApiUrlGenerator& url_generator,
const FileResourceCallback& callback)
- : DriveApiDataRequest<FileResource>(sender, callback),
+ : DriveApiDataRequest(
+ sender,
+ base::Bind(&ParseJsonAndRun<FileResource>, callback)),
url_generator_(url_generator) {
DCHECK(!callback.is_null());
}
@@ -100,7 +168,9 @@
RequestSender* sender,
const DriveApiUrlGenerator& url_generator,
const FileResourceCallback& callback)
- : DriveApiDataRequest<FileResource>(sender, callback),
+ : DriveApiDataRequest(
+ sender,
+ base::Bind(&ParseJsonAndRun<FileResource>, callback)),
url_generator_(url_generator) {
DCHECK(!callback.is_null());
}
@@ -121,7 +191,9 @@
RequestSender* sender,
const DriveApiUrlGenerator& url_generator,
const FileResourceCallback& callback)
- : DriveApiDataRequest<FileResource>(sender, callback),
+ : DriveApiDataRequest(
+ sender,
+ base::Bind(&ParseJsonAndRun<FileResource>, callback)),
url_generator_(url_generator) {
DCHECK(!callback.is_null());
}
@@ -178,7 +250,9 @@
RequestSender* sender,
const DriveApiUrlGenerator& url_generator,
const FileResourceCallback& callback)
- : DriveApiDataRequest<FileResource>(sender, callback),
+ : DriveApiDataRequest(
+ sender,
+ base::Bind(&ParseJsonAndRun<FileResource>, callback)),
url_generator_(url_generator),
set_modified_date_(false),
update_viewed_date_(true) {
@@ -246,7 +320,9 @@
RequestSender* sender,
const DriveApiUrlGenerator& url_generator,
const FileResourceCallback& callback)
- : DriveApiDataRequest<FileResource>(sender, callback),
+ : DriveApiDataRequest(
+ sender,
+ base::Bind(&ParseJsonAndRun<FileResource>, callback)),
url_generator_(url_generator) {
DCHECK(!callback.is_null());
}
@@ -299,7 +375,11 @@
RequestSender* sender,
const DriveApiUrlGenerator& url_generator,
const FileListCallback& callback)
- : DriveApiDataRequest<FileList>(sender, callback),
+ : DriveApiDataRequest(
+ sender,
+ base::Bind(&ParseJsonOnBlockingPoolAndRun<FileList>,
+ make_scoped_refptr(sender->blocking_task_runner()),
+ callback)),
url_generator_(url_generator),
max_results_(100) {
DCHECK(!callback.is_null());
@@ -316,7 +396,11 @@
FilesListNextPageRequest::FilesListNextPageRequest(
RequestSender* sender,
const FileListCallback& callback)
- : DriveApiDataRequest<FileList>(sender, callback) {
+ : DriveApiDataRequest(
+ sender,
+ base::Bind(&ParseJsonOnBlockingPoolAndRun<FileList>,
+ make_scoped_refptr(sender->blocking_task_runner()),
+ callback)) {
DCHECK(!callback.is_null());
}
@@ -361,7 +445,9 @@
RequestSender* sender,
const DriveApiUrlGenerator& url_generator,
const FileResourceCallback& callback)
- : DriveApiDataRequest<FileResource>(sender, callback),
+ : DriveApiDataRequest(
+ sender,
+ base::Bind(&ParseJsonAndRun<FileResource>, callback)),
url_generator_(url_generator) {
DCHECK(!callback.is_null());
}
@@ -382,7 +468,9 @@
RequestSender* sender,
const DriveApiUrlGenerator& url_generator,
const AboutResourceCallback& callback)
- : DriveApiDataRequest<AboutResource>(sender, callback),
+ : DriveApiDataRequest(
+ sender,
+ base::Bind(&ParseJsonAndRun<AboutResource>, callback)),
url_generator_(url_generator) {
DCHECK(!callback.is_null());
}
@@ -399,7 +487,11 @@
RequestSender* sender,
const DriveApiUrlGenerator& url_generator,
const ChangeListCallback& callback)
- : DriveApiDataRequest<ChangeList>(sender, callback),
+ : DriveApiDataRequest(
+ sender,
+ base::Bind(&ParseJsonOnBlockingPoolAndRun<ChangeList>,
+ make_scoped_refptr(sender->blocking_task_runner()),
+ callback)),
url_generator_(url_generator),
include_deleted_(true),
max_results_(100),
@@ -419,7 +511,11 @@
ChangesListNextPageRequest::ChangesListNextPageRequest(
RequestSender* sender,
const ChangeListCallback& callback)
- : DriveApiDataRequest<ChangeList>(sender, callback) {
+ : DriveApiDataRequest(
+ sender,
+ base::Bind(&ParseJsonOnBlockingPoolAndRun<ChangeList>,
+ make_scoped_refptr(sender->blocking_task_runner()),
+ callback)) {
DCHECK(!callback.is_null());
}
@@ -437,7 +533,9 @@
const DriveApiUrlGenerator& url_generator,
bool use_internal_endpoint,
const AppListCallback& callback)
- : DriveApiDataRequest<AppList>(sender, callback),
+ : DriveApiDataRequest(
+ sender,
+ base::Bind(&ParseJsonAndRun<AppList>, callback)),
url_generator_(url_generator),
use_internal_endpoint_(use_internal_endpoint) {
DCHECK(!callback.is_null());
« no previous file with comments | « trunk/src/google_apis/drive/drive_api_requests.h ('k') | trunk/src/google_apis/drive/gdata_wapi_requests.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698