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 #ifndef CHROME_BROWSER_SYNC_INTERNAL_API_SYNC_MANAGER_H_ | 5 #ifndef CHROME_BROWSER_SYNC_INTERNAL_API_SYNC_MANAGER_H_ |
| 6 #define CHROME_BROWSER_SYNC_INTERNAL_API_SYNC_MANAGER_H_ | 6 #define CHROME_BROWSER_SYNC_INTERNAL_API_SYNC_MANAGER_H_ |
| 7 | 7 |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| 11 #include "base/basictypes.h" | 11 #include "base/basictypes.h" |
| 12 #include "base/callback_old.h" | 12 #include "base/callback_old.h" |
| 13 #include "base/threading/thread_checker.h" | |
| 13 #include "chrome/browser/sync/internal_api/change_record.h" | 14 #include "chrome/browser/sync/internal_api/change_record.h" |
| 14 #include "chrome/browser/sync/internal_api/configure_reason.h" | 15 #include "chrome/browser/sync/internal_api/configure_reason.h" |
| 15 #include "chrome/browser/sync/protocol/sync_protocol_error.h" | 16 #include "chrome/browser/sync/protocol/sync_protocol_error.h" |
| 16 #include "chrome/browser/sync/syncable/model_type.h" | 17 #include "chrome/browser/sync/syncable/model_type.h" |
| 17 #include "chrome/browser/sync/util/weak_handle.h" | 18 #include "chrome/browser/sync/util/weak_handle.h" |
| 18 #include "chrome/common/net/gaia/google_service_auth_error.h" | 19 #include "chrome/common/net/gaia/google_service_auth_error.h" |
| 19 | 20 |
| 20 class FilePath; | 21 class FilePath; |
| 21 | 22 |
| 22 namespace base { | 23 namespace base { |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 58 // decryption with the cached passphrase | 59 // decryption with the cached passphrase |
| 59 // was unsuccessful. | 60 // was unsuccessful. |
| 60 }; | 61 }; |
| 61 | 62 |
| 62 // Contains everything needed to talk to and identify a user account. | 63 // Contains everything needed to talk to and identify a user account. |
| 63 struct SyncCredentials { | 64 struct SyncCredentials { |
| 64 std::string email; | 65 std::string email; |
| 65 std::string sync_token; | 66 std::string sync_token; |
| 66 }; | 67 }; |
| 67 | 68 |
| 68 // SyncManager encapsulates syncable::DirectoryManager and serves as the parent | 69 // SyncManager encapsulates syncable::DirectoryManager and serves as |
| 69 // of all other objects in the sync API. SyncManager is thread-safe. If | 70 // the parent of all other objects in the sync API. If multiple |
| 70 // multiple threads interact with the same local sync repository (i.e. the | 71 // threads interact with the same local sync repository (i.e. the same |
| 71 // same sqlite database), they should share a single SyncManager instance. The | 72 // sqlite database), they should share a single SyncManager instance. |
| 72 // caller should typically create one SyncManager for the lifetime of a user | 73 // The caller should typically create one SyncManager for the lifetime |
| 73 // session. | 74 // of a user session. |
| 75 // | |
| 76 // Unless stated otherwise, all methods of SyncManager should be | |
| 77 // called on the same thread. | |
| 74 class SyncManager { | 78 class SyncManager { |
| 75 public: | 79 public: |
| 76 // SyncInternal contains the implementation of SyncManager, while abstracting | 80 // SyncInternal contains the implementation of SyncManager, while abstracting |
| 77 // internal types from clients of the interface. | 81 // internal types from clients of the interface. |
| 78 class SyncInternal; | 82 class SyncInternal; |
| 79 | 83 |
| 80 // Status encapsulates detailed state about the internals of the SyncManager. | 84 // Status encapsulates detailed state about the internals of the SyncManager. |
| 81 struct Status { | 85 struct Status { |
| 82 // Summary is a distilled set of important information that the end-user may | 86 // Summary is a distilled set of important information that the end-user may |
| 83 // wish to be informed about (through UI, for example). Note that if a | 87 // wish to be informed about (through UI, for example). Note that if a |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 156 // Count of useless and useful syncs we perform. | 160 // Count of useless and useful syncs we perform. |
| 157 int useless_sync_cycles; | 161 int useless_sync_cycles; |
| 158 int useful_sync_cycles; | 162 int useful_sync_cycles; |
| 159 | 163 |
| 160 // Encryption related. | 164 // Encryption related. |
| 161 syncable::ModelTypeSet encrypted_types; | 165 syncable::ModelTypeSet encrypted_types; |
| 162 bool cryptographer_ready; | 166 bool cryptographer_ready; |
| 163 bool crypto_has_pending_keys; | 167 bool crypto_has_pending_keys; |
| 164 }; | 168 }; |
| 165 | 169 |
| 166 // An interface the embedding application implements to receive notifications | 170 // An interface the embedding application implements to be notified |
| 167 // from the SyncManager. Register an observer via SyncManager::AddObserver. | 171 // on change events. Note that these methods may be called on *any* |
| 168 // This observer is an event driven model as the events may be raised from | 172 // thread. |
| 169 // different internal threads, and simply providing an "OnStatusChanged" type | 173 class ChangeDelegate { |
| 170 // notification complicates things such as trying to determine "what changed", | |
| 171 // if different members of the Status object are modified from different | |
| 172 // threads. This way, the event is explicit, and it is safe for the Observer | |
| 173 // to dispatch to a native thread or synchronize accordingly. | |
| 174 class Observer { | |
| 175 public: | 174 public: |
| 176 // Notify the observer that changes have been applied to the sync model. | 175 // Notify the delegate that changes have been applied to the sync model. |
| 177 // | 176 // |
| 178 // This will be invoked on the same thread as on which ApplyChanges was | 177 // This will be invoked on the same thread as on which ApplyChanges was |
| 179 // called. |changes| is an array of size |change_count|, and contains the | 178 // called. |changes| is an array of size |change_count|, and contains the |
| 180 // ID of each individual item that was changed. |changes| exists only for | 179 // ID of each individual item that was changed. |changes| exists only for |
| 181 // the duration of the call. If items of multiple data types change at | 180 // the duration of the call. If items of multiple data types change at |
| 182 // the same time, this method is invoked once per data type and |changes| | 181 // the same time, this method is invoked once per data type and |changes| |
| 183 // is restricted to items of the ModelType indicated by |model_type|. | 182 // is restricted to items of the ModelType indicated by |model_type|. |
| 184 // Because the observer is passed a |trans|, the observer can assume a | 183 // Because the observer is passed a |trans|, the observer can assume a |
| 185 // read lock on the sync model that will be released after the function | 184 // read lock on the sync model that will be released after the function |
| 186 // returns. | 185 // returns. |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 209 // | 208 // |
| 210 // The purpose of this function is to support processors that require | 209 // The purpose of this function is to support processors that require |
| 211 // split-transactions changes. For example, if a model processor wants to | 210 // split-transactions changes. For example, if a model processor wants to |
| 212 // perform blocking I/O due to a change, it should calculate the changes | 211 // perform blocking I/O due to a change, it should calculate the changes |
| 213 // while holding the transaction lock (from within OnChangesApplied), buffer | 212 // while holding the transaction lock (from within OnChangesApplied), buffer |
| 214 // those changes, let the transaction fall out of scope, and then commit | 213 // those changes, let the transaction fall out of scope, and then commit |
| 215 // those changes from within OnChangesComplete (postponing the blocking | 214 // those changes from within OnChangesComplete (postponing the blocking |
| 216 // I/O to when it no longer holds any lock). | 215 // I/O to when it no longer holds any lock). |
| 217 virtual void OnChangesComplete(syncable::ModelType model_type) = 0; | 216 virtual void OnChangesComplete(syncable::ModelType model_type) = 0; |
| 218 | 217 |
| 218 protected: | |
| 219 virtual ~ChangeDelegate(); | |
| 220 }; | |
| 221 | |
| 222 // Like ChangeDelegate, except called only on the sync thread and | |
| 223 // not while a transaction is held. For objects that want to know | |
| 224 // when changes happen, but don't need to process them. | |
| 225 class ChangeObserver { | |
| 226 public: | |
| 227 // Ids referred to in |changes| may or may not be in |mutations|. | |
| 228 // If they're not, that means that the node didn't actually | |
| 229 // change, but we marked them as changed for some other reason | |
| 230 // (e.g., siblings of re-ordered nodes). | |
| 231 // | |
| 232 // TODO(sync, long-term): Ideally, ChangeDelegate would also be | |
| 233 // passed |mutations| instead of a transaction that would have to | |
| 234 // be used to look up the changed nodes. That is, | |
| 235 // ChangeDelegate::OnChangesApplied() would still be called under | |
| 236 // the transaction, but all the needed data will be passed down. | |
| 237 // | |
| 238 // Even more ideally, we would have sync semantics such that we'd | |
| 239 // be able to apply changes without being under a transaction. | |
| 240 // But that's a ways off... | |
| 241 virtual void OnChangesApplied( | |
| 242 syncable::ModelType model_type, | |
| 243 const syncable::ImmutableEntryKernelMutationMap& mutations, | |
|
tim (not reviewing)
2011/09/20 16:04:59
We shouldn't add new deps on syncable:: stuff here
akalin
2011/09/20 21:14:42
Introduced the notion of a write transaction ID, a
| |
| 244 const ImmutableChangeRecordList& changes) = 0; | |
| 245 | |
| 246 virtual void OnChangesComplete(syncable::ModelType model_type) = 0; | |
| 247 | |
| 248 protected: | |
| 249 virtual ~ChangeObserver(); | |
| 250 }; | |
| 251 | |
| 252 // An interface the embedding application implements to receive | |
| 253 // notifications from the SyncManager. Register an observer via | |
| 254 // SyncManager::AddObserver. All methods are called only on the | |
| 255 // sync thread. | |
| 256 class Observer { | |
| 257 public: | |
| 219 // A round-trip sync-cycle took place and the syncer has resolved any | 258 // A round-trip sync-cycle took place and the syncer has resolved any |
| 220 // conflicts that may have arisen. | 259 // conflicts that may have arisen. |
| 221 virtual void OnSyncCycleCompleted( | 260 virtual void OnSyncCycleCompleted( |
| 222 const browser_sync::sessions::SyncSessionSnapshot* snapshot) = 0; | 261 const browser_sync::sessions::SyncSessionSnapshot* snapshot) = 0; |
| 223 | 262 |
| 224 // Called when user interaction may be required due to an auth problem. | 263 // Called when user interaction may be required due to an auth problem. |
| 225 virtual void OnAuthError(const GoogleServiceAuthError& auth_error) = 0; | 264 virtual void OnAuthError(const GoogleServiceAuthError& auth_error) = 0; |
| 226 | 265 |
| 227 // Called when a new auth token is provided by the sync server. | 266 // Called when a new auth token is provided by the sync server. |
| 228 virtual void OnUpdatedToken(const std::string& token) = 0; | 267 virtual void OnUpdatedToken(const std::string& token) = 0; |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 333 // After a request to clear server data, these callbacks are invoked to | 372 // After a request to clear server data, these callbacks are invoked to |
| 334 // indicate success or failure. | 373 // indicate success or failure. |
| 335 virtual void OnClearServerDataSucceeded() = 0; | 374 virtual void OnClearServerDataSucceeded() = 0; |
| 336 virtual void OnClearServerDataFailed() = 0; | 375 virtual void OnClearServerDataFailed() = 0; |
| 337 | 376 |
| 338 // Called after we finish encrypting all appropriate datatypes. | 377 // Called after we finish encrypting all appropriate datatypes. |
| 339 virtual void OnEncryptionComplete( | 378 virtual void OnEncryptionComplete( |
| 340 const syncable::ModelTypeSet& encrypted_types) = 0; | 379 const syncable::ModelTypeSet& encrypted_types) = 0; |
| 341 | 380 |
| 342 virtual void OnActionableError( | 381 virtual void OnActionableError( |
| 343 const browser_sync::SyncProtocolError& sync_protocol_error) | 382 const browser_sync::SyncProtocolError& sync_protocol_error) = 0; |
| 344 = 0; | |
| 345 | 383 |
| 346 protected: | 384 protected: |
| 347 virtual ~Observer(); | 385 virtual ~Observer(); |
| 348 }; | 386 }; |
| 349 | 387 |
| 350 typedef Callback0::Type ModeChangeCallback; | 388 typedef Callback0::Type ModeChangeCallback; |
| 351 | 389 |
| 352 // Create an uninitialized SyncManager. Callers must Init() before using. | 390 // Create an uninitialized SyncManager. Callers must Init() before using. |
| 353 explicit SyncManager(const std::string& name); | 391 explicit SyncManager(const std::string& name); |
| 354 virtual ~SyncManager(); | 392 virtual ~SyncManager(); |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 369 // HTTP header. Used internally when collecting stats to classify clients. | 407 // HTTP header. Used internally when collecting stats to classify clients. |
| 370 // |sync_notifier| is owned and used to listen for notifications. | 408 // |sync_notifier| is owned and used to listen for notifications. |
| 371 bool Init(const FilePath& database_location, | 409 bool Init(const FilePath& database_location, |
| 372 const browser_sync::WeakHandle<browser_sync::JsEventHandler>& | 410 const browser_sync::WeakHandle<browser_sync::JsEventHandler>& |
| 373 event_handler, | 411 event_handler, |
| 374 const std::string& sync_server_and_path, | 412 const std::string& sync_server_and_path, |
| 375 int sync_server_port, | 413 int sync_server_port, |
| 376 bool use_ssl, | 414 bool use_ssl, |
| 377 HttpPostProviderFactory* post_factory, | 415 HttpPostProviderFactory* post_factory, |
| 378 browser_sync::ModelSafeWorkerRegistrar* registrar, | 416 browser_sync::ModelSafeWorkerRegistrar* registrar, |
| 417 ChangeDelegate* change_delegate, | |
| 379 const std::string& user_agent, | 418 const std::string& user_agent, |
| 380 const SyncCredentials& credentials, | 419 const SyncCredentials& credentials, |
| 381 sync_notifier::SyncNotifier* sync_notifier, | 420 sync_notifier::SyncNotifier* sync_notifier, |
| 382 const std::string& restored_key_for_bootstrapping, | 421 const std::string& restored_key_for_bootstrapping, |
| 383 bool setup_for_test_mode); | 422 bool setup_for_test_mode); |
| 384 | 423 |
| 385 // Returns the username last used for a successful authentication. | 424 // Returns the username last used for a successful authentication. |
| 386 // Returns empty if there is no such username. | 425 // Returns empty if there is no such username. May be called on any |
| 426 // thread. | |
| 387 const std::string& GetAuthenticatedUsername(); | 427 const std::string& GetAuthenticatedUsername(); |
| 388 | 428 |
| 389 // Check if the database has been populated with a full "initial" download of | 429 // Check if the database has been populated with a full "initial" download of |
| 390 // sync items for each data type currently present in the routing info. | 430 // sync items for each data type currently present in the routing info. |
| 391 // Prerequisite for calling this is that OnInitializationComplete has been | 431 // Prerequisite for calling this is that OnInitializationComplete has been |
| 392 // called. | 432 // called. May be called from any thread. |
| 393 bool InitialSyncEndedForAllEnabledTypes(); | 433 bool InitialSyncEndedForAllEnabledTypes(); |
| 394 | 434 |
| 395 // Update tokens that we're using in Sync. Email must stay the same. | 435 // Update tokens that we're using in Sync. Email must stay the same. |
| 396 void UpdateCredentials(const SyncCredentials& credentials); | 436 void UpdateCredentials(const SyncCredentials& credentials); |
| 397 | 437 |
| 398 // Called when the user disables or enables a sync type. | 438 // Called when the user disables or enables a sync type. |
| 399 void UpdateEnabledTypes(); | 439 void UpdateEnabledTypes(); |
| 400 | 440 |
| 401 // Conditionally sets the flag in the Nigori node which instructs other | 441 // Conditionally sets the flag in the Nigori node which instructs other |
| 402 // clients to start syncing tabs. | 442 // clients to start syncing tabs. |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 427 // Switches the mode of operation to CONFIGURATION_MODE and | 467 // Switches the mode of operation to CONFIGURATION_MODE and |
| 428 // schedules a config task to fetch updates for |types|. | 468 // schedules a config task to fetch updates for |types|. |
| 429 void RequestConfig(const syncable::ModelTypeBitSet& types, | 469 void RequestConfig(const syncable::ModelTypeBitSet& types, |
| 430 sync_api::ConfigureReason reason); | 470 sync_api::ConfigureReason reason); |
| 431 | 471 |
| 432 void RequestCleanupDisabledTypes(); | 472 void RequestCleanupDisabledTypes(); |
| 433 | 473 |
| 434 // Request a clearing of all data on the server | 474 // Request a clearing of all data on the server |
| 435 void RequestClearServerData(); | 475 void RequestClearServerData(); |
| 436 | 476 |
| 477 // Add/remove change observers. | |
| 478 void AddChangeObserver(ChangeObserver* observer); | |
| 479 void RemoveChangeObserver(ChangeObserver* observer); | |
| 480 | |
| 437 // Adds a listener to be notified of sync events. | 481 // Adds a listener to be notified of sync events. |
| 438 // NOTE: It is OK (in fact, it's probably a good idea) to call this before | 482 // NOTE: It is OK (in fact, it's probably a good idea) to call this before |
| 439 // having received OnInitializationCompleted. | 483 // having received OnInitializationCompleted. |
| 440 void AddObserver(Observer* observer); | 484 void AddObserver(Observer* observer); |
| 441 | 485 |
| 442 // Remove the given observer. Make sure to call this if the | 486 // Remove the given observer. Make sure to call this if the |
| 443 // Observer is being destroyed so the SyncManager doesn't | 487 // Observer is being destroyed so the SyncManager doesn't |
| 444 // potentially dereference garbage. | 488 // potentially dereference garbage. |
| 445 void RemoveObserver(Observer* observer); | 489 void RemoveObserver(Observer* observer); |
| 446 | 490 |
| 447 // Status-related getters. Typically GetStatusSummary will suffice, but | 491 // Status-related getters. Typically GetStatusSummary will suffice, but |
| 448 // GetDetailedSyncStatus can be useful for gathering debug-level details of | 492 // GetDetailedSyncStatus can be useful for gathering debug-level details of |
| 449 // the internals of the sync engine. | 493 // the internals of the sync engine. May be called on any thread. |
| 450 Status::Summary GetStatusSummary() const; | 494 Status::Summary GetStatusSummary() const; |
| 451 Status GetDetailedStatus() const; | 495 Status GetDetailedStatus() const; |
| 452 | 496 |
| 453 // Whether or not the Nigori node is encrypted using an explicit passphrase. | 497 // Whether or not the Nigori node is encrypted using an explicit passphrase. |
| 498 // May be called on any thread. | |
| 454 bool IsUsingExplicitPassphrase(); | 499 bool IsUsingExplicitPassphrase(); |
| 455 | 500 |
| 456 // Get the internal implementation for use by BaseTransaction, etc. | |
| 457 SyncInternal* GetImpl() const; | |
| 458 | |
| 459 // Call periodically from a database-safe thread to persist recent changes | 501 // Call periodically from a database-safe thread to persist recent changes |
| 460 // to the syncapi model. | 502 // to the syncapi model. |
| 461 void SaveChanges(); | 503 void SaveChanges(); |
| 462 | 504 |
| 505 // Requests the syncer to stop as soon as possible. May be called | |
| 506 // from any thread. | |
| 463 void RequestEarlyExit(); | 507 void RequestEarlyExit(); |
| 464 | 508 |
| 465 // Issue a final SaveChanges, close sqlite handles, and stop running threads. | 509 // Issue a final SaveChanges, close sqlite handles, and stop running threads. |
| 466 // Must be called from the same thread that called Init(). | |
| 467 void Shutdown(); | 510 void Shutdown(); |
| 468 | 511 |
| 512 // May be called from any thread. | |
| 469 UserShare* GetUserShare() const; | 513 UserShare* GetUserShare() const; |
| 470 | 514 |
| 471 // Inform the cryptographer of the most recent passphrase and set of encrypted | 515 // Inform the cryptographer of the most recent passphrase and set of encrypted |
| 472 // types (from nigori node), then ensure all data that needs encryption is | 516 // types (from nigori node), then ensure all data that needs encryption is |
| 473 // encrypted with the appropriate passphrase. | 517 // encrypted with the appropriate passphrase. |
| 474 // Note: opens a transaction and can trigger ON_PASSPHRASE_REQUIRED, so must | 518 // Note: opens a transaction and can trigger ON_PASSPHRASE_REQUIRED, so must |
| 475 // only be called after syncapi has been initialized. | 519 // only be called after syncapi has been initialized. |
| 476 void RefreshEncryption(); | 520 void RefreshEncryption(); |
| 477 | 521 |
| 478 // Enable encryption of all sync data. Once enabled, it can never be disabled | 522 // Enable encryption of all sync data. Once enabled, it can never be disabled |
| 479 // without clearing the server data. | 523 // without clearing the server data. |
| 480 void EnableEncryptEverything(); | 524 void EnableEncryptEverything(); |
| 481 | 525 |
| 482 // Returns true if we are currently encrypting all sync data. | 526 // Returns true if we are currently encrypting all sync data. May |
| 527 // be called on any thread. | |
| 483 bool EncryptEverythingEnabled() const; | 528 bool EncryptEverythingEnabled() const; |
| 484 | 529 |
| 485 // Gets the set of encrypted types from the cryptographer | 530 // Gets the set of encrypted types from the cryptographer |
| 486 // Note: opens a transaction. | 531 // Note: opens a transaction. May be called from any thread. |
| 487 syncable::ModelTypeSet GetEncryptedDataTypes() const; | 532 syncable::ModelTypeSet GetEncryptedDataTypes() const; |
| 488 | 533 |
| 489 // Reads the nigori node to determine if any experimental types should be | 534 // Reads the nigori node to determine if any experimental types should be |
| 490 // enabled. | 535 // enabled. |
| 491 // Note: opens a transaction. | 536 // Note: opens a transaction. May be called on any thread. |
| 492 bool ReceivedExperimentalTypes(syncable::ModelTypeSet* to_add) const; | 537 bool ReceivedExperimentalTypes(syncable::ModelTypeSet* to_add) const; |
| 493 | 538 |
| 494 // Uses a read-only transaction to determine if the directory being synced has | 539 // Uses a read-only transaction to determine if the directory being synced has |
| 495 // any remaining unsynced items. | 540 // any remaining unsynced items. May be called on any thread. |
| 496 bool HasUnsyncedItems() const; | 541 bool HasUnsyncedItems() const; |
| 497 | 542 |
| 498 // Logs the list of unsynced meta handles. | |
| 499 void LogUnsyncedItems(int level) const; | |
| 500 | |
| 501 // Functions used for testing. | 543 // Functions used for testing. |
| 502 | 544 |
| 503 void TriggerOnNotificationStateChangeForTest( | 545 void TriggerOnNotificationStateChangeForTest( |
| 504 bool notifications_enabled); | 546 bool notifications_enabled); |
| 505 | 547 |
| 506 void TriggerOnIncomingNotificationForTest( | 548 void TriggerOnIncomingNotificationForTest( |
| 507 const syncable::ModelTypeBitSet& model_types); | 549 const syncable::ModelTypeBitSet& model_types); |
| 508 | 550 |
| 509 private: | 551 private: |
| 552 base::ThreadChecker thread_checker_; | |
| 553 | |
| 510 // An opaque pointer to the nested private class. | 554 // An opaque pointer to the nested private class. |
| 511 SyncInternal* data_; | 555 SyncInternal* data_; |
| 512 | 556 |
| 513 DISALLOW_COPY_AND_ASSIGN(SyncManager); | 557 DISALLOW_COPY_AND_ASSIGN(SyncManager); |
| 514 }; | 558 }; |
| 515 | 559 |
| 516 bool InitialSyncEndedForTypes(syncable::ModelTypeSet types, UserShare* share); | 560 bool InitialSyncEndedForTypes(syncable::ModelTypeSet types, UserShare* share); |
| 517 | 561 |
| 518 // Returns the string representation of a PassphraseRequiredReason value. | 562 // Returns the string representation of a PassphraseRequiredReason value. |
| 519 std::string PassphraseRequiredReasonToString(PassphraseRequiredReason reason); | 563 std::string PassphraseRequiredReasonToString(PassphraseRequiredReason reason); |
| 520 | 564 |
| 521 } // namespace sync_api | 565 } // namespace sync_api |
| 522 | 566 |
| 523 #endif // CHROME_BROWSER_SYNC_INTERNAL_API_SYNC_MANAGER_H_ | 567 #endif // CHROME_BROWSER_SYNC_INTERNAL_API_SYNC_MANAGER_H_ |
| OLD | NEW |