12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// InternalComponentsFactory exists so that tests can override creation of
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// components used by the SyncManager that are not exposed across the sync
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// API boundary.
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SYNC_INTERNAL_API_PUBLIC_INTERNAL_COMPONENTS_FACTORY_H_
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SYNC_INTERNAL_API_PUBLIC_INTERNAL_COMPONENTS_FACTORY_H_
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "sync/base/sync_export.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/engine/model_safe_worker.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class CancelationSignal;
22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class ExtensionsActivity;
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ModelTypeRegistry;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ServerConnectionManager;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SyncEngineEventListener;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SyncScheduler;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace sessions {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DebugInfoGetter;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SyncSessionContext;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncable {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Directory;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DirectoryBackingStore;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SYNC_EXPORT InternalComponentsFactory {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum EncryptionMethod {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ENCRYPTION_LEGACY,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Option to enable support for keystore key based encryption.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ENCRYPTION_KEYSTORE
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum BackoffOverride {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BACKOFF_NORMAL,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Use this value for integration testing to avoid long delays /
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // timing out tests. Uses kInitialBackoffShortRetrySeconds (see
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // polling_constants.h) for all initial retries.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BACKOFF_SHORT_INITIAL_RETRY_OVERRIDE
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  enum PreCommitUpdatesPolicy {
55ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // By default, the server will enable or disable this experiment through the
56ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // sync protocol's experiments data type.
57ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    SERVER_CONTROLLED_PRE_COMMIT_UPDATE_AVOIANCE,
58ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
59ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // This flag overrides the server's decision and enables the pre-commit
60ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // update avoidance experiment.
61ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    FORCE_ENABLE_PRE_COMMIT_UPDATE_AVOIDANCE,
62ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  };
63ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Configuration options for internal components. This struct is expected
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to grow and shrink over time with transient features / experiments,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // roughly following command line flags in chrome. Implementations of
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // InternalComponentsFactory can use this information to build components
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // with appropriate bells and whistles.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Switches {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EncryptionMethod encryption_method;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BackoffOverride backoff_override;
72ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    PreCommitUpdatesPolicy pre_commit_updates_policy;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~InternalComponentsFactory() {}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual scoped_ptr<SyncScheduler> BuildScheduler(
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& name,
79d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      sessions::SyncSessionContext* context,
80d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      CancelationSignal* cancelation_signal) = 0;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual scoped_ptr<sessions::SyncSessionContext> BuildContext(
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ServerConnectionManager* connection_manager,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncable::Directory* directory,
85a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      ExtensionsActivity* extensions_activity,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::vector<SyncEngineEventListener*>& listeners,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sessions::DebugInfoGetter* debug_info_getter,
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ModelTypeRegistry* model_type_registry,
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& invalidator_client_id) = 0;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual scoped_ptr<syncable::DirectoryBackingStore>
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BuildDirectoryBackingStore(
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& dir_name,
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& backing_filepath) = 0;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the Switches struct that this object is using as configuration, if
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the implementation is making use of one.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual Switches GetSwitches() const = 0;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace syncer
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // SYNC_INTERNAL_API_PUBLIC_INTERNAL_COMPONENTS_FACTORY_H_
104