blob: cc9a8d1659c46b77cc178d3667693e51285ce130 [file] [log] [blame]
// Copyright 2018 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 <utility>
#include "base/bind.h"
#include "base/callback.h"
#include "chromeos/services/device_sync/device_sync_base.h"
#include "components/gcm_driver/gcm_app_handler.h"
#include "components/gcm_driver/gcm_driver.h"
namespace chromeos {
namespace device_sync {
namespace {
const char kDummyAppName[] = "DeviceSyncDummyApp";
class DummyGCMAppHandler : public gcm::GCMAppHandler {
public:
explicit DummyGCMAppHandler(base::OnceClosure shutdown_callback)
: shutdown_callback_(std::move(shutdown_callback)) {}
~DummyGCMAppHandler() override = default;
// gcm::GCMAppHandler:
void ShutdownHandler() override { std::move(shutdown_callback_).Run(); }
void OnStoreReset() override {}
void OnMessage(const std::string& app_id,
const gcm::IncomingMessage& message) override {}
void OnMessagesDeleted(const std::string& app_id) override {}
void OnSendError(
const std::string& app_id,
const gcm::GCMClient::SendErrorDetails& send_error_details) override {}
void OnSendAcknowledged(const std::string& app_id,
const std::string& message_id) override {}
private:
base::OnceClosure shutdown_callback_;
};
} // namespace
DeviceSyncBase::DeviceSyncBase(gcm::GCMDriver* gcm_driver)
: gcm_app_handler_(std::make_unique<DummyGCMAppHandler>(
base::BindOnce(&DeviceSyncBase::Shutdown, base::Unretained(this)))) {
if (gcm_driver)
gcm_driver->AddAppHandler(kDummyAppName, gcm_app_handler_.get());
bindings_.set_connection_error_handler(base::BindRepeating(
&DeviceSyncBase::OnDisconnection, base::Unretained(this)));
}
DeviceSyncBase::~DeviceSyncBase() = default;
void DeviceSyncBase::AddObserver(mojom::DeviceSyncObserverPtr observer,
AddObserverCallback callback) {
observers_.AddPtr(std::move(observer));
std::move(callback).Run();
}
void DeviceSyncBase::BindRequest(mojom::DeviceSyncRequest request) {
bindings_.AddBinding(this, std::move(request));
}
void DeviceSyncBase::NotifyOnEnrollmentFinished() {
observers_.ForAllPtrs(
[](auto* observer) { observer->OnEnrollmentFinished(); });
}
void DeviceSyncBase::NotifyOnNewDevicesSynced() {
observers_.ForAllPtrs([](auto* observer) { observer->OnNewDevicesSynced(); });
}
void DeviceSyncBase::OnDisconnection() {
// If all clients have disconnected, shut down.
if (bindings_.empty())
Shutdown();
}
} // namespace device_sync
} // namespace chromeos