Chromium Code Reviews| Index: chromeos/dbus/shill_client_helper.cc |
| diff --git a/chromeos/dbus/shill_client_helper.cc b/chromeos/dbus/shill_client_helper.cc |
| index c9271809a87735326f6fe8250bd88d186f4e6cbd..622304a2eca83daa0692bf501b4f85006c13b5ec 100644 |
| --- a/chromeos/dbus/shill_client_helper.cc |
| +++ b/chromeos/dbus/shill_client_helper.cc |
| @@ -7,6 +7,7 @@ |
| #include "base/bind.h" |
| #include "base/callback_helpers.h" |
| #include "base/values.h" |
| +#include "chromeos/device_event_log.h" |
| #include "dbus/message.h" |
| #include "dbus/object_proxy.h" |
| #include "dbus/values_util.h" |
| @@ -202,6 +203,28 @@ void OnError(const ShillClientHelper::ErrorCallback& error_callback, |
| error_callback.Run(error_name, error_message); |
| } |
| +void WriteStringDictionary(const base::DictionaryValue& dictionary, |
| + dbus::MessageWriter* writer) { |
| + dbus::MessageWriter variant_writer(NULL); |
| + writer->OpenVariant("a{ss}", &variant_writer); |
| + dbus::MessageWriter array_writer(NULL); |
| + variant_writer.OpenArray("{ss}", &array_writer); |
| + for (base::DictionaryValue::Iterator it(dictionary); !it.IsAtEnd(); |
| + it.Advance()) { |
| + dbus::MessageWriter entry_writer(NULL); |
| + array_writer.OpenDictEntry(&entry_writer); |
| + entry_writer.AppendString(it.key()); |
| + const base::Value& value = it.value(); |
| + std::string value_string; |
| + if (!value.GetAsString(&value_string)) |
| + NET_LOG(ERROR) << "Dictionary value not a string: " << it.key(); |
| + entry_writer.AppendString(value_string); |
| + array_writer.CloseContainer(&entry_writer); |
| + } |
| + variant_writer.CloseContainer(&array_writer); |
| + writer->CloseContainer(&variant_writer); |
| +} |
|
stevenjb
2015/01/22 23:14:31
The above is copy/pasted from the original code (l
|
| + |
| } // namespace |
| ShillClientHelper::ShillClientHelper(dbus::ObjectProxy* proxy) |
| @@ -211,8 +234,8 @@ ShillClientHelper::ShillClientHelper(dbus::ObjectProxy* proxy) |
| } |
| ShillClientHelper::~ShillClientHelper() { |
| - LOG_IF(ERROR, observer_list_.might_have_observers()) |
| - << "ShillClientHelper destroyed with active observers"; |
| + if (observer_list_.might_have_observers()) |
| + NET_LOG(ERROR) << "ShillClientHelper destroyed with active observers"; |
| } |
| void ShillClientHelper::SetReleasedCallback(ReleasedCallback callback) { |
| @@ -397,31 +420,28 @@ void ShillClientHelper::CallListValueMethodWithErrorCallback( |
| // static |
| void ShillClientHelper::AppendValueDataAsVariant(dbus::MessageWriter* writer, |
| const base::Value& value) { |
| + AppendValueDataAsVariantEx(writer, value, |
| + false /* use_string_dictionaries */); |
|
stevenjb
2015/01/22 23:14:31
Note: this changes the default behavior, but this
hashimoto
2015/01/23 02:53:48
Isn't it possible to change Shill to accept a{sv}
stevenjb
2015/01/23 18:49:20
We're looking into that but it's going to be a pre
|
| +} |
| + |
| +// static |
| +void ShillClientHelper::AppendValueDataAsVariantEx( |
|
hashimoto
2015/01/23 02:53:48
"Ex" suffix here doesn't look pretty.
How about ad
stevenjb
2015/01/23 18:49:21
I don't think it makes sense to change the signatu
|
| + dbus::MessageWriter* writer, |
| + const base::Value& value, |
| + bool use_string_dictionaries) { |
| // Support basic types and string-to-string dictionary. |
| switch (value.GetType()) { |
| case base::Value::TYPE_DICTIONARY: { |
| const base::DictionaryValue* dictionary = NULL; |
| value.GetAsDictionary(&dictionary); |
| - dbus::MessageWriter variant_writer(NULL); |
| - writer->OpenVariant("a{ss}", &variant_writer); |
| - dbus::MessageWriter array_writer(NULL); |
| - variant_writer.OpenArray("{ss}", &array_writer); |
| - for (base::DictionaryValue::Iterator it(*dictionary); |
| - !it.IsAtEnd(); |
| - it.Advance()) { |
| - dbus::MessageWriter entry_writer(NULL); |
| - array_writer.OpenDictEntry(&entry_writer); |
| - entry_writer.AppendString(it.key()); |
| - const base::Value& value = it.value(); |
| - std::string value_string; |
| - DLOG_IF(ERROR, value.GetType() != base::Value::TYPE_STRING) |
| - << "Unexpected type " << value.GetType(); |
| - value.GetAsString(&value_string); |
| - entry_writer.AppendString(value_string); |
| - array_writer.CloseContainer(&entry_writer); |
| + if (use_string_dictionaries) { |
| + WriteStringDictionary(*dictionary, writer); |
| + } else { |
| + dbus::MessageWriter variant_writer(NULL); |
| + writer->OpenVariant("a{sv}", &variant_writer); |
| + AppendServicePropertiesDictionary(&variant_writer, *dictionary); |
| + writer->CloseContainer(&variant_writer); |
| } |
| - variant_writer.CloseContainer(&array_writer); |
| - writer->CloseContainer(&variant_writer); |
| break; |
| } |
| case base::Value::TYPE_LIST: { |
| @@ -434,10 +454,9 @@ void ShillClientHelper::AppendValueDataAsVariant(dbus::MessageWriter* writer, |
| for (base::ListValue::const_iterator it = list->begin(); |
| it != list->end(); ++it) { |
| const base::Value& value = **it; |
| - LOG_IF(ERROR, value.GetType() != base::Value::TYPE_STRING) |
| - << "Unexpected type " << value.GetType(); |
| std::string value_string; |
| - value.GetAsString(&value_string); |
| + if (!value.GetAsString(&value_string)) |
| + NET_LOG(ERROR) << "List value not a string: " << value; |
| array_writer.AppendString(value_string); |
| } |
| variant_writer.CloseContainer(&array_writer); |
| @@ -451,7 +470,7 @@ void ShillClientHelper::AppendValueDataAsVariant(dbus::MessageWriter* writer, |
| dbus::AppendBasicTypeValueDataAsVariant(writer, value); |
| break; |
| default: |
| - DLOG(ERROR) << "Unexpected type " << value.GetType(); |
| + NET_LOG(ERROR) << "Unexpected value type: " << value.GetType(); |
| } |
| } |
| @@ -462,13 +481,16 @@ void ShillClientHelper::AppendServicePropertiesDictionary( |
| const base::DictionaryValue& dictionary) { |
| dbus::MessageWriter array_writer(NULL); |
| writer->OpenArray("{sv}", &array_writer); |
| - for (base::DictionaryValue::Iterator it(dictionary); |
| - !it.IsAtEnd(); |
| + for (base::DictionaryValue::Iterator it(dictionary); !it.IsAtEnd(); |
| it.Advance()) { |
| dbus::MessageWriter entry_writer(NULL); |
| array_writer.OpenDictEntry(&entry_writer); |
| entry_writer.AppendString(it.key()); |
| - ShillClientHelper::AppendValueDataAsVariant(&entry_writer, it.value()); |
| + // Shill expects Cellular.APN to be a string dictionary, a{ss}. All other |
| + // properties use a varient dictionary, a{sv}. |
| + bool use_string_dictionaries = it.key() == shill::kCellularApnProperty; |
| + ShillClientHelper::AppendValueDataAsVariantEx(&entry_writer, it.value(), |
| + use_string_dictionaries); |
| array_writer.CloseContainer(&entry_writer); |
| } |
| writer->CloseContainer(&array_writer); |
| @@ -487,8 +509,8 @@ void ShillClientHelper::Release() { |
| void ShillClientHelper::OnSignalConnected(const std::string& interface, |
| const std::string& signal, |
| bool success) { |
| - LOG_IF(ERROR, !success) << "Connect to " << interface << " " << signal |
| - << " failed."; |
| + if (!success) |
| + NET_LOG(ERROR) << "Connect to " << interface << " " << signal << " failed."; |
| } |
| void ShillClientHelper::OnPropertyChanged(dbus::Signal* signal) { |