| Index: chrome/browser/chromeos/file_system_provider/request_manager.cc
|
| diff --git a/chrome/browser/chromeos/file_system_provider/request_manager.cc b/chrome/browser/chromeos/file_system_provider/request_manager.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..3483c4fa2c0721b3105dc8bfe0b47878304dc423
|
| --- /dev/null
|
| +++ b/chrome/browser/chromeos/file_system_provider/request_manager.cc
|
| @@ -0,0 +1,106 @@
|
| +// Copyright 2014 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 "chrome/browser/chromeos/file_system_provider/request_manager.h"
|
| +
|
| +#include "base/values.h"
|
| +
|
| +namespace chromeos {
|
| +namespace file_system_provider {
|
| +
|
| +RequestManager::RequestManager() : next_id_(1) {}
|
| +
|
| +RequestManager::~RequestManager() {}
|
| +
|
| +int RequestManager::CreateRequest(const ProvidedFileSystem& file_system,
|
| + const SuccessCallback& success_callback,
|
| + const ErrorCallback& error_callback) {
|
| + // The request id is unique per request manager, so per service, thereof
|
| + // per profile.
|
| + int request_id = next_id_++;
|
| +
|
| + // If cycled the int, then signal an error.
|
| + if (requests_.find(request_id) != requests_.end())
|
| + return 0;
|
| +
|
| + Request request;
|
| + request.file_system = file_system;
|
| + request.success_callback = success_callback;
|
| + request.error_callback = error_callback;
|
| + requests_[request_id] = request;
|
| +
|
| + return request_id;
|
| +}
|
| +
|
| +bool RequestManager::FulfillRequest(const ProvidedFileSystem& file_system,
|
| + int request_id,
|
| + scoped_ptr<base::DictionaryValue> response,
|
| + bool has_next) {
|
| + RequestMap::iterator request_it = requests_.find(request_id);
|
| +
|
| + if (request_it == requests_.end())
|
| + return false;
|
| +
|
| + // Check if the request belongs to the same provided file system.
|
| + if (request_it->second.file_system.file_system_id() !=
|
| + file_system.file_system_id()) {
|
| + return false;
|
| + }
|
| +
|
| + if (!request_it->second.success_callback.is_null())
|
| + request_it->second.success_callback.Run(response.Pass(), has_next);
|
| + if (!has_next)
|
| + requests_.erase(request_it);
|
| +
|
| + return true;
|
| +}
|
| +
|
| +bool RequestManager::RejectRequest(const ProvidedFileSystem& file_system,
|
| + int request_id,
|
| + base::File::Error error) {
|
| + RequestMap::iterator request_it = requests_.find(request_id);
|
| +
|
| + if (request_it == requests_.end())
|
| + return false;
|
| +
|
| + // Check if the request belongs to the same provided file system.
|
| + if (request_it->second.file_system.file_system_id() !=
|
| + file_system.file_system_id()) {
|
| + return false;
|
| + }
|
| +
|
| + if (!request_it->second.error_callback.is_null())
|
| + request_it->second.error_callback.Run(error);
|
| + requests_.erase(request_it);
|
| +
|
| + return true;
|
| +}
|
| +
|
| +void RequestManager::OnProvidedFileSystemMount(
|
| + const ProvidedFileSystem& file_system,
|
| + base::File::Error error) {}
|
| +
|
| +void RequestManager::OnProvidedFileSystemUnmount(
|
| + const ProvidedFileSystem& file_system,
|
| + base::File::Error error) {
|
| + // Do not continue on error, since the volume may be still mounted.
|
| + if (error != base::File::FILE_OK)
|
| + return;
|
| +
|
| + // Remove all requests for this provided file system.
|
| + RequestMap::iterator it = requests_.begin();
|
| + while (it != requests_.begin()) {
|
| + if (it->second.file_system.file_system_id() ==
|
| + file_system.file_system_id()) {
|
| + RejectRequest(
|
| + it->second.file_system, it->first, base::File::FILE_ERROR_ABORT);
|
| + requests_.erase(it++);
|
| + } else {
|
| + it++;
|
| + }
|
| + }
|
| +}
|
| +
|
| +} // namespace file_system_provider
|
| +} // namespace chromeos
|
|
|