Delete the unneeded buffet sources
diff --git a/buffet/COMMIT-QUEUE.ini b/buffet/COMMIT-QUEUE.ini deleted file mode 100644 index f5a018a..0000000 --- a/buffet/COMMIT-QUEUE.ini +++ /dev/null
@@ -1,11 +0,0 @@ -# Copyright 2015 The Chromium OS Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# Per-project Commit Queue settings. -# Documentation: http://goo.gl/5J7oND - -[GENERAL] - -# Board-specific pre-cq -pre-cq-configs: gizmo-pre-cq
diff --git a/buffet/HACKING b/buffet/HACKING deleted file mode 100644 index 95c6193..0000000 --- a/buffet/HACKING +++ /dev/null
@@ -1,147 +0,0 @@ -This file is intended for onboarding new SWEs hacking on buffet. - - A. Common workflows. - B. Registering your DUT. - ---- -A. COMMON WORKFLOWS ---- - -Some common workflows for developing with buffet: - -# Tell portage that you'd like to make local changes to Buffet: -cros_workon start --board=${BOARD} buffet - -# Edit files in platform2/buffet/ -vim ... - -# Compile and install those changes into the chroot: -USE=buffet emerge-${BOARD} buffet - -# Compile and run buffet unittests -USE=buffet FEATURES=test emerge-${BOARD} buffet - -# Deploy the most recently built version of buffet to a DUT: -cros deploy --board=${BOARD} <remote host> buffet - -#To enable additional debug logging in buffet daemon, run it as: -# buffet --v=<level>, where <level> is verbosity level of debug info: -# 1 - enable additional tracing of internal object construction and destruction -# 2 - add tracing of request and response data sent over HTTP (beware of -# privacy concerns). -# 3 - enable low-level CURL tracing for HTTP communication. -buffet --v=2 - ---- -B. REGISTERING YOUR DUT ---- - -This process in described in great detail at - - https://developers.google.com/cloud-devices/v1/dev-guides/getting-started/register - -but since these instructions are generic and comprehensive, here's -exactly what you need to do to get started when working with -buffet/Brillo, in ten simple steps. - -The word DUT in this context is meant as the device that you want to -associate with the cloud - for most buffet/Brillo developers this will -be a Chromebook or another embedded device. These notes assume you -have shell access to the DUT and also have access to a normal Linux -workstation with shell and browser access. - -1. Open an Incognito window in Chrome on your workstation, go to -https://www.google.com and log in with your test google account (NEVER -use @google.com credentials on DUTs). In the following we're using -<GMAIL_TEST_ACCOUNT> which you should replace with whatever you're -using, e.g. my-testing-account-xyz@gmail.com. - -2. First we need an Authorization Code for the test user. This is -covered in more detail in - - https://developers.google.com/cloud-devices/v1/dev-guides/getting-started/authorizing#code - -but basically amounts to entering the following URL in the Incognito window - - https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/clouddevices&redirect_uri=urn:ietf:wg:oauth:2.0:oob&response_type=code&client_id=58855907228.apps.googleusercontent.com - -If you're not using the default buffet gcd-project, replace the -client_id parameter in the URL with the one for the product you -registered as per - - https://developers.google.com/cloud-devices/v1/dev-guides/getting-started/authorizing#setup - -3. The browser window should display a prompt saying that -"clouddevicesclient" would like to "Manage your cloud device". Press -the "Accept" button and write down the Authorization Code -displayed. It should look something like this - - 4/J23qfSkXYFgF_0H7DCOtwS5O7HO69zF9LtnG9_ILIGA.QhJE9WLeqwcaJvIeHux6iLavlvowlwI - -4. Open a bash prompt on your Linux workstation and type the following - - export SETUP_USER=<GMAIL_TEST_ACCOUNT> - export SETUP_CODE=4/J23qfSkXYFgF_0H7DCOtwS5O7HO69zF9LtnG9_ILIGA.QhJE9WLeqwcaJvIeHux6iLavlvowlwI - export SETUP_CLIENT_ID=58855907228.apps.googleusercontent.com - export SETUP_CLIENT_SECRET=eHSAREAHrIqPsHBxCE9zPPBi - -replacing the values for SETUP_USER and SETUP_CODE as -appropriate. Again, if you're not using the default buffet gcd-project -replace the values SETUP_CLIENT_ID and SETUP_CLIENT_SECRET as -appropriate. - -5. Now we can get an Access Token. Run the following command from the shell: - - curl -d "code=${SETUP_CODE}&client_id=${SETUP_CLIENT_ID}&client_secret=${SETUP_CLIENT_SECRET}&redirect_uri=urn:ietf:wg:oauth:2.0:oob&grant_type=authorization_code" https://accounts.google.com/o/oauth2/token - -It should print out something like this: - - { - "access_token" : "ya29.HQE<...>", - "token_type" : "Bearer", - "expires_in" : 3600, - "refresh_token" : "1/iMq4<...>" - } - -6. Export the access token in the shell: - - export SETUP_ACCESS_TOKEN=ya29.HQE<...> - -7. Now we can get the Registration Ticket Id for the device. Run the following - - curl --header "Authorization: Bearer ${SETUP_ACCESS_TOKEN}" --header "Content-Type: application/json; charset=UTF-8" --data "{ \"userEmail\": \"${SETUP_USER}\" }" https://www.googleapis.com/clouddevices/v1/registrationTickets - -It should print out something like this - - { - "kind": "clouddevices#registrationTicket", - "id": "453f1139-bd<...>", - "deviceId": "77500a3f-458b-<...>", - "userEmail": "<GMAIL_TEST_ACCOUNT>", - "creationTimeMs": "1424193538212", - "expirationTimeMs": "1424193778212" - } - -8. Now, open a shell on the DUT and export the following - - export DUT_SETUP_TICKET_ID=453f1139-bd<...> - -9. Run the following command on the DUT shell - - buffet_client RegisterDevice ticket_id=${DUT_SETUP_TICKET_ID} - -appropriate. If you're not using the default buffet gcd-project you -also need to pass other parameters such as client_id, client_secret -and api_key. - -It should succeed and print the device-id - - Device registered: 77500a3f-458b-<...> - -10. The registered DUT should now show up in the Google account that -you associated it with. In the Incognito window opened in step 1, go -to - - https://security.google.com/settings/security/permissions - -where you can e.g. revoke access to the device.
diff --git a/buffet/OWNERS b/buffet/OWNERS deleted file mode 100644 index 6000333..0000000 --- a/buffet/OWNERS +++ /dev/null
@@ -1,5 +0,0 @@ -set noparent -avakulenko@chromium.org -sosa@chromium.org -vitalybuka@chromium.org -wiley@chromium.org
diff --git a/buffet/README b/buffet/README deleted file mode 100644 index 9dc1e87..0000000 --- a/buffet/README +++ /dev/null
@@ -1,6 +0,0 @@ -// Copyright 2014 The Chromium OS Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -This directory contains the a Brillo service for registering a device and -sending/receiving remote commands.
diff --git a/buffet/ap_manager_client.cc b/buffet/ap_manager_client.cc deleted file mode 100644 index 6449c0f..0000000 --- a/buffet/ap_manager_client.cc +++ /dev/null
@@ -1,114 +0,0 @@ -// Copyright 2014 The Chromium OS 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 "buffet/ap_manager_client.h" - -namespace buffet { - -using org::chromium::apmanager::ConfigProxy; -using org::chromium::apmanager::ManagerProxy; -using org::chromium::apmanager::ServiceProxy; - -ApManagerClient::ApManagerClient(const scoped_refptr<dbus::Bus>& bus) - : bus_(bus) {} - -ApManagerClient::~ApManagerClient() { - Stop(); -} - -void ApManagerClient::Start(const std::string& ssid) { - if (service_path_.IsValid()) { - return; - } - - ssid_ = ssid; - - object_manager_proxy_.reset( - new org::chromium::apmanager::ObjectManagerProxy{bus_}); - object_manager_proxy_->SetManagerAddedCallback(base::Bind( - &ApManagerClient::OnManagerAdded, weak_ptr_factory_.GetWeakPtr())); - object_manager_proxy_->SetServiceAddedCallback(base::Bind( - &ApManagerClient::OnServiceAdded, weak_ptr_factory_.GetWeakPtr())); - - object_manager_proxy_->SetServiceRemovedCallback(base::Bind( - &ApManagerClient::OnServiceRemoved, weak_ptr_factory_.GetWeakPtr())); - object_manager_proxy_->SetManagerRemovedCallback(base::Bind( - &ApManagerClient::OnManagerRemoved, weak_ptr_factory_.GetWeakPtr())); -} - -void ApManagerClient::Stop() { - if (manager_proxy_ && service_path_.IsValid()) { - RemoveService(service_path_); - } - service_path_ = dbus::ObjectPath(); - service_proxy_ = nullptr; - manager_proxy_ = nullptr; - object_manager_proxy_.reset(); - ssid_.clear(); -} - -void ApManagerClient::RemoveService(const dbus::ObjectPath& object_path) { - CHECK(object_path.IsValid()); - chromeos::ErrorPtr error; - if (!manager_proxy_->RemoveService(object_path, &error)) { - LOG(ERROR) << "RemoveService failed: " << error->GetMessage(); - } -} - -void ApManagerClient::OnManagerAdded(ManagerProxy* manager_proxy) { - VLOG(1) << "manager added: " << manager_proxy->GetObjectPath().value(); - manager_proxy_ = manager_proxy; - - if (service_path_.IsValid()) - return; - - chromeos::ErrorPtr error; - if (!manager_proxy_->CreateService(&service_path_, &error)) { - LOG(ERROR) << "CreateService failed: " << error->GetMessage(); - } -} - -void ApManagerClient::OnServiceAdded(ServiceProxy* service_proxy) { - VLOG(1) << "service added: " << service_proxy->GetObjectPath().value(); - if (service_proxy->GetObjectPath() != service_path_) { - RemoveService(service_proxy->GetObjectPath()); - return; - } - service_proxy_ = service_proxy; - - ConfigProxy* config_proxy = - object_manager_proxy_->GetConfigProxy(service_proxy->config()); - ConfigProxy::PropertySet* properties = config_proxy->GetProperties(); - properties->ssid.Set(ssid_, base::Bind(&ApManagerClient::OnSsidSet, - weak_ptr_factory_.GetWeakPtr())); -} - -void ApManagerClient::OnSsidSet(bool success) { - if (!success || !service_proxy_) { - LOG(ERROR) << "Failed to set ssid."; - return; - } - VLOG(1) << "SSID is set: " << ssid_; - - chromeos::ErrorPtr error; - if (!service_proxy_->Start(&error)) { - LOG(ERROR) << "Service start failed: " << error->GetMessage(); - } -} - -void ApManagerClient::OnServiceRemoved(const dbus::ObjectPath& object_path) { - VLOG(1) << "service removed: " << object_path.value(); - if (object_path != service_path_) - return; - service_path_ = dbus::ObjectPath(); - service_proxy_ = nullptr; -} - -void ApManagerClient::OnManagerRemoved(const dbus::ObjectPath& object_path) { - VLOG(1) << "manager removed: " << object_path.value(); - manager_proxy_ = nullptr; - Stop(); -} - -} // namespace buffet
diff --git a/buffet/ap_manager_client.h b/buffet/ap_manager_client.h deleted file mode 100644 index 8397587..0000000 --- a/buffet/ap_manager_client.h +++ /dev/null
@@ -1,57 +0,0 @@ -// Copyright 2014 The Chromium OS 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 BUFFET_AP_MANAGER_CLIENT_H_ -#define BUFFET_AP_MANAGER_CLIENT_H_ - -#include <memory> -#include <string> - -#include <base/callback.h> -#include <base/memory/ref_counted.h> - -#include "apmanager/dbus-proxies.h" - -namespace buffet { - -// Manages soft AP for wifi bootstrapping. -// Once created can handle multiple Start/Stop requests. -class ApManagerClient final { - public: - explicit ApManagerClient(const scoped_refptr<dbus::Bus>& bus); - ~ApManagerClient(); - - void Start(const std::string& ssid); - void Stop(); - - std::string GetSsid() const { return ssid_; } - - private: - void RemoveService(const dbus::ObjectPath& object_path); - - void OnManagerAdded(org::chromium::apmanager::ManagerProxy* manager_proxy); - void OnServiceAdded(org::chromium::apmanager::ServiceProxy* service_proxy); - - void OnSsidSet(bool success); - - void OnServiceRemoved(const dbus::ObjectPath& object_path); - void OnManagerRemoved(const dbus::ObjectPath& object_path); - - scoped_refptr<dbus::Bus> bus_; - - std::unique_ptr<org::chromium::apmanager::ObjectManagerProxy> - object_manager_proxy_; - org::chromium::apmanager::ManagerProxy* manager_proxy_{nullptr}; - - dbus::ObjectPath service_path_; - org::chromium::apmanager::ServiceProxy* service_proxy_{nullptr}; - - std::string ssid_; - - base::WeakPtrFactory<ApManagerClient> weak_ptr_factory_{this}; -}; - -} // namespace buffet - -#endif // BUFFET_AP_MANAGER_CLIENT_H_
diff --git a/buffet/buffet.gyp b/buffet/buffet.gyp deleted file mode 100644 index 800737a..0000000 --- a/buffet/buffet.gyp +++ /dev/null
@@ -1,157 +0,0 @@ -{ - 'target_defaults': { - 'variables': { - 'deps': [ - 'libchrome-<(libbase_ver)', - 'libchromeos-<(libbase_ver)', - 'system_api', - ], - }, - 'include_dirs': [ - '.', - ], - }, - 'targets': [ - { - 'target_name': 'buffet_common', - 'type': 'static_library', - 'variables': { - 'dbus_adaptors_out_dir': 'include/buffet', - 'dbus_service_config': 'dbus_bindings/dbus-service-config.json', - 'exported_deps': [ - 'libwebserv-<(libbase_ver)', - 'libweave-<(libbase_ver)', - ], - 'deps': ['<@(exported_deps)'], - }, - 'all_dependent_settings': { - 'variables': { - 'deps': [ - '<@(exported_deps)', - ], - }, - }, - 'sources': [ - 'ap_manager_client.cc', - 'dbus_bindings/org.chromium.Buffet.Command.xml', - 'dbus_bindings/org.chromium.Buffet.Manager.xml', - 'dbus_command_dispatcher.cc', - 'dbus_command_proxy.cc', - 'dbus_conversion.cc', - 'dbus_constants.cc', - 'manager.cc', - 'peerd_client.cc', - 'shill_client.cc', - 'webserv_client.cc', - ], - 'includes': ['../common-mk/generate-dbus-adaptors.gypi'], - 'actions': [ - { - 'action_name': 'generate-buffet-proxies', - 'variables': { - 'dbus_service_config': 'dbus_bindings/dbus-service-config.json', - 'proxy_output_file': 'include/buffet/dbus-proxies.h' - }, - 'sources': [ - 'dbus_bindings/org.chromium.Buffet.Command.xml', - 'dbus_bindings/org.chromium.Buffet.Manager.xml', - ], - 'includes': ['../common-mk/generate-dbus-proxies.gypi'], - }, - { - # Import D-Bus bindings from peerd. - 'action_name': 'generate-peerd-proxies', - 'variables': { - 'dbus_service_config': '../peerd/dbus_bindings/dbus-service-config.json', - 'proxy_output_file': 'include/peerd/dbus-proxies.h' - }, - 'sources': [ - '../peerd/dbus_bindings/org.chromium.peerd.Manager.xml', - '../peerd/dbus_bindings/org.chromium.peerd.Peer.xml', - '../peerd/dbus_bindings/org.chromium.peerd.Service.xml', - ], - 'includes': ['../common-mk/generate-dbus-proxies.gypi'], - }, - { - # Import D-Bus bindings from shill. - 'action_name': 'generate-shill-proxies', - 'variables': { - 'dbus_service_config': '../shill/dbus_bindings/dbus-service-config.json', - 'proxy_output_file': 'include/shill/dbus-proxies.h' - }, - 'sources': [ - '../shill/dbus_bindings/org.chromium.flimflam.Device.xml', - '../shill/dbus_bindings/org.chromium.flimflam.Manager.xml', - '../shill/dbus_bindings/org.chromium.flimflam.Service.xml', - ], - 'includes': ['../common-mk/generate-dbus-proxies.gypi'], - }, - { - # Import D-Bus bindings from apmanager. - 'action_name': 'generate-apmanager-proxies', - 'variables': { - 'dbus_service_config': '../apmanager/dbus_bindings/dbus-service-config.json', - 'proxy_output_file': 'include/apmanager/dbus-proxies.h' - }, - 'sources': [ - '../apmanager/dbus_bindings/org.chromium.apmanager.Config.xml', - '../apmanager/dbus_bindings/org.chromium.apmanager.Device.xml', - '../apmanager/dbus_bindings/org.chromium.apmanager.Manager.xml', - '../apmanager/dbus_bindings/org.chromium.apmanager.Service.xml', - ], - 'includes': ['../common-mk/generate-dbus-proxies.gypi'], - }, - ], - }, - { - 'target_name': 'buffet', - 'type': 'executable', - 'dependencies': [ - 'buffet_common', - ], - 'sources': [ - 'main.cc', - ], - }, - { - 'target_name': 'buffet_test_daemon', - 'type': 'executable', - 'sources': [ - 'test_daemon/main.cc', - ], - }, - { - 'target_name': 'buffet_client', - 'type': 'executable', - 'sources': [ - 'buffet_client.cc', - ], - }, - ], - 'conditions': [ - ['USE_test == 1', { - 'targets': [ - { - 'target_name': 'buffet_testrunner', - 'type': 'executable', - 'dependencies': [ - 'buffet_common', - ], - 'variables': { - 'deps': [ - 'libchrome-test-<(libbase_ver)', - 'libchromeos-test-<(libbase_ver)', - 'libweave-test-<(libbase_ver)', - ], - }, - 'includes': ['../common-mk/common_test.gypi'], - 'sources': [ - 'buffet_testrunner.cc', - 'dbus_command_proxy_unittest.cc', - 'dbus_conversion_unittest.cc', - ], - }, - ], - }], - ], -}
diff --git a/buffet/buffet_client.cc b/buffet/buffet_client.cc deleted file mode 100644 index cf9928f..0000000 --- a/buffet/buffet_client.cc +++ /dev/null
@@ -1,400 +0,0 @@ -// Copyright 2014 The Chromium OS 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 <memory> -#include <string> -#include <sysexits.h> - -#include <base/cancelable_callback.h> -#include <base/command_line.h> -#include <base/json/json_reader.h> -#include <base/logging.h> -#include <base/memory/ref_counted.h> -#include <base/memory/weak_ptr.h> -#include <base/strings/stringprintf.h> -#include <base/values.h> -#include <chromeos/any.h> -#include <chromeos/daemons/dbus_daemon.h> -#include <chromeos/data_encoding.h> -#include <chromeos/dbus/data_serialization.h> -#include <chromeos/dbus/dbus_method_invoker.h> -#include <chromeos/errors/error.h> -#include <chromeos/strings/string_utils.h> -#include <chromeos/variant_dictionary.h> -#include <dbus/bus.h> -#include <dbus/message.h> -#include <dbus/object_proxy.h> -#include <dbus/object_manager.h> -#include <dbus/values_util.h> - -#include "buffet/dbus-proxies.h" - -using chromeos::Error; -using chromeos::ErrorPtr; -using org::chromium::Buffet::ManagerProxy; - -namespace { - -void usage() { - printf(R"(Possible commands: - - TestMethod <message> - - CheckDeviceRegistered - - GetDeviceInfo - - RegisterDevice param1=val1¶m2=val2... - - AddCommand '{"name":"command_name","parameters":{}}' - - UpdateState prop_name prop_value - - GetState - - PendingCommands - - SetCommandVisibility pkg1.cmd1[,pkg2.cm2,...] [all|cloud|local|none] -)"); -} - -// Helpers for JsonToAny(). -template<typename T> -chromeos::Any GetJsonValue(const base::Value& json, - bool(base::Value::*fnc)(T*) const) { - T val; - CHECK((json.*fnc)(&val)); - return val; -} - -template<typename T> -chromeos::Any GetJsonList(const base::ListValue& list); // Prototype. - -// Converts a JSON value into an Any so it can be sent over D-Bus using -// UpdateState D-Bus method from Buffet. -chromeos::Any JsonToAny(const base::Value& json) { - chromeos::Any prop_value; - switch (json.GetType()) { - case base::Value::TYPE_NULL: - prop_value = nullptr; - break; - case base::Value::TYPE_BOOLEAN: - prop_value = GetJsonValue<bool>(json, &base::Value::GetAsBoolean); - break; - case base::Value::TYPE_INTEGER: - prop_value = GetJsonValue<int>(json, &base::Value::GetAsInteger); - break; - case base::Value::TYPE_DOUBLE: - prop_value = GetJsonValue<double>(json, &base::Value::GetAsDouble); - break; - case base::Value::TYPE_STRING: - prop_value = GetJsonValue<std::string>(json, &base::Value::GetAsString); - break; - case base::Value::TYPE_BINARY: - LOG(FATAL) << "Binary values should not happen"; - break; - case base::Value::TYPE_DICTIONARY: { - const base::DictionaryValue* dict = nullptr; // Still owned by |json|. - CHECK(json.GetAsDictionary(&dict)); - chromeos::VariantDictionary var_dict; - base::DictionaryValue::Iterator it(*dict); - while (!it.IsAtEnd()) { - var_dict.emplace(it.key(), JsonToAny(it.value())); - it.Advance(); - } - prop_value = var_dict; - break; - } - case base::Value::TYPE_LIST: { - const base::ListValue* list = nullptr; // Still owned by |json|. - CHECK(json.GetAsList(&list)); - CHECK(!list->empty()) << "Unable to deduce the type of list elements."; - switch ((*list->begin())->GetType()) { - case base::Value::TYPE_BOOLEAN: - prop_value = GetJsonList<bool>(*list); - break; - case base::Value::TYPE_INTEGER: - prop_value = GetJsonList<int>(*list); - break; - case base::Value::TYPE_DOUBLE: - prop_value = GetJsonList<double>(*list); - break; - case base::Value::TYPE_STRING: - prop_value = GetJsonList<std::string>(*list); - break; - case base::Value::TYPE_DICTIONARY: - prop_value = GetJsonList<chromeos::VariantDictionary>(*list); - break; - default: - LOG(FATAL) << "Unsupported JSON value type for list element: " - << (*list->begin())->GetType(); - } - break; - } - default: - LOG(FATAL) << "Unexpected JSON value type: " << json.GetType(); - break; - } - return prop_value; -} - -template<typename T> -chromeos::Any GetJsonList(const base::ListValue& list) { - std::vector<T> val; - val.reserve(list.GetSize()); - for (const base::Value* v : list) - val.push_back(JsonToAny(*v).Get<T>()); - return val; -} - -class Daemon final : public chromeos::DBusDaemon { - public: - Daemon() = default; - - protected: - int OnInit() override { - int return_code = chromeos::DBusDaemon::OnInit(); - if (return_code != EX_OK) - return return_code; - - object_manager_.reset(new org::chromium::Buffet::ObjectManagerProxy{bus_}); - return_code = ScheduleActions(); - if (return_code == EX_USAGE) { - usage(); - } - return return_code; - } - - void OnShutdown(int* return_code) override { - if (*return_code == EX_OK) - *return_code = exit_code_; - } - - private: - int ScheduleActions() { - auto args = base::CommandLine::ForCurrentProcess()->GetArgs(); - - // Pop the command off of the args list. - std::string command = args.front(); - args.erase(args.begin()); - base::Callback<void(ManagerProxy*)> job; - if (command.compare("TestMethod") == 0) { - if (!args.empty() && !CheckArgs(command, args, 1)) - return EX_USAGE; - std::string message; - if (!args.empty()) - message = args.back(); - job = base::Bind(&Daemon::CallTestMethod, weak_factory_.GetWeakPtr(), - message); - } else if (command.compare("CheckDeviceRegistered") == 0 || - command.compare("cr") == 0) { - if (!CheckArgs(command, args, 0)) - return EX_USAGE; - job = base::Bind(&Daemon::CallCheckDeviceRegistered, - weak_factory_.GetWeakPtr()); - } else if (command.compare("GetDeviceInfo") == 0 || - command.compare("di") == 0) { - if (!CheckArgs(command, args, 0)) - return EX_USAGE; - job = base::Bind(&Daemon::CallGetDeviceInfo, - weak_factory_.GetWeakPtr()); - } else if (command.compare("RegisterDevice") == 0 || - command.compare("rd") == 0) { - if (!args.empty() && !CheckArgs(command, args, 1)) - return EX_USAGE; - std::string dict; - if (!args.empty()) - dict = args.back(); - job = base::Bind(&Daemon::CallRegisterDevice, - weak_factory_.GetWeakPtr(), dict); - } else if (command.compare("UpdateState") == 0 || - command.compare("us") == 0) { - if (!CheckArgs(command, args, 2)) - return EX_USAGE; - job = base::Bind(&Daemon::CallUpdateState, weak_factory_.GetWeakPtr(), - args.front(), args.back()); - } else if (command.compare("GetState") == 0 || - command.compare("gs") == 0) { - if (!CheckArgs(command, args, 0)) - return EX_USAGE; - job = base::Bind(&Daemon::CallGetState, weak_factory_.GetWeakPtr()); - } else if (command.compare("AddCommand") == 0 || - command.compare("ac") == 0) { - if (!CheckArgs(command, args, 1)) - return EX_USAGE; - job = base::Bind(&Daemon::CallAddCommand, weak_factory_.GetWeakPtr(), - args.back()); - } else if (command.compare("PendingCommands") == 0 || - command.compare("pc") == 0) { - if (!CheckArgs(command, args, 0)) - return EX_USAGE; - // CallGetPendingCommands relies on ObjectManager but it is being - // initialized asynchronously without a way to get a callback when - // it is ready to be used. So, just wait a bit before calling its - // methods. - base::MessageLoop::current()->PostDelayedTask( - FROM_HERE, - base::Bind(&Daemon::CallGetPendingCommands, - weak_factory_.GetWeakPtr()), - base::TimeDelta::FromMilliseconds(100)); - } else { - fprintf(stderr, "Unknown command: '%s'\n", command.c_str()); - return EX_USAGE; - } - if (!job.is_null()) - object_manager_->SetManagerAddedCallback(job); - timeout_task_.Reset( - base::Bind(&Daemon::OnJobTimeout, weak_factory_.GetWeakPtr())); - base::MessageLoop::current()->PostDelayedTask( - FROM_HERE, - timeout_task_.callback(), - base::TimeDelta::FromSeconds(10)); - - return EX_OK; - } - - void OnJobComplete() { - timeout_task_.Cancel(); - Quit(); - } - - void OnJobTimeout() { - fprintf(stderr, "Timed out before completing request."); - Quit(); - } - - void ReportError(Error* error) { - fprintf(stderr, "Failed to receive a response: %s\n", - error->GetMessage().c_str()); - exit_code_ = EX_UNAVAILABLE; - OnJobComplete(); - } - - bool CheckArgs(const std::string& command, - const std::vector<std::string>& args, - size_t expected_arg_count) { - if (args.size() == expected_arg_count) - return true; - fprintf(stderr, "Invalid number of arguments for command '%s'\n", - command.c_str()); - return false; - } - - void CallTestMethod(const std::string& message, ManagerProxy* manager_proxy) { - ErrorPtr error; - std::string response_message; - if (!manager_proxy->TestMethod(message, &response_message, &error)) { - return ReportError(error.get()); - } - printf("Received a response: %s\n", response_message.c_str()); - OnJobComplete(); - } - - void CallCheckDeviceRegistered(ManagerProxy* manager_proxy) { - ErrorPtr error; - std::string device_id; - if (!manager_proxy->CheckDeviceRegistered(&device_id, &error)) { - return ReportError(error.get()); - } - - printf("Device ID: %s\n", - device_id.empty() ? "<unregistered>" : device_id.c_str()); - OnJobComplete(); - } - - void CallGetDeviceInfo(ManagerProxy* manager_proxy) { - ErrorPtr error; - std::string device_info; - if (!manager_proxy->GetDeviceInfo(&device_info, &error)) { - return ReportError(error.get()); - } - - printf("%s\n", device_info.c_str()); - OnJobComplete(); - } - - void CallRegisterDevice(const std::string& args, - ManagerProxy* manager_proxy) { - std::string ticket_id; - if (!args.empty()) { - auto key_values = chromeos::data_encoding::WebParamsDecode(args); - for (const auto& pair : key_values) { - if (pair.first == "ticket_id") - ticket_id = pair.second; - } - } - - ErrorPtr error; - std::string device_id; - if (!manager_proxy->RegisterDevice(ticket_id, &device_id, &error)) { - return ReportError(error.get()); - } - - printf("Device registered: %s\n", device_id.c_str()); - OnJobComplete(); - } - - void CallUpdateState(const std::string& prop, - const std::string& value, - ManagerProxy* manager_proxy) { - ErrorPtr error; - std::string error_message; - std::unique_ptr<base::Value> json( - base::JSONReader::ReadAndReturnError(value, base::JSON_PARSE_RFC, - nullptr, &error_message) - .release()); - if (!json) { - Error::AddTo(&error, FROM_HERE, chromeos::errors::json::kDomain, - chromeos::errors::json::kParseError, error_message); - return ReportError(error.get()); - } - - chromeos::VariantDictionary property_set{{prop, JsonToAny(*json)}}; - if (!manager_proxy->UpdateState(property_set, &error)) { - return ReportError(error.get()); - } - OnJobComplete(); - } - - void CallGetState(ManagerProxy* manager_proxy) { - std::string json; - ErrorPtr error; - if (!manager_proxy->GetState(&json, &error)) { - return ReportError(error.get()); - } - printf("%s\n", json.c_str()); - OnJobComplete(); - } - - void CallAddCommand(const std::string& command, ManagerProxy* manager_proxy) { - ErrorPtr error; - std::string id; - if (!manager_proxy->AddCommand(command, "owner", &id, &error)) { - return ReportError(error.get()); - } - OnJobComplete(); - } - - void CallGetPendingCommands() { - printf("Pending commands:\n"); - for (auto* cmd : object_manager_->GetCommandInstances()) { - printf("%10s - '%s' (id:%s)\n", cmd->status().c_str(), - cmd->name().c_str(), cmd->id().c_str()); - } - OnJobComplete(); - } - - std::unique_ptr<org::chromium::Buffet::ObjectManagerProxy> object_manager_; - int exit_code_{EX_OK}; - base::CancelableCallback<void()> timeout_task_; - - base::WeakPtrFactory<Daemon> weak_factory_{this}; - DISALLOW_COPY_AND_ASSIGN(Daemon); -}; - -} // anonymous namespace - -int main(int argc, char** argv) { - base::CommandLine::Init(argc, argv); - base::CommandLine* cl = base::CommandLine::ForCurrentProcess(); - base::CommandLine::StringVector args = cl->GetArgs(); - if (args.empty()) { - usage(); - return EX_USAGE; - } - - Daemon daemon; - return daemon.Run(); -}
diff --git a/buffet/buffet_testrunner.cc b/buffet/buffet_testrunner.cc deleted file mode 100644 index 072461d..0000000 --- a/buffet/buffet_testrunner.cc +++ /dev/null
@@ -1,12 +0,0 @@ -// Copyright (c) 2014 The Chromium OS 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 <base/at_exit.h> -#include <gtest/gtest.h> - -int main(int argc, char** argv) { - base::AtExitManager exit_manager; - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -}
diff --git a/buffet/dbus_bindings/dbus-service-config.json b/buffet/dbus_bindings/dbus-service-config.json deleted file mode 100644 index e610c3d..0000000 --- a/buffet/dbus_bindings/dbus-service-config.json +++ /dev/null
@@ -1,7 +0,0 @@ -{ - "service_name": "org.chromium.Buffet", - "object_manager": { - "name": "org.chromium.Buffet.ObjectManager", - "object_path": "/org/chromium/Buffet" - } -}
diff --git a/buffet/dbus_bindings/org.chromium.Buffet.Command.xml b/buffet/dbus_bindings/org.chromium.Buffet.Command.xml deleted file mode 100644 index c9ed924..0000000 --- a/buffet/dbus_bindings/org.chromium.Buffet.Command.xml +++ /dev/null
@@ -1,47 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> - -<node xmlns:tp="http://telepathy.freedesktop.org/wiki/DbusSpec#extensions-v0"> - <interface name="org.chromium.Buffet.Command"> - <method name="SetProgress"> - <arg name="progress" type="a{sv}" direction="in"/> - <annotation name="org.chromium.DBus.Method.Kind" value="normal"/> - </method> - <method name="SetResults"> - <arg name="results" type="a{sv}" direction="in"/> - <annotation name="org.chromium.DBus.Method.Kind" value="normal"/> - </method> - <method name="Abort"> - <tp:docstring> - Mark the command as aborted. This tells the cloud that the device did - not successfully complete executing the command. - </tp:docstring> - <annotation name="org.chromium.DBus.Method.Kind" value="simple"/> - </method> - <method name="Cancel"> - <tp:docstring> - Mark the command as cancelled. Unlike Abort() this should be used when - the device detects a user request to cancel a command. - </tp:docstring> - <annotation name="org.chromium.DBus.Method.Kind" value="simple"/> - </method> - <method name="Done"> - <tp:docstring> - Mark the command as successfully completed. - </tp:docstring> - <annotation name="org.chromium.DBus.Method.Kind" value="simple"/> - </method> - <property name="Name" type="s" access="read"/> - <property name="Category" type="s" access="read"/> - <property name="Id" type="s" access="read"/> - <property name="Status" type="s" access="read"/> - <property name="Parameters" type="a{sv}" access="read"/> - <property name="Progress" type="a{sv}" access="read"/> - <property name="Results" type="a{sv}" access="read"/> - <property name="Origin" type="s" access="read"> - <tp:docstring> - Specifies the origin of the command. This is a string containing - "cloud" or "local" indicating the method of delivery of the command. - </tp:docstring> - </property> - </interface> -</node>
diff --git a/buffet/dbus_bindings/org.chromium.Buffet.Manager.xml b/buffet/dbus_bindings/org.chromium.Buffet.Manager.xml deleted file mode 100644 index 56370fa..0000000 --- a/buffet/dbus_bindings/org.chromium.Buffet.Manager.xml +++ /dev/null
@@ -1,219 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> - -<node name="/org/chromium/Buffet/Manager" - xmlns:tp="http://telepathy.freedesktop.org/wiki/DbusSpec#extensions-v0"> - <interface name="org.chromium.Buffet.Manager"> - <tp:docstring> - The Manager is responsible for global state of Buffet. It exposes - interfaces which affect the entire device such as device registration and - device state. - </tp:docstring> - <method name="CheckDeviceRegistered"> - <arg name="device_id" type="s" direction="out"/> - <annotation name="org.chromium.DBus.Method.Kind" value="async"/> - </method> - <method name="GetDeviceInfo"> - <arg name="device_info" type="s" direction="out"/> - <annotation name="org.chromium.DBus.Method.Kind" value="async"/> - </method> - <method name="RegisterDevice"> - <arg name="ticket_id" type="s" direction="in"/> - <arg name="device_id" type="s" direction="out"/> - <annotation name="org.chromium.DBus.Method.Kind" value="async"/> - </method> - <method name="UpdateDeviceInfo"> - <arg name="name" type="s" direction="in"/> - <arg name="description" type="s" direction="in"/> - <arg name="location" type="s" direction="in"/> - <annotation name="org.chromium.DBus.Method.Kind" value="normal"/> - </method> - <method name="UpdateServiceConfig"> - <arg name="client_id" type="s" direction="in"/> - <arg name="client_secret" type="s" direction="in"/> - <arg name="api_key" type="s" direction="in"/> - <arg name="oauth_url" type="s" direction="in"/> - <arg name="service_url" type="s" direction="in"/> - <annotation name="org.chromium.DBus.Method.Kind" value="normal"/> - </method> - <method name="UpdateState"> - <arg name="property_set" type="a{sv}" direction="in"/> - <annotation name="org.chromium.DBus.Method.Kind" value="async"/> - </method> - <method name="GetState"> - <arg name="device_info" type="s" direction="out"/> - <annotation name="org.chromium.DBus.Method.Kind" value="normal"/> - </method> - <method name="AddCommand"> - <arg name="json_command" type="s" direction="in"/> - <arg name="user_role" type="s" direction="in"/> - <arg name="id" type="s" direction="out"/> - <annotation name="org.chromium.DBus.Method.Kind" value="async"/> - </method> - <method name="GetCommand"> - <arg name="id" type="s" direction="in"/> - <arg name="json_command" type="s" direction="out"/> - <annotation name="org.chromium.DBus.Method.Kind" value="async"/> - </method> - <method name="TestMethod"> - <arg name="message" type="s" direction="in"/> - <arg name="echoed_message" type="s" direction="out"/> - <annotation name="org.chromium.DBus.Method.Kind" value="simple"/> - </method> - <method name="EnableWiFiBootstrapping"> - <tp:docstring> - Enables WiFiBootstrapping if manual bootstrapping is selected via the - configuration file. This will re-purpose a WiFi interface for use in - bootstrapping. This breaks any existing WiFi connection on the - interface. - </tp:docstring> - <arg name="listener_path" type="o" direction="in"> - <tp:docstring> - Path to an object exposed by the caller. This object must support - the org.chromium.Buffet.WiFiBootstrapListener interface. - </tp:docstring> - </arg> - <arg name="options" type="a{sv}" direction="in"/> - <annotation name="org.chromium.DBus.Method.Kind" value="normal"/> - </method> - <method name="DisableWiFiBootstrapping"> - <tp:docstring> - If a previous call to EnableWiFiBootstrapping was successful and - has not been cancelled or completed since, disables that bootstrapping - process. - </tp:docstring> - <annotation name="org.chromium.DBus.Method.Kind" value="normal"/> - </method> - <method name="EnableGCDBootstrapping"> - <arg name="listener_path" type="o" direction="in"/> - <arg name="options" type="a{sv}" direction="in"/> - <annotation name="org.chromium.DBus.Method.Kind" value="normal"/> - </method> - <method name="DisableGCDBootstrapping"> - <annotation name="org.chromium.DBus.Method.Kind" value="normal"/> - </method> - - <property name="Status" type="s" access="read"> - <tp:docstring> - State of Buffet's cloud registration. - Possible values include: - "unconfigured": Buffet has no credentials, either from an out of box - state, or because device was unregistered. - - "connecting": Buffet is registered and attempting to connect to the - cloud. - - "connected": Buffet is online and connected to the cloud. Note that - only this state requires internet connectivity. - - "invalid_credentials": Buffet has credentials, but they are no longer - valid. - </tp:docstring> - </property> - <property name="DeviceId" type="s" access="read"> - <tp:docstring> - GCD ID if the device is registered or empty otherwise. - </tp:docstring> - </property> - <property name="State" type="s" access="read"> - <tp:docstring> - JSON with state of the devices. - </tp:docstring> - </property> - <property name="OemName" type="s" access="read"> - <tp:docstring> - Name of the device maker. - </tp:docstring> - </property> - <property name="ModelName" type="s" access="read"> - <tp:docstring> - Name of the device model. - </tp:docstring> - </property> - <property name="ModelId" type="s" access="read"> - <tp:docstring> - Five character code assigned by the cloud registry of device models. - </tp:docstring> - </property> - <property name="Name" type="s" access="read"> - <tp:docstring> - Human readable name of the device. Must not be empty. - </tp:docstring> - </property> - <property name="Description" type="s" access="read"> - <tp:docstring> - Human readable description of the device. - </tp:docstring> - </property> - <property name="Location" type="s" access="read"> - <tp:docstring> - Location of the device. - </tp:docstring> - </property> - <property name="AnonymousAccessRole" type="s" access="read"> - <tp:docstring> - Max role granted to anonymous user when accessing device over the local - network. - Possible values include: - "none": Device does not allow local access by unauthenticated users. - - "viewer": Device allows everyone authenticated to access device. - - "user": Device allows everyone authenticated as 'user' to access - device. - - "owner": Device allows everyone authenticated as 'owner' to access - device. - </tp:docstring> - </property> - <property name="WiFiBootstrapState" type="s" access="read"> - <tp:docstring> - Contains one of the following values describing the state of WiFi - bootstrapping: - “disabled” - Bootstrapping has been disabled in the config file. - “waiting” - buffet is waiting to receive WiFi credentials from - a paired peer. - “connecting” - buffet has received WiFi credentials, and is now - attempting to connect to a WiFi network. - “monitoring” - buffet is monitoring our connectivity and will - re-enable bootstrapping if connectivity fails in - automatic mode. - - Note: more values may be added later to this list. - </tp:docstring> - </property> - <property name="GCDBootstrapState" type="s" access="read"> - <tp:docstring> - Contains one of the following values describing the state of GCD - bootstrapping: - “disabled” - GCD registration has been disabled in the config file. - “offline” - GCD registration is unknown because the device is offline. - “connecting” - GCD registration is unknown because the device is still - connecting to the cloud. - “waiting” - Waiting to be configured with GCD credentials. - “registering” - Registering the device with the GCD servers. - “online” - Device is online and registered with GCD servers. - - Note: more values may be added later to this list. - - Clients that wish to present a single linear bootstrapping flow to users - may treat GCD bootstrapping states as a suffix to WiFi bootstrapping - states. If we have no cloud connectivity, we cannot possibly do GCD - registration/credential verification. - </tp:docstring> - </property> - <property name="PairingInfo" type="a{sv}" access="read"> - <tp:docstring> - Describes the state of device pairing. While no pairing attempt is in - progress, this dictionary will be empty. When a client initiates a - pairing transaction via /privet/v3/pairing/start, dictionary will - contain the following keys: - “sessionId” - ID of the pairing session; generated by device - “pairingMode” - Selected type of pairing from /privet/v3/pairing/start - (e.g. “pinCode” or “embeddedCode”) - “code” - The pin code or embedded code as appropriate to the - “pairingMode” value. See design document. - This value will be a string. - </tp:docstring> - </property> - </interface> -</node>
diff --git a/buffet/dbus_command_dispatcher.cc b/buffet/dbus_command_dispatcher.cc deleted file mode 100644 index 1af0983..0000000 --- a/buffet/dbus_command_dispatcher.cc +++ /dev/null
@@ -1,39 +0,0 @@ -// Copyright 2014 The Chromium OS 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 "buffet/dbus_command_dispatcher.h" - -#include <chromeos/dbus/exported_object_manager.h> -#include <weave/command.h> - -#include "buffet/dbus_command_proxy.h" -#include "buffet/dbus_constants.h" - -using chromeos::dbus_utils::AsyncEventSequencer; -using chromeos::dbus_utils::ExportedObjectManager; - -namespace buffet { - -DBusCommandDispacher::DBusCommandDispacher( - const base::WeakPtr<ExportedObjectManager>& object_manager, - weave::Commands* command_manager) - : object_manager_{object_manager} { - command_manager->AddOnCommandAddedCallback(base::Bind( - &DBusCommandDispacher::OnCommandAdded, weak_ptr_factory_.GetWeakPtr())); -} - -void DBusCommandDispacher::OnCommandAdded(weave::Command* command) { - if (!object_manager_) - return; - std::unique_ptr<DBusCommandProxy> proxy{new DBusCommandProxy( - object_manager_.get(), object_manager_->GetBus(), command, - buffet::kCommandServicePathPrefix + std::to_string(++next_id_))}; - proxy->RegisterAsync(AsyncEventSequencer::GetDefaultCompletionAction()); - // DBusCommandProxy::DBusCommandProxy() subscribe itself to weave::Command - // notifications. When weave::Command is being destroyed it sends - // ::OnCommandDestroyed() and DBusCommandProxy deletes itself. - proxy.release(); -} - -} // namespace buffet
diff --git a/buffet/dbus_command_dispatcher.h b/buffet/dbus_command_dispatcher.h deleted file mode 100644 index fa17ad6..0000000 --- a/buffet/dbus_command_dispatcher.h +++ /dev/null
@@ -1,53 +0,0 @@ -// Copyright 2014 The Chromium OS 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 BUFFET_DBUS_COMMAND_DISPATCHER_H_ -#define BUFFET_DBUS_COMMAND_DISPATCHER_H_ - -#include <map> -#include <string> - -#include <base/macros.h> -#include <base/memory/weak_ptr.h> -#include <weave/commands.h> - -namespace chromeos { -namespace dbus_utils { -class ExportedObjectManager; -} // namespace dbus_utils -} // namespace chromeos - -namespace buffet { - -// Implements D-Bus dispatch of commands. When OnCommandAdded is called, -// DBusCommandDispacher creates an instance of DBusCommandProxy object and -// advertises it through ExportedObjectManager on D-Bus. Command handling -// processes can watch the new D-Bus object appear and communicate with it to -// update the command handling progress. Once command is handled, -// DBusCommandProxy::Done() is called and the command is removed from the -// command queue and D-Bus ExportedObjectManager. -class DBusCommandDispacher final { - public: - explicit DBusCommandDispacher( - const base::WeakPtr<chromeos::dbus_utils::ExportedObjectManager>& - object_manager, - weave::Commands* command_manager); - - private: - void OnCommandAdded(weave::Command* command); - - base::WeakPtr<chromeos::dbus_utils::ExportedObjectManager> object_manager_; - int next_id_{0}; - - // Default constructor is used in special circumstances such as for testing. - DBusCommandDispacher() = default; - - base::WeakPtrFactory<DBusCommandDispacher> weak_ptr_factory_{this}; - - DISALLOW_COPY_AND_ASSIGN(DBusCommandDispacher); -}; - -} // namespace buffet - -#endif // BUFFET_DBUS_COMMAND_DISPATCHER_H_
diff --git a/buffet/dbus_command_proxy.cc b/buffet/dbus_command_proxy.cc deleted file mode 100644 index 064c801..0000000 --- a/buffet/dbus_command_proxy.cc +++ /dev/null
@@ -1,105 +0,0 @@ -// Copyright 2014 The Chromium OS 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 "buffet/dbus_command_proxy.h" - -#include <chromeos/dbus/async_event_sequencer.h> -#include <chromeos/dbus/exported_object_manager.h> -#include <weave/enum_to_string.h> - -#include "buffet/dbus_conversion.h" - -using chromeos::dbus_utils::AsyncEventSequencer; -using chromeos::dbus_utils::ExportedObjectManager; - -namespace buffet { - -DBusCommandProxy::DBusCommandProxy(ExportedObjectManager* object_manager, - const scoped_refptr<dbus::Bus>& bus, - weave::Command* command, - std::string object_path) - : command_{command}, - dbus_object_{object_manager, bus, dbus::ObjectPath{object_path}} { - observer_.Add(command); -} - -void DBusCommandProxy::RegisterAsync( - const AsyncEventSequencer::CompletionAction& completion_callback) { - dbus_adaptor_.RegisterWithDBusObject(&dbus_object_); - - // Set the initial property values before registering the DBus object. - dbus_adaptor_.SetName(command_->GetName()); - dbus_adaptor_.SetCategory(command_->GetCategory()); - dbus_adaptor_.SetId(command_->GetID()); - dbus_adaptor_.SetStatus(EnumToString(command_->GetStatus())); - dbus_adaptor_.SetProgress( - DictionaryToDBusVariantDictionary(*command_->GetProgress())); - dbus_adaptor_.SetOrigin(EnumToString(command_->GetOrigin())); - dbus_adaptor_.SetParameters( - DictionaryToDBusVariantDictionary(*command_->GetParameters())); - dbus_adaptor_.SetResults( - DictionaryToDBusVariantDictionary(*command_->GetResults())); - - // Register the command DBus object and expose its methods and properties. - dbus_object_.RegisterAsync(completion_callback); -} - -void DBusCommandProxy::OnResultsChanged() { - dbus_adaptor_.SetResults( - DictionaryToDBusVariantDictionary(*command_->GetResults())); -} - -void DBusCommandProxy::OnStatusChanged() { - dbus_adaptor_.SetStatus(EnumToString(command_->GetStatus())); -} - -void DBusCommandProxy::OnProgressChanged() { - dbus_adaptor_.SetProgress( - DictionaryToDBusVariantDictionary(*command_->GetProgress())); -} - -void DBusCommandProxy::OnCommandDestroyed() { - delete this; -} - -bool DBusCommandProxy::SetProgress( - chromeos::ErrorPtr* error, - const chromeos::VariantDictionary& progress) { - LOG(INFO) << "Received call to Command<" << command_->GetName() - << ">::SetProgress()"; - auto dictionary = DictionaryFromDBusVariantDictionary(progress, error); - if (!dictionary) - return false; - return command_->SetProgress(*dictionary, error); -} - -bool DBusCommandProxy::SetResults(chromeos::ErrorPtr* error, - const chromeos::VariantDictionary& results) { - LOG(INFO) << "Received call to Command<" << command_->GetName() - << ">::SetResults()"; - auto dictionary = DictionaryFromDBusVariantDictionary(results, error); - if (!dictionary) - return false; - return command_->SetResults(*dictionary, error); -} - -void DBusCommandProxy::Abort() { - LOG(INFO) << "Received call to Command<" << command_->GetName() - << ">::Abort()"; - command_->Abort(); -} - -void DBusCommandProxy::Cancel() { - LOG(INFO) << "Received call to Command<" << command_->GetName() - << ">::Cancel()"; - command_->Cancel(); -} - -void DBusCommandProxy::Done() { - LOG(INFO) << "Received call to Command<" << command_->GetName() - << ">::Done()"; - command_->Done(); -} - -} // namespace buffet
diff --git a/buffet/dbus_command_proxy.h b/buffet/dbus_command_proxy.h deleted file mode 100644 index c13ee0a..0000000 --- a/buffet/dbus_command_proxy.h +++ /dev/null
@@ -1,72 +0,0 @@ -// Copyright 2014 The Chromium OS 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 BUFFET_DBUS_COMMAND_PROXY_H_ -#define BUFFET_DBUS_COMMAND_PROXY_H_ - -#include <string> - -#include <base/macros.h> -#include <base/scoped_observer.h> -#include <chromeos/dbus/data_serialization.h> -#include <chromeos/dbus/dbus_object.h> -#include <weave/command.h> - -#include "buffet/org.chromium.Buffet.Command.h" - -namespace chromeos { -namespace dbus_utils { -class ExportedObjectManager; -} // namespace dbus_utils -} // namespace chromeos - -namespace buffet { - -class DBusCommandProxy : public weave::Command::Observer, - public org::chromium::Buffet::CommandInterface { - public: - DBusCommandProxy(chromeos::dbus_utils::ExportedObjectManager* object_manager, - const scoped_refptr<dbus::Bus>& bus, - weave::Command* command, - std::string object_path); - ~DBusCommandProxy() override = default; - - void RegisterAsync( - const chromeos::dbus_utils::AsyncEventSequencer::CompletionAction& - completion_callback); - - // CommandProxyInterface implementation/overloads. - void OnResultsChanged() override; - void OnStatusChanged() override; - void OnProgressChanged() override; - void OnCommandDestroyed() override; - - private: - // Handles calls to org.chromium.Buffet.Command.SetProgress(progress). - bool SetProgress(chromeos::ErrorPtr* error, - const chromeos::VariantDictionary& progress) override; - // Handles calls to org.chromium.Buffet.Command.SetResults(results). - bool SetResults(chromeos::ErrorPtr* error, - const chromeos::VariantDictionary& results) override; - // Handles calls to org.chromium.Buffet.Command.Abort(). - void Abort() override; - // Handles calls to org.chromium.Buffet.Command.Cancel(). - void Cancel() override; - // Handles calls to org.chromium.Buffet.Command.Done(). - void Done() override; - - weave::Command* command_; - org::chromium::Buffet::CommandAdaptor dbus_adaptor_{this}; - chromeos::dbus_utils::DBusObject dbus_object_; - - ScopedObserver<weave::Command, weave::Command::Observer> observer_{this}; - - friend class DBusCommandProxyTest; - friend class DBusCommandDispacherTest; - DISALLOW_COPY_AND_ASSIGN(DBusCommandProxy); -}; - -} // namespace buffet - -#endif // BUFFET_DBUS_COMMAND_PROXY_H_
diff --git a/buffet/dbus_command_proxy_unittest.cc b/buffet/dbus_command_proxy_unittest.cc deleted file mode 100644 index 18dd8e0..0000000 --- a/buffet/dbus_command_proxy_unittest.cc +++ /dev/null
@@ -1,206 +0,0 @@ -// Copyright 2014 The Chromium OS 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 "buffet/dbus_command_proxy.h" - -#include <functional> -#include <memory> -#include <vector> - -#include <dbus/mock_bus.h> -#include <dbus/mock_exported_object.h> -#include <dbus/property.h> -#include <chromeos/dbus/dbus_object.h> -#include <chromeos/dbus/dbus_object_test_helpers.h> -#include <gtest/gtest.h> -#include <weave/command.h> -#include <weave/enum_to_string.h> -#include <weave/mock_command.h> -#include <weave/mock_commands.h> -#include <weave/unittest_utils.h> - -#include "buffet/dbus_constants.h" - -namespace buffet { - -using ::testing::AnyNumber; -using ::testing::Return; -using ::testing::ReturnRefOfCopy; -using ::testing::_; - -using chromeos::VariantDictionary; -using chromeos::dbus_utils::AsyncEventSequencer; -using weave::unittests::CreateDictionaryValue; -using weave::unittests::IsEqualValue; - -namespace { - -const char kTestCommandCategoty[] = "test_command_category"; -const char kTestCommandId[] = "cmd_1"; - -MATCHER_P(EqualToJson, json, "") { - auto json_value = CreateDictionaryValue(json); - return IsEqualValue(*json_value, arg); -} - -} // namespace - -class DBusCommandProxyTest : public ::testing::Test { - public: - void SetUp() override { - // Set up a mock DBus bus object. - dbus::Bus::Options options; - options.bus_type = dbus::Bus::SYSTEM; - bus_ = new dbus::MockBus(options); - // By default, don't worry about threading assertions. - EXPECT_CALL(*bus_, AssertOnOriginThread()).Times(AnyNumber()); - EXPECT_CALL(*bus_, AssertOnDBusThread()).Times(AnyNumber()); - - EXPECT_CALL(command_, GetID()) - .WillOnce(ReturnRefOfCopy<std::string>(kTestCommandId)); - // Use WillRepeatedly becase GetName is used for logging. - EXPECT_CALL(command_, GetName()) - .WillRepeatedly(ReturnRefOfCopy<std::string>("robot.jump")); - EXPECT_CALL(command_, GetCategory()) - .WillOnce(ReturnRefOfCopy<std::string>(kTestCommandCategoty)); - EXPECT_CALL(command_, GetStatus()) - .WillOnce(Return(weave::CommandStatus::kQueued)); - EXPECT_CALL(command_, GetOrigin()) - .WillOnce(Return(weave::CommandOrigin::kLocal)); - EXPECT_CALL(command_, MockGetParameters()) - .WillOnce(ReturnRefOfCopy<std::string>(R"({ - 'height': 53, - '_jumpType': '_withKick' - })")); - EXPECT_CALL(command_, MockGetProgress()) - .WillOnce(ReturnRefOfCopy<std::string>("{}")); - EXPECT_CALL(command_, MockGetResults()) - .WillOnce(ReturnRefOfCopy<std::string>("{}")); - - // Set up a mock ExportedObject to be used with the DBus command proxy. - std::string cmd_path = buffet::kCommandServicePathPrefix; - cmd_path += kTestCommandId; - const dbus::ObjectPath kCmdObjPath(cmd_path); - // Use a mock exported object for the exported object manager. - mock_exported_object_command_ = - new dbus::MockExportedObject(bus_.get(), kCmdObjPath); - EXPECT_CALL(*bus_, GetExportedObject(kCmdObjPath)) - .Times(AnyNumber()) - .WillRepeatedly(Return(mock_exported_object_command_.get())); - EXPECT_CALL(*mock_exported_object_command_, ExportMethod(_, _, _, _)) - .Times(AnyNumber()); - - proxy_.reset(new DBusCommandProxy(nullptr, bus_, &command_, cmd_path)); - GetCommandProxy()->RegisterAsync( - AsyncEventSequencer::GetDefaultCompletionAction()); - } - - void TearDown() override { - EXPECT_CALL(*mock_exported_object_command_, Unregister()).Times(1); - bus_ = nullptr; - } - - DBusCommandProxy* GetCommandProxy() const { return proxy_.get(); } - - org::chromium::Buffet::CommandAdaptor* GetCommandAdaptor() const { - return &GetCommandProxy()->dbus_adaptor_; - } - - org::chromium::Buffet::CommandInterface* GetCommandInterface() const { - // DBusCommandProxy also implements CommandInterface. - return GetCommandProxy(); - } - - weave::CommandStatus GetCommandStatus() const { - weave::CommandStatus status; - EXPECT_TRUE(StringToEnum(GetCommandAdaptor()->GetStatus(), &status)); - return status; - } - - scoped_refptr<dbus::MockExportedObject> mock_exported_object_command_; - scoped_refptr<dbus::MockBus> bus_; - - weave::unittests::MockCommand command_; - std::unique_ptr<DBusCommandProxy> proxy_; -}; - -TEST_F(DBusCommandProxyTest, Init) { - VariantDictionary params = { - {"height", int32_t{53}}, {"_jumpType", std::string{"_withKick"}}, - }; - EXPECT_EQ(weave::CommandStatus::kQueued, GetCommandStatus()); - EXPECT_EQ(params, GetCommandAdaptor()->GetParameters()); - EXPECT_EQ(VariantDictionary{}, GetCommandAdaptor()->GetProgress()); - EXPECT_EQ(VariantDictionary{}, GetCommandAdaptor()->GetResults()); - EXPECT_EQ("robot.jump", GetCommandAdaptor()->GetName()); - EXPECT_EQ(kTestCommandCategoty, GetCommandAdaptor()->GetCategory()); - EXPECT_EQ(kTestCommandId, GetCommandAdaptor()->GetId()); -} - -TEST_F(DBusCommandProxyTest, OnProgressChanged) { - EXPECT_CALL(*mock_exported_object_command_, SendSignal(_)).Times(1); - EXPECT_CALL(command_, MockGetProgress()) - .WillOnce(ReturnRefOfCopy<std::string>("{'progress': 10}")); - proxy_->OnProgressChanged(); - EXPECT_EQ((VariantDictionary{{"progress", int32_t{10}}}), - GetCommandAdaptor()->GetProgress()); -} - -TEST_F(DBusCommandProxyTest, OnResultsChanged) { - EXPECT_CALL(*mock_exported_object_command_, SendSignal(_)).Times(1); - EXPECT_CALL(command_, MockGetResults()) - .WillOnce(ReturnRefOfCopy<std::string>( - "{'foo': 42, 'bar': 'foobar', 'resultList': [1, 2, 3]}")); - proxy_->OnResultsChanged(); - - EXPECT_EQ((VariantDictionary{{"foo", int32_t{42}}, - {"bar", std::string{"foobar"}}, - {"resultList", std::vector<int>{1, 2, 3}}}), - GetCommandAdaptor()->GetResults()); -} - -TEST_F(DBusCommandProxyTest, OnStatusChanged) { - EXPECT_CALL(*mock_exported_object_command_, SendSignal(_)).Times(1); - EXPECT_CALL(command_, GetStatus()) - .WillOnce(Return(weave::CommandStatus::kInProgress)); - proxy_->OnStatusChanged(); - EXPECT_EQ(weave::CommandStatus::kInProgress, GetCommandStatus()); -} - -TEST_F(DBusCommandProxyTest, SetProgress) { - EXPECT_CALL(command_, SetProgress(EqualToJson("{'progress': 10}"), _)) - .WillOnce(Return(true)); - EXPECT_TRUE( - GetCommandInterface()->SetProgress(nullptr, {{"progress", int32_t{10}}})); -} - -TEST_F(DBusCommandProxyTest, SetResults) { - EXPECT_CALL( - command_, - SetResults( - EqualToJson("{'foo': 42, 'bar': 'foobar', 'resultList': [1, 2, 3]}"), - _)) - .WillOnce(Return(true)); - EXPECT_TRUE(GetCommandInterface()->SetResults( - nullptr, VariantDictionary{{"foo", int32_t{42}}, - {"bar", std::string{"foobar"}}, - {"resultList", std::vector<int>{1, 2, 3}}})); -} - -TEST_F(DBusCommandProxyTest, Abort) { - EXPECT_CALL(command_, Abort()); - GetCommandInterface()->Abort(); -} - -TEST_F(DBusCommandProxyTest, Cancel) { - EXPECT_CALL(command_, Cancel()); - GetCommandInterface()->Cancel(); -} - -TEST_F(DBusCommandProxyTest, Done) { - EXPECT_CALL(command_, Done()); - GetCommandInterface()->Done(); -} - -} // namespace buffet
diff --git a/buffet/dbus_constants.cc b/buffet/dbus_constants.cc deleted file mode 100644 index 6ab587a..0000000 --- a/buffet/dbus_constants.cc +++ /dev/null
@@ -1,13 +0,0 @@ -// Copyright 2014 The Chromium OS 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 "buffet/dbus_constants.h" - -namespace buffet { - -const char kServiceName[] = "org.chromium.Buffet"; -const char kRootServicePath[] = "/org/chromium/Buffet"; -const char kCommandServicePathPrefix[] = "/org/chromium/Buffet/commands/"; - -} // namespace buffet
diff --git a/buffet/dbus_constants.h b/buffet/dbus_constants.h deleted file mode 100644 index 0bb72dc..0000000 --- a/buffet/dbus_constants.h +++ /dev/null
@@ -1,21 +0,0 @@ -// Copyright 2014 The Chromium OS 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 BUFFET_DBUS_CONSTANTS_H_ -#define BUFFET_DBUS_CONSTANTS_H_ - -namespace buffet { - -// The service name claimed by the Buffet daemon. -extern const char kServiceName[]; - -// The object at this path implements the ObjectManager interface. -extern const char kRootServicePath[]; - -// D-Bus object path prefix for Command objects. -extern const char kCommandServicePathPrefix[]; - -} // namespace buffet - -#endif // BUFFET_DBUS_CONSTANTS_H_
diff --git a/buffet/dbus_conversion.cc b/buffet/dbus_conversion.cc deleted file mode 100644 index 51d35f1..0000000 --- a/buffet/dbus_conversion.cc +++ /dev/null
@@ -1,246 +0,0 @@ -// Copyright 2015 The Chromium OS 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 "buffet/dbus_conversion.h" - -#include <set> -#include <string> -#include <vector> - -#include <chromeos/type_name_undecorate.h> - -namespace buffet { - -namespace { - -// Helpers for JsonToAny(). -template <typename T> -chromeos::Any ValueToAny(const base::Value& json, - bool (base::Value::*fnc)(T*) const) { - T val; - CHECK((json.*fnc)(&val)); - return val; -} - -chromeos::Any ValueToAny(const base::Value& json); - -template <typename T> -chromeos::Any ListToAny(const base::ListValue& list, - bool (base::Value::*fnc)(T*) const) { - std::vector<T> result; - result.reserve(list.GetSize()); - for (const base::Value* v : list) { - T val; - CHECK((v->*fnc)(&val)); - result.push_back(val); - } - return result; -} - -chromeos::Any DictListToAny(const base::ListValue& list) { - std::vector<chromeos::VariantDictionary> result; - result.reserve(list.GetSize()); - for (const base::Value* v : list) { - const base::DictionaryValue* dict = nullptr; - CHECK(v->GetAsDictionary(&dict)); - result.push_back(DictionaryToDBusVariantDictionary(*dict)); - } - return result; -} - -chromeos::Any ListListToAny(const base::ListValue& list) { - std::vector<chromeos::Any> result; - result.reserve(list.GetSize()); - for (const base::Value* v : list) - result.push_back(ValueToAny(*v)); - return result; -} - -// Converts a JSON value into an Any so it can be sent over D-Bus using -// UpdateState D-Bus method from Buffet. -chromeos::Any ValueToAny(const base::Value& json) { - chromeos::Any prop_value; - switch (json.GetType()) { - case base::Value::TYPE_BOOLEAN: - prop_value = ValueToAny<bool>(json, &base::Value::GetAsBoolean); - break; - case base::Value::TYPE_INTEGER: - prop_value = ValueToAny<int>(json, &base::Value::GetAsInteger); - break; - case base::Value::TYPE_DOUBLE: - prop_value = ValueToAny<double>(json, &base::Value::GetAsDouble); - break; - case base::Value::TYPE_STRING: - prop_value = ValueToAny<std::string>(json, &base::Value::GetAsString); - break; - case base::Value::TYPE_DICTIONARY: { - const base::DictionaryValue* dict = nullptr; - CHECK(json.GetAsDictionary(&dict)); - prop_value = DictionaryToDBusVariantDictionary(*dict); - break; - } - case base::Value::TYPE_LIST: { - const base::ListValue* list = nullptr; - CHECK(json.GetAsList(&list)); - if (list->empty()) { - // We don't know type of objects this list intended for, so we just use - // vector<chromeos::Any>. - prop_value = ListListToAny(*list); - break; - } - auto type = (*list->begin())->GetType(); - for (const base::Value* v : *list) - CHECK_EQ(v->GetType(), type) << "Unsupported different type elements"; - - switch (type) { - case base::Value::TYPE_BOOLEAN: - prop_value = ListToAny<bool>(*list, &base::Value::GetAsBoolean); - break; - case base::Value::TYPE_INTEGER: - prop_value = ListToAny<int>(*list, &base::Value::GetAsInteger); - break; - case base::Value::TYPE_DOUBLE: - prop_value = ListToAny<double>(*list, &base::Value::GetAsDouble); - break; - case base::Value::TYPE_STRING: - prop_value = ListToAny<std::string>(*list, &base::Value::GetAsString); - break; - case base::Value::TYPE_DICTIONARY: - prop_value = DictListToAny(*list); - break; - case base::Value::TYPE_LIST: - // We can't support Any{vector<vector<>>} as the type is only known - // in runtime when we need to instantiate templates in compile time. - // We can use Any{vector<Any>} instead. - prop_value = ListListToAny(*list); - break; - default: - LOG(FATAL) << "Unsupported JSON value type for list element: " - << (*list->begin())->GetType(); - } - break; - } - default: - LOG(FATAL) << "Unexpected JSON value type: " << json.GetType(); - break; - } - return prop_value; -} - -template <typename T> -std::unique_ptr<base::Value> CreateValue(const T& value, - chromeos::ErrorPtr* error) { - return std::unique_ptr<base::Value>{new base::FundamentalValue{value}}; -} - -template <> -std::unique_ptr<base::Value> CreateValue<std::string>( - const std::string& value, - chromeos::ErrorPtr* error) { - return std::unique_ptr<base::Value>{new base::StringValue{value}}; -} - -template <> -std::unique_ptr<base::Value> CreateValue<chromeos::VariantDictionary>( - const chromeos::VariantDictionary& value, - chromeos::ErrorPtr* error) { - return DictionaryFromDBusVariantDictionary(value, error); -} - -template <typename T> -std::unique_ptr<base::ListValue> CreateListValue(const std::vector<T>& value, - chromeos::ErrorPtr* error) { - std::unique_ptr<base::ListValue> list{new base::ListValue}; - - for (const T& i : value) { - auto item = CreateValue(i, error); - if (!item) - return nullptr; - list->Append(item.release()); - } - - return list; -} - -// Returns false only in case of error. True can be returned if type is not -// matched. -template <typename T> -bool TryCreateValue(const chromeos::Any& any, - std::unique_ptr<base::Value>* value, - chromeos::ErrorPtr* error) { - if (any.IsTypeCompatible<T>()) { - *value = CreateValue(any.Get<T>(), error); - return *value != nullptr; - } - - if (any.IsTypeCompatible<std::vector<T>>()) { - *value = CreateListValue(any.Get<std::vector<T>>(), error); - return *value != nullptr; - } - - return true; // Not an error, we will try different type. -} - -template <> -std::unique_ptr<base::Value> CreateValue<chromeos::Any>( - const chromeos::Any& any, - chromeos::ErrorPtr* error) { - std::unique_ptr<base::Value> result; - if (!TryCreateValue<bool>(any, &result, error) || result) - return result; - - if (!TryCreateValue<int>(any, &result, error) || result) - return result; - - if (!TryCreateValue<double>(any, &result, error) || result) - return result; - - if (!TryCreateValue<std::string>(any, &result, error) || result) - return result; - - if (!TryCreateValue<chromeos::VariantDictionary>(any, &result, error) || - result) { - return result; - } - - // This will collapse Any{Any{T}} and vector{Any{T}}. - if (!TryCreateValue<chromeos::Any>(any, &result, error) || result) - return result; - - chromeos::Error::AddToPrintf( - error, FROM_HERE, "buffet", "unknown_type", "Type '%s' is not supported.", - chromeos::UndecorateTypeName(any.GetType().name()).c_str()); - - return nullptr; -} - -} // namespace - -// TODO(vitalybuka): Use in buffet_client. -chromeos::VariantDictionary DictionaryToDBusVariantDictionary( - const base::DictionaryValue& object) { - chromeos::VariantDictionary result; - - for (base::DictionaryValue::Iterator it(object); !it.IsAtEnd(); it.Advance()) - result.emplace(it.key(), ValueToAny(it.value())); - - return result; -} - -std::unique_ptr<base::DictionaryValue> DictionaryFromDBusVariantDictionary( - const chromeos::VariantDictionary& object, - chromeos::ErrorPtr* error) { - std::unique_ptr<base::DictionaryValue> result{new base::DictionaryValue}; - - for (const auto& pair : object) { - auto value = CreateValue(pair.second, error); - if (!value) - return nullptr; - result->SetWithoutPathExpansion(pair.first, value.release()); - } - - return result; -} - -} // namespace buffet
diff --git a/buffet/dbus_conversion.h b/buffet/dbus_conversion.h deleted file mode 100644 index 20c3f58..0000000 --- a/buffet/dbus_conversion.h +++ /dev/null
@@ -1,26 +0,0 @@ -// Copyright 2015 The Chromium OS 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 BUFFET_DBUS_CONVERSION_H_ -#define BUFFET_DBUS_CONVERSION_H_ - -#include <base/values.h> -#include <chromeos/any.h> -#include <chromeos/errors/error.h> -#include <chromeos/variant_dictionary.h> - -namespace buffet { - -// Converts DictionaryValue to D-Bus variant dictionary. -chromeos::VariantDictionary DictionaryToDBusVariantDictionary( - const base::DictionaryValue& object); - -// Converts D-Bus variant dictionary to DictionaryValue. -std::unique_ptr<base::DictionaryValue> DictionaryFromDBusVariantDictionary( - const chromeos::VariantDictionary& object, - chromeos::ErrorPtr* error); - -} // namespace buffet - -#endif // BUFFET_DBUS_CONVERSION_H_
diff --git a/buffet/dbus_conversion_unittest.cc b/buffet/dbus_conversion_unittest.cc deleted file mode 100644 index 0d94576..0000000 --- a/buffet/dbus_conversion_unittest.cc +++ /dev/null
@@ -1,187 +0,0 @@ -// Copyright 2015 The Chromium OS 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 "buffet/dbus_conversion.h" - -#include <limits> -#include <memory> -#include <string> -#include <vector> - -#include <base/guid.h> -#include <base/rand_util.h> -#include <base/values.h> -#include <chromeos/variant_dictionary.h> -#include <gtest/gtest.h> -#include <weave/unittest_utils.h> - -namespace buffet { - -namespace { - -using chromeos::Any; -using chromeos::VariantDictionary; -using weave::unittests::CreateDictionaryValue; -using weave::unittests::IsEqualValue; - -chromeos::VariantDictionary ToDBus(const base::DictionaryValue& object) { - return DictionaryToDBusVariantDictionary(object); -} - -std::unique_ptr<base::DictionaryValue> FromDBus( - const chromeos::VariantDictionary& object) { - chromeos::ErrorPtr error; - auto result = DictionaryFromDBusVariantDictionary(object, &error); - EXPECT_TRUE(result || error); - return result; -} - -std::unique_ptr<base::Value> CreateRandomValue(int children); -std::unique_ptr<base::Value> CreateRandomValue(int children, - base::Value::Type type); - -const base::Value::Type kRandomTypes[] = { - base::Value::TYPE_BOOLEAN, base::Value::TYPE_INTEGER, - base::Value::TYPE_DOUBLE, base::Value::TYPE_STRING, - base::Value::TYPE_DICTIONARY, base::Value::TYPE_LIST, -}; - -const base::Value::Type kRandomTypesWithChildren[] = { - base::Value::TYPE_DICTIONARY, base::Value::TYPE_LIST, -}; - -base::Value::Type CreateRandomValueType(bool with_children) { - if (with_children) { - return kRandomTypesWithChildren[base::RandInt( - 0, arraysize(kRandomTypesWithChildren) - 1)]; - } - return kRandomTypes[base::RandInt(0, arraysize(kRandomTypes) - 1)]; -} - -std::unique_ptr<base::DictionaryValue> CreateRandomDictionary(int children) { - std::unique_ptr<base::DictionaryValue> result{new base::DictionaryValue}; - - while (children > 0) { - int sub_children = base::RandInt(1, children); - children -= sub_children; - result->Set(base::GenerateGUID(), - CreateRandomValue(sub_children).release()); - } - - return result; -} - -std::unique_ptr<base::ListValue> CreateRandomList(int children) { - std::unique_ptr<base::ListValue> result{new base::ListValue}; - - base::Value::Type type = CreateRandomValueType(children > 0); - while (children > 0) { - size_t max_children = - (type != base::Value::TYPE_DICTIONARY && type != base::Value::TYPE_LIST) - ? 1 - : children; - size_t sub_children = base::RandInt(1, max_children); - children -= sub_children; - result->Append(CreateRandomValue(sub_children, type).release()); - } - - return result; -} - -std::unique_ptr<base::Value> CreateRandomValue(int children, - base::Value::Type type) { - CHECK_GE(children, 1); - switch (type) { - case base::Value::TYPE_INTEGER: - return std::unique_ptr<base::Value>{new base::FundamentalValue{ - base::RandInt(std::numeric_limits<int>::min(), - std::numeric_limits<int>::max())}}; - case base::Value::TYPE_DOUBLE: - return std::unique_ptr<base::Value>{ - new base::FundamentalValue{base::RandDouble()}}; - case base::Value::TYPE_STRING: - return std::unique_ptr<base::Value>{ - new base::StringValue{base::GenerateGUID()}}; - case base::Value::TYPE_DICTIONARY: - CHECK_GE(children, 1); - return CreateRandomDictionary(children - 1); - case base::Value::TYPE_LIST: - CHECK_GE(children, 1); - return CreateRandomList(children - 1); - default: - return std::unique_ptr<base::Value>{ - new base::FundamentalValue{base::RandInt(0, 1) != 0}}; - } -} - -std::unique_ptr<base::Value> CreateRandomValue(int children) { - return CreateRandomValue(children, CreateRandomValueType(children > 0)); -} - -} // namespace - -TEST(DBusConversionTest, DictionaryToDBusVariantDictionary) { - EXPECT_EQ((VariantDictionary{{"bool", true}}), - ToDBus(*CreateDictionaryValue("{'bool': true}"))); - EXPECT_EQ((VariantDictionary{{"int", 5}}), - ToDBus(*CreateDictionaryValue("{'int': 5}"))); - EXPECT_EQ((VariantDictionary{{"double", 6.7}}), - ToDBus(*CreateDictionaryValue("{'double': 6.7}"))); - EXPECT_EQ((VariantDictionary{{"string", std::string{"abc"}}}), - ToDBus(*CreateDictionaryValue("{'string': 'abc'}"))); - EXPECT_EQ((VariantDictionary{{"object", VariantDictionary{{"bool", true}}}}), - ToDBus(*CreateDictionaryValue("{'object': {'bool': true}}"))); - EXPECT_EQ((VariantDictionary{{"emptyList", std::vector<Any>{}}}), - ToDBus(*CreateDictionaryValue("{'emptyList': []}"))); - EXPECT_EQ((VariantDictionary{{"intList", std::vector<int>{5}}}), - ToDBus(*CreateDictionaryValue("{'intList': [5]}"))); - EXPECT_EQ((VariantDictionary{ - {"intListList", std::vector<Any>{std::vector<int>{5}, - std::vector<int>{6, 7}}}}), - ToDBus(*CreateDictionaryValue("{'intListList': [[5], [6, 7]]}"))); - EXPECT_EQ((VariantDictionary{{"objList", - std::vector<VariantDictionary>{ - {{"string", std::string{"abc"}}}}}}), - ToDBus(*CreateDictionaryValue("{'objList': [{'string': 'abc'}]}"))); -} - -TEST(DBusConversionTest, DictionaryFromDBusVariantDictionary) { - EXPECT_JSON_EQ("{'bool': true}", *FromDBus({{"bool", true}})); - EXPECT_JSON_EQ("{'int': 5}", *FromDBus({{"int", 5}})); - EXPECT_JSON_EQ("{'double': 6.7}", *FromDBus({{"double", 6.7}})); - EXPECT_JSON_EQ("{'string': 'abc'}", - *FromDBus({{"string", std::string{"abc"}}})); - EXPECT_JSON_EQ("{'object': {'bool': true}}", - *FromDBus({{"object", VariantDictionary{{"bool", true}}}})); - EXPECT_JSON_EQ("{'emptyList': []}", - *FromDBus({{"emptyList", std::vector<bool>{}}})); - EXPECT_JSON_EQ("{'intList': [5]}", - *FromDBus({{"intList", std::vector<int>{5}}})); - EXPECT_JSON_EQ( - "{'intListList': [[5], [6, 7]]}", - *FromDBus({{"intListList", std::vector<Any>{std::vector<int>{5}, - std::vector<int>{6, 7}}}})); - EXPECT_JSON_EQ( - "{'objList': [{'string': 'abc'}]}", - *FromDBus({{"objList", std::vector<VariantDictionary>{ - {{"string", std::string{"abc"}}}}}})); - EXPECT_JSON_EQ("{'int': 5}", *FromDBus({{"int", Any{Any{5}}}})); -} - -TEST(DBusConversionTest, DictionaryFromDBusVariantDictionary_Errors) { - EXPECT_FALSE(FromDBus({{"cString", "abc"}})); - EXPECT_FALSE(FromDBus({{"float", 1.0f}})); - EXPECT_FALSE(FromDBus({{"listList", std::vector<std::vector<int>>{}}})); - EXPECT_FALSE(FromDBus({{"any", Any{}}})); - EXPECT_FALSE(FromDBus({{"null", nullptr}})); -} - -TEST(DBusConversionTest, DBusRandomDictionaryConversion) { - auto dict = CreateRandomDictionary(10000); - auto varian_dict = ToDBus(*dict); - auto dict_restored = FromDBus(varian_dict); - EXPECT_PRED2(IsEqualValue, *dict, *dict_restored); -} - -} // namespace buffet
diff --git a/buffet/etc/buffet/base_state.defaults.json b/buffet/etc/buffet/base_state.defaults.json deleted file mode 100644 index 166f2f1..0000000 --- a/buffet/etc/buffet/base_state.defaults.json +++ /dev/null
@@ -1,8 +0,0 @@ -{ - "base": { - "firmwareVersion": "", - "localDiscoveryEnabled": false, - "localAnonymousAccessMaxRole": "none", - "localPairingEnabled": false - } -}
diff --git a/buffet/etc/buffet/base_state.schema.json b/buffet/etc/buffet/base_state.schema.json deleted file mode 100644 index 19cc9b2..0000000 --- a/buffet/etc/buffet/base_state.schema.json +++ /dev/null
@@ -1,13 +0,0 @@ -{ - "base": { - "firmwareVersion": "string", - "localDiscoveryEnabled": "boolean", - "localAnonymousAccessMaxRole": [ "none", "viewer", "user" ], - "localPairingEnabled": "boolean", - "network": { - "properties": { - "name": "string" - } - } - } -}
diff --git a/buffet/etc/buffet/commands/buffet.json b/buffet/etc/buffet/commands/buffet.json deleted file mode 100644 index 4196a22..0000000 --- a/buffet/etc/buffet/commands/buffet.json +++ /dev/null
@@ -1,6 +0,0 @@ -{ - "base": { - "updateBaseConfiguration": { }, - "updateDeviceInfo": { } - } -}
diff --git a/buffet/etc/buffet/commands/test.json b/buffet/etc/buffet/commands/test.json deleted file mode 100644 index 911d8f0..0000000 --- a/buffet/etc/buffet/commands/test.json +++ /dev/null
@@ -1,17 +0,0 @@ -{ - "base": { - "_jump": { - "parameters": { - "_height": "integer" - }, - "progress": { - "progress": { - "type": "integer", - "minimum": 0, - "maximum": 100, - "isRequired": true - } - } - } - } -}
diff --git a/buffet/etc/buffet/gcd.json b/buffet/etc/buffet/gcd.json deleted file mode 100644 index 368704e..0000000 --- a/buffet/etc/buffet/gcd.json +++ /dev/null
@@ -1,35 +0,0 @@ -{ - "base": { - "updateBaseConfiguration": { - "minimalRole": "manager", - "parameters": { - "localDiscoveryEnabled": "boolean", - "localAnonymousAccessMaxRole": [ "none", "viewer", "user" ], - "localPairingEnabled": "boolean" - }, - "results": {} - }, - - "reboot": { - "minimalRole": "user", - "parameters": {}, - "results": {} - }, - - "identify": { - "minimalRole": "user", - "parameters": {}, - "results": {} - }, - - "updateDeviceInfo": { - "minimalRole": "manager", - "parameters": { - "description": "string", - "name": "string", - "location": "string" - }, - "results": {} - } - } -}
diff --git a/buffet/etc/dbus-1/org.chromium.Buffet.conf b/buffet/etc/dbus-1/org.chromium.Buffet.conf deleted file mode 100644 index 23a4ffc..0000000 --- a/buffet/etc/dbus-1/org.chromium.Buffet.conf +++ /dev/null
@@ -1,21 +0,0 @@ -<!DOCTYPE busconfig PUBLIC - "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN" - "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd"> -<busconfig> - <policy user="root"> - <allow send_destination="org.chromium.Buffet" /> - </policy> - - <policy group="buffet"> - <allow send_destination="org.chromium.Buffet" /> - </policy> - - <policy user="buffet"> - <allow own="org.chromium.Buffet" /> - </policy> - - <policy user="webservd"> - <allow send_destination="org.chromium.Buffet" - send_interface="org.chromium.WebServer.RequestHandler"/> - </policy> -</busconfig>
diff --git a/buffet/etc/init/buffet.conf b/buffet/etc/init/buffet.conf deleted file mode 100644 index 6948605..0000000 --- a/buffet/etc/init/buffet.conf +++ /dev/null
@@ -1,44 +0,0 @@ -# Copyright 2014 The Chromium OS Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -description "Brillo Buffet Service" -author "chromium-os-dev@chromium.org" - -start on starting system-services -stop on stopping system-services -respawn - -env BUFFET_LOG_LEVEL=0 -env BUFFET_ENABLE_XMPP= -env BUFFET_STATE_PATH= -env BUFFET_CONFIG_PATH= -env BUFFET_ENABLE_PING=false -env BUFFET_DEVICE_WHITELIST= -env BUFFET_DISABLE_PRIVET=false -env BUFFET_TEST_DEFINITIONS_PATH= -env BUFFET_DISABLE_SECURITY=false -env BUFFET_TEST_PRIVET_SSID= - -pre-start script - mkdir -m 0755 -p /var/lib/buffet - chown -R buffet:buffet /var/lib/buffet -end script - -# Minijail actually forks off our desired process. -expect fork - -exec minijail0 -i -g buffet -u buffet /usr/bin/buffet \ - --v="${BUFFET_LOG_LEVEL}" \ - --config_path="${BUFFET_CONFIG_PATH}" \ - --state_path="${BUFFET_STATE_PATH}" \ - --disable_security="${BUFFET_DISABLE_SECURITY}" \ - --enable_ping="${BUFFET_ENABLE_PING}" \ - --device_whitelist="${BUFFET_DEVICE_WHITELIST}" \ - --disable_privet="${BUFFET_DISABLE_PRIVET}" \ - --test_definitions_path="${BUFFET_TEST_DEFINITIONS_PATH}" \ - --enable_xmpp="${BUFFET_ENABLE_XMPP}" \ - --test_privet_ssid="${BUFFET_TEST_PRIVET_SSID}" - -# Wait for daemon to claim its D-Bus name before transitioning to started. -post-start exec gdbus wait --system --timeout 30 org.chromium.Buffet
diff --git a/buffet/main.cc b/buffet/main.cc deleted file mode 100644 index 276e030..0000000 --- a/buffet/main.cc +++ /dev/null
@@ -1,107 +0,0 @@ -// Copyright 2014 The Chromium OS 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 <string> - -#include <base/files/file_path.h> -#include <chromeos/dbus/async_event_sequencer.h> -#include <chromeos/dbus/exported_object_manager.h> -#include <chromeos/daemons/dbus_daemon.h> -#include <chromeos/flag_helper.h> -#include <chromeos/strings/string_utils.h> -#include <chromeos/syslog_logging.h> - -#include "buffet/dbus_constants.h" -#include "buffet/manager.h" - -using chromeos::dbus_utils::AsyncEventSequencer; -using chromeos::DBusServiceDaemon; -using buffet::kServiceName; -using buffet::kRootServicePath; - -namespace buffet { - -class Daemon final : public DBusServiceDaemon { - public: - Daemon(const weave::Device::Options& options, - const std::set<std::string>& device_whitelist) - : DBusServiceDaemon(kServiceName, kRootServicePath), - options_{options}, - device_whitelist_{device_whitelist} {} - - protected: - void RegisterDBusObjectsAsync(AsyncEventSequencer* sequencer) override { - manager_.reset(new buffet::Manager(object_manager_->AsWeakPtr())); - manager_->Start(options_, device_whitelist_, sequencer); - } - - void OnShutdown(int* return_code) override { manager_->Stop(); } - - private: - weave::Device::Options options_; - std::set<std::string> device_whitelist_; - - std::unique_ptr<buffet::Manager> manager_; - DISALLOW_COPY_AND_ASSIGN(Daemon); -}; - -} // namespace buffet - -namespace { - -const char kDefaultConfigFilePath[] = "/etc/buffet/buffet.conf"; -const char kDefaultStateFilePath[] = "/var/lib/buffet/device_reg_info"; - -} // namespace - -int main(int argc, char* argv[]) { - DEFINE_bool(log_to_stderr, false, "log trace messages to stderr as well"); - DEFINE_string(config_path, kDefaultConfigFilePath, - "Path to file containing config information."); - DEFINE_string(state_path, kDefaultStateFilePath, - "Path to file containing state information."); - DEFINE_bool(enable_xmpp, true, - "Connect to GCD via a persistent XMPP connection."); - DEFINE_bool(disable_privet, false, "disable Privet protocol"); - DEFINE_bool(enable_ping, false, "enable test HTTP handler at /privet/ping"); - DEFINE_string(device_whitelist, "", - "Comma separated list of network interfaces to monitor for " - "connectivity (an empty list enables all interfaces)."); - - DEFINE_bool(disable_security, false, - "disable Privet security for tests. For test only."); - DEFINE_string(test_privet_ssid, "", - "Fixed SSID for WiFi bootstrapping. For test only."); - DEFINE_string(test_definitions_path, "", - "Path to directory containing additional command " - "and state definitions. For test only."); - - chromeos::FlagHelper::Init(argc, argv, "Privet protocol handler daemon"); - if (FLAGS_config_path.empty()) - FLAGS_config_path = kDefaultConfigFilePath; - if (FLAGS_state_path.empty()) - FLAGS_state_path = kDefaultStateFilePath; - int flags = chromeos::kLogToSyslog | chromeos::kLogHeader; - if (FLAGS_log_to_stderr) - flags |= chromeos::kLogToStderr; - chromeos::InitLog(flags); - - auto device_whitelist = - chromeos::string_utils::Split(FLAGS_device_whitelist, ",", true, true); - - weave::Device::Options options; - options.config_path = base::FilePath{FLAGS_config_path}; - options.state_path = base::FilePath{FLAGS_state_path}; - options.definitions_path = base::FilePath{"/etc/buffet"}; - options.test_definitions_path = base::FilePath{FLAGS_test_definitions_path}; - options.xmpp_enabled = FLAGS_enable_xmpp; - options.disable_privet = FLAGS_disable_privet; - options.disable_security = FLAGS_disable_security; - options.enable_ping = FLAGS_enable_ping; - options.test_privet_ssid = FLAGS_test_privet_ssid; - - buffet::Daemon daemon{options, std::set<std::string>{device_whitelist.begin(), - device_whitelist.end()}}; - return daemon.Run(); -}
diff --git a/buffet/manager.cc b/buffet/manager.cc deleted file mode 100644 index cc83686..0000000 --- a/buffet/manager.cc +++ /dev/null
@@ -1,324 +0,0 @@ -// Copyright 2014 The Chromium OS 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 "buffet/manager.h" - -#include <map> -#include <set> -#include <string> - -#include <base/bind.h> -#include <base/bind_helpers.h> -#include <base/json/json_reader.h> -#include <base/json/json_writer.h> -#include <base/message_loop/message_loop.h> -#include <base/time/time.h> -#include <chromeos/dbus/async_event_sequencer.h> -#include <chromeos/dbus/exported_object_manager.h> -#include <chromeos/errors/error.h> -#include <chromeos/http/http_transport.h> -#include <chromeos/key_value_store.h> -#include <dbus/bus.h> -#include <dbus/object_path.h> -#include <dbus/values_util.h> -#include <weave/enum_to_string.h> - -#include "buffet/dbus_command_dispatcher.h" -#include "buffet/dbus_conversion.h" -#include "buffet/peerd_client.h" -#include "buffet/shill_client.h" -#include "buffet/webserv_client.h" - -using chromeos::dbus_utils::AsyncEventSequencer; -using chromeos::dbus_utils::ExportedObjectManager; - -namespace buffet { - -namespace { - -const char kPairingSessionIdKey[] = "sessionId"; -const char kPairingModeKey[] = "mode"; -const char kPairingCodeKey[] = "code"; - -const char kErrorDomain[] = "buffet"; -const char kNotImplemented[] = "notImplemented"; - -} // anonymous namespace - -Manager::Manager(const base::WeakPtr<ExportedObjectManager>& object_manager) - : dbus_object_(object_manager.get(), - object_manager->GetBus(), - org::chromium::Buffet::ManagerAdaptor::GetObjectPath()) { -} - -Manager::~Manager() { -} - -void Manager::Start(const weave::Device::Options& options, - const std::set<std::string>& device_whitelist, - AsyncEventSequencer* sequencer) { - shill_client_.reset(new ShillClient{dbus_object_.GetBus(), device_whitelist}); - if (!options.disable_privet) { - peerd_client_.reset(new PeerdClient{dbus_object_.GetBus()}); - web_serv_client_.reset(new WebServClient{dbus_object_.GetBus(), sequencer}); - } - - device_ = weave::Device::Create(); - device_->Start(options, shill_client_.get(), peerd_client_.get(), - web_serv_client_.get()); - - command_dispatcher_.reset(new DBusCommandDispacher{ - dbus_object_.GetObjectManager(), device_->GetCommands()}); - - device_->GetState()->AddOnChangedCallback( - base::Bind(&Manager::OnStateChanged, weak_ptr_factory_.GetWeakPtr())); - - device_->GetConfig()->AddOnChangedCallback( - base::Bind(&Manager::OnConfigChanged, weak_ptr_factory_.GetWeakPtr())); - - device_->GetCloud()->AddOnRegistrationChangedCallback(base::Bind( - &Manager::OnRegistrationChanged, weak_ptr_factory_.GetWeakPtr())); - - if (device_->GetPrivet()) { - device_->GetPrivet()->AddOnWifiSetupChangedCallback(base::Bind( - &Manager::UpdateWiFiBootstrapState, weak_ptr_factory_.GetWeakPtr())); - - device_->GetPrivet()->AddOnPairingChangedCallbacks( - base::Bind(&Manager::OnPairingStart, weak_ptr_factory_.GetWeakPtr()), - base::Bind(&Manager::OnPairingEnd, weak_ptr_factory_.GetWeakPtr())); - } else { - UpdateWiFiBootstrapState(weave::WifiSetupState::kDisabled); - } - - dbus_adaptor_.RegisterWithDBusObject(&dbus_object_); - dbus_object_.RegisterAsync( - sequencer->GetHandler("Manager.RegisterAsync() failed.", true)); -} - -void Manager::Stop() { - device_.reset(); -} - -// TODO(vitalybuka): Remove, it's just duplicate of property. -void Manager::CheckDeviceRegistered( - DBusMethodResponsePtr<std::string> response) { - LOG(INFO) << "Received call to Manager.CheckDeviceRegistered()"; - response->Return(dbus_adaptor_.GetDeviceId()); -} - -// TODO(vitalybuka): Remove or rename to leave for testing. -void Manager::GetDeviceInfo(DBusMethodResponsePtr<std::string> response) { - LOG(INFO) << "Received call to Manager.GetDeviceInfo()"; - std::shared_ptr<DBusMethodResponse<std::string>> shared_response = - std::move(response); - - device_->GetCloud()->GetDeviceInfo( - base::Bind(&Manager::OnGetDeviceInfoSuccess, - weak_ptr_factory_.GetWeakPtr(), shared_response), - base::Bind(&Manager::OnGetDeviceInfoError, weak_ptr_factory_.GetWeakPtr(), - shared_response)); -} - -void Manager::OnGetDeviceInfoSuccess( - const std::shared_ptr<DBusMethodResponse<std::string>>& response, - const base::DictionaryValue& device_info) { - std::string device_info_str; - base::JSONWriter::WriteWithOptions( - device_info, base::JSONWriter::OPTIONS_PRETTY_PRINT, &device_info_str); - response->Return(device_info_str); -} - -void Manager::OnGetDeviceInfoError( - const std::shared_ptr<DBusMethodResponse<std::string>>& response, - const chromeos::Error* error) { - response->ReplyWithError(error); -} - -void Manager::RegisterDevice(DBusMethodResponsePtr<std::string> response, - const std::string& ticket_id) { - LOG(INFO) << "Received call to Manager.RegisterDevice()"; - - chromeos::ErrorPtr error; - std::string device_id = - device_->GetCloud()->RegisterDevice(ticket_id, &error); - if (!device_id.empty()) { - response->Return(device_id); - return; - } - CHECK(error); - response->ReplyWithError(error.get()); -} - -void Manager::UpdateState(DBusMethodResponsePtr<> response, - const chromeos::VariantDictionary& property_set) { - chromeos::ErrorPtr error; - auto properties = DictionaryFromDBusVariantDictionary(property_set, &error); - if (!properties) - response->ReplyWithError(error.get()); - - if (!device_->GetState()->SetProperties(*properties, &error)) - response->ReplyWithError(error.get()); - else - response->Return(); -} - -bool Manager::GetState(chromeos::ErrorPtr* error, std::string* state) { - auto json = device_->GetState()->GetStateValuesAsJson(); - CHECK(json); - base::JSONWriter::WriteWithOptions( - *json, base::JSONWriter::OPTIONS_PRETTY_PRINT, state); - return true; -} - -void Manager::AddCommand(DBusMethodResponsePtr<std::string> response, - const std::string& json_command, - const std::string& in_user_role) { - std::string error_message; - std::unique_ptr<base::Value> value( - base::JSONReader::ReadAndReturnError(json_command, base::JSON_PARSE_RFC, - nullptr, &error_message) - .release()); - const base::DictionaryValue* command{nullptr}; - if (!value || !value->GetAsDictionary(&command)) { - return response->ReplyWithError(FROM_HERE, chromeos::errors::json::kDomain, - chromeos::errors::json::kParseError, - error_message); - } - - chromeos::ErrorPtr error; - weave::UserRole role; - if (!StringToEnum(in_user_role, &role)) { - chromeos::Error::AddToPrintf(&error, FROM_HERE, kErrorDomain, - "invalid_user_role", "Invalid role: '%s'", - in_user_role.c_str()); - return response->ReplyWithError(error.get()); - } - - std::string id; - if (!device_->GetCommands()->AddCommand(*command, role, &id, &error)) - return response->ReplyWithError(error.get()); - - response->Return(id); -} - -void Manager::GetCommand(DBusMethodResponsePtr<std::string> response, - const std::string& id) { - const weave::Command* command = device_->GetCommands()->FindCommand(id); - if (!command) { - response->ReplyWithError(FROM_HERE, kErrorDomain, "unknown_command", - "Can't find command with id: " + id); - return; - } - std::string command_str; - base::JSONWriter::WriteWithOptions( - *command->ToJson(), base::JSONWriter::OPTIONS_PRETTY_PRINT, &command_str); - response->Return(command_str); -} - -std::string Manager::TestMethod(const std::string& message) { - LOG(INFO) << "Received call to test method: " << message; - return message; -} - -bool Manager::EnableWiFiBootstrapping( - chromeos::ErrorPtr* error, - const dbus::ObjectPath& in_listener_path, - const chromeos::VariantDictionary& in_options) { - chromeos::Error::AddTo(error, FROM_HERE, kErrorDomain, kNotImplemented, - "Manual WiFi bootstrapping is not implemented"); - return false; -} - -bool Manager::DisableWiFiBootstrapping(chromeos::ErrorPtr* error) { - chromeos::Error::AddTo(error, FROM_HERE, kErrorDomain, kNotImplemented, - "Manual WiFi bootstrapping is not implemented"); - return false; -} - -bool Manager::EnableGCDBootstrapping( - chromeos::ErrorPtr* error, - const dbus::ObjectPath& in_listener_path, - const chromeos::VariantDictionary& in_options) { - chromeos::Error::AddTo(error, FROM_HERE, kErrorDomain, kNotImplemented, - "Manual GCD bootstrapping is not implemented"); - return false; -} - -bool Manager::DisableGCDBootstrapping(chromeos::ErrorPtr* error) { - chromeos::Error::AddTo(error, FROM_HERE, kErrorDomain, kNotImplemented, - "Manual GCD bootstrapping is not implemented"); - return false; -} - -bool Manager::UpdateDeviceInfo(chromeos::ErrorPtr* error, - const std::string& name, - const std::string& description, - const std::string& location) { - return device_->GetCloud()->UpdateDeviceInfo(name, description, location, - error); -} - -bool Manager::UpdateServiceConfig(chromeos::ErrorPtr* error, - const std::string& client_id, - const std::string& client_secret, - const std::string& api_key, - const std::string& oauth_url, - const std::string& service_url) { - return device_->GetCloud()->UpdateServiceConfig( - client_id, client_secret, api_key, oauth_url, service_url, error); -} - -void Manager::OnStateChanged() { - auto state = device_->GetState()->GetStateValuesAsJson(); - CHECK(state); - std::string json; - base::JSONWriter::WriteWithOptions( - *state, base::JSONWriter::OPTIONS_PRETTY_PRINT, &json); - dbus_adaptor_.SetState(json); -} - -void Manager::OnRegistrationChanged(weave::RegistrationStatus status) { - dbus_adaptor_.SetStatus(weave::EnumToString(status)); -} - -void Manager::OnConfigChanged(const weave::Settings& settings) { - dbus_adaptor_.SetDeviceId(settings.device_id); - dbus_adaptor_.SetOemName(settings.oem_name); - dbus_adaptor_.SetModelName(settings.model_name); - dbus_adaptor_.SetModelId(settings.model_id); - dbus_adaptor_.SetName(settings.name); - dbus_adaptor_.SetDescription(settings.description); - dbus_adaptor_.SetLocation(settings.location); - dbus_adaptor_.SetAnonymousAccessRole(settings.local_anonymous_access_role); -} - -void Manager::UpdateWiFiBootstrapState(weave::WifiSetupState state) { - dbus_adaptor_.SetWiFiBootstrapState(weave::EnumToString(state)); -} - -void Manager::OnPairingStart(const std::string& session_id, - weave::PairingType pairing_type, - const std::vector<uint8_t>& code) { - // For now, just overwrite the exposed PairInfo with - // the most recent pairing attempt. - dbus_adaptor_.SetPairingInfo(chromeos::VariantDictionary{ - {kPairingSessionIdKey, session_id}, - {kPairingModeKey, weave::EnumToString(pairing_type)}, - {kPairingCodeKey, code}, - }); -} - -void Manager::OnPairingEnd(const std::string& session_id) { - auto exposed_pairing_attempt = dbus_adaptor_.GetPairingInfo(); - auto it = exposed_pairing_attempt.find(kPairingSessionIdKey); - if (it == exposed_pairing_attempt.end()) { - return; - } - std::string exposed_session{it->second.TryGet<std::string>()}; - if (exposed_session == session_id) { - dbus_adaptor_.SetPairingInfo(chromeos::VariantDictionary{}); - } -} - -} // namespace buffet
diff --git a/buffet/manager.h b/buffet/manager.h deleted file mode 100644 index 821acff..0000000 --- a/buffet/manager.h +++ /dev/null
@@ -1,133 +0,0 @@ -// Copyright 2014 The Chromium OS 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 BUFFET_MANAGER_H_ -#define BUFFET_MANAGER_H_ - -#include <memory> -#include <set> -#include <string> -#include <vector> - -#include <base/files/file_path.h> -#include <base/macros.h> -#include <base/memory/weak_ptr.h> -#include <base/values.h> -#include <chromeos/dbus/data_serialization.h> -#include <chromeos/dbus/dbus_object.h> -#include <chromeos/dbus/exported_property_set.h> -#include <chromeos/errors/error.h> -#include <weave/device.h> - -#include "buffet/org.chromium.Buffet.Manager.h" - -namespace chromeos { -namespace dbus_utils { -class ExportedObjectManager; -} // namespace dbus_utils -} // namespace chromeos - -namespace buffet { - -class DBusCommandDispacher; -class PeerdClient; -class ShillClient; -class WebServClient; - -template<typename... Types> -using DBusMethodResponsePtr = - std::unique_ptr<chromeos::dbus_utils::DBusMethodResponse<Types...>>; - -template<typename... Types> -using DBusMethodResponse = - chromeos::dbus_utils::DBusMethodResponse<Types...>; - -// The Manager is responsible for global state of Buffet. It exposes -// interfaces which affect the entire device such as device registration and -// device state. -class Manager final : public org::chromium::Buffet::ManagerInterface { - public: - explicit Manager( - const base::WeakPtr<chromeos::dbus_utils::ExportedObjectManager>& - object_manager); - ~Manager(); - - void Start(const weave::Device::Options& options, - const std::set<std::string>& device_whitelist, - chromeos::dbus_utils::AsyncEventSequencer* sequencer); - - void Stop(); - - private: - // DBus methods: - void CheckDeviceRegistered( - DBusMethodResponsePtr<std::string> response) override; - void GetDeviceInfo(DBusMethodResponsePtr<std::string> response) override; - void RegisterDevice(DBusMethodResponsePtr<std::string> response, - const std::string& ticket_id) override; - bool UpdateDeviceInfo(chromeos::ErrorPtr* error, - const std::string& name, - const std::string& description, - const std::string& location) override; - bool UpdateServiceConfig(chromeos::ErrorPtr* error, - const std::string& client_id, - const std::string& client_secret, - const std::string& api_key, - const std::string& oauth_url, - const std::string& service_url) override; - void UpdateState(DBusMethodResponsePtr<> response, - const chromeos::VariantDictionary& property_set) override; - bool GetState(chromeos::ErrorPtr* error, std::string* state) override; - void AddCommand(DBusMethodResponsePtr<std::string> response, - const std::string& json_command, - const std::string& in_user_role) override; - void GetCommand(DBusMethodResponsePtr<std::string> response, - const std::string& id) override; - std::string TestMethod(const std::string& message) override; - bool EnableWiFiBootstrapping( - chromeos::ErrorPtr* error, - const dbus::ObjectPath& in_listener_path, - const chromeos::VariantDictionary& in_options) override; - bool DisableWiFiBootstrapping(chromeos::ErrorPtr* error) override; - bool EnableGCDBootstrapping( - chromeos::ErrorPtr* error, - const dbus::ObjectPath& in_listener_path, - const chromeos::VariantDictionary& in_options) override; - bool DisableGCDBootstrapping(chromeos::ErrorPtr* error) override; - - void OnGetDeviceInfoSuccess( - const std::shared_ptr<DBusMethodResponse<std::string>>& response, - const base::DictionaryValue& device_info); - void OnGetDeviceInfoError( - const std::shared_ptr<DBusMethodResponse<std::string>>& response, - const chromeos::Error* error); - - void StartPrivet(const weave::Device::Options& options, - chromeos::dbus_utils::AsyncEventSequencer* sequencer); - - void OnStateChanged(); - void OnRegistrationChanged(weave::RegistrationStatus status); - void OnConfigChanged(const weave::Settings& settings); - void UpdateWiFiBootstrapState(weave::WifiSetupState state); - void OnPairingStart(const std::string& session_id, - weave::PairingType pairing_type, - const std::vector<uint8_t>& code); - void OnPairingEnd(const std::string& session_id); - - org::chromium::Buffet::ManagerAdaptor dbus_adaptor_{this}; - chromeos::dbus_utils::DBusObject dbus_object_; - - std::unique_ptr<ShillClient> shill_client_; - std::unique_ptr<PeerdClient> peerd_client_; - std::unique_ptr<WebServClient> web_serv_client_; - std::unique_ptr<weave::Device> device_; - std::unique_ptr<DBusCommandDispacher> command_dispatcher_; - - base::WeakPtrFactory<Manager> weak_ptr_factory_{this}; - DISALLOW_COPY_AND_ASSIGN(Manager); -}; - -} // namespace buffet - -#endif // BUFFET_MANAGER_H_
diff --git a/buffet/peerd_client.cc b/buffet/peerd_client.cc deleted file mode 100644 index cfbf64a..0000000 --- a/buffet/peerd_client.cc +++ /dev/null
@@ -1,148 +0,0 @@ -// Copyright 2014 The Chromium OS 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 "buffet/peerd_client.h" - -#include <map> - -#include <base/message_loop/message_loop.h> -#include <chromeos/errors/error.h> -#include <chromeos/strings/string_utils.h> - -using org::chromium::peerd::PeerProxy; - -namespace buffet { - -namespace { - -// Commit changes only if no update request happened during the timeout. -// Usually updates happen in batches, so we don't want to flood network with -// updates relevant for a short amount of time. -const int kCommitTimeoutSeconds = 1; - -const char kSelfPath[] = "/org/chromium/peerd/Self"; - -void OnError(const std::string& operation, chromeos::Error* error) { - LOG(ERROR) << operation << " failed:" << error->GetMessage(); -} - -} // namespace - -PeerdClient::PeerdClient(const scoped_refptr<dbus::Bus>& bus) - : peerd_object_manager_proxy_{bus} { - peerd_object_manager_proxy_.SetManagerAddedCallback( - base::Bind(&PeerdClient::OnPeerdOnline, weak_ptr_factory_.GetWeakPtr())); - peerd_object_manager_proxy_.SetManagerRemovedCallback( - base::Bind(&PeerdClient::OnPeerdOffline, weak_ptr_factory_.GetWeakPtr())); - peerd_object_manager_proxy_.SetPeerAddedCallback( - base::Bind(&PeerdClient::OnNewPeer, weak_ptr_factory_.GetWeakPtr())); -} - -PeerdClient::~PeerdClient() { - RemoveService(); -} - -std::string PeerdClient::GetId() const { - return device_id_; -} - -void PeerdClient::PublishService( - const std::string& service_name, - uint16_t port, - const std::map<std::string, std::string>& txt) { - // Only one service supported. - CHECK(service_name_.empty() || service_name_ == service_name); - service_name_ = service_name; - port_ = port; - txt_ = txt; - - Update(); -} - -void PeerdClient::StopPublishing(const std::string& service_name) { - // Only one service supported. - CHECK(service_name_.empty() || service_name_ == service_name); - service_name_ = service_name; - port_ = 0; - - Update(); -} - -void PeerdClient::Update() { - // Abort pending updates, and wait for more changes. - restart_weak_ptr_factory_.InvalidateWeakPtrs(); - base::MessageLoop::current()->PostDelayedTask( - FROM_HERE, base::Bind(&PeerdClient::UpdateImpl, - restart_weak_ptr_factory_.GetWeakPtr()), - base::TimeDelta::FromSeconds(kCommitTimeoutSeconds)); -} - -void PeerdClient::OnNewPeer(PeerProxy* peer) { - if (!peer || peer->GetObjectPath().value() != kSelfPath) - return; - peer->SetPropertyChangedCallback(base::Bind( - &PeerdClient::OnPeerPropertyChanged, weak_ptr_factory_.GetWeakPtr())); - OnPeerPropertyChanged(peer, PeerProxy::UUIDName()); -} - -void PeerdClient::OnPeerPropertyChanged(PeerProxy* peer, - const std::string& property_name) { - if (property_name != PeerProxy::UUIDName() || - peer->GetObjectPath().value() != kSelfPath) - return; - const std::string new_id{peer->uuid()}; - if (new_id != device_id_) { - device_id_ = new_id; - Update(); - } -} - -void PeerdClient::OnPeerdOnline( - org::chromium::peerd::ManagerProxy* manager_proxy) { - peerd_manager_proxy_ = manager_proxy; - VLOG(1) << "Peerd manager is online at '" - << manager_proxy->GetObjectPath().value() << "'."; - Update(); -} - -void PeerdClient::OnPeerdOffline(const dbus::ObjectPath& object_path) { - peerd_manager_proxy_ = nullptr; - VLOG(1) << "Peerd manager is now offline."; -} - -void PeerdClient::ExposeService() { - // Do nothing if peerd hasn't started yet. - if (peerd_manager_proxy_ == nullptr) - return; - VLOG(1) << "Starting peerd advertising."; - CHECK_NE(port_, 0); - CHECK(!service_name_.empty()); - CHECK(!txt_.empty()); - std::map<std::string, chromeos::Any> mdns_options{ - {"port", chromeos::Any{port_}}, - }; - - peerd_manager_proxy_->ExposeServiceAsync( - service_name_, txt_, {{"mdns", mdns_options}}, base::Closure(), - base::Bind(&OnError, "ExposeService")); -} - -void PeerdClient::RemoveService() { - if (peerd_manager_proxy_ == nullptr) - return; - - VLOG(1) << "Stopping peerd advertising."; - if (!service_name_.empty()) { - peerd_manager_proxy_->RemoveExposedServiceAsync( - service_name_, base::Closure(), base::Bind(&OnError, "RemoveService")); - } -} - -void PeerdClient::UpdateImpl() { - if (port_ == 0) - return RemoveService(); - ExposeService(); -} - -} // namespace buffet
diff --git a/buffet/peerd_client.h b/buffet/peerd_client.h deleted file mode 100644 index ac75e19..0000000 --- a/buffet/peerd_client.h +++ /dev/null
@@ -1,71 +0,0 @@ -// Copyright 2014 The Chromium OS 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 BUFFET_PEERD_CLIENT_H_ -#define BUFFET_PEERD_CLIENT_H_ - -#include <map> -#include <memory> -#include <string> - -#include <base/callback.h> -#include <base/memory/ref_counted.h> -#include <weave/mdns.h> - -#include "peerd/dbus-proxies.h" - -namespace dbus { -class Bus; -} // namespace dbus - -namespace buffet { - -// Publishes privet service on mDns using peerd. -class PeerdClient : public weave::Mdns { - public: - explicit PeerdClient(const scoped_refptr<dbus::Bus>& bus); - ~PeerdClient() override; - - // Mdns implementation. - void PublishService(const std::string& service_name, - uint16_t port, - const std::map<std::string, std::string>& txt) override; - void StopPublishing(const std::string& service_name) override; - std::string GetId() const override; - - private: - void OnPeerdOnline(org::chromium::peerd::ManagerProxy* manager_proxy); - void OnPeerdOffline(const dbus::ObjectPath& object_path); - void OnNewPeer(org::chromium::peerd::PeerProxy* peer_proxy); - void OnPeerPropertyChanged(org::chromium::peerd::PeerProxy* peer_proxy, - const std::string& property_name); - - // Updates published information. Removes service if HTTP is not alive. - void Update(); - - void ExposeService(); - void RemoveService(); - - void UpdateImpl(); - - org::chromium::peerd::ObjectManagerProxy peerd_object_manager_proxy_; - // |peerd_manager_proxy_| is owned by |peerd_object_manager_proxy_|. - org::chromium::peerd::ManagerProxy* peerd_manager_proxy_{nullptr}; - - // Cached value of the device ID that we got from peerd. - std::string device_id_; - - std::string service_name_; - uint16_t port_{0}; - std::map<std::string, std::string> txt_; - - base::WeakPtrFactory<PeerdClient> restart_weak_ptr_factory_{this}; - base::WeakPtrFactory<PeerdClient> weak_ptr_factory_{this}; - - DISALLOW_COPY_AND_ASSIGN(PeerdClient); -}; - -} // namespace buffet - -#endif // BUFFET_PEERD_CLIENT_H_
diff --git a/buffet/shill_client.cc b/buffet/shill_client.cc deleted file mode 100644 index c549fd4..0000000 --- a/buffet/shill_client.cc +++ /dev/null
@@ -1,499 +0,0 @@ -// Copyright 2014 The Chromium OS 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 "buffet/shill_client.h" - -#include <set> - -#include <base/message_loop/message_loop.h> -#include <base/stl_util.h> -#include <chromeos/any.h> -#include <chromeos/dbus/service_constants.h> -#include <chromeos/errors/error.h> -#include <chromeos/errors/error_codes.h> -#include <weave/enum_to_string.h> - -#include "buffet/ap_manager_client.h" - -using chromeos::Any; -using chromeos::VariantDictionary; -using dbus::ObjectPath; -using org::chromium::flimflam::DeviceProxy; -using org::chromium::flimflam::ServiceProxy; -using std::map; -using std::set; -using std::string; -using std::vector; - -namespace buffet { - -namespace { - -void IgnoreDetachEvent() {} - -bool GetStateForService(ServiceProxy* service, string* state) { - CHECK(service) << "|service| was nullptr in GetStateForService()"; - VariantDictionary properties; - if (!service->GetProperties(&properties, nullptr)) { - LOG(WARNING) << "Failed to read properties from service."; - return false; - } - auto property_it = properties.find(shill::kStateProperty); - if (property_it == properties.end()) { - LOG(WARNING) << "No state found in service properties."; - return false; - } - string new_state = property_it->second.TryGet<string>(); - if (new_state.empty()) { - LOG(WARNING) << "Invalid state value."; - return false; - } - *state = new_state; - return true; -} - -weave::NetworkState ShillServiceStateToNetworkState(const string& state) { - // TODO(wiley) What does "unconfigured" mean in a world with multiple sets - // of WiFi credentials? - // TODO(wiley) Detect disabled devices, update state appropriately. - if ((state.compare(shill::kStateReady) == 0) || - (state.compare(shill::kStatePortal) == 0) || - (state.compare(shill::kStateOnline) == 0)) { - return weave::NetworkState::kConnected; - } - if ((state.compare(shill::kStateAssociation) == 0) || - (state.compare(shill::kStateConfiguration) == 0)) { - return weave::NetworkState::kConnecting; - } - if ((state.compare(shill::kStateFailure) == 0) || - (state.compare(shill::kStateActivationFailure) == 0)) { - // TODO(wiley) Get error information off the service object. - return weave::NetworkState::kFailure; - } - if ((state.compare(shill::kStateIdle) == 0) || - (state.compare(shill::kStateOffline) == 0) || - (state.compare(shill::kStateDisconnect) == 0)) { - return weave::NetworkState::kOffline; - } - LOG(WARNING) << "Unknown state found: '" << state << "'"; - return weave::NetworkState::kOffline; -} - -} // namespace - -ShillClient::ShillClient(const scoped_refptr<dbus::Bus>& bus, - const set<string>& device_whitelist) - : bus_{bus}, - manager_proxy_{bus_, ObjectPath{"/"}}, - device_whitelist_{device_whitelist}, - ap_manager_client_{new ApManagerClient(bus)} { - manager_proxy_.RegisterPropertyChangedSignalHandler( - base::Bind(&ShillClient::OnManagerPropertyChange, - weak_factory_.GetWeakPtr()), - base::Bind(&ShillClient::OnManagerPropertyChangeRegistration, - weak_factory_.GetWeakPtr())); - auto owner_changed_cb = base::Bind(&ShillClient::OnShillServiceOwnerChange, - weak_factory_.GetWeakPtr()); - bus_->GetObjectProxy(shill::kFlimflamServiceName, ObjectPath{"/"}) - ->SetNameOwnerChangedCallback(owner_changed_cb); -} - -ShillClient::~ShillClient() {} - -void ShillClient::Init() { - VLOG(2) << "ShillClient::Init();"; - CleanupConnectingService(false); - devices_.clear(); - connectivity_state_ = weave::NetworkState::kOffline; - VariantDictionary properties; - if (!manager_proxy_.GetProperties(&properties, nullptr)) { - LOG(ERROR) << "Unable to get properties from Manager, waiting for " - "Manager to come back online."; - return; - } - auto it = properties.find(shill::kDevicesProperty); - CHECK(it != properties.end()) << "shill should always publish a device list."; - OnManagerPropertyChange(shill::kDevicesProperty, it->second); -} - -bool ShillClient::ConnectToService(const string& ssid, - const string& passphrase, - const base::Closure& on_success, - chromeos::ErrorPtr* error) { - CleanupConnectingService(false); - VariantDictionary service_properties; - service_properties[shill::kTypeProperty] = Any{string{shill::kTypeWifi}}; - service_properties[shill::kSSIDProperty] = Any{ssid}; - service_properties[shill::kPassphraseProperty] = Any{passphrase}; - service_properties[shill::kSecurityProperty] = Any{ - string{passphrase.empty() ? shill::kSecurityNone : shill::kSecurityPsk}}; - service_properties[shill::kSaveCredentialsProperty] = Any{true}; - service_properties[shill::kAutoConnectProperty] = Any{true}; - ObjectPath service_path; - if (!manager_proxy_.ConfigureService(service_properties, &service_path, - error)) { - return false; - } - if (!manager_proxy_.RequestScan(shill::kTypeWifi, error)) { - return false; - } - connecting_service_.reset(new ServiceProxy{bus_, service_path}); - on_connect_success_.Reset(on_success); - connecting_service_->RegisterPropertyChangedSignalHandler( - base::Bind(&ShillClient::OnServicePropertyChange, - weak_factory_.GetWeakPtr(), service_path), - base::Bind(&ShillClient::OnServicePropertyChangeRegistration, - weak_factory_.GetWeakPtr(), service_path)); - return true; -} - -weave::NetworkState ShillClient::GetConnectionState() const { - return connectivity_state_; -} - -void ShillClient::EnableAccessPoint(const std::string& ssid) { - ap_manager_client_->Start(ssid); -} - -void ShillClient::DisableAccessPoint() { - ap_manager_client_->Stop(); -} - -void ShillClient::AddOnConnectionChangedCallback( - const OnConnectionChangedCallback& listener) { - connectivity_listeners_.push_back(listener); -} - -bool ShillClient::IsMonitoredDevice(DeviceProxy* device) { - if (device_whitelist_.empty()) { - return true; - } - VariantDictionary device_properties; - if (!device->GetProperties(&device_properties, nullptr)) { - LOG(ERROR) << "Devices without properties aren't whitelisted."; - return false; - } - auto it = device_properties.find(shill::kInterfaceProperty); - if (it == device_properties.end()) { - LOG(ERROR) << "Failed to find interface property in device properties."; - return false; - } - return ContainsKey(device_whitelist_, it->second.TryGet<string>()); -} - -void ShillClient::OnShillServiceOwnerChange(const string& old_owner, - const string& new_owner) { - VLOG(1) << "Shill service owner name changed to '" << new_owner << "'"; - if (new_owner.empty()) { - CleanupConnectingService(false); - devices_.clear(); - connectivity_state_ = weave::NetworkState::kOffline; - } else { - Init(); // New service owner means shill reset! - } -} - -void ShillClient::OnManagerPropertyChangeRegistration(const string& interface, - const string& signal_name, - bool success) { - VLOG(3) << "Registered ManagerPropertyChange handler."; - CHECK(success) << "privetd requires Manager signals."; - VariantDictionary properties; - if (!manager_proxy_.GetProperties(&properties, nullptr)) { - LOG(ERROR) << "Unable to get properties from Manager, waiting for " - "Manager to come back online."; - return; - } - auto it = properties.find(shill::kDevicesProperty); - CHECK(it != properties.end()) << "Shill should always publish a device list."; - OnManagerPropertyChange(shill::kDevicesProperty, it->second); -} - -void ShillClient::OnManagerPropertyChange(const string& property_name, - const Any& property_value) { - if (property_name != shill::kDevicesProperty) { - return; - } - VLOG(3) << "Manager's device list has changed."; - // We're going to remove every device we haven't seen in the update. - set<ObjectPath> device_paths_to_remove; - for (const auto& kv : devices_) { - device_paths_to_remove.insert(kv.first); - } - for (const auto& device_path : property_value.TryGet<vector<ObjectPath>>()) { - if (!device_path.IsValid()) { - LOG(ERROR) << "Ignoring invalid device path in Manager's device list."; - return; - } - auto it = devices_.find(device_path); - if (it != devices_.end()) { - // Found an existing proxy. Since the whitelist never changes, - // this still a valid device. - device_paths_to_remove.erase(device_path); - continue; - } - std::unique_ptr<DeviceProxy> device{new DeviceProxy{bus_, device_path}}; - if (!IsMonitoredDevice(device.get())) { - continue; - } - device->RegisterPropertyChangedSignalHandler( - base::Bind(&ShillClient::OnDevicePropertyChange, - weak_factory_.GetWeakPtr(), device_path), - base::Bind(&ShillClient::OnDevicePropertyChangeRegistration, - weak_factory_.GetWeakPtr(), device_path)); - VLOG(3) << "Creating device proxy at " << device_path.value(); - devices_[device_path].device = std::move(device); - } - // Clean up devices/services related to removed devices. - if (!device_paths_to_remove.empty()) { - for (const ObjectPath& device_path : device_paths_to_remove) { - devices_.erase(device_path); - } - UpdateConnectivityState(); - } -} - -void ShillClient::OnDevicePropertyChangeRegistration( - const ObjectPath& device_path, - const string& interface, - const string& signal_name, - bool success) { - VLOG(3) << "Registered DevicePropertyChange handler."; - auto it = devices_.find(device_path); - if (it == devices_.end()) { - return; - } - CHECK(success) << "Failed to subscribe to Device property changes."; - DeviceProxy* device = it->second.device.get(); - VariantDictionary properties; - if (!device->GetProperties(&properties, nullptr)) { - LOG(WARNING) << "Failed to get device properties?"; - return; - } - auto prop_it = properties.find(shill::kSelectedServiceProperty); - if (prop_it == properties.end()) { - LOG(WARNING) << "Failed to get device's selected service?"; - return; - } - OnDevicePropertyChange(device_path, shill::kSelectedServiceProperty, - prop_it->second); -} - -void ShillClient::OnDevicePropertyChange(const ObjectPath& device_path, - const string& property_name, - const Any& property_value) { - // We only care about selected services anyway. - if (property_name != shill::kSelectedServiceProperty) { - return; - } - // If the device isn't our list of whitelisted devices, ignore it. - auto it = devices_.find(device_path); - if (it == devices_.end()) { - return; - } - DeviceState& device_state = it->second; - ObjectPath service_path{property_value.TryGet<ObjectPath>()}; - if (!service_path.IsValid()) { - LOG(ERROR) << "Device at " << device_path.value() - << " selected invalid service path."; - return; - } - VLOG(3) << "Device at " << it->first.value() << " has selected service at " - << service_path.value(); - bool removed_old_service{false}; - if (device_state.selected_service) { - if (device_state.selected_service->GetObjectPath() == service_path) { - return; // Spurious update? - } - device_state.selected_service.reset(); - device_state.service_state = weave::NetworkState::kOffline; - removed_old_service = true; - } - std::shared_ptr<ServiceProxy> new_service; - const bool reuse_connecting_service = - service_path.value() != "/" && connecting_service_ && - connecting_service_->GetObjectPath() == service_path; - if (reuse_connecting_service) { - new_service = connecting_service_; - // When we reuse the connecting service, we need to make sure that our - // cached state is correct. Normally, we do this by relying reading the - // state when our signal handlers finish registering, but this may have - // happened long in the past for the connecting service. - string state; - if (GetStateForService(new_service.get(), &state)) { - device_state.service_state = ShillServiceStateToNetworkState(state); - } else { - LOG(WARNING) << "Failed to read properties from existing service " - "on selection."; - } - } else if (service_path.value() != "/") { - // The device has selected a new service we haven't see before. - new_service.reset(new ServiceProxy{bus_, service_path}); - new_service->RegisterPropertyChangedSignalHandler( - base::Bind(&ShillClient::OnServicePropertyChange, - weak_factory_.GetWeakPtr(), service_path), - base::Bind(&ShillClient::OnServicePropertyChangeRegistration, - weak_factory_.GetWeakPtr(), service_path)); - } - device_state.selected_service = new_service; - if (reuse_connecting_service || removed_old_service) { - UpdateConnectivityState(); - } -} - -void ShillClient::OnServicePropertyChangeRegistration(const ObjectPath& path, - const string& interface, - const string& signal_name, - bool success) { - VLOG(3) << "OnServicePropertyChangeRegistration(" << path.value() << ");"; - ServiceProxy* service{nullptr}; - if (connecting_service_ && connecting_service_->GetObjectPath() == path) { - // Note that the connecting service might also be a selected service. - service = connecting_service_.get(); - if (!success) { - CleanupConnectingService(false); - } - } else { - for (const auto& kv : devices_) { - if (kv.second.selected_service && - kv.second.selected_service->GetObjectPath() == path) { - service = kv.second.selected_service.get(); - break; - } - } - } - if (service == nullptr || !success) { - return; // A failure or success for a proxy we no longer care about. - } - VariantDictionary properties; - if (!service->GetProperties(&properties, nullptr)) { - return; - } - // Give ourselves property changed signals for the initial property - // values. - auto it = properties.find(shill::kStateProperty); - if (it != properties.end()) { - OnServicePropertyChange(path, shill::kStateProperty, it->second); - } - it = properties.find(shill::kSignalStrengthProperty); - if (it != properties.end()) { - OnServicePropertyChange(path, shill::kSignalStrengthProperty, it->second); - } -} - -void ShillClient::OnServicePropertyChange(const ObjectPath& service_path, - const string& property_name, - const Any& property_value) { - VLOG(3) << "ServicePropertyChange(" << service_path.value() << ", " - << property_name << ", ...);"; - if (property_name == shill::kStateProperty) { - const string state{property_value.TryGet<string>()}; - if (state.empty()) { - VLOG(3) << "Invalid service state update."; - return; - } - VLOG(3) << "New service state=" << state; - OnStateChangeForSelectedService(service_path, state); - OnStateChangeForConnectingService(service_path, state); - } else if (property_name == shill::kSignalStrengthProperty) { - OnStrengthChangeForConnectingService(service_path, - property_value.TryGet<uint8_t>()); - } -} - -void ShillClient::OnStateChangeForConnectingService( - const ObjectPath& service_path, - const string& state) { - if (!connecting_service_ || - connecting_service_->GetObjectPath() != service_path || - ShillServiceStateToNetworkState(state) != - weave::NetworkState::kConnected) { - return; - } - connecting_service_reset_pending_ = true; - on_connect_success_.callback().Run(); - CleanupConnectingService(true); -} - -void ShillClient::OnStrengthChangeForConnectingService( - const ObjectPath& service_path, - uint8_t signal_strength) { - if (!connecting_service_ || - connecting_service_->GetObjectPath() != service_path || - signal_strength <= 0 || have_called_connect_) { - return; - } - VLOG(1) << "Connecting service has signal. Calling Connect()."; - have_called_connect_ = true; - // Failures here indicate that we've already connected, - // or are connecting, or some other very unexciting thing. - // Ignore all that, and rely on state changes to detect - // connectivity. - connecting_service_->Connect(nullptr); -} - -void ShillClient::OnStateChangeForSelectedService( - const ObjectPath& service_path, - const string& state) { - // Find the device/service pair responsible for this update - VLOG(3) << "State for potentially selected service " << service_path.value() - << " have changed to " << state; - for (auto& kv : devices_) { - if (kv.second.selected_service && - kv.second.selected_service->GetObjectPath() == service_path) { - VLOG(3) << "Updated cached connection state for selected service."; - kv.second.service_state = ShillServiceStateToNetworkState(state); - UpdateConnectivityState(); - return; - } - } -} - -void ShillClient::UpdateConnectivityState() { - // Update the connectivity state of the device by picking the - // state of the currently most connected selected service. - weave::NetworkState new_connectivity_state{weave::NetworkState::kOffline}; - for (const auto& kv : devices_) { - if (kv.second.service_state > new_connectivity_state) { - new_connectivity_state = kv.second.service_state; - } - } - VLOG(1) << "Connectivity changed: " << EnumToString(connectivity_state_) - << " -> " << EnumToString(new_connectivity_state); - // Notify listeners even if state changed to the same value. Listeners may - // want to handle this event. - connectivity_state_ = new_connectivity_state; - // We may call UpdateConnectivityState whenever we mutate a data structure - // such that our connectivity status could change. However, we don't want - // to allow people to call into ShillClient while some other operation is - // underway. Therefore, call our callbacks later, when we're in a good - // state. - base::MessageLoop::current()->PostTask( - FROM_HERE, - base::Bind(&ShillClient::NotifyConnectivityListeners, - weak_factory_.GetWeakPtr(), - GetConnectionState() == weave::NetworkState::kConnected)); -} - -void ShillClient::NotifyConnectivityListeners(bool am_online) { - VLOG(3) << "Notifying connectivity listeners that online=" << am_online; - for (const auto& listener : connectivity_listeners_) { - listener.Run(am_online); - } -} - -void ShillClient::CleanupConnectingService(bool check_for_reset_pending) { - if (check_for_reset_pending && !connecting_service_reset_pending_) { - return; // Must have called connect before we got here. - } - if (connecting_service_) { - connecting_service_->ReleaseObjectProxy(base::Bind(&IgnoreDetachEvent)); - connecting_service_.reset(); - } - on_connect_success_.Cancel(); - have_called_connect_ = false; - connecting_service_reset_pending_ = false; -} - -} // namespace buffet
diff --git a/buffet/shill_client.h b/buffet/shill_client.h deleted file mode 100644 index 4d54d60..0000000 --- a/buffet/shill_client.h +++ /dev/null
@@ -1,121 +0,0 @@ -// Copyright 2014 The Chromium OS 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 BUFFET_SHILL_CLIENT_H_ -#define BUFFET_SHILL_CLIENT_H_ - -#include <map> -#include <set> -#include <string> -#include <vector> - -#include <base/callback.h> -#include <base/cancelable_callback.h> -#include <base/macros.h> -#include <base/memory/ref_counted.h> -#include <base/memory/weak_ptr.h> -#include <dbus/bus.h> -#include <weave/network.h> - -#include "shill/dbus-proxies.h" - -namespace buffet { - -class ApManagerClient; - -class ShillClient final : public weave::Network { - public: - ShillClient(const scoped_refptr<dbus::Bus>& bus, - const std::set<std::string>& device_whitelist); - ~ShillClient(); - - void Init(); - - // Network implementation. - void AddOnConnectionChangedCallback( - const OnConnectionChangedCallback& listener) override; - bool ConnectToService(const std::string& ssid, - const std::string& passphrase, - const base::Closure& on_success, - chromeos::ErrorPtr* error) override; - weave::NetworkState GetConnectionState() const override; - void EnableAccessPoint(const std::string& ssid) override; - void DisableAccessPoint() override; - - private: - struct DeviceState { - std::unique_ptr<org::chromium::flimflam::DeviceProxy> device; - // ServiceProxy objects are shared because the connecting service will - // also be the selected service for a device, but is not always the selected - // service (for instance, in the period between configuring a WiFi service - // with credentials, and when Connect() is called.) - std::shared_ptr<org::chromium::flimflam::ServiceProxy> selected_service; - weave::NetworkState service_state{weave::NetworkState::kOffline}; - }; - - bool IsMonitoredDevice(org::chromium::flimflam::DeviceProxy* device); - void OnShillServiceOwnerChange(const std::string& old_owner, - const std::string& new_owner); - void OnManagerPropertyChangeRegistration(const std::string& interface, - const std::string& signal_name, - bool success); - void OnManagerPropertyChange(const std::string& property_name, - const chromeos::Any& property_value); - void OnDevicePropertyChangeRegistration(const dbus::ObjectPath& device_path, - const std::string& interface, - const std::string& signal_name, - bool success); - void OnDevicePropertyChange(const dbus::ObjectPath& device_path, - const std::string& property_name, - const chromeos::Any& property_value); - void OnServicePropertyChangeRegistration(const dbus::ObjectPath& path, - const std::string& interface, - const std::string& signal_name, - bool success); - void OnServicePropertyChange(const dbus::ObjectPath& service_path, - const std::string& property_name, - const chromeos::Any& property_value); - - void OnStateChangeForConnectingService(const dbus::ObjectPath& service_path, - const std::string& state); - void OnStrengthChangeForConnectingService( - const dbus::ObjectPath& service_path, - uint8_t signal_strength); - void OnStateChangeForSelectedService(const dbus::ObjectPath& service_path, - const std::string& state); - void UpdateConnectivityState(); - void NotifyConnectivityListeners(bool am_online); - // Clean up state related to a connecting service. If - // |check_for_reset_pending| is set, then we'll check to see if we've called - // ConnectToService() in the time since a task to call this function was - // posted. - void CleanupConnectingService(bool check_for_reset_pending); - - const scoped_refptr<dbus::Bus> bus_; - org::chromium::flimflam::ManagerProxy manager_proxy_; - // There is logic that assumes we will never change this device list - // in OnManagerPropertyChange. Do not be tempted to remove this const. - const std::set<std::string> device_whitelist_; - std::vector<OnConnectionChangedCallback> connectivity_listeners_; - - // State for tracking where we are in our attempts to connect to a service. - bool connecting_service_reset_pending_{false}; - bool have_called_connect_{false}; - std::shared_ptr<org::chromium::flimflam::ServiceProxy> connecting_service_; - base::CancelableClosure on_connect_success_; - - // State for tracking our online connectivity. - std::map<dbus::ObjectPath, DeviceState> devices_; - weave::NetworkState connectivity_state_{weave::NetworkState::kOffline}; - - std::unique_ptr<ApManagerClient> ap_manager_client_; - - base::WeakPtrFactory<ShillClient> weak_factory_{this}; - - DISALLOW_COPY_AND_ASSIGN(ShillClient); -}; - -} // namespace buffet - -#endif // BUFFET_SHILL_CLIENT_H_
diff --git a/buffet/test_daemon/main.cc b/buffet/test_daemon/main.cc deleted file mode 100644 index eeb0caf..0000000 --- a/buffet/test_daemon/main.cc +++ /dev/null
@@ -1,178 +0,0 @@ -// Copyright 2014 The Chromium OS Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// This is a sample daemon that "handles" Buffet commands. -// It just prints the information about the command received to stdout and -// marks the command as processed. - -#include <string> -#include <sysexits.h> - -#include <base/bind.h> -#include <base/command_line.h> -#include <base/format_macros.h> -#include <base/json/json_writer.h> -#include <base/values.h> -#include <chromeos/daemons/dbus_daemon.h> -#include <chromeos/map_utils.h> -#include <chromeos/strings/string_utils.h> -#include <chromeos/syslog_logging.h> - -#include "buffet/dbus-proxies.h" - -namespace { -const char kTestCommandCategory[] = "test"; - -std::unique_ptr<base::DictionaryValue> DictionaryToJson( - const chromeos::VariantDictionary& dictionary); - -std::unique_ptr<base::Value> AnyToJson(const chromeos::Any& value) { - if (value.IsTypeCompatible<chromeos::VariantDictionary>()) - return DictionaryToJson(value.Get<chromeos::VariantDictionary>()); - - if (value.IsTypeCompatible<std::string>()) { - return std::unique_ptr<base::Value>{ - new base::StringValue(value.Get<std::string>())}; - } - - if (value.IsTypeCompatible<double>()) { - return std::unique_ptr<base::Value>{ - new base::FundamentalValue(value.Get<double>())}; - } - - if (value.IsTypeCompatible<bool>()) { - return std::unique_ptr<base::Value>{ - new base::FundamentalValue(value.Get<bool>())}; - } - - if (value.IsTypeCompatible<int>()) { - return std::unique_ptr<base::Value>{ - new base::FundamentalValue(value.Get<int>())}; - } - - LOG(FATAL) << "Unsupported type:" << value.GetType().name(); - return {}; -} - -std::unique_ptr<base::DictionaryValue> DictionaryToJson( - const chromeos::VariantDictionary& dictionary) { - std::unique_ptr<base::DictionaryValue> result{new base::DictionaryValue}; - for (const auto& it : dictionary) - result->Set(it.first, AnyToJson(it.second).release()); - return result; -} - -std::string DictionaryToString(const chromeos::VariantDictionary& dictionary) { - std::unique_ptr<base::DictionaryValue> json{DictionaryToJson(dictionary)}; - std::string str; - base::JSONWriter::Write(*json, &str); - return str; -} - -} // anonymous namespace - -class Daemon final : public chromeos::DBusDaemon { - public: - Daemon() = default; - - protected: - int OnInit() override; - void OnShutdown(int* return_code) override; - - private: - std::unique_ptr<org::chromium::Buffet::ObjectManagerProxy> object_manager_; - - void OnBuffetCommand(org::chromium::Buffet::CommandProxy* command); - void OnBuffetCommandRemoved(const dbus::ObjectPath& object_path); - void OnPropertyChange(org::chromium::Buffet::CommandProxy* command, - const std::string& property_name); - void OnCommandProgress(org::chromium::Buffet::CommandProxy* command, - int progress); - - DISALLOW_COPY_AND_ASSIGN(Daemon); -}; - -int Daemon::OnInit() { - int return_code = chromeos::DBusDaemon::OnInit(); - if (return_code != EX_OK) - return return_code; - - object_manager_.reset(new org::chromium::Buffet::ObjectManagerProxy{bus_}); - object_manager_->SetCommandAddedCallback( - base::Bind(&Daemon::OnBuffetCommand, base::Unretained(this))); - object_manager_->SetCommandRemovedCallback( - base::Bind(&Daemon::OnBuffetCommandRemoved, base::Unretained(this))); - - printf("Waiting for commands...\n"); - return EX_OK; -} - -void Daemon::OnShutdown(int* return_code) { - printf("Shutting down...\n"); -} - -void Daemon::OnPropertyChange(org::chromium::Buffet::CommandProxy* command, - const std::string& property_name) { - printf("Notification: property '%s' on command '%s' changed.\n", - property_name.c_str(), command->id().c_str()); - printf(" Current command status: '%s'\n", command->status().c_str()); - std::string progress = DictionaryToString(command->progress()); - printf(" Current command progress: %s\n", progress.c_str()); - std::string results = DictionaryToString(command->results()); - printf(" Current command results: %s\n", results.c_str()); -} - -void Daemon::OnBuffetCommand(org::chromium::Buffet::CommandProxy* command) { - // "Handle" only commands that belong to this daemon's category. - if (command->category() != kTestCommandCategory || - command->status() == "done") { - return; - } - - command->SetPropertyChangedCallback(base::Bind(&Daemon::OnPropertyChange, - base::Unretained(this))); - printf("++++++++++++++++++++++++++++++++++++++++++++++++\n"); - printf("Command received: %s\n", command->name().c_str()); - printf("DBus Object Path: %s\n", command->GetObjectPath().value().c_str()); - printf(" category: %s\n", command->category().c_str()); - printf(" ID: %s\n", command->id().c_str()); - printf(" status: %s\n", command->status().c_str()); - printf(" origin: %s\n", command->origin().c_str()); - std::string param_names = DictionaryToString(command->parameters()); - printf(" parameters: %s\n", param_names.c_str()); - OnCommandProgress(command, 0); -} - -void Daemon::OnCommandProgress(org::chromium::Buffet::CommandProxy* command, - int progress) { - printf("Updating command '%s' progress to %d%%\n", command->id().c_str(), - progress); - auto new_progress = command->progress(); - new_progress["progress"] = progress; - command->SetProgress(new_progress, nullptr); - - if (progress >= 100) { - command->Done(nullptr); - } else { - base::MessageLoop::current()->PostDelayedTask( - FROM_HERE, base::Bind(&Daemon::OnCommandProgress, - base::Unretained(this), command, progress + 10), - base::TimeDelta::FromSeconds(1)); - } -} - -void Daemon::OnBuffetCommandRemoved(const dbus::ObjectPath& object_path) { - printf("------------------------------------------------\n"); - printf("Command removed\n"); - printf("DBus Object Path: %s\n", object_path.value().c_str()); -} - -int main(int argc, char* argv[]) { - base::CommandLine::Init(argc, argv); - chromeos::InitLog(chromeos::kLogToSyslog | - chromeos::kLogToStderr | - chromeos::kLogHeader); - Daemon daemon; - return daemon.Run(); -}
diff --git a/buffet/webserv_client.cc b/buffet/webserv_client.cc deleted file mode 100644 index 2ae5910..0000000 --- a/buffet/webserv_client.cc +++ /dev/null
@@ -1,135 +0,0 @@ -// Copyright 2015 The Chromium OS 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 "buffet/webserv_client.h" - -#include <memory> -#include <string> - -#include <libwebserv/protocol_handler.h> -#include <libwebserv/request.h> -#include <libwebserv/response.h> -#include <libwebserv/server.h> - -#include "buffet/dbus_constants.h" - -namespace buffet { - -namespace { - -class RequestImpl : public weave::HttpServer::Request { - public: - explicit RequestImpl(std::unique_ptr<libwebserv::Request> request) - : request_{std::move(request)} {} - ~RequestImpl() override {} - - // HttpServer::Request implementation. - const std::string& GetPath() const override { return request_->GetPath(); } - std::string GetFirstHeader(const std::string& name) const override { - return request_->GetFirstHeader(name); - } - const std::vector<uint8_t>& GetData() const override { - return request_->GetData(); - } - - private: - std::unique_ptr<libwebserv::Request> request_; - - DISALLOW_COPY_AND_ASSIGN(RequestImpl); -}; - -} // namespace - -WebServClient::~WebServClient() { - web_server_->Disconnect(); -} - -void WebServClient::AddOnStateChangedCallback( - const OnStateChangedCallback& callback) { - on_state_changed_callbacks_.push_back(callback); - callback.Run(*this); -} - -void WebServClient::AddRequestHandler(const std::string& path_prefix, - const OnRequestCallback& callback) { - web_server_->GetDefaultHttpHandler()->AddHandlerCallback( - path_prefix, "", base::Bind(&WebServClient::OnRequest, - weak_ptr_factory_.GetWeakPtr(), callback)); - web_server_->GetDefaultHttpsHandler()->AddHandlerCallback( - path_prefix, "", base::Bind(&WebServClient::OnRequest, - weak_ptr_factory_.GetWeakPtr(), callback)); -} - -uint16_t WebServClient::GetHttpPort() const { - return http_port_; -} - -uint16_t WebServClient::GetHttpsPort() const { - return https_port_; -} - -const chromeos::Blob& WebServClient::GetHttpsCertificateFingerprint() const { - return certificate_; -} - -WebServClient::WebServClient( - const scoped_refptr<dbus::Bus>& bus, - chromeos::dbus_utils::AsyncEventSequencer* sequencer) { - web_server_.reset(new libwebserv::Server); - web_server_->OnProtocolHandlerConnected( - base::Bind(&WebServClient::OnProtocolHandlerConnected, - weak_ptr_factory_.GetWeakPtr())); - web_server_->OnProtocolHandlerDisconnected( - base::Bind(&WebServClient::OnProtocolHandlerDisconnected, - weak_ptr_factory_.GetWeakPtr())); - - web_server_->Connect(bus, buffet::kServiceName, - sequencer->GetHandler("Server::Connect failed.", true), - base::Bind(&base::DoNothing), - base::Bind(&base::DoNothing)); -} - -void WebServClient::OnRequest(const OnRequestCallback& callback, - std::unique_ptr<libwebserv::Request> request, - std::unique_ptr<libwebserv::Response> response) { - callback.Run( - RequestImpl{std::move(request)}, - base::Bind(&WebServClient::OnResponse, weak_ptr_factory_.GetWeakPtr(), - base::Passed(&response))); -} - -void WebServClient::OnResponse(std::unique_ptr<libwebserv::Response> response, - int status_code, - const std::string& data, - const std::string& mime_type) { - response->Reply(status_code, data.data(), data.size(), mime_type); -} - -void WebServClient::OnProtocolHandlerConnected( - libwebserv::ProtocolHandler* protocol_handler) { - if (protocol_handler->GetName() == libwebserv::ProtocolHandler::kHttp) { - http_port_ = *protocol_handler->GetPorts().begin(); - } else if (protocol_handler->GetName() == - libwebserv::ProtocolHandler::kHttps) { - https_port_ = *protocol_handler->GetPorts().begin(); - certificate_ = protocol_handler->GetCertificateFingerprint(); - } - for (const auto& cb : on_state_changed_callbacks_) - cb.Run(*this); -} - -void WebServClient::OnProtocolHandlerDisconnected( - libwebserv::ProtocolHandler* protocol_handler) { - if (protocol_handler->GetName() == libwebserv::ProtocolHandler::kHttp) { - http_port_ = 0; - } else if (protocol_handler->GetName() == - libwebserv::ProtocolHandler::kHttps) { - https_port_ = 0; - certificate_.clear(); - } - for (const auto& cb : on_state_changed_callbacks_) - cb.Run(*this); -} - -} // namespace buffet
diff --git a/buffet/webserv_client.h b/buffet/webserv_client.h deleted file mode 100644 index d7b5433..0000000 --- a/buffet/webserv_client.h +++ /dev/null
@@ -1,80 +0,0 @@ -// Copyright 2015 The Chromium OS 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 BUFFET_WEBSERV_CLIENT_H_ -#define BUFFET_WEBSERV_CLIENT_H_ - -#include <memory> -#include <string> -#include <vector> - -#include <base/memory/weak_ptr.h> -#include <weave/http_server.h> - -namespace dbus { -class Bus; -} - -namespace chromeos { -namespace dbus_utils { -class AsyncEventSequencer; -} -} - -namespace libwebserv { -class ProtocolHandler; -class Request; -class Response; -class Server; -} - -namespace buffet { - -// Wrapper around libwebserv that implements HttpServer interface. -class WebServClient : public weave::HttpServer { - public: - WebServClient(const scoped_refptr<dbus::Bus>& bus, - chromeos::dbus_utils::AsyncEventSequencer* sequencer); - ~WebServClient() override; - - // HttpServer implementation. - void AddOnStateChangedCallback( - const OnStateChangedCallback& callback) override; - void AddRequestHandler(const std::string& path_prefix, - const OnRequestCallback& callback) override; - uint16_t GetHttpPort() const override; - uint16_t GetHttpsPort() const override; - const chromeos::Blob& GetHttpsCertificateFingerprint() const override; - - private: - void OnRequest(const OnRequestCallback& callback, - std::unique_ptr<libwebserv::Request> request, - std::unique_ptr<libwebserv::Response> response); - - void OnResponse(std::unique_ptr<libwebserv::Response> response, - int status_code, - const std::string& data, - const std::string& mime_type); - - void OnProtocolHandlerConnected( - libwebserv::ProtocolHandler* protocol_handler); - - void OnProtocolHandlerDisconnected( - libwebserv::ProtocolHandler* protocol_handler); - - uint16_t http_port_{0}; - uint16_t https_port_{0}; - chromeos::Blob certificate_; - - std::vector<OnStateChangedCallback> on_state_changed_callbacks_; - - std::unique_ptr<libwebserv::Server> web_server_; - - base::WeakPtrFactory<WebServClient> weak_ptr_factory_{this}; - DISALLOW_COPY_AND_ASSIGN(WebServClient); -}; - -} // namespace buffet - -#endif // BUFFET_WEBSERV_CLIENT_H_