Commit 27ab4f9f authored by Joshua Pawlicki's avatar Joshua Pawlicki Committed by Commit Bot

Create a Service Manager and embedder service for the updater.

This allows us to reuse the unzip / patch implementations of
update_client.

Bug: 926236
Change-Id: Iabdbe9f4017b69d3e38a2137e8905b6d274f4ed7
Reviewed-on: https://chromium-review.googlesource.com/c/1461079
Commit-Queue: Joshua Pawlicki <waffles@chromium.org>
Reviewed-by: default avatarSorin Jianu <sorin@chromium.org>
Reviewed-by: default avatarKen Rockot <rockot@google.com>
Cr-Commit-Position: refs/heads/master@{#635692}
parent 3c742657
......@@ -29,9 +29,12 @@ source_set("common") {
deps = [
"//base",
"//components/services/patch/public/cpp:manifest",
"//components/services/unzip/public/cpp:manifest",
"//components/update_client",
"//components/version_info",
"//mojo/core/embedder",
"//services/service_manager",
"//url",
]
}
......
include_rules = [
"+components/services/patch",
"+components/services/unzip",
"+components/update_client",
"+components/version_info",
"+mojo",
......
......@@ -4,6 +4,7 @@
#include "chrome/updater/configurator.h"
#include <utility>
#include "base/version.h"
#include "build/build_config.h"
#include "components/update_client/network.h"
......@@ -29,7 +30,9 @@ const char kUpdaterJSONDefaultUrl[] =
namespace updater {
Configurator::Configurator() = default;
Configurator::Configurator(
std::unique_ptr<service_manager::Connector> connector_prototype)
: connector_prototype_(std::move(connector_prototype)) {}
Configurator::~Configurator() = default;
int Configurator::InitialDelay() const {
......@@ -104,7 +107,7 @@ Configurator::GetNetworkFetcherFactory() {
std::unique_ptr<service_manager::Connector>
Configurator::CreateServiceManagerConnector() const {
return nullptr;
return connector_prototype_->Clone();
}
bool Configurator::EnabledDeltas() const {
......
......@@ -37,7 +37,8 @@ namespace updater {
class Configurator : public update_client::Configurator {
public:
Configurator();
explicit Configurator(
std::unique_ptr<service_manager::Connector> connector_prototype);
// Configurator for update_client::Configurator.
int InitialDelay() const override;
......@@ -75,6 +76,11 @@ class Configurator : public update_client::Configurator {
friend class base::RefCountedThreadSafe<Configurator>;
~Configurator() override;
// connector_prototype__ is a connector to the updater's service_manager,
// through which mojo calls can be made. Connectors have thread-affinity, so
// this connector serves as a template that can be cloned for specific uses.
std::unique_ptr<service_manager::Connector> connector_prototype_;
scoped_refptr<update_client::NetworkFetcherFactory> network_fetcher_factory_;
DISALLOW_COPY_AND_ASSIGN(Configurator);
};
......
......@@ -26,9 +26,18 @@
#include "base/threading/thread_task_runner_handle.h"
#include "base/time/time.h"
#include "chrome/updater/configurator.h"
#include "components/services/patch/public/cpp/manifest.h"
#include "components/services/patch/public/interfaces/constants.mojom.h"
#include "components/services/unzip/public/cpp/manifest.h"
#include "components/services/unzip/public/interfaces/constants.mojom.h"
#include "components/update_client/crx_update_item.h"
#include "components/update_client/update_client.h"
#include "mojo/core/embedder/embedder.h"
#include "services/service_manager/background_service_manager.h"
#include "services/service_manager/public/cpp/manifest_builder.h"
#include "services/service_manager/public/cpp/service.h"
#include "services/service_manager/public/cpp/service_binding.h"
#include "services/service_manager/public/mojom/service.mojom.h"
namespace updater {
......@@ -60,6 +69,49 @@ void QuitLoop(base::OnceClosure quit_closure) {
std::move(quit_closure).Run();
}
// An EmbedderService is a no-op service that represents the updater main (the
// embedder of the service_manager). It exposes its Connector for use in the
// configurator, and owns the service_manager itself.
class EmbedderService : public service_manager::Service {
public:
EmbedderService(service_manager::mojom::ServiceRequest request,
std::unique_ptr<service_manager::BackgroundServiceManager>
service_manager)
: binding_(this, std::move(request)),
service_manager_(std::move(service_manager)) {}
~EmbedderService() override {}
std::unique_ptr<service_manager::Connector> Connector() {
return binding_.GetConnector()->Clone();
}
private:
service_manager::ServiceBinding binding_;
std::unique_ptr<service_manager::BackgroundServiceManager> service_manager_;
DISALLOW_COPY_AND_ASSIGN(EmbedderService);
};
std::unique_ptr<EmbedderService> CreateEmbedderService() {
const char* kEmbedderServiceName = "embedder_updater";
auto service_manager =
std::make_unique<service_manager::BackgroundServiceManager>(
std::vector<service_manager::Manifest>(
{patch::GetManifest(), unzip::GetManifest(),
service_manager::ManifestBuilder()
.WithServiceName(kEmbedderServiceName)
.RequireCapability(patch::mojom::kServiceName, "patch_file")
.RequireCapability(unzip::mojom::kServiceName, "unzip_file")
.Build()}));
service_manager::mojom::ServicePtr service;
service_manager::mojom::ServiceRequest request = mojo::MakeRequest(&service);
service_manager->RegisterService(
service_manager::Identity{kEmbedderServiceName,
base::Token::CreateRandom(), base::Token{},
base::Token::CreateRandom()},
std::move(service), nullptr);
return std::make_unique<EmbedderService>(std::move(request),
std::move(service_manager));
}
class Observer : public update_client::UpdateClient::Observer {
public:
explicit Observer(scoped_refptr<update_client::UpdateClient> update_client)
......@@ -98,7 +150,9 @@ int UpdaterMain(int argc, const char* const* argv) {
base::RunLoop runloop;
auto config = base::MakeRefCounted<Configurator>();
auto embedder_service = CreateEmbedderService();
auto config =
base::MakeRefCounted<Configurator>(embedder_service->Connector());
auto update_client = update_client::UpdateClientFactory(config);
Observer observer(update_client);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment