blob: 03d0c7ec8a6dbda7433aab5be85310254c8d91a3 [file] [log] [blame]
// Copyright (c) 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/sync/driver/directory_data_type_controller.h"
#include <utility>
#include <vector>
#include "base/threading/thread_task_runner_handle.h"
#include "components/sync/base/data_type_histogram.h"
#include "components/sync/driver/sync_service.h"
#include "components/sync/engine/model_type_configurer.h"
#include "components/sync/syncable/syncable_read_transaction.h"
#include "components/sync/syncable/user_share.h"
namespace syncer {
DirectoryDataTypeController::DirectoryDataTypeController(
ModelType type,
const base::Closure& dump_stack,
SyncClient* sync_client,
ModelSafeGroup model_safe_group)
: DataTypeController(type),
dump_stack_(dump_stack),
sync_client_(sync_client),
model_safe_group_(model_safe_group) {}
DirectoryDataTypeController::~DirectoryDataTypeController() {}
bool DirectoryDataTypeController::ShouldLoadModelBeforeConfigure() const {
// Directory datatypes don't require loading models before configure. Their
// progress markers are stored in directory and can be extracted without
// datatype participation.
return false;
}
void DirectoryDataTypeController::BeforeLoadModels(
ModelTypeConfigurer* configurer) {
configurer->RegisterDirectoryDataType(type(), model_safe_group_);
}
void DirectoryDataTypeController::RegisterWithBackend(
base::Callback<void(bool)> set_downloaded,
ModelTypeConfigurer* configurer) {}
void DirectoryDataTypeController::ActivateDataType(
ModelTypeConfigurer* configurer) {
DCHECK(CalledOnValidThread());
// Tell the backend about the change processor for this type so it can
// begin routing changes to it.
configurer->ActivateDirectoryDataType(type(), model_safe_group_,
GetChangeProcessor());
}
void DirectoryDataTypeController::DeactivateDataType(
ModelTypeConfigurer* configurer) {
DCHECK(CalledOnValidThread());
configurer->DeactivateDirectoryDataType(type());
configurer->UnregisterDirectoryDataType(type());
}
void DirectoryDataTypeController::Stop(SyncStopMetadataFate metadata_fate,
StopCallback callback) {
DCHECK(CalledOnValidThread());
Stop(metadata_fate);
std::move(callback).Run();
}
void DirectoryDataTypeController::GetAllNodes(
const AllNodesCallback& callback) {
std::unique_ptr<base::ListValue> node_list = GetAllNodesForTypeFromDirectory(
type(), sync_client_->GetSyncService()->GetUserShare()->directory.get());
callback.Run(type(), std::move(node_list));
}
void DirectoryDataTypeController::GetStatusCounters(
const StatusCountersCallback& callback) {
std::vector<int> num_entries_by_type(syncer::MODEL_TYPE_COUNT, 0);
std::vector<int> num_to_delete_entries_by_type(syncer::MODEL_TYPE_COUNT, 0);
sync_client_->GetSyncService()
->GetUserShare()
->directory->CollectMetaHandleCounts(&num_entries_by_type,
&num_to_delete_entries_by_type);
syncer::StatusCounters counters;
counters.num_entries_and_tombstones = num_entries_by_type[type()];
counters.num_entries =
num_entries_by_type[type()] - num_to_delete_entries_by_type[type()];
callback.Run(type(), counters);
}
void DirectoryDataTypeController::RecordMemoryUsageHistogram() {
syncer::syncable::Directory* directory =
sync_client_->GetSyncService()->GetUserShare()->directory.get();
size_t memory_usage = directory->EstimateMemoryUsageByType(type());
SyncRecordMemoryKbHistogram(kModelTypeMemoryHistogramPrefix, type(),
memory_usage);
}
// static
std::unique_ptr<base::ListValue>
DirectoryDataTypeController::GetAllNodesForTypeFromDirectory(
ModelType type,
syncable::Directory* directory) {
DCHECK(directory);
syncable::ReadTransaction trans(FROM_HERE, directory);
return directory->GetNodeDetailsForType(&trans, type);
}
} // namespace syncer