1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef SYNC_ENGINE_DIRECTORY_UPDATE_HANDLER_H_ 6 #define SYNC_ENGINE_DIRECTORY_UPDATE_HANDLER_H_ 7 8 #include <map> 9 10 #include "base/basictypes.h" 11 #include "base/memory/ref_counted.h" 12 #include "base/memory/scoped_ptr.h" 13 #include "sync/base/sync_export.h" 14 #include "sync/engine/process_updates_util.h" 15 #include "sync/engine/update_handler.h" 16 #include "sync/internal_api/public/base/model_type.h" 17 #include "sync/internal_api/public/util/syncer_error.h" 18 19 namespace sync_pb { 20 class DataTypeProgressMarker; 21 class GarbageCollectionDirective; 22 class GetUpdatesResponse; 23 } 24 25 namespace syncer { 26 27 namespace sessions { 28 class StatusController; 29 } 30 31 namespace syncable { 32 class Directory; 33 } 34 35 class DirectoryTypeDebugInfoEmitter; 36 class ModelSafeWorker; 37 38 // This class represents the syncable::Directory's processes for requesting and 39 // processing updates from the sync server. 40 // 41 // Each instance of this class represents a particular type in the 42 // syncable::Directory. It can store and retreive that type's progress markers. 43 // It can also process a set of received SyncEntities and store their data. 44 class SYNC_EXPORT_PRIVATE DirectoryUpdateHandler : public UpdateHandler { 45 public: 46 DirectoryUpdateHandler(syncable::Directory* dir, 47 ModelType type, 48 scoped_refptr<ModelSafeWorker> worker, 49 DirectoryTypeDebugInfoEmitter* debug_info_emitter); 50 virtual ~DirectoryUpdateHandler(); 51 52 // UpdateHandler implementation. 53 virtual void GetDownloadProgress( 54 sync_pb::DataTypeProgressMarker* progress_marker) const OVERRIDE; 55 virtual void GetDataTypeContext(sync_pb::DataTypeContext* context) const 56 OVERRIDE; 57 virtual SyncerError ProcessGetUpdatesResponse( 58 const sync_pb::DataTypeProgressMarker& progress_marker, 59 const sync_pb::DataTypeContext& mutated_context, 60 const SyncEntityList& applicable_updates, 61 sessions::StatusController* status) OVERRIDE; 62 virtual void ApplyUpdates(sessions::StatusController* status) OVERRIDE; 63 virtual void PassiveApplyUpdates(sessions::StatusController* status) OVERRIDE; 64 65 private: 66 friend class DirectoryUpdateHandlerApplyUpdateTest; 67 friend class DirectoryUpdateHandlerProcessUpdateTest; 68 69 // Sometimes there is nothing to do, so we can return without doing anything. 70 bool IsApplyUpdatesRequired(); 71 72 // Processes the given SyncEntities and stores their data in the directory. 73 // Their types must match this update handler's type. 74 void UpdateSyncEntities( 75 syncable::ModelNeutralWriteTransaction* trans, 76 const SyncEntityList& applicable_updates, 77 sessions::StatusController* status); 78 79 // Expires entries according to GC directives. 80 void ExpireEntriesIfNeeded( 81 syncable::ModelNeutralWriteTransaction* trans, 82 const sync_pb::DataTypeProgressMarker& progress_marker); 83 84 // Stores the given progress marker in the directory. 85 // Its type must match this update handler's type. 86 void UpdateProgressMarker( 87 const sync_pb::DataTypeProgressMarker& progress_marker); 88 89 bool IsValidProgressMarker( 90 const sync_pb::DataTypeProgressMarker& progress_marker) const; 91 92 // Skips all checks and goes straight to applying the updates. 93 SyncerError ApplyUpdatesImpl(sessions::StatusController* status); 94 95 syncable::Directory* dir_; 96 ModelType type_; 97 scoped_refptr<ModelSafeWorker> worker_; 98 DirectoryTypeDebugInfoEmitter* debug_info_emitter_; 99 100 scoped_ptr<sync_pb::GarbageCollectionDirective> cached_gc_directive_; 101 102 DISALLOW_COPY_AND_ASSIGN(DirectoryUpdateHandler); 103 }; 104 105 } // namespace syncer 106 107 #endif // SYNC_ENGINE_DIRECTORY_UPDATE_HANDLER_H_ 108