• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2015 The Weave Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef LIBWEAVE_INCLUDE_WEAVE_DEVICE_H_
6 #define LIBWEAVE_INCLUDE_WEAVE_DEVICE_H_
7 
8 #include <memory>
9 #include <set>
10 #include <string>
11 #include <vector>
12 
13 #include <weave/command.h>
14 #include <weave/export.h>
15 #include <weave/provider/bluetooth.h>
16 #include <weave/provider/config_store.h>
17 #include <weave/provider/dns_service_discovery.h>
18 #include <weave/provider/http_client.h>
19 #include <weave/provider/http_server.h>
20 #include <weave/provider/network.h>
21 #include <weave/provider/task_runner.h>
22 #include <weave/provider/wifi.h>
23 
24 namespace weave {
25 
26 // States of Gcd connection.
27 enum class GcdState {
28   kUnconfigured,        // Device was not registered.
29   kConnecting,          // We have credentials but not yet connected.
30   kConnected,           // We're registered and connected to the cloud.
31   kInvalidCredentials,  // Our registration has been revoked.
32 };
33 
34 class Device {
35  public:
~Device()36   virtual ~Device() {}
37 
38   // Returns reference the current settings.
39   virtual const Settings& GetSettings() const = 0;
40 
41   // Callback type for AddSettingsChangedCallback.
42   using SettingsChangedCallback =
43       base::Callback<void(const Settings& settings)>;
44 
45   // Subscribes to notification settings changes.
46   virtual void AddSettingsChangedCallback(
47       const SettingsChangedCallback& callback) = 0;
48 
49   // Adds new trait definitions to device.
50   virtual void AddTraitDefinitionsFromJson(const std::string& json) = 0;
51   virtual void AddTraitDefinitions(const base::DictionaryValue& dict) = 0;
52 
53   // Returns the full JSON dictionary containing trait definitions.
54   virtual const base::DictionaryValue& GetTraits() const = 0;
55 
56   // Sets callback which is called when new trait definitions are added.
57   virtual void AddTraitDefsChangedCallback(const base::Closure& callback) = 0;
58 
59   // Adds a new component instance to device. Traits used by this component
60   // must be already defined.
61   virtual bool AddComponent(const std::string& name,
62                             const std::vector<std::string>& traits,
63                             ErrorPtr* error) = 0;
64 
65   // Removes an existing component instance from device.
66   virtual bool RemoveComponent(const std::string& name,
67                                ErrorPtr* error) = 0;
68 
69   // Sets callback which is called when new components are added.
70   virtual void AddComponentTreeChangedCallback(
71       const base::Closure& callback) = 0;
72 
73   // Returns the full JSON dictionary containing component instances.
74   virtual const base::DictionaryValue& GetComponents() const = 0;
75 
76   // Sets value of multiple properties of the state.
77   // It's recommended to call this to initialize component state defined.
78   // Example:
79   //   device->SetStatePropertiesFromJson("myComponent",
80   //                                      "{'base':{'firmwareVersion':'123'}}")
81   // Method completely replaces properties included |json| or |dict|.
82   // Properties of the state not included |json| or |dict| will stay unchanged.
83   virtual bool SetStatePropertiesFromJson(const std::string& component,
84                                           const std::string& json,
85                                           ErrorPtr* error) = 0;
86   virtual bool SetStateProperties(const std::string& component,
87                                   const base::DictionaryValue& dict,
88                                   ErrorPtr* error) = 0;
89 
90   // Returns value of the single property.
91   // |name| is full property name, including trait name. e.g. "base.network".
92   virtual const base::Value* GetStateProperty(const std::string& component,
93                                               const std::string& name,
94                                               ErrorPtr* error) const = 0;
95 
96   // Sets value of the single property.
97   // |name| is full property name, including trait name. e.g. "base.network".
98   virtual bool SetStateProperty(const std::string& component,
99                                 const std::string& name,
100                                 const base::Value& value,
101                                 ErrorPtr* error) = 0;
102 
103   // Callback type for AddCommandHandler.
104   using CommandHandlerCallback =
105       base::Callback<void(const std::weak_ptr<Command>& command)>;
106 
107   // Sets handler for new commands added to the queue.
108   // |component| is the name of the component for which commands should be
109   // handled.
110   // |command_name| is the full command name of the command to handle. e.g.
111   // "base.reboot". Each command can have no more than one handler.
112   // Empty |component| and |command_name| sets default handler for all unhanded
113   // commands.
114   // No new command handlers can be set after default handler was set.
115   virtual void AddCommandHandler(const std::string& component,
116                                  const std::string& command_name,
117                                  const CommandHandlerCallback& callback) = 0;
118 
119   // Adds a new command to the command queue.
120   virtual bool AddCommand(const base::DictionaryValue& command,
121                           std::string* id,
122                           ErrorPtr* error) = 0;
123 
124   // Finds a command by the command |id|. Returns nullptr if the command with
125   // the given |id| is not found. The returned pointer should not be persisted
126   // for a long period of time.
127   virtual Command* FindCommand(const std::string& id) = 0;
128 
129   // Sets callback which is called when stat is changed.
130   virtual void AddStateChangedCallback(const base::Closure& callback) = 0;
131 
132   // Returns current state of GCD connection.
133   virtual GcdState GetGcdState() const = 0;
134 
135   // Callback type for GcdStatusCallback.
136   using GcdStateChangedCallback = base::Callback<void(GcdState state)>;
137 
138   // Sets callback which is called when state of server connection changed.
139   virtual void AddGcdStateChangedCallback(
140       const GcdStateChangedCallback& callback) = 0;
141 
142   // Registers the device.
143   // This is testing method and should not be used by applications.
144   virtual void Register(const std::string& ticket_id,
145                         const DoneCallback& callback) = 0;
146 
147   // Handler should display pin code to the user.
148   using PairingBeginCallback =
149       base::Callback<void(const std::string& session_id,
150                           PairingType pairing_type,
151                           const std::vector<uint8_t>& code)>;
152 
153   // Handler should stop displaying pin code.
154   using PairingEndCallback =
155       base::Callback<void(const std::string& session_id)>;
156   // Subscribes to notification about client pairing events.
157 
158   virtual void AddPairingChangedCallbacks(
159       const PairingBeginCallback& begin_callback,
160       const PairingEndCallback& end_callback) = 0;
161 
162   LIBWEAVE_EXPORT static std::unique_ptr<Device> Create(
163       provider::ConfigStore* config_store,
164       provider::TaskRunner* task_runner,
165       provider::HttpClient* http_client,
166       provider::Network* network,
167       provider::DnsServiceDiscovery* dns_sd,
168       provider::HttpServer* http_server,
169       provider::Wifi* wifi,
170       provider::Bluetooth* bluetooth_provider);
171 
172   //========================== Deprecated APIs =========================
173 
174   // Adds provided commands definitions. Can be called multiple times with
175   // condition that definitions do not conflict.
176   // Invalid value is fatal.
177   // DO NOT USE IN YOUR CODE: use AddTraitDefinitions() instead.
178   LIBWEAVE_DEPRECATED virtual void AddCommandDefinitionsFromJson(
179       const std::string& json) = 0;
180   LIBWEAVE_DEPRECATED virtual void AddCommandDefinitions(
181       const base::DictionaryValue& dict) = 0;
182 
183   // Sets handler for new commands added to the queue.
184   // |command_name| is the full command name of the command to handle. e.g.
185   // "base.reboot". Each command can have no more than one handler.
186   // Empty |command_name| sets default handler for all unhanded commands.
187   // No new command handlers can be set after default handler was set.
188   // DO NOT USE IN YOUR CODE: use AddCommandHandler() with component parameter.
189   LIBWEAVE_DEPRECATED virtual void AddCommandHandler(
190       const std::string& command_name,
191       const CommandHandlerCallback& callback) = 0;
192 
193   // Adds provided state definitions. Can be called multiple times with
194   // condition that definitions do not conflict.
195   // Invalid value is fatal.
196   // DO NOT USE IN YOUR CODE: use AddTraitDefinitions() instead.
197   LIBWEAVE_DEPRECATED virtual void AddStateDefinitionsFromJson(
198       const std::string& json) = 0;
199   LIBWEAVE_DEPRECATED virtual void AddStateDefinitions(
200       const base::DictionaryValue& dict) = 0;
201 
202   // Sets value of multiple properties of the state.
203   // It's recommended to call this to initialize state defined by
204   // AddStateDefinitions.
205   // Example:
206   //   device->SetStatePropertiesFromJson("{'base':{'firmwareVersion':'123'}}")
207   // Method completely replaces properties included |json| or |dict|.
208   // Properties of the state not included |json| or |dict| will stay unchanged.
209   // DO NOT USE IN YOUR CODE: use SetStateProperties() with component parameter.
210   LIBWEAVE_DEPRECATED virtual bool SetStatePropertiesFromJson(
211       const std::string& json,
212       ErrorPtr* error) = 0;
213   LIBWEAVE_DEPRECATED virtual bool SetStateProperties(
214       const base::DictionaryValue& dict,
215       ErrorPtr* error) = 0;
216 
217   // Returns value of the single property.
218   // |name| is full property name, including package name. e.g. "base.network".
219   // DO NOT USE IN YOUR CODE: use GetStateProperty() with component parameter.
220   LIBWEAVE_DEPRECATED virtual const base::Value* GetStateProperty(
221       const std::string& name) const = 0;
222 
223   // Sets value of the single property.
224   // |name| is full property name, including package name. e.g. "base.network".
225   // DO NOT USE IN YOUR CODE: use SetStateProperty() with component parameter.
226   LIBWEAVE_DEPRECATED virtual bool SetStateProperty(const std::string& name,
227                                                     const base::Value& value,
228                                                     ErrorPtr* error) = 0;
229 
230   // Returns aggregated state properties across all registered packages.
231   // DO NOT USE IN YOUR CODE: use GetComponents() instead.
232   LIBWEAVE_DEPRECATED virtual const base::DictionaryValue& GetState() const = 0;
233 };
234 
235 }  // namespace weave
236 
237 #endif  // LIBWEAVE_INCLUDE_WEAVE_DEVICE_H_
238