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 14namespace google_apis { 15 16namespace { 17 18scoped_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 26GetResourceEntryRequest::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 41GetResourceEntryRequest::~GetResourceEntryRequest() {} 42 43GURL GetResourceEntryRequest::GetURL() const { 44 return url_generator_.GenerateEditUrlWithEmbedOrigin( 45 resource_id_, embed_origin_); 46} 47 48void 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 68void GetResourceEntryRequest::RunCallbackOnPrematureFailure( 69 GDataErrorCode error) { 70 callback_.Run(error, scoped_ptr<ResourceEntry>()); 71} 72 73void 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