Home | History | Annotate | Download | only in drive
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "google_apis/drive/gdata_wapi_requests.h"
      6 
      7 #include "base/location.h"
      8 #include "base/sequenced_task_runner.h"
      9 #include "base/task_runner_util.h"
     10 #include "base/values.h"
     11 #include "google_apis/drive/gdata_wapi_parser.h"
     12 #include "google_apis/drive/gdata_wapi_url_generator.h"
     13 
     14 namespace google_apis {
     15 
     16 namespace {
     17 
     18 scoped_ptr<ResourceEntry> ParseResourceEntry(const std::string& json) {
     19   scoped_ptr<base::Value> value = ParseJson(json);
     20   return value ? ResourceEntry::ExtractAndParse(*value) :
     21       scoped_ptr<ResourceEntry>();
     22 }
     23 
     24 }  // namespace
     25 
     26 GetResourceEntryRequest::GetResourceEntryRequest(
     27     RequestSender* sender,
     28     const GDataWapiUrlGenerator& url_generator,
     29     const std::string& resource_id,
     30     const GURL& embed_origin,
     31     const GetResourceEntryCallback& callback)
     32     : UrlFetchRequestBase(sender),
     33       url_generator_(url_generator),
     34       resource_id_(resource_id),
     35       embed_origin_(embed_origin),
     36       callback_(callback),
     37       weak_ptr_factory_(this) {
     38   DCHECK(!callback.is_null());
     39 }
     40 
     41 GetResourceEntryRequest::~GetResourceEntryRequest() {}
     42 
     43 GURL GetResourceEntryRequest::GetURL() const {
     44   return url_generator_.GenerateEditUrlWithEmbedOrigin(
     45       resource_id_, embed_origin_);
     46 }
     47 
     48 void GetResourceEntryRequest::ProcessURLFetchResults(
     49     const net::URLFetcher* source) {
     50   GDataErrorCode error = GetErrorCode();
     51   switch (error) {
     52     case HTTP_SUCCESS:
     53     case HTTP_CREATED:
     54       base::PostTaskAndReplyWithResult(
     55           blocking_task_runner(),
     56           FROM_HERE,
     57           base::Bind(&ParseResourceEntry, response_writer()->data()),
     58           base::Bind(&GetResourceEntryRequest::OnDataParsed,
     59                      weak_ptr_factory_.GetWeakPtr(), error));
     60       break;
     61     default:
     62       RunCallbackOnPrematureFailure(error);
     63       OnProcessURLFetchResultsComplete();
     64       break;
     65   }
     66 }
     67 
     68 void GetResourceEntryRequest::RunCallbackOnPrematureFailure(
     69     GDataErrorCode error) {
     70   callback_.Run(error, scoped_ptr<ResourceEntry>());
     71 }
     72 
     73 void GetResourceEntryRequest::OnDataParsed(GDataErrorCode error,
     74                                            scoped_ptr<ResourceEntry> entry) {
     75   if (!entry)
     76     error = GDATA_PARSE_ERROR;
     77   callback_.Run(error, entry.Pass());
     78   OnProcessURLFetchResultsComplete();
     79 }
     80 
     81 }  // namespace google_apis
     82