#include "google_apis/drive/gdata_wapi_requests.h"
+#include "base/location.h"
+#include "base/sequenced_task_runner.h"
+#include "base/task_runner_util.h"
+#include "base/values.h"
+#include "google_apis/drive/gdata_wapi_parser.h"
#include "google_apis/drive/gdata_wapi_url_generator.h"
namespace google_apis {
-//============================ GetResourceEntryRequest =======================
+namespace {
+
+scoped_ptr<ResourceEntry> ParseResourceEntry(const std::string& json) {
+ scoped_ptr<base::Value> value = ParseJson(json);
+ return value ? ResourceEntry::ExtractAndParse(*value) :
+ scoped_ptr<ResourceEntry>();
+}
+
+} // namespace
GetResourceEntryRequest::GetResourceEntryRequest(
RequestSender* sender,
const GDataWapiUrlGenerator& url_generator,
const std::string& resource_id,
const GURL& embed_origin,
- const GetDataCallback& callback)
- : GetDataRequest(sender, callback),
+ const GetResourceEntryCallback& callback)
+ : UrlFetchRequestBase(sender),
url_generator_(url_generator),
resource_id_(resource_id),
- embed_origin_(embed_origin) {
+ embed_origin_(embed_origin),
+ callback_(callback),
+ weak_ptr_factory_(this) {
DCHECK(!callback.is_null());
}
resource_id_, embed_origin_);
}
+void GetResourceEntryRequest::ProcessURLFetchResults(
+ const net::URLFetcher* source) {
+ GDataErrorCode error = GetErrorCode();
+ switch (error) {
+ case HTTP_SUCCESS:
+ case HTTP_CREATED:
+ base::PostTaskAndReplyWithResult(
+ blocking_task_runner(),
+ FROM_HERE,
+ base::Bind(&ParseResourceEntry, response_writer()->data()),
+ base::Bind(&GetResourceEntryRequest::OnDataParsed,
+ weak_ptr_factory_.GetWeakPtr(), error));
+ break;
+ default:
+ RunCallbackOnPrematureFailure(error);
+ OnProcessURLFetchResultsComplete();
+ break;
+ }
+}
+
+void GetResourceEntryRequest::RunCallbackOnPrematureFailure(
+ GDataErrorCode error) {
+ callback_.Run(error, scoped_ptr<ResourceEntry>());
+}
+
+void GetResourceEntryRequest::OnDataParsed(GDataErrorCode error,
+ scoped_ptr<ResourceEntry> entry) {
+ if (!entry)
+ error = GDATA_PARSE_ERROR;
+ callback_.Run(error, entry.Pass());
+ OnProcessURLFetchResultsComplete();
+}
+
} // namespace google_apis