Chromium Code Reviews| 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> |
| (...skipping 1219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1230 | 1230 |
| 1231 // SyncNotifierObserver implementation. | 1231 // SyncNotifierObserver implementation. |
| 1232 virtual void OnNotificationStateChange( | 1232 virtual void OnNotificationStateChange( |
| 1233 bool notifications_enabled); | 1233 bool notifications_enabled); |
| 1234 | 1234 |
| 1235 virtual void OnIncomingNotification( | 1235 virtual void OnIncomingNotification( |
| 1236 const syncable::ModelTypePayloadMap& type_payloads); | 1236 const syncable::ModelTypePayloadMap& type_payloads); |
| 1237 | 1237 |
| 1238 virtual void StoreState(const std::string& cookie); | 1238 virtual void StoreState(const std::string& cookie); |
| 1239 | 1239 |
| 1240 bool HaveObservers(); | |
|
akalin
2011/06/08 22:39:38
make const
Nicolas Zea
2011/06/08 23:10:23
Done.
| |
| 1241 | |
| 1240 void AddObserver(SyncManager::Observer* observer); | 1242 void AddObserver(SyncManager::Observer* observer); |
| 1241 | 1243 |
| 1242 void RemoveObserver(SyncManager::Observer* observer); | 1244 void RemoveObserver(SyncManager::Observer* observer); |
| 1243 | 1245 |
| 1244 // Accessors for the private members. | 1246 // Accessors for the private members. |
| 1245 DirectoryManager* dir_manager() { return share_.dir_manager.get(); } | 1247 DirectoryManager* dir_manager() { return share_.dir_manager.get(); } |
| 1246 SyncAPIServerConnectionManager* connection_manager() { | 1248 SyncAPIServerConnectionManager* connection_manager() { |
| 1247 return connection_manager_.get(); | 1249 return connection_manager_.get(); |
| 1248 } | 1250 } |
| 1249 SyncerThread* syncer_thread() { return syncer_thread_.get(); } | 1251 SyncerThread* syncer_thread() { return syncer_thread_.get(); } |
| (...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1520 browser_sync::JsArgList FindNodesContainingString( | 1522 browser_sync::JsArgList FindNodesContainingString( |
| 1521 const browser_sync::JsArgList& args); | 1523 const browser_sync::JsArgList& args); |
| 1522 | 1524 |
| 1523 // We couple the DirectoryManager and username together in a UserShare member | 1525 // We couple the DirectoryManager and username together in a UserShare member |
| 1524 // so we can return a handle to share_ to clients of the API for use when | 1526 // so we can return a handle to share_ to clients of the API for use when |
| 1525 // constructing any transaction type. | 1527 // constructing any transaction type. |
| 1526 UserShare share_; | 1528 UserShare share_; |
| 1527 | 1529 |
| 1528 MessageLoop* core_message_loop_; | 1530 MessageLoop* core_message_loop_; |
| 1529 | 1531 |
| 1532 // We have to lock around every observers_ access because it can get accessed | |
| 1533 // from any thread and added to/removed from on the core thread. | |
| 1534 base::Lock observers_lock_; | |
|
akalin
2011/06/08 22:39:38
make mutable
Nicolas Zea
2011/06/08 23:10:23
Done.
| |
| 1530 ObserverList<SyncManager::Observer> observers_; | 1535 ObserverList<SyncManager::Observer> observers_; |
| 1531 | 1536 |
| 1532 browser_sync::JsEventRouter* parent_router_; | 1537 browser_sync::JsEventRouter* parent_router_; |
| 1533 | 1538 |
| 1534 // The ServerConnectionManager used to abstract communication between the | 1539 // The ServerConnectionManager used to abstract communication between the |
| 1535 // client (the Syncer) and the sync server. | 1540 // client (the Syncer) and the sync server. |
| 1536 scoped_ptr<SyncAPIServerConnectionManager> connection_manager_; | 1541 scoped_ptr<SyncAPIServerConnectionManager> connection_manager_; |
| 1537 | 1542 |
| 1538 // The thread that runs the Syncer. Needs to be explicitly Start()ed. | 1543 // The thread that runs the Syncer. Needs to be explicitly Start()ed. |
| 1539 scoped_ptr<SyncerThread> syncer_thread_; | 1544 scoped_ptr<SyncerThread> syncer_thread_; |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1581 // Map used to store the notification info to be displayed in about:sync page. | 1586 // Map used to store the notification info to be displayed in about:sync page. |
| 1582 NotificationInfoMap notification_info_map_; | 1587 NotificationInfoMap notification_info_map_; |
| 1583 | 1588 |
| 1584 browser_sync::JsDirectoryChangeListener js_directory_change_listener_; | 1589 browser_sync::JsDirectoryChangeListener js_directory_change_listener_; |
| 1585 | 1590 |
| 1586 JsMessageHandlerMap js_message_handlers_; | 1591 JsMessageHandlerMap js_message_handlers_; |
| 1587 }; | 1592 }; |
| 1588 const int SyncManager::SyncInternal::kDefaultNudgeDelayMilliseconds = 200; | 1593 const int SyncManager::SyncInternal::kDefaultNudgeDelayMilliseconds = 200; |
| 1589 const int SyncManager::SyncInternal::kPreferencesNudgeDelayMilliseconds = 2000; | 1594 const int SyncManager::SyncInternal::kPreferencesNudgeDelayMilliseconds = 2000; |
| 1590 | 1595 |
| 1596 // We have to read the current observer list while holding a lock because it | |
| 1597 // can be added/removed from another thread. We then notify the actual observers | |
| 1598 // while the lock is released. | |
|
akalin
2011/06/08 22:39:38
Add a TODO explaining the problem with notifying g
Nicolas Zea
2011/06/08 23:10:23
Done.
| |
| 1599 #define NOTIFY_SYNCMANAGER_OBSERVERS(function) \ | |
|
akalin
2011/06/08 22:39:38
I think it would be cleaner to define a utility fu
Nicolas Zea
2011/06/08 23:10:23
Done.
| |
| 1600 do { \ | |
| 1601 ObserverList<SyncManager::Observer> temp_observers; \ | |
| 1602 { \ | |
| 1603 base::AutoLock lock(observers_lock_); \ | |
| 1604 ObserverListBase<SyncManager::Observer>::Iterator it(observers_); \ | |
| 1605 SyncManager::Observer* obs; \ | |
| 1606 while ((obs = it.GetNext()) != NULL) \ | |
| 1607 temp_observers.AddObserver(obs); \ | |
| 1608 } \ | |
| 1609 FOR_EACH_OBSERVER(SyncManager::Observer, temp_observers, function); \ | |
| 1610 } while (0) | |
| 1611 | |
| 1591 SyncManager::Observer::~Observer() {} | 1612 SyncManager::Observer::~Observer() {} |
| 1592 | 1613 |
| 1593 SyncManager::SyncManager() { | 1614 SyncManager::SyncManager() { |
| 1594 data_ = new SyncInternal(this); | 1615 data_ = new SyncInternal(this); |
| 1595 } | 1616 } |
| 1596 | 1617 |
| 1597 bool SyncManager::Init(const FilePath& database_location, | 1618 bool SyncManager::Init(const FilePath& database_location, |
| 1598 const char* sync_server_and_path, | 1619 const char* sync_server_and_path, |
| 1599 int sync_server_port, | 1620 int sync_server_port, |
| 1600 bool use_ssl, | 1621 bool use_ssl, |
| (...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1801 | 1822 |
| 1802 ReadNode node(&trans); | 1823 ReadNode node(&trans); |
| 1803 if (!node.InitByTagLookup(kNigoriTag)) { | 1824 if (!node.InitByTagLookup(kNigoriTag)) { |
| 1804 NOTREACHED(); | 1825 NOTREACHED(); |
| 1805 return; | 1826 return; |
| 1806 } | 1827 } |
| 1807 | 1828 |
| 1808 nigori.CopyFrom(node.GetNigoriSpecifics()); | 1829 nigori.CopyFrom(node.GetNigoriSpecifics()); |
| 1809 Cryptographer::UpdateResult result = cryptographer->Update(nigori); | 1830 Cryptographer::UpdateResult result = cryptographer->Update(nigori); |
| 1810 if (result == Cryptographer::NEEDS_PASSPHRASE) { | 1831 if (result == Cryptographer::NEEDS_PASSPHRASE) { |
| 1811 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, | 1832 NOTIFY_SYNCMANAGER_OBSERVERS( |
| 1812 OnPassphraseRequired(sync_api::REASON_DECRYPTION)); | 1833 OnPassphraseRequired(sync_api::REASON_DECRYPTION)); |
| 1813 } | 1834 } |
| 1814 | 1835 |
| 1815 // Refresh list of encrypted datatypes. | 1836 // Refresh list of encrypted datatypes. |
| 1816 encrypted_types = GetEncryptedTypes(&trans); | 1837 encrypted_types = GetEncryptedTypes(&trans); |
| 1817 } | 1838 } |
| 1818 | 1839 |
| 1819 | 1840 |
| 1820 | 1841 |
| 1821 // Ensure any datatypes that need encryption are encrypted. | 1842 // Ensure any datatypes that need encryption are encrypted. |
| 1822 EncryptDataTypes(encrypted_types); | 1843 EncryptDataTypes(encrypted_types); |
| 1823 } | 1844 } |
| 1824 | 1845 |
| 1825 void SyncManager::SyncInternal::StartSyncingNormally() { | 1846 void SyncManager::SyncInternal::StartSyncingNormally() { |
| 1826 // Start the syncer thread. This won't actually | 1847 // Start the syncer thread. This won't actually |
| 1827 // result in any syncing until at least the | 1848 // result in any syncing until at least the |
| 1828 // DirectoryManager broadcasts the OPENED event, | 1849 // DirectoryManager broadcasts the OPENED event, |
| 1829 // and a valid server connection is detected. | 1850 // and a valid server connection is detected. |
| 1830 if (syncer_thread()) // NULL during certain unittests. | 1851 if (syncer_thread()) // NULL during certain unittests. |
| 1831 syncer_thread()->Start(SyncerThread::NORMAL_MODE, NULL); | 1852 syncer_thread()->Start(SyncerThread::NORMAL_MODE, NULL); |
| 1832 } | 1853 } |
| 1833 | 1854 |
| 1834 void SyncManager::SyncInternal::MarkAndNotifyInitializationComplete() { | 1855 void SyncManager::SyncInternal::MarkAndNotifyInitializationComplete() { |
| 1835 // There is only one real time we need this mutex. If we get an auth | 1856 // There is only one real time we need this mutex. If we get an auth |
| 1836 // success, and before the initial sync ends we get an auth failure. In this | 1857 // success, and before the initial sync ends we get an auth failure. In this |
| 1837 // case we'll be listening to both the AuthWatcher and Syncer, and it's a race | 1858 // case we'll be listening to both the AuthWatcher and Syncer, and it's a race |
| 1838 // between their respective threads to call MarkAndNotify. We need to make | 1859 // between their respective threads to call MarkAndNotify. We need to make |
| 1839 // sure the observer is notified once and only once. | 1860 // sure the observer is notified once and only once. |
| 1840 { | 1861 { |
| 1841 base::AutoLock lock(initialized_mutex_); | 1862 base::AutoLock lock(initialized_mutex_); |
| 1842 if (initialized_) | 1863 if (initialized_) |
| 1843 return; | 1864 return; |
| 1844 initialized_ = true; | 1865 initialized_ = true; |
| 1845 } | 1866 } |
| 1846 | 1867 |
| 1847 // Notify that initialization is complete. | 1868 // Notify that initialization is complete. |
| 1848 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, | 1869 NOTIFY_SYNCMANAGER_OBSERVERS(OnInitializationComplete()); |
| 1849 OnInitializationComplete()); | |
| 1850 } | 1870 } |
| 1851 | 1871 |
| 1852 void SyncManager::SyncInternal::SendNotification() { | 1872 void SyncManager::SyncInternal::SendNotification() { |
| 1853 DCHECK_EQ(MessageLoop::current(), core_message_loop_); | 1873 DCHECK_EQ(MessageLoop::current(), core_message_loop_); |
| 1854 if (!sync_notifier_) { | 1874 if (!sync_notifier_) { |
| 1855 VLOG(1) << "Not sending notification: sync_notifier_ is NULL"; | 1875 VLOG(1) << "Not sending notification: sync_notifier_ is NULL"; |
| 1856 return; | 1876 return; |
| 1857 } | 1877 } |
| 1858 sync_notifier_->SendNotification(); | 1878 sync_notifier_->SendNotification(); |
| 1859 } | 1879 } |
| 1860 | 1880 |
| 1861 bool SyncManager::SyncInternal::OpenDirectory() { | 1881 bool SyncManager::SyncInternal::OpenDirectory() { |
| 1862 DCHECK(!initialized()) << "Should only happen once"; | 1882 DCHECK(!initialized()) << "Should only happen once"; |
| 1863 | 1883 |
| 1864 bool share_opened = dir_manager()->Open(username_for_share()); | 1884 bool share_opened = dir_manager()->Open(username_for_share()); |
| 1865 DCHECK(share_opened); | 1885 DCHECK(share_opened); |
| 1866 if (!share_opened) { | 1886 if (!share_opened) { |
| 1867 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, | 1887 NOTIFY_SYNCMANAGER_OBSERVERS(OnStopSyncingPermanently()); |
| 1868 OnStopSyncingPermanently()); | |
| 1869 | 1888 |
| 1870 LOG(ERROR) << "Could not open share for:" << username_for_share(); | 1889 LOG(ERROR) << "Could not open share for:" << username_for_share(); |
| 1871 return false; | 1890 return false; |
| 1872 } | 1891 } |
| 1873 | 1892 |
| 1874 // Database has to be initialized for the guid to be available. | 1893 // Database has to be initialized for the guid to be available. |
| 1875 syncable::ScopedDirLookup lookup(dir_manager(), username_for_share()); | 1894 syncable::ScopedDirLookup lookup(dir_manager(), username_for_share()); |
| 1876 if (!lookup.good()) { | 1895 if (!lookup.good()) { |
| 1877 NOTREACHED(); | 1896 NOTREACHED(); |
| 1878 return false; | 1897 return false; |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1942 registrar_->GetModelSafeRoutingInfo(&routes); | 1961 registrar_->GetModelSafeRoutingInfo(&routes); |
| 1943 syncable::ModelTypeSet enabled_types; | 1962 syncable::ModelTypeSet enabled_types; |
| 1944 for (ModelSafeRoutingInfo::const_iterator it = routes.begin(); | 1963 for (ModelSafeRoutingInfo::const_iterator it = routes.begin(); |
| 1945 it != routes.end(); ++it) { | 1964 it != routes.end(); ++it) { |
| 1946 enabled_types.insert(it->first); | 1965 enabled_types.insert(it->first); |
| 1947 } | 1966 } |
| 1948 sync_notifier_->UpdateEnabledTypes(enabled_types); | 1967 sync_notifier_->UpdateEnabledTypes(enabled_types); |
| 1949 } | 1968 } |
| 1950 | 1969 |
| 1951 void SyncManager::SyncInternal::RaiseAuthNeededEvent() { | 1970 void SyncManager::SyncInternal::RaiseAuthNeededEvent() { |
| 1952 FOR_EACH_OBSERVER( | 1971 NOTIFY_SYNCMANAGER_OBSERVERS( |
| 1953 SyncManager::Observer, observers_, | |
| 1954 OnAuthError(AuthError(AuthError::INVALID_GAIA_CREDENTIALS))); | 1972 OnAuthError(AuthError(AuthError::INVALID_GAIA_CREDENTIALS))); |
| 1955 } | 1973 } |
| 1956 | 1974 |
| 1957 void SyncManager::SyncInternal::SetUsingExplicitPassphrasePrefForMigration( | 1975 void SyncManager::SyncInternal::SetUsingExplicitPassphrasePrefForMigration( |
| 1958 WriteTransaction* const trans) { | 1976 WriteTransaction* const trans) { |
| 1959 WriteNode node(trans); | 1977 WriteNode node(trans); |
| 1960 if (!node.InitByTagLookup(kNigoriTag)) { | 1978 if (!node.InitByTagLookup(kNigoriTag)) { |
| 1961 // TODO(albertb): Plumb an UnrecoverableError all the way back to the PSS. | 1979 // TODO(albertb): Plumb an UnrecoverableError all the way back to the PSS. |
| 1962 NOTREACHED(); | 1980 NOTREACHED(); |
| 1963 return; | 1981 return; |
| 1964 } | 1982 } |
| 1965 sync_pb::NigoriSpecifics specifics(node.GetNigoriSpecifics()); | 1983 sync_pb::NigoriSpecifics specifics(node.GetNigoriSpecifics()); |
| 1966 specifics.set_using_explicit_passphrase(true); | 1984 specifics.set_using_explicit_passphrase(true); |
| 1967 node.SetNigoriSpecifics(specifics); | 1985 node.SetNigoriSpecifics(specifics); |
| 1968 } | 1986 } |
| 1969 | 1987 |
| 1970 void SyncManager::SyncInternal::SetPassphrase( | 1988 void SyncManager::SyncInternal::SetPassphrase( |
| 1971 const std::string& passphrase, bool is_explicit) { | 1989 const std::string& passphrase, bool is_explicit) { |
| 1972 // We do not accept empty passphrases. | 1990 // We do not accept empty passphrases. |
| 1973 if (passphrase.empty()) { | 1991 if (passphrase.empty()) { |
| 1974 VLOG(1) << "Rejecting empty passphrase."; | 1992 VLOG(1) << "Rejecting empty passphrase."; |
| 1975 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, | 1993 NOTIFY_SYNCMANAGER_OBSERVERS( |
| 1976 OnPassphraseRequired(sync_api::REASON_SET_PASSPHRASE_FAILED)); | 1994 OnPassphraseRequired(sync_api::REASON_SET_PASSPHRASE_FAILED)); |
| 1977 return; | 1995 return; |
| 1978 } | 1996 } |
| 1979 | 1997 |
| 1980 // All accesses to the cryptographer are protected by a transaction. | 1998 // All accesses to the cryptographer are protected by a transaction. |
| 1981 WriteTransaction trans(GetUserShare()); | 1999 WriteTransaction trans(GetUserShare()); |
| 1982 Cryptographer* cryptographer = trans.GetCryptographer(); | 2000 Cryptographer* cryptographer = trans.GetCryptographer(); |
| 1983 KeyParams params = {"localhost", "dummy", passphrase}; | 2001 KeyParams params = {"localhost", "dummy", passphrase}; |
| 1984 | 2002 |
| 1985 if (cryptographer->has_pending_keys()) { | 2003 if (cryptographer->has_pending_keys()) { |
| 1986 if (!cryptographer->DecryptPendingKeys(params)) { | 2004 if (!cryptographer->DecryptPendingKeys(params)) { |
| 1987 VLOG(1) << "Passphrase failed to decrypt pending keys."; | 2005 VLOG(1) << "Passphrase failed to decrypt pending keys."; |
| 1988 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, | 2006 NOTIFY_SYNCMANAGER_OBSERVERS( |
| 1989 OnPassphraseRequired(sync_api::REASON_SET_PASSPHRASE_FAILED)); | 2007 OnPassphraseRequired(sync_api::REASON_SET_PASSPHRASE_FAILED)); |
| 1990 return; | 2008 return; |
| 1991 } | 2009 } |
| 1992 | 2010 |
| 1993 // TODO(tim): If this is the first time the user has entered a passphrase | 2011 // TODO(tim): If this is the first time the user has entered a passphrase |
| 1994 // since the protocol changed to store passphrase preferences in the cloud, | 2012 // since the protocol changed to store passphrase preferences in the cloud, |
| 1995 // make sure we update this preference. See bug 62103. | 2013 // make sure we update this preference. See bug 62103. |
| 1996 // TODO(jhawkins): Verify that this logic may be removed now that the | 2014 // TODO(jhawkins): Verify that this logic may be removed now that the |
| 1997 // migration is no longer supported. | 2015 // migration is no longer supported. |
| 1998 if (is_explicit) | 2016 if (is_explicit) |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 2024 sync_pb::NigoriSpecifics specifics(node.GetNigoriSpecifics()); | 2042 sync_pb::NigoriSpecifics specifics(node.GetNigoriSpecifics()); |
| 2025 specifics.clear_encrypted(); | 2043 specifics.clear_encrypted(); |
| 2026 cryptographer->GetKeys(specifics.mutable_encrypted()); | 2044 cryptographer->GetKeys(specifics.mutable_encrypted()); |
| 2027 specifics.set_using_explicit_passphrase(is_explicit); | 2045 specifics.set_using_explicit_passphrase(is_explicit); |
| 2028 node.SetNigoriSpecifics(specifics); | 2046 node.SetNigoriSpecifics(specifics); |
| 2029 ReEncryptEverything(&trans); | 2047 ReEncryptEverything(&trans); |
| 2030 } | 2048 } |
| 2031 | 2049 |
| 2032 std::string bootstrap_token; | 2050 std::string bootstrap_token; |
| 2033 cryptographer->GetBootstrapToken(&bootstrap_token); | 2051 cryptographer->GetBootstrapToken(&bootstrap_token); |
| 2034 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, | 2052 NOTIFY_SYNCMANAGER_OBSERVERS(OnPassphraseAccepted(bootstrap_token)); |
| 2035 OnPassphraseAccepted(bootstrap_token)); | |
| 2036 } | 2053 } |
| 2037 | 2054 |
| 2038 bool SyncManager::SyncInternal::IsUsingExplicitPassphrase() { | 2055 bool SyncManager::SyncInternal::IsUsingExplicitPassphrase() { |
| 2039 ReadTransaction trans(&share_); | 2056 ReadTransaction trans(&share_); |
| 2040 ReadNode node(&trans); | 2057 ReadNode node(&trans); |
| 2041 if (!node.InitByTagLookup(kNigoriTag)) { | 2058 if (!node.InitByTagLookup(kNigoriTag)) { |
| 2042 // TODO(albertb): Plumb an UnrecoverableError all the way back to the PSS. | 2059 // TODO(albertb): Plumb an UnrecoverableError all the way back to the PSS. |
| 2043 NOTREACHED(); | 2060 NOTREACHED(); |
| 2044 return false; | 2061 return false; |
| 2045 } | 2062 } |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2143 WriteNode child(trans); | 2160 WriteNode child(trans); |
| 2144 if (!child.InitByIdLookup(child_id)) { | 2161 if (!child.InitByIdLookup(child_id)) { |
| 2145 NOTREACHED(); | 2162 NOTREACHED(); |
| 2146 return; | 2163 return; |
| 2147 } | 2164 } |
| 2148 child.SetPasswordSpecifics(child.GetPasswordSpecifics()); | 2165 child.SetPasswordSpecifics(child.GetPasswordSpecifics()); |
| 2149 child_id = child.GetSuccessorId(); | 2166 child_id = child.GetSuccessorId(); |
| 2150 } | 2167 } |
| 2151 } | 2168 } |
| 2152 | 2169 |
| 2153 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, | 2170 NOTIFY_SYNCMANAGER_OBSERVERS(OnEncryptionComplete(encrypted_types)); |
| 2154 OnEncryptionComplete(encrypted_types)); | |
| 2155 } | 2171 } |
| 2156 | 2172 |
| 2157 SyncManager::~SyncManager() { | 2173 SyncManager::~SyncManager() { |
| 2158 delete data_; | 2174 delete data_; |
| 2159 } | 2175 } |
| 2160 | 2176 |
| 2161 void SyncManager::AddObserver(Observer* observer) { | 2177 void SyncManager::AddObserver(Observer* observer) { |
| 2162 data_->AddObserver(observer); | 2178 data_->AddObserver(observer); |
| 2163 } | 2179 } |
| 2164 | 2180 |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2237 // TODO(akalin): CheckServerReachable() can block, which may cause | 2253 // TODO(akalin): CheckServerReachable() can block, which may cause |
| 2238 // jank if we try to shut down sync. Fix this. | 2254 // jank if we try to shut down sync. Fix this. |
| 2239 connection_manager()->CheckServerReachable(); | 2255 connection_manager()->CheckServerReachable(); |
| 2240 } | 2256 } |
| 2241 | 2257 |
| 2242 void SyncManager::SyncInternal::OnServerConnectionEvent( | 2258 void SyncManager::SyncInternal::OnServerConnectionEvent( |
| 2243 const ServerConnectionEvent& event) { | 2259 const ServerConnectionEvent& event) { |
| 2244 allstatus_.HandleServerConnectionEvent(event); | 2260 allstatus_.HandleServerConnectionEvent(event); |
| 2245 if (event.connection_code == | 2261 if (event.connection_code == |
| 2246 browser_sync::HttpResponse::SERVER_CONNECTION_OK) { | 2262 browser_sync::HttpResponse::SERVER_CONNECTION_OK) { |
| 2247 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, | 2263 NOTIFY_SYNCMANAGER_OBSERVERS(OnAuthError(AuthError::None())); |
| 2248 OnAuthError(AuthError::None())); | |
| 2249 } | 2264 } |
| 2250 | 2265 |
| 2251 if (event.connection_code == browser_sync::HttpResponse::SYNC_AUTH_ERROR) { | 2266 if (event.connection_code == browser_sync::HttpResponse::SYNC_AUTH_ERROR) { |
| 2252 FOR_EACH_OBSERVER( | 2267 NOTIFY_SYNCMANAGER_OBSERVERS( |
| 2253 SyncManager::Observer, observers_, | |
| 2254 OnAuthError(AuthError(AuthError::INVALID_GAIA_CREDENTIALS))); | 2268 OnAuthError(AuthError(AuthError::INVALID_GAIA_CREDENTIALS))); |
| 2255 } | 2269 } |
| 2256 } | 2270 } |
| 2257 | 2271 |
| 2258 void SyncManager::SyncInternal::HandleTransactionCompleteChangeEvent( | 2272 void SyncManager::SyncInternal::HandleTransactionCompleteChangeEvent( |
| 2259 const syncable::ModelTypeBitSet& models_with_changes) { | 2273 const syncable::ModelTypeBitSet& models_with_changes) { |
| 2260 // This notification happens immediately after the transaction mutex is | 2274 // This notification happens immediately after the transaction mutex is |
| 2261 // released. This allows work to be performed without blocking other threads | 2275 // released. This allows work to be performed without blocking other threads |
| 2262 // from acquiring a transaction. | 2276 // from acquiring a transaction. |
| 2263 if (observers_.size() <= 0) | 2277 if (!HaveObservers()) |
| 2264 return; | 2278 return; |
| 2265 | 2279 |
| 2266 // Call commit. | 2280 // Call commit. |
| 2267 for (int i = 0; i < syncable::MODEL_TYPE_COUNT; ++i) { | 2281 for (int i = 0; i < syncable::MODEL_TYPE_COUNT; ++i) { |
| 2268 if (models_with_changes.test(i)) { | 2282 if (models_with_changes.test(i)) { |
| 2269 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, | 2283 NOTIFY_SYNCMANAGER_OBSERVERS( |
| 2270 OnChangesComplete(syncable::ModelTypeFromInt(i))); | 2284 OnChangesComplete(syncable::ModelTypeFromInt(i))); |
| 2271 } | 2285 } |
| 2272 } | 2286 } |
| 2273 } | 2287 } |
| 2274 | 2288 |
| 2275 ModelTypeBitSet SyncManager::SyncInternal::HandleTransactionEndingChangeEvent( | 2289 ModelTypeBitSet SyncManager::SyncInternal::HandleTransactionEndingChangeEvent( |
| 2276 syncable::BaseTransaction* trans) { | 2290 syncable::BaseTransaction* trans) { |
| 2277 // This notification happens immediately before a syncable WriteTransaction | 2291 // This notification happens immediately before a syncable WriteTransaction |
| 2278 // falls out of scope. It happens while the channel mutex is still held, | 2292 // falls out of scope. It happens while the channel mutex is still held, |
| 2279 // and while the transaction mutex is held, so it cannot be re-entrant. | 2293 // and while the transaction mutex is held, so it cannot be re-entrant. |
| 2280 if (observers_.size() <= 0 || ChangeBuffersAreEmpty()) | 2294 if (!HaveObservers() || ChangeBuffersAreEmpty()) |
| 2281 return ModelTypeBitSet(); | 2295 return ModelTypeBitSet(); |
| 2282 | 2296 |
| 2283 // This will continue the WriteTransaction using a read only wrapper. | 2297 // This will continue the WriteTransaction using a read only wrapper. |
| 2284 // This is the last chance for read to occur in the WriteTransaction | 2298 // This is the last chance for read to occur in the WriteTransaction |
| 2285 // that's closing. This special ReadTransaction will not close the | 2299 // that's closing. This special ReadTransaction will not close the |
| 2286 // underlying transaction. | 2300 // underlying transaction. |
| 2287 ReadTransaction read_trans(GetUserShare(), trans); | 2301 ReadTransaction read_trans(GetUserShare(), trans); |
| 2288 | 2302 |
| 2289 syncable::ModelTypeBitSet models_with_changes; | 2303 syncable::ModelTypeBitSet models_with_changes; |
| 2290 for (int i = 0; i < syncable::MODEL_TYPE_COUNT; ++i) { | 2304 for (int i = 0; i < syncable::MODEL_TYPE_COUNT; ++i) { |
| 2291 if (change_buffers_[i].IsEmpty()) | 2305 if (change_buffers_[i].IsEmpty()) |
| 2292 continue; | 2306 continue; |
| 2293 | 2307 |
| 2294 vector<ChangeRecord> ordered_changes; | 2308 vector<ChangeRecord> ordered_changes; |
| 2295 change_buffers_[i].GetAllChangesInTreeOrder(&read_trans, &ordered_changes); | 2309 change_buffers_[i].GetAllChangesInTreeOrder(&read_trans, &ordered_changes); |
| 2296 if (!ordered_changes.empty()) { | 2310 if (!ordered_changes.empty()) { |
| 2297 FOR_EACH_OBSERVER( | 2311 NOTIFY_SYNCMANAGER_OBSERVERS( |
| 2298 SyncManager::Observer, observers_, | |
| 2299 OnChangesApplied(syncable::ModelTypeFromInt(i), &read_trans, | 2312 OnChangesApplied(syncable::ModelTypeFromInt(i), &read_trans, |
| 2300 &ordered_changes[0], ordered_changes.size())); | 2313 &ordered_changes[0], ordered_changes.size())); |
| 2301 models_with_changes.set(i, true); | 2314 models_with_changes.set(i, true); |
| 2302 } | 2315 } |
| 2303 change_buffers_[i].Clear(); | 2316 change_buffers_[i].Clear(); |
| 2304 } | 2317 } |
| 2305 return models_with_changes; | 2318 return models_with_changes; |
| 2306 } | 2319 } |
| 2307 | 2320 |
| 2308 void SyncManager::SyncInternal::HandleCalculateChangesChangeEventFromSyncApi( | 2321 void SyncManager::SyncInternal::HandleCalculateChangesChangeEventFromSyncApi( |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2437 void SyncManager::SyncInternal::RequestNudgeWithDataTypes( | 2450 void SyncManager::SyncInternal::RequestNudgeWithDataTypes( |
| 2438 const TimeDelta& delay, | 2451 const TimeDelta& delay, |
| 2439 browser_sync::NudgeSource source, const ModelTypeBitSet& types, | 2452 browser_sync::NudgeSource source, const ModelTypeBitSet& types, |
| 2440 const tracked_objects::Location& nudge_location) { | 2453 const tracked_objects::Location& nudge_location) { |
| 2441 if (syncer_thread()) | 2454 if (syncer_thread()) |
| 2442 syncer_thread()->ScheduleNudge(delay, source, types, nudge_location); | 2455 syncer_thread()->ScheduleNudge(delay, source, types, nudge_location); |
| 2443 } | 2456 } |
| 2444 | 2457 |
| 2445 void SyncManager::SyncInternal::OnSyncEngineEvent( | 2458 void SyncManager::SyncInternal::OnSyncEngineEvent( |
| 2446 const SyncEngineEvent& event) { | 2459 const SyncEngineEvent& event) { |
| 2447 if (observers_.size() <= 0) { | 2460 if (!HaveObservers()) { |
| 2448 VLOG(0) << "OnSyncEngineEvent returning because observers_.size() is zero"; | 2461 VLOG(0) << "OnSyncEngineEvent returning because observers_.size() is zero"; |
| 2449 return; | 2462 return; |
| 2450 } | 2463 } |
| 2451 | 2464 |
| 2452 // Only send an event if this is due to a cycle ending and this cycle | 2465 // Only send an event if this is due to a cycle ending and this cycle |
| 2453 // concludes a canonical "sync" process; that is, based on what is known | 2466 // concludes a canonical "sync" process; that is, based on what is known |
| 2454 // locally we are "all happy" and up-to-date. There may be new changes on | 2467 // locally we are "all happy" and up-to-date. There may be new changes on |
| 2455 // the server, but we'll get them on a subsequent sync. | 2468 // the server, but we'll get them on a subsequent sync. |
| 2456 // | 2469 // |
| 2457 // Notifications are sent at the end of every sync cycle, regardless of | 2470 // Notifications are sent at the end of every sync cycle, regardless of |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 2485 if (!nigori.encrypted().blob().empty()) { | 2498 if (!nigori.encrypted().blob().empty()) { |
| 2486 DCHECK(!cryptographer->CanDecrypt(nigori.encrypted())); | 2499 DCHECK(!cryptographer->CanDecrypt(nigori.encrypted())); |
| 2487 cryptographer->SetPendingKeys(nigori.encrypted()); | 2500 cryptographer->SetPendingKeys(nigori.encrypted()); |
| 2488 } | 2501 } |
| 2489 } | 2502 } |
| 2490 | 2503 |
| 2491 // If we've completed a sync cycle and the cryptographer isn't ready | 2504 // If we've completed a sync cycle and the cryptographer isn't ready |
| 2492 // yet, prompt the user for a passphrase. | 2505 // yet, prompt the user for a passphrase. |
| 2493 if (cryptographer->has_pending_keys()) { | 2506 if (cryptographer->has_pending_keys()) { |
| 2494 VLOG(1) << "OnPassPhraseRequired Sent"; | 2507 VLOG(1) << "OnPassPhraseRequired Sent"; |
| 2495 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, | 2508 NOTIFY_SYNCMANAGER_OBSERVERS( |
| 2496 OnPassphraseRequired(sync_api::REASON_DECRYPTION)); | 2509 OnPassphraseRequired(sync_api::REASON_DECRYPTION)); |
| 2497 } else if (!cryptographer->is_ready()) { | 2510 } else if (!cryptographer->is_ready()) { |
| 2498 VLOG(1) << "OnPassphraseRequired sent because cryptographer is not " | 2511 VLOG(1) << "OnPassphraseRequired sent because cryptographer is not " |
| 2499 << "ready"; | 2512 << "ready"; |
| 2500 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, | 2513 NOTIFY_SYNCMANAGER_OBSERVERS( |
| 2501 OnPassphraseRequired(sync_api::REASON_ENCRYPTION)); | 2514 OnPassphraseRequired(sync_api::REASON_ENCRYPTION)); |
| 2502 } | 2515 } |
| 2503 // If everything is in order(we have the passphrase) then there is no | 2516 // If everything is in order(we have the passphrase) then there is no |
| 2504 // need to inform the listeners. They will just wait for sync | 2517 // need to inform the listeners. They will just wait for sync |
| 2505 // completion event and if no errors have been raised it means | 2518 // completion event and if no errors have been raised it means |
| 2506 // encryption was succesful. | 2519 // encryption was succesful. |
| 2507 } | 2520 } |
| 2508 } | 2521 } |
| 2509 | 2522 |
| 2510 if (!initialized()) { | 2523 if (!initialized()) { |
| 2511 VLOG(0) << "OnSyncCycleCompleted not sent because sync api is not " | 2524 VLOG(0) << "OnSyncCycleCompleted not sent because sync api is not " |
| 2512 << "initialized"; | 2525 << "initialized"; |
| 2513 return; | 2526 return; |
| 2514 } | 2527 } |
| 2515 | 2528 |
| 2516 if (!event.snapshot->has_more_to_sync) { | 2529 if (!event.snapshot->has_more_to_sync) { |
| 2517 VLOG(1) << "OnSyncCycleCompleted sent"; | 2530 VLOG(1) << "OnSyncCycleCompleted sent"; |
| 2518 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, | 2531 NOTIFY_SYNCMANAGER_OBSERVERS(OnSyncCycleCompleted(event.snapshot)); |
| 2519 OnSyncCycleCompleted(event.snapshot)); | |
| 2520 } | 2532 } |
| 2521 | 2533 |
| 2522 // This is here for tests, which are still using p2p notifications. | 2534 // This is here for tests, which are still using p2p notifications. |
| 2523 // SendNotification does not do anything if we are using server based | 2535 // SendNotification does not do anything if we are using server based |
| 2524 // notifications. | 2536 // notifications. |
| 2525 // TODO(chron): Consider changing this back to track has_more_to_sync | 2537 // TODO(chron): Consider changing this back to track has_more_to_sync |
| 2526 // only notify peers if a successful commit has occurred. | 2538 // only notify peers if a successful commit has occurred. |
| 2527 bool is_notifiable_commit = | 2539 bool is_notifiable_commit = |
| 2528 (event.snapshot->syncer_status.num_successful_commits > 0); | 2540 (event.snapshot->syncer_status.num_successful_commits > 0); |
| 2529 if (is_notifiable_commit) { | 2541 if (is_notifiable_commit) { |
| 2530 allstatus_.IncrementNotifiableCommits(); | 2542 allstatus_.IncrementNotifiableCommits(); |
| 2531 core_message_loop_->PostTask( | 2543 core_message_loop_->PostTask( |
| 2532 FROM_HERE, | 2544 FROM_HERE, |
| 2533 NewRunnableMethod( | 2545 NewRunnableMethod( |
| 2534 this, | 2546 this, |
| 2535 &SyncManager::SyncInternal::SendNotification)); | 2547 &SyncManager::SyncInternal::SendNotification)); |
| 2536 } | 2548 } |
| 2537 } | 2549 } |
| 2538 | 2550 |
| 2539 if (event.what_happened == SyncEngineEvent::STOP_SYNCING_PERMANENTLY) { | 2551 if (event.what_happened == SyncEngineEvent::STOP_SYNCING_PERMANENTLY) { |
| 2540 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, | 2552 NOTIFY_SYNCMANAGER_OBSERVERS(OnStopSyncingPermanently()); |
| 2541 OnStopSyncingPermanently()); | |
| 2542 return; | 2553 return; |
| 2543 } | 2554 } |
| 2544 | 2555 |
| 2545 if (event.what_happened == SyncEngineEvent::CLEAR_SERVER_DATA_SUCCEEDED) { | 2556 if (event.what_happened == SyncEngineEvent::CLEAR_SERVER_DATA_SUCCEEDED) { |
| 2546 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, | 2557 NOTIFY_SYNCMANAGER_OBSERVERS(OnClearServerDataSucceeded()); |
| 2547 OnClearServerDataSucceeded()); | |
| 2548 return; | 2558 return; |
| 2549 } | 2559 } |
| 2550 | 2560 |
| 2551 if (event.what_happened == SyncEngineEvent::CLEAR_SERVER_DATA_FAILED) { | 2561 if (event.what_happened == SyncEngineEvent::CLEAR_SERVER_DATA_FAILED) { |
| 2552 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, | 2562 NOTIFY_SYNCMANAGER_OBSERVERS(OnClearServerDataFailed()); |
| 2553 OnClearServerDataFailed()); | |
| 2554 return; | 2563 return; |
| 2555 } | 2564 } |
| 2556 | 2565 |
| 2557 if (event.what_happened == SyncEngineEvent::UPDATED_TOKEN) { | 2566 if (event.what_happened == SyncEngineEvent::UPDATED_TOKEN) { |
| 2558 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, | 2567 NOTIFY_SYNCMANAGER_OBSERVERS(OnUpdatedToken(event.updated_token)); |
| 2559 OnUpdatedToken(event.updated_token)); | |
| 2560 return; | 2568 return; |
| 2561 } | 2569 } |
| 2562 } | 2570 } |
| 2563 | 2571 |
| 2564 void SyncManager::SyncInternal::SetParentJsEventRouter( | 2572 void SyncManager::SyncInternal::SetParentJsEventRouter( |
| 2565 browser_sync::JsEventRouter* router) { | 2573 browser_sync::JsEventRouter* router) { |
| 2566 DCHECK(router); | 2574 DCHECK(router); |
| 2567 parent_router_ = router; | 2575 parent_router_ = router; |
| 2568 | 2576 |
| 2569 // We might be called before OpenDirectory() or after shutdown. | 2577 // We might be called before OpenDirectory() or after shutdown. |
| (...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2853 } | 2861 } |
| 2854 if (VLOG_IS_ON(1)) { | 2862 if (VLOG_IS_ON(1)) { |
| 2855 std::string encoded_state; | 2863 std::string encoded_state; |
| 2856 base::Base64Encode(state, &encoded_state); | 2864 base::Base64Encode(state, &encoded_state); |
| 2857 VLOG(1) << "Writing notification state: " << encoded_state; | 2865 VLOG(1) << "Writing notification state: " << encoded_state; |
| 2858 } | 2866 } |
| 2859 lookup->SetNotificationState(state); | 2867 lookup->SetNotificationState(state); |
| 2860 lookup->SaveChanges(); | 2868 lookup->SaveChanges(); |
| 2861 } | 2869 } |
| 2862 | 2870 |
| 2871 bool SyncManager::SyncInternal::HaveObservers() { | |
| 2872 base::AutoLock lock(observers_lock_); | |
| 2873 return observers_.size() > 0; | |
| 2874 } | |
| 2875 | |
| 2863 void SyncManager::SyncInternal::AddObserver( | 2876 void SyncManager::SyncInternal::AddObserver( |
| 2864 SyncManager::Observer* observer) { | 2877 SyncManager::Observer* observer) { |
| 2878 base::AutoLock lock(observers_lock_); | |
| 2865 observers_.AddObserver(observer); | 2879 observers_.AddObserver(observer); |
| 2866 } | 2880 } |
| 2867 | 2881 |
| 2868 void SyncManager::SyncInternal::RemoveObserver( | 2882 void SyncManager::SyncInternal::RemoveObserver( |
| 2869 SyncManager::Observer* observer) { | 2883 SyncManager::Observer* observer) { |
| 2884 base::AutoLock lock(observers_lock_); | |
| 2870 observers_.RemoveObserver(observer); | 2885 observers_.RemoveObserver(observer); |
| 2871 } | 2886 } |
| 2872 | 2887 |
| 2873 SyncManager::Status::Summary SyncManager::GetStatusSummary() const { | 2888 SyncManager::Status::Summary SyncManager::GetStatusSummary() const { |
| 2874 return data_->GetStatus().summary; | 2889 return data_->GetStatus().summary; |
| 2875 } | 2890 } |
| 2876 | 2891 |
| 2877 SyncManager::Status SyncManager::GetDetailedStatus() const { | 2892 SyncManager::Status SyncManager::GetDetailedStatus() const { |
| 2878 return data_->GetStatus(); | 2893 return data_->GetStatus(); |
| 2879 } | 2894 } |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2950 void SyncManager::TriggerOnIncomingNotificationForTest( | 2965 void SyncManager::TriggerOnIncomingNotificationForTest( |
| 2951 const syncable::ModelTypeBitSet& model_types) { | 2966 const syncable::ModelTypeBitSet& model_types) { |
| 2952 syncable::ModelTypePayloadMap model_types_with_payloads = | 2967 syncable::ModelTypePayloadMap model_types_with_payloads = |
| 2953 syncable::ModelTypePayloadMapFromBitSet(model_types, | 2968 syncable::ModelTypePayloadMapFromBitSet(model_types, |
| 2954 std::string()); | 2969 std::string()); |
| 2955 | 2970 |
| 2956 data_->OnIncomingNotification(model_types_with_payloads); | 2971 data_->OnIncomingNotification(model_types_with_payloads); |
| 2957 } | 2972 } |
| 2958 | 2973 |
| 2959 } // namespace sync_api | 2974 } // namespace sync_api |
| OLD | NEW |