1*1a96fba6SXin Li // Copyright 2014 The Chromium OS Authors. All rights reserved.
2*1a96fba6SXin Li // Use of this source code is governed by a BSD-style license that can be
3*1a96fba6SXin Li // found in the LICENSE file.
4*1a96fba6SXin Li
5*1a96fba6SXin Li #include <brillo/dbus/data_serialization.h>
6*1a96fba6SXin Li
7*1a96fba6SXin Li #include <base/logging.h>
8*1a96fba6SXin Li #include <brillo/any.h>
9*1a96fba6SXin Li #include <brillo/variant_dictionary.h>
10*1a96fba6SXin Li
11*1a96fba6SXin Li namespace brillo {
12*1a96fba6SXin Li namespace dbus_utils {
13*1a96fba6SXin Li
AppendValueToWriter(dbus::MessageWriter * writer,bool value)14*1a96fba6SXin Li void AppendValueToWriter(dbus::MessageWriter* writer, bool value) {
15*1a96fba6SXin Li writer->AppendBool(value);
16*1a96fba6SXin Li }
17*1a96fba6SXin Li
AppendValueToWriter(dbus::MessageWriter * writer,uint8_t value)18*1a96fba6SXin Li void AppendValueToWriter(dbus::MessageWriter* writer, uint8_t value) {
19*1a96fba6SXin Li writer->AppendByte(value);
20*1a96fba6SXin Li }
21*1a96fba6SXin Li
AppendValueToWriter(dbus::MessageWriter * writer,int16_t value)22*1a96fba6SXin Li void AppendValueToWriter(dbus::MessageWriter* writer, int16_t value) {
23*1a96fba6SXin Li writer->AppendInt16(value);
24*1a96fba6SXin Li }
25*1a96fba6SXin Li
AppendValueToWriter(dbus::MessageWriter * writer,uint16_t value)26*1a96fba6SXin Li void AppendValueToWriter(dbus::MessageWriter* writer, uint16_t value) {
27*1a96fba6SXin Li writer->AppendUint16(value);
28*1a96fba6SXin Li }
29*1a96fba6SXin Li
AppendValueToWriter(dbus::MessageWriter * writer,int32_t value)30*1a96fba6SXin Li void AppendValueToWriter(dbus::MessageWriter* writer, int32_t value) {
31*1a96fba6SXin Li writer->AppendInt32(value);
32*1a96fba6SXin Li }
33*1a96fba6SXin Li
AppendValueToWriter(dbus::MessageWriter * writer,uint32_t value)34*1a96fba6SXin Li void AppendValueToWriter(dbus::MessageWriter* writer, uint32_t value) {
35*1a96fba6SXin Li writer->AppendUint32(value);
36*1a96fba6SXin Li }
37*1a96fba6SXin Li
AppendValueToWriter(dbus::MessageWriter * writer,int64_t value)38*1a96fba6SXin Li void AppendValueToWriter(dbus::MessageWriter* writer, int64_t value) {
39*1a96fba6SXin Li writer->AppendInt64(value);
40*1a96fba6SXin Li }
41*1a96fba6SXin Li
AppendValueToWriter(dbus::MessageWriter * writer,uint64_t value)42*1a96fba6SXin Li void AppendValueToWriter(dbus::MessageWriter* writer, uint64_t value) {
43*1a96fba6SXin Li writer->AppendUint64(value);
44*1a96fba6SXin Li }
45*1a96fba6SXin Li
AppendValueToWriter(dbus::MessageWriter * writer,double value)46*1a96fba6SXin Li void AppendValueToWriter(dbus::MessageWriter* writer, double value) {
47*1a96fba6SXin Li writer->AppendDouble(value);
48*1a96fba6SXin Li }
49*1a96fba6SXin Li
AppendValueToWriter(dbus::MessageWriter * writer,const std::string & value)50*1a96fba6SXin Li void AppendValueToWriter(dbus::MessageWriter* writer,
51*1a96fba6SXin Li const std::string& value) {
52*1a96fba6SXin Li writer->AppendString(value);
53*1a96fba6SXin Li }
54*1a96fba6SXin Li
AppendValueToWriter(dbus::MessageWriter * writer,const char * value)55*1a96fba6SXin Li void AppendValueToWriter(dbus::MessageWriter* writer, const char* value) {
56*1a96fba6SXin Li AppendValueToWriter(writer, std::string(value));
57*1a96fba6SXin Li }
58*1a96fba6SXin Li
AppendValueToWriter(dbus::MessageWriter * writer,const dbus::ObjectPath & value)59*1a96fba6SXin Li void AppendValueToWriter(dbus::MessageWriter* writer,
60*1a96fba6SXin Li const dbus::ObjectPath& value) {
61*1a96fba6SXin Li writer->AppendObjectPath(value);
62*1a96fba6SXin Li }
63*1a96fba6SXin Li
AppendValueToWriter(dbus::MessageWriter * writer,const FileDescriptor & value)64*1a96fba6SXin Li void AppendValueToWriter(dbus::MessageWriter* writer,
65*1a96fba6SXin Li const FileDescriptor& value) {
66*1a96fba6SXin Li writer->AppendFileDescriptor(value.get());
67*1a96fba6SXin Li }
68*1a96fba6SXin Li
AppendValueToWriter(dbus::MessageWriter * writer,const brillo::Any & value)69*1a96fba6SXin Li void AppendValueToWriter(dbus::MessageWriter* writer,
70*1a96fba6SXin Li const brillo::Any& value) {
71*1a96fba6SXin Li value.AppendToDBusMessageWriter(writer);
72*1a96fba6SXin Li }
73*1a96fba6SXin Li
74*1a96fba6SXin Li ///////////////////////////////////////////////////////////////////////////////
75*1a96fba6SXin Li
PopValueFromReader(dbus::MessageReader * reader,bool * value)76*1a96fba6SXin Li bool PopValueFromReader(dbus::MessageReader* reader, bool* value) {
77*1a96fba6SXin Li dbus::MessageReader variant_reader(nullptr);
78*1a96fba6SXin Li return details::DescendIntoVariantIfPresent(&reader, &variant_reader) &&
79*1a96fba6SXin Li reader->PopBool(value);
80*1a96fba6SXin Li }
81*1a96fba6SXin Li
PopValueFromReader(dbus::MessageReader * reader,uint8_t * value)82*1a96fba6SXin Li bool PopValueFromReader(dbus::MessageReader* reader, uint8_t* value) {
83*1a96fba6SXin Li dbus::MessageReader variant_reader(nullptr);
84*1a96fba6SXin Li return details::DescendIntoVariantIfPresent(&reader, &variant_reader) &&
85*1a96fba6SXin Li reader->PopByte(value);
86*1a96fba6SXin Li }
87*1a96fba6SXin Li
PopValueFromReader(dbus::MessageReader * reader,int16_t * value)88*1a96fba6SXin Li bool PopValueFromReader(dbus::MessageReader* reader, int16_t* value) {
89*1a96fba6SXin Li dbus::MessageReader variant_reader(nullptr);
90*1a96fba6SXin Li return details::DescendIntoVariantIfPresent(&reader, &variant_reader) &&
91*1a96fba6SXin Li reader->PopInt16(value);
92*1a96fba6SXin Li }
93*1a96fba6SXin Li
PopValueFromReader(dbus::MessageReader * reader,uint16_t * value)94*1a96fba6SXin Li bool PopValueFromReader(dbus::MessageReader* reader, uint16_t* value) {
95*1a96fba6SXin Li dbus::MessageReader variant_reader(nullptr);
96*1a96fba6SXin Li return details::DescendIntoVariantIfPresent(&reader, &variant_reader) &&
97*1a96fba6SXin Li reader->PopUint16(value);
98*1a96fba6SXin Li }
99*1a96fba6SXin Li
PopValueFromReader(dbus::MessageReader * reader,int32_t * value)100*1a96fba6SXin Li bool PopValueFromReader(dbus::MessageReader* reader, int32_t* value) {
101*1a96fba6SXin Li dbus::MessageReader variant_reader(nullptr);
102*1a96fba6SXin Li return details::DescendIntoVariantIfPresent(&reader, &variant_reader) &&
103*1a96fba6SXin Li reader->PopInt32(value);
104*1a96fba6SXin Li }
105*1a96fba6SXin Li
PopValueFromReader(dbus::MessageReader * reader,uint32_t * value)106*1a96fba6SXin Li bool PopValueFromReader(dbus::MessageReader* reader, uint32_t* value) {
107*1a96fba6SXin Li dbus::MessageReader variant_reader(nullptr);
108*1a96fba6SXin Li return details::DescendIntoVariantIfPresent(&reader, &variant_reader) &&
109*1a96fba6SXin Li reader->PopUint32(value);
110*1a96fba6SXin Li }
111*1a96fba6SXin Li
PopValueFromReader(dbus::MessageReader * reader,int64_t * value)112*1a96fba6SXin Li bool PopValueFromReader(dbus::MessageReader* reader, int64_t* value) {
113*1a96fba6SXin Li dbus::MessageReader variant_reader(nullptr);
114*1a96fba6SXin Li return details::DescendIntoVariantIfPresent(&reader, &variant_reader) &&
115*1a96fba6SXin Li reader->PopInt64(value);
116*1a96fba6SXin Li }
117*1a96fba6SXin Li
PopValueFromReader(dbus::MessageReader * reader,uint64_t * value)118*1a96fba6SXin Li bool PopValueFromReader(dbus::MessageReader* reader, uint64_t* value) {
119*1a96fba6SXin Li dbus::MessageReader variant_reader(nullptr);
120*1a96fba6SXin Li return details::DescendIntoVariantIfPresent(&reader, &variant_reader) &&
121*1a96fba6SXin Li reader->PopUint64(value);
122*1a96fba6SXin Li }
123*1a96fba6SXin Li
PopValueFromReader(dbus::MessageReader * reader,double * value)124*1a96fba6SXin Li bool PopValueFromReader(dbus::MessageReader* reader, double* value) {
125*1a96fba6SXin Li dbus::MessageReader variant_reader(nullptr);
126*1a96fba6SXin Li return details::DescendIntoVariantIfPresent(&reader, &variant_reader) &&
127*1a96fba6SXin Li reader->PopDouble(value);
128*1a96fba6SXin Li }
129*1a96fba6SXin Li
PopValueFromReader(dbus::MessageReader * reader,std::string * value)130*1a96fba6SXin Li bool PopValueFromReader(dbus::MessageReader* reader, std::string* value) {
131*1a96fba6SXin Li dbus::MessageReader variant_reader(nullptr);
132*1a96fba6SXin Li return details::DescendIntoVariantIfPresent(&reader, &variant_reader) &&
133*1a96fba6SXin Li reader->PopString(value);
134*1a96fba6SXin Li }
135*1a96fba6SXin Li
PopValueFromReader(dbus::MessageReader * reader,dbus::ObjectPath * value)136*1a96fba6SXin Li bool PopValueFromReader(dbus::MessageReader* reader, dbus::ObjectPath* value) {
137*1a96fba6SXin Li dbus::MessageReader variant_reader(nullptr);
138*1a96fba6SXin Li return details::DescendIntoVariantIfPresent(&reader, &variant_reader) &&
139*1a96fba6SXin Li reader->PopObjectPath(value);
140*1a96fba6SXin Li }
141*1a96fba6SXin Li
PopValueFromReader(dbus::MessageReader * reader,base::ScopedFD * value)142*1a96fba6SXin Li bool PopValueFromReader(dbus::MessageReader* reader,
143*1a96fba6SXin Li base::ScopedFD* value) {
144*1a96fba6SXin Li dbus::MessageReader variant_reader(nullptr);
145*1a96fba6SXin Li return details::DescendIntoVariantIfPresent(&reader, &variant_reader) &&
146*1a96fba6SXin Li reader->PopFileDescriptor(value);
147*1a96fba6SXin Li }
148*1a96fba6SXin Li
149*1a96fba6SXin Li namespace {
150*1a96fba6SXin Li
151*1a96fba6SXin Li // Helper methods for PopValueFromReader(dbus::MessageReader*, Any*)
152*1a96fba6SXin Li // implementation. Pops a value of particular type from |reader| and assigns
153*1a96fba6SXin Li // it to |value| of type Any.
154*1a96fba6SXin Li template<typename T>
PopTypedValueFromReader(dbus::MessageReader * reader,brillo::Any * value)155*1a96fba6SXin Li bool PopTypedValueFromReader(dbus::MessageReader* reader,
156*1a96fba6SXin Li brillo::Any* value) {
157*1a96fba6SXin Li T data{};
158*1a96fba6SXin Li if (!PopValueFromReader(reader, &data))
159*1a96fba6SXin Li return false;
160*1a96fba6SXin Li *value = std::move(data);
161*1a96fba6SXin Li return true;
162*1a96fba6SXin Li }
163*1a96fba6SXin Li
164*1a96fba6SXin Li // std::vector<T> overload.
165*1a96fba6SXin Li template<typename T>
PopTypedArrayFromReader(dbus::MessageReader * reader,brillo::Any * value)166*1a96fba6SXin Li bool PopTypedArrayFromReader(dbus::MessageReader* reader,
167*1a96fba6SXin Li brillo::Any* value) {
168*1a96fba6SXin Li return PopTypedValueFromReader<std::vector<T>>(reader, value);
169*1a96fba6SXin Li }
170*1a96fba6SXin Li
171*1a96fba6SXin Li // std::map<KEY, VALUE> overload.
172*1a96fba6SXin Li template<typename KEY, typename VALUE>
PopTypedMapFromReader(dbus::MessageReader * reader,brillo::Any * value)173*1a96fba6SXin Li bool PopTypedMapFromReader(dbus::MessageReader* reader, brillo::Any* value) {
174*1a96fba6SXin Li return PopTypedValueFromReader<std::map<KEY, VALUE>>(reader, value);
175*1a96fba6SXin Li }
176*1a96fba6SXin Li
177*1a96fba6SXin Li // Helper methods for reading common ARRAY signatures into a Variant.
178*1a96fba6SXin Li // Note that only common types are supported. If an additional specific
179*1a96fba6SXin Li // type signature is required, feel free to add support for it.
PopArrayValueFromReader(dbus::MessageReader * reader,brillo::Any * value)180*1a96fba6SXin Li bool PopArrayValueFromReader(dbus::MessageReader* reader,
181*1a96fba6SXin Li brillo::Any* value) {
182*1a96fba6SXin Li std::string signature = reader->GetDataSignature();
183*1a96fba6SXin Li if (signature == "ab")
184*1a96fba6SXin Li return PopTypedArrayFromReader<bool>(reader, value);
185*1a96fba6SXin Li else if (signature == "ay")
186*1a96fba6SXin Li return PopTypedArrayFromReader<uint8_t>(reader, value);
187*1a96fba6SXin Li else if (signature == "an")
188*1a96fba6SXin Li return PopTypedArrayFromReader<int16_t>(reader, value);
189*1a96fba6SXin Li else if (signature == "aq")
190*1a96fba6SXin Li return PopTypedArrayFromReader<uint16_t>(reader, value);
191*1a96fba6SXin Li else if (signature == "ai")
192*1a96fba6SXin Li return PopTypedArrayFromReader<int32_t>(reader, value);
193*1a96fba6SXin Li else if (signature == "au")
194*1a96fba6SXin Li return PopTypedArrayFromReader<uint32_t>(reader, value);
195*1a96fba6SXin Li else if (signature == "ax")
196*1a96fba6SXin Li return PopTypedArrayFromReader<int64_t>(reader, value);
197*1a96fba6SXin Li else if (signature == "at")
198*1a96fba6SXin Li return PopTypedArrayFromReader<uint64_t>(reader, value);
199*1a96fba6SXin Li else if (signature == "ad")
200*1a96fba6SXin Li return PopTypedArrayFromReader<double>(reader, value);
201*1a96fba6SXin Li else if (signature == "as")
202*1a96fba6SXin Li return PopTypedArrayFromReader<std::string>(reader, value);
203*1a96fba6SXin Li else if (signature == "ao")
204*1a96fba6SXin Li return PopTypedArrayFromReader<dbus::ObjectPath>(reader, value);
205*1a96fba6SXin Li else if (signature == "av")
206*1a96fba6SXin Li return PopTypedArrayFromReader<brillo::Any>(reader, value);
207*1a96fba6SXin Li else if (signature == "a{ss}")
208*1a96fba6SXin Li return PopTypedMapFromReader<std::string, std::string>(reader, value);
209*1a96fba6SXin Li else if (signature == "a{sv}")
210*1a96fba6SXin Li return PopTypedValueFromReader<brillo::VariantDictionary>(reader, value);
211*1a96fba6SXin Li else if (signature == "aa{ss}")
212*1a96fba6SXin Li return PopTypedArrayFromReader<
213*1a96fba6SXin Li std::map<std::string, std::string>>(reader, value);
214*1a96fba6SXin Li else if (signature == "aa{sv}")
215*1a96fba6SXin Li return PopTypedArrayFromReader<brillo::VariantDictionary>(reader, value);
216*1a96fba6SXin Li else if (signature == "a{sa{ss}}")
217*1a96fba6SXin Li return PopTypedMapFromReader<
218*1a96fba6SXin Li std::string, std::map<std::string, std::string>>(reader, value);
219*1a96fba6SXin Li else if (signature == "a{sa{sv}}")
220*1a96fba6SXin Li return PopTypedMapFromReader<
221*1a96fba6SXin Li std::string, brillo::VariantDictionary>(reader, value);
222*1a96fba6SXin Li else if (signature == "a{say}")
223*1a96fba6SXin Li return PopTypedMapFromReader<
224*1a96fba6SXin Li std::string, std::vector<uint8_t>>(reader, value);
225*1a96fba6SXin Li else if (signature == "a{uv}")
226*1a96fba6SXin Li return PopTypedMapFromReader<uint32_t, brillo::Any>(reader, value);
227*1a96fba6SXin Li else if (signature == "a(su)")
228*1a96fba6SXin Li return PopTypedArrayFromReader<
229*1a96fba6SXin Li std::tuple<std::string, uint32_t>>(reader, value);
230*1a96fba6SXin Li else if (signature == "a{uu}")
231*1a96fba6SXin Li return PopTypedMapFromReader<uint32_t, uint32_t>(reader, value);
232*1a96fba6SXin Li else if (signature == "a(uu)")
233*1a96fba6SXin Li return PopTypedArrayFromReader<
234*1a96fba6SXin Li std::tuple<uint32_t, uint32_t>>(reader, value);
235*1a96fba6SXin Li else if (signature == "a(ubay)")
236*1a96fba6SXin Li return PopTypedArrayFromReader<
237*1a96fba6SXin Li std::tuple<uint32_t, bool, std::vector<uint8_t>>>(reader, value);
238*1a96fba6SXin Li
239*1a96fba6SXin Li // When a use case for particular array signature is found, feel free
240*1a96fba6SXin Li // to add handing for it here.
241*1a96fba6SXin Li LOG(ERROR) << "Variant de-serialization of array containing data of "
242*1a96fba6SXin Li << "type '" << signature << "' is not yet supported";
243*1a96fba6SXin Li return false;
244*1a96fba6SXin Li }
245*1a96fba6SXin Li
246*1a96fba6SXin Li // Helper methods for reading common STRUCT signatures into a Variant.
247*1a96fba6SXin Li // Note that only common types are supported. If an additional specific
248*1a96fba6SXin Li // type signature is required, feel free to add support for it.
PopStructValueFromReader(dbus::MessageReader * reader,brillo::Any * value)249*1a96fba6SXin Li bool PopStructValueFromReader(dbus::MessageReader* reader,
250*1a96fba6SXin Li brillo::Any* value) {
251*1a96fba6SXin Li std::string signature = reader->GetDataSignature();
252*1a96fba6SXin Li if (signature == "(ii)")
253*1a96fba6SXin Li return PopTypedValueFromReader<std::tuple<int, int>>(reader, value);
254*1a96fba6SXin Li else if (signature == "(ss)")
255*1a96fba6SXin Li return PopTypedValueFromReader<std::tuple<std::string, std::string>>(reader,
256*1a96fba6SXin Li value);
257*1a96fba6SXin Li else if (signature == "(ub)")
258*1a96fba6SXin Li return PopTypedValueFromReader<std::tuple<uint32_t, bool>>(reader, value);
259*1a96fba6SXin Li else if (signature == "(uu)")
260*1a96fba6SXin Li return PopTypedValueFromReader<std::tuple<uint32_t, uint32_t>>(reader,
261*1a96fba6SXin Li value);
262*1a96fba6SXin Li else if (signature == "(ua{sv})")
263*1a96fba6SXin Li return PopTypedValueFromReader<
264*1a96fba6SXin Li std::tuple<uint32_t, brillo::VariantDictionary>>(reader, value);
265*1a96fba6SXin Li
266*1a96fba6SXin Li // When a use case for particular struct signature is found, feel free
267*1a96fba6SXin Li // to add handing for it here.
268*1a96fba6SXin Li LOG(ERROR) << "Variant de-serialization of structs of type '" << signature
269*1a96fba6SXin Li << "' is not yet supported";
270*1a96fba6SXin Li return false;
271*1a96fba6SXin Li }
272*1a96fba6SXin Li
273*1a96fba6SXin Li } // anonymous namespace
274*1a96fba6SXin Li
PopValueFromReader(dbus::MessageReader * reader,brillo::Any * value)275*1a96fba6SXin Li bool PopValueFromReader(dbus::MessageReader* reader, brillo::Any* value) {
276*1a96fba6SXin Li dbus::MessageReader variant_reader(nullptr);
277*1a96fba6SXin Li if (!details::DescendIntoVariantIfPresent(&reader, &variant_reader))
278*1a96fba6SXin Li return false;
279*1a96fba6SXin Li
280*1a96fba6SXin Li switch (reader->GetDataType()) {
281*1a96fba6SXin Li case dbus::Message::BYTE:
282*1a96fba6SXin Li return PopTypedValueFromReader<uint8_t>(reader, value);
283*1a96fba6SXin Li case dbus::Message::BOOL:
284*1a96fba6SXin Li return PopTypedValueFromReader<bool>(reader, value);
285*1a96fba6SXin Li case dbus::Message::INT16:
286*1a96fba6SXin Li return PopTypedValueFromReader<int16_t>(reader, value);
287*1a96fba6SXin Li case dbus::Message::UINT16:
288*1a96fba6SXin Li return PopTypedValueFromReader<uint16_t>(reader, value);
289*1a96fba6SXin Li case dbus::Message::INT32:
290*1a96fba6SXin Li return PopTypedValueFromReader<int32_t>(reader, value);
291*1a96fba6SXin Li case dbus::Message::UINT32:
292*1a96fba6SXin Li return PopTypedValueFromReader<uint32_t>(reader, value);
293*1a96fba6SXin Li case dbus::Message::INT64:
294*1a96fba6SXin Li return PopTypedValueFromReader<int64_t>(reader, value);
295*1a96fba6SXin Li case dbus::Message::UINT64:
296*1a96fba6SXin Li return PopTypedValueFromReader<uint64_t>(reader, value);
297*1a96fba6SXin Li case dbus::Message::DOUBLE:
298*1a96fba6SXin Li return PopTypedValueFromReader<double>(reader, value);
299*1a96fba6SXin Li case dbus::Message::STRING:
300*1a96fba6SXin Li return PopTypedValueFromReader<std::string>(reader, value);
301*1a96fba6SXin Li case dbus::Message::OBJECT_PATH:
302*1a96fba6SXin Li return PopTypedValueFromReader<dbus::ObjectPath>(reader, value);
303*1a96fba6SXin Li case dbus::Message::ARRAY:
304*1a96fba6SXin Li return PopArrayValueFromReader(reader, value);
305*1a96fba6SXin Li case dbus::Message::STRUCT:
306*1a96fba6SXin Li return PopStructValueFromReader(reader, value);
307*1a96fba6SXin Li case dbus::Message::DICT_ENTRY:
308*1a96fba6SXin Li LOG(ERROR) << "Variant of DICT_ENTRY is invalid";
309*1a96fba6SXin Li return false;
310*1a96fba6SXin Li case dbus::Message::VARIANT:
311*1a96fba6SXin Li LOG(ERROR) << "Variant containing a variant is invalid";
312*1a96fba6SXin Li return false;
313*1a96fba6SXin Li case dbus::Message::UNIX_FD:
314*1a96fba6SXin Li CHECK(dbus::IsDBusTypeUnixFdSupported()) << "UNIX_FD data not supported";
315*1a96fba6SXin Li // File descriptors don't use copyable types. Cannot be returned via
316*1a96fba6SXin Li // brillo::Any. Fail here.
317*1a96fba6SXin Li LOG(ERROR) << "Cannot return FileDescriptor via Any";
318*1a96fba6SXin Li return false;
319*1a96fba6SXin Li default:
320*1a96fba6SXin Li LOG(FATAL) << "Unknown D-Bus data type: " << variant_reader.GetDataType();
321*1a96fba6SXin Li return false;
322*1a96fba6SXin Li }
323*1a96fba6SXin Li }
324*1a96fba6SXin Li
325*1a96fba6SXin Li } // namespace dbus_utils
326*1a96fba6SXin Li } // namespace brillo
327