OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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_SYNC_SYNCABLE_SYNCABLE_H_ | 5 #ifndef CHROME_BROWSER_SYNC_SYNCABLE_SYNCABLE_H_ |
6 #define CHROME_BROWSER_SYNC_SYNCABLE_SYNCABLE_H_ | 6 #define CHROME_BROWSER_SYNC_SYNCABLE_SYNCABLE_H_ |
7 | 7 |
8 #include <algorithm> | 8 #include <algorithm> |
9 #include <bitset> | 9 #include <bitset> |
10 #include <iosfwd> | 10 #include <iosfwd> |
11 #include <map> | 11 #include <map> |
12 #include <set> | 12 #include <set> |
13 #include <string> | 13 #include <string> |
14 #include <vector> | 14 #include <vector> |
15 | 15 |
16 #include "base/atomicops.h" | 16 #include "base/atomicops.h" |
17 #include "base/basictypes.h" | 17 #include "base/basictypes.h" |
| 18 #include "base/file_path.h" |
18 #include "base/lock.h" | 19 #include "base/lock.h" |
19 #include "base/time.h" | 20 #include "base/time.h" |
20 #include "chrome/browser/sync/syncable/blob.h" | 21 #include "chrome/browser/sync/syncable/blob.h" |
21 #include "chrome/browser/sync/syncable/dir_open_result.h" | 22 #include "chrome/browser/sync/syncable/dir_open_result.h" |
22 #include "chrome/browser/sync/syncable/directory_event.h" | 23 #include "chrome/browser/sync/syncable/directory_event.h" |
23 #include "chrome/browser/sync/syncable/path_name_cmp.h" | 24 #include "chrome/browser/sync/syncable/path_name_cmp.h" |
24 #include "chrome/browser/sync/syncable/syncable_id.h" | 25 #include "chrome/browser/sync/syncable/syncable_id.h" |
25 #include "chrome/browser/sync/util/compat_file.h" | |
26 #include "chrome/browser/sync/util/dbgq.h" | 26 #include "chrome/browser/sync/util/dbgq.h" |
27 #include "chrome/browser/sync/util/event_sys.h" | 27 #include "chrome/browser/sync/util/event_sys.h" |
28 #include "chrome/browser/sync/util/path_helpers.h" | 28 #include "chrome/browser/sync/util/path_helpers.h" |
29 #include "chrome/browser/sync/util/row_iterator.h" | 29 #include "chrome/browser/sync/util/row_iterator.h" |
30 #include "chrome/browser/sync/util/sync_types.h" | 30 #include "chrome/browser/sync/util/sync_types.h" |
31 | 31 |
32 struct PurgeInfo; | 32 struct PurgeInfo; |
33 | 33 |
34 namespace sync_api { | 34 namespace sync_api { |
35 class ReadTransaction; | 35 class ReadTransaction; |
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
312 non_unique_value_ = value_; | 312 non_unique_value_ = value_; |
313 } | 313 } |
314 // TODO(ncarter): Handle server's other requirement: truncation to 256 | 314 // TODO(ncarter): Handle server's other requirement: truncation to 256 |
315 // bytes in Unicode NFC. | 315 // bytes in Unicode NFC. |
316 } | 316 } |
317 | 317 |
318 const PathString& value() const { return value_; } | 318 const PathString& value() const { return value_; } |
319 PathString& value() { return value_; } | 319 PathString& value() { return value_; } |
320 const PathString& non_unique_value() const { return non_unique_value_; } | 320 const PathString& non_unique_value() const { return non_unique_value_; } |
321 PathString& non_unique_value() { return non_unique_value_; } | 321 PathString& non_unique_value() { return non_unique_value_; } |
| 322 void set_non_unique_value(const PathString& value) { |
| 323 non_unique_value_ = value; |
| 324 } |
322 | 325 |
323 inline bool operator==(const SyncName& right_hand_side) const { | 326 inline bool operator==(const SyncName& right_hand_side) const { |
324 return value_ == right_hand_side.value_ && | 327 return value_ == right_hand_side.value_ && |
325 non_unique_value_ == right_hand_side.non_unique_value_; | 328 non_unique_value_ == right_hand_side.non_unique_value_; |
326 } | 329 } |
327 inline bool operator!=(const SyncName& right_hand_side) const { | 330 inline bool operator!=(const SyncName& right_hand_side) const { |
328 return !(*this == right_hand_side); | 331 return !(*this == right_hand_side); |
329 } | 332 } |
330 private: | 333 private: |
331 PathString value_; | 334 PathString value_; |
(...skipping 547 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
879 PersistedKernelInfo kernel_info; | 882 PersistedKernelInfo kernel_info; |
880 OriginalEntries dirty_metas; | 883 OriginalEntries dirty_metas; |
881 ExtendedAttributes dirty_xattrs; | 884 ExtendedAttributes dirty_xattrs; |
882 SaveChangesSnapshot() : kernel_info_status(KERNEL_SHARE_INFO_INVALID) { | 885 SaveChangesSnapshot() : kernel_info_status(KERNEL_SHARE_INFO_INVALID) { |
883 } | 886 } |
884 }; | 887 }; |
885 | 888 |
886 Directory(); | 889 Directory(); |
887 virtual ~Directory(); | 890 virtual ~Directory(); |
888 | 891 |
889 DirOpenResult Open(const PathString& file_path, const PathString& name); | 892 DirOpenResult Open(const FilePath& file_path, const PathString& name); |
890 | 893 |
891 void Close(); | 894 void Close(); |
892 | 895 |
893 int64 NextMetahandle(); | 896 int64 NextMetahandle(); |
894 // Always returns a negative id. Positive client ids are generated | 897 // Always returns a negative id. Positive client ids are generated |
895 // by the server only. | 898 // by the server only. |
896 Id NextId(); | 899 Id NextId(); |
897 | 900 |
898 PathString file_path() const { return kernel_->db_path; } | 901 const FilePath& file_path() const { return kernel_->db_path; } |
899 bool good() const { return NULL != store_; } | 902 bool good() const { return NULL != store_; } |
900 | 903 |
901 // The sync timestamp is an index into the list of changes for an account. | 904 // The sync timestamp is an index into the list of changes for an account. |
902 // It doesn't actually map to any time scale, it's name is an historical | 905 // It doesn't actually map to any time scale, it's name is an historical |
903 // anomaly. | 906 // anomaly. |
904 int64 last_sync_timestamp() const; | 907 int64 last_sync_timestamp() const; |
905 void set_last_sync_timestamp(int64 timestamp); | 908 void set_last_sync_timestamp(int64 timestamp); |
906 | 909 |
907 bool initial_sync_ended() const; | 910 bool initial_sync_ended() const; |
908 void set_initial_sync_ended(bool value); | 911 void set_initial_sync_ended(bool value); |
(...skipping 22 matching lines...) Expand all Loading... |
931 bool ReindexParentIdAndName(EntryKernel* const entry, const Id& new_parent_id, | 934 bool ReindexParentIdAndName(EntryKernel* const entry, const Id& new_parent_id, |
932 const PathString& new_name); | 935 const PathString& new_name); |
933 // These don't do the semantic checking that the redirector needs. | 936 // These don't do the semantic checking that the redirector needs. |
934 // The semantic checking is implemented higher up. | 937 // The semantic checking is implemented higher up. |
935 bool Undelete(EntryKernel* const entry); | 938 bool Undelete(EntryKernel* const entry); |
936 bool Delete(EntryKernel* const entry); | 939 bool Delete(EntryKernel* const entry); |
937 | 940 |
938 // Overridden by tests. | 941 // Overridden by tests. |
939 virtual DirectoryBackingStore* CreateBackingStore( | 942 virtual DirectoryBackingStore* CreateBackingStore( |
940 const PathString& dir_name, | 943 const PathString& dir_name, |
941 const PathString& backing_filepath); | 944 const FilePath& backing_filepath); |
942 | 945 |
943 private: | 946 private: |
944 // These private versions expect the kernel lock to already be held | 947 // These private versions expect the kernel lock to already be held |
945 // before calling. | 948 // before calling. |
946 EntryKernel* GetEntryById(const Id& id, ScopedKernelLock* const lock); | 949 EntryKernel* GetEntryById(const Id& id, ScopedKernelLock* const lock); |
947 EntryKernel* GetChildWithName(const Id& parent_id, | 950 EntryKernel* GetChildWithName(const Id& parent_id, |
948 const PathString& name, | 951 const PathString& name, |
949 ScopedKernelLock* const lock); | 952 ScopedKernelLock* const lock); |
950 EntryKernel* GetChildWithNameImpl(const Id& parent_id, | 953 EntryKernel* GetChildWithNameImpl(const Id& parent_id, |
951 const PathString& name, | 954 const PathString& name, |
952 ScopedKernelLock* const lock); | 955 ScopedKernelLock* const lock); |
953 | 956 |
954 DirOpenResult OpenImpl(const PathString& file_path, const PathString& name); | 957 DirOpenResult OpenImpl(const FilePath& file_path, const PathString& name); |
955 | 958 |
956 struct DirectoryEventTraits { | 959 struct DirectoryEventTraits { |
957 typedef DirectoryEvent EventType; | 960 typedef DirectoryEvent EventType; |
958 static inline bool IsChannelShutdownEvent(const DirectoryEvent& event) { | 961 static inline bool IsChannelShutdownEvent(const DirectoryEvent& event) { |
959 return DIRECTORY_DESTROYED == event; | 962 return DIRECTORY_DESTROYED == event; |
960 } | 963 } |
961 }; | 964 }; |
962 public: | 965 public: |
963 typedef EventChannel<DirectoryEventTraits, Lock> Channel; | 966 typedef EventChannel<DirectoryEventTraits, Lock> Channel; |
964 typedef EventChannel<DirectoryChangeEvent, Lock> ChangesChannel; | 967 typedef EventChannel<DirectoryChangeEvent, Lock> ChangesChannel; |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1079 // All entries in memory must be in both the MetahandlesIndex and | 1082 // All entries in memory must be in both the MetahandlesIndex and |
1080 // the IdsIndex, but only non-deleted entries will be the | 1083 // the IdsIndex, but only non-deleted entries will be the |
1081 // ParentIdAndNamesIndex, because there can be multiple deleted | 1084 // ParentIdAndNamesIndex, because there can be multiple deleted |
1082 // entries with the same parent id and name. | 1085 // entries with the same parent id and name. |
1083 typedef std::set<EntryKernel*, LessParentIdAndNames> ParentIdAndNamesIndex; | 1086 typedef std::set<EntryKernel*, LessParentIdAndNames> ParentIdAndNamesIndex; |
1084 typedef std::vector<int64> MetahandlesToPurge; | 1087 typedef std::vector<int64> MetahandlesToPurge; |
1085 | 1088 |
1086 private: | 1089 private: |
1087 | 1090 |
1088 struct Kernel { | 1091 struct Kernel { |
1089 Kernel(const PathString& db_path, const PathString& name, | 1092 Kernel(const FilePath& db_path, const PathString& name, |
1090 const KernelLoadInfo& info); | 1093 const KernelLoadInfo& info); |
1091 | 1094 |
1092 ~Kernel(); | 1095 ~Kernel(); |
1093 | 1096 |
1094 PathString const db_path; | 1097 FilePath const db_path; |
1095 // TODO(timsteele): audit use of the member and remove if possible | 1098 // TODO(timsteele): audit use of the member and remove if possible |
1096 volatile base::subtle::AtomicWord refcount; | 1099 volatile base::subtle::AtomicWord refcount; |
1097 void AddRef(); // For convenience. | 1100 void AddRef(); // For convenience. |
1098 void Release(); | 1101 void Release(); |
1099 | 1102 |
1100 // Implements ReadTransaction / WriteTransaction using a simple lock. | 1103 // Implements ReadTransaction / WriteTransaction using a simple lock. |
1101 Lock transaction_mutex; | 1104 Lock transaction_mutex; |
1102 | 1105 |
1103 // The name of this directory, used as a key into open_files_; | 1106 // The name of this directory, used as a key into open_files_; |
1104 PathString const name_; | 1107 PathString const name_; |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1247 | 1250 |
1248 // Exposed in header as this is used as a sqlite3 callback. | 1251 // Exposed in header as this is used as a sqlite3 callback. |
1249 int ComparePathNames16(void*, int a_bytes, const void* a, int b_bytes, | 1252 int ComparePathNames16(void*, int a_bytes, const void* a, int b_bytes, |
1250 const void* b); | 1253 const void* b); |
1251 | 1254 |
1252 int64 Now(); | 1255 int64 Now(); |
1253 | 1256 |
1254 // Does wildcard processing. | 1257 // Does wildcard processing. |
1255 BOOL PathNameMatch(const PathString& pathname, const PathString& pathspec); | 1258 BOOL PathNameMatch(const PathString& pathname, const PathString& pathspec); |
1256 | 1259 |
1257 PathString GetFullPath(BaseTransaction* trans, const Entry& e); | |
1258 | |
1259 inline void ReverseAppend(const PathString& s, PathString* target) { | |
1260 target->append(s.rbegin(), s.rend()); | |
1261 } | |
1262 | |
1263 class ExtendedAttribute { | 1260 class ExtendedAttribute { |
1264 public: | 1261 public: |
1265 ExtendedAttribute(BaseTransaction* trans, GetByHandle, | 1262 ExtendedAttribute(BaseTransaction* trans, GetByHandle, |
1266 const ExtendedAttributeKey& key); | 1263 const ExtendedAttributeKey& key); |
1267 int64 metahandle() const { return i_->first.metahandle; } | 1264 int64 metahandle() const { return i_->first.metahandle; } |
1268 const PathString& key() const { return i_->first.key; } | 1265 const PathString& key() const { return i_->first.key; } |
1269 const Blob& value() const { return i_->second.value; } | 1266 const Blob& value() const { return i_->second.value; } |
1270 bool is_deleted() const { return i_->second.is_deleted; } | 1267 bool is_deleted() const { return i_->second.is_deleted; } |
1271 bool good() const { return good_; } | 1268 bool good() const { return good_; } |
1272 bool operator < (const ExtendedAttribute& x) const { | 1269 bool operator < (const ExtendedAttribute& x) const { |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1316 void ZeroFields(EntryKernel* entry, int first_field); | 1313 void ZeroFields(EntryKernel* entry, int first_field); |
1317 | 1314 |
1318 } // namespace syncable | 1315 } // namespace syncable |
1319 | 1316 |
1320 std::ostream& operator <<(std::ostream&, const syncable::Blob&); | 1317 std::ostream& operator <<(std::ostream&, const syncable::Blob&); |
1321 | 1318 |
1322 browser_sync::FastDump& operator << | 1319 browser_sync::FastDump& operator << |
1323 (browser_sync::FastDump&, const syncable::Blob&); | 1320 (browser_sync::FastDump&, const syncable::Blob&); |
1324 | 1321 |
1325 #endif // CHROME_BROWSER_SYNC_SYNCABLE_SYNCABLE_H_ | 1322 #endif // CHROME_BROWSER_SYNC_SYNCABLE_SYNCABLE_H_ |
OLD | NEW |