Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(184)

Side by Side Diff: chrome/browser/chromeos/gdata/gdata_directory_service.h

Issue 10827343: Split out gdata_directory_service* (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | chrome/browser/chromeos/gdata/gdata_directory_service.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Property Changes:
Added: svn:eol-style
+ LF
OLDNEW
(Empty)
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_CHROMEOS_GDATA_GDATA_DIRECTORY_SERVICE_H_
6 #define CHROME_BROWSER_CHROMEOS_GDATA_GDATA_DIRECTORY_SERVICE_H_
7
8 #include <map>
9 #include <string>
10 #include <vector>
11
12 #include "base/callback.h"
13 #include "base/gtest_prod_util.h"
14 #include "base/memory/scoped_ptr.h"
15 #include "base/memory/singleton.h"
16 #include "base/memory/weak_ptr.h"
17 #include "base/platform_file.h"
18 #include "base/synchronization/lock.h"
19 #include "chrome/browser/chromeos/gdata/gdata_files.h"
20 #include "chrome/browser/chromeos/gdata/gdata_uploader.h"
21 #include "chrome/browser/chromeos/gdata/gdata_wapi_parser.h"
22 #include "chrome/browser/profiles/profile_keyed_service.h"
23 #include "chrome/browser/profiles/profile_keyed_service_factory.h"
24
25 namespace gdata {
26
27 // The root directory content origin.
28 enum ContentOrigin {
29 UNINITIALIZED,
30 // Content is currently loading from somewhere. Needs to wait.
31 INITIALIZING,
32 // Content is initialized, but during refreshing.
33 REFRESHING,
34 // Content is initialized from disk cache.
35 FROM_CACHE,
36 // Content is initialized from the direct server response.
37 FROM_SERVER,
38 };
39
40 // The root directory name used for the Google Drive file system tree. The
41 // name is used in URLs for the file manager, hence user-visible.
42 const FilePath::CharType kGDataRootDirectory[] = FILE_PATH_LITERAL("drive");
43
44 // The resource ID for the root directory is defined in the spec:
45 // https://developers.google.com/google-apps/documents-list/
46 const char kGDataRootDirectoryResourceId[] = "folder:root";
47
48 // This should be incremented when incompatibility change is made in
49 // gdata.proto.
50 const int32 kProtoVersion = 2;
51
52 // Callback type used to get result of file search.
53 // If |error| is not PLATFORM_FILE_OK, |entry| is set to NULL.
54 typedef base::Callback<void(GDataFileError error, GDataEntry* entry)>
55 FindEntryCallback;
56
57 // Used for file operations like removing files.
58 typedef base::Callback<void(GDataFileError error)>
59 FileOperationCallback;
60
61 // Callback similar to FileOperationCallback but with a given |file_path|.
62 // Used for operations that change a file path like moving files.
63 typedef base::Callback<void(GDataFileError error,
64 const FilePath& file_path)>
65 FileMoveCallback;
66
67 // Used to get entry info from the file system.
68 // If |error| is not GDATA_FILE_OK, |entry_info| is set to NULL.
69 typedef base::Callback<void(GDataFileError error,
70 scoped_ptr<GDataEntryProto> entry_proto)>
71 GetEntryInfoCallback;
72
73 typedef base::Callback<void(GDataFileError error,
74 scoped_ptr<GDataEntryProtoVector> entries)>
75 ReadDirectoryCallback;
76
77 // This is a part of EntryInfoPairResult.
78 struct EntryInfoResult {
79 EntryInfoResult();
80 ~EntryInfoResult();
81
82 FilePath path;
83 GDataFileError error;
84 scoped_ptr<GDataEntryProto> proto;
85 };
86
87 // The result of GetEntryInfoPairCallback(). Used to get a pair of entries
88 // in one function call.
89 struct EntryInfoPairResult {
90 EntryInfoPairResult();
91 ~EntryInfoPairResult();
92
93 EntryInfoResult first;
94 EntryInfoResult second; // Only filled if the first entry is found.
95 };
96
97 // Used to receive the result from GetEntryInfoPairCallback().
98 typedef base::Callback<void(scoped_ptr<EntryInfoPairResult> pair_result)>
99 GetEntryInfoPairCallback;
100
101 // Class to handle GDataEntry* lookups, add/remove GDataEntry*.
102 class GDataDirectoryService {
satorux1 2012/08/15 20:34:11 not in this patch, but we should probably rename t
achuithb 2012/08/15 20:38:24 GDataResourceMetadata? I think we should continue
satorux1 2012/08/15 20:40:48 s/GData/Drive/ is planned for Drive specific code,
103 public:
104 // Callback for GetEntryByResourceIdAsync.
105 typedef base::Callback<void(GDataEntry* entry)> GetEntryByResourceIdCallback;
106
107 // Map of resource id and serialized GDataEntry.
108 typedef std::map<std::string, std::string> SerializedMap;
109 // Map of resource id strings to GDataEntry*.
110 typedef std::map<std::string, GDataEntry*> ResourceMap;
111
112 GDataDirectoryService();
113 ~GDataDirectoryService();
114
115 GDataDirectory* root() { return root_.get(); }
116
117 // Last time when we dumped serialized file system to disk.
118 const base::Time& last_serialized() const { return last_serialized_; }
119 void set_last_serialized(const base::Time& time) { last_serialized_ = time; }
120 // Size of serialized file system on disk in bytes.
121 const size_t serialized_size() const { return serialized_size_; }
122 void set_serialized_size(size_t size) { serialized_size_ = size; }
123
124 // Largest change timestamp that was the source of content for the current
125 // state of the root directory.
126 const int64 largest_changestamp() const { return largest_changestamp_; }
127 void set_largest_changestamp(int64 value) { largest_changestamp_ = value; }
128
129 // The root directory content origin.
130 const ContentOrigin origin() const { return origin_; }
131 void set_origin(ContentOrigin value) { origin_ = value; }
132
133 // Creates a GDataEntry from a DocumentEntry.
134 GDataEntry* FromDocumentEntry(DocumentEntry* doc);
135
136 // Creates a GDataFile instance.
137 GDataFile* CreateGDataFile();
138
139 // Creates a GDataDirectory instance.
140 GDataDirectory* CreateGDataDirectory();
141
142 // Sets root directory resource id and initialize the root entry.
143 void InitializeRootEntry(const std::string& root_id);
144
145 // Add |new entry| to |directory| and invoke the callback asynchronously.
146 // |callback| may not be null.
147 // TODO(achuith,satorux): Use GDataEntryProto instead for new_entry.
148 // crbug.com/142048
149 void AddEntryToDirectory(GDataDirectory* directory,
150 GDataEntry* new_entry,
151 const FileMoveCallback& callback);
152
153 // Moves |entry| to |directory_path| asynchronously. Removes entry from
154 // previous parent. Must be called on UI thread. |callback| is called on the
155 // UI thread. |callback| may not be null.
156 void MoveEntryToDirectory(const FilePath& directory_path,
157 GDataEntry* entry,
158 const FileMoveCallback& callback);
159
160 // Removes |entry| from its parent. Calls |callback| with the path of the
161 // parent directory. |callback| may not be null.
162 void RemoveEntryFromParent(GDataEntry* entry,
163 const FileMoveCallback& callback);
164
165 // Adds the entry to resource map.
166 void AddEntryToResourceMap(GDataEntry* entry);
167
168 // Removes the entry from resource map.
169 void RemoveEntryFromResourceMap(GDataEntry* entry);
170
171 // Searches for |file_path| synchronously.
172 // TODO(satorux): Replace this with an async version crbug.com/137160
173 GDataEntry* FindEntryByPathSync(const FilePath& file_path);
174
175 // Searches for |file_path| synchronously, and runs |callback|.
176 // TODO(satorux): Replace this with an async version crbug.com/137160
177 void FindEntryByPathAndRunSync(const FilePath& file_path,
178 const FindEntryCallback& callback);
179
180 // Returns the GDataEntry* with the corresponding |resource_id|.
181 // TODO(achuith): Get rid of this in favor of async version crbug.com/13957.
182 GDataEntry* GetEntryByResourceId(const std::string& resource_id);
183
184 // Returns the GDataEntry* in the callback with the corresponding
185 // |resource_id|. TODO(achuith): Rename this to GetEntryByResourceId.
186 void GetEntryByResourceIdAsync(const std::string& resource_id,
187 const GetEntryByResourceIdCallback& callback);
188
189 // Finds an entry (a file or a directory) by |file_path|.
190 //
191 // Must be called from UI thread. |callback| is run on UI thread.
192 void GetEntryInfoByPath(const FilePath& file_path,
193 const GetEntryInfoCallback& callback);
194
195 // Finds and reads a directory by |file_path|.
196 //
197 // Must be called from UI thread. |callback| is run on UI thread.
198 void ReadDirectoryByPath(const FilePath& file_path,
199 const ReadDirectoryCallback& callback);
200
201 // Similar to GetEntryInfoByPath() but this function finds a pair of
202 // entries by |first_path| and |second_path|. If the entry for
203 // |first_path| is not found, this function does not try to get the
204 // entry of |second_path|.
205 //
206 // Must be called from UI thread. |callback| is run on UI thread.
207 void GetEntryInfoPairByPaths(
208 const FilePath& first_path,
209 const FilePath& second_path,
210 const GetEntryInfoPairCallback& callback);
211
212 // Replaces file entry with the same resource id as |fresh_file| with its
213 // fresh value |fresh_file|.
214 void RefreshFile(scoped_ptr<GDataFile> fresh_file);
215
216 // Removes all child files of |directory| and replace with file_map.
217 // |callback| is called with the directory path. |callback| may not be null.
218 void RefreshDirectory(const std::string& directory_resource_id,
219 const ResourceMap& file_map,
220 const FileMoveCallback& callback);
221
222 // Serializes/Parses to/from string via proto classes.
223 void SerializeToString(std::string* serialized_proto) const;
224 bool ParseFromString(const std::string& serialized_proto);
225
226 // Restores from and saves to database.
227 void InitFromDB(const FilePath& db_path,
228 base::SequencedTaskRunner* blocking_task_runner,
229 const FileOperationCallback& callback);
230 void SaveToDB();
231
232 private:
233 // Initializes the resource map using serialized_resources fetched from the
234 // database.
235 void InitResourceMap(CreateDBParams* create_params,
236 const FileOperationCallback& callback);
237
238 // Clears root_ and the resource map.
239 void ClearRoot();
240
241 // Creates GDataEntry from serialized string.
242 scoped_ptr<GDataEntry> FromProtoString(
243 const std::string& serialized_proto);
244
245 // Continues with GetEntryInfoPairByPaths after the first GDataEntry has been
246 // asynchronously fetched. This fetches the second GDataEntry only if the
247 // first was found.
248 void GetEntryInfoPairByPathsAfterGetFirst(
249 const FilePath& first_path,
250 const FilePath& second_path,
251 const GetEntryInfoPairCallback& callback,
252 GDataFileError error,
253 scoped_ptr<GDataEntryProto> entry_proto);
254
255 // Continues with GetIntroInfoPairByPaths after the second GDataEntry has been
256 // asynchronously fetched.
257 void GetEntryInfoPairByPathsAfterGetSecond(
258 const FilePath& second_path,
259 const GetEntryInfoPairCallback& callback,
260 scoped_ptr<EntryInfoPairResult> result,
261 GDataFileError error,
262 scoped_ptr<GDataEntryProto> entry_proto);
263
264 // These internal functions need friend access to private GDataDirectory
265 // methods.
266 // Replaces file entry |old_entry| with its fresh value |fresh_file|.
267 static void RefreshFileInternal(scoped_ptr<GDataFile> fresh_file,
268 GDataEntry* old_entry);
269
270 // Removes all child files of |directory| and replace with file_map.
271 // |callback| may not be null.
272 static void RefreshDirectoryInternal(const ResourceMap& file_map,
273 const FileMoveCallback& callback,
274 GDataEntry* directory_entry);
275
276
277 // Private data members.
278 scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_;
279 scoped_ptr<ResourceMetadataDB> directory_service_db_;
280
281 ResourceMap resource_map_;
282
283 scoped_ptr<GDataDirectory> root_; // Stored in the serialized proto.
284
285 base::Time last_serialized_;
286 size_t serialized_size_;
287 int64 largest_changestamp_; // Stored in the serialized proto.
288 ContentOrigin origin_;
289
290 // This should remain the last member so it'll be destroyed first and
291 // invalidate its weak pointers before other members are destroyed.
292 base::WeakPtrFactory<GDataDirectoryService> weak_ptr_factory_;
293
294 DISALLOW_COPY_AND_ASSIGN(GDataDirectoryService);
295 };
296
297 } // namespace gdata
298
299 #endif // CHROME_BROWSER_CHROMEOS_GDATA_GDATA_DIRECTORY_SERVICE_H_
300
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/chromeos/gdata/gdata_directory_service.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698