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