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

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

Issue 10258004: Parent/child fixes. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: rebase Created 8 years, 8 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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef CHROME_BROWSER_CHROMEOS_GDATA_GDATA_FILES_H_ 5 #ifndef CHROME_BROWSER_CHROMEOS_GDATA_GDATA_FILES_H_
6 #define CHROME_BROWSER_CHROMEOS_GDATA_GDATA_FILES_H_ 6 #define CHROME_BROWSER_CHROMEOS_GDATA_GDATA_FILES_H_
7 #pragma once 7 #pragma once
8 8
9 #include <map> 9 #include <map>
10 #include <string> 10 #include <string>
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
64 virtual GDataFile* AsGDataFile(); 64 virtual GDataFile* AsGDataFile();
65 virtual GDataDirectory* AsGDataDirectory(); 65 virtual GDataDirectory* AsGDataDirectory();
66 virtual GDataRootDirectory* AsGDataRootDirectory(); 66 virtual GDataRootDirectory* AsGDataRootDirectory();
67 67
68 // const versions of AsGDataFile and AsGDataDirectory. 68 // const versions of AsGDataFile and AsGDataDirectory.
69 const GDataFile* AsGDataFileConst() const; 69 const GDataFile* AsGDataFileConst() const;
70 const GDataDirectory* AsGDataDirectoryConst() const; 70 const GDataDirectory* AsGDataDirectoryConst() const;
71 71
72 // Converts DocumentEntry into GDataEntry. 72 // Converts DocumentEntry into GDataEntry.
73 static GDataEntry* FromDocumentEntry(GDataDirectory* parent, 73 static GDataEntry* FromDocumentEntry(GDataDirectory* parent,
74 DocumentEntry* doc, 74 DocumentEntry* doc,
75 GDataRootDirectory* root); 75 GDataRootDirectory* root);
76 76
77 // Serialize/Parse to/from string via proto classes. 77 // Serialize/Parse to/from string via proto classes.
78 // TODO(achuith): Correctly set up parent_ and root_ links in 78 // TODO(achuith): Correctly set up parent_ and root_ links in
79 // FromProtoString. 79 // FromProtoString.
80 void SerializeToString(std::string* serialized_proto) const; 80 void SerializeToString(std::string* serialized_proto) const;
81 static scoped_ptr<GDataEntry> FromProtoString( 81 static scoped_ptr<GDataEntry> FromProtoString(
82 const std::string& serialized_proto); 82 const std::string& serialized_proto);
83 83
84 // Converts to/from proto. 84 // Converts to/from proto.
85 void FromProto(const GDataEntryProto& proto); 85 void FromProto(const GDataEntryProto& proto);
86 void ToProto(GDataEntryProto* proto) const; 86 void ToProto(GDataEntryProto* proto) const;
87 87
88 // Escapes forward slashes from file names with magic unicode character 88 // Escapes forward slashes from file names with magic unicode character
89 // \u2215 pretty much looks the same in UI. 89 // \u2215 pretty much looks the same in UI.
90 static std::string EscapeUtf8FileName(const std::string& input); 90 static std::string EscapeUtf8FileName(const std::string& input);
91 91
92 // Unescapes what was escaped in EScapeUtf8FileName. 92 // Unescapes what was escaped in EScapeUtf8FileName.
93 static std::string UnescapeUtf8FileName(const std::string& input); 93 static std::string UnescapeUtf8FileName(const std::string& input);
94 94
95 GDataDirectory* parent() { return parent_; } 95 // Return the parent of this entry. NULL for root.
96 GDataDirectory* parent() const { return parent_; }
96 const base::PlatformFileInfo& file_info() const { return file_info_; } 97 const base::PlatformFileInfo& file_info() const { return file_info_; }
97 98
99 // This is not the full path, use GetFilePath for that.
100 // Note that file_name_ gets reset by SetFileNameFromTitle() in a number of
101 // situations due to de-duplication (see AddEntry).
102 // TODO(achuith/satorux): Rename this to base_name.
98 const FilePath::StringType& file_name() const { return file_name_; } 103 const FilePath::StringType& file_name() const { return file_name_; }
104 // TODO(achuith): Make this private when GDataDB no longer uses path as a key.
99 void set_file_name(const FilePath::StringType& name) { file_name_ = name; } 105 void set_file_name(const FilePath::StringType& name) { file_name_ = name; }
100 106
101 const FilePath::StringType& title() const { return title_; } 107 const FilePath::StringType& title() const { return title_; }
102 void set_title(const FilePath::StringType& title) { title_ = title; } 108 void set_title(const FilePath::StringType& title) { title_ = title; }
103 109
104 // The unique resource ID associated with this file system entry. 110 // The unique resource ID associated with this file system entry.
105 const std::string& resource_id() const { return resource_id_; } 111 const std::string& resource_id() const { return resource_id_; }
106 void set_resource_id(const std::string& res_id) { resource_id_ = res_id; } 112 void set_resource_id(const std::string& res_id) { resource_id_ = res_id; }
107 113
108 // The content URL is used for downloading regular files as is. 114 // The content URL is used for downloading regular files as is.
(...skipping 15 matching lines...) Expand all
124 // Returns virtual file path representing this file system entry. This path 130 // Returns virtual file path representing this file system entry. This path
125 // corresponds to file path expected by public methods of GDataFileSyste 131 // corresponds to file path expected by public methods of GDataFileSyste
126 // class. 132 // class.
127 FilePath GetFilePath() const; 133 FilePath GetFilePath() const;
128 134
129 // Sets |file_name_| based on the value of |title_| without name 135 // Sets |file_name_| based on the value of |title_| without name
130 // de-duplication (see AddEntry() for details on de-duplication). 136 // de-duplication (see AddEntry() for details on de-duplication).
131 virtual void SetFileNameFromTitle(); 137 virtual void SetFileNameFromTitle();
132 138
133 protected: 139 protected:
134 // GDataDirectory::TakeEntry() needs to call GDataEntry::set_parent(). 140 // For access to SetParent from AddEntry.
135 friend class GDataDirectory; 141 friend class GDataDirectory;
136 142
137 // Sets the parent directory of this file system entry. 143 // Sets the parent directory of this file system entry.
138 // It is intended to be used by GDataDirectory::AddEntry() only. 144 // It is intended to be used by GDataDirectory::AddEntry() only.
139 void set_parent(GDataDirectory* parent) { parent_ = parent; } 145 void SetParent(GDataDirectory* parent);
140 146
141 base::PlatformFileInfo file_info_; 147 base::PlatformFileInfo file_info_;
142 // Name of this file in the gdata virtual file system.
143 FilePath::StringType file_name_;
144 // Title of this file (i.e. the 'title' attribute associated with a regular 148 // Title of this file (i.e. the 'title' attribute associated with a regular
145 // file, hosted document, or collection). The title is used to derive 149 // file, hosted document, or collection). The title is used to derive
146 // |file_name_| but may be different from |file_name_|. For example, 150 // |file_name_| but may be different from |file_name_|. For example,
147 // |file_name_| has an added .g<something> extension for hosted documents or 151 // |file_name_| has an added .g<something> extension for hosted documents or
148 // may have an extra suffix for name de-duplication on the gdata file system. 152 // may have an extra suffix for name de-duplication on the gdata file system.
149 FilePath::StringType title_; 153 FilePath::StringType title_;
150 std::string resource_id_; 154 std::string resource_id_;
155 std::string parent_resource_id_;
151 // Files with the same title will be uniquely identified with this field 156 // Files with the same title will be uniquely identified with this field
152 // so we can represent them with unique URLs/paths in File API layer. 157 // so we can represent them with unique URLs/paths in File API layer.
153 // For example, two files in the same directory with the same name "Foo" 158 // For example, two files in the same directory with the same name "Foo"
154 // will show up in the virtual directory as "Foo" and "Foo (2)". 159 // will show up in the virtual directory as "Foo" and "Foo (2)".
155 GURL edit_url_; 160 GURL edit_url_;
156 GURL content_url_; 161 GURL content_url_;
162
163 // Remaining fields are not serialized.
164
165 // Name of this file in the gdata virtual file system. This can change
166 // due to de-duplication (See AddEntry).
167 FilePath::StringType file_name_;
168
157 GDataDirectory* parent_; 169 GDataDirectory* parent_;
158 GDataRootDirectory* root_; // Weak pointer to GDataRootDirectory. 170 GDataRootDirectory* root_; // Weak pointer to GDataRootDirectory.
159 bool deleted_; 171 bool deleted_;
160 std::string parent_resource_id_;
161 172
162 private: 173 private:
163 DISALLOW_COPY_AND_ASSIGN(GDataEntry); 174 DISALLOW_COPY_AND_ASSIGN(GDataEntry);
164 }; 175 };
165 176
166 typedef std::map<FilePath::StringType, GDataEntry*> GDataFileCollection; 177 typedef std::map<FilePath::StringType, GDataFile*> GDataFileCollection;
178 typedef std::map<FilePath::StringType, GDataDirectory*>
179 GDataDirectoryCollection;
167 180
168 // Represents "file" in in a GData virtual file system. On gdata feed side, 181 // Represents "file" in in a GData virtual file system. On gdata feed side,
169 // this could be either a regular file or a server side document. 182 // this could be either a regular file or a server side document.
170 class GDataFile : public GDataEntry { 183 class GDataFile : public GDataEntry {
171 public: 184 public:
172 // This is used as a bitmask for the cache state. 185 // This is used as a bitmask for the cache state.
173 enum CacheState { 186 enum CacheState {
174 CACHE_STATE_NONE = 0x0, 187 CACHE_STATE_NONE = 0x0,
175 CACHE_STATE_PINNED = 0x1 << 0, 188 CACHE_STATE_PINNED = 0x1 << 0,
176 CACHE_STATE_PRESENT = 0x1 << 1, 189 CACHE_STATE_PRESENT = 0x1 << 1,
177 CACHE_STATE_DIRTY = 0x1 << 2, 190 CACHE_STATE_DIRTY = 0x1 << 2,
178 CACHE_STATE_MOUNTED = 0x1 << 3, 191 CACHE_STATE_MOUNTED = 0x1 << 3,
179 }; 192 };
180 193
181 explicit GDataFile(GDataDirectory* parent, GDataRootDirectory* root); 194 explicit GDataFile(GDataDirectory* parent, GDataRootDirectory* root);
182 virtual ~GDataFile(); 195 virtual ~GDataFile();
183 virtual GDataFile* AsGDataFile() OVERRIDE; 196 virtual GDataFile* AsGDataFile() OVERRIDE;
184 197
198 // Converts DocumentEntry into GDataEntry.
185 static GDataEntry* FromDocumentEntry(GDataDirectory* parent, 199 static GDataEntry* FromDocumentEntry(GDataDirectory* parent,
186 DocumentEntry* doc, 200 DocumentEntry* doc,
187 GDataRootDirectory* root); 201 GDataRootDirectory* root);
188 202
189 // Converts to/from proto. 203 // Converts to/from proto.
190 void FromProto(const GDataFileProto& proto); 204 void FromProto(const GDataFileProto& proto);
191 void ToProto(GDataFileProto* proto) const; 205 void ToProto(GDataFileProto* proto) const;
192 206
193 static bool IsCachePresent(int cache_state) { 207 static bool IsCachePresent(int cache_state) {
194 return cache_state & CACHE_STATE_PRESENT; 208 return cache_state & CACHE_STATE_PRESENT;
195 } 209 }
196 static bool IsCachePinned(int cache_state) { 210 static bool IsCachePinned(int cache_state) {
197 return cache_state & CACHE_STATE_PINNED; 211 return cache_state & CACHE_STATE_PINNED;
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
259 }; 273 };
260 274
261 // Represents "directory" in a GData virtual file system. Maps to gdata 275 // Represents "directory" in a GData virtual file system. Maps to gdata
262 // collection element. 276 // collection element.
263 class GDataDirectory : public GDataEntry { 277 class GDataDirectory : public GDataEntry {
264 public: 278 public:
265 GDataDirectory(GDataDirectory* parent, GDataRootDirectory* root); 279 GDataDirectory(GDataDirectory* parent, GDataRootDirectory* root);
266 virtual ~GDataDirectory(); 280 virtual ~GDataDirectory();
267 virtual GDataDirectory* AsGDataDirectory() OVERRIDE; 281 virtual GDataDirectory* AsGDataDirectory() OVERRIDE;
268 282
283 // Converts DocumentEntry into GDataEntry.
269 static GDataEntry* FromDocumentEntry(GDataDirectory* parent, 284 static GDataEntry* FromDocumentEntry(GDataDirectory* parent,
270 DocumentEntry* doc, 285 DocumentEntry* doc,
271 GDataRootDirectory* root); 286 GDataRootDirectory* root);
272 287
273 // Converts to/from proto. 288 // Converts to/from proto.
274 void FromProto(const GDataDirectoryProto& proto); 289 void FromProto(const GDataDirectoryProto& proto);
275 void ToProto(GDataDirectoryProto* proto) const; 290 void ToProto(GDataDirectoryProto* proto) const;
276 291
277 // Adds child file to the directory and takes over the ownership of |file| 292 // Adds child file to the directory and takes over the ownership of |file|
278 // object. The method will also do name de-duplication to ensure that the 293 // object. The method will also do name de-duplication to ensure that the
279 // exposed presentation path does not have naming conflicts. Two files with 294 // exposed presentation path does not have naming conflicts. Two files with
280 // the same name "Foo" will be renames to "Foo (1)" and "Foo (2)". 295 // the same name "Foo" will be renames to "Foo (1)" and "Foo (2)".
281 void AddEntry(GDataEntry* entry); 296 void AddEntry(GDataEntry* entry);
282 297
283 // Takes the ownership of |entry| from its current parent. If this directory 298 // Takes the ownership of |entry| from its current parent. If this directory
284 // is already the current parent of |file|, this method effectively goes 299 // is already the current parent of |file|, this method effectively goes
285 // through the name de-duplication for |file| based on the current state of 300 // through the name de-duplication for |file| based on the current state of
286 // the file system. 301 // the file system.
287 bool TakeEntry(GDataEntry* entry); 302 bool TakeEntry(GDataEntry* entry);
288 303
289 // Takes over all entries from |dir|. 304 // Takes over all entries from |dir|.
290 bool TakeOverEntries(GDataDirectory* dir); 305 bool TakeOverEntries(GDataDirectory* dir);
291 306
307 // Find a child by its name.
308 GDataEntry* FindChild(const FilePath::StringType& file_name) const;
309
292 // Removes the entry from its children list and destroys the entry instance. 310 // Removes the entry from its children list and destroys the entry instance.
293 bool RemoveEntry(GDataEntry* entry); 311 bool RemoveEntry(GDataEntry* entry);
294 312
295 // Removes children elements. 313 // Removes children elements.
296 void RemoveChildren(); 314 void RemoveChildren();
297 315
298 // Checks if directory content needs to be refreshed from the server. 316 // Checks if directory content needs to be refreshed from the server.
299 bool NeedsRefresh() const; 317 bool NeedsRefresh() const;
300 318
301 // Last refresh time. 319 // Last refresh time.
302 const base::Time& refresh_time() const { return refresh_time_; } 320 const base::Time& refresh_time() const { return refresh_time_; }
303 void set_refresh_time(const base::Time& time) { refresh_time_ = time; } 321 void set_refresh_time(const base::Time& time) { refresh_time_ = time; }
304 // Url for this feed. 322 // Url for this feed.
305 const GURL& start_feed_url() const { return start_feed_url_; } 323 const GURL& start_feed_url() const { return start_feed_url_; }
306 void set_start_feed_url(const GURL& url) { start_feed_url_ = url; } 324 void set_start_feed_url(const GURL& url) { start_feed_url_ = url; }
307 // Continuing feed's url. 325 // Continuing feed's url.
308 const GURL& next_feed_url() const { return next_feed_url_; } 326 const GURL& next_feed_url() const { return next_feed_url_; }
309 void set_next_feed_url(const GURL& url) { next_feed_url_ = url; } 327 void set_next_feed_url(const GURL& url) { next_feed_url_ = url; }
310 // Upload url is an entry point for initialization of file upload. 328 // Upload url is an entry point for initialization of file upload.
311 // It corresponds to resumable-create-media link from gdata feed. 329 // It corresponds to resumable-create-media link from gdata feed.
312 const GURL& upload_url() const { return upload_url_; } 330 const GURL& upload_url() const { return upload_url_; }
313 void set_upload_url(const GURL& url) { upload_url_ = url; } 331 void set_upload_url(const GURL& url) { upload_url_ = url; }
314 // Collection of children GDataEntry items. 332 // Collection of children files/directories.
315 const GDataFileCollection& children() const { return children_; } 333 const GDataFileCollection& child_files() const { return child_files_; }
zel 2012/04/27 23:10:31 it would be great to provide an iterator that goes
achuithb 2012/04/28 00:20:15 Yup, we would hide the read from the database (as
334 const GDataDirectoryCollection& child_directories() const {
335 return child_directories_;
336 }
316 // Directory content origin. 337 // Directory content origin.
317 const ContentOrigin origin() const { return origin_; } 338 const ContentOrigin origin() const { return origin_; }
318 void set_origin(ContentOrigin value) { origin_ = value; } 339 void set_origin(ContentOrigin value) { origin_ = value; }
319 340
320 private: 341 private:
321 // Removes the entry from its children list without destroying the 342 // Add |entry| to children.
343 void AddChild(GDataEntry* entry);
344
345 // Removes the entry from its children without destroying the
322 // entry instance. 346 // entry instance.
323 bool RemoveEntryFromChildrenList(GDataEntry* entry); 347 bool RemoveChild(GDataEntry* entry);
324 348
325 base::Time refresh_time_; 349 base::Time refresh_time_;
326 // Url for this feed. 350 // Url for this feed.
327 GURL start_feed_url_; 351 GURL start_feed_url_;
328 // Continuing feed's url. 352 // Continuing feed's url.
329 GURL next_feed_url_; 353 GURL next_feed_url_;
330 // Upload url, corresponds to resumable-create-media link for feed 354 // Upload url, corresponds to resumable-create-media link for feed
331 // representing this directory. 355 // representing this directory.
332 GURL upload_url_; 356 GURL upload_url_;
333 357
334 // Directory content origin. 358 // Directory content origin.
335 ContentOrigin origin_; 359 ContentOrigin origin_;
336 360
337 // Collection of children GDataEntry items. 361 // Collection of children GDataEntry items.
338 GDataFileCollection children_; 362 GDataFileCollection child_files_;
363 GDataDirectoryCollection child_directories_;
339 364
340 DISALLOW_COPY_AND_ASSIGN(GDataDirectory); 365 DISALLOW_COPY_AND_ASSIGN(GDataDirectory);
341 }; 366 };
342 367
343 class GDataRootDirectory : public GDataDirectory { 368 class GDataRootDirectory : public GDataDirectory {
344 public: 369 public:
345 // Enum defining GCache subdirectory location. 370 // Enum defining GCache subdirectory location.
346 // This indexes into |GDataFileSystem::cache_paths_| vector. 371 // This indexes into |GDataFileSystem::cache_paths_| vector.
347 enum CacheSubDirectoryType { 372 enum CacheSubDirectoryType {
348 CACHE_TYPE_META = 0, // Downloaded feeds. 373 CACHE_TYPE_META = 0, // Downloaded feeds.
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
413 438
414 // GDataEntry implementation. 439 // GDataEntry implementation.
415 virtual GDataRootDirectory* AsGDataRootDirectory() OVERRIDE; 440 virtual GDataRootDirectory* AsGDataRootDirectory() OVERRIDE;
416 441
417 // Adds the entry to resource map. 442 // Adds the entry to resource map.
418 void AddEntryToResourceMap(GDataEntry* entry); 443 void AddEntryToResourceMap(GDataEntry* entry);
419 444
420 // Removes the entry from resource map. 445 // Removes the entry from resource map.
421 void RemoveEntryFromResourceMap(GDataEntry* entry); 446 void RemoveEntryFromResourceMap(GDataEntry* entry);
422 447
423 // Removes the entries from resource map.
424 void RemoveEntriesFromResourceMap(const GDataFileCollection& children);
425
426 // Searches for |file_path| triggering callback in |delegate|. 448 // Searches for |file_path| triggering callback in |delegate|.
427 void FindEntryByPath(const FilePath& file_path, 449 void FindEntryByPath(const FilePath& file_path,
428 FindEntryDelegate* delegate); 450 FindEntryDelegate* delegate);
429 451
430 // Returns the GDataEntry* with the corresponding |resource_id|. 452 // Returns the GDataEntry* with the corresponding |resource_id|.
431 GDataEntry* GetEntryByResourceId(const std::string& resource_id); 453 GDataEntry* GetEntryByResourceId(const std::string& resource_id);
432 454
433 // Sets |cache_map_| data member to formal parameter |new_cache_map|. 455 // Sets |cache_map_| data member to formal parameter |new_cache_map|.
434 void SetCacheMap(const CacheMap& new_cache_map); 456 void SetCacheMap(const CacheMap& new_cache_map);
435 457
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
469 base::Time last_serialized_; 491 base::Time last_serialized_;
470 int largest_changestamp_; 492 int largest_changestamp_;
471 size_t serialized_size_; 493 size_t serialized_size_;
472 494
473 DISALLOW_COPY_AND_ASSIGN(GDataRootDirectory); 495 DISALLOW_COPY_AND_ASSIGN(GDataRootDirectory);
474 }; 496 };
475 497
476 } // namespace gdata 498 } // namespace gdata
477 499
478 #endif // CHROME_BROWSER_CHROMEOS_GDATA_GDATA_FILES_H_ 500 #endif // CHROME_BROWSER_CHROMEOS_GDATA_GDATA_FILES_H_
OLDNEW
« no previous file with comments | « chrome/browser/chromeos/gdata/gdata_file_system_unittest.cc ('k') | chrome/browser/chromeos/gdata/gdata_files.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698