1cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// Copyright 2015 The Android Open Source Project 2cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// 3cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// Licensed under the Apache License, Version 2.0 (the "License"); 4cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// you may not use this file except in compliance with the License. 5cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// You may obtain a copy of the License at 6cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// 7cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// http://www.apache.org/licenses/LICENSE-2.0 8cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// 9cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// Unless required by applicable law or agreed to in writing, software 10cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// distributed under the License is distributed on an "AS IS" BASIS, 11cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// See the License for the specific language governing permissions and 13cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// limitations under the License. 144b5f04c56a2f13b4ec178ce430ea57ddadf1225fChristopher Wiley 154b5f04c56a2f13b4ec178ce430ea57ddadf1225fChristopher Wiley#ifndef BUFFET_MANAGER_H_ 164b5f04c56a2f13b4ec178ce430ea57ddadf1225fChristopher Wiley#define BUFFET_MANAGER_H_ 174b5f04c56a2f13b4ec178ce430ea57ddadf1225fChristopher Wiley 1824aa1222afa953e7f94c7729af5084d816ed46bfAlex Vakulenko#include <memory> 19da2312c1680a4f96ea48d24e4f02c0aa08c9251aVitaly Buka#include <set> 2024aa1222afa953e7f94c7729af5084d816ed46bfAlex Vakulenko#include <string> 21acec6aa730dd537583b3a7f48814f089a42cbabdAlex Vakulenko#include <vector> 2224aa1222afa953e7f94c7729af5084d816ed46bfAlex Vakulenko 23357deca5ddee619afb0d6fe24ab8bdeed6c3c43eChristopher Wiley#include <base/files/file_path.h> 24274226bab9c240b22ea230fa15b95a789e10179bAlex Vakulenko#include <base/macros.h> 25d71774fa4971503ddcaae6a0cc70a37702934f14Christopher Wiley#include <base/memory/weak_ptr.h> 26f3d77e5f9fd79d43057d22e95d659cb2ff92e4b3Alex Vakulenko#include <base/values.h> 27ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko#include <brillo/dbus/async_event_sequencer.h> 284170585fe75d99036883229081420f2972dd4ec1Alex Vakulenko#include <brillo/errors/error.h> 290371fea7a697a8c56ebaa2a3ab6d5e3770da341bAlex Vakulenko#include <nativepower/power_manager_client.h> 30e2713aceb7b2fb9d2486cfdd983e44a1f8832ecbVitaly Buka#include <weave/device.h> 314b5f04c56a2f13b4ec178ce430ea57ddadf1225fChristopher Wiley 32ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko#include "android/weave/BnWeaveServiceManager.h" 33ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko#include "buffet/binder_weave_service.h" 340022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko#include "buffet/buffet_config.h" 351aa980ea5f5325cb5f5fc43c1748fbb393c6ec51Christopher Wiley 363b0863183b7cc527be15cb0bd6d9db8ae32d923dVitaly Bukanamespace buffet { 374b5f04c56a2f13b4ec178ce430ea57ddadf1225fChristopher Wiley 38f86123d4738a875523df9d9c10143d766309cba3Robert Gindaclass BluetoothClient; 3900882b78d09f4d3bc5db9de626de374984e2bfd6Vitaly Bukaclass HttpTransportClient; 40f0f55340a10fea9d106b832cd1392441a5efcfd4Alex Vakulenkoclass MdnsClient; 41786a90630feaa70b81e029edd4f6620e7ab3a211Peter Qiuclass ShillClient; 421642bec2c8a50aa40c0e40fc76c80187607d9525Alex Vakulenkoclass WebServClient; 43a0305d34a19eec89b0ebc1929617a7c5b784d4c4Vitaly Buka 444b5f04c56a2f13b4ec178ce430ea57ddadf1225fChristopher Wiley// The Manager is responsible for global state of Buffet. It exposes 454b5f04c56a2f13b4ec178ce430ea57ddadf1225fChristopher Wiley// interfaces which affect the entire device such as device registration and 464b5f04c56a2f13b4ec178ce430ea57ddadf1225fChristopher Wiley// device state. 47ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenkoclass Manager final : public android::weave::BnWeaveServiceManager { 484b5f04c56a2f13b4ec178ce430ea57ddadf1225fChristopher Wiley public: 490022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko struct Options { 500022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko bool xmpp_enabled = true; 510022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko bool disable_privet = false; 520022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko bool enable_ping = false; 532915a7b9a45821a7530d2fea8a982bc1b6efc7d3Alex Vakulenko std::set<std::string> device_whitelist; 542915a7b9a45821a7530d2fea8a982bc1b6efc7d3Alex Vakulenko 552915a7b9a45821a7530d2fea8a982bc1b6efc7d3Alex Vakulenko BuffetConfig::Options config_options; 560022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko }; 570022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko 58ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko Manager(const Options& options, const scoped_refptr<dbus::Bus>& bus); 59ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko ~Manager() override; 60ecf961a28365581f179f47d30f4259cb7a5ad028Alex Vakulenko 614170585fe75d99036883229081420f2972dd4ec1Alex Vakulenko void Start(brillo::dbus_utils::AsyncEventSequencer* sequencer); 6284fd6dd850ac58a0f17f8d30a683b1f983e52435Vitaly Buka void Stop(); 634b5f04c56a2f13b4ec178ce430ea57ddadf1225fChristopher Wiley 644b5f04c56a2f13b4ec178ce430ea57ddadf1225fChristopher Wiley private: 654170585fe75d99036883229081420f2972dd4ec1Alex Vakulenko void RestartWeave(brillo::dbus_utils::AsyncEventSequencer* sequencer); 66be39e9339baa85af546344da40b0663a6aea1a97Alex Vakulenko void CreateDevice(); 672915a7b9a45821a7530d2fea8a982bc1b6efc7d3Alex Vakulenko 68ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko // Binder methods for IWeaveServiceManager: 69ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko using WeaveServiceManagerNotificationListener = 70ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko android::sp<android::weave::IWeaveServiceManagerNotificationListener>; 71ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko android::binder::Status connect( 72ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko const android::sp<android::weave::IWeaveClient>& client) override; 73ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko android::binder::Status registerNotificationListener( 74ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko const WeaveServiceManagerNotificationListener& listener) override; 75ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko android::binder::Status getDeviceId(android::String16* id) override; 76ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko android::binder::Status getCloudId(android::String16* id) override; 77ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko android::binder::Status getDeviceName(android::String16* name) override; 78ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko android::binder::Status getDeviceDescription( 79ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko android::String16* description) override; 80ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko android::binder::Status getDeviceLocation( 81ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko android::String16* location) override; 82ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko android::binder::Status getOemName(android::String16* name) override; 83ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko android::binder::Status getModelName(android::String16* name) override; 84ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko android::binder::Status getModelId(android::String16* id) override; 85ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko android::binder::Status getPairingSessionId(android::String16* id) override; 86ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko android::binder::Status getPairingMode(android::String16* mode) override; 87ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko android::binder::Status getPairingCode(android::String16* code) override; 88ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko android::binder::Status getState(android::String16* state) override; 89ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko android::binder::Status getTraits(android::String16* traits) override; 90ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko android::binder::Status getComponents(android::String16* components) override; 9184fd6dd850ac58a0f17f8d30a683b1f983e52435Vitaly Buka 9214b3e6e052de2e706cfa6f011c5db83fb6ca6e65Alex Vakulenko void OnTraitDefsChanged(); 9314b3e6e052de2e706cfa6f011c5db83fb6ca6e65Alex Vakulenko void OnComponentTreeChanged(); 940022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko void OnGcdStateChanged(weave::GcdState state); 9500b83491a3cdd9bda8784585501dbdb58466b9b4Vitaly Buka void OnConfigChanged(const weave::Settings& settings); 967b3ba79c30f381424b7f4115f2f2b8bdb8dde88dVitaly Buka void OnPairingStart(const std::string& session_id, 970c6dcd2dacc3d4f0024973d938f0537bb93773a4Vitaly Buka weave::PairingType pairing_type, 987b3ba79c30f381424b7f4115f2f2b8bdb8dde88dVitaly Buka const std::vector<uint8_t>& code); 997b3ba79c30f381424b7f4115f2f2b8bdb8dde88dVitaly Buka void OnPairingEnd(const std::string& session_id); 1002f7729382e9a7daf309ae5a5c8b9f7c0644befd6Christopher Wiley 101ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko void CreateServicesForClients(); 102ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko void OnClientDisconnected( 103ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko const android::sp<android::weave::IWeaveClient>& client); 104ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko void OnNotificationListenerDestroyed( 105ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko const WeaveServiceManagerNotificationListener& notification_listener); 106ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko void NotifyServiceManagerChange(const std::vector<int>& notification_ids); 1070371fea7a697a8c56ebaa2a3ab6d5e3770da341bAlex Vakulenko void OnRebootDevice(const std::weak_ptr<weave::Command>& cmd); 1080371fea7a697a8c56ebaa2a3ab6d5e3770da341bAlex Vakulenko void RebootDeviceNow(); 10994f8eba2f71f0d73e15bfd5b1c28bb0ed682706dAlex Vakulenko 1102915a7b9a45821a7530d2fea8a982bc1b6efc7d3Alex Vakulenko Options options_; 111ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko scoped_refptr<dbus::Bus> bus_; 1124b5f04c56a2f13b4ec178ce430ea57ddadf1225fChristopher Wiley 113e74c872e5d3d927c373d94e40549035c7ce9648cVitaly Buka class TaskRunner; 114e74c872e5d3d927c373d94e40549035c7ce9648cVitaly Buka std::unique_ptr<TaskRunner> task_runner_; 115f86123d4738a875523df9d9c10143d766309cba3Robert Ginda std::unique_ptr<BluetoothClient> bluetooth_client_; 1162915a7b9a45821a7530d2fea8a982bc1b6efc7d3Alex Vakulenko std::unique_ptr<BuffetConfig> config_; 11700882b78d09f4d3bc5db9de626de374984e2bfd6Vitaly Buka std::unique_ptr<HttpTransportClient> http_client_; 118786a90630feaa70b81e029edd4f6620e7ab3a211Peter Qiu std::unique_ptr<ShillClient> shill_client_; 119f0f55340a10fea9d106b832cd1392441a5efcfd4Alex Vakulenko std::unique_ptr<MdnsClient> mdns_client_; 1201642bec2c8a50aa40c0e40fc76c80187607d9525Alex Vakulenko std::unique_ptr<WebServClient> web_serv_client_; 1210c6dcd2dacc3d4f0024973d938f0537bb93773a4Vitaly Buka std::unique_ptr<weave::Device> device_; 122ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko 123ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko std::vector<android::sp<android::weave::IWeaveClient>> pending_clients_; 124ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko std::map<android::sp<android::weave::IWeaveClient>, 125ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko android::sp<BinderWeaveService>> services_; 126ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko std::set<WeaveServiceManagerNotificationListener> notification_listeners_; 1270371fea7a697a8c56ebaa2a3ab6d5e3770da341bAlex Vakulenko android::PowerManagerClient power_manager_client_; 128ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko 129ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko // State properties. 130ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko std::string cloud_id_; 131ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko std::string device_id_; 132ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko std::string device_name_; 133ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko std::string device_description_; 134ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko std::string device_location_; 135ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko std::string oem_name_; 136ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko std::string model_name_; 137ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko std::string model_id_; 138ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko std::string pairing_session_id_; 139ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko std::string pairing_mode_; 140ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko std::string pairing_code_; 141ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko std::string state_; 142f3d77e5f9fd79d43057d22e95d659cb2ff92e4b3Alex Vakulenko 143e43871f2e06996d6fec175865099ec34d08b4e10Vitaly Buka base::WeakPtrFactory<Manager> weak_ptr_factory_{this}; 1444b5f04c56a2f13b4ec178ce430ea57ddadf1225fChristopher Wiley DISALLOW_COPY_AND_ASSIGN(Manager); 1454b5f04c56a2f13b4ec178ce430ea57ddadf1225fChristopher Wiley}; 1464b5f04c56a2f13b4ec178ce430ea57ddadf1225fChristopher Wiley 1474b5f04c56a2f13b4ec178ce430ea57ddadf1225fChristopher Wiley} // namespace buffet 1484b5f04c56a2f13b4ec178ce430ea57ddadf1225fChristopher Wiley 1494b5f04c56a2f13b4ec178ce430ea57ddadf1225fChristopher Wiley#endif // BUFFET_MANAGER_H_ 150