1 // Copyright 2015 The Android Open Source Project 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 #ifndef BUFFET_MANAGER_H_ 16 #define BUFFET_MANAGER_H_ 17 18 #include <memory> 19 #include <set> 20 #include <string> 21 #include <vector> 22 23 #include <base/files/file_path.h> 24 #include <base/macros.h> 25 #include <base/memory/weak_ptr.h> 26 #include <base/values.h> 27 #include <brillo/dbus/async_event_sequencer.h> 28 #include <brillo/errors/error.h> 29 #include <nativepower/power_manager_client.h> 30 #include <weave/device.h> 31 32 #include "android/weave/BnWeaveServiceManager.h" 33 #include "buffet/binder_weave_service.h" 34 #include "buffet/buffet_config.h" 35 36 namespace buffet { 37 38 class BluetoothClient; 39 class HttpTransportClient; 40 class MdnsClient; 41 class ShillClient; 42 class WebServClient; 43 44 // The Manager is responsible for global state of Buffet. It exposes 45 // interfaces which affect the entire device such as device registration and 46 // device state. 47 class Manager final : public android::weave::BnWeaveServiceManager { 48 public: 49 struct Options { 50 bool xmpp_enabled = true; 51 bool disable_privet = false; 52 bool enable_ping = false; 53 std::set<std::string> device_whitelist; 54 55 BuffetConfig::Options config_options; 56 }; 57 58 Manager(const Options& options, const scoped_refptr<dbus::Bus>& bus); 59 ~Manager() override; 60 61 void Start(brillo::dbus_utils::AsyncEventSequencer* sequencer); 62 void Stop(); 63 64 private: 65 void RestartWeave(brillo::dbus_utils::AsyncEventSequencer* sequencer); 66 void CreateDevice(); 67 68 // Binder methods for IWeaveServiceManager: 69 using WeaveServiceManagerNotificationListener = 70 android::sp<android::weave::IWeaveServiceManagerNotificationListener>; 71 android::binder::Status connect( 72 const android::sp<android::weave::IWeaveClient>& client) override; 73 android::binder::Status registerNotificationListener( 74 const WeaveServiceManagerNotificationListener& listener) override; 75 android::binder::Status getDeviceId(android::String16* id) override; 76 android::binder::Status getCloudId(android::String16* id) override; 77 android::binder::Status getDeviceName(android::String16* name) override; 78 android::binder::Status getDeviceDescription( 79 android::String16* description) override; 80 android::binder::Status getDeviceLocation( 81 android::String16* location) override; 82 android::binder::Status getOemName(android::String16* name) override; 83 android::binder::Status getModelName(android::String16* name) override; 84 android::binder::Status getModelId(android::String16* id) override; 85 android::binder::Status getPairingSessionId(android::String16* id) override; 86 android::binder::Status getPairingMode(android::String16* mode) override; 87 android::binder::Status getPairingCode(android::String16* code) override; 88 android::binder::Status getState(android::String16* state) override; 89 android::binder::Status getTraits(android::String16* traits) override; 90 android::binder::Status getComponents(android::String16* components) override; 91 92 void OnTraitDefsChanged(); 93 void OnComponentTreeChanged(); 94 void OnGcdStateChanged(weave::GcdState state); 95 void OnConfigChanged(const weave::Settings& settings); 96 void OnPairingStart(const std::string& session_id, 97 weave::PairingType pairing_type, 98 const std::vector<uint8_t>& code); 99 void OnPairingEnd(const std::string& session_id); 100 101 void CreateServicesForClients(); 102 void OnClientDisconnected( 103 const android::sp<android::weave::IWeaveClient>& client); 104 void OnNotificationListenerDestroyed( 105 const WeaveServiceManagerNotificationListener& notification_listener); 106 void NotifyServiceManagerChange(const std::vector<int>& notification_ids); 107 void OnRebootDevice(const std::weak_ptr<weave::Command>& cmd); 108 void RebootDeviceNow(); 109 110 Options options_; 111 scoped_refptr<dbus::Bus> bus_; 112 113 class TaskRunner; 114 std::unique_ptr<TaskRunner> task_runner_; 115 std::unique_ptr<BluetoothClient> bluetooth_client_; 116 std::unique_ptr<BuffetConfig> config_; 117 std::unique_ptr<HttpTransportClient> http_client_; 118 std::unique_ptr<ShillClient> shill_client_; 119 std::unique_ptr<MdnsClient> mdns_client_; 120 std::unique_ptr<WebServClient> web_serv_client_; 121 std::unique_ptr<weave::Device> device_; 122 123 std::vector<android::sp<android::weave::IWeaveClient>> pending_clients_; 124 std::map<android::sp<android::weave::IWeaveClient>, 125 android::sp<BinderWeaveService>> services_; 126 std::set<WeaveServiceManagerNotificationListener> notification_listeners_; 127 android::PowerManagerClient power_manager_client_; 128 129 // State properties. 130 std::string cloud_id_; 131 std::string device_id_; 132 std::string device_name_; 133 std::string device_description_; 134 std::string device_location_; 135 std::string oem_name_; 136 std::string model_name_; 137 std::string model_id_; 138 std::string pairing_session_id_; 139 std::string pairing_mode_; 140 std::string pairing_code_; 141 std::string state_; 142 143 base::WeakPtrFactory<Manager> weak_ptr_factory_{this}; 144 DISALLOW_COPY_AND_ASSIGN(Manager); 145 }; 146 147 } // namespace buffet 148 149 #endif // BUFFET_MANAGER_H_ 150