| OLD | NEW |
| 1 // Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-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 #include "chrome/browser/sync/engine/syncapi.h" | 5 #include "chrome/browser/sync/engine/syncapi.h" |
| 6 | 6 |
| 7 #include "build/build_config.h" | 7 #include "build/build_config.h" |
| 8 | 8 |
| 9 #if defined(OS_WIN) | 9 #if defined(OS_WIN) |
| 10 #include <windows.h> | 10 #include <windows.h> |
| (...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 237 | 237 |
| 238 int64 BaseNode::GetId() const { | 238 int64 BaseNode::GetId() const { |
| 239 return GetEntry()->Get(syncable::META_HANDLE); | 239 return GetEntry()->Get(syncable::META_HANDLE); |
| 240 } | 240 } |
| 241 | 241 |
| 242 bool BaseNode::GetIsFolder() const { | 242 bool BaseNode::GetIsFolder() const { |
| 243 return GetEntry()->Get(syncable::IS_DIR); | 243 return GetEntry()->Get(syncable::IS_DIR); |
| 244 } | 244 } |
| 245 | 245 |
| 246 const std::wstring& BaseNode::GetTitle() const { | 246 const std::wstring& BaseNode::GetTitle() const { |
| 247 ServerNameToSyncAPIName(GetEntry()->GetName().non_unique_value(), | 247 ServerNameToSyncAPIName(GetEntry()->Get(syncable::NON_UNIQUE_NAME), |
| 248 &data_->title); | 248 &data_->title); |
| 249 return data_->title; | 249 return data_->title; |
| 250 } | 250 } |
| 251 | 251 |
| 252 const GURL& BaseNode::GetURL() const { | 252 const GURL& BaseNode::GetURL() const { |
| 253 GURL url(GetEntry()->Get(syncable::BOOKMARK_URL)); | 253 GURL url(GetEntry()->Get(syncable::BOOKMARK_URL)); |
| 254 url.Swap(&data_->url); | 254 url.Swap(&data_->url); |
| 255 return data_->url; | 255 return data_->url; |
| 256 } | 256 } |
| 257 | 257 |
| 258 const int64* BaseNode::GetChildIds(size_t* child_count) const { | 258 const int64* BaseNode::GetChildIds(size_t* child_count) const { |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 309 return; // Skip redundant changes. | 309 return; // Skip redundant changes. |
| 310 | 310 |
| 311 entry_->Put(syncable::IS_DIR, folder); | 311 entry_->Put(syncable::IS_DIR, folder); |
| 312 MarkForSyncing(); | 312 MarkForSyncing(); |
| 313 } | 313 } |
| 314 | 314 |
| 315 void WriteNode::SetTitle(const std::wstring& title) { | 315 void WriteNode::SetTitle(const std::wstring& title) { |
| 316 std::string server_legal_name; | 316 std::string server_legal_name; |
| 317 SyncAPINameToServerName(title, &server_legal_name); | 317 SyncAPINameToServerName(title, &server_legal_name); |
| 318 | 318 |
| 319 syncable::Name old_name = entry_->GetName(); | 319 PathString old_name = entry_->Get(syncable::NON_UNIQUE_NAME); |
| 320 | 320 |
| 321 if (server_legal_name == old_name.non_unique_value()) | 321 if (server_legal_name == old_name) |
| 322 return; // Skip redundant changes. | 322 return; // Skip redundant changes. |
| 323 | 323 |
| 324 // Otherwise, derive a new unique name so we have a valid value | 324 entry_->Put(syncable::NON_UNIQUE_NAME, server_legal_name); |
| 325 // to use as the DBName. | |
| 326 syncable::SyncName sync_name(server_legal_name); | |
| 327 syncable::DBName db_name(sync_name.value()); | |
| 328 db_name.MakeOSLegal(); | |
| 329 db_name.MakeNoncollidingForEntry(transaction_->GetWrappedTrans(), | |
| 330 entry_->Get(syncable::PARENT_ID), entry_); | |
| 331 | |
| 332 syncable::Name new_name = syncable::Name::FromDBNameAndSyncName(db_name, | |
| 333 sync_name); | |
| 334 entry_->PutName(new_name); | |
| 335 MarkForSyncing(); | 325 MarkForSyncing(); |
| 336 } | 326 } |
| 337 | 327 |
| 338 void WriteNode::SetURL(const GURL& url) { | 328 void WriteNode::SetURL(const GURL& url) { |
| 339 const std::string& url_string = url.spec(); | 329 const std::string& url_string = url.spec(); |
| 340 if (url_string == entry_->Get(syncable::BOOKMARK_URL)) | 330 if (url_string == entry_->Get(syncable::BOOKMARK_URL)) |
| 341 return; // Skip redundant changes. | 331 return; // Skip redundant changes. |
| 342 | 332 |
| 343 entry_->Put(syncable::BOOKMARK_URL, url_string); | 333 entry_->Put(syncable::BOOKMARK_URL, url_string); |
| 344 MarkForSyncing(); | 334 MarkForSyncing(); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 374 const BaseNode* predecessor) { | 364 const BaseNode* predecessor) { |
| 375 DCHECK(!entry_) << "Init called twice"; | 365 DCHECK(!entry_) << "Init called twice"; |
| 376 // |predecessor| must be a child of |parent| or NULL. | 366 // |predecessor| must be a child of |parent| or NULL. |
| 377 if (predecessor && predecessor->GetParentId() != parent.GetId()) { | 367 if (predecessor && predecessor->GetParentId() != parent.GetId()) { |
| 378 DCHECK(false); | 368 DCHECK(false); |
| 379 return false; | 369 return false; |
| 380 } | 370 } |
| 381 | 371 |
| 382 syncable::Id parent_id = parent.GetEntry()->Get(syncable::ID); | 372 syncable::Id parent_id = parent.GetEntry()->Get(syncable::ID); |
| 383 | 373 |
| 384 // Start out with a dummy name, but make it unique. We expect | 374 // Start out with a dummy name. We expect |
| 385 // the caller to set a meaningful name after creation. | 375 // the caller to set a meaningful name after creation. |
| 386 syncable::DBName dummy(kDefaultNameForNewNodes); | 376 PathString dummy(kDefaultNameForNewNodes); |
| 387 dummy.MakeOSLegal(); | |
| 388 dummy.MakeNoncollidingForEntry(transaction_->GetWrappedTrans(), parent_id, | |
| 389 NULL); | |
| 390 | 377 |
| 391 entry_ = new syncable::MutableEntry(transaction_->GetWrappedWriteTrans(), | 378 entry_ = new syncable::MutableEntry(transaction_->GetWrappedWriteTrans(), |
| 392 syncable::CREATE, parent_id, dummy); | 379 syncable::CREATE, parent_id, dummy); |
| 393 | 380 |
| 394 if (!entry_->good()) | 381 if (!entry_->good()) |
| 395 return false; | 382 return false; |
| 396 | 383 |
| 397 // Entries are untitled folders by default. | 384 // Entries are untitled folders by default. |
| 398 entry_->Put(syncable::IS_DIR, true); | 385 entry_->Put(syncable::IS_DIR, true); |
| 399 // TODO(ncarter): Naming this bit IS_BOOKMARK_OBJECT is a bit unfortunate, | 386 // TODO(ncarter): Naming this bit IS_BOOKMARK_OBJECT is a bit unfortunate, |
| (...skipping 18 matching lines...) Expand all Loading... |
| 418 | 405 |
| 419 // Filter out redundant changes if both the parent and the predecessor match. | 406 // Filter out redundant changes if both the parent and the predecessor match. |
| 420 if (new_parent_id == entry_->Get(syncable::PARENT_ID)) { | 407 if (new_parent_id == entry_->Get(syncable::PARENT_ID)) { |
| 421 const syncable::Id& old = entry_->Get(syncable::PREV_ID); | 408 const syncable::Id& old = entry_->Get(syncable::PREV_ID); |
| 422 if ((!predecessor && old.IsRoot()) || | 409 if ((!predecessor && old.IsRoot()) || |
| 423 (predecessor && (old == predecessor->GetEntry()->Get(syncable::ID)))) { | 410 (predecessor && (old == predecessor->GetEntry()->Get(syncable::ID)))) { |
| 424 return true; | 411 return true; |
| 425 } | 412 } |
| 426 } | 413 } |
| 427 | 414 |
| 428 // Discard the old database name, derive a new database name from the sync | 415 // Atomically change the parent. This will fail if it would |
| 429 // name, and make it legal and unique. | |
| 430 syncable::Name name = syncable::Name::FromSyncName(GetEntry()->GetName()); | |
| 431 name.db_value().MakeOSLegal(); | |
| 432 name.db_value().MakeNoncollidingForEntry(GetTransaction()->GetWrappedTrans(), | |
| 433 new_parent_id, entry_); | |
| 434 | |
| 435 // Atomically change the parent and name. This will fail if it would | |
| 436 // introduce a cycle in the hierarchy. | 416 // introduce a cycle in the hierarchy. |
| 437 if (!entry_->PutParentIdAndName(new_parent_id, name)) | 417 if (!entry_->Put(syncable::PARENT_ID, new_parent_id)) |
| 438 return false; | 418 return false; |
| 439 | 419 |
| 440 // Now set the predecessor, which sets IS_UNSYNCED as necessary. | 420 // Now set the predecessor, which sets IS_UNSYNCED as necessary. |
| 441 PutPredecessor(predecessor); | 421 PutPredecessor(predecessor); |
| 442 | 422 |
| 443 return true; | 423 return true; |
| 444 } | 424 } |
| 445 | 425 |
| 446 const syncable::Entry* WriteNode::GetEntry() const { | 426 const syncable::Entry* WriteNode::GetEntry() const { |
| 447 return entry_; | 427 return entry_; |
| (...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 806 if (a.ref(syncable::PARENT_ID) != b.Get(syncable::PARENT_ID)) | 786 if (a.ref(syncable::PARENT_ID) != b.Get(syncable::PARENT_ID)) |
| 807 return true; | 787 return true; |
| 808 return false; | 788 return false; |
| 809 } | 789 } |
| 810 | 790 |
| 811 // Determine if any of the fields made visible to clients of the Sync API | 791 // Determine if any of the fields made visible to clients of the Sync API |
| 812 // differ between the versions of an entry stored in |a| and |b|. A return | 792 // differ between the versions of an entry stored in |a| and |b|. A return |
| 813 // value of false means that it should be OK to ignore this change. | 793 // value of false means that it should be OK to ignore this change. |
| 814 static bool BookmarkPropertiesDiffer(const syncable::EntryKernel& a, | 794 static bool BookmarkPropertiesDiffer(const syncable::EntryKernel& a, |
| 815 const syncable::Entry& b) { | 795 const syncable::Entry& b) { |
| 816 if (a.ref(syncable::NAME) != b.Get(syncable::NAME)) | 796 if (a.ref(syncable::NON_UNIQUE_NAME) != b.Get(syncable::NON_UNIQUE_NAME)) |
| 817 return true; | |
| 818 if (a.ref(syncable::UNSANITIZED_NAME) != b.Get(syncable::UNSANITIZED_NAME)) | |
| 819 return true; | 797 return true; |
| 820 if (a.ref(syncable::IS_DIR) != b.Get(syncable::IS_DIR)) | 798 if (a.ref(syncable::IS_DIR) != b.Get(syncable::IS_DIR)) |
| 821 return true; | 799 return true; |
| 822 if (a.ref(syncable::BOOKMARK_URL) != b.Get(syncable::BOOKMARK_URL)) | 800 if (a.ref(syncable::BOOKMARK_URL) != b.Get(syncable::BOOKMARK_URL)) |
| 823 return true; | 801 return true; |
| 824 if (a.ref(syncable::BOOKMARK_FAVICON) != b.Get(syncable::BOOKMARK_FAVICON)) | 802 if (a.ref(syncable::BOOKMARK_FAVICON) != b.Get(syncable::BOOKMARK_FAVICON)) |
| 825 return true; | 803 return true; |
| 826 if (BookmarkPositionsDiffer(a, b)) | 804 if (BookmarkPositionsDiffer(a, b)) |
| 827 return true; | 805 return true; |
| 828 return false; | 806 return false; |
| (...skipping 701 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1530 BaseTransaction::~BaseTransaction() { | 1508 BaseTransaction::~BaseTransaction() { |
| 1531 delete lookup_; | 1509 delete lookup_; |
| 1532 } | 1510 } |
| 1533 | 1511 |
| 1534 UserShare* SyncManager::GetUserShare() const { | 1512 UserShare* SyncManager::GetUserShare() const { |
| 1535 DCHECK(data_->initialized()) << "GetUserShare requires initialization!"; | 1513 DCHECK(data_->initialized()) << "GetUserShare requires initialization!"; |
| 1536 return data_->GetUserShare(); | 1514 return data_->GetUserShare(); |
| 1537 } | 1515 } |
| 1538 | 1516 |
| 1539 } // namespace sync_api | 1517 } // namespace sync_api |
| OLD | NEW |