OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 <algorithm> | 7 #include <algorithm> |
8 #include <bitset> | 8 #include <bitset> |
9 #include <iomanip> | 9 #include <iomanip> |
10 #include <list> | 10 #include <list> |
11 #include <queue> | 11 #include <queue> |
12 #include <string> | 12 #include <string> |
13 #include <vector> | 13 #include <vector> |
14 | 14 |
15 #include "base/base64.h" | 15 #include "base/base64.h" |
16 #include "base/command_line.h" | 16 #include "base/command_line.h" |
17 #include "base/logging.h" | 17 #include "base/logging.h" |
18 #include "base/memory/scoped_ptr.h" | 18 #include "base/memory/scoped_ptr.h" |
19 #include "base/message_loop.h" | 19 #include "base/message_loop.h" |
20 #include "base/observer_list.h" | 20 #include "base/observer_list.h" |
21 #include "base/sha1.h" | 21 #include "base/sha1.h" |
22 #include "base/string_number_conversions.h" | 22 #include "base/string_number_conversions.h" |
23 #include "base/string_util.h" | 23 #include "base/string_util.h" |
24 #include "base/synchronization/lock.h" | 24 #include "base/synchronization/lock.h" |
25 #include "base/task.h" | 25 #include "base/task.h" |
| 26 #include "base/time.h" |
26 #include "base/utf_string_conversions.h" | 27 #include "base/utf_string_conversions.h" |
27 #include "base/values.h" | 28 #include "base/values.h" |
28 #include "chrome/browser/sync/engine/all_status.h" | 29 #include "chrome/browser/sync/engine/all_status.h" |
29 #include "chrome/browser/sync/engine/change_reorder_buffer.h" | 30 #include "chrome/browser/sync/engine/change_reorder_buffer.h" |
30 #include "chrome/browser/sync/engine/model_safe_worker.h" | 31 #include "chrome/browser/sync/engine/model_safe_worker.h" |
| 32 #include "chrome/browser/sync/engine/nudge_source.h" |
31 #include "chrome/browser/sync/engine/net/server_connection_manager.h" | 33 #include "chrome/browser/sync/engine/net/server_connection_manager.h" |
32 #include "chrome/browser/sync/engine/net/syncapi_server_connection_manager.h" | 34 #include "chrome/browser/sync/engine/net/syncapi_server_connection_manager.h" |
33 #include "chrome/browser/sync/engine/syncer.h" | 35 #include "chrome/browser/sync/engine/syncer.h" |
34 #include "chrome/browser/sync/engine/syncer_thread.h" | 36 #include "chrome/browser/sync/engine/syncer_thread.h" |
35 #include "chrome/browser/sync/engine/syncer_thread2.h" | |
36 #include "chrome/browser/sync/engine/syncer_thread_adapter.h" | |
37 #include "chrome/browser/sync/engine/http_post_provider_factory.h" | 37 #include "chrome/browser/sync/engine/http_post_provider_factory.h" |
38 #include "chrome/browser/sync/js_arg_list.h" | 38 #include "chrome/browser/sync/js_arg_list.h" |
39 #include "chrome/browser/sync/js_backend.h" | 39 #include "chrome/browser/sync/js_backend.h" |
40 #include "chrome/browser/sync/js_event_router.h" | 40 #include "chrome/browser/sync/js_event_router.h" |
41 #include "chrome/browser/sync/notifier/sync_notifier.h" | 41 #include "chrome/browser/sync/notifier/sync_notifier.h" |
42 #include "chrome/browser/sync/notifier/sync_notifier_observer.h" | 42 #include "chrome/browser/sync/notifier/sync_notifier_observer.h" |
43 #include "chrome/browser/sync/protocol/app_specifics.pb.h" | 43 #include "chrome/browser/sync/protocol/app_specifics.pb.h" |
44 #include "chrome/browser/sync/protocol/autofill_specifics.pb.h" | 44 #include "chrome/browser/sync/protocol/autofill_specifics.pb.h" |
45 #include "chrome/browser/sync/protocol/bookmark_specifics.pb.h" | 45 #include "chrome/browser/sync/protocol/bookmark_specifics.pb.h" |
46 #include "chrome/browser/sync/protocol/extension_specifics.pb.h" | 46 #include "chrome/browser/sync/protocol/extension_specifics.pb.h" |
47 #include "chrome/browser/sync/protocol/nigori_specifics.pb.h" | 47 #include "chrome/browser/sync/protocol/nigori_specifics.pb.h" |
48 #include "chrome/browser/sync/protocol/preference_specifics.pb.h" | 48 #include "chrome/browser/sync/protocol/preference_specifics.pb.h" |
49 #include "chrome/browser/sync/protocol/proto_value_conversions.h" | 49 #include "chrome/browser/sync/protocol/proto_value_conversions.h" |
50 #include "chrome/browser/sync/protocol/service_constants.h" | 50 #include "chrome/browser/sync/protocol/service_constants.h" |
51 #include "chrome/browser/sync/protocol/session_specifics.pb.h" | 51 #include "chrome/browser/sync/protocol/session_specifics.pb.h" |
52 #include "chrome/browser/sync/protocol/sync.pb.h" | 52 #include "chrome/browser/sync/protocol/sync.pb.h" |
53 #include "chrome/browser/sync/protocol/theme_specifics.pb.h" | 53 #include "chrome/browser/sync/protocol/theme_specifics.pb.h" |
54 #include "chrome/browser/sync/protocol/typed_url_specifics.pb.h" | 54 #include "chrome/browser/sync/protocol/typed_url_specifics.pb.h" |
55 #include "chrome/browser/sync/sessions/sync_session.h" | 55 #include "chrome/browser/sync/sessions/sync_session.h" |
56 #include "chrome/browser/sync/sessions/sync_session_context.h" | 56 #include "chrome/browser/sync/sessions/sync_session_context.h" |
57 #include "chrome/browser/sync/syncable/autofill_migration.h" | 57 #include "chrome/browser/sync/syncable/autofill_migration.h" |
58 #include "chrome/browser/sync/syncable/directory_manager.h" | 58 #include "chrome/browser/sync/syncable/directory_manager.h" |
59 #include "chrome/browser/sync/syncable/model_type_payload_map.h" | 59 #include "chrome/browser/sync/syncable/model_type_payload_map.h" |
| 60 #include "chrome/browser/sync/syncable/model_type.h" |
60 #include "chrome/browser/sync/syncable/nigori_util.h" | 61 #include "chrome/browser/sync/syncable/nigori_util.h" |
61 #include "chrome/browser/sync/syncable/syncable.h" | 62 #include "chrome/browser/sync/syncable/syncable.h" |
62 #include "chrome/browser/sync/util/crypto_helpers.h" | 63 #include "chrome/browser/sync/util/crypto_helpers.h" |
63 #include "chrome/common/chrome_switches.h" | 64 #include "chrome/common/chrome_switches.h" |
64 #include "chrome/common/deprecated/event_sys.h" | 65 #include "chrome/common/deprecated/event_sys.h" |
65 #include "chrome/common/net/gaia/gaia_authenticator.h" | 66 #include "chrome/common/net/gaia/gaia_authenticator.h" |
66 #include "content/browser/browser_thread.h" | 67 #include "content/browser/browser_thread.h" |
67 #include "net/base/network_change_notifier.h" | 68 #include "net/base/network_change_notifier.h" |
68 | 69 |
| 70 using base::TimeDelta; |
69 using browser_sync::AllStatus; | 71 using browser_sync::AllStatus; |
70 using browser_sync::Cryptographer; | 72 using browser_sync::Cryptographer; |
71 using browser_sync::KeyParams; | 73 using browser_sync::KeyParams; |
72 using browser_sync::ModelSafeRoutingInfo; | 74 using browser_sync::ModelSafeRoutingInfo; |
73 using browser_sync::ModelSafeWorker; | 75 using browser_sync::ModelSafeWorker; |
74 using browser_sync::ModelSafeWorkerRegistrar; | 76 using browser_sync::ModelSafeWorkerRegistrar; |
75 using browser_sync::ServerConnectionEvent; | 77 using browser_sync::ServerConnectionEvent; |
76 using browser_sync::ServerConnectionEvent2; | 78 using browser_sync::ServerConnectionEvent2; |
77 using browser_sync::ServerConnectionEventListener; | 79 using browser_sync::ServerConnectionEventListener; |
78 using browser_sync::SyncEngineEvent; | 80 using browser_sync::SyncEngineEvent; |
79 using browser_sync::SyncEngineEventListener; | 81 using browser_sync::SyncEngineEventListener; |
80 using browser_sync::Syncer; | 82 using browser_sync::Syncer; |
81 using browser_sync::SyncerThread; | 83 using browser_sync::SyncerThread; |
82 using browser_sync::SyncerThreadAdapter; | |
83 using browser_sync::kNigoriTag; | 84 using browser_sync::kNigoriTag; |
84 using browser_sync::sessions::SyncSessionContext; | 85 using browser_sync::sessions::SyncSessionContext; |
85 using std::list; | 86 using std::list; |
86 using std::hex; | 87 using std::hex; |
87 using std::string; | 88 using std::string; |
88 using std::vector; | 89 using std::vector; |
89 using syncable::Directory; | 90 using syncable::Directory; |
90 using syncable::DirectoryManager; | 91 using syncable::DirectoryManager; |
91 using syncable::Entry; | 92 using syncable::Entry; |
| 93 using syncable::ModelTypeBitSet; |
92 using syncable::SPECIFICS; | 94 using syncable::SPECIFICS; |
93 using sync_pb::AutofillProfileSpecifics; | 95 using sync_pb::AutofillProfileSpecifics; |
94 | 96 |
95 typedef GoogleServiceAuthError AuthError; | 97 typedef GoogleServiceAuthError AuthError; |
96 | 98 |
97 static const int kThreadExitTimeoutMsec = 60000; | 99 static const int kThreadExitTimeoutMsec = 60000; |
98 static const int kSSLPort = 443; | 100 static const int kSSLPort = 443; |
99 static const int kSyncerThreadDelayMsec = 250; | 101 static const int kSyncerThreadDelayMsec = 250; |
100 | 102 |
101 #if defined(OS_CHROMEOS) | 103 #if defined(OS_CHROMEOS) |
(...skipping 1160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1262 | 1264 |
1263 void AddObserver(SyncManager::Observer* observer); | 1265 void AddObserver(SyncManager::Observer* observer); |
1264 | 1266 |
1265 void RemoveObserver(SyncManager::Observer* observer); | 1267 void RemoveObserver(SyncManager::Observer* observer); |
1266 | 1268 |
1267 // Accessors for the private members. | 1269 // Accessors for the private members. |
1268 DirectoryManager* dir_manager() { return share_.dir_manager.get(); } | 1270 DirectoryManager* dir_manager() { return share_.dir_manager.get(); } |
1269 SyncAPIServerConnectionManager* connection_manager() { | 1271 SyncAPIServerConnectionManager* connection_manager() { |
1270 return connection_manager_.get(); | 1272 return connection_manager_.get(); |
1271 } | 1273 } |
1272 SyncerThreadAdapter* syncer_thread() { return syncer_thread_.get(); } | 1274 SyncerThread* syncer_thread() { return syncer_thread_.get(); } |
1273 UserShare* GetUserShare() { return &share_; } | 1275 UserShare* GetUserShare() { return &share_; } |
1274 | 1276 |
1275 // Return the currently active (validated) username for use with syncable | 1277 // Return the currently active (validated) username for use with syncable |
1276 // types. | 1278 // types. |
1277 const std::string& username_for_share() const { | 1279 const std::string& username_for_share() const { |
1278 return share_.name; | 1280 return share_.name; |
1279 } | 1281 } |
1280 | 1282 |
1281 Status GetStatus(); | 1283 Status GetStatus(); |
1282 | 1284 |
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1509 | 1511 |
1510 ObserverList<SyncManager::Observer> observers_; | 1512 ObserverList<SyncManager::Observer> observers_; |
1511 | 1513 |
1512 browser_sync::JsEventRouter* parent_router_; | 1514 browser_sync::JsEventRouter* parent_router_; |
1513 | 1515 |
1514 // The ServerConnectionManager used to abstract communication between the | 1516 // The ServerConnectionManager used to abstract communication between the |
1515 // client (the Syncer) and the sync server. | 1517 // client (the Syncer) and the sync server. |
1516 scoped_ptr<SyncAPIServerConnectionManager> connection_manager_; | 1518 scoped_ptr<SyncAPIServerConnectionManager> connection_manager_; |
1517 | 1519 |
1518 // The thread that runs the Syncer. Needs to be explicitly Start()ed. | 1520 // The thread that runs the Syncer. Needs to be explicitly Start()ed. |
1519 scoped_ptr<SyncerThreadAdapter> syncer_thread_; | 1521 scoped_ptr<SyncerThread> syncer_thread_; |
1520 | 1522 |
1521 // The SyncNotifier which notifies us when updates need to be downloaded. | 1523 // The SyncNotifier which notifies us when updates need to be downloaded. |
1522 sync_notifier::SyncNotifier* sync_notifier_; | 1524 sync_notifier::SyncNotifier* sync_notifier_; |
1523 | 1525 |
1524 // A multi-purpose status watch object that aggregates stats from various | 1526 // A multi-purpose status watch object that aggregates stats from various |
1525 // sync components. | 1527 // sync components. |
1526 AllStatus allstatus_; | 1528 AllStatus allstatus_; |
1527 | 1529 |
1528 // Each element of this array is a store of change records produced by | 1530 // Each element of this array is a store of change records produced by |
1529 // HandleChangeEvent during the CALCULATE_CHANGES step. The changes are | 1531 // HandleChangeEvent during the CALCULATE_CHANGES step. The changes are |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1657 | 1659 |
1658 void SyncManager::EncryptDataTypes( | 1660 void SyncManager::EncryptDataTypes( |
1659 const syncable::ModelTypeSet& encrypted_types) { | 1661 const syncable::ModelTypeSet& encrypted_types) { |
1660 data_->EncryptDataTypes(encrypted_types); | 1662 data_->EncryptDataTypes(encrypted_types); |
1661 } | 1663 } |
1662 | 1664 |
1663 bool SyncManager::IsUsingExplicitPassphrase() { | 1665 bool SyncManager::IsUsingExplicitPassphrase() { |
1664 return data_ && data_->IsUsingExplicitPassphrase(); | 1666 return data_ && data_->IsUsingExplicitPassphrase(); |
1665 } | 1667 } |
1666 | 1668 |
1667 bool SyncManager::RequestPause() { | |
1668 if (data_->syncer_thread()) | |
1669 return data_->syncer_thread()->RequestPause(); | |
1670 return false; | |
1671 } | |
1672 | |
1673 bool SyncManager::RequestResume() { | |
1674 if (data_->syncer_thread()) | |
1675 return data_->syncer_thread()->RequestResume(); | |
1676 return false; | |
1677 } | |
1678 | |
1679 void SyncManager::RequestNudge(const tracked_objects::Location& location) { | 1669 void SyncManager::RequestNudge(const tracked_objects::Location& location) { |
1680 if (data_->syncer_thread()) | 1670 if (data_->syncer_thread()) |
1681 data_->syncer_thread()->NudgeSyncer(0, SyncerThread::kLocal, location); | 1671 data_->syncer_thread()->ScheduleNudge( |
| 1672 TimeDelta::FromMilliseconds(0), browser_sync::NUDGE_SOURCE_LOCAL, |
| 1673 ModelTypeBitSet(), location); |
1682 } | 1674 } |
1683 | 1675 |
1684 void SyncManager::RequestClearServerData() { | 1676 void SyncManager::RequestClearServerData() { |
1685 if (data_->syncer_thread()) | 1677 if (data_->syncer_thread()) |
1686 data_->syncer_thread()->NudgeSyncer(0, SyncerThread::kClearPrivateData, | 1678 data_->syncer_thread()->ScheduleClearUserData(); |
1687 FROM_HERE); | |
1688 } | 1679 } |
1689 | 1680 |
1690 void SyncManager::RequestConfig(const syncable::ModelTypeBitSet& types) { | 1681 void SyncManager::RequestConfig(const syncable::ModelTypeBitSet& types) { |
1691 if (!data_->syncer_thread()) | 1682 if (!data_->syncer_thread()) |
1692 return; | 1683 return; |
1693 // It is an error for this to be called if new_impl is null. | |
1694 StartConfigurationMode(NULL); | 1684 StartConfigurationMode(NULL); |
1695 data_->syncer_thread()->new_impl()->ScheduleConfig(types); | 1685 data_->syncer_thread()->ScheduleConfig(types); |
1696 } | 1686 } |
1697 | 1687 |
1698 void SyncManager::StartConfigurationMode(ModeChangeCallback* callback) { | 1688 void SyncManager::StartConfigurationMode(ModeChangeCallback* callback) { |
1699 if (!data_->syncer_thread()) | 1689 if (!data_->syncer_thread()) |
1700 return; | 1690 return; |
1701 if (!data_->syncer_thread()->new_impl()) | 1691 data_->syncer_thread()->Start( |
1702 return; | 1692 browser_sync::SyncerThread::CONFIGURATION_MODE, callback); |
1703 data_->syncer_thread()->new_impl()->Start( | |
1704 browser_sync::s3::SyncerThread::CONFIGURATION_MODE, callback); | |
1705 } | 1693 } |
1706 | 1694 |
1707 const std::string& SyncManager::GetAuthenticatedUsername() { | 1695 const std::string& SyncManager::GetAuthenticatedUsername() { |
1708 DCHECK(data_); | 1696 DCHECK(data_); |
1709 return data_->username_for_share(); | 1697 return data_->username_for_share(); |
1710 } | 1698 } |
1711 | 1699 |
1712 bool SyncManager::SyncInternal::Init( | 1700 bool SyncManager::SyncInternal::Init( |
1713 const FilePath& database_location, | 1701 const FilePath& database_location, |
1714 const std::string& sync_server_and_path, | 1702 const std::string& sync_server_and_path, |
(...skipping 17 matching lines...) Expand all Loading... |
1732 sync_notifier_ = sync_notifier; | 1720 sync_notifier_ = sync_notifier; |
1733 sync_notifier_->AddObserver(this); | 1721 sync_notifier_->AddObserver(this); |
1734 | 1722 |
1735 share_.dir_manager.reset(new DirectoryManager(database_location)); | 1723 share_.dir_manager.reset(new DirectoryManager(database_location)); |
1736 | 1724 |
1737 connection_manager_.reset(new SyncAPIServerConnectionManager( | 1725 connection_manager_.reset(new SyncAPIServerConnectionManager( |
1738 sync_server_and_path, port, use_ssl, user_agent, post_factory)); | 1726 sync_server_and_path, port, use_ssl, user_agent, post_factory)); |
1739 | 1727 |
1740 net::NetworkChangeNotifier::AddIPAddressObserver(this); | 1728 net::NetworkChangeNotifier::AddIPAddressObserver(this); |
1741 | 1729 |
1742 bool new_syncer_thread = CommandLine::ForCurrentProcess()->HasSwitch( | 1730 connection_manager()->AddListener(this); |
1743 switches::kNewSyncerThread); | |
1744 | |
1745 if (new_syncer_thread) { | |
1746 connection_manager()->AddListener(this); | |
1747 } else { | |
1748 connection_manager_hookup_.reset( | |
1749 NewEventListenerHookup(connection_manager()->channel(), this, | |
1750 &SyncManager::SyncInternal::HandleServerConnectionEvent)); | |
1751 } | |
1752 | 1731 |
1753 // TODO(akalin): CheckServerReachable() can block, which may cause jank if we | 1732 // TODO(akalin): CheckServerReachable() can block, which may cause jank if we |
1754 // try to shut down sync. Fix this. | 1733 // try to shut down sync. Fix this. |
1755 core_message_loop_->PostTask(FROM_HERE, | 1734 core_message_loop_->PostTask(FROM_HERE, |
1756 method_factory_.NewRunnableMethod(&SyncInternal::CheckServerReachable)); | 1735 method_factory_.NewRunnableMethod(&SyncInternal::CheckServerReachable)); |
1757 | 1736 |
1758 // Test mode does not use a syncer context or syncer thread. | 1737 // Test mode does not use a syncer context or syncer thread. |
1759 if (!setup_for_test_mode_) { | 1738 if (!setup_for_test_mode_) { |
1760 // Build a SyncSessionContext and store the worker in it. | 1739 // Build a SyncSessionContext and store the worker in it. |
1761 VLOG(1) << "Sync is bringing up SyncSessionContext."; | 1740 VLOG(1) << "Sync is bringing up SyncSessionContext."; |
1762 std::vector<SyncEngineEventListener*> listeners; | 1741 std::vector<SyncEngineEventListener*> listeners; |
1763 listeners.push_back(&allstatus_); | 1742 listeners.push_back(&allstatus_); |
1764 listeners.push_back(this); | 1743 listeners.push_back(this); |
1765 SyncSessionContext* context = new SyncSessionContext( | 1744 SyncSessionContext* context = new SyncSessionContext( |
1766 connection_manager_.get(), | 1745 connection_manager_.get(), |
1767 dir_manager(), | 1746 dir_manager(), |
1768 model_safe_worker_registrar, | 1747 model_safe_worker_registrar, |
1769 listeners); | 1748 listeners); |
1770 context->set_account_name(credentials.email); | 1749 context->set_account_name(credentials.email); |
1771 // The SyncerThread takes ownership of |context|. | 1750 // The SyncerThread takes ownership of |context|. |
1772 syncer_thread_.reset(new SyncerThreadAdapter(context, | 1751 syncer_thread_.reset(new SyncerThread(context, new Syncer())); |
1773 new_syncer_thread)); | |
1774 } | 1752 } |
1775 | 1753 |
1776 bool signed_in = SignIn(credentials); | 1754 bool signed_in = SignIn(credentials); |
1777 | 1755 |
1778 // Do this once the directory is opened. | 1756 // Do this once the directory is opened. |
1779 BootstrapEncryption(restored_key_for_bootstrapping); | 1757 BootstrapEncryption(restored_key_for_bootstrapping); |
1780 return signed_in; | 1758 return signed_in; |
1781 } | 1759 } |
1782 | 1760 |
1783 void SyncManager::SyncInternal::BootstrapEncryption( | 1761 void SyncManager::SyncInternal::BootstrapEncryption( |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1818 | 1796 |
1819 // Refresh list of encrypted datatypes. | 1797 // Refresh list of encrypted datatypes. |
1820 syncable::ModelTypeSet encrypted_types = | 1798 syncable::ModelTypeSet encrypted_types = |
1821 syncable::GetEncryptedDataTypesFromNigori(nigori); | 1799 syncable::GetEncryptedDataTypesFromNigori(nigori); |
1822 | 1800 |
1823 // Ensure any datatypes that need encryption are encrypted. | 1801 // Ensure any datatypes that need encryption are encrypted. |
1824 EncryptDataTypes(encrypted_types); | 1802 EncryptDataTypes(encrypted_types); |
1825 } | 1803 } |
1826 | 1804 |
1827 void SyncManager::SyncInternal::StartSyncing() { | 1805 void SyncManager::SyncInternal::StartSyncing() { |
| 1806 // Start the syncer thread. This won't actually |
| 1807 // result in any syncing until at least the |
| 1808 // DirectoryManager broadcasts the OPENED event, |
| 1809 // and a valid server connection is detected. |
1828 if (syncer_thread()) // NULL during certain unittests. | 1810 if (syncer_thread()) // NULL during certain unittests. |
1829 syncer_thread()->Start(); // Start the syncer thread. This won't actually | 1811 syncer_thread()->Start(SyncerThread::NORMAL_MODE, NULL); |
1830 // result in any syncing until at least the | |
1831 // DirectoryManager broadcasts the OPENED event, | |
1832 // and a valid server connection is detected. | |
1833 } | 1812 } |
1834 | 1813 |
1835 void SyncManager::SyncInternal::MarkAndNotifyInitializationComplete() { | 1814 void SyncManager::SyncInternal::MarkAndNotifyInitializationComplete() { |
1836 // There is only one real time we need this mutex. If we get an auth | 1815 // There is only one real time we need this mutex. If we get an auth |
1837 // success, and before the initial sync ends we get an auth failure. In this | 1816 // success, and before the initial sync ends we get an auth failure. In this |
1838 // case we'll be listening to both the AuthWatcher and Syncer, and it's a race | 1817 // case we'll be listening to both the AuthWatcher and Syncer, and it's a race |
1839 // between their respective threads to call MarkAndNotify. We need to make | 1818 // between their respective threads to call MarkAndNotify. We need to make |
1840 // sure the observer is notified once and only once. | 1819 // sure the observer is notified once and only once. |
1841 { | 1820 { |
1842 base::AutoLock lock(initialized_mutex_); | 1821 base::AutoLock lock(initialized_mutex_); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1875 | 1854 |
1876 // Database has to be initialized for the guid to be available. | 1855 // Database has to be initialized for the guid to be available. |
1877 syncable::ScopedDirLookup lookup(dir_manager(), username_for_share()); | 1856 syncable::ScopedDirLookup lookup(dir_manager(), username_for_share()); |
1878 if (!lookup.good()) { | 1857 if (!lookup.good()) { |
1879 NOTREACHED(); | 1858 NOTREACHED(); |
1880 return false; | 1859 return false; |
1881 } | 1860 } |
1882 | 1861 |
1883 connection_manager()->set_client_id(lookup->cache_guid()); | 1862 connection_manager()->set_client_id(lookup->cache_guid()); |
1884 | 1863 |
1885 if (syncer_thread()) | |
1886 syncer_thread()->CreateSyncer(username_for_share()); | |
1887 | |
1888 MarkAndNotifyInitializationComplete(); | 1864 MarkAndNotifyInitializationComplete(); |
1889 dir_change_hookup_.reset(lookup->AddChangeObserver(this)); | 1865 dir_change_hookup_.reset(lookup->AddChangeObserver(this)); |
1890 return true; | 1866 return true; |
1891 } | 1867 } |
1892 | 1868 |
1893 bool SyncManager::SyncInternal::SignIn(const SyncCredentials& credentials) { | 1869 bool SyncManager::SyncInternal::SignIn(const SyncCredentials& credentials) { |
1894 DCHECK_EQ(MessageLoop::current(), core_message_loop_); | 1870 DCHECK_EQ(MessageLoop::current(), core_message_loop_); |
1895 DCHECK(share_.name.empty()); | 1871 DCHECK(share_.name.empty()); |
1896 share_.name = credentials.email; | 1872 share_.name = credentials.email; |
1897 | 1873 |
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2203 } | 2179 } |
2204 | 2180 |
2205 void SyncManager::Shutdown() { | 2181 void SyncManager::Shutdown() { |
2206 data_->Shutdown(); | 2182 data_->Shutdown(); |
2207 } | 2183 } |
2208 | 2184 |
2209 void SyncManager::SyncInternal::Shutdown() { | 2185 void SyncManager::SyncInternal::Shutdown() { |
2210 method_factory_.RevokeAll(); | 2186 method_factory_.RevokeAll(); |
2211 | 2187 |
2212 if (syncer_thread()) { | 2188 if (syncer_thread()) { |
2213 if (!syncer_thread()->Stop(kThreadExitTimeoutMsec)) { | 2189 syncer_thread()->Stop(); |
2214 LOG(FATAL) << "Unable to stop the syncer, it won't be happy..."; | |
2215 } | |
2216 syncer_thread_.reset(); | 2190 syncer_thread_.reset(); |
2217 } | 2191 } |
2218 | 2192 |
2219 // We NULL out sync_notifer_ so that any pending tasks do not | 2193 // We NULL out sync_notifer_ so that any pending tasks do not |
2220 // trigger further notifications. | 2194 // trigger further notifications. |
2221 // TODO(akalin): NULL the other member variables defensively, too. | 2195 // TODO(akalin): NULL the other member variables defensively, too. |
2222 if (sync_notifier_) { | 2196 if (sync_notifier_) { |
2223 sync_notifier_->RemoveObserver(this); | 2197 sync_notifier_->RemoveObserver(this); |
2224 } | 2198 } |
2225 | 2199 |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2410 exists_unsynced_items = true; | 2384 exists_unsynced_items = true; |
2411 | 2385 |
2412 model_types[model_type] = true; | 2386 model_types[model_type] = true; |
2413 if (model_type != syncable::PREFERENCES) | 2387 if (model_type != syncable::PREFERENCES) |
2414 only_preference_changes = false; | 2388 only_preference_changes = false; |
2415 } | 2389 } |
2416 } | 2390 } |
2417 if (exists_unsynced_items && syncer_thread()) { | 2391 if (exists_unsynced_items && syncer_thread()) { |
2418 int nudge_delay = only_preference_changes ? | 2392 int nudge_delay = only_preference_changes ? |
2419 kPreferencesNudgeDelayMilliseconds : kDefaultNudgeDelayMilliseconds; | 2393 kPreferencesNudgeDelayMilliseconds : kDefaultNudgeDelayMilliseconds; |
2420 syncer_thread()->NudgeSyncerWithDataTypes( | 2394 syncer_thread()->ScheduleNudge( |
2421 nudge_delay, | 2395 TimeDelta::FromMilliseconds(nudge_delay), |
2422 SyncerThread::kLocal, | 2396 browser_sync::NUDGE_SOURCE_LOCAL, |
2423 model_types, | 2397 model_types, |
2424 FROM_HERE); | 2398 FROM_HERE); |
2425 } | 2399 } |
2426 } | 2400 } |
2427 | 2401 |
2428 void SyncManager::SyncInternal::SetExtraChangeRecordData(int64 id, | 2402 void SyncManager::SyncInternal::SetExtraChangeRecordData(int64 id, |
2429 syncable::ModelType type, ChangeReorderBuffer* buffer, | 2403 syncable::ModelType type, ChangeReorderBuffer* buffer, |
2430 Cryptographer* cryptographer, const syncable::EntryKernel& original, | 2404 Cryptographer* cryptographer, const syncable::EntryKernel& original, |
2431 bool existed_before, bool exists_now) { | 2405 bool existed_before, bool exists_now) { |
2432 // If this is a deletion and the datatype was encrypted, we need to decrypt it | 2406 // If this is a deletion and the datatype was encrypted, we need to decrypt it |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2568 (event.snapshot->syncer_status.num_successful_commits > 0); | 2542 (event.snapshot->syncer_status.num_successful_commits > 0); |
2569 if (new_notification) { | 2543 if (new_notification) { |
2570 core_message_loop_->PostTask( | 2544 core_message_loop_->PostTask( |
2571 FROM_HERE, | 2545 FROM_HERE, |
2572 NewRunnableMethod( | 2546 NewRunnableMethod( |
2573 this, | 2547 this, |
2574 &SyncManager::SyncInternal::SendNotification)); | 2548 &SyncManager::SyncInternal::SendNotification)); |
2575 } | 2549 } |
2576 } | 2550 } |
2577 | 2551 |
2578 if (event.what_happened == SyncEngineEvent::SYNCER_THREAD_PAUSED) { | |
2579 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, | |
2580 OnPaused()); | |
2581 return; | |
2582 } | |
2583 | |
2584 if (event.what_happened == SyncEngineEvent::SYNCER_THREAD_RESUMED) { | |
2585 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, | |
2586 OnResumed()); | |
2587 return; | |
2588 } | |
2589 | |
2590 if (event.what_happened == SyncEngineEvent::STOP_SYNCING_PERMANENTLY) { | 2552 if (event.what_happened == SyncEngineEvent::STOP_SYNCING_PERMANENTLY) { |
2591 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, | 2553 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, |
2592 OnStopSyncingPermanently()); | 2554 OnStopSyncingPermanently()); |
2593 return; | 2555 return; |
2594 } | 2556 } |
2595 | 2557 |
2596 if (event.what_happened == SyncEngineEvent::CLEAR_SERVER_DATA_SUCCEEDED) { | 2558 if (event.what_happened == SyncEngineEvent::CLEAR_SERVER_DATA_SUCCEEDED) { |
2597 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, | 2559 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, |
2598 OnClearServerDataSucceeded()); | 2560 OnClearServerDataSucceeded()); |
2599 return; | 2561 return; |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2736 return_args.Append(result); | 2698 return_args.Append(result); |
2737 return browser_sync::JsArgList(return_args); | 2699 return browser_sync::JsArgList(return_args); |
2738 } | 2700 } |
2739 | 2701 |
2740 void SyncManager::SyncInternal::OnNotificationStateChange( | 2702 void SyncManager::SyncInternal::OnNotificationStateChange( |
2741 bool notifications_enabled) { | 2703 bool notifications_enabled) { |
2742 VLOG(1) << "P2P: Notifications enabled = " | 2704 VLOG(1) << "P2P: Notifications enabled = " |
2743 << (notifications_enabled ? "true" : "false"); | 2705 << (notifications_enabled ? "true" : "false"); |
2744 allstatus_.SetNotificationsEnabled(notifications_enabled); | 2706 allstatus_.SetNotificationsEnabled(notifications_enabled); |
2745 if (syncer_thread()) { | 2707 if (syncer_thread()) { |
2746 syncer_thread()->SetNotificationsEnabled(notifications_enabled); | 2708 syncer_thread()->set_notifications_enabled(notifications_enabled); |
2747 } | 2709 } |
2748 if (parent_router_) { | 2710 if (parent_router_) { |
2749 ListValue args; | 2711 ListValue args; |
2750 args.Append(Value::CreateBooleanValue(notifications_enabled)); | 2712 args.Append(Value::CreateBooleanValue(notifications_enabled)); |
2751 // TODO(akalin): Tidy up grammar in event names. | 2713 // TODO(akalin): Tidy up grammar in event names. |
2752 parent_router_->RouteJsEvent("onSyncNotificationStateChange", | 2714 parent_router_->RouteJsEvent("onSyncNotificationStateChange", |
2753 browser_sync::JsArgList(args), NULL); | 2715 browser_sync::JsArgList(args), NULL); |
2754 } | 2716 } |
2755 } | 2717 } |
2756 | 2718 |
2757 void SyncManager::SyncInternal::UpdateNotificationInfo( | 2719 void SyncManager::SyncInternal::UpdateNotificationInfo( |
2758 const syncable::ModelTypePayloadMap& type_payloads) { | 2720 const syncable::ModelTypePayloadMap& type_payloads) { |
2759 for (syncable::ModelTypePayloadMap::const_iterator it = type_payloads.begin(); | 2721 for (syncable::ModelTypePayloadMap::const_iterator it = type_payloads.begin(); |
2760 it != type_payloads.end(); ++it) { | 2722 it != type_payloads.end(); ++it) { |
2761 NotificationInfo* info = ¬ification_info_map_[it->first]; | 2723 NotificationInfo* info = ¬ification_info_map_[it->first]; |
2762 info->total_count++; | 2724 info->total_count++; |
2763 info->payload = it->second; | 2725 info->payload = it->second; |
2764 } | 2726 } |
2765 } | 2727 } |
2766 | 2728 |
2767 void SyncManager::SyncInternal::OnIncomingNotification( | 2729 void SyncManager::SyncInternal::OnIncomingNotification( |
2768 const syncable::ModelTypePayloadMap& type_payloads) { | 2730 const syncable::ModelTypePayloadMap& type_payloads) { |
2769 if (!type_payloads.empty()) { | 2731 if (!type_payloads.empty()) { |
2770 if (syncer_thread()) { | 2732 if (syncer_thread()) { |
2771 syncer_thread()->NudgeSyncerWithPayloads( | 2733 syncer_thread()->ScheduleNudgeWithPayloads( |
2772 kSyncerThreadDelayMsec, | 2734 TimeDelta::FromMilliseconds(kSyncerThreadDelayMsec), |
2773 SyncerThread::kNotification, | 2735 browser_sync::NUDGE_SOURCE_NOTIFICATION, |
2774 type_payloads, FROM_HERE); | 2736 type_payloads, FROM_HERE); |
2775 } | 2737 } |
2776 allstatus_.IncrementNotificationsReceived(); | 2738 allstatus_.IncrementNotificationsReceived(); |
2777 UpdateNotificationInfo(type_payloads); | 2739 UpdateNotificationInfo(type_payloads); |
2778 } else { | 2740 } else { |
2779 LOG(WARNING) << "Sync received notification without any type information."; | 2741 LOG(WARNING) << "Sync received notification without any type information."; |
2780 } | 2742 } |
2781 | 2743 |
2782 if (parent_router_) { | 2744 if (parent_router_) { |
2783 ListValue args; | 2745 ListValue args; |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2879 void SyncManager::TriggerOnIncomingNotificationForTest( | 2841 void SyncManager::TriggerOnIncomingNotificationForTest( |
2880 const syncable::ModelTypeBitSet& model_types) { | 2842 const syncable::ModelTypeBitSet& model_types) { |
2881 syncable::ModelTypePayloadMap model_types_with_payloads = | 2843 syncable::ModelTypePayloadMap model_types_with_payloads = |
2882 syncable::ModelTypePayloadMapFromBitSet(model_types, | 2844 syncable::ModelTypePayloadMapFromBitSet(model_types, |
2883 std::string()); | 2845 std::string()); |
2884 | 2846 |
2885 data_->OnIncomingNotification(model_types_with_payloads); | 2847 data_->OnIncomingNotification(model_types_with_payloads); |
2886 } | 2848 } |
2887 | 2849 |
2888 } // namespace sync_api | 2850 } // namespace sync_api |
OLD | NEW |