Index: google_apis/drive/gdata_wapi_requests.cc |
diff --git a/google_apis/drive/gdata_wapi_requests.cc b/google_apis/drive/gdata_wapi_requests.cc |
index 4259217207565906496c19f1e3946354617c4c42..7c3e532d1472cead696231073b3818fba59edb99 100644 |
--- a/google_apis/drive/gdata_wapi_requests.cc |
+++ b/google_apis/drive/gdata_wapi_requests.cc |
@@ -4,22 +4,37 @@ |
#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()); |
} |
@@ -30,4 +45,37 @@ GURL GetResourceEntryRequest::GetURL() const { |
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 |