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