service.h revision c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c
1effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// found in the LICENSE file.
4effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#ifndef CHROME_BROWSER_CHROMEOS_FILE_SYSTEM_PROVIDER_SERVICE_H_
6effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#define CHROME_BROWSER_CHROMEOS_FILE_SYSTEM_PROVIDER_SERVICE_H_
7effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include <map>
9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include <string>
10effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include <vector>
11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
12c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/files/file.h"
13c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/memory/scoped_ptr.h"
14c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/memory/weak_ptr.h"
15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/observer_list.h"
16c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/values.h"
17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/chromeos/file_system_provider/observer.h"
18c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/chromeos/file_system_provider/request_manager.h"
19effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/profiles/profile.h"
20effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/common/extensions/api/file_system_provider.h"
21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/keyed_service/core/keyed_service.h"
22effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/public/browser/browser_context.h"
23effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace chromeos {
25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace file_system_provider {
26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass ServiceFactory;
28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Manages and registers the fileSystemProvider service.
30effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass Service : public KeyedService {
31effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public:
32effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  explicit Service(Profile* profile);
33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual ~Service();
34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
35c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Mounts a file system provided by an extension with the |extension_id|.
36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // For success, it returns a numeric file system id, which is an
37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // auto-incremented non-zero value. For failures, it returns zero.
38c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  int MountFileSystem(const std::string& extension_id,
39c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                      const std::string& file_system_name);
40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
41c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Unmounts a file system with the specified |file_system_id| for the
42effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // |extension_id|. For success returns true, otherwise false.
43c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bool UnmountFileSystem(const std::string& extension_id, int file_system_id);
44c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Returns a list of currently mounted file systems. All items are copied.
46c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  std::vector<ProvidedFileSystem> GetMountedFileSystems();
47c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Handles successful response for the |request_id|. If |has_next| is false,
49c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // then the request is disposed, after handling the |response|. On error,
50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // returns false, and the request is disposed.
51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bool FulfillRequest(const std::string& extension_id,
52c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                      int file_system_id,
53c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                      int request_id,
54c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                      scoped_ptr<base::DictionaryValue> result,
55c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                      bool has_next);
56c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
57c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Handles error response for the |request_id|. If handling the error fails,
58c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // returns false. Always disposes the request.
59c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bool RejectRequest(const std::string& extension_id,
60c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                     int file_system_id,
61c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                     int request_id,
62c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                     base::File::Error error);
63c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
64c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Requests unmounting of a file system with the passed |file_system_id|.
65c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Returns true is unmounting has been requested. False, if the request is
66c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // invalid (eg. already unmounted).
67c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bool RequestUnmount(int file_system_id);
68effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
69effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Adds and removes observers.
70effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void AddObserver(Observer* observer);
71effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void RemoveObserver(Observer* observer);
72effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
73effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Gets the singleton instance for the |context|.
74effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  static Service* Get(content::BrowserContext* context);
75effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
76c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // BrowserContextKeyedService overrides.
77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void Shutdown() OVERRIDE;
78c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch private:
80effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  typedef std::map<int, ProvidedFileSystem> FileSystemMap;
81effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
82c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Called when the providing extension calls the success callback for the
83c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // onUnmountRequested event.
84c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void OnRequestUnmountError(const ProvidedFileSystem& file_system,
85c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                             base::File::Error error);
86c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  RequestManager request_manager_;
88effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  Profile* profile_;
89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ObserverList<Observer> observers_;
90effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  FileSystemMap file_systems_;
91effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  int next_id_;
92c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  base::WeakPtrFactory<Service> weak_ptr_factory_;
93effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DISALLOW_COPY_AND_ASSIGN(Service);
95effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch};
96effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
97effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}  // namespace file_system_provider
98effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}  // namespace chromeos
99effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
100effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif  // CHROME_BROWSER_CHROMEOS_FILE_SYSTEM_PROVIDER_SERVICE_H_
101