15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/property.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/message.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/object_path.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "dbus/object_proxy.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace dbus {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PropertyBase implementation.
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PropertyBase::Init(PropertySet* property_set, const std::string& name) {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!property_set_);
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  property_set_ = property_set;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  name_ = name;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PropertySet implementation.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PropertySet::PropertySet(
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ObjectProxy* object_proxy,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& interface,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PropertyChangedCallback& property_changed_callback)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : object_proxy_(object_proxy),
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      interface_(interface),
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      property_changed_callback_(property_changed_callback),
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      weak_ptr_factory_(this) {}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PropertySet::~PropertySet() {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PropertySet::RegisterProperty(const std::string& name,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   PropertyBase* property) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  property->Init(this, name);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  properties_map_[name] = property;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PropertySet::ConnectSignals() {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(object_proxy_);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  object_proxy_->ConnectToSignal(
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kPropertiesInterface,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kPropertiesChanged,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PropertySet::ChangedReceived,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 weak_ptr_factory_.GetWeakPtr()),
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PropertySet::ChangedConnected,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 weak_ptr_factory_.GetWeakPtr()));
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PropertySet::ChangedReceived(Signal* signal) {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(signal);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageReader reader(signal);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string interface;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!reader.PopString(&interface)) {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(WARNING) << "Property changed signal has wrong parameters: "
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << "expected interface name: " << signal->ToString();
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (interface != this->interface())
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!UpdatePropertiesFromReader(&reader)) {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(WARNING) << "Property changed signal has wrong parameters: "
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << "expected dictionary: " << signal->ToString();
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(keybuk): dbus properties api has invalidated properties array
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // on the end, we don't handle this right now because I don't know of
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // any service that sends it - or what they expect us to do with it.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add later when we need it.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PropertySet::ChangedConnected(const std::string& interface_name,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const std::string& signal_name,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   bool success) {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LOG_IF(WARNING, !success) << "Failed to connect to " << signal_name
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            << "signal.";
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PropertySet::Get(PropertyBase* property, GetCallback callback) {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MethodCall method_call(kPropertiesInterface, kPropertiesGet);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageWriter writer(&method_call);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.AppendString(interface());
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.AppendString(property->name());
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(object_proxy_);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  object_proxy_->CallMethod(&method_call,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            ObjectProxy::TIMEOUT_USE_DEFAULT,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            base::Bind(&PropertySet::OnGet,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       GetWeakPtr(),
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       property,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       callback));
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PropertySet::OnGet(PropertyBase* property, GetCallback callback,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        Response* response) {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!response) {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(WARNING) << property->name() << ": Get: failed.";
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageReader reader(response);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (property->PopValueFromReader(&reader))
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotifyPropertyChanged(property->name());
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!callback.is_null())
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback.Run(response);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PropertySet::GetAll() {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MethodCall method_call(kPropertiesInterface, kPropertiesGetAll);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageWriter writer(&method_call);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.AppendString(interface());
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(object_proxy_);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  object_proxy_->CallMethod(&method_call,
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            ObjectProxy::TIMEOUT_USE_DEFAULT,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            base::Bind(&PropertySet::OnGetAll,
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       weak_ptr_factory_.GetWeakPtr()));
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PropertySet::OnGetAll(Response* response) {
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!response) {
139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    LOG(WARNING) << "GetAll request failed for: " << interface_;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageReader reader(response);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!UpdatePropertiesFromReader(&reader)) {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(WARNING) << "GetAll response has wrong parameters: "
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << "expected dictionary: " << response->ToString();
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PropertySet::Set(PropertyBase* property, SetCallback callback) {
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MethodCall method_call(kPropertiesInterface, kPropertiesSet);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageWriter writer(&method_call);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.AppendString(interface());
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer.AppendString(property->name());
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  property->AppendSetValueToWriter(&writer);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(object_proxy_);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  object_proxy_->CallMethod(&method_call,
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            ObjectProxy::TIMEOUT_USE_DEFAULT,
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            base::Bind(&PropertySet::OnSet,
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       GetWeakPtr(),
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       property,
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       callback));
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
166116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid PropertySet::OnSet(PropertyBase* property,
167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                        SetCallback callback,
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        Response* response) {
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LOG_IF(WARNING, !response) << property->name() << ": Set: failed.";
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!callback.is_null())
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    callback.Run(response);
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PropertySet::UpdatePropertiesFromReader(MessageReader* reader) {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(reader);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageReader array_reader(NULL);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!reader->PopArray(&array_reader))
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (array_reader.HasMoreData()) {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MessageReader dict_entry_reader(NULL);
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (array_reader.PopDictEntry(&dict_entry_reader))
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UpdatePropertyFromReader(&dict_entry_reader);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PropertySet::UpdatePropertyFromReader(MessageReader* reader) {
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(reader);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string name;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!reader->PopString(&name))
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PropertiesMap::iterator it = properties_map_.find(name);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (it == properties_map_.end())
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PropertyBase* property = it->second;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (property->PopValueFromReader(reader)) {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotifyPropertyChanged(name);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PropertySet::NotifyPropertyChanged(const std::string& name) {
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!property_changed_callback_.is_null())
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    property_changed_callback_.Run(name);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Property<Byte> specialization.
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Property<uint8>::Property() : value_(0) {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Property<uint8>::PopValueFromReader(MessageReader* reader) {
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return reader->PopVariantOfByte(&value_);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Property<uint8>::AppendSetValueToWriter(MessageWriter* writer) {
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer->AppendVariantOfByte(set_value_);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Property<bool> specialization.
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Property<bool>::Property() : value_(false) {
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Property<bool>::PopValueFromReader(MessageReader* reader) {
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return reader->PopVariantOfBool(&value_);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Property<bool>::AppendSetValueToWriter(MessageWriter* writer) {
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer->AppendVariantOfBool(set_value_);
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Property<int16> specialization.
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Property<int16>::Property() : value_(0) {
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Property<int16>::PopValueFromReader(MessageReader* reader) {
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return reader->PopVariantOfInt16(&value_);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Property<int16>::AppendSetValueToWriter(MessageWriter* writer) {
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer->AppendVariantOfInt16(set_value_);
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Property<uint16> specialization.
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Property<uint16>::Property() : value_(0) {
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Property<uint16>::PopValueFromReader(MessageReader* reader) {
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return reader->PopVariantOfUint16(&value_);
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Property<uint16>::AppendSetValueToWriter(MessageWriter* writer) {
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer->AppendVariantOfUint16(set_value_);
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Property<int32> specialization.
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Property<int32>::Property() : value_(0) {
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Property<int32>::PopValueFromReader(MessageReader* reader) {
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return reader->PopVariantOfInt32(&value_);
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Property<int32>::AppendSetValueToWriter(MessageWriter* writer) {
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer->AppendVariantOfInt32(set_value_);
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Property<uint32> specialization.
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Property<uint32>::Property() : value_(0) {
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Property<uint32>::PopValueFromReader(MessageReader* reader) {
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return reader->PopVariantOfUint32(&value_);
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Property<uint32>::AppendSetValueToWriter(MessageWriter* writer) {
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer->AppendVariantOfUint32(set_value_);
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Property<int64> specialization.
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Property<int64>::Property() : value_(0), set_value_(0) {
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Property<int64>::PopValueFromReader(MessageReader* reader) {
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return reader->PopVariantOfInt64(&value_);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Property<int64>::AppendSetValueToWriter(MessageWriter* writer) {
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer->AppendVariantOfInt64(set_value_);
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Property<uint64> specialization.
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Property<uint64>::Property() : value_(0) {
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Property<uint64>::PopValueFromReader(MessageReader* reader) {
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return reader->PopVariantOfUint64(&value_);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Property<uint64>::AppendSetValueToWriter(MessageWriter* writer) {
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer->AppendVariantOfUint64(set_value_);
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Property<double> specialization.
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Property<double>::Property() : value_(0.0) {
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Property<double>::PopValueFromReader(MessageReader* reader) {
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return reader->PopVariantOfDouble(&value_);
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Property<double>::AppendSetValueToWriter(MessageWriter* writer) {
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer->AppendVariantOfDouble(set_value_);
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Property<std::string> specialization.
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Property<std::string>::PopValueFromReader(MessageReader* reader) {
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return reader->PopVariantOfString(&value_);
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Property<std::string>::AppendSetValueToWriter(MessageWriter* writer) {
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer->AppendVariantOfString(set_value_);
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Property<ObjectPath> specialization.
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Property<ObjectPath>::PopValueFromReader(MessageReader* reader) {
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return reader->PopVariantOfObjectPath(&value_);
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Property<ObjectPath>::AppendSetValueToWriter(MessageWriter* writer) {
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer->AppendVariantOfObjectPath(set_value_);
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Property<std::vector<std::string> > specialization.
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Property<std::vector<std::string> >::PopValueFromReader(
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MessageReader* reader) {
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageReader variant_reader(NULL);
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!reader->PopVariant(&variant_reader))
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  value_.clear();
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return variant_reader.PopArrayOfStrings(&value_);
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Property<std::vector<std::string> >::AppendSetValueToWriter(
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MessageWriter* writer) {
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageWriter variant_writer(NULL);
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer->OpenVariant("as", &variant_writer);
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  variant_writer.AppendArrayOfStrings(set_value_);
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer->CloseContainer(&variant_writer);
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Property<std::vector<ObjectPath> > specialization.
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Property<std::vector<ObjectPath> >::PopValueFromReader(
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MessageReader* reader) {
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageReader variant_reader(NULL);
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!reader->PopVariant(&variant_reader))
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  value_.clear();
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return variant_reader.PopArrayOfObjectPaths(&value_);
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Property<std::vector<ObjectPath> >::AppendSetValueToWriter(
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MessageWriter* writer) {
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageWriter variant_writer(NULL);
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer->OpenVariant("ao", &variant_writer);
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  variant_writer.AppendArrayOfObjectPaths(set_value_);
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  writer->CloseContainer(&variant_writer);
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
453a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)//
454a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Property<std::vector<uint8> > specialization.
455a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)//
456a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
457a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <>
458a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool Property<std::vector<uint8> >::PopValueFromReader(MessageReader* reader) {
459a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MessageReader variant_reader(NULL);
460a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!reader->PopVariant(&variant_reader))
461a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return false;
462a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
463a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  value_.clear();
464a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const uint8* bytes = NULL;
465a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  size_t length = 0;
466a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!variant_reader.PopArrayOfBytes(&bytes, &length))
467a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return false;
468a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  value_.assign(bytes, bytes + length);
469a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return true;
470a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
471a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
472a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <>
473a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void Property<std::vector<uint8> >::AppendSetValueToWriter(
474a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    MessageWriter* writer) {
475a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MessageWriter variant_writer(NULL);
476a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  writer->OpenVariant("ay", &variant_writer);
477a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  variant_writer.AppendArrayOfBytes(set_value_.data(), set_value_.size());
478a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  writer->CloseContainer(&variant_writer);
479a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
480a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
4815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)template class Property<uint8>;
4825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)template class Property<bool>;
4835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)template class Property<int16>;
4845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)template class Property<uint16>;
4855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)template class Property<int32>;
4865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)template class Property<uint32>;
4875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)template class Property<int64>;
4885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)template class Property<uint64>;
4895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)template class Property<double>;
4905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)template class Property<std::string>;
4915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)template class Property<ObjectPath>;
4925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)template class Property<std::vector<std::string> >;
4935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)template class Property<std::vector<ObjectPath> >;
4945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)template class Property<std::vector<uint8> >;
4955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace dbus
497