1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 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)
5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#ifndef COMPONENTS_SYNC_DRIVER_UI_DATA_TYPE_CONTROLLER_H_
6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#define COMPONENTS_SYNC_DRIVER_UI_DATA_TYPE_CONTROLLER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/sync_driver/data_type_controller.h"
1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/sync_driver/shared_change_processor.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TimeDelta;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SyncableService;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SyncError;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace sync_driver {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Implementation for datatypes that reside on the (UI thread). This is the same
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// thread we perform initialization on, so we don't have to worry about thread
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// safety. The main start/stop funtionality is implemented by default.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note: RefCountedThreadSafe by way of DataTypeController.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class UIDataTypeController : public DataTypeController {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UIDataTypeController(
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      scoped_refptr<base::MessageLoopProxy> ui_thread,
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const base::Closure& error_callback,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::ModelType type,
38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      SyncApiComponentFactory* sync_factory);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DataTypeController interface.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void LoadModels(
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const ModelLoadCallback& model_load_callback) OVERRIDE;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void StartAssociating(const StartCallback& start_callback) OVERRIDE;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Stop() OVERRIDE;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual syncer::ModelType type() const OVERRIDE;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual syncer::ModelSafeGroup model_safe_group() const OVERRIDE;
47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual ChangeProcessor* GetChangeProcessor() const OVERRIDE;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual std::string name() const OVERRIDE;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual State state() const OVERRIDE;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DataTypeErrorHandler interface.
526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void OnSingleDataTypeUnrecoverableError(
536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      const syncer::SyncError& error) OVERRIDE;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Used by tests to override the factory used to create
56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // GenericChangeProcessors.
57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void SetGenericChangeProcessorFactoryForTest(
58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      scoped_ptr<GenericChangeProcessorFactory> factory);
59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For testing only.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UIDataTypeController();
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DataTypeController is RefCounted.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~UIDataTypeController();
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start any dependent services that need to be running before we can
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // associate models. The default implementation is a no-op.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return value:
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   True - if models are ready and association can proceed.
706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  //   False - if models are not ready. OnModelLoaded() should be called when
716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  //           the models are ready.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool StartModels();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Perform any DataType controller specific state cleanup before stopping
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the datatype controller. The default implementation is a no-op.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void StopModels();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DataTypeController interface.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnModelLoaded() OVERRIDE;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Helper method for cleaning up state and invoking the start callback.
826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void StartDone(ConfigureResult result,
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         const syncer::SyncMergeResult& local_merge_result,
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         const syncer::SyncMergeResult& syncer_merge_result);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Record association time.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RecordAssociationTime(base::TimeDelta time);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Record causes of start failure.
896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void RecordStartFailure(ConfigureResult result);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SyncApiComponentFactory* const sync_factory_;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  State state_;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartCallback start_callback_;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ModelLoadCallback model_load_callback_;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The sync datatype being controlled.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncer::ModelType type_;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sync's interface to the datatype. All sync changes for |type_| are pushed
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // through it to the datatype as well as vice versa.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Lifetime: it gets created when Start()) is called, and a reference to it
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is passed to |local_service_| during Associate(). We release our reference
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when Stop() or StartFailed() is called, and |local_service_| releases its
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reference when local_service_->StopSyncing() is called or when it is
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // destroyed.
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: we use refcounting here primarily so that we can keep a uniform
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SyncableService API, whether the datatype lives on the UI thread or not
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (a syncer::SyncableService takes ownership of its SyncChangeProcessor when
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // MergeDataAndStartSyncing is called). This will help us eventually merge the
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // two datatype controller implementations (for ui and non-ui thread
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // datatypes).
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SharedChangeProcessor> shared_change_processor_;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_ptr<GenericChangeProcessorFactory> processor_factory_;
119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A weak pointer to the actual local syncable service, which performs all the
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // real work. We do not own the object.
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtr<syncer::SyncableService> local_service_;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  scoped_refptr<base::MessageLoopProxy> ui_thread_;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   // Associate the sync model with the service's model, then start syncing.
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Associate();
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AbortModelLoad();
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(UIDataTypeController);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace sync_driver
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif  // COMPONENTS_SYNC_DRIVER_UI_DATA_TYPE_CONTROLLER_H_
137