blob: 7c3e532d1472cead696231073b3818fba59edb99 [file] [log] [blame]
// 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