blob: b7a0c8be458bef4c5c0e35a4e2a3337e98658fab [file] [log] [blame]
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +09001// Copyright (c) 2012 The Chromium 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#include "dbus/property.h"
6
7#include "base/basictypes.h"
8#include "base/bind.h"
9#include "base/logging.h"
10
11#include "dbus/message.h"
12#include "dbus/object_path.h"
13#include "dbus/object_proxy.h"
14
15namespace dbus {
16
17//
18// PropertyBase implementation.
19//
20
derat3f868a42015-07-17 00:06:44 +090021PropertyBase::PropertyBase() : property_set_(nullptr), is_valid_(false) {}
22
23PropertyBase::~PropertyBase() {}
24
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +090025void PropertyBase::Init(PropertySet* property_set, const std::string& name) {
26 DCHECK(!property_set_);
27 property_set_ = property_set;
jpawlowski77e73fc2015-05-11 20:07:04 +090028 is_valid_ = false;
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +090029 name_ = name;
30}
31
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +090032//
33// PropertySet implementation.
34//
35
keybuk@chromium.orgb45e5292012-08-15 10:03:30 +090036PropertySet::PropertySet(
37 ObjectProxy* object_proxy,
38 const std::string& interface,
39 const PropertyChangedCallback& property_changed_callback)
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +090040 : object_proxy_(object_proxy),
41 interface_(interface),
42 property_changed_callback_(property_changed_callback),
43 weak_ptr_factory_(this) {}
44
45PropertySet::~PropertySet() {
46}
47
48void PropertySet::RegisterProperty(const std::string& name,
49 PropertyBase* property) {
50 property->Init(this, name);
51 properties_map_[name] = property;
52}
53
54void PropertySet::ConnectSignals() {
55 DCHECK(object_proxy_);
56 object_proxy_->ConnectToSignal(
57 kPropertiesInterface,
58 kPropertiesChanged,
59 base::Bind(&PropertySet::ChangedReceived,
60 weak_ptr_factory_.GetWeakPtr()),
61 base::Bind(&PropertySet::ChangedConnected,
62 weak_ptr_factory_.GetWeakPtr()));
63}
64
65
66void PropertySet::ChangedReceived(Signal* signal) {
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +090067 DCHECK(signal);
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +090068 MessageReader reader(signal);
69
70 std::string interface;
71 if (!reader.PopString(&interface)) {
72 LOG(WARNING) << "Property changed signal has wrong parameters: "
73 << "expected interface name: " << signal->ToString();
74 return;
75 }
76
77 if (interface != this->interface())
78 return;
79
80 if (!UpdatePropertiesFromReader(&reader)) {
81 LOG(WARNING) << "Property changed signal has wrong parameters: "
82 << "expected dictionary: " << signal->ToString();
83 }
84
jpawlowski77e73fc2015-05-11 20:07:04 +090085 if (!InvalidatePropertiesFromReader(&reader)) {
86 LOG(WARNING) << "Property changed signal has wrong parameters: "
87 << "expected array to invalidate: " << signal->ToString();
88 }
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +090089}
90
91void PropertySet::ChangedConnected(const std::string& interface_name,
92 const std::string& signal_name,
93 bool success) {
94 LOG_IF(WARNING, !success) << "Failed to connect to " << signal_name
95 << "signal.";
96}
97
98
keybuk@chromium.org56028ac2012-06-29 03:43:30 +090099void PropertySet::Get(PropertyBase* property, GetCallback callback) {
100 MethodCall method_call(kPropertiesInterface, kPropertiesGet);
101 MessageWriter writer(&method_call);
102 writer.AppendString(interface());
103 writer.AppendString(property->name());
104
105 DCHECK(object_proxy_);
106 object_proxy_->CallMethod(&method_call,
107 ObjectProxy::TIMEOUT_USE_DEFAULT,
108 base::Bind(&PropertySet::OnGet,
109 GetWeakPtr(),
110 property,
111 callback));
112}
113
114void PropertySet::OnGet(PropertyBase* property, GetCallback callback,
115 Response* response) {
116 if (!response) {
117 LOG(WARNING) << property->name() << ": Get: failed.";
118 return;
119 }
120
121 MessageReader reader(response);
jpawlowski77e73fc2015-05-11 20:07:04 +0900122 if (property->PopValueFromReader(&reader)) {
123 property->set_valid(true);
keybuk@chromium.org56028ac2012-06-29 03:43:30 +0900124 NotifyPropertyChanged(property->name());
jpawlowski77e73fc2015-05-11 20:07:04 +0900125 } else {
126 if (property->is_valid()) {
127 property->set_valid(false);
128 NotifyPropertyChanged(property->name());
129 }
130 }
keybuk@chromium.org56028ac2012-06-29 03:43:30 +0900131
132 if (!callback.is_null())
133 callback.Run(response);
134}
135
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +0900136void PropertySet::GetAll() {
137 MethodCall method_call(kPropertiesInterface, kPropertiesGetAll);
138 MessageWriter writer(&method_call);
139 writer.AppendString(interface());
140
141 DCHECK(object_proxy_);
142 object_proxy_->CallMethod(&method_call,
143 ObjectProxy::TIMEOUT_USE_DEFAULT,
144 base::Bind(&PropertySet::OnGetAll,
145 weak_ptr_factory_.GetWeakPtr()));
146}
147
148void PropertySet::OnGetAll(Response* response) {
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +0900149 if (!response) {
stevenjb@chromium.orgfa639cc2014-07-17 14:03:53 +0900150 LOG(WARNING) << "GetAll request failed for: " << interface_;
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +0900151 return;
152 }
153
154 MessageReader reader(response);
155 if (!UpdatePropertiesFromReader(&reader)) {
156 LOG(WARNING) << "GetAll response has wrong parameters: "
157 << "expected dictionary: " << response->ToString();
158 }
159}
160
keybuk@chromium.org56028ac2012-06-29 03:43:30 +0900161void PropertySet::Set(PropertyBase* property, SetCallback callback) {
162 MethodCall method_call(kPropertiesInterface, kPropertiesSet);
163 MessageWriter writer(&method_call);
164 writer.AppendString(interface());
165 writer.AppendString(property->name());
166 property->AppendSetValueToWriter(&writer);
167
168 DCHECK(object_proxy_);
169 object_proxy_->CallMethod(&method_call,
170 ObjectProxy::TIMEOUT_USE_DEFAULT,
171 base::Bind(&PropertySet::OnSet,
172 GetWeakPtr(),
173 property,
174 callback));
175}
176
nywangf1196812015-09-23 09:06:40 +0900177bool PropertySet::SetAndBlock(PropertyBase* property) {
178 MethodCall method_call(kPropertiesInterface, kPropertiesSet);
179 MessageWriter writer(&method_call);
180 writer.AppendString(interface());
181 writer.AppendString(property->name());
182 property->AppendSetValueToWriter(&writer);
183
184 DCHECK(object_proxy_);
185 scoped_ptr<dbus::Response> response(
186 object_proxy_->CallMethodAndBlock(&method_call,
187 ObjectProxy::TIMEOUT_USE_DEFAULT));
188 if (response.get())
189 return true;
190 return false;
191}
192
stevenjb@chromium.orgfa639cc2014-07-17 14:03:53 +0900193void PropertySet::OnSet(PropertyBase* property,
194 SetCallback callback,
keybuk@chromium.org56028ac2012-06-29 03:43:30 +0900195 Response* response) {
196 LOG_IF(WARNING, !response) << property->name() << ": Set: failed.";
197 if (!callback.is_null())
198 callback.Run(response);
199}
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +0900200
201bool PropertySet::UpdatePropertiesFromReader(MessageReader* reader) {
202 DCHECK(reader);
203 MessageReader array_reader(NULL);
204 if (!reader->PopArray(&array_reader))
205 return false;
206
207 while (array_reader.HasMoreData()) {
208 MessageReader dict_entry_reader(NULL);
keybuk@chromium.org683dd8c2012-03-23 05:34:05 +0900209 if (array_reader.PopDictEntry(&dict_entry_reader))
210 UpdatePropertyFromReader(&dict_entry_reader);
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +0900211 }
212
213 return true;
214}
215
216bool PropertySet::UpdatePropertyFromReader(MessageReader* reader) {
217 DCHECK(reader);
218
219 std::string name;
220 if (!reader->PopString(&name))
221 return false;
222
223 PropertiesMap::iterator it = properties_map_.find(name);
224 if (it == properties_map_.end())
225 return false;
226
227 PropertyBase* property = it->second;
228 if (property->PopValueFromReader(reader)) {
jpawlowski77e73fc2015-05-11 20:07:04 +0900229 property->set_valid(true);
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +0900230 NotifyPropertyChanged(name);
231 return true;
232 } else {
jpawlowski77e73fc2015-05-11 20:07:04 +0900233 if (property->is_valid()) {
234 property->set_valid(false);
235 NotifyPropertyChanged(property->name());
236 }
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +0900237 return false;
238 }
239}
240
jpawlowski77e73fc2015-05-11 20:07:04 +0900241bool PropertySet::InvalidatePropertiesFromReader(MessageReader* reader) {
242 DCHECK(reader);
243 MessageReader array_reader(NULL);
244 if (!reader->PopArray(&array_reader))
245 return false;
246
247 while (array_reader.HasMoreData()) {
248 std::string name;
249 if (!array_reader.PopString(&name))
250 return false;
251
252 PropertiesMap::iterator it = properties_map_.find(name);
253 if (it == properties_map_.end())
254 continue;
255
256 PropertyBase* property = it->second;
257 if (property->is_valid()) {
258 property->set_valid(false);
259 NotifyPropertyChanged(property->name());
260 }
261 }
262
263 return true;
264}
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +0900265
266void PropertySet::NotifyPropertyChanged(const std::string& name) {
267 if (!property_changed_callback_.is_null())
268 property_changed_callback_.Run(name);
269}
270
271//
272// Property<Byte> specialization.
273//
274
275template <>
keybuk@chromium.org56028ac2012-06-29 03:43:30 +0900276Property<uint8>::Property() : value_(0) {
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +0900277}
278
279template <>
280bool Property<uint8>::PopValueFromReader(MessageReader* reader) {
281 return reader->PopVariantOfByte(&value_);
282}
283
284template <>
keybuk@chromium.org56028ac2012-06-29 03:43:30 +0900285void Property<uint8>::AppendSetValueToWriter(MessageWriter* writer) {
286 writer->AppendVariantOfByte(set_value_);
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +0900287}
288
289//
290// Property<bool> specialization.
291//
292
293template <>
keybuk@chromium.org56028ac2012-06-29 03:43:30 +0900294Property<bool>::Property() : value_(false) {
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +0900295}
296
297template <>
298bool Property<bool>::PopValueFromReader(MessageReader* reader) {
299 return reader->PopVariantOfBool(&value_);
300}
301
302template <>
keybuk@chromium.org56028ac2012-06-29 03:43:30 +0900303void Property<bool>::AppendSetValueToWriter(MessageWriter* writer) {
304 writer->AppendVariantOfBool(set_value_);
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +0900305}
306
307//
308// Property<int16> specialization.
309//
310
311template <>
keybuk@chromium.org56028ac2012-06-29 03:43:30 +0900312Property<int16>::Property() : value_(0) {
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +0900313}
314
315template <>
316bool Property<int16>::PopValueFromReader(MessageReader* reader) {
317 return reader->PopVariantOfInt16(&value_);
318}
319
320template <>
keybuk@chromium.org56028ac2012-06-29 03:43:30 +0900321void Property<int16>::AppendSetValueToWriter(MessageWriter* writer) {
322 writer->AppendVariantOfInt16(set_value_);
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +0900323}
324
325//
326// Property<uint16> specialization.
327//
328
329template <>
keybuk@chromium.org56028ac2012-06-29 03:43:30 +0900330Property<uint16>::Property() : value_(0) {
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +0900331}
332
333template <>
334bool Property<uint16>::PopValueFromReader(MessageReader* reader) {
335 return reader->PopVariantOfUint16(&value_);
336}
337
338template <>
keybuk@chromium.org56028ac2012-06-29 03:43:30 +0900339void Property<uint16>::AppendSetValueToWriter(MessageWriter* writer) {
340 writer->AppendVariantOfUint16(set_value_);
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +0900341}
342
343//
344// Property<int32> specialization.
345//
346
347template <>
keybuk@chromium.org56028ac2012-06-29 03:43:30 +0900348Property<int32>::Property() : value_(0) {
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +0900349}
350
351template <>
352bool Property<int32>::PopValueFromReader(MessageReader* reader) {
353 return reader->PopVariantOfInt32(&value_);
354}
355
356template <>
keybuk@chromium.org56028ac2012-06-29 03:43:30 +0900357void Property<int32>::AppendSetValueToWriter(MessageWriter* writer) {
358 writer->AppendVariantOfInt32(set_value_);
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +0900359}
360
361//
362// Property<uint32> specialization.
363//
364
365template <>
keybuk@chromium.org56028ac2012-06-29 03:43:30 +0900366Property<uint32>::Property() : value_(0) {
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +0900367}
368
369template <>
370bool Property<uint32>::PopValueFromReader(MessageReader* reader) {
371 return reader->PopVariantOfUint32(&value_);
372}
373
374template <>
keybuk@chromium.org56028ac2012-06-29 03:43:30 +0900375void Property<uint32>::AppendSetValueToWriter(MessageWriter* writer) {
376 writer->AppendVariantOfUint32(set_value_);
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +0900377}
378
379//
380// Property<int64> specialization.
381//
382
383template <>
jhawkins@chromium.org9ef14692012-07-26 07:08:27 +0900384Property<int64>::Property() : value_(0), set_value_(0) {
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +0900385}
386
387template <>
388bool Property<int64>::PopValueFromReader(MessageReader* reader) {
389 return reader->PopVariantOfInt64(&value_);
390}
391
392template <>
keybuk@chromium.org56028ac2012-06-29 03:43:30 +0900393void Property<int64>::AppendSetValueToWriter(MessageWriter* writer) {
394 writer->AppendVariantOfInt64(set_value_);
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +0900395}
396
397//
398// Property<uint64> specialization.
399//
400
401template <>
keybuk@chromium.org56028ac2012-06-29 03:43:30 +0900402Property<uint64>::Property() : value_(0) {
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +0900403}
404
405template <>
406bool Property<uint64>::PopValueFromReader(MessageReader* reader) {
407 return reader->PopVariantOfUint64(&value_);
408}
409
410template <>
keybuk@chromium.org56028ac2012-06-29 03:43:30 +0900411void Property<uint64>::AppendSetValueToWriter(MessageWriter* writer) {
412 writer->AppendVariantOfUint64(set_value_);
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +0900413}
414
415//
416// Property<double> specialization.
417//
418
419template <>
keybuk@chromium.org56028ac2012-06-29 03:43:30 +0900420Property<double>::Property() : value_(0.0) {
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +0900421}
422
423template <>
424bool Property<double>::PopValueFromReader(MessageReader* reader) {
425 return reader->PopVariantOfDouble(&value_);
426}
427
428template <>
keybuk@chromium.org56028ac2012-06-29 03:43:30 +0900429void Property<double>::AppendSetValueToWriter(MessageWriter* writer) {
430 writer->AppendVariantOfDouble(set_value_);
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +0900431}
432
433//
434// Property<std::string> specialization.
435//
436
437template <>
438bool Property<std::string>::PopValueFromReader(MessageReader* reader) {
439 return reader->PopVariantOfString(&value_);
440}
441
442template <>
keybuk@chromium.org56028ac2012-06-29 03:43:30 +0900443void Property<std::string>::AppendSetValueToWriter(MessageWriter* writer) {
444 writer->AppendVariantOfString(set_value_);
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +0900445}
446
447//
448// Property<ObjectPath> specialization.
449//
450
451template <>
452bool Property<ObjectPath>::PopValueFromReader(MessageReader* reader) {
453 return reader->PopVariantOfObjectPath(&value_);
454}
455
456template <>
keybuk@chromium.org56028ac2012-06-29 03:43:30 +0900457void Property<ObjectPath>::AppendSetValueToWriter(MessageWriter* writer) {
458 writer->AppendVariantOfObjectPath(set_value_);
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +0900459}
460
461//
462// Property<std::vector<std::string> > specialization.
463//
464
465template <>
466bool Property<std::vector<std::string> >::PopValueFromReader(
467 MessageReader* reader) {
468 MessageReader variant_reader(NULL);
469 if (!reader->PopVariant(&variant_reader))
470 return false;
471
keybuk@google.comf056b962012-03-22 08:43:45 +0900472 value_.clear();
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +0900473 return variant_reader.PopArrayOfStrings(&value_);
474}
475
476template <>
keybuk@chromium.org56028ac2012-06-29 03:43:30 +0900477void Property<std::vector<std::string> >::AppendSetValueToWriter(
478 MessageWriter* writer) {
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +0900479 MessageWriter variant_writer(NULL);
480 writer->OpenVariant("as", &variant_writer);
keybuk@chromium.org56028ac2012-06-29 03:43:30 +0900481 variant_writer.AppendArrayOfStrings(set_value_);
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +0900482 writer->CloseContainer(&variant_writer);
483}
484
485//
486// Property<std::vector<ObjectPath> > specialization.
487//
488
489template <>
490bool Property<std::vector<ObjectPath> >::PopValueFromReader(
491 MessageReader* reader) {
492 MessageReader variant_reader(NULL);
493 if (!reader->PopVariant(&variant_reader))
494 return false;
495
keybuk@google.comf056b962012-03-22 08:43:45 +0900496 value_.clear();
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +0900497 return variant_reader.PopArrayOfObjectPaths(&value_);
498}
499
500template <>
keybuk@chromium.org56028ac2012-06-29 03:43:30 +0900501void Property<std::vector<ObjectPath> >::AppendSetValueToWriter(
502 MessageWriter* writer) {
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +0900503 MessageWriter variant_writer(NULL);
504 writer->OpenVariant("ao", &variant_writer);
keybuk@chromium.org56028ac2012-06-29 03:43:30 +0900505 variant_writer.AppendArrayOfObjectPaths(set_value_);
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +0900506 writer->CloseContainer(&variant_writer);
507}
508
armansito@chromium.org11e12742014-03-15 16:40:49 +0900509//
510// Property<std::vector<uint8> > specialization.
511//
512
513template <>
514bool Property<std::vector<uint8> >::PopValueFromReader(MessageReader* reader) {
515 MessageReader variant_reader(NULL);
516 if (!reader->PopVariant(&variant_reader))
517 return false;
518
519 value_.clear();
520 const uint8* bytes = NULL;
521 size_t length = 0;
522 if (!variant_reader.PopArrayOfBytes(&bytes, &length))
523 return false;
524 value_.assign(bytes, bytes + length);
525 return true;
526}
527
528template <>
529void Property<std::vector<uint8> >::AppendSetValueToWriter(
530 MessageWriter* writer) {
531 MessageWriter variant_writer(NULL);
532 writer->OpenVariant("ay", &variant_writer);
533 variant_writer.AppendArrayOfBytes(set_value_.data(), set_value_.size());
534 writer->CloseContainer(&variant_writer);
535}
536
dtapuska95f71722015-02-10 01:02:55 +0900537//
538// Property<std::map<std::string, std::string>> specialization.
539//
540
541template <>
542bool Property<std::map<std::string, std::string>>::PopValueFromReader(
543 MessageReader* reader) {
544 MessageReader variant_reader(NULL);
545 MessageReader array_reader(NULL);
546 if (!reader->PopVariant(&variant_reader) ||
547 !variant_reader.PopArray(&array_reader))
548 return false;
549 value_.clear();
550 while (array_reader.HasMoreData()) {
551 dbus::MessageReader dict_entry_reader(NULL);
552 if (!array_reader.PopDictEntry(&dict_entry_reader))
553 return false;
554 std::string key;
555 std::string value;
556 if (!dict_entry_reader.PopString(&key) ||
557 !dict_entry_reader.PopString(&value))
558 return false;
559 value_[key] = value;
560 }
561 return true;
562}
563
564template <>
565void Property<std::map<std::string, std::string>>::AppendSetValueToWriter(
566 MessageWriter* writer) {
567 MessageWriter variant_writer(NULL);
568 MessageWriter dict_writer(NULL);
569 writer->OpenVariant("a{ss}", &variant_writer);
570 variant_writer.OpenArray("{ss}", &dict_writer);
571 for (const auto& pair : set_value_) {
572 dbus::MessageWriter entry_writer(NULL);
573 dict_writer.OpenDictEntry(&entry_writer);
574 entry_writer.AppendString(pair.first);
575 entry_writer.AppendString(pair.second);
576 dict_writer.CloseContainer(&entry_writer);
577 }
578 variant_writer.CloseContainer(&dict_writer);
579 writer->CloseContainer(&variant_writer);
580}
581
582//
583// Property<std::vector<std::pair<std::vector<uint8_t>, uint16_t>>>
584// specialization.
585//
586
587template <>
588bool Property<std::vector<std::pair<std::vector<uint8_t>, uint16_t>>>::
589 PopValueFromReader(MessageReader* reader) {
590 MessageReader variant_reader(NULL);
591 MessageReader array_reader(NULL);
592 if (!reader->PopVariant(&variant_reader) ||
593 !variant_reader.PopArray(&array_reader))
594 return false;
595
596 value_.clear();
597 while (array_reader.HasMoreData()) {
598 dbus::MessageReader struct_reader(NULL);
599 if (!array_reader.PopStruct(&struct_reader))
600 return false;
601
602 std::pair<std::vector<uint8_t>, uint16_t> entry;
603 const uint8* bytes = NULL;
604 size_t length = 0;
605 if (!struct_reader.PopArrayOfBytes(&bytes, &length))
606 return false;
607 entry.first.assign(bytes, bytes + length);
608 if (!struct_reader.PopUint16(&entry.second))
609 return false;
610 value_.push_back(entry);
611 }
612 return true;
613}
614
615template <>
616void Property<std::vector<std::pair<std::vector<uint8_t>, uint16_t>>>::
617 AppendSetValueToWriter(MessageWriter* writer) {
618 MessageWriter variant_writer(NULL);
619 MessageWriter array_writer(NULL);
620 writer->OpenVariant("a(ayq)", &variant_writer);
621 variant_writer.OpenArray("(ayq)", &array_writer);
622 for (const auto& pair : set_value_) {
623 dbus::MessageWriter struct_writer(nullptr);
624 array_writer.OpenStruct(&struct_writer);
625 struct_writer.AppendArrayOfBytes(std::get<0>(pair).data(),
626 std::get<0>(pair).size());
627 struct_writer.AppendUint16(std::get<1>(pair));
628 array_writer.CloseContainer(&struct_writer);
629 }
630 variant_writer.CloseContainer(&array_writer);
631 writer->CloseContainer(&variant_writer);
632}
633
tzik@chromium.org1dc29432014-07-25 13:04:27 +0900634template class Property<uint8>;
635template class Property<bool>;
636template class Property<int16>;
637template class Property<uint16>;
638template class Property<int32>;
639template class Property<uint32>;
640template class Property<int64>;
641template class Property<uint64>;
642template class Property<double>;
643template class Property<std::string>;
644template class Property<ObjectPath>;
645template class Property<std::vector<std::string> >;
646template class Property<std::vector<ObjectPath> >;
647template class Property<std::vector<uint8> >;
dtapuska95f71722015-02-10 01:02:55 +0900648template class Property<std::map<std::string, std::string>>;
649template class Property<std::vector<std::pair<std::vector<uint8_t>, uint16_t>>>;
tzik@chromium.org1dc29432014-07-25 13:04:27 +0900650
keybuk@chromium.org7e0c4932012-02-15 13:21:08 +0900651} // namespace dbus