普通文本  |  82行  |  2.4 KB

// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#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 {

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 GetResourceEntryCallback& callback)
    : UrlFetchRequestBase(sender),
      url_generator_(url_generator),
      resource_id_(resource_id),
      embed_origin_(embed_origin),
      callback_(callback),
      weak_ptr_factory_(this) {
  DCHECK(!callback.is_null());
}

GetResourceEntryRequest::~GetResourceEntryRequest() {}

GURL GetResourceEntryRequest::GetURL() const {
  return url_generator_.GenerateEditUrlWithEmbedOrigin(
      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