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