• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #ifndef CHROME_BROWSER_SYNC_FILE_SYSTEM_REMOTE_FILE_SYNC_SERVICE_H_
6 #define CHROME_BROWSER_SYNC_FILE_SYSTEM_REMOTE_FILE_SYNC_SERVICE_H_
7 
8 #include <map>
9 #include <set>
10 #include <string>
11 #include <vector>
12 
13 #include "base/basictypes.h"
14 #include "base/memory/scoped_ptr.h"
15 #include "chrome/browser/sync_file_system/conflict_resolution_policy.h"
16 #include "chrome/browser/sync_file_system/sync_callbacks.h"
17 #include "chrome/browser/sync_file_system/sync_file_metadata.h"
18 #include "storage/browser/fileapi/file_system_url.h"
19 
20 class BrowserContextKeyedServiceFactory;
21 class GURL;
22 
23 namespace base {
24 class ListValue;
25 }
26 
27 namespace content {
28 class BrowserContext;
29 }
30 
31 namespace storage {
32 class ScopedFile;
33 }
34 
35 namespace sync_file_system {
36 
37 class FileStatusObserver;
38 class LocalChangeProcessor;
39 class RemoteChangeProcessor;
40 class TaskLogger;
41 
42 enum RemoteServiceState {
43   // Remote service is up and running, or has not seen any errors yet.
44   // The consumer of this service can make new requests while the
45   // service is in this state.
46   REMOTE_SERVICE_OK = 0,
47 
48   // Remote service is temporarily unavailable due to network,
49   // authentication or some other temporary failure.
50   // This state may be automatically resolved when the underlying
51   // network condition or service condition changes.
52   // The consumer of this service can still make new requests but
53   // they may fail (with recoverable error code).
54   REMOTE_SERVICE_TEMPORARY_UNAVAILABLE,
55 
56   // Remote service is temporarily unavailable due to authentication failure.
57   // This state may be automatically resolved when the authentication token
58   // has been refreshed internally (e.g. when the user signed in etc).
59   // The consumer of this service can still make new requests but
60   // they may fail (with recoverable error code).
61   REMOTE_SERVICE_AUTHENTICATION_REQUIRED,
62 
63   // Remote service is temporarily unavailable due to lack of API permissions.
64   // This state may be automatically resolved when the API gets right
65   // permissions to access with.
66   // The consumer of this service can still make new requests but
67   // they may fail (with recoverable error code).
68   REMOTE_SERVICE_ACCESS_FORBIDDEN,
69 
70   // Remote service is disabled by configuration change or due to some
71   // unrecoverable errors, e.g. local database corruption.
72   // Any new requests will immediately fail when the service is in
73   // this state.
74   REMOTE_SERVICE_DISABLED,
75 
76   REMOTE_SERVICE_STATE_MAX,
77 };
78 
79 // This class represents a backing service of the sync filesystem.
80 // This also maintains conflict information, i.e. a list of conflicting files
81 // (at least in the current design).
82 // Owned by SyncFileSystemService.
83 class RemoteFileSyncService {
84  public:
85   class Observer {
86    public:
Observer()87     Observer() {}
~Observer()88     virtual ~Observer() {}
89 
90     // This is called when RemoteFileSyncService updates its internal queue
91     // of pending remote changes.
92     // |pending_changes_hint| indicates the pending queue length to help sync
93     // scheduling but the value may not be accurately reflect the real-time
94     // value.
95     virtual void OnRemoteChangeQueueUpdated(int64 pending_changes_hint) = 0;
96 
97     // This is called when RemoteFileSyncService updates its state.
OnRemoteServiceStateUpdated(RemoteServiceState state,const std::string & description)98     virtual void OnRemoteServiceStateUpdated(
99         RemoteServiceState state,
100         const std::string& description) {}
101 
102    private:
103     DISALLOW_COPY_AND_ASSIGN(Observer);
104   };
105 
106   struct Version {
107     std::string id;
108     SyncFileMetadata metadata;
109   };
110 
111   enum UninstallFlag {
112     UNINSTALL_AND_PURGE_REMOTE,
113     UNINSTALL_AND_KEEP_REMOTE,
114   };
115 
116   // For GetOriginStatusMap.
117   typedef std::map<GURL, std::string> OriginStatusMap;
118   typedef base::Callback<void(scoped_ptr<OriginStatusMap> status_map)>
119       StatusMapCallback;
120 
121   // For GetRemoteVersions.
122   typedef base::Callback<void(SyncStatusCode status,
123                               const std::vector<Version>& versions)>
124       RemoteVersionsCallback;
125   typedef base::Callback<
126       void(SyncStatusCode status, storage::ScopedFile downloaded)>
127       DownloadVersionCallback;
128 
129   // For DumpFile.
130   typedef base::Callback<void(scoped_ptr<base::ListValue> list)> ListCallback;
131 
132   // Creates an initialized RemoteFileSyncService for backend |version|
133   // for |context|.
134   static scoped_ptr<RemoteFileSyncService> CreateForBrowserContext(
135       content::BrowserContext* context,
136       TaskLogger* task_logger);
137 
138   // Returns BrowserContextKeyedServiceFactory's an instance of
139   // RemoteFileSyncService for backend |version| depends on.
140   static void AppendDependsOnFactories(
141       std::set<BrowserContextKeyedServiceFactory*>* factories);
142 
RemoteFileSyncService()143   RemoteFileSyncService() {}
~RemoteFileSyncService()144   virtual ~RemoteFileSyncService() {}
145 
146   // Adds and removes observers.
147   virtual void AddServiceObserver(Observer* observer) = 0;
148   virtual void AddFileStatusObserver(FileStatusObserver* observer) = 0;
149 
150   // Registers |origin| to track remote side changes for the |origin|.
151   // Upon completion, invokes |callback|.
152   // The caller may call this method again when the remote service state
153   // migrates to REMOTE_SERVICE_OK state if the error code returned via
154   // |callback| was retriable ones.
155   virtual void RegisterOrigin(
156       const GURL& origin,
157       const SyncStatusCallback& callback) = 0;
158 
159   // Re-enables |origin| that was previously disabled. If |origin| is not a
160   // SyncFS app, then the origin is effectively ignored.
161   virtual void EnableOrigin(
162       const GURL& origin,
163       const SyncStatusCallback& callback) = 0;
164 
165   virtual void DisableOrigin(
166       const GURL& origin,
167       const SyncStatusCallback& callback) = 0;
168 
169   // Uninstalls the |origin| by deleting its remote data copy and then removing
170   // the origin from the metadata store.
171   virtual void UninstallOrigin(
172       const GURL& origin,
173       UninstallFlag flag,
174       const SyncStatusCallback& callback) = 0;
175 
176   // Called by the sync engine to process one remote change.
177   // After a change is processed |callback| will be called (to return
178   // the control to the sync engine).
179   // It is invalid to call this before calling SetRemoteChangeProcessor().
180   virtual void ProcessRemoteChange(const SyncFileCallback& callback) = 0;
181 
182   // Sets a remote change processor.  This must be called before any
183   // ProcessRemoteChange().
184   virtual void SetRemoteChangeProcessor(
185       RemoteChangeProcessor* processor) = 0;
186 
187   // Returns a LocalChangeProcessor that applies a local change to the remote
188   // storage backed by this service.
189   virtual LocalChangeProcessor* GetLocalChangeProcessor() = 0;
190 
191   // Returns the current remote service state (should equal to the value
192   // returned by the last OnRemoteServiceStateUpdated notification.
193   virtual RemoteServiceState GetCurrentState() const = 0;
194 
195   // Returns all origins along with an arbitrary string description of their
196   // corresponding sync statuses.
197   virtual void GetOriginStatusMap(const StatusMapCallback& callback) = 0;
198 
199   // Returns file metadata for |origin| to call |callback|.
200   virtual void DumpFiles(const GURL& origin,
201                          const ListCallback& callback) = 0;
202 
203   // Returns the dump of internal database.
204   virtual void DumpDatabase(const ListCallback& callback) = 0;
205 
206   // Enables or disables the background sync.
207   // Setting this to false should disable the synchronization (and make
208   // the service state to REMOTE_SERVICE_DISABLED), while setting this to
209   // true does not necessarily mean the service is actually turned on
210   // (for example if Chrome is offline the service state will become
211   // REMOTE_SERVICE_TEMPORARY_UNAVAILABLE).
212   virtual void SetSyncEnabled(bool enabled) = 0;
213 
214   virtual void PromoteDemotedChanges(const base::Closure& callback) = 0;
215 
216  private:
217   DISALLOW_COPY_AND_ASSIGN(RemoteFileSyncService);
218 };
219 
220 }  // namespace sync_file_system
221 
222 #endif  // CHROME_BROWSER_SYNC_FILE_SYSTEM_REMOTE_FILE_SYNC_SERVICE_H_
223