| // Copyright 2016 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef PERIDOT_BIN_LEDGER_APP_MERGING_LEDGER_MERGE_MANAGER_H_ |
| #define PERIDOT_BIN_LEDGER_APP_MERGING_LEDGER_MERGE_MANAGER_H_ |
| |
| #include <map> |
| #include <memory> |
| |
| #include <lib/callback/auto_cleanable.h> |
| #include <lib/fidl/cpp/interface_ptr.h> |
| #include <lib/fit/function.h> |
| #include <lib/fxl/macros.h> |
| |
| #include "peridot/bin/ledger/app/merging/merge_resolver.h" |
| #include "peridot/bin/ledger/fidl/include/types.h" |
| #include "peridot/bin/ledger/storage/public/commit.h" |
| #include "peridot/bin/ledger/storage/public/page_storage.h" |
| |
| namespace ledger { |
| |
| // Manages the strategies for handling merges and conflicts for a ledger as |
| // managed by |LedgerManager|. |
| // Holds a ConflictResolverFactory if the client provides one. |
| // |LedgerMergeManager| must outlive all MergeResolver it provides. |
| class LedgerMergeManager { |
| public: |
| explicit LedgerMergeManager(Environment* environment); |
| ~LedgerMergeManager(); |
| |
| void AddFactory(fidl::InterfaceHandle<ConflictResolverFactory> factory); |
| |
| std::unique_ptr<MergeResolver> GetMergeResolver( |
| storage::PageStorage* storage); |
| |
| private: |
| void ResetFactory(); |
| void RemoveResolver(const storage::PageId& page_id); |
| void GetResolverStrategyForPage( |
| const storage::PageId& page_id, |
| fit::function<void(std::unique_ptr<MergeStrategy>)> strategy_callback); |
| void ResetStrategyForPage(storage::PageId page_id); |
| |
| Environment* const environment_; |
| |
| class ConflictResolverFactoryPtrContainer; |
| |
| // Inactive, available conflict resolver factories |
| callback::AutoCleanableSet<ConflictResolverFactoryPtrContainer> |
| conflict_resolver_factories_; |
| // The ConflictResolverFactory that is currently in use |
| fidl::InterfacePtr<ConflictResolverFactory> |
| current_conflict_resolver_factory_; |
| // |true| if using the default last-one-wins conflict resolver factory |
| bool using_default_conflict_resolver_ = true; |
| |
| std::map<storage::PageId, MergeResolver*> resolvers_; |
| |
| FXL_DISALLOW_COPY_AND_ASSIGN(LedgerMergeManager); |
| }; |
| } // namespace ledger |
| #endif // PERIDOT_BIN_LEDGER_APP_MERGING_LEDGER_MERGE_MANAGER_H_ |