xref: /aosp_15_r20/external/libchrome/dbus/property.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker 
5*635a8641SAndroid Build Coastguard Worker #include "dbus/property.h"
6*635a8641SAndroid Build Coastguard Worker 
7*635a8641SAndroid Build Coastguard Worker #include <stddef.h>
8*635a8641SAndroid Build Coastguard Worker 
9*635a8641SAndroid Build Coastguard Worker #include <memory>
10*635a8641SAndroid Build Coastguard Worker 
11*635a8641SAndroid Build Coastguard Worker #include "base/bind.h"
12*635a8641SAndroid Build Coastguard Worker #include "base/logging.h"
13*635a8641SAndroid Build Coastguard Worker 
14*635a8641SAndroid Build Coastguard Worker #include "dbus/message.h"
15*635a8641SAndroid Build Coastguard Worker #include "dbus/object_path.h"
16*635a8641SAndroid Build Coastguard Worker #include "dbus/object_proxy.h"
17*635a8641SAndroid Build Coastguard Worker 
18*635a8641SAndroid Build Coastguard Worker namespace dbus {
19*635a8641SAndroid Build Coastguard Worker 
20*635a8641SAndroid Build Coastguard Worker //
21*635a8641SAndroid Build Coastguard Worker // PropertyBase implementation.
22*635a8641SAndroid Build Coastguard Worker //
23*635a8641SAndroid Build Coastguard Worker 
PropertyBase()24*635a8641SAndroid Build Coastguard Worker PropertyBase::PropertyBase() : property_set_(nullptr), is_valid_(false) {}
25*635a8641SAndroid Build Coastguard Worker 
26*635a8641SAndroid Build Coastguard Worker PropertyBase::~PropertyBase() = default;
27*635a8641SAndroid Build Coastguard Worker 
Init(PropertySet * property_set,const std::string & name)28*635a8641SAndroid Build Coastguard Worker void PropertyBase::Init(PropertySet* property_set, const std::string& name) {
29*635a8641SAndroid Build Coastguard Worker   DCHECK(!property_set_);
30*635a8641SAndroid Build Coastguard Worker   property_set_ = property_set;
31*635a8641SAndroid Build Coastguard Worker   is_valid_ = false;
32*635a8641SAndroid Build Coastguard Worker   name_ = name;
33*635a8641SAndroid Build Coastguard Worker }
34*635a8641SAndroid Build Coastguard Worker 
35*635a8641SAndroid Build Coastguard Worker //
36*635a8641SAndroid Build Coastguard Worker // PropertySet implementation.
37*635a8641SAndroid Build Coastguard Worker //
38*635a8641SAndroid Build Coastguard Worker 
PropertySet(ObjectProxy * object_proxy,const std::string & interface,const PropertyChangedCallback & property_changed_callback)39*635a8641SAndroid Build Coastguard Worker PropertySet::PropertySet(
40*635a8641SAndroid Build Coastguard Worker     ObjectProxy* object_proxy,
41*635a8641SAndroid Build Coastguard Worker     const std::string& interface,
42*635a8641SAndroid Build Coastguard Worker     const PropertyChangedCallback& property_changed_callback)
43*635a8641SAndroid Build Coastguard Worker     : object_proxy_(object_proxy),
44*635a8641SAndroid Build Coastguard Worker       interface_(interface),
45*635a8641SAndroid Build Coastguard Worker       property_changed_callback_(property_changed_callback),
46*635a8641SAndroid Build Coastguard Worker       weak_ptr_factory_(this) {}
47*635a8641SAndroid Build Coastguard Worker 
48*635a8641SAndroid Build Coastguard Worker PropertySet::~PropertySet() = default;
49*635a8641SAndroid Build Coastguard Worker 
RegisterProperty(const std::string & name,PropertyBase * property)50*635a8641SAndroid Build Coastguard Worker void PropertySet::RegisterProperty(const std::string& name,
51*635a8641SAndroid Build Coastguard Worker                                    PropertyBase* property) {
52*635a8641SAndroid Build Coastguard Worker   property->Init(this, name);
53*635a8641SAndroid Build Coastguard Worker   properties_map_[name] = property;
54*635a8641SAndroid Build Coastguard Worker }
55*635a8641SAndroid Build Coastguard Worker 
ConnectSignals()56*635a8641SAndroid Build Coastguard Worker void PropertySet::ConnectSignals() {
57*635a8641SAndroid Build Coastguard Worker   DCHECK(object_proxy_);
58*635a8641SAndroid Build Coastguard Worker   object_proxy_->ConnectToSignal(
59*635a8641SAndroid Build Coastguard Worker       kPropertiesInterface,
60*635a8641SAndroid Build Coastguard Worker       kPropertiesChanged,
61*635a8641SAndroid Build Coastguard Worker       base::Bind(&PropertySet::ChangedReceived,
62*635a8641SAndroid Build Coastguard Worker                  weak_ptr_factory_.GetWeakPtr()),
63*635a8641SAndroid Build Coastguard Worker       base::Bind(&PropertySet::ChangedConnected,
64*635a8641SAndroid Build Coastguard Worker                  weak_ptr_factory_.GetWeakPtr()));
65*635a8641SAndroid Build Coastguard Worker }
66*635a8641SAndroid Build Coastguard Worker 
67*635a8641SAndroid Build Coastguard Worker 
ChangedReceived(Signal * signal)68*635a8641SAndroid Build Coastguard Worker void PropertySet::ChangedReceived(Signal* signal) {
69*635a8641SAndroid Build Coastguard Worker   DCHECK(signal);
70*635a8641SAndroid Build Coastguard Worker   MessageReader reader(signal);
71*635a8641SAndroid Build Coastguard Worker 
72*635a8641SAndroid Build Coastguard Worker   std::string interface;
73*635a8641SAndroid Build Coastguard Worker   if (!reader.PopString(&interface)) {
74*635a8641SAndroid Build Coastguard Worker     LOG(WARNING) << "Property changed signal has wrong parameters: "
75*635a8641SAndroid Build Coastguard Worker                  << "expected interface name: " << signal->ToString();
76*635a8641SAndroid Build Coastguard Worker     return;
77*635a8641SAndroid Build Coastguard Worker   }
78*635a8641SAndroid Build Coastguard Worker 
79*635a8641SAndroid Build Coastguard Worker   if (interface != this->interface())
80*635a8641SAndroid Build Coastguard Worker     return;
81*635a8641SAndroid Build Coastguard Worker 
82*635a8641SAndroid Build Coastguard Worker   if (!UpdatePropertiesFromReader(&reader)) {
83*635a8641SAndroid Build Coastguard Worker     LOG(WARNING) << "Property changed signal has wrong parameters: "
84*635a8641SAndroid Build Coastguard Worker                  << "expected dictionary: " << signal->ToString();
85*635a8641SAndroid Build Coastguard Worker   }
86*635a8641SAndroid Build Coastguard Worker 
87*635a8641SAndroid Build Coastguard Worker   if (!InvalidatePropertiesFromReader(&reader)) {
88*635a8641SAndroid Build Coastguard Worker     LOG(WARNING) << "Property changed signal has wrong parameters: "
89*635a8641SAndroid Build Coastguard Worker                  << "expected array to invalidate: " << signal->ToString();
90*635a8641SAndroid Build Coastguard Worker   }
91*635a8641SAndroid Build Coastguard Worker }
92*635a8641SAndroid Build Coastguard Worker 
ChangedConnected(const std::string & interface_name,const std::string & signal_name,bool success)93*635a8641SAndroid Build Coastguard Worker void PropertySet::ChangedConnected(const std::string& interface_name,
94*635a8641SAndroid Build Coastguard Worker                                    const std::string& signal_name,
95*635a8641SAndroid Build Coastguard Worker                                    bool success) {
96*635a8641SAndroid Build Coastguard Worker   LOG_IF(WARNING, !success) << "Failed to connect to " << signal_name
97*635a8641SAndroid Build Coastguard Worker                             << "signal.";
98*635a8641SAndroid Build Coastguard Worker }
99*635a8641SAndroid Build Coastguard Worker 
100*635a8641SAndroid Build Coastguard Worker 
Get(PropertyBase * property,GetCallback callback)101*635a8641SAndroid Build Coastguard Worker void PropertySet::Get(PropertyBase* property, GetCallback callback) {
102*635a8641SAndroid Build Coastguard Worker   MethodCall method_call(kPropertiesInterface, kPropertiesGet);
103*635a8641SAndroid Build Coastguard Worker   MessageWriter writer(&method_call);
104*635a8641SAndroid Build Coastguard Worker   writer.AppendString(interface());
105*635a8641SAndroid Build Coastguard Worker   writer.AppendString(property->name());
106*635a8641SAndroid Build Coastguard Worker 
107*635a8641SAndroid Build Coastguard Worker   DCHECK(object_proxy_);
108*635a8641SAndroid Build Coastguard Worker   object_proxy_->CallMethod(&method_call,
109*635a8641SAndroid Build Coastguard Worker                             ObjectProxy::TIMEOUT_USE_DEFAULT,
110*635a8641SAndroid Build Coastguard Worker                             base::Bind(&PropertySet::OnGet,
111*635a8641SAndroid Build Coastguard Worker                                        GetWeakPtr(),
112*635a8641SAndroid Build Coastguard Worker                                        property,
113*635a8641SAndroid Build Coastguard Worker                                        callback));
114*635a8641SAndroid Build Coastguard Worker }
115*635a8641SAndroid Build Coastguard Worker 
OnGet(PropertyBase * property,GetCallback callback,Response * response)116*635a8641SAndroid Build Coastguard Worker void PropertySet::OnGet(PropertyBase* property, GetCallback callback,
117*635a8641SAndroid Build Coastguard Worker                         Response* response) {
118*635a8641SAndroid Build Coastguard Worker   if (!response) {
119*635a8641SAndroid Build Coastguard Worker     LOG(WARNING) << property->name() << ": Get: failed.";
120*635a8641SAndroid Build Coastguard Worker     return;
121*635a8641SAndroid Build Coastguard Worker   }
122*635a8641SAndroid Build Coastguard Worker 
123*635a8641SAndroid Build Coastguard Worker   MessageReader reader(response);
124*635a8641SAndroid Build Coastguard Worker   if (property->PopValueFromReader(&reader)) {
125*635a8641SAndroid Build Coastguard Worker     property->set_valid(true);
126*635a8641SAndroid Build Coastguard Worker     NotifyPropertyChanged(property->name());
127*635a8641SAndroid Build Coastguard Worker   } else {
128*635a8641SAndroid Build Coastguard Worker     if (property->is_valid()) {
129*635a8641SAndroid Build Coastguard Worker       property->set_valid(false);
130*635a8641SAndroid Build Coastguard Worker       NotifyPropertyChanged(property->name());
131*635a8641SAndroid Build Coastguard Worker     }
132*635a8641SAndroid Build Coastguard Worker   }
133*635a8641SAndroid Build Coastguard Worker 
134*635a8641SAndroid Build Coastguard Worker   if (!callback.is_null())
135*635a8641SAndroid Build Coastguard Worker     callback.Run(response);
136*635a8641SAndroid Build Coastguard Worker }
137*635a8641SAndroid Build Coastguard Worker 
GetAndBlock(PropertyBase * property)138*635a8641SAndroid Build Coastguard Worker bool PropertySet::GetAndBlock(PropertyBase* property) {
139*635a8641SAndroid Build Coastguard Worker   MethodCall method_call(kPropertiesInterface, kPropertiesGet);
140*635a8641SAndroid Build Coastguard Worker   MessageWriter writer(&method_call);
141*635a8641SAndroid Build Coastguard Worker   writer.AppendString(interface());
142*635a8641SAndroid Build Coastguard Worker   writer.AppendString(property->name());
143*635a8641SAndroid Build Coastguard Worker 
144*635a8641SAndroid Build Coastguard Worker   DCHECK(object_proxy_);
145*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<dbus::Response> response(object_proxy_->CallMethodAndBlock(
146*635a8641SAndroid Build Coastguard Worker       &method_call, ObjectProxy::TIMEOUT_USE_DEFAULT));
147*635a8641SAndroid Build Coastguard Worker 
148*635a8641SAndroid Build Coastguard Worker   if (!response.get()) {
149*635a8641SAndroid Build Coastguard Worker     LOG(WARNING) << property->name() << ": GetAndBlock: failed.";
150*635a8641SAndroid Build Coastguard Worker     return false;
151*635a8641SAndroid Build Coastguard Worker   }
152*635a8641SAndroid Build Coastguard Worker 
153*635a8641SAndroid Build Coastguard Worker   MessageReader reader(response.get());
154*635a8641SAndroid Build Coastguard Worker   if (property->PopValueFromReader(&reader)) {
155*635a8641SAndroid Build Coastguard Worker     property->set_valid(true);
156*635a8641SAndroid Build Coastguard Worker     NotifyPropertyChanged(property->name());
157*635a8641SAndroid Build Coastguard Worker   } else {
158*635a8641SAndroid Build Coastguard Worker     if (property->is_valid()) {
159*635a8641SAndroid Build Coastguard Worker       property->set_valid(false);
160*635a8641SAndroid Build Coastguard Worker       NotifyPropertyChanged(property->name());
161*635a8641SAndroid Build Coastguard Worker     }
162*635a8641SAndroid Build Coastguard Worker   }
163*635a8641SAndroid Build Coastguard Worker   return true;
164*635a8641SAndroid Build Coastguard Worker }
165*635a8641SAndroid Build Coastguard Worker 
GetAll()166*635a8641SAndroid Build Coastguard Worker void PropertySet::GetAll() {
167*635a8641SAndroid Build Coastguard Worker   MethodCall method_call(kPropertiesInterface, kPropertiesGetAll);
168*635a8641SAndroid Build Coastguard Worker   MessageWriter writer(&method_call);
169*635a8641SAndroid Build Coastguard Worker   writer.AppendString(interface());
170*635a8641SAndroid Build Coastguard Worker 
171*635a8641SAndroid Build Coastguard Worker   DCHECK(object_proxy_);
172*635a8641SAndroid Build Coastguard Worker   object_proxy_->CallMethod(&method_call,
173*635a8641SAndroid Build Coastguard Worker                             ObjectProxy::TIMEOUT_USE_DEFAULT,
174*635a8641SAndroid Build Coastguard Worker                             base::Bind(&PropertySet::OnGetAll,
175*635a8641SAndroid Build Coastguard Worker                                        weak_ptr_factory_.GetWeakPtr()));
176*635a8641SAndroid Build Coastguard Worker }
177*635a8641SAndroid Build Coastguard Worker 
OnGetAll(Response * response)178*635a8641SAndroid Build Coastguard Worker void PropertySet::OnGetAll(Response* response) {
179*635a8641SAndroid Build Coastguard Worker   if (!response) {
180*635a8641SAndroid Build Coastguard Worker     LOG(WARNING) << "GetAll request failed for: " << interface_;
181*635a8641SAndroid Build Coastguard Worker     return;
182*635a8641SAndroid Build Coastguard Worker   }
183*635a8641SAndroid Build Coastguard Worker 
184*635a8641SAndroid Build Coastguard Worker   MessageReader reader(response);
185*635a8641SAndroid Build Coastguard Worker   if (!UpdatePropertiesFromReader(&reader)) {
186*635a8641SAndroid Build Coastguard Worker     LOG(WARNING) << "GetAll response has wrong parameters: "
187*635a8641SAndroid Build Coastguard Worker                  << "expected dictionary: " << response->ToString();
188*635a8641SAndroid Build Coastguard Worker   }
189*635a8641SAndroid Build Coastguard Worker }
190*635a8641SAndroid Build Coastguard Worker 
Set(PropertyBase * property,SetCallback callback)191*635a8641SAndroid Build Coastguard Worker void PropertySet::Set(PropertyBase* property, SetCallback callback) {
192*635a8641SAndroid Build Coastguard Worker   MethodCall method_call(kPropertiesInterface, kPropertiesSet);
193*635a8641SAndroid Build Coastguard Worker   MessageWriter writer(&method_call);
194*635a8641SAndroid Build Coastguard Worker   writer.AppendString(interface());
195*635a8641SAndroid Build Coastguard Worker   writer.AppendString(property->name());
196*635a8641SAndroid Build Coastguard Worker   property->AppendSetValueToWriter(&writer);
197*635a8641SAndroid Build Coastguard Worker 
198*635a8641SAndroid Build Coastguard Worker   DCHECK(object_proxy_);
199*635a8641SAndroid Build Coastguard Worker   object_proxy_->CallMethod(&method_call,
200*635a8641SAndroid Build Coastguard Worker                             ObjectProxy::TIMEOUT_USE_DEFAULT,
201*635a8641SAndroid Build Coastguard Worker                             base::Bind(&PropertySet::OnSet,
202*635a8641SAndroid Build Coastguard Worker                                        GetWeakPtr(),
203*635a8641SAndroid Build Coastguard Worker                                        property,
204*635a8641SAndroid Build Coastguard Worker                                        callback));
205*635a8641SAndroid Build Coastguard Worker }
206*635a8641SAndroid Build Coastguard Worker 
SetAndBlock(PropertyBase * property)207*635a8641SAndroid Build Coastguard Worker bool PropertySet::SetAndBlock(PropertyBase* property) {
208*635a8641SAndroid Build Coastguard Worker   MethodCall method_call(kPropertiesInterface, kPropertiesSet);
209*635a8641SAndroid Build Coastguard Worker   MessageWriter writer(&method_call);
210*635a8641SAndroid Build Coastguard Worker   writer.AppendString(interface());
211*635a8641SAndroid Build Coastguard Worker   writer.AppendString(property->name());
212*635a8641SAndroid Build Coastguard Worker   property->AppendSetValueToWriter(&writer);
213*635a8641SAndroid Build Coastguard Worker 
214*635a8641SAndroid Build Coastguard Worker   DCHECK(object_proxy_);
215*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<dbus::Response> response(object_proxy_->CallMethodAndBlock(
216*635a8641SAndroid Build Coastguard Worker       &method_call, ObjectProxy::TIMEOUT_USE_DEFAULT));
217*635a8641SAndroid Build Coastguard Worker   if (response.get())
218*635a8641SAndroid Build Coastguard Worker     return true;
219*635a8641SAndroid Build Coastguard Worker   return false;
220*635a8641SAndroid Build Coastguard Worker }
221*635a8641SAndroid Build Coastguard Worker 
OnSet(PropertyBase * property,SetCallback callback,Response * response)222*635a8641SAndroid Build Coastguard Worker void PropertySet::OnSet(PropertyBase* property,
223*635a8641SAndroid Build Coastguard Worker                         SetCallback callback,
224*635a8641SAndroid Build Coastguard Worker                         Response* response) {
225*635a8641SAndroid Build Coastguard Worker   LOG_IF(WARNING, !response) << property->name() << ": Set: failed.";
226*635a8641SAndroid Build Coastguard Worker   if (!callback.is_null())
227*635a8641SAndroid Build Coastguard Worker     callback.Run(response);
228*635a8641SAndroid Build Coastguard Worker }
229*635a8641SAndroid Build Coastguard Worker 
UpdatePropertiesFromReader(MessageReader * reader)230*635a8641SAndroid Build Coastguard Worker bool PropertySet::UpdatePropertiesFromReader(MessageReader* reader) {
231*635a8641SAndroid Build Coastguard Worker   DCHECK(reader);
232*635a8641SAndroid Build Coastguard Worker   MessageReader array_reader(nullptr);
233*635a8641SAndroid Build Coastguard Worker   if (!reader->PopArray(&array_reader))
234*635a8641SAndroid Build Coastguard Worker     return false;
235*635a8641SAndroid Build Coastguard Worker 
236*635a8641SAndroid Build Coastguard Worker   while (array_reader.HasMoreData()) {
237*635a8641SAndroid Build Coastguard Worker     MessageReader dict_entry_reader(nullptr);
238*635a8641SAndroid Build Coastguard Worker     if (array_reader.PopDictEntry(&dict_entry_reader))
239*635a8641SAndroid Build Coastguard Worker       UpdatePropertyFromReader(&dict_entry_reader);
240*635a8641SAndroid Build Coastguard Worker   }
241*635a8641SAndroid Build Coastguard Worker 
242*635a8641SAndroid Build Coastguard Worker   return true;
243*635a8641SAndroid Build Coastguard Worker }
244*635a8641SAndroid Build Coastguard Worker 
UpdatePropertyFromReader(MessageReader * reader)245*635a8641SAndroid Build Coastguard Worker bool PropertySet::UpdatePropertyFromReader(MessageReader* reader) {
246*635a8641SAndroid Build Coastguard Worker   DCHECK(reader);
247*635a8641SAndroid Build Coastguard Worker 
248*635a8641SAndroid Build Coastguard Worker   std::string name;
249*635a8641SAndroid Build Coastguard Worker   if (!reader->PopString(&name))
250*635a8641SAndroid Build Coastguard Worker     return false;
251*635a8641SAndroid Build Coastguard Worker 
252*635a8641SAndroid Build Coastguard Worker   PropertiesMap::iterator it = properties_map_.find(name);
253*635a8641SAndroid Build Coastguard Worker   if (it == properties_map_.end())
254*635a8641SAndroid Build Coastguard Worker     return false;
255*635a8641SAndroid Build Coastguard Worker 
256*635a8641SAndroid Build Coastguard Worker   PropertyBase* property = it->second;
257*635a8641SAndroid Build Coastguard Worker   if (property->PopValueFromReader(reader)) {
258*635a8641SAndroid Build Coastguard Worker     property->set_valid(true);
259*635a8641SAndroid Build Coastguard Worker     NotifyPropertyChanged(name);
260*635a8641SAndroid Build Coastguard Worker     return true;
261*635a8641SAndroid Build Coastguard Worker   } else {
262*635a8641SAndroid Build Coastguard Worker     if (property->is_valid()) {
263*635a8641SAndroid Build Coastguard Worker       property->set_valid(false);
264*635a8641SAndroid Build Coastguard Worker       NotifyPropertyChanged(property->name());
265*635a8641SAndroid Build Coastguard Worker     }
266*635a8641SAndroid Build Coastguard Worker     return false;
267*635a8641SAndroid Build Coastguard Worker   }
268*635a8641SAndroid Build Coastguard Worker }
269*635a8641SAndroid Build Coastguard Worker 
InvalidatePropertiesFromReader(MessageReader * reader)270*635a8641SAndroid Build Coastguard Worker bool PropertySet::InvalidatePropertiesFromReader(MessageReader* reader) {
271*635a8641SAndroid Build Coastguard Worker   DCHECK(reader);
272*635a8641SAndroid Build Coastguard Worker   MessageReader array_reader(nullptr);
273*635a8641SAndroid Build Coastguard Worker   if (!reader->PopArray(&array_reader))
274*635a8641SAndroid Build Coastguard Worker     return false;
275*635a8641SAndroid Build Coastguard Worker 
276*635a8641SAndroid Build Coastguard Worker   while (array_reader.HasMoreData()) {
277*635a8641SAndroid Build Coastguard Worker     std::string name;
278*635a8641SAndroid Build Coastguard Worker     if (!array_reader.PopString(&name))
279*635a8641SAndroid Build Coastguard Worker       return false;
280*635a8641SAndroid Build Coastguard Worker 
281*635a8641SAndroid Build Coastguard Worker     PropertiesMap::iterator it = properties_map_.find(name);
282*635a8641SAndroid Build Coastguard Worker     if (it == properties_map_.end())
283*635a8641SAndroid Build Coastguard Worker       continue;
284*635a8641SAndroid Build Coastguard Worker 
285*635a8641SAndroid Build Coastguard Worker     PropertyBase* property = it->second;
286*635a8641SAndroid Build Coastguard Worker     if (property->is_valid()) {
287*635a8641SAndroid Build Coastguard Worker       property->set_valid(false);
288*635a8641SAndroid Build Coastguard Worker       NotifyPropertyChanged(property->name());
289*635a8641SAndroid Build Coastguard Worker     }
290*635a8641SAndroid Build Coastguard Worker   }
291*635a8641SAndroid Build Coastguard Worker 
292*635a8641SAndroid Build Coastguard Worker   return true;
293*635a8641SAndroid Build Coastguard Worker }
294*635a8641SAndroid Build Coastguard Worker 
NotifyPropertyChanged(const std::string & name)295*635a8641SAndroid Build Coastguard Worker void PropertySet::NotifyPropertyChanged(const std::string& name) {
296*635a8641SAndroid Build Coastguard Worker   if (!property_changed_callback_.is_null())
297*635a8641SAndroid Build Coastguard Worker     property_changed_callback_.Run(name);
298*635a8641SAndroid Build Coastguard Worker }
299*635a8641SAndroid Build Coastguard Worker 
300*635a8641SAndroid Build Coastguard Worker //
301*635a8641SAndroid Build Coastguard Worker // Property<Byte> specialization.
302*635a8641SAndroid Build Coastguard Worker //
303*635a8641SAndroid Build Coastguard Worker 
304*635a8641SAndroid Build Coastguard Worker template <>
Property()305*635a8641SAndroid Build Coastguard Worker Property<uint8_t>::Property()
306*635a8641SAndroid Build Coastguard Worker     : value_(0) {}
307*635a8641SAndroid Build Coastguard Worker 
308*635a8641SAndroid Build Coastguard Worker template <>
PopValueFromReader(MessageReader * reader)309*635a8641SAndroid Build Coastguard Worker bool Property<uint8_t>::PopValueFromReader(MessageReader* reader) {
310*635a8641SAndroid Build Coastguard Worker   return reader->PopVariantOfByte(&value_);
311*635a8641SAndroid Build Coastguard Worker }
312*635a8641SAndroid Build Coastguard Worker 
313*635a8641SAndroid Build Coastguard Worker template <>
AppendSetValueToWriter(MessageWriter * writer)314*635a8641SAndroid Build Coastguard Worker void Property<uint8_t>::AppendSetValueToWriter(MessageWriter* writer) {
315*635a8641SAndroid Build Coastguard Worker   writer->AppendVariantOfByte(set_value_);
316*635a8641SAndroid Build Coastguard Worker }
317*635a8641SAndroid Build Coastguard Worker 
318*635a8641SAndroid Build Coastguard Worker //
319*635a8641SAndroid Build Coastguard Worker // Property<bool> specialization.
320*635a8641SAndroid Build Coastguard Worker //
321*635a8641SAndroid Build Coastguard Worker 
322*635a8641SAndroid Build Coastguard Worker template <>
Property()323*635a8641SAndroid Build Coastguard Worker Property<bool>::Property() : value_(false) {
324*635a8641SAndroid Build Coastguard Worker }
325*635a8641SAndroid Build Coastguard Worker 
326*635a8641SAndroid Build Coastguard Worker template <>
PopValueFromReader(MessageReader * reader)327*635a8641SAndroid Build Coastguard Worker bool Property<bool>::PopValueFromReader(MessageReader* reader) {
328*635a8641SAndroid Build Coastguard Worker   return reader->PopVariantOfBool(&value_);
329*635a8641SAndroid Build Coastguard Worker }
330*635a8641SAndroid Build Coastguard Worker 
331*635a8641SAndroid Build Coastguard Worker template <>
AppendSetValueToWriter(MessageWriter * writer)332*635a8641SAndroid Build Coastguard Worker void Property<bool>::AppendSetValueToWriter(MessageWriter* writer) {
333*635a8641SAndroid Build Coastguard Worker   writer->AppendVariantOfBool(set_value_);
334*635a8641SAndroid Build Coastguard Worker }
335*635a8641SAndroid Build Coastguard Worker 
336*635a8641SAndroid Build Coastguard Worker //
337*635a8641SAndroid Build Coastguard Worker // Property<int16_t> specialization.
338*635a8641SAndroid Build Coastguard Worker //
339*635a8641SAndroid Build Coastguard Worker 
340*635a8641SAndroid Build Coastguard Worker template <>
Property()341*635a8641SAndroid Build Coastguard Worker Property<int16_t>::Property()
342*635a8641SAndroid Build Coastguard Worker     : value_(0) {}
343*635a8641SAndroid Build Coastguard Worker 
344*635a8641SAndroid Build Coastguard Worker template <>
PopValueFromReader(MessageReader * reader)345*635a8641SAndroid Build Coastguard Worker bool Property<int16_t>::PopValueFromReader(MessageReader* reader) {
346*635a8641SAndroid Build Coastguard Worker   return reader->PopVariantOfInt16(&value_);
347*635a8641SAndroid Build Coastguard Worker }
348*635a8641SAndroid Build Coastguard Worker 
349*635a8641SAndroid Build Coastguard Worker template <>
AppendSetValueToWriter(MessageWriter * writer)350*635a8641SAndroid Build Coastguard Worker void Property<int16_t>::AppendSetValueToWriter(MessageWriter* writer) {
351*635a8641SAndroid Build Coastguard Worker   writer->AppendVariantOfInt16(set_value_);
352*635a8641SAndroid Build Coastguard Worker }
353*635a8641SAndroid Build Coastguard Worker 
354*635a8641SAndroid Build Coastguard Worker //
355*635a8641SAndroid Build Coastguard Worker // Property<uint16_t> specialization.
356*635a8641SAndroid Build Coastguard Worker //
357*635a8641SAndroid Build Coastguard Worker 
358*635a8641SAndroid Build Coastguard Worker template <>
Property()359*635a8641SAndroid Build Coastguard Worker Property<uint16_t>::Property()
360*635a8641SAndroid Build Coastguard Worker     : value_(0) {}
361*635a8641SAndroid Build Coastguard Worker 
362*635a8641SAndroid Build Coastguard Worker template <>
PopValueFromReader(MessageReader * reader)363*635a8641SAndroid Build Coastguard Worker bool Property<uint16_t>::PopValueFromReader(MessageReader* reader) {
364*635a8641SAndroid Build Coastguard Worker   return reader->PopVariantOfUint16(&value_);
365*635a8641SAndroid Build Coastguard Worker }
366*635a8641SAndroid Build Coastguard Worker 
367*635a8641SAndroid Build Coastguard Worker template <>
AppendSetValueToWriter(MessageWriter * writer)368*635a8641SAndroid Build Coastguard Worker void Property<uint16_t>::AppendSetValueToWriter(MessageWriter* writer) {
369*635a8641SAndroid Build Coastguard Worker   writer->AppendVariantOfUint16(set_value_);
370*635a8641SAndroid Build Coastguard Worker }
371*635a8641SAndroid Build Coastguard Worker 
372*635a8641SAndroid Build Coastguard Worker //
373*635a8641SAndroid Build Coastguard Worker // Property<int32_t> specialization.
374*635a8641SAndroid Build Coastguard Worker //
375*635a8641SAndroid Build Coastguard Worker 
376*635a8641SAndroid Build Coastguard Worker template <>
Property()377*635a8641SAndroid Build Coastguard Worker Property<int32_t>::Property()
378*635a8641SAndroid Build Coastguard Worker     : value_(0) {}
379*635a8641SAndroid Build Coastguard Worker 
380*635a8641SAndroid Build Coastguard Worker template <>
PopValueFromReader(MessageReader * reader)381*635a8641SAndroid Build Coastguard Worker bool Property<int32_t>::PopValueFromReader(MessageReader* reader) {
382*635a8641SAndroid Build Coastguard Worker   return reader->PopVariantOfInt32(&value_);
383*635a8641SAndroid Build Coastguard Worker }
384*635a8641SAndroid Build Coastguard Worker 
385*635a8641SAndroid Build Coastguard Worker template <>
AppendSetValueToWriter(MessageWriter * writer)386*635a8641SAndroid Build Coastguard Worker void Property<int32_t>::AppendSetValueToWriter(MessageWriter* writer) {
387*635a8641SAndroid Build Coastguard Worker   writer->AppendVariantOfInt32(set_value_);
388*635a8641SAndroid Build Coastguard Worker }
389*635a8641SAndroid Build Coastguard Worker 
390*635a8641SAndroid Build Coastguard Worker //
391*635a8641SAndroid Build Coastguard Worker // Property<uint32_t> specialization.
392*635a8641SAndroid Build Coastguard Worker //
393*635a8641SAndroid Build Coastguard Worker 
394*635a8641SAndroid Build Coastguard Worker template <>
Property()395*635a8641SAndroid Build Coastguard Worker Property<uint32_t>::Property()
396*635a8641SAndroid Build Coastguard Worker     : value_(0) {}
397*635a8641SAndroid Build Coastguard Worker 
398*635a8641SAndroid Build Coastguard Worker template <>
PopValueFromReader(MessageReader * reader)399*635a8641SAndroid Build Coastguard Worker bool Property<uint32_t>::PopValueFromReader(MessageReader* reader) {
400*635a8641SAndroid Build Coastguard Worker   return reader->PopVariantOfUint32(&value_);
401*635a8641SAndroid Build Coastguard Worker }
402*635a8641SAndroid Build Coastguard Worker 
403*635a8641SAndroid Build Coastguard Worker template <>
AppendSetValueToWriter(MessageWriter * writer)404*635a8641SAndroid Build Coastguard Worker void Property<uint32_t>::AppendSetValueToWriter(MessageWriter* writer) {
405*635a8641SAndroid Build Coastguard Worker   writer->AppendVariantOfUint32(set_value_);
406*635a8641SAndroid Build Coastguard Worker }
407*635a8641SAndroid Build Coastguard Worker 
408*635a8641SAndroid Build Coastguard Worker //
409*635a8641SAndroid Build Coastguard Worker // Property<int64_t> specialization.
410*635a8641SAndroid Build Coastguard Worker //
411*635a8641SAndroid Build Coastguard Worker 
412*635a8641SAndroid Build Coastguard Worker template <>
Property()413*635a8641SAndroid Build Coastguard Worker Property<int64_t>::Property()
414*635a8641SAndroid Build Coastguard Worker     : value_(0), set_value_(0) {}
415*635a8641SAndroid Build Coastguard Worker 
416*635a8641SAndroid Build Coastguard Worker template <>
PopValueFromReader(MessageReader * reader)417*635a8641SAndroid Build Coastguard Worker bool Property<int64_t>::PopValueFromReader(MessageReader* reader) {
418*635a8641SAndroid Build Coastguard Worker   return reader->PopVariantOfInt64(&value_);
419*635a8641SAndroid Build Coastguard Worker }
420*635a8641SAndroid Build Coastguard Worker 
421*635a8641SAndroid Build Coastguard Worker template <>
AppendSetValueToWriter(MessageWriter * writer)422*635a8641SAndroid Build Coastguard Worker void Property<int64_t>::AppendSetValueToWriter(MessageWriter* writer) {
423*635a8641SAndroid Build Coastguard Worker   writer->AppendVariantOfInt64(set_value_);
424*635a8641SAndroid Build Coastguard Worker }
425*635a8641SAndroid Build Coastguard Worker 
426*635a8641SAndroid Build Coastguard Worker //
427*635a8641SAndroid Build Coastguard Worker // Property<uint64_t> specialization.
428*635a8641SAndroid Build Coastguard Worker //
429*635a8641SAndroid Build Coastguard Worker 
430*635a8641SAndroid Build Coastguard Worker template <>
Property()431*635a8641SAndroid Build Coastguard Worker Property<uint64_t>::Property()
432*635a8641SAndroid Build Coastguard Worker     : value_(0) {}
433*635a8641SAndroid Build Coastguard Worker 
434*635a8641SAndroid Build Coastguard Worker template <>
PopValueFromReader(MessageReader * reader)435*635a8641SAndroid Build Coastguard Worker bool Property<uint64_t>::PopValueFromReader(MessageReader* reader) {
436*635a8641SAndroid Build Coastguard Worker   return reader->PopVariantOfUint64(&value_);
437*635a8641SAndroid Build Coastguard Worker }
438*635a8641SAndroid Build Coastguard Worker 
439*635a8641SAndroid Build Coastguard Worker template <>
AppendSetValueToWriter(MessageWriter * writer)440*635a8641SAndroid Build Coastguard Worker void Property<uint64_t>::AppendSetValueToWriter(MessageWriter* writer) {
441*635a8641SAndroid Build Coastguard Worker   writer->AppendVariantOfUint64(set_value_);
442*635a8641SAndroid Build Coastguard Worker }
443*635a8641SAndroid Build Coastguard Worker 
444*635a8641SAndroid Build Coastguard Worker //
445*635a8641SAndroid Build Coastguard Worker // Property<double> specialization.
446*635a8641SAndroid Build Coastguard Worker //
447*635a8641SAndroid Build Coastguard Worker 
448*635a8641SAndroid Build Coastguard Worker template <>
Property()449*635a8641SAndroid Build Coastguard Worker Property<double>::Property() : value_(0.0) {
450*635a8641SAndroid Build Coastguard Worker }
451*635a8641SAndroid Build Coastguard Worker 
452*635a8641SAndroid Build Coastguard Worker template <>
PopValueFromReader(MessageReader * reader)453*635a8641SAndroid Build Coastguard Worker bool Property<double>::PopValueFromReader(MessageReader* reader) {
454*635a8641SAndroid Build Coastguard Worker   return reader->PopVariantOfDouble(&value_);
455*635a8641SAndroid Build Coastguard Worker }
456*635a8641SAndroid Build Coastguard Worker 
457*635a8641SAndroid Build Coastguard Worker template <>
AppendSetValueToWriter(MessageWriter * writer)458*635a8641SAndroid Build Coastguard Worker void Property<double>::AppendSetValueToWriter(MessageWriter* writer) {
459*635a8641SAndroid Build Coastguard Worker   writer->AppendVariantOfDouble(set_value_);
460*635a8641SAndroid Build Coastguard Worker }
461*635a8641SAndroid Build Coastguard Worker 
462*635a8641SAndroid Build Coastguard Worker //
463*635a8641SAndroid Build Coastguard Worker // Property<std::string> specialization.
464*635a8641SAndroid Build Coastguard Worker //
465*635a8641SAndroid Build Coastguard Worker 
466*635a8641SAndroid Build Coastguard Worker template <>
PopValueFromReader(MessageReader * reader)467*635a8641SAndroid Build Coastguard Worker bool Property<std::string>::PopValueFromReader(MessageReader* reader) {
468*635a8641SAndroid Build Coastguard Worker   return reader->PopVariantOfString(&value_);
469*635a8641SAndroid Build Coastguard Worker }
470*635a8641SAndroid Build Coastguard Worker 
471*635a8641SAndroid Build Coastguard Worker template <>
AppendSetValueToWriter(MessageWriter * writer)472*635a8641SAndroid Build Coastguard Worker void Property<std::string>::AppendSetValueToWriter(MessageWriter* writer) {
473*635a8641SAndroid Build Coastguard Worker   writer->AppendVariantOfString(set_value_);
474*635a8641SAndroid Build Coastguard Worker }
475*635a8641SAndroid Build Coastguard Worker 
476*635a8641SAndroid Build Coastguard Worker //
477*635a8641SAndroid Build Coastguard Worker // Property<ObjectPath> specialization.
478*635a8641SAndroid Build Coastguard Worker //
479*635a8641SAndroid Build Coastguard Worker 
480*635a8641SAndroid Build Coastguard Worker template <>
PopValueFromReader(MessageReader * reader)481*635a8641SAndroid Build Coastguard Worker bool Property<ObjectPath>::PopValueFromReader(MessageReader* reader) {
482*635a8641SAndroid Build Coastguard Worker   return reader->PopVariantOfObjectPath(&value_);
483*635a8641SAndroid Build Coastguard Worker }
484*635a8641SAndroid Build Coastguard Worker 
485*635a8641SAndroid Build Coastguard Worker template <>
AppendSetValueToWriter(MessageWriter * writer)486*635a8641SAndroid Build Coastguard Worker void Property<ObjectPath>::AppendSetValueToWriter(MessageWriter* writer) {
487*635a8641SAndroid Build Coastguard Worker   writer->AppendVariantOfObjectPath(set_value_);
488*635a8641SAndroid Build Coastguard Worker }
489*635a8641SAndroid Build Coastguard Worker 
490*635a8641SAndroid Build Coastguard Worker //
491*635a8641SAndroid Build Coastguard Worker // Property<std::vector<std::string>> specialization.
492*635a8641SAndroid Build Coastguard Worker //
493*635a8641SAndroid Build Coastguard Worker 
494*635a8641SAndroid Build Coastguard Worker template <>
PopValueFromReader(MessageReader * reader)495*635a8641SAndroid Build Coastguard Worker bool Property<std::vector<std::string>>::PopValueFromReader(
496*635a8641SAndroid Build Coastguard Worker     MessageReader* reader) {
497*635a8641SAndroid Build Coastguard Worker   MessageReader variant_reader(nullptr);
498*635a8641SAndroid Build Coastguard Worker   if (!reader->PopVariant(&variant_reader))
499*635a8641SAndroid Build Coastguard Worker     return false;
500*635a8641SAndroid Build Coastguard Worker 
501*635a8641SAndroid Build Coastguard Worker   value_.clear();
502*635a8641SAndroid Build Coastguard Worker   return variant_reader.PopArrayOfStrings(&value_);
503*635a8641SAndroid Build Coastguard Worker }
504*635a8641SAndroid Build Coastguard Worker 
505*635a8641SAndroid Build Coastguard Worker template <>
AppendSetValueToWriter(MessageWriter * writer)506*635a8641SAndroid Build Coastguard Worker void Property<std::vector<std::string>>::AppendSetValueToWriter(
507*635a8641SAndroid Build Coastguard Worker     MessageWriter* writer) {
508*635a8641SAndroid Build Coastguard Worker   MessageWriter variant_writer(nullptr);
509*635a8641SAndroid Build Coastguard Worker   writer->OpenVariant("as", &variant_writer);
510*635a8641SAndroid Build Coastguard Worker   variant_writer.AppendArrayOfStrings(set_value_);
511*635a8641SAndroid Build Coastguard Worker   writer->CloseContainer(&variant_writer);
512*635a8641SAndroid Build Coastguard Worker }
513*635a8641SAndroid Build Coastguard Worker 
514*635a8641SAndroid Build Coastguard Worker //
515*635a8641SAndroid Build Coastguard Worker // Property<std::vector<ObjectPath>> specialization.
516*635a8641SAndroid Build Coastguard Worker //
517*635a8641SAndroid Build Coastguard Worker 
518*635a8641SAndroid Build Coastguard Worker template <>
PopValueFromReader(MessageReader * reader)519*635a8641SAndroid Build Coastguard Worker bool Property<std::vector<ObjectPath>>::PopValueFromReader(
520*635a8641SAndroid Build Coastguard Worker     MessageReader* reader) {
521*635a8641SAndroid Build Coastguard Worker   MessageReader variant_reader(nullptr);
522*635a8641SAndroid Build Coastguard Worker   if (!reader->PopVariant(&variant_reader))
523*635a8641SAndroid Build Coastguard Worker     return false;
524*635a8641SAndroid Build Coastguard Worker 
525*635a8641SAndroid Build Coastguard Worker   value_.clear();
526*635a8641SAndroid Build Coastguard Worker   return variant_reader.PopArrayOfObjectPaths(&value_);
527*635a8641SAndroid Build Coastguard Worker }
528*635a8641SAndroid Build Coastguard Worker 
529*635a8641SAndroid Build Coastguard Worker template <>
AppendSetValueToWriter(MessageWriter * writer)530*635a8641SAndroid Build Coastguard Worker void Property<std::vector<ObjectPath>>::AppendSetValueToWriter(
531*635a8641SAndroid Build Coastguard Worker     MessageWriter* writer) {
532*635a8641SAndroid Build Coastguard Worker   MessageWriter variant_writer(nullptr);
533*635a8641SAndroid Build Coastguard Worker   writer->OpenVariant("ao", &variant_writer);
534*635a8641SAndroid Build Coastguard Worker   variant_writer.AppendArrayOfObjectPaths(set_value_);
535*635a8641SAndroid Build Coastguard Worker   writer->CloseContainer(&variant_writer);
536*635a8641SAndroid Build Coastguard Worker }
537*635a8641SAndroid Build Coastguard Worker 
538*635a8641SAndroid Build Coastguard Worker //
539*635a8641SAndroid Build Coastguard Worker // Property<std::vector<uint8_t>> specialization.
540*635a8641SAndroid Build Coastguard Worker //
541*635a8641SAndroid Build Coastguard Worker 
542*635a8641SAndroid Build Coastguard Worker template <>
PopValueFromReader(MessageReader * reader)543*635a8641SAndroid Build Coastguard Worker bool Property<std::vector<uint8_t>>::PopValueFromReader(MessageReader* reader) {
544*635a8641SAndroid Build Coastguard Worker   MessageReader variant_reader(nullptr);
545*635a8641SAndroid Build Coastguard Worker   if (!reader->PopVariant(&variant_reader))
546*635a8641SAndroid Build Coastguard Worker     return false;
547*635a8641SAndroid Build Coastguard Worker 
548*635a8641SAndroid Build Coastguard Worker   value_.clear();
549*635a8641SAndroid Build Coastguard Worker   const uint8_t* bytes = nullptr;
550*635a8641SAndroid Build Coastguard Worker   size_t length = 0;
551*635a8641SAndroid Build Coastguard Worker   if (!variant_reader.PopArrayOfBytes(&bytes, &length))
552*635a8641SAndroid Build Coastguard Worker     return false;
553*635a8641SAndroid Build Coastguard Worker   value_.assign(bytes, bytes + length);
554*635a8641SAndroid Build Coastguard Worker   return true;
555*635a8641SAndroid Build Coastguard Worker }
556*635a8641SAndroid Build Coastguard Worker 
557*635a8641SAndroid Build Coastguard Worker template <>
AppendSetValueToWriter(MessageWriter * writer)558*635a8641SAndroid Build Coastguard Worker void Property<std::vector<uint8_t>>::AppendSetValueToWriter(
559*635a8641SAndroid Build Coastguard Worker     MessageWriter* writer) {
560*635a8641SAndroid Build Coastguard Worker   MessageWriter variant_writer(nullptr);
561*635a8641SAndroid Build Coastguard Worker   writer->OpenVariant("ay", &variant_writer);
562*635a8641SAndroid Build Coastguard Worker   variant_writer.AppendArrayOfBytes(set_value_.data(), set_value_.size());
563*635a8641SAndroid Build Coastguard Worker   writer->CloseContainer(&variant_writer);
564*635a8641SAndroid Build Coastguard Worker }
565*635a8641SAndroid Build Coastguard Worker 
566*635a8641SAndroid Build Coastguard Worker //
567*635a8641SAndroid Build Coastguard Worker // Property<std::map<std::string, std::string>> specialization.
568*635a8641SAndroid Build Coastguard Worker //
569*635a8641SAndroid Build Coastguard Worker 
570*635a8641SAndroid Build Coastguard Worker template <>
PopValueFromReader(MessageReader * reader)571*635a8641SAndroid Build Coastguard Worker bool Property<std::map<std::string, std::string>>::PopValueFromReader(
572*635a8641SAndroid Build Coastguard Worker     MessageReader* reader) {
573*635a8641SAndroid Build Coastguard Worker   MessageReader variant_reader(nullptr);
574*635a8641SAndroid Build Coastguard Worker   MessageReader array_reader(nullptr);
575*635a8641SAndroid Build Coastguard Worker   if (!reader->PopVariant(&variant_reader) ||
576*635a8641SAndroid Build Coastguard Worker       !variant_reader.PopArray(&array_reader))
577*635a8641SAndroid Build Coastguard Worker     return false;
578*635a8641SAndroid Build Coastguard Worker   value_.clear();
579*635a8641SAndroid Build Coastguard Worker   while (array_reader.HasMoreData()) {
580*635a8641SAndroid Build Coastguard Worker     dbus::MessageReader dict_entry_reader(nullptr);
581*635a8641SAndroid Build Coastguard Worker     if (!array_reader.PopDictEntry(&dict_entry_reader))
582*635a8641SAndroid Build Coastguard Worker       return false;
583*635a8641SAndroid Build Coastguard Worker     std::string key;
584*635a8641SAndroid Build Coastguard Worker     std::string value;
585*635a8641SAndroid Build Coastguard Worker     if (!dict_entry_reader.PopString(&key) ||
586*635a8641SAndroid Build Coastguard Worker         !dict_entry_reader.PopString(&value))
587*635a8641SAndroid Build Coastguard Worker       return false;
588*635a8641SAndroid Build Coastguard Worker     value_[key] = value;
589*635a8641SAndroid Build Coastguard Worker   }
590*635a8641SAndroid Build Coastguard Worker   return true;
591*635a8641SAndroid Build Coastguard Worker }
592*635a8641SAndroid Build Coastguard Worker 
593*635a8641SAndroid Build Coastguard Worker template <>
AppendSetValueToWriter(MessageWriter * writer)594*635a8641SAndroid Build Coastguard Worker void Property<std::map<std::string, std::string>>::AppendSetValueToWriter(
595*635a8641SAndroid Build Coastguard Worker     MessageWriter* writer) {
596*635a8641SAndroid Build Coastguard Worker   MessageWriter variant_writer(nullptr);
597*635a8641SAndroid Build Coastguard Worker   MessageWriter dict_writer(nullptr);
598*635a8641SAndroid Build Coastguard Worker   writer->OpenVariant("a{ss}", &variant_writer);
599*635a8641SAndroid Build Coastguard Worker   variant_writer.OpenArray("{ss}", &dict_writer);
600*635a8641SAndroid Build Coastguard Worker   for (const auto& pair : set_value_) {
601*635a8641SAndroid Build Coastguard Worker     dbus::MessageWriter entry_writer(nullptr);
602*635a8641SAndroid Build Coastguard Worker     dict_writer.OpenDictEntry(&entry_writer);
603*635a8641SAndroid Build Coastguard Worker     entry_writer.AppendString(pair.first);
604*635a8641SAndroid Build Coastguard Worker     entry_writer.AppendString(pair.second);
605*635a8641SAndroid Build Coastguard Worker     dict_writer.CloseContainer(&entry_writer);
606*635a8641SAndroid Build Coastguard Worker   }
607*635a8641SAndroid Build Coastguard Worker   variant_writer.CloseContainer(&dict_writer);
608*635a8641SAndroid Build Coastguard Worker   writer->CloseContainer(&variant_writer);
609*635a8641SAndroid Build Coastguard Worker }
610*635a8641SAndroid Build Coastguard Worker 
611*635a8641SAndroid Build Coastguard Worker //
612*635a8641SAndroid Build Coastguard Worker // Property<std::vector<std::pair<std::vector<uint8_t>, uint16_t>>>
613*635a8641SAndroid Build Coastguard Worker // specialization.
614*635a8641SAndroid Build Coastguard Worker //
615*635a8641SAndroid Build Coastguard Worker 
616*635a8641SAndroid Build Coastguard Worker template <>
617*635a8641SAndroid Build Coastguard Worker bool Property<std::vector<std::pair<std::vector<uint8_t>, uint16_t>>>::
PopValueFromReader(MessageReader * reader)618*635a8641SAndroid Build Coastguard Worker     PopValueFromReader(MessageReader* reader) {
619*635a8641SAndroid Build Coastguard Worker   MessageReader variant_reader(nullptr);
620*635a8641SAndroid Build Coastguard Worker   MessageReader array_reader(nullptr);
621*635a8641SAndroid Build Coastguard Worker   if (!reader->PopVariant(&variant_reader) ||
622*635a8641SAndroid Build Coastguard Worker       !variant_reader.PopArray(&array_reader))
623*635a8641SAndroid Build Coastguard Worker     return false;
624*635a8641SAndroid Build Coastguard Worker 
625*635a8641SAndroid Build Coastguard Worker   value_.clear();
626*635a8641SAndroid Build Coastguard Worker   while (array_reader.HasMoreData()) {
627*635a8641SAndroid Build Coastguard Worker     dbus::MessageReader struct_reader(nullptr);
628*635a8641SAndroid Build Coastguard Worker     if (!array_reader.PopStruct(&struct_reader))
629*635a8641SAndroid Build Coastguard Worker       return false;
630*635a8641SAndroid Build Coastguard Worker 
631*635a8641SAndroid Build Coastguard Worker     std::pair<std::vector<uint8_t>, uint16_t> entry;
632*635a8641SAndroid Build Coastguard Worker     const uint8_t* bytes = nullptr;
633*635a8641SAndroid Build Coastguard Worker     size_t length = 0;
634*635a8641SAndroid Build Coastguard Worker     if (!struct_reader.PopArrayOfBytes(&bytes, &length))
635*635a8641SAndroid Build Coastguard Worker       return false;
636*635a8641SAndroid Build Coastguard Worker     entry.first.assign(bytes, bytes + length);
637*635a8641SAndroid Build Coastguard Worker     if (!struct_reader.PopUint16(&entry.second))
638*635a8641SAndroid Build Coastguard Worker       return false;
639*635a8641SAndroid Build Coastguard Worker     value_.push_back(entry);
640*635a8641SAndroid Build Coastguard Worker   }
641*635a8641SAndroid Build Coastguard Worker   return true;
642*635a8641SAndroid Build Coastguard Worker }
643*635a8641SAndroid Build Coastguard Worker 
644*635a8641SAndroid Build Coastguard Worker template <>
645*635a8641SAndroid Build Coastguard Worker void Property<std::vector<std::pair<std::vector<uint8_t>, uint16_t>>>::
AppendSetValueToWriter(MessageWriter * writer)646*635a8641SAndroid Build Coastguard Worker     AppendSetValueToWriter(MessageWriter* writer) {
647*635a8641SAndroid Build Coastguard Worker   MessageWriter variant_writer(nullptr);
648*635a8641SAndroid Build Coastguard Worker   MessageWriter array_writer(nullptr);
649*635a8641SAndroid Build Coastguard Worker   writer->OpenVariant("a(ayq)", &variant_writer);
650*635a8641SAndroid Build Coastguard Worker   variant_writer.OpenArray("(ayq)", &array_writer);
651*635a8641SAndroid Build Coastguard Worker   for (const auto& pair : set_value_) {
652*635a8641SAndroid Build Coastguard Worker     dbus::MessageWriter struct_writer(nullptr);
653*635a8641SAndroid Build Coastguard Worker     array_writer.OpenStruct(&struct_writer);
654*635a8641SAndroid Build Coastguard Worker     struct_writer.AppendArrayOfBytes(std::get<0>(pair).data(),
655*635a8641SAndroid Build Coastguard Worker                                      std::get<0>(pair).size());
656*635a8641SAndroid Build Coastguard Worker     struct_writer.AppendUint16(std::get<1>(pair));
657*635a8641SAndroid Build Coastguard Worker     array_writer.CloseContainer(&struct_writer);
658*635a8641SAndroid Build Coastguard Worker   }
659*635a8641SAndroid Build Coastguard Worker   variant_writer.CloseContainer(&array_writer);
660*635a8641SAndroid Build Coastguard Worker   writer->CloseContainer(&variant_writer);
661*635a8641SAndroid Build Coastguard Worker }
662*635a8641SAndroid Build Coastguard Worker 
663*635a8641SAndroid Build Coastguard Worker //
664*635a8641SAndroid Build Coastguard Worker // Property<std::map<std::string, std::vector<uint8_t>>>
665*635a8641SAndroid Build Coastguard Worker // specialization.
666*635a8641SAndroid Build Coastguard Worker //
667*635a8641SAndroid Build Coastguard Worker 
668*635a8641SAndroid Build Coastguard Worker template <>
PopValueFromReader(MessageReader * reader)669*635a8641SAndroid Build Coastguard Worker bool Property<std::map<std::string, std::vector<uint8_t>>>::PopValueFromReader(
670*635a8641SAndroid Build Coastguard Worker     MessageReader* reader) {
671*635a8641SAndroid Build Coastguard Worker   MessageReader variant_reader(nullptr);
672*635a8641SAndroid Build Coastguard Worker   MessageReader dict_reader(nullptr);
673*635a8641SAndroid Build Coastguard Worker   if (!reader->PopVariant(&variant_reader) ||
674*635a8641SAndroid Build Coastguard Worker       !variant_reader.PopArray(&dict_reader))
675*635a8641SAndroid Build Coastguard Worker     return false;
676*635a8641SAndroid Build Coastguard Worker 
677*635a8641SAndroid Build Coastguard Worker   value_.clear();
678*635a8641SAndroid Build Coastguard Worker   while (dict_reader.HasMoreData()) {
679*635a8641SAndroid Build Coastguard Worker     MessageReader entry_reader(nullptr);
680*635a8641SAndroid Build Coastguard Worker     if (!dict_reader.PopDictEntry(&entry_reader))
681*635a8641SAndroid Build Coastguard Worker       return false;
682*635a8641SAndroid Build Coastguard Worker 
683*635a8641SAndroid Build Coastguard Worker     std::string key;
684*635a8641SAndroid Build Coastguard Worker     MessageReader value_varient_reader(nullptr);
685*635a8641SAndroid Build Coastguard Worker     if (!entry_reader.PopString(&key) ||
686*635a8641SAndroid Build Coastguard Worker         !entry_reader.PopVariant(&value_varient_reader))
687*635a8641SAndroid Build Coastguard Worker       return false;
688*635a8641SAndroid Build Coastguard Worker 
689*635a8641SAndroid Build Coastguard Worker     const uint8_t* bytes = nullptr;
690*635a8641SAndroid Build Coastguard Worker     size_t length = 0;
691*635a8641SAndroid Build Coastguard Worker     if (!value_varient_reader.PopArrayOfBytes(&bytes, &length))
692*635a8641SAndroid Build Coastguard Worker       return false;
693*635a8641SAndroid Build Coastguard Worker 
694*635a8641SAndroid Build Coastguard Worker     value_[key].assign(bytes, bytes + length);
695*635a8641SAndroid Build Coastguard Worker   }
696*635a8641SAndroid Build Coastguard Worker   return true;
697*635a8641SAndroid Build Coastguard Worker }
698*635a8641SAndroid Build Coastguard Worker 
699*635a8641SAndroid Build Coastguard Worker template <>
700*635a8641SAndroid Build Coastguard Worker void Property<std::map<std::string, std::vector<uint8_t>>>::
AppendSetValueToWriter(MessageWriter * writer)701*635a8641SAndroid Build Coastguard Worker     AppendSetValueToWriter(MessageWriter* writer) {
702*635a8641SAndroid Build Coastguard Worker   MessageWriter variant_writer(nullptr);
703*635a8641SAndroid Build Coastguard Worker   MessageWriter dict_writer(nullptr);
704*635a8641SAndroid Build Coastguard Worker 
705*635a8641SAndroid Build Coastguard Worker   writer->OpenVariant("a{sv}", &variant_writer);
706*635a8641SAndroid Build Coastguard Worker   variant_writer.OpenArray("{sv}", &dict_writer);
707*635a8641SAndroid Build Coastguard Worker 
708*635a8641SAndroid Build Coastguard Worker   for (const auto& pair : set_value_) {
709*635a8641SAndroid Build Coastguard Worker     MessageWriter entry_writer(nullptr);
710*635a8641SAndroid Build Coastguard Worker     dict_writer.OpenDictEntry(&entry_writer);
711*635a8641SAndroid Build Coastguard Worker 
712*635a8641SAndroid Build Coastguard Worker     entry_writer.AppendString(pair.first);
713*635a8641SAndroid Build Coastguard Worker 
714*635a8641SAndroid Build Coastguard Worker     MessageWriter value_varient_writer(nullptr);
715*635a8641SAndroid Build Coastguard Worker     entry_writer.OpenVariant("ay", &value_varient_writer);
716*635a8641SAndroid Build Coastguard Worker     value_varient_writer.AppendArrayOfBytes(pair.second.data(),
717*635a8641SAndroid Build Coastguard Worker                                             pair.second.size());
718*635a8641SAndroid Build Coastguard Worker     entry_writer.CloseContainer(&value_varient_writer);
719*635a8641SAndroid Build Coastguard Worker 
720*635a8641SAndroid Build Coastguard Worker     dict_writer.CloseContainer(&entry_writer);
721*635a8641SAndroid Build Coastguard Worker   }
722*635a8641SAndroid Build Coastguard Worker 
723*635a8641SAndroid Build Coastguard Worker   variant_writer.CloseContainer(&dict_writer);
724*635a8641SAndroid Build Coastguard Worker   writer->CloseContainer(&variant_writer);
725*635a8641SAndroid Build Coastguard Worker }
726*635a8641SAndroid Build Coastguard Worker 
727*635a8641SAndroid Build Coastguard Worker //
728*635a8641SAndroid Build Coastguard Worker // Property<std::map<uint16_t, std::vector<uint8_t>>>
729*635a8641SAndroid Build Coastguard Worker // specialization.
730*635a8641SAndroid Build Coastguard Worker //
731*635a8641SAndroid Build Coastguard Worker 
732*635a8641SAndroid Build Coastguard Worker template <>
PopValueFromReader(MessageReader * reader)733*635a8641SAndroid Build Coastguard Worker bool Property<std::map<uint16_t, std::vector<uint8_t>>>::PopValueFromReader(
734*635a8641SAndroid Build Coastguard Worker     MessageReader* reader) {
735*635a8641SAndroid Build Coastguard Worker   MessageReader variant_reader(nullptr);
736*635a8641SAndroid Build Coastguard Worker   MessageReader dict_reader(nullptr);
737*635a8641SAndroid Build Coastguard Worker   if (!reader->PopVariant(&variant_reader) ||
738*635a8641SAndroid Build Coastguard Worker       !variant_reader.PopArray(&dict_reader))
739*635a8641SAndroid Build Coastguard Worker     return false;
740*635a8641SAndroid Build Coastguard Worker 
741*635a8641SAndroid Build Coastguard Worker   value_.clear();
742*635a8641SAndroid Build Coastguard Worker   while (dict_reader.HasMoreData()) {
743*635a8641SAndroid Build Coastguard Worker     MessageReader entry_reader(nullptr);
744*635a8641SAndroid Build Coastguard Worker     if (!dict_reader.PopDictEntry(&entry_reader))
745*635a8641SAndroid Build Coastguard Worker       return false;
746*635a8641SAndroid Build Coastguard Worker 
747*635a8641SAndroid Build Coastguard Worker     uint16_t key;
748*635a8641SAndroid Build Coastguard Worker     MessageReader value_varient_reader(nullptr);
749*635a8641SAndroid Build Coastguard Worker     if (!entry_reader.PopUint16(&key) ||
750*635a8641SAndroid Build Coastguard Worker         !entry_reader.PopVariant(&value_varient_reader))
751*635a8641SAndroid Build Coastguard Worker       return false;
752*635a8641SAndroid Build Coastguard Worker 
753*635a8641SAndroid Build Coastguard Worker     const uint8_t* bytes = nullptr;
754*635a8641SAndroid Build Coastguard Worker     size_t length = 0;
755*635a8641SAndroid Build Coastguard Worker     if (!value_varient_reader.PopArrayOfBytes(&bytes, &length))
756*635a8641SAndroid Build Coastguard Worker       return false;
757*635a8641SAndroid Build Coastguard Worker 
758*635a8641SAndroid Build Coastguard Worker     value_[key].assign(bytes, bytes + length);
759*635a8641SAndroid Build Coastguard Worker   }
760*635a8641SAndroid Build Coastguard Worker   return true;
761*635a8641SAndroid Build Coastguard Worker }
762*635a8641SAndroid Build Coastguard Worker 
763*635a8641SAndroid Build Coastguard Worker template <>
AppendSetValueToWriter(MessageWriter * writer)764*635a8641SAndroid Build Coastguard Worker void Property<std::map<uint16_t, std::vector<uint8_t>>>::AppendSetValueToWriter(
765*635a8641SAndroid Build Coastguard Worker     MessageWriter* writer) {
766*635a8641SAndroid Build Coastguard Worker   MessageWriter variant_writer(nullptr);
767*635a8641SAndroid Build Coastguard Worker   MessageWriter dict_writer(nullptr);
768*635a8641SAndroid Build Coastguard Worker 
769*635a8641SAndroid Build Coastguard Worker   writer->OpenVariant("a{qv}", &variant_writer);
770*635a8641SAndroid Build Coastguard Worker   variant_writer.OpenArray("{qv}", &dict_writer);
771*635a8641SAndroid Build Coastguard Worker 
772*635a8641SAndroid Build Coastguard Worker   for (const auto& pair : set_value_) {
773*635a8641SAndroid Build Coastguard Worker     MessageWriter entry_writer(nullptr);
774*635a8641SAndroid Build Coastguard Worker     dict_writer.OpenDictEntry(&entry_writer);
775*635a8641SAndroid Build Coastguard Worker 
776*635a8641SAndroid Build Coastguard Worker     entry_writer.AppendUint16(pair.first);
777*635a8641SAndroid Build Coastguard Worker 
778*635a8641SAndroid Build Coastguard Worker     MessageWriter value_varient_writer(nullptr);
779*635a8641SAndroid Build Coastguard Worker     entry_writer.OpenVariant("ay", &value_varient_writer);
780*635a8641SAndroid Build Coastguard Worker     value_varient_writer.AppendArrayOfBytes(pair.second.data(),
781*635a8641SAndroid Build Coastguard Worker                                             pair.second.size());
782*635a8641SAndroid Build Coastguard Worker     entry_writer.CloseContainer(&value_varient_writer);
783*635a8641SAndroid Build Coastguard Worker 
784*635a8641SAndroid Build Coastguard Worker     dict_writer.CloseContainer(&entry_writer);
785*635a8641SAndroid Build Coastguard Worker   }
786*635a8641SAndroid Build Coastguard Worker 
787*635a8641SAndroid Build Coastguard Worker   variant_writer.CloseContainer(&dict_writer);
788*635a8641SAndroid Build Coastguard Worker   writer->CloseContainer(&variant_writer);
789*635a8641SAndroid Build Coastguard Worker }
790*635a8641SAndroid Build Coastguard Worker 
791*635a8641SAndroid Build Coastguard Worker template class Property<uint8_t>;
792*635a8641SAndroid Build Coastguard Worker template class Property<bool>;
793*635a8641SAndroid Build Coastguard Worker template class Property<int16_t>;
794*635a8641SAndroid Build Coastguard Worker template class Property<uint16_t>;
795*635a8641SAndroid Build Coastguard Worker template class Property<int32_t>;
796*635a8641SAndroid Build Coastguard Worker template class Property<uint32_t>;
797*635a8641SAndroid Build Coastguard Worker template class Property<int64_t>;
798*635a8641SAndroid Build Coastguard Worker template class Property<uint64_t>;
799*635a8641SAndroid Build Coastguard Worker template class Property<double>;
800*635a8641SAndroid Build Coastguard Worker template class Property<std::string>;
801*635a8641SAndroid Build Coastguard Worker template class Property<ObjectPath>;
802*635a8641SAndroid Build Coastguard Worker template class Property<std::vector<std::string>>;
803*635a8641SAndroid Build Coastguard Worker template class Property<std::vector<ObjectPath>>;
804*635a8641SAndroid Build Coastguard Worker template class Property<std::vector<uint8_t>>;
805*635a8641SAndroid Build Coastguard Worker template class Property<std::map<std::string, std::string>>;
806*635a8641SAndroid Build Coastguard Worker template class Property<std::vector<std::pair<std::vector<uint8_t>, uint16_t>>>;
807*635a8641SAndroid Build Coastguard Worker template class Property<std::map<std::string, std::vector<uint8_t>>>;
808*635a8641SAndroid Build Coastguard Worker template class Property<std::map<uint16_t, std::vector<uint8_t>>>;
809*635a8641SAndroid Build Coastguard Worker 
810*635a8641SAndroid Build Coastguard Worker }  // namespace dbus
811